@heyramzi/ui 2.11.0 → 2.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/dist/agents/helpers.js +38 -38
  2. package/dist/agents/page-state.js +49 -50
  3. package/dist/agents/vendor/color.js +146 -127
  4. package/dist/agents/vendor/draw.js +617 -508
  5. package/dist/agents/vendor/engine.js +698 -599
  6. package/dist/agents/vendor/mesh.js +653 -683
  7. package/dist/agents/vendor/plastic.js +3913 -3112
  8. package/dist/agents/vendor/presets.js +163 -164
  9. package/dist/agents/vendor/shapes.js +21 -20
  10. package/dist/agents/vendor/ticker.js +41 -42
  11. package/dist/agents/vendor/types.js +1 -0
  12. package/dist/agents/vendor/wear.js +1421 -1448
  13. package/dist/ai/confirmation/confirmation-context.svelte.js +6 -6
  14. package/dist/ai/confirmation/index.js +3 -1
  15. package/dist/ai/index.js +33 -0
  16. package/dist/ai/prompt-input/index.js +3 -1
  17. package/dist/ai/reasoning/index.js +3 -1
  18. package/dist/ai/reasoning/reasoning-context.svelte.js +6 -6
  19. package/dist/ai/suggestion/index.js +3 -1
  20. package/dist/ai/typing-dots/index.js +3 -1
  21. package/dist/animations/text-swap.js +24 -24
  22. package/dist/brand/index.js +54 -48
  23. package/dist/canvas/card/resize.js +5 -3
  24. package/dist/canvas/edges/edge-path.js +255 -242
  25. package/dist/canvas/editor/context-menu.js +39 -36
  26. package/dist/canvas/editor/dispatch.svelte.js +154 -151
  27. package/dist/canvas/editor/editor-context.js +7 -2
  28. package/dist/canvas/editor/editor-mode.js +1 -0
  29. package/dist/canvas/editor/frame.js +73 -76
  30. package/dist/canvas/editor/hand-context.js +5 -2
  31. package/dist/canvas/editor/history-core.js +163 -191
  32. package/dist/canvas/editor/keymap.js +95 -169
  33. package/dist/canvas/editor/layout-actions.js +143 -144
  34. package/dist/canvas/editor/lock.js +52 -51
  35. package/dist/canvas/editor/rebase.js +217 -240
  36. package/dist/canvas/editor/style.js +132 -137
  37. package/dist/canvas/editor/text-field-context.js +7 -2
  38. package/dist/canvas/editor/z-order.js +65 -70
  39. package/dist/canvas/headless/alignment.js +22 -16
  40. package/dist/canvas/headless/break-apart-find.js +286 -279
  41. package/dist/canvas/headless/break-apart-pieces.js +62 -58
  42. package/dist/canvas/headless/break-apart-plan.js +299 -325
  43. package/dist/canvas/headless/break-apart-style.js +75 -70
  44. package/dist/canvas/headless/break-apart.js +188 -181
  45. package/dist/canvas/headless/canvas-cleanup.js +78 -58
  46. package/dist/canvas/headless/edge-anchors.js +115 -116
  47. package/dist/canvas/headless/edge-memo.js +24 -22
  48. package/dist/canvas/headless/edge-serialization.js +17 -27
  49. package/dist/canvas/headless/figure-geometry.js +232 -264
  50. package/dist/canvas/headless/fit-viewport.js +84 -67
  51. package/dist/canvas/headless/grid.js +88 -86
  52. package/dist/canvas/headless/icon-node.js +44 -36
  53. package/dist/canvas/headless/index.js +1 -0
  54. package/dist/canvas/headless/linkify.js +17 -19
  55. package/dist/canvas/headless/pen-marks.js +101 -95
  56. package/dist/canvas/headless/sketch.js +231 -209
  57. package/dist/canvas/headless/snap-guides.js +99 -83
  58. package/dist/canvas/headless/svg-figure.js +133 -117
  59. package/dist/canvas/headless/table-layout.js +146 -107
  60. package/dist/canvas/index.js +2 -0
  61. package/dist/canvas/lod/lod-mode.svelte.js +20 -18
  62. package/dist/canvas/lod/render-all.svelte.js +36 -39
  63. package/dist/canvas/ops/arrange.js +78 -71
  64. package/dist/canvas/ops/ops.js +260 -255
  65. package/dist/canvas/pen/colors.js +37 -35
  66. package/dist/canvas/pen/eraser.js +28 -27
  67. package/dist/canvas/pen/geometry.js +120 -130
  68. package/dist/canvas/pen/index.js +1 -0
  69. package/dist/canvas/pen/ops.js +11 -11
  70. package/dist/canvas/pen/pen-session.js +150 -159
  71. package/dist/canvas/pen/plugin.js +107 -104
  72. package/dist/canvas/pen/shapes.js +73 -68
  73. package/dist/canvas/pen/stroke-path.js +32 -30
  74. package/dist/canvas/pen/types.js +21 -21
  75. package/dist/canvas/pen/ui.js +10 -8
  76. package/dist/canvas/plugin.js +46 -46
  77. package/dist/canvas/screen/glyphs.js +12 -11
  78. package/dist/canvas/screen/labels.js +22 -22
  79. package/dist/canvas/screen/parts.js +98 -111
  80. package/dist/canvas/screen/plugin.js +47 -56
  81. package/dist/canvas/screen/types.js +30 -35
  82. package/dist/canvas/screen/ui.js +7 -7
  83. package/dist/canvas/test-utils.js +14 -14
  84. package/dist/canvas/types.js +1 -0
  85. package/dist/canvas/ui/forward-wheel.js +24 -25
  86. package/dist/canvas/ui/icons.js +64 -131
  87. package/dist/canvas/ui/place-panel.js +58 -49
  88. package/dist/canvas/ui/shortcut-tip.js +14 -12
  89. package/dist/canvas/ui/tools.js +300 -385
  90. package/dist/charts/dashboard/chart.js +4 -0
  91. package/dist/charts/dashboard/data-table.js +11 -0
  92. package/dist/charts/dashboard/windows.js +8 -3
  93. package/dist/charts/edge-fade.js +10 -5
  94. package/dist/charts/hover-band.js +16 -11
  95. package/dist/charts/index.js +0 -1
  96. package/dist/charts/motion.js +11 -7
  97. package/dist/charts/primitives/chart-utils.js +12 -12
  98. package/dist/components/copy/clipboard.js +32 -32
  99. package/dist/components/copy/copied.svelte.js +31 -23
  100. package/dist/components/data-table/data-table.js +39 -39
  101. package/dist/components/docs/index.js +4 -0
  102. package/dist/components/docs/scroll-spy.svelte.js +73 -68
  103. package/dist/components/list-page/filter-section.js +4 -1
  104. package/dist/components/list-page/index.js +2 -0
  105. package/dist/components/list-page/list-table.js +7 -2
  106. package/dist/components/list-page/queue-rail.js +14 -0
  107. package/dist/components/list-page/section-host.js +4 -2
  108. package/dist/components/list-page/step.js +4 -3
  109. package/dist/components/list-page/types.js +1 -0
  110. package/dist/components/picker/trigger.js +48 -30
  111. package/dist/components/picker/types.js +1 -0
  112. package/dist/components/segmented/collapse.js +38 -27
  113. package/dist/components/segmented/index.js +8 -0
  114. package/dist/components/segmented/segmented.js +67 -42
  115. package/dist/components/star-rating-input/index.js +3 -1
  116. package/dist/components/table-view/types.js +1 -0
  117. package/dist/components/tags-input/tags.js +81 -69
  118. package/dist/components/theme/index.js +4 -0
  119. package/dist/components/toolbar/index.js +4 -0
  120. package/dist/components/toolbar/toolbar-trigger.js +14 -1
  121. package/dist/editor/anchors.js +17 -13
  122. package/dist/editor/block-id.js +52 -51
  123. package/dist/editor/block-ops.js +108 -80
  124. package/dist/editor/doc-blocks.js +155 -166
  125. package/dist/editor/extensions.js +139 -180
  126. package/dist/editor/index.js +4 -0
  127. package/dist/editor/markdown-test-helpers.js +4 -2
  128. package/dist/editor/markdown.js +420 -408
  129. package/dist/editor/serializer.js +204 -200
  130. package/dist/editor/slash-items.js +89 -101
  131. package/dist/editor/youtube-url.js +25 -20
  132. package/dist/effects/animated-beam/path-calculator.svelte.js +43 -38
  133. package/dist/effects/animated-beam/types.js +1 -0
  134. package/dist/effects/border-beam/css.js +92 -78
  135. package/dist/effects/border-beam/presets.js +1705 -1720
  136. package/dist/effects/border-beam/register-properties.js +43 -33
  137. package/dist/effects/border-beam/types.js +1 -0
  138. package/dist/effects/image-comparison/compare.js +3 -2
  139. package/dist/effects/image-reveal/types.js +1 -0
  140. package/dist/effects/magnetic/magnetic.js +58 -52
  141. package/dist/effects/reveal/observe.js +50 -40
  142. package/dist/effects/reveal/types.js +1 -0
  143. package/dist/effects/shader-gradient/color.js +36 -29
  144. package/dist/effects/shader-gradient/renderer.js +384 -295
  145. package/dist/effects/shader-gradient/shaders.js +31 -0
  146. package/dist/effects/shader-gradient/types.js +1 -0
  147. package/dist/icons/apple-symbol-exports.js +99 -124
  148. package/dist/icons/sf-symbols.js +357 -461
  149. package/dist/icons/trades.js +43 -28
  150. package/dist/inbox/index.js +1 -0
  151. package/dist/inbox/logic.js +126 -122
  152. package/dist/inbox/types.js +43 -43
  153. package/dist/lib/arrive.js +19 -12
  154. package/dist/lib/icon-types.js +1 -0
  155. package/dist/lib/initials.js +16 -10
  156. package/dist/lib/layout.js +5 -0
  157. package/dist/lib/panel.js +13 -0
  158. package/dist/lib/result.js +22 -22
  159. package/dist/lib/sliding-pill.js +59 -44
  160. package/dist/lib/theme-transition.js +43 -43
  161. package/dist/lib/tone.js +31 -24
  162. package/dist/lib/utils.js +3 -1
  163. package/dist/onboarding/define-tours.js +24 -23
  164. package/dist/onboarding/onboarding.svelte.js +16 -12
  165. package/dist/onboarding/pick.js +10 -6
  166. package/dist/onboarding/stores.js +40 -41
  167. package/dist/onboarding/wait.js +24 -23
  168. package/dist/panel/side-panel-types.js +1 -0
  169. package/dist/record/demo-data.js +459 -486
  170. package/dist/record/fields.js +129 -131
  171. package/dist/record/format.js +70 -82
  172. package/dist/record/gutter.js +1 -0
  173. package/dist/record/kinds.js +95 -105
  174. package/dist/record/logic.js +238 -219
  175. package/dist/record/types.js +49 -48
  176. package/dist/shadcn/accordion/index.js +3 -1
  177. package/dist/shadcn/alert/index.js +3 -1
  178. package/dist/shadcn/alert-dialog/index.js +3 -1
  179. package/dist/shadcn/attachment/index.js +3 -1
  180. package/dist/shadcn/avatar/index.js +3 -1
  181. package/dist/shadcn/breadcrumb/index.js +3 -1
  182. package/dist/shadcn/bubble/index.js +3 -1
  183. package/dist/shadcn/button/index.js +3 -1
  184. package/dist/shadcn/calendar/index.js +3 -1
  185. package/dist/shadcn/card/index.js +3 -1
  186. package/dist/shadcn/checkbox/index.js +3 -1
  187. package/dist/shadcn/code-block/index.js +3 -1
  188. package/dist/shadcn/collapsible/index.js +3 -1
  189. package/dist/shadcn/command/index.js +4 -1
  190. package/dist/shadcn/context-menu/index.js +3 -1
  191. package/dist/shadcn/dialog/index.js +3 -1
  192. package/dist/shadcn/dropdown-menu/menu-item.js +40 -20
  193. package/dist/shadcn/empty/index.js +3 -1
  194. package/dist/shadcn/field/index.js +3 -1
  195. package/dist/shadcn/hooks/highlighter.js +77 -75
  196. package/dist/shadcn/hooks/is-mobile.svelte.js +3 -3
  197. package/dist/shadcn/hooks/use-highlighted-code.svelte.js +62 -62
  198. package/dist/shadcn/input/index.js +3 -1
  199. package/dist/shadcn/kbd/index.js +3 -1
  200. package/dist/shadcn/label/index.js +3 -1
  201. package/dist/shadcn/marker/index.js +3 -1
  202. package/dist/shadcn/message/index.js +3 -1
  203. package/dist/shadcn/message-scroller/index.js +3 -1
  204. package/dist/shadcn/popover/index.js +3 -1
  205. package/dist/shadcn/progress/index.js +3 -1
  206. package/dist/shadcn/progress/tone.js +8 -7
  207. package/dist/shadcn/radio-group/index.js +3 -1
  208. package/dist/shadcn/scroll-area/index.js +3 -1
  209. package/dist/shadcn/select/index.js +3 -1
  210. package/dist/shadcn/separator/index.js +3 -1
  211. package/dist/shadcn/sheet/index.js +3 -1
  212. package/dist/shadcn/sidebar/context.svelte.js +42 -28
  213. package/dist/shadcn/sidebar/index.js +3 -1
  214. package/dist/shadcn/skeleton/index.js +3 -1
  215. package/dist/shadcn/slider/index.js +3 -1
  216. package/dist/shadcn/switch/index.js +3 -1
  217. package/dist/shadcn/table/index.js +3 -1
  218. package/dist/shadcn/tabs/index.js +3 -1
  219. package/dist/shadcn/textarea/index.js +3 -1
  220. package/dist/shadcn/toggle/index.js +3 -1
  221. package/dist/shadcn/toggle-group/index.js +3 -1
  222. package/dist/shadcn/tooltip/context.js +7 -2
  223. package/dist/shadcn/tooltip/index.js +3 -1
  224. package/dist/shadcn/trace/index.js +3 -1
  225. package/dist/slides/bridges.js +65 -59
  226. package/dist/slides/deck-controller.svelte.js +210 -207
  227. package/dist/slides/export/capture.js +66 -71
  228. package/dist/slides/export/ffmpeg.js +76 -72
  229. package/dist/slides/export/index.js +3 -0
  230. package/dist/slides/export/launch.js +9 -6
  231. package/dist/slides/export/pdf.js +60 -54
  232. package/dist/slides/export/types.js +1 -0
  233. package/dist/slides/labels.js +24 -24
  234. package/dist/slides/layout.js +39 -41
  235. package/dist/slides/model.js +9 -7
  236. package/dist/slides/navigation.js +78 -73
  237. package/dist/slides/types.js +2 -2
  238. package/dist/status/define-statuses.js +18 -14
  239. package/dist/status/status-types.js +1 -0
  240. package/dist/test-setup.js +24 -20
  241. package/dist/thread/logic.js +73 -77
  242. package/dist/thread/types.js +21 -21
  243. package/dist/work/board-order.js +94 -90
  244. package/dist/work/dates.js +16 -9
  245. package/dist/work/detail/detail-types.js +18 -18
  246. package/dist/work/docs/edited.js +32 -29
  247. package/dist/work/docs/index.js +4 -0
  248. package/dist/work/docs/labels.js +34 -34
  249. package/dist/work/docs/menu.js +113 -106
  250. package/dist/work/docs/outline.js +39 -29
  251. package/dist/work/gantt/logic.js +211 -235
  252. package/dist/work/inbox/inbox-logic.js +71 -75
  253. package/dist/work/inbox/inbox-statuses.js +75 -72
  254. package/dist/work/inbox/inbox-types.js +1 -0
  255. package/dist/work/kanban-drag.js +27 -22
  256. package/dist/work/kanban-types.js +1 -0
  257. package/dist/work/presets/sales.js +36 -32
  258. package/dist/work/reorder.js +9 -8
  259. package/dist/work/task-types.js +1 -0
  260. package/dist/work/time/duration.js +51 -46
  261. package/dist/work/time/time-types.js +23 -23
  262. package/dist/work/use-kanban-dnd.svelte.js +126 -125
  263. package/package.json +3 -1
  264. package/src/components/list-page/master-detail.svelte +3 -1
  265. package/src/components/list-page/rail-row.svelte +4 -4
  266. package/src/components/tags-input/tags-input.svelte +2 -0
  267. package/src/editor/markdown.ts +30 -35
@@ -1,104 +1,92 @@
1
1
  import { TextB, TextHOne, TextHTwo, TextHThree, ListBullets, ListNumbers, Quotes, CodeBlock, Minus, ImageSquare, Paragraph, VideoCamera, ListChecks, Table } from "phosphor-svelte";
2
+ /** Every slash command for a preset, filtered by the text typed after the `/`. */
2
3
  export function buildSlashItems(editor, query, options) {
3
- const run = ()=>editor.chain().focus();
4
- const full = options.preset === "full";
5
- const allItems = [
6
- {
7
- label: "Heading 1",
8
- description: "Page title",
9
- icon: TextHOne,
10
- command: ()=>run().toggleHeading({
11
- level: 1
12
- }).run()
13
- },
14
- {
15
- label: "Heading 2",
16
- description: "Section heading",
17
- icon: TextHTwo,
18
- command: ()=>run().toggleHeading({
19
- level: 2
20
- }).run()
21
- },
22
- {
23
- label: "Heading 3",
24
- description: "Subsection heading",
25
- icon: TextHThree,
26
- command: ()=>run().toggleHeading({
27
- level: 3
28
- }).run()
29
- },
30
- {
31
- label: "Bullet List",
32
- description: "Unordered list",
33
- icon: ListBullets,
34
- command: ()=>run().toggleBulletList().run()
35
- },
36
- {
37
- label: "Ordered List",
38
- description: "Numbered list",
39
- icon: ListNumbers,
40
- command: ()=>run().toggleOrderedList().run()
41
- },
42
- ...full ? [
43
- {
44
- label: "Checklist",
45
- description: "Tasks with checkboxes",
46
- icon: ListChecks,
47
- command: ()=>run().toggleTaskList().run()
48
- },
49
- {
50
- label: "Table",
51
- description: "Rows and columns",
52
- icon: Table,
53
- command: ()=>run().insertTable({
54
- rows: 3,
55
- cols: 3,
56
- withHeaderRow: true
57
- }).run()
58
- }
59
- ] : [],
60
- {
61
- label: "Quote",
62
- description: "Blockquote",
63
- icon: Quotes,
64
- command: ()=>run().toggleBlockquote().run()
65
- },
66
- {
67
- label: "Code Block",
68
- description: "Code snippet",
69
- icon: CodeBlock,
70
- command: ()=>run().toggleCodeBlock().run()
71
- },
72
- {
73
- label: "Divider",
74
- description: "Horizontal rule",
75
- icon: Minus,
76
- command: ()=>run().setHorizontalRule().run()
77
- },
78
- ...full ? [
79
- {
80
- label: "Image",
81
- description: "Insert from URL",
82
- icon: ImageSquare,
83
- command: options.insertImage
84
- }
85
- ] : [],
86
- ...full ? [
87
- {
88
- label: "YouTube",
89
- description: "Insert a video by URL",
90
- icon: VideoCamera,
91
- command: options.insertYoutube
92
- }
93
- ] : [],
94
- {
95
- label: "Paragraph",
96
- description: "Plain text block",
97
- icon: Paragraph,
98
- command: ()=>run().setParagraph().run()
99
- }
100
- ];
101
- if (!query) return allItems;
102
- const q = query.toLowerCase();
103
- return allItems.filter((item)=>item.label.toLowerCase().includes(q) || item.description.toLowerCase().includes(q));
4
+ const run = () => editor.chain().focus();
5
+ const full = options.preset === "full";
6
+ const allItems = [
7
+ {
8
+ label: "Heading 1",
9
+ description: "Page title",
10
+ icon: TextHOne,
11
+ command: () => run().toggleHeading({ level: 1 }).run()
12
+ },
13
+ {
14
+ label: "Heading 2",
15
+ description: "Section heading",
16
+ icon: TextHTwo,
17
+ command: () => run().toggleHeading({ level: 2 }).run()
18
+ },
19
+ {
20
+ label: "Heading 3",
21
+ description: "Subsection heading",
22
+ icon: TextHThree,
23
+ command: () => run().toggleHeading({ level: 3 }).run()
24
+ },
25
+ {
26
+ label: "Bullet List",
27
+ description: "Unordered list",
28
+ icon: ListBullets,
29
+ command: () => run().toggleBulletList().run()
30
+ },
31
+ {
32
+ label: "Ordered List",
33
+ description: "Numbered list",
34
+ icon: ListNumbers,
35
+ command: () => run().toggleOrderedList().run()
36
+ },
37
+ ...full ? [{
38
+ label: "Checklist",
39
+ description: "Tasks with checkboxes",
40
+ icon: ListChecks,
41
+ command: () => run().toggleTaskList().run()
42
+ }, {
43
+ label: "Table",
44
+ description: "Rows and columns",
45
+ icon: Table,
46
+ command: () => run().insertTable({
47
+ rows: 3,
48
+ cols: 3,
49
+ withHeaderRow: true
50
+ }).run()
51
+ }] : [],
52
+ {
53
+ label: "Quote",
54
+ description: "Blockquote",
55
+ icon: Quotes,
56
+ command: () => run().toggleBlockquote().run()
57
+ },
58
+ {
59
+ label: "Code Block",
60
+ description: "Code snippet",
61
+ icon: CodeBlock,
62
+ command: () => run().toggleCodeBlock().run()
63
+ },
64
+ {
65
+ label: "Divider",
66
+ description: "Horizontal rule",
67
+ icon: Minus,
68
+ command: () => run().setHorizontalRule().run()
69
+ },
70
+ ...full ? [{
71
+ label: "Image",
72
+ description: "Insert from URL",
73
+ icon: ImageSquare,
74
+ command: options.insertImage
75
+ }] : [],
76
+ ...full ? [{
77
+ label: "YouTube",
78
+ description: "Insert a video by URL",
79
+ icon: VideoCamera,
80
+ command: options.insertYoutube
81
+ }] : [],
82
+ {
83
+ label: "Paragraph",
84
+ description: "Plain text block",
85
+ icon: Paragraph,
86
+ command: () => run().setParagraph().run()
87
+ }
88
+ ];
89
+ if (!query) return allItems;
90
+ const q = query.toLowerCase();
91
+ return allItems.filter((item) => item.label.toLowerCase().includes(q) || item.description.toLowerCase().includes(q));
104
92
  }
@@ -1,27 +1,32 @@
1
+ // No markdown-it here, so the editor can import it without the markdown engine.
1
2
  export const YOUTUBE_ID_RE = /^[A-Za-z0-9_-]{11}$/;
2
3
  function toUrl(url) {
3
- try {
4
- return new URL(url);
5
- } catch {
6
- return null;
7
- }
4
+ try {
5
+ return new URL(url);
6
+ } catch {
7
+ return null;
8
+ }
8
9
  }
9
10
  function videoIdOf(parsed) {
10
- const host = parsed.hostname.replace(/^www\./, "");
11
- if (host === "youtu.be") return parsed.pathname.slice(1);
12
- if (host !== "youtube.com" && host !== "m.youtube.com") return null;
13
- if (parsed.pathname === "/watch") return parsed.searchParams.get("v");
14
- if (parsed.pathname.startsWith("/embed/")) return parsed.pathname.slice("/embed/".length);
15
- return null;
11
+ const host = parsed.hostname.replace(/^www\./, "");
12
+ if (host === "youtu.be") return parsed.pathname.slice(1);
13
+ if (host !== "youtube.com" && host !== "m.youtube.com") return null;
14
+ if (parsed.pathname === "/watch") return parsed.searchParams.get("v");
15
+ if (parsed.pathname.startsWith("/embed/")) return parsed.pathname.slice("/embed/".length);
16
+ return null;
16
17
  }
18
+ /**
19
+ * Reads youtube.com/watch?v=ID, youtu.be/ID and youtube.com/embed/ID. A `t`
20
+ * param in seconds becomes `start`.
21
+ */
17
22
  export function parseYoutubeUrl(url) {
18
- const parsed = toUrl(url);
19
- if (!parsed) return null;
20
- const videoId = videoIdOf(parsed);
21
- if (!videoId || !YOUTUBE_ID_RE.test(videoId)) return null;
22
- const t = parseInt(parsed.searchParams.get("t") ?? "", 10);
23
- return {
24
- videoId,
25
- start: Number.isFinite(t) && t > 0 ? t : 0
26
- };
23
+ const parsed = toUrl(url);
24
+ if (!parsed) return null;
25
+ const videoId = videoIdOf(parsed);
26
+ if (!videoId || !YOUTUBE_ID_RE.test(videoId)) return null;
27
+ const t = parseInt(parsed.searchParams.get("t") ?? "", 10);
28
+ return {
29
+ videoId,
30
+ start: Number.isFinite(t) && t > 0 ? t : 0
31
+ };
27
32
  }
@@ -1,42 +1,47 @@
1
1
  function anchorX(rect, containerLeft, anchor, offset) {
2
- const left = rect.left - containerLeft;
3
- if (anchor === "left") return left + offset;
4
- if (anchor === "right") return left + rect.width + offset;
5
- return left + rect.width / 2 + offset;
2
+ const left = rect.left - containerLeft;
3
+ if (anchor === "left") return left + offset;
4
+ if (anchor === "right") return left + rect.width + offset;
5
+ return left + rect.width / 2 + offset;
6
6
  }
7
7
  export function usePathCalculator() {
8
- let pathD = $state("");
9
- let svgDimensions = $state({
10
- width: 0,
11
- height: 0
12
- });
13
- function calculatePath(containerRef, fromRef, toRef, curvature, startXOffset, startYOffset, endXOffset, endYOffset, fromAnchor = "center", toAnchor = "center") {
14
- if (!containerRef || !fromRef || !toRef) return;
15
- const containerRect = containerRef.getBoundingClientRect();
16
- const rectA = fromRef.getBoundingClientRect();
17
- const rectB = toRef.getBoundingClientRect();
18
- svgDimensions = {
19
- width: containerRect.width,
20
- height: containerRect.height
21
- };
22
- const startX = anchorX(rectA, containerRect.left, fromAnchor, startXOffset);
23
- const startY = rectA.top - containerRect.top + rectA.height / 2 + startYOffset;
24
- const endX = anchorX(rectB, containerRect.left, toAnchor, endXOffset);
25
- const endY = rectB.top - containerRect.top + rectB.height / 2 + endYOffset;
26
- const span = Math.abs(endX - startX);
27
- const handle = Math.max(span * 0.5, 24);
28
- const direction = endX >= startX ? 1 : -1;
29
- const c1x = startX + handle * direction;
30
- const c2x = endX - handle * direction;
31
- pathD = `M ${startX},${startY} C ${c1x},${startY - curvature} ${c2x},${endY - curvature} ${endX},${endY}`;
32
- }
33
- return {
34
- get pathD () {
35
- return pathD;
36
- },
37
- get svgDimensions () {
38
- return svgDimensions;
39
- },
40
- calculatePath
41
- };
8
+ let pathD = $state("");
9
+ let svgDimensions = $state({
10
+ width: 0,
11
+ height: 0
12
+ });
13
+ function calculatePath(containerRef, fromRef, toRef, curvature, startXOffset, startYOffset, endXOffset, endYOffset, fromAnchor = "center", toAnchor = "center") {
14
+ if (!containerRef || !fromRef || !toRef) return;
15
+ const containerRect = containerRef.getBoundingClientRect();
16
+ const rectA = fromRef.getBoundingClientRect();
17
+ const rectB = toRef.getBoundingClientRect();
18
+ svgDimensions = {
19
+ width: containerRect.width,
20
+ height: containerRect.height
21
+ };
22
+ const startX = anchorX(rectA, containerRect.left, fromAnchor, startXOffset);
23
+ const startY = rectA.top - containerRect.top + rectA.height / 2 + startYOffset;
24
+ const endX = anchorX(rectB, containerRect.left, toAnchor, endXOffset);
25
+ const endY = rectB.top - containerRect.top + rectB.height / 2 + endYOffset;
26
+ // A cubic with horizontal handles, not a quadratic through a raised midpoint.
27
+ // The quadratic put its single control point at `midY` minus `curvature`, which for a fan into one node lands past the far end:
28
+ // the top beam dove below the hub and crossed the middle beam before arriving, and three beams bundled into a lens for the last stretch.
29
+ // Handles along the axis of travel make each beam leave and arrive perpendicular to its anchor, so a fan converges at the anchor and nowhere else.
30
+ // `curvature` still bows the middle, and zero still draws a straight line between two anchors at the same height.
31
+ const span = Math.abs(endX - startX);
32
+ const handle = Math.max(span * .5, 24);
33
+ const direction = endX >= startX ? 1 : -1;
34
+ const c1x = startX + handle * direction;
35
+ const c2x = endX - handle * direction;
36
+ pathD = `M ${startX},${startY} C ${c1x},${startY - curvature} ${c2x},${endY - curvature} ${endX},${endY}`;
37
+ }
38
+ return {
39
+ get pathD() {
40
+ return pathD;
41
+ },
42
+ get svgDimensions() {
43
+ return svgDimensions;
44
+ },
45
+ calculatePath
46
+ };
42
47
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,6 +1,9 @@
1
1
  import { lineBloomGradient, lineBorderGradient, lineInnerGradient, mdBorderGradient, mdInnerGradient, smBorderGradient, smInnerGradient } from "./presets.js";
2
+ // WHY: shared rule blocks every variant emits so paused/reduced-motion/
3
+ // isolation behavior stays consistent across sm/md/line. Inlined into each
4
+ // variant's template literal at the end so all selectors reference its id.
2
5
  function commonHostRules(id) {
3
- return `
6
+ return `
4
7
  [data-beam="${id}"][data-paused],
5
8
  [data-beam="${id}"][data-paused]::before,
6
9
  [data-beam="${id}"][data-paused]::after,
@@ -19,8 +22,11 @@ function commonHostRules(id) {
19
22
  [data-beam="${id}"][data-fading] { --beam-opacity-${id}: 0; }
20
23
  }`;
21
24
  }
25
+ // WHY: sm and md share property registrations, host rules, and the spin/ fade keyframe set verbatim.
26
+ // Pulling them into helpers removes ~30 lines of duplication per variant and keeps the two in lockstep.
27
+ // Line variant has its own header (more @property entries, different keyframes) so it keeps its inline body.
22
28
  function spinHeader(id, borderRadius, duration) {
23
- return `
29
+ return `
24
30
  @property --beam-angle-${id} { syntax: "<angle>"; initial-value: 0deg; inherits: true; }
25
31
  @property --beam-opacity-${id} { syntax: "<number>"; initial-value: 0; inherits: true; }
26
32
 
@@ -30,31 +36,35 @@ function spinHeader(id, borderRadius, duration) {
30
36
  `;
31
37
  }
32
38
  function spinKeyframes(id) {
33
- return `
39
+ return `
34
40
  @keyframes beam-spin-${id} { to { --beam-angle-${id}: 360deg; } }
35
41
  @keyframes beam-fade-in-${id} { to { --beam-opacity-${id}: 1; } }
36
42
  @keyframes beam-fade-out-${id} { from { --beam-opacity-${id}: 1; } to { --beam-opacity-${id}: 0; } }
37
43
  `;
38
44
  }
45
+ // WHY static colours keep a filter: only the hue rotation drifts a fixed palette off-brand.
46
+ // Dropping brightness and saturation with it left the ring duller than the bloom beside it, which keeps both.
39
47
  function hueShift(id, staticColors, hueRange, brightness, saturation) {
40
- const grade = `brightness(${brightness.toFixed(2)}) saturate(${saturation.toFixed(2)})`;
41
- if (staticColors) return {
42
- decl: `filter: ${grade};`,
43
- keyframes: ""
44
- };
45
- const filter = (deg)=>`filter: hue-rotate(${deg >= 0 ? "" : "-"}${Math.abs(deg)}deg) ${grade};`;
46
- return {
47
- decl: `animation: beam-hue-shift-${id} 12s ease-in-out infinite;`,
48
- keyframes: `
48
+ const grade = `brightness(${brightness.toFixed(2)}) saturate(${saturation.toFixed(2)})`;
49
+ if (staticColors) return {
50
+ decl: `filter: ${grade};`,
51
+ keyframes: ""
52
+ };
53
+ const filter = (deg) => `filter: hue-rotate(${deg >= 0 ? "" : "-"}${Math.abs(deg)}deg) ${grade};`;
54
+ return {
55
+ decl: `animation: beam-hue-shift-${id} 12s ease-in-out infinite;`,
56
+ keyframes: `
49
57
  @keyframes beam-hue-shift-${id} {
50
58
  0% { ${filter(-hueRange)} }
51
59
  50% { ${filter(hueRange)} }
52
60
  100% { ${filter(-hueRange)} }
53
61
  }`
54
- };
62
+ };
55
63
  }
64
+ // WHY: sm and md emit the same bloom layer CSS (only the gradient differs).
65
+ // Single helper so a future bloom tweak doesn't have to be applied twice.
56
66
  function bloomBlock(o) {
57
- return `
67
+ return `
58
68
  [data-beam="${o.id}"] [data-beam-bloom] {
59
69
  display: none; position: absolute; inset: 0;
60
70
  border-radius: ${o.innerR}px; clip-path: inset(0 round ${o.borderRadius}px);
@@ -74,21 +84,24 @@ function bloomBlock(o) {
74
84
  opacity: calc(var(--beam-opacity-${o.id}) * ${o.bloomOpacity.toFixed(2)} * var(--beam-strength, 1));
75
85
  }`;
76
86
  }
87
+ // WHY every variant writes its conic sweep out in full instead of holding it
88
+ // in one custom property and reusing it: a var() inside the `mask` shorthand is invalid at computed-value time, so the mask resolves to none and the ring floods the element.
89
+ // The duplication between the -webkit- and standard mask declarations is the same constraint.
77
90
  export function generateCss(opts) {
78
- if (opts.size === "line") return generateLineCss(opts);
79
- if (opts.size === "sm") return generateSmCss(opts);
80
- return generateMdCss(opts);
91
+ if (opts.size === "line") return generateLineCss(opts);
92
+ if (opts.size === "sm") return generateSmCss(opts);
93
+ return generateMdCss(opts);
81
94
  }
82
95
  function generateSmCss(o) {
83
- const { id, borderRadius, borderWidth, duration, strokeOpacity, innerOpacity, bloomOpacity, innerShadow, colorVariant, staticColors, brightness, saturation, hueRange, theme, colors, bloom } = o;
84
- const innerR = Math.max(0, borderRadius - borderWidth);
85
- const scale = colorVariant === "mono" ? 0.5 : 1;
86
- const sOp = strokeOpacity * scale;
87
- const iOp = innerOpacity * scale;
88
- const bOp = bloomOpacity * scale;
89
- const hue = hueShift(id, staticColors, hueRange, brightness, saturation);
90
- const dark = theme === "dark";
91
- const strokeBeam = dark ? `conic-gradient(
96
+ const { id, borderRadius, borderWidth, duration, strokeOpacity, innerOpacity, bloomOpacity, innerShadow, colorVariant, staticColors, brightness, saturation, hueRange, theme, colors, bloom } = o;
97
+ const innerR = Math.max(0, borderRadius - borderWidth);
98
+ const scale = colorVariant === "mono" ? .5 : 1;
99
+ const sOp = strokeOpacity * scale;
100
+ const iOp = innerOpacity * scale;
101
+ const bOp = bloomOpacity * scale;
102
+ const hue = hueShift(id, staticColors, hueRange, brightness, saturation);
103
+ const dark = theme === "dark";
104
+ const strokeBeam = dark ? `conic-gradient(
92
105
  from var(--beam-angle-${id}),
93
106
  transparent 0%, transparent 54%,
94
107
  rgba(255, 255, 255, 0.1) 57%,
@@ -111,9 +124,9 @@ function generateSmCss(o) {
111
124
  rgba(0, 0, 0, 0.08) 75%,
112
125
  transparent 78%, transparent 100%
113
126
  )`;
114
- const border = smBorderGradient(colorVariant, colors);
115
- const inner = smInnerGradient(colorVariant, colors);
116
- const bloomBeam = dark ? `conic-gradient(
127
+ const border = smBorderGradient(colorVariant, colors);
128
+ const inner = smInnerGradient(colorVariant, colors);
129
+ const bloomBeam = dark ? `conic-gradient(
117
130
  from var(--beam-angle-${id}),
118
131
  transparent 0%, transparent 58%,
119
132
  rgba(255, 255, 255, 0.03) 62%,
@@ -142,7 +155,7 @@ function generateSmCss(o) {
142
155
  rgba(0, 0, 0, 0.02) 78%,
143
156
  transparent 82%
144
157
  )`;
145
- const maskConic = `conic-gradient(
158
+ const maskConic = `conic-gradient(
146
159
  from var(--beam-angle-${id}),
147
160
  transparent 0%, transparent 22%,
148
161
  rgba(255, 255, 255, 0.12) 28%, rgba(255, 255, 255, 0.4) 36%,
@@ -150,18 +163,18 @@ function generateSmCss(o) {
150
163
  rgba(255, 255, 255, 0.4) 88%, rgba(255, 255, 255, 0.12) 94%,
151
164
  transparent 97%, transparent 100%
152
165
  )`;
153
- const ringMask = `conic-gradient(from var(--beam-angle-${id}), transparent 0%, transparent 30%, rgba(255, 255, 255, 0.1) 36%, rgba(255, 255, 255, 0.35) 44%, white 52%, white 80%, rgba(255, 255, 255, 0.35) 86%, rgba(255, 255, 255, 0.1) 92%, transparent 95%, transparent 100%)`;
154
- const bloomCss = bloom ? bloomBlock({
155
- id,
156
- borderRadius,
157
- innerR,
158
- borderWidth,
159
- bloomGradient: bloomBeam,
160
- brightness,
161
- saturation,
162
- bloomOpacity: bOp
163
- }) : "";
164
- return `
166
+ const ringMask = `conic-gradient(from var(--beam-angle-${id}), transparent 0%, transparent 30%, rgba(255, 255, 255, 0.1) 36%, rgba(255, 255, 255, 0.35) 44%, white 52%, white 80%, rgba(255, 255, 255, 0.35) 86%, rgba(255, 255, 255, 0.1) 92%, transparent 95%, transparent 100%)`;
167
+ const bloomCss = bloom ? bloomBlock({
168
+ id,
169
+ borderRadius,
170
+ innerR,
171
+ borderWidth,
172
+ bloomGradient: bloomBeam,
173
+ brightness,
174
+ saturation,
175
+ bloomOpacity: bOp
176
+ }) : "";
177
+ return `
165
178
  ${spinHeader(id, borderRadius, duration)}
166
179
  [data-beam="${id}"][data-active]::after,
167
180
  [data-beam="${id}"][data-fading]::after {
@@ -200,30 +213,30 @@ ${commonHostRules(id)}
200
213
  `;
201
214
  }
202
215
  function generateMdCss(o) {
203
- const { id, borderRadius, borderWidth, duration, strokeOpacity, innerOpacity, bloomOpacity, innerShadow, colorVariant, staticColors, brightness, saturation, hueRange, theme, colors, bloom } = o;
204
- const innerR = Math.max(0, borderRadius - borderWidth);
205
- const scale = colorVariant === "mono" ? 0.5 : 1;
206
- const sOp = strokeOpacity * scale;
207
- const iOp = innerOpacity * scale;
208
- const bOp = bloomOpacity * scale;
209
- const hue = hueShift(id, staticColors, hueRange, brightness, saturation);
210
- const dark = theme === "dark";
211
- const strokeBeam = dark ? `conic-gradient(from var(--beam-angle-${id}), transparent 0%, transparent 54%, rgba(255, 255, 255, 0.1) 57%, rgba(255, 255, 255, 0.3) 60%, rgba(255, 255, 255, 0.6) 63%, rgba(255, 255, 255, 0.75) 66%, rgba(255, 255, 255, 0.6) 69%, rgba(255, 255, 255, 0.3) 72%, rgba(255, 255, 255, 0.1) 75%, transparent 78%, transparent 100%)` : `conic-gradient(from var(--beam-angle-${id}), transparent 0%, transparent 54%, rgba(0, 0, 0, 0.08) 57%, rgba(0, 0, 0, 0.2) 60%, rgba(0, 0, 0, 0.4) 63%, rgba(0, 0, 0, 0.55) 66%, rgba(0, 0, 0, 0.4) 69%, rgba(0, 0, 0, 0.2) 72%, rgba(0, 0, 0, 0.08) 75%, transparent 78%, transparent 100%)`;
212
- const border = mdBorderGradient(colorVariant, colors);
213
- const inner = mdInnerGradient(colorVariant, colors);
214
- const bloomBeam = dark ? `conic-gradient(from var(--beam-angle-${id}), transparent 0%, transparent 58%, rgba(255, 255, 255, 0.03) 62%, rgba(255, 255, 255, 0.08) 65%, rgba(255, 255, 255, 0.2) 67%, rgba(255, 255, 255, 0.45) 69%, rgba(255, 255, 255, 0.85) 70%, rgba(255, 255, 255, 0.85) 70.5%, rgba(255, 255, 255, 0.45) 71.5%, rgba(255, 255, 255, 0.2) 73%, rgba(255, 255, 255, 0.08) 75%, rgba(255, 255, 255, 0.03) 78%, transparent 82%)` : `conic-gradient(from var(--beam-angle-${id}), transparent 0%, transparent 58%, rgba(0, 0, 0, 0.02) 62%, rgba(0, 0, 0, 0.08) 65%, rgba(0, 0, 0, 0.2) 67%, rgba(0, 0, 0, 0.4) 69%, rgba(0, 0, 0, 0.6) 70%, rgba(0, 0, 0, 0.6) 70.5%, rgba(0, 0, 0, 0.4) 71.5%, rgba(0, 0, 0, 0.2) 73%, rgba(0, 0, 0, 0.08) 75%, rgba(0, 0, 0, 0.02) 78%, transparent 82%)`;
215
- const conicMask = `conic-gradient(from var(--beam-angle-${id}), transparent 0%, transparent 30%, rgba(255, 255, 255, 0.1) 36%, rgba(255, 255, 255, 0.35) 44%, white 52%, white 80%, rgba(255, 255, 255, 0.35) 86%, rgba(255, 255, 255, 0.1) 92%, transparent 95%, transparent 100%)`;
216
- const bloomCss = bloom ? bloomBlock({
217
- id,
218
- borderRadius,
219
- innerR,
220
- borderWidth,
221
- bloomGradient: bloomBeam,
222
- brightness,
223
- saturation,
224
- bloomOpacity: bOp
225
- }) : "";
226
- return `
216
+ const { id, borderRadius, borderWidth, duration, strokeOpacity, innerOpacity, bloomOpacity, innerShadow, colorVariant, staticColors, brightness, saturation, hueRange, theme, colors, bloom } = o;
217
+ const innerR = Math.max(0, borderRadius - borderWidth);
218
+ const scale = colorVariant === "mono" ? .5 : 1;
219
+ const sOp = strokeOpacity * scale;
220
+ const iOp = innerOpacity * scale;
221
+ const bOp = bloomOpacity * scale;
222
+ const hue = hueShift(id, staticColors, hueRange, brightness, saturation);
223
+ const dark = theme === "dark";
224
+ const strokeBeam = dark ? `conic-gradient(from var(--beam-angle-${id}), transparent 0%, transparent 54%, rgba(255, 255, 255, 0.1) 57%, rgba(255, 255, 255, 0.3) 60%, rgba(255, 255, 255, 0.6) 63%, rgba(255, 255, 255, 0.75) 66%, rgba(255, 255, 255, 0.6) 69%, rgba(255, 255, 255, 0.3) 72%, rgba(255, 255, 255, 0.1) 75%, transparent 78%, transparent 100%)` : `conic-gradient(from var(--beam-angle-${id}), transparent 0%, transparent 54%, rgba(0, 0, 0, 0.08) 57%, rgba(0, 0, 0, 0.2) 60%, rgba(0, 0, 0, 0.4) 63%, rgba(0, 0, 0, 0.55) 66%, rgba(0, 0, 0, 0.4) 69%, rgba(0, 0, 0, 0.2) 72%, rgba(0, 0, 0, 0.08) 75%, transparent 78%, transparent 100%)`;
225
+ const border = mdBorderGradient(colorVariant, colors);
226
+ const inner = mdInnerGradient(colorVariant, colors);
227
+ const bloomBeam = dark ? `conic-gradient(from var(--beam-angle-${id}), transparent 0%, transparent 58%, rgba(255, 255, 255, 0.03) 62%, rgba(255, 255, 255, 0.08) 65%, rgba(255, 255, 255, 0.2) 67%, rgba(255, 255, 255, 0.45) 69%, rgba(255, 255, 255, 0.85) 70%, rgba(255, 255, 255, 0.85) 70.5%, rgba(255, 255, 255, 0.45) 71.5%, rgba(255, 255, 255, 0.2) 73%, rgba(255, 255, 255, 0.08) 75%, rgba(255, 255, 255, 0.03) 78%, transparent 82%)` : `conic-gradient(from var(--beam-angle-${id}), transparent 0%, transparent 58%, rgba(0, 0, 0, 0.02) 62%, rgba(0, 0, 0, 0.08) 65%, rgba(0, 0, 0, 0.2) 67%, rgba(0, 0, 0, 0.4) 69%, rgba(0, 0, 0, 0.6) 70%, rgba(0, 0, 0, 0.6) 70.5%, rgba(0, 0, 0, 0.4) 71.5%, rgba(0, 0, 0, 0.2) 73%, rgba(0, 0, 0, 0.08) 75%, rgba(0, 0, 0, 0.02) 78%, transparent 82%)`;
228
+ const conicMask = `conic-gradient(from var(--beam-angle-${id}), transparent 0%, transparent 30%, rgba(255, 255, 255, 0.1) 36%, rgba(255, 255, 255, 0.35) 44%, white 52%, white 80%, rgba(255, 255, 255, 0.35) 86%, rgba(255, 255, 255, 0.1) 92%, transparent 95%, transparent 100%)`;
229
+ const bloomCss = bloom ? bloomBlock({
230
+ id,
231
+ borderRadius,
232
+ innerR,
233
+ borderWidth,
234
+ bloomGradient: bloomBeam,
235
+ brightness,
236
+ saturation,
237
+ bloomOpacity: bOp
238
+ }) : "";
239
+ return `
227
240
  ${spinHeader(id, borderRadius, duration)}
228
241
  [data-beam="${id}"][data-active]::after,
229
242
  [data-beam="${id}"][data-fading]::after {
@@ -262,13 +275,14 @@ ${commonHostRules(id)}
262
275
  `;
263
276
  }
264
277
  function generateLineCss(o) {
265
- const { id, borderRadius, borderWidth, duration, strokeOpacity, innerOpacity, bloomOpacity, innerShadow, colorVariant, staticColors, brightness, saturation, hueRange, theme, colors, bloom } = o;
266
- const innerR = Math.max(0, borderRadius - borderWidth);
267
- const dark = theme === "dark";
268
- const grade = `brightness(${brightness.toFixed(2)}) saturate(${saturation.toFixed(2)})`;
269
- const hueAnim = staticColors ? `filter: ${grade};` : `animation: beam-hue-shift-${id} 12s ease-in-out infinite;`;
270
- const bloomAnim = staticColors ? `filter: blur(8px) ${grade};` : `animation: beam-hue-shift-bloom-${id} 8s ease-in-out infinite;`;
271
- const hueKeyframes = staticColors ? "" : `
278
+ const { id, borderRadius, borderWidth, duration, strokeOpacity, innerOpacity, bloomOpacity, innerShadow, colorVariant, staticColors, brightness, saturation, hueRange, theme, colors, bloom } = o;
279
+ const innerR = Math.max(0, borderRadius - borderWidth);
280
+ const dark = theme === "dark";
281
+ const grade = `brightness(${brightness.toFixed(2)}) saturate(${saturation.toFixed(2)})`;
282
+ // The bloom's blur lives in its filter, so a static beam has to state it too.
283
+ const hueAnim = staticColors ? `filter: ${grade};` : `animation: beam-hue-shift-${id} 12s ease-in-out infinite;`;
284
+ const bloomAnim = staticColors ? `filter: blur(8px) ${grade};` : `animation: beam-hue-shift-bloom-${id} 8s ease-in-out infinite;`;
285
+ const hueKeyframes = staticColors ? "" : `
272
286
  @keyframes beam-hue-shift-${id} {
273
287
  0% { filter: hue-rotate(-${hueRange}deg) brightness(${brightness.toFixed(2)}) saturate(${saturation.toFixed(2)}); }
274
288
  50% { filter: hue-rotate(${hueRange}deg) brightness(${brightness.toFixed(2)}) saturate(${saturation.toFixed(2)}); }
@@ -280,11 +294,11 @@ function generateLineCss(o) {
280
294
  50% { filter: blur(8px) hue-rotate(${hueRange + 10}deg) brightness(${brightness.toFixed(2)}) saturate(${saturation.toFixed(2)}); }
281
295
  100% { filter: blur(8px) hue-rotate(-${hueRange + 10}deg) brightness(${brightness.toFixed(2)}) saturate(${saturation.toFixed(2)}); }
282
296
  }`;
283
- const highlight = dark ? `radial-gradient(ellipse calc(24px * var(--beam-w-${id})) calc(28px * var(--beam-h-${id})) at calc(var(--beam-x-${id}) * 100%) calc(100% + 2px), rgba(255, 255, 255, 0.38) 0%, rgba(255, 255, 255, 0.12) 30%, transparent 65%)` : `radial-gradient(ellipse calc(35px * var(--beam-w-${id})) calc(28px * var(--beam-h-${id})) at calc(var(--beam-x-${id}) * 100%) calc(100% + 2px), rgba(0, 0, 0, 0.6) 0%, rgba(0, 0, 0, 0.25) 35%, transparent 70%)`;
284
- const border = lineBorderGradient(colorVariant, dark, id, colors);
285
- const inner = lineInnerGradient(colorVariant, id, colors);
286
- const bloomGrad = lineBloomGradient(colorVariant, dark, id, colors);
287
- return `
297
+ const highlight = dark ? `radial-gradient(ellipse calc(24px * var(--beam-w-${id})) calc(28px * var(--beam-h-${id})) at calc(var(--beam-x-${id}) * 100%) calc(100% + 2px), rgba(255, 255, 255, 0.38) 0%, rgba(255, 255, 255, 0.12) 30%, transparent 65%)` : `radial-gradient(ellipse calc(35px * var(--beam-w-${id})) calc(28px * var(--beam-h-${id})) at calc(var(--beam-x-${id}) * 100%) calc(100% + 2px), rgba(0, 0, 0, 0.6) 0%, rgba(0, 0, 0, 0.25) 35%, transparent 70%)`;
298
+ const border = lineBorderGradient(colorVariant, dark, id, colors);
299
+ const inner = lineInnerGradient(colorVariant, id, colors);
300
+ const bloomGrad = lineBloomGradient(colorVariant, dark, id, colors);
301
+ return `
288
302
  @property --beam-x-${id} { syntax: "<number>"; initial-value: 0; inherits: true; }
289
303
  @property --beam-w-${id} { syntax: "<number>"; initial-value: 1; inherits: true; }
290
304
  @property --beam-h-${id} { syntax: "<number>"; initial-value: 1; inherits: true; }