diff --git a/app/build/icon.png b/app/build/icon.png new file mode 100644 index 00000000..b9fd9a1f Binary files /dev/null and b/app/build/icon.png differ diff --git a/app/build/icon.svg b/app/build/icon.svg new file mode 100644 index 00000000..3372ae5b --- /dev/null +++ b/app/build/icon.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/app/renderer/assets/flame.png b/app/renderer/assets/flame.png deleted file mode 100644 index 9ed6583c..00000000 Binary files a/app/renderer/assets/flame.png and /dev/null differ diff --git a/app/renderer/components/AboutModal.tsx b/app/renderer/components/AboutModal.tsx index fb4d196b..5e374e90 100644 --- a/app/renderer/components/AboutModal.tsx +++ b/app/renderer/components/AboutModal.tsx @@ -1,7 +1,7 @@ import { useEffect, type MouseEvent, type ReactNode } from 'react' import { version } from '../../package.json' -import flameLogo from '../assets/flame.png' +import { FlameMark } from './FlameMark' import { codeburn } from '../lib/ipc' export type SocialLink = { @@ -39,7 +39,7 @@ export function AboutModal({ socials, onClose }: { socials: SocialLink[]; onClos
- +
CodeBurn
v{version}
Know where every token goes, across every AI coding tool.
diff --git a/app/renderer/components/FlameMark.tsx b/app/renderer/components/FlameMark.tsx index b9fb549d..a861c4b0 100644 --- a/app/renderer/components/FlameMark.tsx +++ b/app/renderer/components/FlameMark.tsx @@ -1,47 +1,41 @@ -import { useId, useMemo } from 'react' +import { useMemo } from 'react' import { motionEnabled } from '../lib/motion' -// Flame silhouette: Bootstrap Icons `fire` (MIT License, © The Bootstrap Authors, -// https://github.com/twbs/icons/blob/main/icons/fire.svg). A filled teardrop -// flame whose tip curls right, with a small inner negative-space tongue at the -// bottom center -- the closest MIT-licensed match to the menubar's SF Symbol -// `flame.fill`. Path embedded verbatim; only the fill is swapped for the brand -// gradient. -const FLAME_PATH = - 'M8 16c3.314 0 6-2 6-5.5 0-1.5-.5-4-2.5-6 .25 1.5-1.25 2-1.25 2C11 4 9 .5 6 0c.357 2 .5 4-2 6-1.25 1-2 2.729-2 4.5C2 14 4.686 16 8 16m0-1c-1.657 0-3-1-3-2.75 0-.75.25-2 1.25-3C6.125 10 7 10.5 7 10.5c-.375-1.25.5-3.25 2-3.5-.179 1-.25 2 1 3 .625.5 1 1.364 1 2.25C11 14 9.657 15 8 15' +// Hand-authored three-layer flame, retraced from the approved CodeBurn app icon +// (app/build/icon.svg) minus the squircle: coral outer silhouette (left tongue + +// tall right-curling tip + right tongue), a warmer amber mid layer, and a bright +// cream core. Same path data and sampled fills as the icon so the splash, sidebar +// and dock read as one mark. Coordinates share the icon's 1024 space; the viewBox +// frames just the flame. +const CORAL = + 'M507 786C438 788 352 776 300 736C254 700 248 646 264 588C276 532 288 466 306 420C315 398 324 382 332 374C339 368 346 369 350 382C366 424 393 484 418 526C434 474 452 394 466 332C478 280 490 234 500 198C508 178 524 172 542 186C566 206 590 232 608 264C612 314 620 394 640 444C648 466 660 470 668 460C688 428 716 398 740 392C748 389 754 396 754 412C762 452 776 498 787 552C800 622 784 692 728 732C668 778 574 786 507 786Z' +const AMBER = + 'M508 770C446 772 370 760 322 722C282 692 276 642 290 590C300 546 310 498 328 464C338 446 352 446 360 462C376 424 398 372 416 342C430 318 452 314 466 338C478 360 482 398 490 426C502 406 516 386 536 382C558 378 574 396 584 426C598 468 616 514 642 550C664 580 674 630 658 674C634 720 574 770 508 770Z' +const CREAM = + 'M507 772C452 772 402 744 382 694C364 654 368 606 390 570C402 548 412 510 418 474C424 450 438 442 452 450C466 458 472 482 478 504C483 516 494 520 505 517C517 514 524 504 530 488C540 468 556 464 570 476C584 488 590 518 606 550C630 594 632 646 612 686C590 730 552 772 507 772Z' /** - * Brand flame mark, mirroring the menubar's `BurnFlame`. The vertical gradient - * reproduces that view's Ember-preset stops (glow -> light -> base -> deep, from - * base to tip). Shared between the launch splash (large) and the sidebar (small). - * `live` gives the whole mark an all-but-imperceptible idle flicker in the - * sidebar; its phase is randomized once per mount so a row of flames never - * metronomes. All motion is gated by motionEnabled(). + * Brand flame mark. Shared between the launch splash (large) and the sidebar + * (small). `live` gives the mark an all-but-imperceptible idle flicker on its + * bright core; the flicker phase is randomized once per mount so a row of flames + * never metronomes. All motion is gated by motionEnabled(). */ export function FlameMark({ size = 20, live = false }: { size?: number; live?: boolean }) { - const uid = useId() - const grad = `fm-grad-${uid}` // Random negative delay so the loop starts mid-cycle at a different point each // mount. Computed once; only takes effect when the flicker class is present. const flickerStyle = useMemo(() => ({ animationDelay: `-${(Math.random() * 4 + 1).toFixed(2)}s` }), []) const flicker = live && motionEnabled() return ( -