@invergent/ui-sdk 0.0.0-stage → 2.19.1

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 (382) hide show
  1. package/README.md +70 -2
  2. package/dist/accordion.cjs +97 -0
  3. package/dist/accordion.cjs.map +1 -0
  4. package/dist/accordion.d.cts +10 -0
  5. package/dist/accordion.d.ts +10 -0
  6. package/dist/accordion.js +92 -0
  7. package/dist/accordion.js.map +1 -0
  8. package/dist/alert.cjs +82 -0
  9. package/dist/alert.cjs.map +1 -0
  10. package/dist/alert.d.cts +14 -0
  11. package/dist/alert.d.ts +14 -0
  12. package/dist/alert.js +77 -0
  13. package/dist/alert.js.map +1 -0
  14. package/dist/avatar.cjs +110 -0
  15. package/dist/avatar.cjs.map +1 -0
  16. package/dist/avatar.d.cts +14 -0
  17. package/dist/avatar.d.ts +14 -0
  18. package/dist/avatar.js +103 -0
  19. package/dist/avatar.js.map +1 -0
  20. package/dist/badge.cjs +47 -0
  21. package/dist/badge.cjs.map +1 -0
  22. package/dist/badge.d.cts +13 -0
  23. package/dist/badge.d.ts +13 -0
  24. package/dist/badge.js +44 -0
  25. package/dist/badge.js.map +1 -0
  26. package/dist/brand-beam.cjs +2303 -0
  27. package/dist/brand-beam.cjs.map +1 -0
  28. package/dist/brand-beam.d.cts +36 -0
  29. package/dist/brand-beam.d.ts +36 -0
  30. package/dist/brand-beam.js +2301 -0
  31. package/dist/brand-beam.js.map +1 -0
  32. package/dist/button-group.cjs +80 -0
  33. package/dist/button-group.cjs.map +1 -0
  34. package/dist/button-group.d.cts +17 -0
  35. package/dist/button-group.d.ts +17 -0
  36. package/dist/button-group.js +75 -0
  37. package/dist/button-group.js.map +1 -0
  38. package/dist/button.cjs +17 -0
  39. package/dist/button.cjs.map +1 -0
  40. package/dist/button.d.cts +14 -0
  41. package/dist/button.d.ts +14 -0
  42. package/dist/button.js +4 -0
  43. package/dist/button.js.map +1 -0
  44. package/dist/card.cjs +109 -0
  45. package/dist/card.cjs.map +1 -0
  46. package/dist/card.d.cts +14 -0
  47. package/dist/card.d.ts +14 -0
  48. package/dist/card.js +101 -0
  49. package/dist/card.js.map +1 -0
  50. package/dist/chart.cjs +275 -0
  51. package/dist/chart.cjs.map +1 -0
  52. package/dist/chart.d.cts +47 -0
  53. package/dist/chart.d.ts +47 -0
  54. package/dist/chart.js +247 -0
  55. package/dist/chart.js.map +1 -0
  56. package/dist/checkbox.cjs +41 -0
  57. package/dist/checkbox.cjs.map +1 -0
  58. package/dist/checkbox.d.cts +7 -0
  59. package/dist/checkbox.d.ts +7 -0
  60. package/dist/checkbox.js +39 -0
  61. package/dist/checkbox.js.map +1 -0
  62. package/dist/chip.cjs +92 -0
  63. package/dist/chip.cjs.map +1 -0
  64. package/dist/chip.d.cts +33 -0
  65. package/dist/chip.d.ts +33 -0
  66. package/dist/chip.js +86 -0
  67. package/dist/chip.js.map +1 -0
  68. package/dist/choice-card.cjs +127 -0
  69. package/dist/choice-card.cjs.map +1 -0
  70. package/dist/choice-card.d.cts +20 -0
  71. package/dist/choice-card.d.ts +20 -0
  72. package/dist/choice-card.js +124 -0
  73. package/dist/choice-card.js.map +1 -0
  74. package/dist/chunk-2UHRDVPT.cjs +183 -0
  75. package/dist/chunk-2UHRDVPT.cjs.map +1 -0
  76. package/dist/chunk-5CRE35VX.js +20 -0
  77. package/dist/chunk-5CRE35VX.js.map +1 -0
  78. package/dist/chunk-6ARYCL4L.cjs +30 -0
  79. package/dist/chunk-6ARYCL4L.cjs.map +1 -0
  80. package/dist/chunk-6JCVTRUK.js +21 -0
  81. package/dist/chunk-6JCVTRUK.js.map +1 -0
  82. package/dist/chunk-6YHDDRIM.cjs +13 -0
  83. package/dist/chunk-6YHDDRIM.cjs.map +1 -0
  84. package/dist/chunk-A44JJ6NH.js +58 -0
  85. package/dist/chunk-A44JJ6NH.js.map +1 -0
  86. package/dist/chunk-CPAFEXKR.js +63 -0
  87. package/dist/chunk-CPAFEXKR.js.map +1 -0
  88. package/dist/chunk-CTIEUG5L.js +28 -0
  89. package/dist/chunk-CTIEUG5L.js.map +1 -0
  90. package/dist/chunk-DSDDDYG3.cjs +60 -0
  91. package/dist/chunk-DSDDDYG3.cjs.map +1 -0
  92. package/dist/chunk-IB7LTHEQ.js +55 -0
  93. package/dist/chunk-IB7LTHEQ.js.map +1 -0
  94. package/dist/chunk-ID7MWMJO.cjs +162 -0
  95. package/dist/chunk-ID7MWMJO.cjs.map +1 -0
  96. package/dist/chunk-IVMZANP7.cjs +67 -0
  97. package/dist/chunk-IVMZANP7.cjs.map +1 -0
  98. package/dist/chunk-L73QIINW.js +157 -0
  99. package/dist/chunk-L73QIINW.js.map +1 -0
  100. package/dist/chunk-LZGII7SX.js +11 -0
  101. package/dist/chunk-LZGII7SX.js.map +1 -0
  102. package/dist/chunk-M677T75H.js +24 -0
  103. package/dist/chunk-M677T75H.js.map +1 -0
  104. package/dist/chunk-NSK344BJ.js +80 -0
  105. package/dist/chunk-NSK344BJ.js.map +1 -0
  106. package/dist/chunk-OAVCB3MR.cjs +26 -0
  107. package/dist/chunk-OAVCB3MR.cjs.map +1 -0
  108. package/dist/chunk-PH733KDD.js +141 -0
  109. package/dist/chunk-PH733KDD.js.map +1 -0
  110. package/dist/chunk-QEBQ5NUN.cjs +148 -0
  111. package/dist/chunk-QEBQ5NUN.cjs.map +1 -0
  112. package/dist/chunk-RVX6SN4U.cjs +23 -0
  113. package/dist/chunk-RVX6SN4U.cjs.map +1 -0
  114. package/dist/chunk-T74Z3WTK.js +151 -0
  115. package/dist/chunk-T74Z3WTK.js.map +1 -0
  116. package/dist/chunk-UOUXW63J.cjs +22 -0
  117. package/dist/chunk-UOUXW63J.cjs.map +1 -0
  118. package/dist/chunk-UXSDDJXM.cjs +88 -0
  119. package/dist/chunk-UXSDDJXM.cjs.map +1 -0
  120. package/dist/chunk-VBICNC43.cjs +61 -0
  121. package/dist/chunk-VBICNC43.cjs.map +1 -0
  122. package/dist/collapsible-header.cjs +66 -0
  123. package/dist/collapsible-header.cjs.map +1 -0
  124. package/dist/collapsible-header.d.cts +15 -0
  125. package/dist/collapsible-header.d.ts +15 -0
  126. package/dist/collapsible-header.js +63 -0
  127. package/dist/collapsible-header.js.map +1 -0
  128. package/dist/collapsible.cjs +38 -0
  129. package/dist/collapsible.cjs.map +1 -0
  130. package/dist/collapsible.d.cts +8 -0
  131. package/dist/collapsible.d.ts +8 -0
  132. package/dist/collapsible.js +34 -0
  133. package/dist/collapsible.js.map +1 -0
  134. package/dist/color-picker.cjs +60 -0
  135. package/dist/color-picker.cjs.map +1 -0
  136. package/dist/color-picker.d.cts +12 -0
  137. package/dist/color-picker.d.ts +12 -0
  138. package/dist/color-picker.js +57 -0
  139. package/dist/color-picker.js.map +1 -0
  140. package/dist/command.cjs +177 -0
  141. package/dist/command.cjs.map +1 -0
  142. package/dist/command.d.cts +22 -0
  143. package/dist/command.d.ts +22 -0
  144. package/dist/command.js +167 -0
  145. package/dist/command.js.map +1 -0
  146. package/dist/confirm-dialog.cjs +72 -0
  147. package/dist/confirm-dialog.cjs.map +1 -0
  148. package/dist/confirm-dialog.d.cts +19 -0
  149. package/dist/confirm-dialog.d.ts +19 -0
  150. package/dist/confirm-dialog.js +70 -0
  151. package/dist/confirm-dialog.js.map +1 -0
  152. package/dist/control-styles.cjs +16 -0
  153. package/dist/control-styles.cjs.map +1 -0
  154. package/dist/control-styles.d.cts +7 -0
  155. package/dist/control-styles.d.ts +7 -0
  156. package/dist/control-styles.js +10 -0
  157. package/dist/control-styles.js.map +1 -0
  158. package/dist/dialog.cjs +50 -0
  159. package/dist/dialog.cjs.map +1 -0
  160. package/dist/dialog.d.cts +20 -0
  161. package/dist/dialog.d.ts +20 -0
  162. package/dist/dialog.js +5 -0
  163. package/dist/dialog.js.map +1 -0
  164. package/dist/dropdown-menu.cjs +265 -0
  165. package/dist/dropdown-menu.cjs.map +1 -0
  166. package/dist/dropdown-menu.d.cts +32 -0
  167. package/dist/dropdown-menu.d.ts +32 -0
  168. package/dist/dropdown-menu.js +249 -0
  169. package/dist/dropdown-menu.js.map +1 -0
  170. package/dist/empty-state.cjs +50 -0
  171. package/dist/empty-state.cjs.map +1 -0
  172. package/dist/empty-state.d.cts +23 -0
  173. package/dist/empty-state.d.ts +23 -0
  174. package/dist/empty-state.js +47 -0
  175. package/dist/empty-state.js.map +1 -0
  176. package/dist/field.cjs +221 -0
  177. package/dist/field.cjs.map +1 -0
  178. package/dist/field.d.cts +30 -0
  179. package/dist/field.d.ts +30 -0
  180. package/dist/field.js +210 -0
  181. package/dist/field.js.map +1 -0
  182. package/dist/hover-card.cjs +43 -0
  183. package/dist/hover-card.cjs.map +1 -0
  184. package/dist/hover-card.d.cts +9 -0
  185. package/dist/hover-card.d.ts +9 -0
  186. package/dist/hover-card.js +39 -0
  187. package/dist/hover-card.js.map +1 -0
  188. package/dist/input-group.cjs +36 -0
  189. package/dist/input-group.cjs.map +1 -0
  190. package/dist/input-group.d.cts +20 -0
  191. package/dist/input-group.d.ts +20 -0
  192. package/dist/input-group.js +7 -0
  193. package/dist/input-group.js.map +1 -0
  194. package/dist/input.cjs +13 -0
  195. package/dist/input.cjs.map +1 -0
  196. package/dist/input.d.cts +6 -0
  197. package/dist/input.d.ts +6 -0
  198. package/dist/input.js +4 -0
  199. package/dist/input.js.map +1 -0
  200. package/dist/item.cjs +196 -0
  201. package/dist/item.cjs.map +1 -0
  202. package/dist/item.d.cts +28 -0
  203. package/dist/item.d.ts +28 -0
  204. package/dist/item.js +185 -0
  205. package/dist/item.js.map +1 -0
  206. package/dist/label.cjs +13 -0
  207. package/dist/label.cjs.map +1 -0
  208. package/dist/label.d.cts +7 -0
  209. package/dist/label.d.ts +7 -0
  210. package/dist/label.js +4 -0
  211. package/dist/label.js.map +1 -0
  212. package/dist/lib/utils.cjs +12 -0
  213. package/dist/lib/utils.cjs.map +1 -0
  214. package/dist/lib/utils.d.cts +5 -0
  215. package/dist/lib/utils.d.ts +5 -0
  216. package/dist/lib/utils.js +3 -0
  217. package/dist/lib/utils.js.map +1 -0
  218. package/dist/list-row.cjs +188 -0
  219. package/dist/list-row.cjs.map +1 -0
  220. package/dist/list-row.d.cts +51 -0
  221. package/dist/list-row.d.ts +51 -0
  222. package/dist/list-row.js +164 -0
  223. package/dist/list-row.js.map +1 -0
  224. package/dist/pill-tabs.cjs +109 -0
  225. package/dist/pill-tabs.cjs.map +1 -0
  226. package/dist/pill-tabs.d.cts +24 -0
  227. package/dist/pill-tabs.d.ts +24 -0
  228. package/dist/pill-tabs.js +107 -0
  229. package/dist/pill-tabs.js.map +1 -0
  230. package/dist/popover.cjs +37 -0
  231. package/dist/popover.cjs.map +1 -0
  232. package/dist/popover.d.cts +13 -0
  233. package/dist/popover.d.ts +13 -0
  234. package/dist/popover.js +4 -0
  235. package/dist/popover.js.map +1 -0
  236. package/dist/progress-bar.cjs +40 -0
  237. package/dist/progress-bar.cjs.map +1 -0
  238. package/dist/progress-bar.d.cts +12 -0
  239. package/dist/progress-bar.d.ts +12 -0
  240. package/dist/progress-bar.js +38 -0
  241. package/dist/progress-bar.js.map +1 -0
  242. package/dist/rabbit-mark.cjs +30 -0
  243. package/dist/rabbit-mark.cjs.map +1 -0
  244. package/dist/rabbit-mark.d.cts +16 -0
  245. package/dist/rabbit-mark.d.ts +16 -0
  246. package/dist/rabbit-mark.js +26 -0
  247. package/dist/rabbit-mark.js.map +1 -0
  248. package/dist/responsive-panel.cjs +85 -0
  249. package/dist/responsive-panel.cjs.map +1 -0
  250. package/dist/responsive-panel.d.cts +33 -0
  251. package/dist/responsive-panel.d.ts +33 -0
  252. package/dist/responsive-panel.js +83 -0
  253. package/dist/responsive-panel.js.map +1 -0
  254. package/dist/scroll-area.cjs +63 -0
  255. package/dist/scroll-area.cjs.map +1 -0
  256. package/dist/scroll-area.d.cts +8 -0
  257. package/dist/scroll-area.d.ts +8 -0
  258. package/dist/scroll-area.js +60 -0
  259. package/dist/scroll-area.js.map +1 -0
  260. package/dist/section-label.cjs +30 -0
  261. package/dist/section-label.cjs.map +1 -0
  262. package/dist/section-label.d.cts +13 -0
  263. package/dist/section-label.d.ts +13 -0
  264. package/dist/section-label.js +28 -0
  265. package/dist/section-label.js.map +1 -0
  266. package/dist/segmented-control.cjs +75 -0
  267. package/dist/segmented-control.cjs.map +1 -0
  268. package/dist/segmented-control.d.cts +26 -0
  269. package/dist/segmented-control.d.ts +26 -0
  270. package/dist/segmented-control.js +53 -0
  271. package/dist/segmented-control.js.map +1 -0
  272. package/dist/select.cjs +193 -0
  273. package/dist/select.cjs.map +1 -0
  274. package/dist/select.d.cts +18 -0
  275. package/dist/select.d.ts +18 -0
  276. package/dist/select.js +182 -0
  277. package/dist/select.js.map +1 -0
  278. package/dist/separator.cjs +13 -0
  279. package/dist/separator.cjs.map +1 -0
  280. package/dist/separator.d.cts +7 -0
  281. package/dist/separator.d.ts +7 -0
  282. package/dist/separator.js +4 -0
  283. package/dist/separator.js.map +1 -0
  284. package/dist/sidebar.cjs +29 -0
  285. package/dist/sidebar.cjs.map +1 -0
  286. package/dist/sidebar.d.cts +58 -0
  287. package/dist/sidebar.d.ts +58 -0
  288. package/dist/sidebar.js +4 -0
  289. package/dist/sidebar.js.map +1 -0
  290. package/dist/skeleton.cjs +19 -0
  291. package/dist/skeleton.cjs.map +1 -0
  292. package/dist/skeleton.d.cts +5 -0
  293. package/dist/skeleton.d.ts +5 -0
  294. package/dist/skeleton.js +17 -0
  295. package/dist/skeleton.js.map +1 -0
  296. package/dist/sonner.cjs +40 -0
  297. package/dist/sonner.cjs.map +1 -0
  298. package/dist/sonner.d.cts +6 -0
  299. package/dist/sonner.d.ts +6 -0
  300. package/dist/sonner.js +38 -0
  301. package/dist/sonner.js.map +1 -0
  302. package/dist/sparkline.cjs +44 -0
  303. package/dist/sparkline.cjs.map +1 -0
  304. package/dist/sparkline.d.cts +12 -0
  305. package/dist/sparkline.d.ts +12 -0
  306. package/dist/sparkline.js +42 -0
  307. package/dist/sparkline.js.map +1 -0
  308. package/dist/spinner.cjs +13 -0
  309. package/dist/spinner.cjs.map +1 -0
  310. package/dist/spinner.d.cts +5 -0
  311. package/dist/spinner.d.ts +5 -0
  312. package/dist/spinner.js +11 -0
  313. package/dist/spinner.js.map +1 -0
  314. package/dist/stat-card.cjs +65 -0
  315. package/dist/stat-card.cjs.map +1 -0
  316. package/dist/stat-card.d.cts +22 -0
  317. package/dist/stat-card.d.ts +22 -0
  318. package/dist/stat-card.js +61 -0
  319. package/dist/stat-card.js.map +1 -0
  320. package/dist/status-dot.cjs +32 -0
  321. package/dist/status-dot.cjs.map +1 -0
  322. package/dist/status-dot.d.cts +11 -0
  323. package/dist/status-dot.d.ts +11 -0
  324. package/dist/status-dot.js +29 -0
  325. package/dist/status-dot.js.map +1 -0
  326. package/dist/switch.cjs +38 -0
  327. package/dist/switch.cjs.map +1 -0
  328. package/dist/switch.d.cts +9 -0
  329. package/dist/switch.d.ts +9 -0
  330. package/dist/switch.js +36 -0
  331. package/dist/switch.js.map +1 -0
  332. package/dist/table.cjs +118 -0
  333. package/dist/table.cjs.map +1 -0
  334. package/dist/table.d.cts +13 -0
  335. package/dist/table.d.ts +13 -0
  336. package/dist/table.js +109 -0
  337. package/dist/table.js.map +1 -0
  338. package/dist/tabs.cjs +124 -0
  339. package/dist/tabs.cjs.map +1 -0
  340. package/dist/tabs.d.cts +15 -0
  341. package/dist/tabs.d.ts +15 -0
  342. package/dist/tabs.js +118 -0
  343. package/dist/tabs.js.map +1 -0
  344. package/dist/text-link.cjs +51 -0
  345. package/dist/text-link.cjs.map +1 -0
  346. package/dist/text-link.d.cts +15 -0
  347. package/dist/text-link.d.ts +15 -0
  348. package/dist/text-link.js +48 -0
  349. package/dist/text-link.js.map +1 -0
  350. package/dist/textarea.cjs +13 -0
  351. package/dist/textarea.cjs.map +1 -0
  352. package/dist/textarea.d.cts +6 -0
  353. package/dist/textarea.d.ts +6 -0
  354. package/dist/textarea.js +4 -0
  355. package/dist/textarea.js.map +1 -0
  356. package/dist/theme.css +109 -0
  357. package/dist/timeline.cjs +171 -0
  358. package/dist/timeline.cjs.map +1 -0
  359. package/dist/timeline.d.cts +28 -0
  360. package/dist/timeline.d.ts +28 -0
  361. package/dist/timeline.js +162 -0
  362. package/dist/timeline.js.map +1 -0
  363. package/dist/toggle-group.cjs +155 -0
  364. package/dist/toggle-group.cjs.map +1 -0
  365. package/dist/toggle-group.d.cts +31 -0
  366. package/dist/toggle-group.d.ts +31 -0
  367. package/dist/toggle-group.js +130 -0
  368. package/dist/toggle-group.js.map +1 -0
  369. package/dist/toggle.cjs +21 -0
  370. package/dist/toggle.cjs.map +1 -0
  371. package/dist/toggle.d.cts +23 -0
  372. package/dist/toggle.d.ts +23 -0
  373. package/dist/toggle.js +4 -0
  374. package/dist/toggle.js.map +1 -0
  375. package/dist/tokens.css +77 -0
  376. package/dist/tooltip.cjs +25 -0
  377. package/dist/tooltip.cjs.map +1 -0
  378. package/dist/tooltip.d.cts +10 -0
  379. package/dist/tooltip.d.ts +10 -0
  380. package/dist/tooltip.js +4 -0
  381. package/dist/tooltip.js.map +1 -0
  382. package/package.json +61 -4
@@ -0,0 +1,2301 @@
1
+ import { forwardRef, useId, useRef, useState, useEffect, useCallback, useMemo, useSyncExternalStore } from 'react';
2
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
3
+
4
+ // src/brand-beam.tsx
5
+
6
+ // src/border-beam/styles.ts
7
+ var sizePresets = {
8
+ sm: {
9
+ borderRadius: 32,
10
+ borderWidth: 1,
11
+ width: 70,
12
+ height: 36
13
+ },
14
+ md: {
15
+ borderRadius: 16,
16
+ borderWidth: 1
17
+ },
18
+ line: {
19
+ borderRadius: 16,
20
+ borderWidth: 1
21
+ },
22
+ "pulse-outside": {
23
+ borderRadius: 16,
24
+ borderWidth: 1
25
+ },
26
+ "pulse-inner": {
27
+ borderRadius: 16,
28
+ borderWidth: 1
29
+ }
30
+ };
31
+ var sizeThemePresets = {
32
+ sm: {
33
+ dark: {
34
+ strokeOpacity: 0.46,
35
+ innerOpacity: 0.24,
36
+ bloomOpacity: 0.38,
37
+ innerShadow: "rgba(255, 255, 255, 0.3)",
38
+ saturation: 1.2
39
+ },
40
+ light: {
41
+ strokeOpacity: 0.12,
42
+ innerOpacity: 0.3,
43
+ bloomOpacity: 0.16,
44
+ innerShadow: "rgba(0, 0, 0, 0.14)",
45
+ saturation: 1.8
46
+ }
47
+ },
48
+ md: {
49
+ dark: {
50
+ strokeOpacity: 0.26,
51
+ innerOpacity: 0.42,
52
+ bloomOpacity: 0.24,
53
+ innerShadow: "rgba(255, 255, 255, 0.27)",
54
+ saturation: 1.2
55
+ },
56
+ light: {
57
+ strokeOpacity: 0.12,
58
+ innerOpacity: 0.26,
59
+ bloomOpacity: 0.34,
60
+ innerShadow: "rgba(0, 0, 0, 0.14)",
61
+ saturation: 1.5
62
+ }
63
+ },
64
+ line: {
65
+ dark: {
66
+ strokeOpacity: 1.14,
67
+ innerOpacity: 0.7,
68
+ bloomOpacity: 0.8,
69
+ innerShadow: "rgba(255, 255, 255, 0.1)",
70
+ saturation: 1.2
71
+ },
72
+ light: {
73
+ strokeOpacity: 0.16,
74
+ innerOpacity: 0.32,
75
+ bloomOpacity: 0.3,
76
+ innerShadow: "rgba(0, 0, 0, 0.14)",
77
+ saturation: 1.95
78
+ }
79
+ },
80
+ // Pulse Outside — outward-blooming breathe (ported from v5 "Breathe Outside Uncropped" / c6)
81
+ "pulse-outside": {
82
+ dark: {
83
+ strokeOpacity: 0.94,
84
+ innerOpacity: 0.34,
85
+ bloomOpacity: 0.3,
86
+ innerShadow: "transparent",
87
+ saturation: 1.2,
88
+ brightness: 1.9,
89
+ // v5 Card 5 frames the card with a single 1px hairline (its box-shadow at
90
+ // 0.3). Wrapped components here already supply their own ~equivalent 1px
91
+ // border, so the beam must NOT add a second hairline on top or the edge
92
+ // reads brighter than v5. Kept at 0 to match v5's single-hairline look.
93
+ hairlineOpacity: 0
94
+ },
95
+ light: {
96
+ strokeOpacity: 1.96,
97
+ innerOpacity: 1.04,
98
+ bloomOpacity: 0.42,
99
+ innerShadow: "transparent",
100
+ saturation: 0.6,
101
+ brightness: 1.7,
102
+ hairlineOpacity: 0
103
+ }
104
+ },
105
+ // Pulse Inner — contained breathe (ported from v5 "Breathe" / c4)
106
+ "pulse-inner": {
107
+ dark: {
108
+ strokeOpacity: 1.54,
109
+ innerOpacity: 0.44,
110
+ bloomOpacity: 0.66,
111
+ innerShadow: "transparent",
112
+ saturation: 1.2,
113
+ brightness: 0.75
114
+ },
115
+ light: {
116
+ strokeOpacity: 0.32,
117
+ innerOpacity: 0.4,
118
+ bloomOpacity: 0.8,
119
+ innerShadow: "transparent",
120
+ saturation: 0.75,
121
+ brightness: 1.3
122
+ }
123
+ }
124
+ };
125
+ var colorPalettes = {
126
+ colorful: {
127
+ border: [
128
+ { color: "rgb(255, 50, 100)", pos: "33% -7.4%", size: "70px 40px" },
129
+ { color: "rgb(40, 140, 255)", pos: "12% -5%", size: "60px 35px" },
130
+ { color: "rgb(50, 200, 80)", pos: "2.1% 68.3%", size: "40px 70px" },
131
+ { color: "rgb(30, 185, 170)", pos: "2.1% 68.3%", size: "20px 35px" },
132
+ { color: "rgb(100, 70, 255)", pos: "74.4% 100%", size: "180px 32px" },
133
+ { color: "rgb(40, 140, 255)", pos: "55% 100%", size: "85px 26px" },
134
+ { color: "rgb(255, 120, 40)", pos: "93.9% 0%", size: "74px 32px" },
135
+ { color: "rgb(240, 50, 180)", pos: "100% 27.1%", size: "26px 42px" },
136
+ { color: "rgb(180, 40, 240)", pos: "100% 27.1%", size: "52px 48px" }
137
+ ],
138
+ spike: { primary: "rgb(255, 60, 80)", secondary: "rgba(40, 190, 180, 0.98)" },
139
+ spikeLt: { primary: "rgb(200, 30, 60)", secondary: "rgb(20, 150, 140)" }
140
+ },
141
+ mono: {
142
+ border: [
143
+ { color: "rgb(180, 180, 180)", pos: "33% -7.4%", size: "70px 40px" },
144
+ { color: "rgb(140, 140, 140)", pos: "12% -5%", size: "60px 35px" },
145
+ { color: "rgb(160, 160, 160)", pos: "2.1% 68.3%", size: "40px 70px" },
146
+ { color: "rgb(130, 130, 130)", pos: "2.1% 68.3%", size: "20px 35px" },
147
+ { color: "rgb(170, 170, 170)", pos: "74.4% 100%", size: "180px 32px" },
148
+ { color: "rgb(150, 150, 150)", pos: "55% 100%", size: "85px 26px" },
149
+ { color: "rgb(190, 190, 190)", pos: "93.9% 0%", size: "74px 32px" },
150
+ { color: "rgb(145, 145, 145)", pos: "100% 27.1%", size: "26px 42px" },
151
+ { color: "rgb(165, 165, 165)", pos: "100% 27.1%", size: "52px 48px" }
152
+ ],
153
+ spike: { primary: "rgb(200, 200, 200)", secondary: "rgb(170, 170, 170)" },
154
+ spikeLt: { primary: "rgb(80, 80, 80)", secondary: "rgb(120, 120, 120)" }
155
+ },
156
+ ocean: {
157
+ border: [
158
+ { color: "rgb(100, 80, 220)", pos: "33% -7.4%", size: "70px 40px" },
159
+ { color: "rgb(60, 120, 255)", pos: "12% -5%", size: "60px 35px" },
160
+ { color: "rgb(80, 100, 200)", pos: "2.1% 68.3%", size: "40px 70px" },
161
+ { color: "rgb(50, 140, 220)", pos: "2.1% 68.3%", size: "20px 35px" },
162
+ { color: "rgb(120, 80, 255)", pos: "74.4% 100%", size: "180px 32px" },
163
+ { color: "rgb(70, 130, 255)", pos: "55% 100%", size: "85px 26px" },
164
+ { color: "rgb(140, 100, 240)", pos: "93.9% 0%", size: "74px 32px" },
165
+ { color: "rgb(90, 110, 230)", pos: "100% 27.1%", size: "26px 42px" },
166
+ { color: "rgb(130, 70, 255)", pos: "100% 27.1%", size: "52px 48px" }
167
+ ],
168
+ spike: { primary: "rgb(100, 120, 255)", secondary: "rgba(130, 100, 220, 0.98)" },
169
+ spikeLt: { primary: "rgb(60, 60, 180)", secondary: "rgb(80, 100, 200)" }
170
+ },
171
+ sunset: {
172
+ border: [
173
+ { color: "rgb(255, 80, 50)", pos: "33% -7.4%", size: "70px 40px" },
174
+ { color: "rgb(255, 160, 40)", pos: "12% -5%", size: "60px 35px" },
175
+ { color: "rgb(255, 120, 60)", pos: "2.1% 68.3%", size: "40px 70px" },
176
+ { color: "rgb(255, 200, 50)", pos: "2.1% 68.3%", size: "20px 35px" },
177
+ { color: "rgb(255, 100, 80)", pos: "74.4% 100%", size: "180px 32px" },
178
+ { color: "rgb(255, 180, 60)", pos: "55% 100%", size: "85px 26px" },
179
+ { color: "rgb(255, 60, 60)", pos: "93.9% 0%", size: "74px 32px" },
180
+ { color: "rgb(255, 140, 50)", pos: "100% 27.1%", size: "26px 42px" },
181
+ { color: "rgb(255, 90, 70)", pos: "100% 27.1%", size: "52px 48px" }
182
+ ],
183
+ spike: { primary: "rgb(255, 140, 80)", secondary: "rgba(255, 100, 60, 0.98)" },
184
+ spikeLt: { primary: "rgb(200, 80, 40)", secondary: "rgb(220, 120, 30)" }
185
+ },
186
+ brand: {
187
+ border: [
188
+ { color: "rgb(217, 119, 6)", pos: "33% -7.4%", size: "70px 40px" },
189
+ { color: "rgb(245, 158, 11)", pos: "12% -5%", size: "60px 35px" },
190
+ { color: "rgb(234, 138, 9)", pos: "2.1% 68.3%", size: "40px 70px" },
191
+ { color: "rgb(252, 211, 77)", pos: "2.1% 68.3%", size: "20px 35px" },
192
+ { color: "rgb(245, 158, 11)", pos: "74.4% 100%", size: "180px 32px" },
193
+ { color: "rgb(251, 191, 36)", pos: "55% 100%", size: "85px 26px" },
194
+ { color: "rgb(217, 119, 6)", pos: "93.9% 0%", size: "74px 32px" },
195
+ { color: "rgb(251, 191, 36)", pos: "100% 27.1%", size: "26px 42px" },
196
+ { color: "rgb(245, 158, 11)", pos: "100% 27.1%", size: "52px 48px" }
197
+ ],
198
+ spike: { primary: "rgb(251, 191, 36)", secondary: "rgba(245, 158, 11, 0.98)" },
199
+ spikeLt: { primary: "rgb(180, 83, 9)", secondary: "rgb(202, 138, 4)" }
200
+ }
201
+ };
202
+ var smallColorPalettes = {
203
+ colorful: {
204
+ border: [
205
+ { color: "rgb(50, 200, 80)", pos: "2% 68%", size: "9px 18px" },
206
+ { color: "rgb(30, 185, 170)", pos: "2% 68%", size: "4px 8px" },
207
+ { color: "rgb(255, 120, 40)", pos: "72% -3%", size: "59px 9px" },
208
+ { color: "rgb(100, 70, 255)", pos: "74% 100%", size: "42px 7px" },
209
+ { color: "rgb(240, 50, 180)", pos: "100% 27%", size: "10px 17px" },
210
+ { color: "rgb(180, 40, 240)", pos: "100% 27%", size: "10px 18px" },
211
+ { color: "rgb(40, 140, 255)", pos: "100% 27%", size: "5px 10px" },
212
+ { color: "rgb(255, 50, 100)", pos: "100% 27%", size: "11px 12px" }
213
+ ],
214
+ inner: [
215
+ { color: "rgba(50, 200, 80, 0.5)", pos: "2% 68%", size: "9px 18px" },
216
+ { color: "rgba(30, 185, 170, 0.45)", pos: "2% 68%", size: "4px 8px" },
217
+ { color: "rgba(255, 120, 40, 0.35)", pos: "72% -3%", size: "59px 9px" },
218
+ { color: "rgba(100, 70, 255, 0.35)", pos: "74% 100%", size: "42px 7px" },
219
+ { color: "rgba(240, 50, 180, 0.3)", pos: "100% 27%", size: "10px 17px" },
220
+ { color: "rgba(180, 40, 240, 0.4)", pos: "100% 27%", size: "10px 18px" },
221
+ { color: "rgba(40, 140, 255, 0.3)", pos: "100% 27%", size: "5px 10px" },
222
+ { color: "rgba(255, 50, 100, 0.3)", pos: "100% 27%", size: "11px 12px" }
223
+ ]
224
+ },
225
+ mono: {
226
+ border: [
227
+ { color: "rgb(160, 160, 160)", pos: "2% 68%", size: "9px 18px" },
228
+ { color: "rgb(140, 140, 140)", pos: "2% 68%", size: "4px 8px" },
229
+ { color: "rgb(180, 180, 180)", pos: "72% -3%", size: "59px 9px" },
230
+ { color: "rgb(150, 150, 150)", pos: "74% 100%", size: "42px 7px" },
231
+ { color: "rgb(170, 170, 170)", pos: "100% 27%", size: "10px 17px" },
232
+ { color: "rgb(155, 155, 155)", pos: "100% 27%", size: "10px 18px" },
233
+ { color: "rgb(145, 145, 145)", pos: "100% 27%", size: "5px 10px" },
234
+ { color: "rgb(165, 165, 165)", pos: "100% 27%", size: "11px 12px" }
235
+ ],
236
+ inner: [
237
+ { color: "rgba(160, 160, 160, 0.25)", pos: "2% 68%", size: "9px 18px" },
238
+ { color: "rgba(140, 140, 140, 0.22)", pos: "2% 68%", size: "4px 8px" },
239
+ { color: "rgba(180, 180, 180, 0.17)", pos: "72% -3%", size: "59px 9px" },
240
+ { color: "rgba(150, 150, 150, 0.17)", pos: "74% 100%", size: "42px 7px" },
241
+ { color: "rgba(170, 170, 170, 0.15)", pos: "100% 27%", size: "10px 17px" },
242
+ { color: "rgba(155, 155, 155, 0.20)", pos: "100% 27%", size: "10px 18px" },
243
+ { color: "rgba(145, 145, 145, 0.15)", pos: "100% 27%", size: "5px 10px" },
244
+ { color: "rgba(165, 165, 165, 0.15)", pos: "100% 27%", size: "11px 12px" }
245
+ ]
246
+ },
247
+ ocean: {
248
+ border: [
249
+ { color: "rgb(60, 140, 200)", pos: "2% 68%", size: "9px 18px" },
250
+ { color: "rgb(50, 120, 180)", pos: "2% 68%", size: "4px 8px" },
251
+ { color: "rgb(100, 80, 220)", pos: "72% -3%", size: "59px 9px" },
252
+ { color: "rgb(80, 100, 255)", pos: "74% 100%", size: "42px 7px" },
253
+ { color: "rgb(120, 70, 240)", pos: "100% 27%", size: "10px 17px" },
254
+ { color: "rgb(90, 80, 220)", pos: "100% 27%", size: "10px 18px" },
255
+ { color: "rgb(70, 110, 255)", pos: "100% 27%", size: "5px 10px" },
256
+ { color: "rgb(110, 90, 230)", pos: "100% 27%", size: "11px 12px" }
257
+ ],
258
+ inner: [
259
+ { color: "rgba(60, 140, 200, 0.5)", pos: "2% 68%", size: "9px 18px" },
260
+ { color: "rgba(50, 120, 180, 0.45)", pos: "2% 68%", size: "4px 8px" },
261
+ { color: "rgba(100, 80, 220, 0.35)", pos: "72% -3%", size: "59px 9px" },
262
+ { color: "rgba(80, 100, 255, 0.35)", pos: "74% 100%", size: "42px 7px" },
263
+ { color: "rgba(120, 70, 240, 0.3)", pos: "100% 27%", size: "10px 17px" },
264
+ { color: "rgba(90, 80, 220, 0.4)", pos: "100% 27%", size: "10px 18px" },
265
+ { color: "rgba(70, 110, 255, 0.3)", pos: "100% 27%", size: "5px 10px" },
266
+ { color: "rgba(110, 90, 230, 0.3)", pos: "100% 27%", size: "11px 12px" }
267
+ ]
268
+ },
269
+ sunset: {
270
+ border: [
271
+ { color: "rgb(255, 180, 50)", pos: "2% 68%", size: "9px 18px" },
272
+ { color: "rgb(255, 150, 40)", pos: "2% 68%", size: "4px 8px" },
273
+ { color: "rgb(255, 80, 60)", pos: "72% -3%", size: "59px 9px" },
274
+ { color: "rgb(255, 100, 80)", pos: "74% 100%", size: "42px 7px" },
275
+ { color: "rgb(255, 60, 80)", pos: "100% 27%", size: "10px 17px" },
276
+ { color: "rgb(255, 120, 60)", pos: "100% 27%", size: "10px 18px" },
277
+ { color: "rgb(255, 200, 50)", pos: "100% 27%", size: "5px 10px" },
278
+ { color: "rgb(255, 90, 70)", pos: "100% 27%", size: "11px 12px" }
279
+ ],
280
+ inner: [
281
+ { color: "rgba(255, 180, 50, 0.5)", pos: "2% 68%", size: "9px 18px" },
282
+ { color: "rgba(255, 150, 40, 0.45)", pos: "2% 68%", size: "4px 8px" },
283
+ { color: "rgba(255, 80, 60, 0.35)", pos: "72% -3%", size: "59px 9px" },
284
+ { color: "rgba(255, 100, 80, 0.35)", pos: "74% 100%", size: "42px 7px" },
285
+ { color: "rgba(255, 60, 80, 0.3)", pos: "100% 27%", size: "10px 17px" },
286
+ { color: "rgba(255, 120, 60, 0.4)", pos: "100% 27%", size: "10px 18px" },
287
+ { color: "rgba(255, 200, 50, 0.3)", pos: "100% 27%", size: "5px 10px" },
288
+ { color: "rgba(255, 90, 70, 0.3)", pos: "100% 27%", size: "11px 12px" }
289
+ ]
290
+ },
291
+ brand: {
292
+ border: [
293
+ { color: "rgb(251, 191, 36)", pos: "2% 68%", size: "9px 18px" },
294
+ { color: "rgb(245, 158, 11)", pos: "2% 68%", size: "4px 8px" },
295
+ { color: "rgb(217, 119, 6)", pos: "72% -3%", size: "59px 9px" },
296
+ { color: "rgb(245, 158, 11)", pos: "74% 100%", size: "42px 7px" },
297
+ { color: "rgb(217, 119, 6)", pos: "100% 27%", size: "10px 17px" },
298
+ { color: "rgb(245, 158, 11)", pos: "100% 27%", size: "10px 18px" },
299
+ { color: "rgb(252, 211, 77)", pos: "100% 27%", size: "5px 10px" },
300
+ { color: "rgb(251, 191, 36)", pos: "100% 27%", size: "11px 12px" }
301
+ ],
302
+ inner: [
303
+ { color: "rgba(251, 191, 36, 0.5)", pos: "2% 68%", size: "9px 18px" },
304
+ { color: "rgba(245, 158, 11, 0.45)", pos: "2% 68%", size: "4px 8px" },
305
+ { color: "rgba(217, 119, 6, 0.35)", pos: "72% -3%", size: "59px 9px" },
306
+ { color: "rgba(245, 158, 11, 0.35)", pos: "74% 100%", size: "42px 7px" },
307
+ { color: "rgba(217, 119, 6, 0.3)", pos: "100% 27%", size: "10px 17px" },
308
+ { color: "rgba(245, 158, 11, 0.4)", pos: "100% 27%", size: "10px 18px" },
309
+ { color: "rgba(252, 211, 77, 0.3)", pos: "100% 27%", size: "5px 10px" },
310
+ { color: "rgba(251, 191, 36, 0.3)", pos: "100% 27%", size: "11px 12px" }
311
+ ]
312
+ }
313
+ };
314
+ function getSmallColorGradients(colorVariant) {
315
+ const palette = smallColorPalettes[colorVariant];
316
+ return palette.border.map((c) => `radial-gradient(ellipse ${c.size} at ${c.pos}, ${c.color}, transparent)`).join(",\n ");
317
+ }
318
+ function getSmallInnerGradients(colorVariant) {
319
+ const palette = smallColorPalettes[colorVariant];
320
+ return palette.inner.map((c) => `radial-gradient(ellipse ${c.size} at ${c.pos}, ${c.color}, transparent)`).join(",\n ");
321
+ }
322
+ function getColorGradients(colorVariant) {
323
+ const palette = colorPalettes[colorVariant];
324
+ return palette.border.map((c) => `radial-gradient(ellipse ${c.size} at ${c.pos}, ${c.color}, transparent)`).join(",\n ");
325
+ }
326
+ function getInnerGradients(colorVariant) {
327
+ const palette = colorPalettes[colorVariant];
328
+ const baseOpacity = colorVariant === "mono" ? 0.225 : 0.45;
329
+ return palette.border.map((c) => {
330
+ const rgba = c.color.replace("rgb(", "rgba(").replace(")", `, ${baseOpacity})`);
331
+ const smallerSize = c.size.split(" ").map((s) => {
332
+ const val = parseInt(s);
333
+ return `${Math.round(val * 0.9)}px`;
334
+ }).join(" ");
335
+ return `radial-gradient(ellipse ${smallerSize} at ${c.pos}, ${rgba}, transparent)`;
336
+ }).join(",\n ");
337
+ }
338
+ function getSpikeColors(colorVariant, isDark) {
339
+ const palette = colorPalettes[colorVariant];
340
+ return isDark ? palette.spike : palette.spikeLt;
341
+ }
342
+ var lineColorPalettes = {
343
+ colorful: {
344
+ dark: [
345
+ { color: "rgb(255, 50, 100)", sizeW: 36, sizeH: 36, offsetX: 0, offsetY: 2 },
346
+ { color: "rgb(40, 180, 220)", sizeW: 30, sizeH: 32, offsetX: 39, offsetY: 0 },
347
+ { color: "rgb(50, 200, 80)", sizeW: 33, sizeH: 28, offsetX: -36, offsetY: 2 },
348
+ { color: "rgb(180, 40, 240)", sizeW: 29, sizeH: 34, offsetX: -54, offsetY: 0 },
349
+ { color: "rgb(255, 160, 30)", sizeW: 27, sizeH: 30, offsetX: 51, offsetY: -1 },
350
+ { color: "rgb(100, 70, 255)", sizeW: 36, sizeH: 24, offsetX: 21, offsetY: 1 },
351
+ { color: "rgb(40, 140, 255)", sizeW: 30, sizeH: 22, offsetX: -21, offsetY: 0 },
352
+ { color: "rgb(240, 50, 180)", sizeW: 25, sizeH: 28, offsetX: 66, offsetY: 1 },
353
+ { color: "rgb(30, 185, 170)", sizeW: 23, sizeH: 30, offsetX: -66, offsetY: -1 }
354
+ ],
355
+ light: [
356
+ { color: "rgb(255, 50, 100)", sizeW: 45, sizeH: 36, offsetX: 0, offsetY: 2 },
357
+ { color: "rgb(40, 140, 255)", sizeW: 35, sizeH: 32, offsetX: 65, offsetY: 0 },
358
+ { color: "rgb(50, 200, 80)", sizeW: 40, sizeH: 28, offsetX: -60, offsetY: 2 },
359
+ { color: "rgb(180, 40, 240)", sizeW: 35, sizeH: 34, offsetX: -90, offsetY: 0 },
360
+ { color: "rgb(30, 185, 170)", sizeW: 38, sizeH: 30, offsetX: 85, offsetY: -1 },
361
+ { color: "rgb(100, 70, 255)", sizeW: 50, sizeH: 24, offsetX: 35, offsetY: 1 },
362
+ { color: "rgb(40, 140, 255)", sizeW: 40, sizeH: 22, offsetX: -35, offsetY: 0 },
363
+ { color: "rgb(255, 120, 40)", sizeW: 35, sizeH: 28, offsetX: 110, offsetY: 1 },
364
+ { color: "rgb(240, 50, 180)", sizeW: 30, sizeH: 30, offsetX: -110, offsetY: -1 }
365
+ ]
366
+ },
367
+ mono: {
368
+ dark: [
369
+ { color: "rgb(200, 200, 200)", sizeW: 36, sizeH: 36, offsetX: 0, offsetY: 2 },
370
+ { color: "rgb(170, 170, 170)", sizeW: 30, sizeH: 32, offsetX: 39, offsetY: 0 },
371
+ { color: "rgb(155, 155, 155)", sizeW: 33, sizeH: 28, offsetX: -36, offsetY: 2 },
372
+ { color: "rgb(185, 185, 185)", sizeW: 29, sizeH: 34, offsetX: -54, offsetY: 0 },
373
+ { color: "rgb(165, 165, 165)", sizeW: 27, sizeH: 30, offsetX: 51, offsetY: -1 },
374
+ { color: "rgb(180, 180, 180)", sizeW: 36, sizeH: 24, offsetX: 21, offsetY: 1 },
375
+ { color: "rgb(160, 160, 160)", sizeW: 30, sizeH: 22, offsetX: -21, offsetY: 0 },
376
+ { color: "rgb(175, 175, 175)", sizeW: 25, sizeH: 28, offsetX: 66, offsetY: 1 },
377
+ { color: "rgb(190, 190, 190)", sizeW: 23, sizeH: 30, offsetX: -66, offsetY: -1 }
378
+ ],
379
+ light: [
380
+ { color: "rgb(100, 100, 100)", sizeW: 45, sizeH: 36, offsetX: 0, offsetY: 2 },
381
+ { color: "rgb(80, 80, 80)", sizeW: 35, sizeH: 32, offsetX: 65, offsetY: 0 },
382
+ { color: "rgb(90, 90, 90)", sizeW: 40, sizeH: 28, offsetX: -60, offsetY: 2 },
383
+ { color: "rgb(70, 70, 70)", sizeW: 35, sizeH: 34, offsetX: -90, offsetY: 0 },
384
+ { color: "rgb(85, 85, 85)", sizeW: 38, sizeH: 30, offsetX: 85, offsetY: -1 },
385
+ { color: "rgb(95, 95, 95)", sizeW: 50, sizeH: 24, offsetX: 35, offsetY: 1 },
386
+ { color: "rgb(75, 75, 75)", sizeW: 40, sizeH: 22, offsetX: -35, offsetY: 0 },
387
+ { color: "rgb(105, 105, 105)", sizeW: 35, sizeH: 28, offsetX: 110, offsetY: 1 },
388
+ { color: "rgb(65, 65, 65)", sizeW: 30, sizeH: 30, offsetX: -110, offsetY: -1 }
389
+ ]
390
+ },
391
+ ocean: {
392
+ dark: [
393
+ { color: "rgb(100, 80, 220)", sizeW: 36, sizeH: 36, offsetX: 0, offsetY: 2 },
394
+ { color: "rgb(60, 120, 255)", sizeW: 30, sizeH: 32, offsetX: 39, offsetY: 0 },
395
+ { color: "rgb(80, 100, 200)", sizeW: 33, sizeH: 28, offsetX: -36, offsetY: 2 },
396
+ { color: "rgb(130, 70, 255)", sizeW: 29, sizeH: 34, offsetX: -54, offsetY: 0 },
397
+ { color: "rgb(70, 130, 255)", sizeW: 27, sizeH: 30, offsetX: 51, offsetY: -1 },
398
+ { color: "rgb(120, 80, 255)", sizeW: 36, sizeH: 24, offsetX: 21, offsetY: 1 },
399
+ { color: "rgb(90, 110, 230)", sizeW: 30, sizeH: 22, offsetX: -21, offsetY: 0 },
400
+ { color: "rgb(110, 90, 240)", sizeW: 25, sizeH: 28, offsetX: 66, offsetY: 1 },
401
+ { color: "rgb(140, 100, 255)", sizeW: 23, sizeH: 30, offsetX: -66, offsetY: -1 }
402
+ ],
403
+ light: [
404
+ { color: "rgb(80, 60, 200)", sizeW: 45, sizeH: 36, offsetX: 0, offsetY: 2 },
405
+ { color: "rgb(50, 100, 220)", sizeW: 35, sizeH: 32, offsetX: 65, offsetY: 0 },
406
+ { color: "rgb(70, 90, 190)", sizeW: 40, sizeH: 28, offsetX: -60, offsetY: 2 },
407
+ { color: "rgb(110, 60, 220)", sizeW: 35, sizeH: 34, offsetX: -90, offsetY: 0 },
408
+ { color: "rgb(60, 110, 230)", sizeW: 38, sizeH: 30, offsetX: 85, offsetY: -1 },
409
+ { color: "rgb(100, 70, 240)", sizeW: 50, sizeH: 24, offsetX: 35, offsetY: 1 },
410
+ { color: "rgb(80, 100, 210)", sizeW: 40, sizeH: 22, offsetX: -35, offsetY: 0 },
411
+ { color: "rgb(90, 80, 225)", sizeW: 35, sizeH: 28, offsetX: 110, offsetY: 1 },
412
+ { color: "rgb(120, 90, 245)", sizeW: 30, sizeH: 30, offsetX: -110, offsetY: -1 }
413
+ ]
414
+ },
415
+ sunset: {
416
+ dark: [
417
+ { color: "rgb(255, 100, 60)", sizeW: 36, sizeH: 36, offsetX: 0, offsetY: 2 },
418
+ { color: "rgb(255, 180, 50)", sizeW: 30, sizeH: 32, offsetX: 39, offsetY: 0 },
419
+ { color: "rgb(255, 140, 70)", sizeW: 33, sizeH: 28, offsetX: -36, offsetY: 2 },
420
+ { color: "rgb(255, 80, 80)", sizeW: 29, sizeH: 34, offsetX: -54, offsetY: 0 },
421
+ { color: "rgb(255, 200, 60)", sizeW: 27, sizeH: 30, offsetX: 51, offsetY: -1 },
422
+ { color: "rgb(255, 120, 50)", sizeW: 36, sizeH: 24, offsetX: 21, offsetY: 1 },
423
+ { color: "rgb(255, 160, 80)", sizeW: 30, sizeH: 22, offsetX: -21, offsetY: 0 },
424
+ { color: "rgb(255, 90, 60)", sizeW: 25, sizeH: 28, offsetX: 66, offsetY: 1 },
425
+ { color: "rgb(255, 70, 70)", sizeW: 23, sizeH: 30, offsetX: -66, offsetY: -1 }
426
+ ],
427
+ light: [
428
+ { color: "rgb(220, 80, 40)", sizeW: 45, sizeH: 36, offsetX: 0, offsetY: 2 },
429
+ { color: "rgb(230, 150, 30)", sizeW: 35, sizeH: 32, offsetX: 65, offsetY: 0 },
430
+ { color: "rgb(210, 110, 50)", sizeW: 40, sizeH: 28, offsetX: -60, offsetY: 2 },
431
+ { color: "rgb(200, 60, 60)", sizeW: 35, sizeH: 34, offsetX: -90, offsetY: 0 },
432
+ { color: "rgb(220, 170, 40)", sizeW: 38, sizeH: 30, offsetX: 85, offsetY: -1 },
433
+ { color: "rgb(210, 100, 30)", sizeW: 50, sizeH: 24, offsetX: 35, offsetY: 1 },
434
+ { color: "rgb(230, 130, 60)", sizeW: 40, sizeH: 22, offsetX: -35, offsetY: 0 },
435
+ { color: "rgb(190, 70, 50)", sizeW: 35, sizeH: 28, offsetX: 110, offsetY: 1 },
436
+ { color: "rgb(180, 50, 50)", sizeW: 30, sizeH: 30, offsetX: -110, offsetY: -1 }
437
+ ]
438
+ },
439
+ brand: {
440
+ dark: [
441
+ { color: "rgb(245, 158, 11)", sizeW: 36, sizeH: 36, offsetX: 0, offsetY: 2 },
442
+ { color: "rgb(251, 191, 36)", sizeW: 30, sizeH: 32, offsetX: 39, offsetY: 0 },
443
+ { color: "rgb(245, 158, 11)", sizeW: 33, sizeH: 28, offsetX: -36, offsetY: 2 },
444
+ { color: "rgb(217, 119, 6)", sizeW: 29, sizeH: 34, offsetX: -54, offsetY: 0 },
445
+ { color: "rgb(252, 211, 77)", sizeW: 27, sizeH: 30, offsetX: 51, offsetY: -1 },
446
+ { color: "rgb(234, 138, 9)", sizeW: 36, sizeH: 24, offsetX: 21, offsetY: 1 },
447
+ { color: "rgb(251, 191, 36)", sizeW: 30, sizeH: 22, offsetX: -21, offsetY: 0 },
448
+ { color: "rgb(217, 119, 6)", sizeW: 25, sizeH: 28, offsetX: 66, offsetY: 1 },
449
+ { color: "rgb(245, 158, 11)", sizeW: 23, sizeH: 30, offsetX: -66, offsetY: -1 }
450
+ ],
451
+ light: [
452
+ { color: "rgb(180, 83, 9)", sizeW: 45, sizeH: 36, offsetX: 0, offsetY: 2 },
453
+ { color: "rgb(202, 138, 4)", sizeW: 35, sizeH: 32, offsetX: 65, offsetY: 0 },
454
+ { color: "rgb(180, 83, 9)", sizeW: 40, sizeH: 28, offsetX: -60, offsetY: 2 },
455
+ { color: "rgb(146, 64, 14)", sizeW: 35, sizeH: 34, offsetX: -90, offsetY: 0 },
456
+ { color: "rgb(202, 138, 4)", sizeW: 38, sizeH: 30, offsetX: 85, offsetY: -1 },
457
+ { color: "rgb(161, 98, 7)", sizeW: 50, sizeH: 24, offsetX: 35, offsetY: 1 },
458
+ { color: "rgb(202, 138, 4)", sizeW: 40, sizeH: 22, offsetX: -35, offsetY: 0 },
459
+ { color: "rgb(146, 64, 14)", sizeW: 35, sizeH: 28, offsetX: 110, offsetY: 1 },
460
+ { color: "rgb(180, 83, 9)", sizeW: 30, sizeH: 30, offsetX: -110, offsetY: -1 }
461
+ ]
462
+ }
463
+ };
464
+ function getLineColorGradients(colorVariant, isDark, id) {
465
+ const palette = lineColorPalettes[colorVariant][isDark ? "dark" : "light"];
466
+ return palette.map((c) => {
467
+ const offsetXStr = c.offsetX === 0 ? "" : c.offsetX > 0 ? ` + ${c.offsetX}px` : ` - ${Math.abs(c.offsetX)}px`;
468
+ const offsetYStr = c.offsetY === 0 ? "" : c.offsetY > 0 ? ` + ${c.offsetY}px` : ` - ${Math.abs(c.offsetY)}px`;
469
+ return `radial-gradient(ellipse calc(${c.sizeW}px * var(--beam-w-${id})) calc(${c.sizeH}px * var(--beam-h-${id})) at calc(var(--beam-x-${id}) * 100%${offsetXStr}) calc(100%${offsetYStr}), ${c.color}, transparent)`;
470
+ }).join(",\n ");
471
+ }
472
+ var lineInnerGradientData = {
473
+ colorful: [
474
+ { color: "rgba(255, 50, 100, 0.48)", sizeW: 33, sizeH: 30, offsetX: 0, offsetY: 0 },
475
+ { color: "rgba(40, 180, 220, 0.42)", sizeW: 24, sizeH: 26, offsetX: 39, offsetY: -3 },
476
+ { color: "rgba(50, 200, 80, 0.48)", sizeW: 27, sizeH: 24, offsetX: -36, offsetY: 0 },
477
+ { color: "rgba(180, 40, 240, 0.42)", sizeW: 23, sizeH: 28, offsetX: -54, offsetY: -2 },
478
+ { color: "rgba(255, 160, 30, 0.50)", sizeW: 24, sizeH: 24, offsetX: 51, offsetY: -1 },
479
+ { color: "rgba(100, 70, 255, 0.45)", sizeW: 30, sizeH: 20, offsetX: 21, offsetY: 0 },
480
+ { color: "rgba(40, 140, 255, 0.40)", sizeW: 25, sizeH: 18, offsetX: -21, offsetY: -2 },
481
+ { color: "rgba(240, 50, 180, 0.45)", sizeW: 21, sizeH: 24, offsetX: 66, offsetY: 0 },
482
+ { color: "rgba(30, 185, 170, 0.52)", sizeW: 18, sizeH: 26, offsetX: -66, offsetY: -1 }
483
+ ],
484
+ mono: [
485
+ { color: "rgba(200, 200, 200, 0.48)", sizeW: 33, sizeH: 30, offsetX: 0, offsetY: 0 },
486
+ { color: "rgba(170, 170, 170, 0.42)", sizeW: 24, sizeH: 26, offsetX: 39, offsetY: -3 },
487
+ { color: "rgba(155, 155, 155, 0.48)", sizeW: 27, sizeH: 24, offsetX: -36, offsetY: 0 },
488
+ { color: "rgba(185, 185, 185, 0.42)", sizeW: 23, sizeH: 28, offsetX: -54, offsetY: -2 },
489
+ { color: "rgba(165, 165, 165, 0.50)", sizeW: 24, sizeH: 24, offsetX: 51, offsetY: -1 },
490
+ { color: "rgba(180, 180, 180, 0.45)", sizeW: 30, sizeH: 20, offsetX: 21, offsetY: 0 },
491
+ { color: "rgba(160, 160, 160, 0.40)", sizeW: 25, sizeH: 18, offsetX: -21, offsetY: -2 },
492
+ { color: "rgba(175, 175, 175, 0.45)", sizeW: 21, sizeH: 24, offsetX: 66, offsetY: 0 },
493
+ { color: "rgba(190, 190, 190, 0.52)", sizeW: 18, sizeH: 26, offsetX: -66, offsetY: -1 }
494
+ ],
495
+ ocean: [
496
+ { color: "rgba(100, 80, 220, 0.48)", sizeW: 33, sizeH: 30, offsetX: 0, offsetY: 0 },
497
+ { color: "rgba(60, 120, 255, 0.42)", sizeW: 24, sizeH: 26, offsetX: 39, offsetY: -3 },
498
+ { color: "rgba(80, 100, 200, 0.48)", sizeW: 27, sizeH: 24, offsetX: -36, offsetY: 0 },
499
+ { color: "rgba(130, 70, 255, 0.42)", sizeW: 23, sizeH: 28, offsetX: -54, offsetY: -2 },
500
+ { color: "rgba(70, 130, 255, 0.50)", sizeW: 24, sizeH: 24, offsetX: 51, offsetY: -1 },
501
+ { color: "rgba(120, 80, 255, 0.45)", sizeW: 30, sizeH: 20, offsetX: 21, offsetY: 0 },
502
+ { color: "rgba(90, 110, 230, 0.40)", sizeW: 25, sizeH: 18, offsetX: -21, offsetY: -2 },
503
+ { color: "rgba(110, 90, 240, 0.45)", sizeW: 21, sizeH: 24, offsetX: 66, offsetY: 0 },
504
+ { color: "rgba(140, 100, 255, 0.52)", sizeW: 18, sizeH: 26, offsetX: -66, offsetY: -1 }
505
+ ],
506
+ sunset: [
507
+ { color: "rgba(255, 100, 60, 0.48)", sizeW: 33, sizeH: 30, offsetX: 0, offsetY: 0 },
508
+ { color: "rgba(255, 180, 50, 0.42)", sizeW: 24, sizeH: 26, offsetX: 39, offsetY: -3 },
509
+ { color: "rgba(255, 140, 70, 0.48)", sizeW: 27, sizeH: 24, offsetX: -36, offsetY: 0 },
510
+ { color: "rgba(255, 80, 80, 0.42)", sizeW: 23, sizeH: 28, offsetX: -54, offsetY: -2 },
511
+ { color: "rgba(255, 200, 60, 0.50)", sizeW: 24, sizeH: 24, offsetX: 51, offsetY: -1 },
512
+ { color: "rgba(255, 120, 50, 0.45)", sizeW: 30, sizeH: 20, offsetX: 21, offsetY: 0 },
513
+ { color: "rgba(255, 160, 80, 0.40)", sizeW: 25, sizeH: 18, offsetX: -21, offsetY: -2 },
514
+ { color: "rgba(255, 90, 60, 0.45)", sizeW: 21, sizeH: 24, offsetX: 66, offsetY: 0 },
515
+ { color: "rgba(255, 70, 70, 0.52)", sizeW: 18, sizeH: 26, offsetX: -66, offsetY: -1 }
516
+ ],
517
+ brand: [
518
+ { color: "rgba(245, 158, 11, 0.48)", sizeW: 33, sizeH: 30, offsetX: 0, offsetY: 0 },
519
+ { color: "rgba(251, 191, 36, 0.42)", sizeW: 24, sizeH: 26, offsetX: 39, offsetY: -3 },
520
+ { color: "rgba(245, 158, 11, 0.48)", sizeW: 27, sizeH: 24, offsetX: -36, offsetY: 0 },
521
+ { color: "rgba(217, 119, 6, 0.42)", sizeW: 23, sizeH: 28, offsetX: -54, offsetY: -2 },
522
+ { color: "rgba(252, 211, 77, 0.50)", sizeW: 24, sizeH: 24, offsetX: 51, offsetY: -1 },
523
+ { color: "rgba(234, 138, 9, 0.45)", sizeW: 30, sizeH: 20, offsetX: 21, offsetY: 0 },
524
+ { color: "rgba(251, 191, 36, 0.40)", sizeW: 25, sizeH: 18, offsetX: -21, offsetY: -2 },
525
+ { color: "rgba(217, 119, 6, 0.45)", sizeW: 21, sizeH: 24, offsetX: 66, offsetY: 0 },
526
+ { color: "rgba(245, 158, 11, 0.52)", sizeW: 18, sizeH: 26, offsetX: -66, offsetY: -1 }
527
+ ]
528
+ };
529
+ function getLineInnerGradients(colorVariant, id) {
530
+ const data = lineInnerGradientData[colorVariant];
531
+ return data.map((c) => {
532
+ const offsetXStr = c.offsetX === 0 ? "" : c.offsetX > 0 ? ` + ${c.offsetX}px` : ` - ${Math.abs(c.offsetX)}px`;
533
+ const offsetYStr = c.offsetY === 0 ? "" : ` - ${Math.abs(c.offsetY)}px`;
534
+ return `radial-gradient(ellipse calc(${c.sizeW}px * var(--beam-w-${id})) calc(${c.sizeH}px * var(--beam-h-${id})) at calc(var(--beam-x-${id}) * 100%${offsetXStr}) calc(100%${offsetYStr}), ${c.color}, transparent)`;
535
+ }).join(",\n ");
536
+ }
537
+ var lineBloomColors = {
538
+ colorful: {
539
+ dark: {
540
+ spikes: [
541
+ { color1: "rgb(100, 70, 255)", color2: "rgba(100, 70, 255, 1)" },
542
+ // 36%
543
+ { color1: "rgba(255, 170, 40, 0.59)", color2: "rgba(255, 170, 40, 0.29)" },
544
+ // 50%
545
+ { color1: "rgb(50, 200, 100)", color2: "rgba(50, 200, 100, 1)" },
546
+ // 64%
547
+ { color1: "rgba(200, 50, 240, 0.91)", color2: "rgba(200, 50, 240, 0.45)" },
548
+ // 78%
549
+ { color1: "rgb(40, 140, 255)", color2: "rgba(40, 140, 255, 1)" }
550
+ // 92%
551
+ ]
552
+ },
553
+ light: {
554
+ spikes: [
555
+ { color1: "rgb(80, 50, 200)", color2: "rgba(80, 50, 200, 0.8)" },
556
+ // 36%
557
+ { color1: "rgba(210, 130, 0, 0.7)", color2: "rgba(210, 130, 0, 0.46)" },
558
+ // 50%
559
+ { color1: "rgb(30, 160, 70)", color2: "rgba(30, 160, 70, 0.82)" },
560
+ // 64%
561
+ { color1: "rgb(160, 30, 190)", color2: "rgba(160, 30, 190, 0.7)" },
562
+ // 78%
563
+ { color1: "rgb(30, 100, 200)", color2: "rgba(30, 100, 200, 0.78)" }
564
+ // 92%
565
+ ]
566
+ }
567
+ },
568
+ mono: {
569
+ dark: {
570
+ spikes: [
571
+ { color1: "rgb(200, 200, 200)", color2: "rgba(200, 200, 200, 1)" },
572
+ { color1: "rgba(180, 180, 180, 0.59)", color2: "rgba(180, 180, 180, 0.29)" },
573
+ { color1: "rgb(190, 190, 190)", color2: "rgba(190, 190, 190, 1)" },
574
+ { color1: "rgba(170, 170, 170, 0.91)", color2: "rgba(170, 170, 170, 0.45)" },
575
+ { color1: "rgb(185, 185, 185)", color2: "rgba(185, 185, 185, 1)" }
576
+ ]
577
+ },
578
+ light: {
579
+ spikes: [
580
+ { color1: "rgb(80, 80, 80)", color2: "rgba(80, 80, 80, 0.8)" },
581
+ { color1: "rgba(100, 100, 100, 0.7)", color2: "rgba(100, 100, 100, 0.46)" },
582
+ { color1: "rgb(70, 70, 70)", color2: "rgba(70, 70, 70, 0.82)" },
583
+ { color1: "rgb(90, 90, 90)", color2: "rgba(90, 90, 90, 0.7)" },
584
+ { color1: "rgb(85, 85, 85)", color2: "rgba(85, 85, 85, 0.78)" }
585
+ ]
586
+ }
587
+ },
588
+ ocean: {
589
+ dark: {
590
+ spikes: [
591
+ { color1: "rgb(100, 80, 255)", color2: "rgb(100, 80, 255)" },
592
+ { color1: "rgba(80, 130, 220, 0.59)", color2: "rgba(80, 130, 220, 0.29)" },
593
+ { color1: "rgb(60, 100, 255)", color2: "rgb(60, 100, 255)" },
594
+ { color1: "rgba(90, 120, 200, 0.91)", color2: "rgba(90, 120, 200, 0.45)" },
595
+ { color1: "rgb(120, 90, 255)", color2: "rgb(120, 90, 255)" }
596
+ ]
597
+ },
598
+ light: {
599
+ spikes: [
600
+ { color1: "rgb(50, 40, 180)", color2: "rgba(50, 40, 180, 0.8)" },
601
+ { color1: "rgba(40, 80, 200, 0.7)", color2: "rgba(40, 80, 200, 0.46)" },
602
+ { color1: "rgb(30, 50, 190)", color2: "rgba(30, 50, 190, 0.82)" },
603
+ { color1: "rgb(60, 90, 180)", color2: "rgba(60, 90, 180, 0.7)" },
604
+ { color1: "rgb(70, 60, 200)", color2: "rgba(70, 60, 200, 0.78)" }
605
+ ]
606
+ }
607
+ },
608
+ sunset: {
609
+ dark: {
610
+ spikes: [
611
+ { color1: "rgb(255, 100, 80)", color2: "rgb(255, 100, 80)" },
612
+ { color1: "rgba(255, 150, 80, 0.59)", color2: "rgba(255, 150, 80, 0.29)" },
613
+ { color1: "rgb(255, 80, 60)", color2: "rgb(255, 80, 60)" },
614
+ { color1: "rgba(255, 120, 50, 0.91)", color2: "rgba(255, 120, 50, 0.45)" },
615
+ { color1: "rgb(255, 140, 70)", color2: "rgb(255, 140, 70)" }
616
+ ]
617
+ },
618
+ light: {
619
+ spikes: [
620
+ { color1: "rgb(200, 60, 30)", color2: "rgba(200, 60, 30, 0.8)" },
621
+ { color1: "rgba(220, 100, 20, 0.7)", color2: "rgba(220, 100, 20, 0.46)" },
622
+ { color1: "rgb(180, 40, 20)", color2: "rgba(180, 40, 20, 0.82)" },
623
+ { color1: "rgb(210, 80, 10)", color2: "rgba(210, 80, 10, 0.7)" },
624
+ { color1: "rgb(190, 70, 30)", color2: "rgba(190, 70, 30, 0.78)" }
625
+ ]
626
+ }
627
+ },
628
+ brand: {
629
+ dark: {
630
+ spikes: [
631
+ { color1: "rgb(251, 191, 36)", color2: "rgb(251, 191, 36)" },
632
+ { color1: "rgba(245, 158, 11, 0.59)", color2: "rgba(245, 158, 11, 0.29)" },
633
+ { color1: "rgb(217, 119, 6)", color2: "rgb(217, 119, 6)" },
634
+ { color1: "rgba(252, 211, 77, 0.91)", color2: "rgba(252, 211, 77, 0.45)" },
635
+ { color1: "rgb(245, 158, 11)", color2: "rgb(245, 158, 11)" }
636
+ ]
637
+ },
638
+ light: {
639
+ spikes: [
640
+ { color1: "rgb(180, 83, 9)", color2: "rgba(180, 83, 9, 0.8)" },
641
+ { color1: "rgba(202, 138, 4, 0.7)", color2: "rgba(202, 138, 4, 0.46)" },
642
+ { color1: "rgb(146, 64, 14)", color2: "rgba(146, 64, 14, 0.82)" },
643
+ { color1: "rgb(202, 138, 4)", color2: "rgba(202, 138, 4, 0.7)" },
644
+ { color1: "rgb(161, 98, 7)", color2: "rgba(161, 98, 7, 0.78)" }
645
+ ]
646
+ }
647
+ }
648
+ };
649
+ function withAlpha(color, alpha) {
650
+ const rgbaMatch = color.match(/^rgba\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*[\d.]+\s*\)$/);
651
+ if (rgbaMatch) return `rgba(${rgbaMatch[1]}, ${rgbaMatch[2]}, ${rgbaMatch[3]}, ${alpha})`;
652
+ const rgbMatch = color.match(/^rgb\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*\)$/);
653
+ if (rgbMatch) return `rgba(${rgbMatch[1]}, ${rgbMatch[2]}, ${rgbMatch[3]}, ${alpha})`;
654
+ return color;
655
+ }
656
+ function attenuateSpike(color, factor) {
657
+ const rgbaMatch = color.match(/^rgba\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*\)$/);
658
+ if (rgbaMatch) return `rgba(${rgbaMatch[1]}, ${rgbaMatch[2]}, ${rgbaMatch[3]}, ${(parseFloat(rgbaMatch[4]) * factor).toFixed(2)})`;
659
+ const rgbMatch = color.match(/^rgb\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*\)$/);
660
+ if (rgbMatch) return `rgba(${rgbMatch[1]}, ${rgbMatch[2]}, ${rgbMatch[3]}, ${factor.toFixed(2)})`;
661
+ return color;
662
+ }
663
+ function getLineBloomGradients(colorVariant, isDark, id) {
664
+ const spikeColors = getSpikeColors(colorVariant, isDark);
665
+ const bloomData = lineBloomColors[colorVariant][isDark ? "dark" : "light"];
666
+ const isMono = colorVariant === "mono";
667
+ const att = isMono ? 0.14 : 1;
668
+ const sc1 = isMono ? attenuateSpike(spikeColors.primary, 0.14) : spikeColors.primary;
669
+ const sc1_mid = isMono ? attenuateSpike(spikeColors.primary, 0.09) : spikeColors.primary;
670
+ const sc2 = isMono ? attenuateSpike(spikeColors.secondary, 0.12) : spikeColors.secondary;
671
+ const sc2_mid = isMono ? withAlpha(spikeColors.secondary, 0.06) : withAlpha(spikeColors.secondary, 0.49);
672
+ const spikes = bloomData.spikes.map(
673
+ (s) => isMono ? { color1: attenuateSpike(s.color1, att), color2: attenuateSpike(s.color2, att * 0.7) } : s
674
+ );
675
+ const thinW1 = isMono ? "12px" : "0.8px";
676
+ const thinW2 = isMono ? "14px" : "2px";
677
+ const thinW3 = isMono ? "12px" : "1.2px";
678
+ const thinW4 = isMono ? "10px" : "0.6px";
679
+ const thinH1 = isMono ? "42px" : "92px";
680
+ const thinH2 = isMono ? "38px" : "72px";
681
+ const thinH3 = isMono ? "40px" : "85px";
682
+ const thinH4 = isMono ? "32px" : "60px";
683
+ const thinLW = isMono ? "12px" : "1px";
684
+ const glowDotC = isMono ? "rgba(255, 255, 255, 0.5)" : "rgba(255, 255, 255, 1)";
685
+ const glowDot20 = isMono ? "rgba(255, 255, 255, 0.45)" : "rgba(255, 255, 255, 0.9)";
686
+ const glowDot50 = isMono ? "rgba(255, 255, 255, 0.25)" : "rgba(255, 255, 255, 0.5)";
687
+ const glowAmbC = isMono ? "rgba(255, 255, 255, 0.15)" : "rgba(255, 255, 255, 0.3)";
688
+ const glowAmb25 = isMono ? "rgba(255, 255, 255, 0.06)" : "rgba(255, 255, 255, 0.12)";
689
+ const glowAmb55 = isMono ? "rgba(255, 255, 255, 0.015)" : "rgba(255, 255, 255, 0.03)";
690
+ if (isDark) {
691
+ return `radial-gradient(ellipse calc(${thinW1} * var(--beam-spike-${id})) calc(${thinH1} * var(--beam-h-${id})) at 8% calc(100% - 2px), ${sc1}, ${sc1_mid} 30%, transparent 88%),
692
+ radial-gradient(ellipse calc(10px * var(--beam-spike2-${id})) calc(35px * var(--beam-h-${id})) at 22% calc(100% - 4px), ${sc2}, ${sc2_mid} 50%, transparent 95%),
693
+ radial-gradient(ellipse calc(${thinW2} * (2 - var(--beam-spike-${id}))) calc(${thinH2} * var(--beam-h-${id})) at 36% calc(100% - 3px), ${spikes[0].color1}, ${spikes[0].color2} 40%, transparent 90%),
694
+ radial-gradient(ellipse calc(14px * var(--beam-spike2-${id})) calc(28px * var(--beam-h-${id})) at 50% calc(100% - 2px), ${spikes[1].color1}, ${spikes[1].color2} 55%, transparent 96%),
695
+ radial-gradient(ellipse calc(${thinW3} * (2 - var(--beam-spike2-${id}))) calc(${thinH3} * var(--beam-h-${id})) at 64% calc(100% - 4px), ${spikes[2].color1}, ${spikes[2].color2} 35%, transparent 89%),
696
+ radial-gradient(ellipse calc(7px * var(--beam-spike-${id})) calc(45px * var(--beam-h-${id})) at 78% calc(100% - 2px), ${spikes[3].color1}, ${spikes[3].color2} 48%, transparent 94%),
697
+ radial-gradient(ellipse calc(${thinW4} * (2 - var(--beam-spike-${id}))) calc(${thinH4} * var(--beam-h-${id})) at 92% calc(100% - 3px), ${spikes[4].color1}, ${spikes[4].color2} 42%, transparent 91%),
698
+ radial-gradient(ellipse calc(21px * var(--beam-spike-${id})) calc(15px * var(--beam-spike2-${id})) at calc(var(--beam-x-${id}) * 100%) calc(100% + 1px), ${glowDotC} 0%, ${glowDot20} 20%, ${glowDot50} 50%, transparent 100%),
699
+ radial-gradient(ellipse calc(42px * var(--beam-w-${id})) calc(40px * var(--beam-h-${id})) at calc(var(--beam-x-${id}) * 100%) 100%, ${glowAmbC} 0%, ${glowAmb25} 25%, ${glowAmb55} 55%, transparent 80%)`;
700
+ } else {
701
+ const sc1_lt = isMono ? attenuateSpike(spikeColors.primary, 0.11) : withAlpha(spikeColors.primary, 0.85);
702
+ const sc2_lt = isMono ? attenuateSpike(spikeColors.secondary, 0.09) : withAlpha(spikeColors.secondary, 0.7);
703
+ return `radial-gradient(ellipse calc(${thinW1} * var(--beam-spike-${id})) calc(${thinH1} * var(--beam-h-${id})) at 8% calc(100% - 2px), ${sc1}, ${sc1_lt} 30%, transparent 88%),
704
+ radial-gradient(ellipse calc(10px * var(--beam-spike2-${id})) calc(35px * var(--beam-h-${id})) at 22% calc(100% - 4px), ${sc2}, ${sc2_lt} 50%, transparent 95%),
705
+ radial-gradient(ellipse calc(${thinW2} * (2 - var(--beam-spike-${id}))) calc(${thinH2} * var(--beam-h-${id})) at 36% calc(100% - 3px), ${spikes[0].color1}, ${spikes[0].color2} 40%, transparent 90%),
706
+ radial-gradient(ellipse calc(14px * var(--beam-spike2-${id})) calc(28px * var(--beam-h-${id})) at 50% calc(100% - 2px), ${spikes[1].color1}, ${spikes[1].color2} 55%, transparent 96%),
707
+ radial-gradient(ellipse calc(${thinW3} * (2 - var(--beam-spike2-${id}))) calc(${thinH3} * var(--beam-h-${id})) at 64% calc(100% - 4px), ${spikes[2].color1}, ${spikes[2].color2} 35%, transparent 89%),
708
+ radial-gradient(ellipse calc(7px * var(--beam-spike-${id})) calc(45px * var(--beam-h-${id})) at 78% calc(100% - 2px), ${spikes[3].color1}, ${spikes[3].color2} 48%, transparent 94%),
709
+ radial-gradient(ellipse calc(${thinLW} * (2 - var(--beam-spike-${id}))) calc(${thinH4} * var(--beam-h-${id})) at 92% calc(100% - 3px), ${spikes[4].color1}, ${spikes[4].color2} 42%, transparent 91%),
710
+ radial-gradient(ellipse calc(50px * var(--beam-w-${id})) calc(32px * var(--beam-h-${id})) at calc(var(--beam-x-${id}) * 100%) calc(100%), rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.18) 30%, rgba(0, 0, 0, 0.03) 60%, transparent 85%)`;
711
+ }
712
+ }
713
+ var PULSE_RING_MAP = [
714
+ { region: 1, quad: "tl" },
715
+ { region: 2, quad: "tl" },
716
+ { region: 3, quad: "bl" },
717
+ { region: 1, quad: "bl" },
718
+ { region: 2, quad: "br" },
719
+ { region: 3, quad: "br" },
720
+ { region: 1, quad: "tr" },
721
+ { region: 2, quad: "tr" },
722
+ { region: 3, quad: "tr" }
723
+ ];
724
+ var PULSE_INNER_SIZES = [
725
+ [65, 35],
726
+ [55, 30],
727
+ [35, 65],
728
+ [15, 30],
729
+ [173, 28],
730
+ [80, 22],
731
+ [69, 28],
732
+ [22, 38],
733
+ [47, 44]
734
+ ];
735
+ var PULSE_INNER_BLOOM = [
736
+ { ci: 0, region: 1, quad: "tl", w: 84, h: 48 },
737
+ { ci: 1, region: 2, quad: "tl", w: 72, h: 42 },
738
+ { ci: 2, region: 3, quad: "bl", w: 48, h: 84 },
739
+ { ci: 4, region: 2, quad: "br", w: 216, h: 38 },
740
+ { ci: 5, region: 3, quad: "br", w: 102, h: 31 },
741
+ { ci: 6, region: 1, quad: "tr", w: 89, h: 38 },
742
+ { ci: 8, region: 3, quad: "tr", w: 62, h: 58 }
743
+ ];
744
+ var PULSE_OUTER_CORE = [
745
+ { ci: 0, region: 1, quad: "tl", w: 80, h: 19, x: "27%", y: "0%" },
746
+ { ci: 6, region: 2, quad: "tr", w: 74, h: 11, x: "73%", y: "-1%" },
747
+ { ci: 7, region: 3, quad: "tr", w: 15, h: 44, x: "100%", y: "33%" },
748
+ { ci: 8, region: 1, quad: "br", w: 19, h: 38, x: "101%", y: "72%" },
749
+ { ci: 4, region: 2, quad: "br", w: 84, h: 13, x: "67%", y: "100%" },
750
+ { ci: 1, region: 3, quad: "bl", w: 60, h: 21, x: "24%", y: "101%" },
751
+ { ci: 2, region: 1, quad: "bl", w: 17, h: 40, x: "0%", y: "60%" },
752
+ { ci: 3, region: 2, quad: "tl", w: 13, h: 32, x: "-1%", y: "28%" }
753
+ ];
754
+ var PULSE_OUTER_BLOOM = [
755
+ { ci: 0, region: 1, quad: "tl", w: 110, h: 30, x: "27%", y: "3%" },
756
+ { ci: 6, region: 2, quad: "tr", w: 100, h: 20, x: "73%", y: "1%" },
757
+ { ci: 7, region: 3, quad: "tr", w: 26, h: 62, x: "100%", y: "33%" },
758
+ { ci: 8, region: 1, quad: "br", w: 30, h: 56, x: "101%", y: "72%" },
759
+ { ci: 4, region: 2, quad: "br", w: 120, h: 22, x: "67%", y: "99%" },
760
+ { ci: 1, region: 3, quad: "bl", w: 88, h: 32, x: "24%", y: "99%" },
761
+ { ci: 2, region: 1, quad: "bl", w: 28, h: 58, x: "0%", y: "60%" }
762
+ ];
763
+ function withAlphaVar(color, quad, id) {
764
+ const m = color.match(/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/);
765
+ const rgb = m ? `${m[1]}, ${m[2]}, ${m[3]}` : "255, 255, 255";
766
+ return `rgba(${rgb}, var(--bop-${quad}-${id}))`;
767
+ }
768
+ function pulseGrad(color, w, h, region, quad, x, y, id) {
769
+ return `radial-gradient(ellipse calc(${w}px * var(--bw${region}-${id}) * var(--pulse-glow-sx, 1) * var(--pulse-glow-boost, 1)) calc(${h}px * var(--bh${region}-${id}) * var(--bgh-${id}) * var(--pulse-glow-sy, 1) * var(--pulse-glow-boost, 1)) at calc(${x} + var(--bx${region}-${id})) calc(${y} + var(--by${region}-${id})), ${withAlphaVar(color, quad, id)}, transparent)`;
770
+ }
771
+ function pulseRingGradients(variant, id) {
772
+ return colorPalettes[variant].border.map((c, i) => {
773
+ const { region, quad } = PULSE_RING_MAP[i];
774
+ const [x, y] = c.pos.split(" ");
775
+ const [w, h] = c.size.split(" ").map(parseFloat);
776
+ return pulseGrad(c.color, w, h, region, quad, x, y, id);
777
+ }).join(",\n ");
778
+ }
779
+ function pulseInnerGradients(variant, id, isDark) {
780
+ const palette = colorPalettes[variant].border;
781
+ const grads = palette.map((c, i) => {
782
+ const { region, quad } = PULSE_RING_MAP[i];
783
+ const [x, y] = c.pos.split(" ");
784
+ const [w, h] = PULSE_INNER_SIZES[i];
785
+ return pulseGrad(c.color, w, h, region, quad, x, y, id);
786
+ });
787
+ const cornerRGB = isDark ? "255, 255, 255" : "0, 0, 0";
788
+ const cornerAlpha = isDark ? 0.18 : 0.08;
789
+ const corners = [
790
+ ["0%", "0%", "tl"],
791
+ ["100%", "0%", "tr"],
792
+ ["0%", "100%", "bl"],
793
+ ["100%", "100%", "br"]
794
+ ];
795
+ const cornerGrads = corners.map(
796
+ ([x, y, q]) => `radial-gradient(ellipse 60px 60px at ${x} ${y}, rgba(${cornerRGB}, calc(${cornerAlpha} * var(--bop-${q}-${id}))), transparent 70%)`
797
+ );
798
+ return [...grads, ...cornerGrads].join(",\n ");
799
+ }
800
+ function pulseTableGradients(table, variant, id) {
801
+ const palette = colorPalettes[variant].border;
802
+ return table.map((e) => {
803
+ const c = palette[e.ci];
804
+ const [px, py] = c.pos.split(" ");
805
+ return pulseGrad(c.color, e.w, e.h, e.region, e.quad, e.x ?? px, e.y ?? py, id);
806
+ }).join(",\n ");
807
+ }
808
+ function pulseTableGradientsStatic(table, variant, frozenAlpha) {
809
+ const palette = colorPalettes[variant].border;
810
+ const a = +frozenAlpha.toFixed(3);
811
+ return table.map((e) => {
812
+ const c = palette[e.ci];
813
+ const [px, py] = c.pos.split(" ");
814
+ const x = e.x ?? px;
815
+ const y = e.y ?? py;
816
+ const m = c.color.match(/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/);
817
+ const rgb = m ? `${m[1]}, ${m[2]}, ${m[3]}` : "255, 255, 255";
818
+ return `radial-gradient(ellipse calc(${e.w}px * var(--pulse-glow-sx, 1) * var(--pulse-glow-boost, 1)) calc(${e.h}px * var(--pulse-glow-sy, 1) * var(--pulse-glow-boost, 1)) at ${x} ${y}, rgba(${rgb}, ${a}), transparent)`;
819
+ }).join(",\n ");
820
+ }
821
+ function pausedAnimationsRule(id) {
822
+ return `
823
+ [data-beam="${id}"][data-paused],
824
+ [data-beam="${id}"][data-paused]::after,
825
+ [data-beam="${id}"][data-paused]::before,
826
+ [data-beam="${id}"][data-paused] [data-beam-bloom] {
827
+ animation-play-state: paused !important;
828
+ }`;
829
+ }
830
+ function pulsePropertyRegs(id) {
831
+ const numbers = ["bw1", "bh1", "bw2", "bh2", "bw3", "bh3", "bgh", "bop-tl", "bop-tr", "bop-bl", "bop-br"];
832
+ const lengths = ["bx1", "by1", "bx2", "by2", "bx3", "by3"];
833
+ const numReg = numbers.map(
834
+ (n) => `@property --${n}-${id} {
835
+ syntax: "<number>";
836
+ initial-value: 1;
837
+ inherits: true;
838
+ }`
839
+ ).join("\n\n");
840
+ const lenReg = lengths.map(
841
+ (n) => `@property --${n}-${id} {
842
+ syntax: "<length>";
843
+ initial-value: 0px;
844
+ inherits: true;
845
+ }`
846
+ ).join("\n\n");
847
+ return `${numReg}
848
+
849
+ ${lenReg}
850
+
851
+ @property --beam-opacity-${id} {
852
+ syntax: "<number>";
853
+ initial-value: 0;
854
+ inherits: true;
855
+ }
856
+
857
+ @property --beam-hue-${id} {
858
+ syntax: "<angle>";
859
+ initial-value: 0deg;
860
+ inherits: true;
861
+ }`;
862
+ }
863
+ function pulseParams(size, theme, duration) {
864
+ const isDark = theme === "dark";
865
+ const durScale = duration / 2.3;
866
+ if (size === "pulse-inner") {
867
+ return {
868
+ sp: 0.28,
869
+ dr: isDark ? 33 : 40,
870
+ op: isDark ? 0.48 : 0.45,
871
+ gh: isDark ? 0.34 : 0.22,
872
+ bs: (isDark ? 1.9 : 2.6) * durScale,
873
+ ss: (isDark ? 2.6 : 4.6) * durScale,
874
+ ghs: (isDark ? 2.4 : 5.5) * durScale,
875
+ // Full hue revolution period (seconds) — colors continuously cycle.
876
+ huePeriod: 16
877
+ };
878
+ }
879
+ return {
880
+ sp: isDark ? 0.28 : 0.36,
881
+ dr: isDark ? 14 : 19,
882
+ op: isDark ? 0.46 : 0,
883
+ gh: isDark ? 0.16 : 0.58,
884
+ bs: (isDark ? 2.3 : 3.7) * durScale,
885
+ ss: (isDark ? 6.4 : 4.6) * durScale,
886
+ ghs: (isDark ? 2.4 : 3.8) * durScale,
887
+ // Full hue revolution period (seconds) — colors continuously cycle.
888
+ huePeriod: 14
889
+ };
890
+ }
891
+ function pulseOscillatorDefs(id, p) {
892
+ const { sp, dr, op, gh, bs, ss, ghs } = p;
893
+ return [
894
+ { prop: `--bw1-${id}`, a: 1 - sp, b: 1 + sp * 1.1, period: ss * 0.9, delay: 0, unit: "" },
895
+ { prop: `--bh1-${id}`, a: 1 + sp * 0.9, b: 1 - sp * 0.85, period: ss * 1.26, delay: 0, unit: "" },
896
+ { prop: `--bx1-${id}`, a: -dr, b: dr * 0.9, period: bs * 1.6, delay: 0, unit: "px" },
897
+ { prop: `--by1-${id}`, a: dr * 0.55, b: -dr * 0.7, period: bs * 1.6, delay: 0, unit: "px" },
898
+ { prop: `--bw2-${id}`, a: 1 + sp, b: 1 - sp * 0.85, period: ss * 1.1, delay: 0, unit: "" },
899
+ { prop: `--bh2-${id}`, a: 1 - sp * 0.8, b: 1 + sp * 1.05, period: ss * 0.81, delay: 0, unit: "" },
900
+ { prop: `--bx2-${id}`, a: dr * 0.8, b: -dr * 0.9, period: bs * 1.88, delay: 0, unit: "px" },
901
+ { prop: `--by2-${id}`, a: -dr, b: dr * 0.65, period: bs * 1.88, delay: 0, unit: "px" },
902
+ { prop: `--bw3-${id}`, a: 1 - sp * 0.6, b: 1 + sp * 1.15, period: ss * 0.98, delay: 0, unit: "" },
903
+ { prop: `--bh3-${id}`, a: 1 + sp * 0.75, b: 1 - sp, period: ss * 1.4, delay: 0, unit: "" },
904
+ { prop: `--bx3-${id}`, a: -dr * 0.6, b: dr, period: bs * 1.45, delay: 0, unit: "px" },
905
+ { prop: `--by3-${id}`, a: -dr * 0.85, b: dr * 0.45, period: bs * 1.45, delay: 0, unit: "px" },
906
+ { prop: `--bgh-${id}`, a: 1 - gh, b: 1 + gh, period: ghs, delay: 0, unit: "" },
907
+ { prop: `--bop-tl-${id}`, a: 1 - op, b: 1, period: bs, delay: 0, unit: "" },
908
+ { prop: `--bop-tr-${id}`, a: 1 - op, b: 1, period: bs * 1.32, delay: bs * 0.28, unit: "" },
909
+ { prop: `--bop-bl-${id}`, a: 1 - op, b: 1, period: bs * 0.84, delay: bs * 0.55, unit: "" },
910
+ { prop: `--bop-br-${id}`, a: 1 - op, b: 1, period: bs * 1.58, delay: bs * 0.83, unit: "" }
911
+ ];
912
+ }
913
+ function getPulseDriverConfig(size, theme, duration, _hueRange, staticColors, id) {
914
+ if (size !== "pulse-inner" && size !== "pulse-outside") return null;
915
+ const p = pulseParams(size, theme, duration);
916
+ return {
917
+ oscillators: pulseOscillatorDefs(id, p),
918
+ // Pulse colors continuously rotate a full hue circle so the palette is never
919
+ // pinned to fixed edges (no more "always red top-right / green left").
920
+ hue: staticColors ? null : { prop: `--beam-hue-${id}`, range: 360, period: p.huePeriod, continuous: true }
921
+ };
922
+ }
923
+ function pulseWrapperAnimation(id, fadeName, fadeDur) {
924
+ return ` animation: ${fadeName}-${id} ${fadeDur}s ease forwards;`;
925
+ }
926
+ function generateBeamCSS(options) {
927
+ const { size } = options;
928
+ if (size === "line") {
929
+ return generateLineVariantCSS(options);
930
+ }
931
+ if (size === "sm") {
932
+ return generateSmallVariantCSS(options);
933
+ }
934
+ if (size === "pulse-inner") {
935
+ return generatePulseInnerVariantCSS(options);
936
+ }
937
+ if (size === "pulse-outside") {
938
+ return generatePulseOuterVariantCSS(options);
939
+ }
940
+ return generateBorderVariantCSS(options);
941
+ }
942
+ function generateSmallVariantCSS(options) {
943
+ const {
944
+ id,
945
+ borderRadius,
946
+ borderWidth,
947
+ duration,
948
+ strokeOpacity,
949
+ innerOpacity,
950
+ bloomOpacity,
951
+ innerShadow,
952
+ colorVariant,
953
+ staticColors,
954
+ brightness,
955
+ saturation,
956
+ hueRange,
957
+ theme
958
+ } = options;
959
+ const innerRadius = Math.max(0, borderRadius - borderWidth);
960
+ const monoOpacityMultiplier = colorVariant === "mono" ? 0.5 : 1;
961
+ const finalStrokeOpacity = strokeOpacity * monoOpacityMultiplier;
962
+ const finalInnerOpacity = innerOpacity * monoOpacityMultiplier;
963
+ const finalBloomOpacity = bloomOpacity * monoOpacityMultiplier;
964
+ const hueShiftAnimation = staticColors ? "" : `animation: beam-hue-shift-${id} 12s ease-in-out infinite;`;
965
+ const hueShiftKeyframes = staticColors ? "" : `
966
+ @keyframes beam-hue-shift-${id} {
967
+ 0% { filter: hue-rotate(calc(var(--beam-hue-base, 0deg) - ${hueRange}deg)) brightness(${brightness.toFixed(2)}) saturate(${saturation.toFixed(2)}); }
968
+ 50% { filter: hue-rotate(calc(var(--beam-hue-base, 0deg) + ${hueRange}deg)) brightness(${brightness.toFixed(2)}) saturate(${saturation.toFixed(2)}); }
969
+ 100% { filter: hue-rotate(calc(var(--beam-hue-base, 0deg) - ${hueRange}deg)) brightness(${brightness.toFixed(2)}) saturate(${saturation.toFixed(2)}); }
970
+ }`;
971
+ const isDark = theme === "dark";
972
+ const whiteGradient = isDark ? `conic-gradient(
973
+ from var(--beam-angle-${id}),
974
+ transparent 0%, transparent 54%,
975
+ rgba(255, 255, 255, 0.1) 57%,
976
+ rgba(255, 255, 255, 0.3) 60%,
977
+ rgba(255, 255, 255, 0.6) 63%,
978
+ rgba(255, 255, 255, 0.75) 66%,
979
+ rgba(255, 255, 255, 0.6) 69%,
980
+ rgba(255, 255, 255, 0.3) 72%,
981
+ rgba(255, 255, 255, 0.1) 75%,
982
+ transparent 78%, transparent 100%
983
+ )` : `conic-gradient(
984
+ from var(--beam-angle-${id}),
985
+ transparent 0%, transparent 54%,
986
+ rgba(0, 0, 0, 0.08) 57%,
987
+ rgba(0, 0, 0, 0.2) 60%,
988
+ rgba(0, 0, 0, 0.4) 63%,
989
+ rgba(0, 0, 0, 0.55) 66%,
990
+ rgba(0, 0, 0, 0.4) 69%,
991
+ rgba(0, 0, 0, 0.2) 72%,
992
+ rgba(0, 0, 0, 0.08) 75%,
993
+ transparent 78%, transparent 100%
994
+ )`;
995
+ const colorGradients = getSmallColorGradients(colorVariant);
996
+ const innerGradients = getSmallInnerGradients(colorVariant);
997
+ const bloomGradient = isDark ? `conic-gradient(
998
+ from var(--beam-angle-${id}),
999
+ transparent 0%, transparent 58%,
1000
+ rgba(255, 255, 255, 0.03) 62%,
1001
+ rgba(255, 255, 255, 0.08) 65%,
1002
+ rgba(255, 255, 255, 0.2) 67%,
1003
+ rgba(255, 255, 255, 0.45) 69%,
1004
+ rgba(255, 255, 255, 0.85) 70%,
1005
+ rgba(255, 255, 255, 0.85) 70.5%,
1006
+ rgba(255, 255, 255, 0.45) 71.5%,
1007
+ rgba(255, 255, 255, 0.2) 73%,
1008
+ rgba(255, 255, 255, 0.08) 75%,
1009
+ rgba(255, 255, 255, 0.03) 78%,
1010
+ transparent 82%
1011
+ )` : `conic-gradient(
1012
+ from var(--beam-angle-${id}),
1013
+ transparent 0%, transparent 58%,
1014
+ rgba(0, 0, 0, 0.02) 62%,
1015
+ rgba(0, 0, 0, 0.08) 65%,
1016
+ rgba(0, 0, 0, 0.2) 67%,
1017
+ rgba(0, 0, 0, 0.4) 69%,
1018
+ rgba(0, 0, 0, 0.6) 70%,
1019
+ rgba(0, 0, 0, 0.6) 70.5%,
1020
+ rgba(0, 0, 0, 0.4) 71.5%,
1021
+ rgba(0, 0, 0, 0.2) 73%,
1022
+ rgba(0, 0, 0, 0.08) 75%,
1023
+ rgba(0, 0, 0, 0.02) 78%,
1024
+ transparent 82%
1025
+ )`;
1026
+ const smallMask = `conic-gradient(
1027
+ from var(--beam-angle-${id}),
1028
+ transparent 0%, transparent 22%,
1029
+ rgba(255, 255, 255, 0.12) 28%, rgba(255, 255, 255, 0.4) 36%,
1030
+ white 46%, white 82%,
1031
+ rgba(255, 255, 255, 0.4) 88%, rgba(255, 255, 255, 0.12) 94%,
1032
+ transparent 97%, transparent 100%
1033
+ )`;
1034
+ return `
1035
+ @property --beam-angle-${id} {
1036
+ syntax: "<angle>";
1037
+ initial-value: 0deg;
1038
+ inherits: true;
1039
+ }
1040
+
1041
+ @property --beam-opacity-${id} {
1042
+ syntax: "<number>";
1043
+ initial-value: 0;
1044
+ inherits: true;
1045
+ }
1046
+
1047
+ [data-beam="${id}"] {
1048
+ position: relative;
1049
+ border-radius: ${borderRadius}px;
1050
+ overflow: hidden;
1051
+ }
1052
+
1053
+ [data-beam="${id}"][data-active] {
1054
+ animation:
1055
+ beam-spin-${id} ${duration}s linear infinite,
1056
+ beam-fade-in-${id} 0.6s ease forwards;
1057
+ }
1058
+
1059
+ [data-beam="${id}"][data-fading] {
1060
+ animation:
1061
+ beam-spin-${id} ${duration}s linear infinite,
1062
+ beam-fade-out-${id} 0.5s ease forwards;
1063
+ }
1064
+
1065
+ [data-beam="${id}"][data-active]::after,
1066
+ [data-beam="${id}"][data-fading]::after {
1067
+ content: "";
1068
+ position: absolute;
1069
+ inset: 0;
1070
+ border-radius: ${innerRadius}px;
1071
+ padding: ${borderWidth}px;
1072
+ clip-path: inset(0 round ${borderRadius}px);
1073
+ background: ${whiteGradient},${colorGradients};
1074
+ -webkit-mask:
1075
+ conic-gradient(
1076
+ from var(--beam-angle-${id}),
1077
+ transparent 0%, transparent 30%,
1078
+ rgba(255, 255, 255, 0.1) 36%, rgba(255, 255, 255, 0.35) 44%,
1079
+ white 52%, white 80%,
1080
+ rgba(255, 255, 255, 0.35) 86%, rgba(255, 255, 255, 0.1) 92%,
1081
+ transparent 95%, transparent 100%
1082
+ ),
1083
+ linear-gradient(#fff 0 0) content-box,
1084
+ linear-gradient(#fff 0 0);
1085
+ -webkit-mask-composite: source-in, xor;
1086
+ mask:
1087
+ conic-gradient(
1088
+ from var(--beam-angle-${id}),
1089
+ transparent 0%, transparent 30%,
1090
+ rgba(255, 255, 255, 0.1) 36%, rgba(255, 255, 255, 0.35) 44%,
1091
+ white 52%, white 80%,
1092
+ rgba(255, 255, 255, 0.35) 86%, rgba(255, 255, 255, 0.1) 92%,
1093
+ transparent 95%, transparent 100%
1094
+ ),
1095
+ linear-gradient(#fff 0 0) content-box,
1096
+ linear-gradient(#fff 0 0);
1097
+ mask-composite: intersect, exclude;
1098
+ pointer-events: none;
1099
+ z-index: 2;
1100
+ opacity: calc(var(--beam-opacity-${id}) * ${finalStrokeOpacity.toFixed(2)} * var(--beam-stroke-opacity, 1) * var(--beam-strength, 1));
1101
+ ${hueShiftAnimation}
1102
+ }
1103
+
1104
+ [data-beam="${id}"][data-active]::before,
1105
+ [data-beam="${id}"][data-fading]::before {
1106
+ content: "";
1107
+ position: absolute;
1108
+ inset: 0;
1109
+ border-radius: ${borderRadius}px;
1110
+ clip-path: inset(0 round ${borderRadius}px);
1111
+ background: ${innerGradients};
1112
+ box-shadow: inset 0 0 5px 1px ${innerShadow};
1113
+ -webkit-mask-image: ${smallMask};
1114
+ -webkit-mask-composite: source-over;
1115
+ mask-image: ${smallMask};
1116
+ mask-composite: add;
1117
+ pointer-events: none;
1118
+ z-index: 1;
1119
+ opacity: calc(var(--beam-opacity-${id}) * ${finalInnerOpacity.toFixed(2)} * var(--beam-inner-opacity, 1) * var(--beam-strength, 1));
1120
+ ${hueShiftAnimation}
1121
+ }
1122
+
1123
+ [data-beam="${id}"] [data-beam-bloom] {
1124
+ display: none;
1125
+ position: absolute;
1126
+ inset: 0;
1127
+ border-radius: ${innerRadius}px;
1128
+ clip-path: inset(0 round ${borderRadius}px);
1129
+ background: ${bloomGradient};
1130
+ -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
1131
+ -webkit-mask-composite: xor;
1132
+ mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
1133
+ mask-composite: exclude;
1134
+ padding: ${borderWidth}px;
1135
+ filter: blur(8px) brightness(${brightness.toFixed(2)}) saturate(${saturation.toFixed(2)});
1136
+ pointer-events: none;
1137
+ z-index: 3;
1138
+ opacity: 0;
1139
+ }
1140
+
1141
+ [data-beam="${id}"][data-active] [data-beam-bloom],
1142
+ [data-beam="${id}"][data-fading] [data-beam-bloom] {
1143
+ display: block;
1144
+ opacity: calc(var(--beam-opacity-${id}) * ${finalBloomOpacity.toFixed(2)} * var(--beam-bloom-opacity, 1) * var(--beam-strength, 1));
1145
+ }
1146
+
1147
+ @keyframes beam-spin-${id} {
1148
+ to { --beam-angle-${id}: 360deg; }
1149
+ }
1150
+
1151
+ @keyframes beam-fade-in-${id} {
1152
+ to { --beam-opacity-${id}: 1; }
1153
+ }
1154
+
1155
+ @keyframes beam-fade-out-${id} {
1156
+ from { --beam-opacity-${id}: 1; }
1157
+ to { --beam-opacity-${id}: 0; }
1158
+ }
1159
+ ${hueShiftKeyframes}
1160
+ ${pausedAnimationsRule(id)}
1161
+ `;
1162
+ }
1163
+ function generateBorderVariantCSS(options) {
1164
+ const {
1165
+ id,
1166
+ borderRadius,
1167
+ borderWidth,
1168
+ duration,
1169
+ strokeOpacity,
1170
+ innerOpacity,
1171
+ bloomOpacity,
1172
+ innerShadow,
1173
+ colorVariant,
1174
+ staticColors,
1175
+ brightness,
1176
+ saturation,
1177
+ hueRange,
1178
+ theme
1179
+ } = options;
1180
+ const innerRadius = Math.max(0, borderRadius - borderWidth);
1181
+ const monoOpacityMultiplier = colorVariant === "mono" ? 0.5 : 1;
1182
+ const finalStrokeOpacity = strokeOpacity * monoOpacityMultiplier;
1183
+ const finalInnerOpacity = innerOpacity * monoOpacityMultiplier;
1184
+ const finalBloomOpacity = bloomOpacity * monoOpacityMultiplier;
1185
+ const hueShiftAnimation = staticColors ? "" : `animation: beam-hue-shift-${id} 12s ease-in-out infinite;`;
1186
+ const hueShiftKeyframes = staticColors ? "" : `
1187
+ @keyframes beam-hue-shift-${id} {
1188
+ 0% { filter: hue-rotate(calc(var(--beam-hue-base, 0deg) - ${hueRange}deg)) brightness(${brightness.toFixed(2)}) saturate(${saturation.toFixed(2)}); }
1189
+ 50% { filter: hue-rotate(calc(var(--beam-hue-base, 0deg) + ${hueRange}deg)) brightness(${brightness.toFixed(2)}) saturate(${saturation.toFixed(2)}); }
1190
+ 100% { filter: hue-rotate(calc(var(--beam-hue-base, 0deg) - ${hueRange}deg)) brightness(${brightness.toFixed(2)}) saturate(${saturation.toFixed(2)}); }
1191
+ }`;
1192
+ const isDark = theme === "dark";
1193
+ const whiteGradient = isDark ? `conic-gradient(
1194
+ from var(--beam-angle-${id}),
1195
+ transparent 0%, transparent 54%,
1196
+ rgba(255, 255, 255, 0.1) 57%,
1197
+ rgba(255, 255, 255, 0.3) 60%,
1198
+ rgba(255, 255, 255, 0.6) 63%,
1199
+ rgba(255, 255, 255, 0.75) 66%,
1200
+ rgba(255, 255, 255, 0.6) 69%,
1201
+ rgba(255, 255, 255, 0.3) 72%,
1202
+ rgba(255, 255, 255, 0.1) 75%,
1203
+ transparent 78%, transparent 100%
1204
+ )` : `conic-gradient(
1205
+ from var(--beam-angle-${id}),
1206
+ transparent 0%, transparent 54%,
1207
+ rgba(0, 0, 0, 0.08) 57%,
1208
+ rgba(0, 0, 0, 0.2) 60%,
1209
+ rgba(0, 0, 0, 0.4) 63%,
1210
+ rgba(0, 0, 0, 0.55) 66%,
1211
+ rgba(0, 0, 0, 0.4) 69%,
1212
+ rgba(0, 0, 0, 0.2) 72%,
1213
+ rgba(0, 0, 0, 0.08) 75%,
1214
+ transparent 78%, transparent 100%
1215
+ )`;
1216
+ const colorGradients = getColorGradients(colorVariant);
1217
+ const innerGradients = getInnerGradients(colorVariant);
1218
+ const bloomGradient = isDark ? `conic-gradient(
1219
+ from var(--beam-angle-${id}),
1220
+ transparent 0%, transparent 58%,
1221
+ rgba(255, 255, 255, 0.03) 62%,
1222
+ rgba(255, 255, 255, 0.08) 65%,
1223
+ rgba(255, 255, 255, 0.2) 67%,
1224
+ rgba(255, 255, 255, 0.45) 69%,
1225
+ rgba(255, 255, 255, 0.85) 70%,
1226
+ rgba(255, 255, 255, 0.85) 70.5%,
1227
+ rgba(255, 255, 255, 0.45) 71.5%,
1228
+ rgba(255, 255, 255, 0.2) 73%,
1229
+ rgba(255, 255, 255, 0.08) 75%,
1230
+ rgba(255, 255, 255, 0.03) 78%,
1231
+ transparent 82%
1232
+ )` : `conic-gradient(
1233
+ from var(--beam-angle-${id}),
1234
+ transparent 0%, transparent 58%,
1235
+ rgba(0, 0, 0, 0.02) 62%,
1236
+ rgba(0, 0, 0, 0.08) 65%,
1237
+ rgba(0, 0, 0, 0.2) 67%,
1238
+ rgba(0, 0, 0, 0.4) 69%,
1239
+ rgba(0, 0, 0, 0.6) 70%,
1240
+ rgba(0, 0, 0, 0.6) 70.5%,
1241
+ rgba(0, 0, 0, 0.4) 71.5%,
1242
+ rgba(0, 0, 0, 0.2) 73%,
1243
+ rgba(0, 0, 0, 0.08) 75%,
1244
+ rgba(0, 0, 0, 0.02) 78%,
1245
+ transparent 82%
1246
+ )`;
1247
+ return `
1248
+ @property --beam-angle-${id} {
1249
+ syntax: "<angle>";
1250
+ initial-value: 0deg;
1251
+ inherits: true;
1252
+ }
1253
+
1254
+ @property --beam-opacity-${id} {
1255
+ syntax: "<number>";
1256
+ initial-value: 0;
1257
+ inherits: true;
1258
+ }
1259
+
1260
+ [data-beam="${id}"] {
1261
+ position: relative;
1262
+ border-radius: ${borderRadius}px;
1263
+ overflow: hidden;
1264
+ }
1265
+
1266
+ [data-beam="${id}"][data-active] {
1267
+ animation:
1268
+ beam-spin-${id} ${duration}s linear infinite,
1269
+ beam-fade-in-${id} 0.6s ease forwards;
1270
+ }
1271
+
1272
+ [data-beam="${id}"][data-fading] {
1273
+ animation:
1274
+ beam-spin-${id} ${duration}s linear infinite,
1275
+ beam-fade-out-${id} 0.5s ease forwards;
1276
+ }
1277
+
1278
+ [data-beam="${id}"][data-active]::after,
1279
+ [data-beam="${id}"][data-fading]::after {
1280
+ content: "";
1281
+ position: absolute;
1282
+ inset: 0;
1283
+ border-radius: ${innerRadius}px;
1284
+ padding: ${borderWidth}px;
1285
+ clip-path: inset(0 round ${borderRadius}px);
1286
+ background: ${whiteGradient},${colorGradients};
1287
+ -webkit-mask:
1288
+ conic-gradient(
1289
+ from var(--beam-angle-${id}),
1290
+ transparent 0%, transparent 30%,
1291
+ rgba(255, 255, 255, 0.1) 36%, rgba(255, 255, 255, 0.35) 44%,
1292
+ white 52%, white 80%,
1293
+ rgba(255, 255, 255, 0.35) 86%, rgba(255, 255, 255, 0.1) 92%,
1294
+ transparent 95%, transparent 100%
1295
+ ),
1296
+ linear-gradient(#fff 0 0) content-box,
1297
+ linear-gradient(#fff 0 0);
1298
+ -webkit-mask-composite: source-in, xor;
1299
+ mask:
1300
+ conic-gradient(
1301
+ from var(--beam-angle-${id}),
1302
+ transparent 0%, transparent 30%,
1303
+ rgba(255, 255, 255, 0.1) 36%, rgba(255, 255, 255, 0.35) 44%,
1304
+ white 52%, white 80%,
1305
+ rgba(255, 255, 255, 0.35) 86%, rgba(255, 255, 255, 0.1) 92%,
1306
+ transparent 95%, transparent 100%
1307
+ ),
1308
+ linear-gradient(#fff 0 0) content-box,
1309
+ linear-gradient(#fff 0 0);
1310
+ mask-composite: intersect, exclude;
1311
+ pointer-events: none;
1312
+ z-index: 2;
1313
+ opacity: calc(var(--beam-opacity-${id}) * ${finalStrokeOpacity.toFixed(2)} * var(--beam-stroke-opacity, 1) * var(--beam-strength, 1));
1314
+ ${hueShiftAnimation}
1315
+ }
1316
+
1317
+ [data-beam="${id}"][data-active]::before,
1318
+ [data-beam="${id}"][data-fading]::before {
1319
+ content: "";
1320
+ position: absolute;
1321
+ inset: 0;
1322
+ border-radius: ${borderRadius}px;
1323
+ background: ${innerGradients};
1324
+ box-shadow: inset 0 0 9px 1px ${innerShadow};
1325
+ -webkit-mask-image:
1326
+ conic-gradient(
1327
+ from var(--beam-angle-${id}),
1328
+ transparent 0%, transparent 30%,
1329
+ rgba(255, 255, 255, 0.1) 36%, rgba(255, 255, 255, 0.35) 44%,
1330
+ white 52%, white 80%,
1331
+ rgba(255, 255, 255, 0.35) 86%, rgba(255, 255, 255, 0.1) 92%,
1332
+ transparent 95%, transparent 100%
1333
+ ),
1334
+ linear-gradient(white, transparent 28px, transparent calc(100% - 28px), white),
1335
+ linear-gradient(to right, white, transparent 28px, transparent calc(100% - 28px), white);
1336
+ -webkit-mask-composite: source-in, source-over;
1337
+ mask-image:
1338
+ conic-gradient(
1339
+ from var(--beam-angle-${id}),
1340
+ transparent 0%, transparent 30%,
1341
+ rgba(255, 255, 255, 0.1) 36%, rgba(255, 255, 255, 0.35) 44%,
1342
+ white 52%, white 80%,
1343
+ rgba(255, 255, 255, 0.35) 86%, rgba(255, 255, 255, 0.1) 92%,
1344
+ transparent 95%, transparent 100%
1345
+ ),
1346
+ linear-gradient(white, transparent 28px, transparent calc(100% - 28px), white),
1347
+ linear-gradient(to right, white, transparent 28px, transparent calc(100% - 28px), white);
1348
+ mask-composite: intersect, add;
1349
+ pointer-events: none;
1350
+ z-index: 1;
1351
+ opacity: calc(var(--beam-opacity-${id}) * ${finalInnerOpacity.toFixed(2)} * var(--beam-inner-opacity, 1) * var(--beam-strength, 1));
1352
+ clip-path: inset(0 round ${borderRadius}px);
1353
+ ${hueShiftAnimation}
1354
+ }
1355
+
1356
+ [data-beam="${id}"] [data-beam-bloom] {
1357
+ display: none;
1358
+ position: absolute;
1359
+ inset: 0;
1360
+ border-radius: ${innerRadius}px;
1361
+ clip-path: inset(0 round ${borderRadius}px);
1362
+ background: ${bloomGradient};
1363
+ -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
1364
+ -webkit-mask-composite: xor;
1365
+ mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
1366
+ mask-composite: exclude;
1367
+ padding: ${borderWidth}px;
1368
+ filter: blur(8px) brightness(${brightness.toFixed(2)}) saturate(${saturation.toFixed(2)});
1369
+ pointer-events: none;
1370
+ z-index: 3;
1371
+ opacity: 0;
1372
+ }
1373
+
1374
+ [data-beam="${id}"][data-active] [data-beam-bloom],
1375
+ [data-beam="${id}"][data-fading] [data-beam-bloom] {
1376
+ display: block;
1377
+ opacity: calc(var(--beam-opacity-${id}) * ${finalBloomOpacity.toFixed(2)} * var(--beam-bloom-opacity, 1) * var(--beam-strength, 1));
1378
+ }
1379
+
1380
+ @keyframes beam-spin-${id} {
1381
+ to { --beam-angle-${id}: 360deg; }
1382
+ }
1383
+
1384
+ @keyframes beam-fade-in-${id} {
1385
+ to { --beam-opacity-${id}: 1; }
1386
+ }
1387
+
1388
+ @keyframes beam-fade-out-${id} {
1389
+ from { --beam-opacity-${id}: 1; }
1390
+ to { --beam-opacity-${id}: 0; }
1391
+ }
1392
+ ${hueShiftKeyframes}
1393
+ ${pausedAnimationsRule(id)}
1394
+ `;
1395
+ }
1396
+ function generatePulseInnerVariantCSS(options) {
1397
+ const {
1398
+ id,
1399
+ borderRadius,
1400
+ borderWidth,
1401
+ duration,
1402
+ strokeOpacity,
1403
+ innerOpacity,
1404
+ bloomOpacity,
1405
+ colorVariant,
1406
+ staticColors,
1407
+ brightness,
1408
+ saturation,
1409
+ theme
1410
+ } = options;
1411
+ const isDark = theme === "dark";
1412
+ const monoMul = colorVariant === "mono" ? 0.5 : 1;
1413
+ const sStroke = (strokeOpacity * monoMul).toFixed(2);
1414
+ const sInner = (innerOpacity * monoMul).toFixed(2);
1415
+ const sBloom = (bloomOpacity * monoMul).toFixed(2);
1416
+ const { op } = pulseParams("pulse-inner", theme, duration);
1417
+ const bloomBlur = 8;
1418
+ const b = brightness.toFixed(2);
1419
+ const s = saturation.toFixed(2);
1420
+ const ringAnim = staticColors ? `filter: brightness(${b}) saturate(${s});` : `filter: hue-rotate(calc(var(--beam-hue-base, 0deg) + var(--beam-hue-${id}))) brightness(${b}) saturate(${s});`;
1421
+ const bloomAnim = staticColors ? `filter: blur(${bloomBlur}px) brightness(${b}) saturate(${s});` : `filter: blur(${bloomBlur}px) hue-rotate(calc(var(--beam-hue-base, 0deg) + var(--beam-hue-${id}))) brightness(${b}) saturate(${s});`;
1422
+ const ringGradients = pulseRingGradients(colorVariant, id);
1423
+ const innerGradients = pulseInnerGradients(colorVariant, id, isDark);
1424
+ const bloomGradients = pulseTableGradientsStatic(PULSE_INNER_BLOOM, colorVariant, 1 - op * 0.5);
1425
+ return `
1426
+ ${pulsePropertyRegs(id)}
1427
+
1428
+ [data-beam="${id}"] {
1429
+ position: relative;
1430
+ border-radius: ${borderRadius}px;
1431
+ overflow: hidden;
1432
+ isolation: isolate;
1433
+ }
1434
+
1435
+ [data-beam="${id}"][data-active] {
1436
+ ${pulseWrapperAnimation(id, "beam-fade-in", 0.6)}
1437
+ }
1438
+
1439
+ [data-beam="${id}"][data-fading] {
1440
+ ${pulseWrapperAnimation(id, "beam-fade-out", 0.5)}
1441
+ }
1442
+
1443
+ [data-beam="${id}"][data-active]::after,
1444
+ [data-beam="${id}"][data-fading]::after {
1445
+ content: "";
1446
+ position: absolute;
1447
+ inset: 0;
1448
+ border-radius: ${borderRadius}px;
1449
+ padding: ${borderWidth}px;
1450
+ clip-path: inset(0 round ${borderRadius}px);
1451
+ background: ${ringGradients};
1452
+ -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
1453
+ -webkit-mask-composite: xor;
1454
+ mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
1455
+ mask-composite: exclude;
1456
+ pointer-events: none;
1457
+ z-index: 2;
1458
+ will-change: opacity, filter;
1459
+ opacity: calc(var(--beam-opacity-${id}) * ${sStroke} * var(--beam-stroke-opacity, 1) * var(--beam-strength, 1));
1460
+ ${ringAnim}
1461
+ }
1462
+
1463
+ [data-beam="${id}"][data-active]::before,
1464
+ [data-beam="${id}"][data-fading]::before {
1465
+ content: "";
1466
+ position: absolute;
1467
+ inset: 0;
1468
+ border-radius: ${borderRadius}px;
1469
+ clip-path: inset(0 round ${borderRadius}px);
1470
+ background: ${innerGradients};
1471
+ -webkit-mask-image:
1472
+ linear-gradient(white, transparent 28px, transparent calc(100% - 28px), white),
1473
+ linear-gradient(to right, white, transparent 28px, transparent calc(100% - 28px), white);
1474
+ -webkit-mask-composite: source-over;
1475
+ mask-image:
1476
+ linear-gradient(white, transparent 28px, transparent calc(100% - 28px), white),
1477
+ linear-gradient(to right, white, transparent 28px, transparent calc(100% - 28px), white);
1478
+ mask-composite: add;
1479
+ pointer-events: none;
1480
+ z-index: 1;
1481
+ will-change: opacity, filter;
1482
+ opacity: calc(var(--beam-opacity-${id}) * ${sInner} * var(--beam-inner-opacity, 1) * var(--beam-strength, 1));
1483
+ ${ringAnim}
1484
+ }
1485
+
1486
+ [data-beam="${id}"] [data-beam-bloom] {
1487
+ display: none;
1488
+ position: absolute;
1489
+ inset: 0;
1490
+ border-radius: ${borderRadius}px;
1491
+ clip-path: inset(0 round ${borderRadius}px);
1492
+ background: ${bloomGradients};
1493
+ -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
1494
+ -webkit-mask-composite: xor;
1495
+ mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
1496
+ mask-composite: exclude;
1497
+ padding: ${borderWidth}px;
1498
+ pointer-events: none;
1499
+ z-index: 3;
1500
+ will-change: opacity;
1501
+ opacity: 0;
1502
+ }
1503
+
1504
+ [data-beam="${id}"][data-active] [data-beam-bloom],
1505
+ [data-beam="${id}"][data-fading] [data-beam-bloom] {
1506
+ display: block;
1507
+ opacity: calc(var(--beam-opacity-${id}) * ${sBloom} * var(--beam-bloom-opacity, 1) * var(--beam-strength, 1));
1508
+ ${bloomAnim}
1509
+ }
1510
+
1511
+ @keyframes beam-fade-in-${id} { to { --beam-opacity-${id}: 1; } }
1512
+ @keyframes beam-fade-out-${id} { from { --beam-opacity-${id}: 1; } to { --beam-opacity-${id}: 0; } }
1513
+ ${pausedAnimationsRule(id)}
1514
+
1515
+ @media (prefers-reduced-motion: reduce) {
1516
+ [data-beam="${id}"][data-active],
1517
+ [data-beam="${id}"][data-fading],
1518
+ [data-beam="${id}"][data-active]::after,
1519
+ [data-beam="${id}"][data-fading]::after,
1520
+ [data-beam="${id}"][data-active]::before,
1521
+ [data-beam="${id}"][data-fading]::before,
1522
+ [data-beam="${id}"][data-active] [data-beam-bloom],
1523
+ [data-beam="${id}"][data-fading] [data-beam-bloom] {
1524
+ animation: none !important;
1525
+ }
1526
+ }
1527
+ `;
1528
+ }
1529
+ function generatePulseOuterVariantCSS(options) {
1530
+ const {
1531
+ id,
1532
+ borderRadius,
1533
+ duration,
1534
+ strokeOpacity,
1535
+ innerOpacity,
1536
+ bloomOpacity,
1537
+ colorVariant,
1538
+ staticColors,
1539
+ brightness,
1540
+ saturation,
1541
+ theme,
1542
+ hairlineOpacity = 0
1543
+ } = options;
1544
+ const isDark = theme === "dark";
1545
+ const monoMul = colorVariant === "mono" ? 0.5 : 1;
1546
+ const sStroke = (strokeOpacity * monoMul).toFixed(2);
1547
+ const sInner = (innerOpacity * monoMul).toFixed(2);
1548
+ const sBloom = (bloomOpacity * monoMul).toFixed(2);
1549
+ const hairRGB = isDark ? "70, 70, 70" : "0, 0, 0";
1550
+ const hairOp = hairlineOpacity.toFixed(2);
1551
+ const hairlineLine = `linear-gradient(rgba(${hairRGB}, ${hairOp}), rgba(${hairRGB}, ${hairOp}))`;
1552
+ const { op } = pulseParams("pulse-outside", theme, duration);
1553
+ const sw = 0.95;
1554
+ const sh = 0.9;
1555
+ const glowBlur = isDark ? 3 : 6;
1556
+ const bloomBlur = isDark ? 22.5 : 15;
1557
+ const b = brightness.toFixed(2);
1558
+ const s = saturation.toFixed(2);
1559
+ const strokeAnim = staticColors ? `filter: brightness(${b}) saturate(${s});` : `filter: hue-rotate(calc(var(--beam-hue-base, 0deg) + var(--beam-hue-${id}))) brightness(${b}) saturate(${s});`;
1560
+ const glowBright = `brightness(var(--beam-glow-brightness, ${b})) saturate(var(--beam-glow-saturate, ${s}))`;
1561
+ const coreAnim = staticColors ? `filter: blur(var(--beam-core-blur, ${glowBlur}px)) ${glowBright};` : `filter: blur(var(--beam-core-blur, ${glowBlur}px)) hue-rotate(calc(var(--beam-hue-base, 0deg) + var(--beam-hue-${id}))) ${glowBright};`;
1562
+ const bloomAnim = staticColors ? `filter: blur(var(--beam-bloom-blur, ${bloomBlur}px)) ${glowBright};` : `filter: blur(var(--beam-bloom-blur, ${bloomBlur}px)) hue-rotate(calc(var(--beam-hue-base, 0deg) + var(--beam-hue-${id}))) ${glowBright};`;
1563
+ const strokeGradients = pulseTableGradients(PULSE_OUTER_CORE, colorVariant, id);
1564
+ const coreGradients = pulseTableGradients(PULSE_OUTER_CORE, colorVariant, id);
1565
+ const bloomGradients = pulseTableGradientsStatic(PULSE_OUTER_BLOOM, colorVariant, 1 - op * 0.5);
1566
+ const strokeBackground = hairlineOpacity > 0 ? `${strokeGradients},
1567
+ ${hairlineLine}` : strokeGradients;
1568
+ return `
1569
+ ${pulsePropertyRegs(id)}
1570
+
1571
+ [data-beam="${id}"] {
1572
+ position: relative;
1573
+ border-radius: ${borderRadius}px;
1574
+ overflow: visible;
1575
+ isolation: isolate;
1576
+ }
1577
+
1578
+ [data-beam="${id}"][data-active] {
1579
+ ${pulseWrapperAnimation(id, "beam-fade-in", 0.6)}
1580
+ }
1581
+
1582
+ [data-beam="${id}"][data-fading] {
1583
+ ${pulseWrapperAnimation(id, "beam-fade-out", 0.5)}
1584
+ }
1585
+ ${hairlineOpacity > 0 ? `
1586
+ /* Idle hairline \u2014 painted above the (opaque) child in the inner 1px edge ring so
1587
+ it overlaps a standard inset component border exactly. */
1588
+ [data-beam="${id}"]::after {
1589
+ content: "";
1590
+ position: absolute;
1591
+ inset: 0;
1592
+ border-radius: ${borderRadius}px;
1593
+ padding: 1px;
1594
+ clip-path: inset(0 round ${borderRadius}px);
1595
+ background: ${hairlineLine};
1596
+ -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
1597
+ -webkit-mask-composite: xor;
1598
+ mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
1599
+ mask-composite: exclude;
1600
+ pointer-events: none;
1601
+ z-index: 2;
1602
+ }
1603
+ ` : ""}
1604
+ [data-beam="${id}"][data-active]::after,
1605
+ [data-beam="${id}"][data-fading]::after {
1606
+ content: "";
1607
+ position: absolute;
1608
+ inset: 0;
1609
+ border-radius: ${borderRadius}px;
1610
+ padding: 1px;
1611
+ clip-path: inset(0 round ${borderRadius}px);
1612
+ background: ${strokeBackground};
1613
+ -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
1614
+ -webkit-mask-composite: xor;
1615
+ mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
1616
+ mask-composite: exclude;
1617
+ pointer-events: none;
1618
+ z-index: 2;
1619
+ will-change: opacity, filter;
1620
+ opacity: calc(var(--beam-opacity-${id}) * ${sStroke} * var(--beam-stroke-opacity, 1) * var(--beam-strength, 1));
1621
+ ${strokeAnim}
1622
+ }
1623
+
1624
+ [data-beam="${id}"][data-active]::before,
1625
+ [data-beam="${id}"][data-fading]::before {
1626
+ content: "";
1627
+ position: absolute;
1628
+ inset: -10px;
1629
+ z-index: -1;
1630
+ border-radius: ${borderRadius + 10}px;
1631
+ background: ${coreGradients};
1632
+ transform: scale(${sw}, ${sh});
1633
+ pointer-events: none;
1634
+ will-change: opacity, filter;
1635
+ opacity: calc(var(--beam-opacity-${id}) * ${sInner} * var(--beam-inner-opacity, 1) * var(--beam-strength, 1));
1636
+ ${coreAnim}
1637
+ }
1638
+
1639
+ [data-beam="${id}"] [data-beam-bloom] {
1640
+ display: none;
1641
+ position: absolute;
1642
+ inset: -30px;
1643
+ z-index: -1;
1644
+ border-radius: ${borderRadius + 30}px;
1645
+ background: ${bloomGradients};
1646
+ transform: scale(${sw}, ${sh});
1647
+ pointer-events: none;
1648
+ will-change: transform;
1649
+ opacity: 0;
1650
+ }
1651
+
1652
+ [data-beam="${id}"][data-active] [data-beam-bloom],
1653
+ [data-beam="${id}"][data-fading] [data-beam-bloom] {
1654
+ display: block;
1655
+ opacity: calc(var(--beam-opacity-${id}) * ${sBloom} * var(--beam-bloom-opacity, 1) * var(--beam-strength, 1));
1656
+ ${bloomAnim}
1657
+ }
1658
+
1659
+ @keyframes beam-fade-in-${id} { to { --beam-opacity-${id}: 1; } }
1660
+ @keyframes beam-fade-out-${id} { from { --beam-opacity-${id}: 1; } to { --beam-opacity-${id}: 0; } }
1661
+ ${pausedAnimationsRule(id)}
1662
+
1663
+ @media (prefers-reduced-motion: reduce) {
1664
+ [data-beam="${id}"][data-active],
1665
+ [data-beam="${id}"][data-fading],
1666
+ [data-beam="${id}"][data-active]::after,
1667
+ [data-beam="${id}"][data-fading]::after,
1668
+ [data-beam="${id}"][data-active]::before,
1669
+ [data-beam="${id}"][data-fading]::before,
1670
+ [data-beam="${id}"][data-active] [data-beam-bloom],
1671
+ [data-beam="${id}"][data-fading] [data-beam-bloom] {
1672
+ animation: none !important;
1673
+ }
1674
+ }
1675
+ `;
1676
+ }
1677
+ function generateLineVariantCSS(options) {
1678
+ const {
1679
+ id,
1680
+ borderRadius,
1681
+ borderWidth,
1682
+ duration,
1683
+ strokeOpacity,
1684
+ innerOpacity,
1685
+ bloomOpacity,
1686
+ innerShadow,
1687
+ colorVariant,
1688
+ staticColors,
1689
+ brightness,
1690
+ saturation,
1691
+ hueRange,
1692
+ theme
1693
+ } = options;
1694
+ const innerRadius = Math.max(0, borderRadius - borderWidth);
1695
+ const isDark = theme === "dark";
1696
+ const finalStrokeOpacity = strokeOpacity;
1697
+ const finalInnerOpacity = innerOpacity;
1698
+ const finalBloomOpacity = bloomOpacity;
1699
+ const hueShiftAnimation = staticColors ? "" : `animation: beam-hue-shift-${id} 12s ease-in-out infinite;`;
1700
+ const hueShiftBloomAnimation = staticColors ? "" : `animation: beam-hue-shift-bloom-${id} 8s ease-in-out infinite;`;
1701
+ const hueShiftKeyframes = staticColors ? "" : `
1702
+ @keyframes beam-hue-shift-${id} {
1703
+ 0% { filter: hue-rotate(calc(var(--beam-hue-base, 0deg) - ${hueRange}deg)) brightness(${brightness.toFixed(2)}) saturate(${saturation.toFixed(2)}); }
1704
+ 50% { filter: hue-rotate(calc(var(--beam-hue-base, 0deg) + ${hueRange}deg)) brightness(${brightness.toFixed(2)}) saturate(${saturation.toFixed(2)}); }
1705
+ 100% { filter: hue-rotate(calc(var(--beam-hue-base, 0deg) - ${hueRange}deg)) brightness(${brightness.toFixed(2)}) saturate(${saturation.toFixed(2)}); }
1706
+ }
1707
+
1708
+ @keyframes beam-hue-shift-bloom-${id} {
1709
+ 0% { filter: blur(8px) hue-rotate(calc(var(--beam-hue-base, 0deg) - ${hueRange + 10}deg)) brightness(${brightness.toFixed(2)}) saturate(${saturation.toFixed(2)}); }
1710
+ 50% { filter: blur(8px) hue-rotate(calc(var(--beam-hue-base, 0deg) + ${hueRange + 10}deg)) brightness(${brightness.toFixed(2)}) saturate(${saturation.toFixed(2)}); }
1711
+ 100% { filter: blur(8px) hue-rotate(calc(var(--beam-hue-base, 0deg) - ${hueRange + 10}deg)) brightness(${brightness.toFixed(2)}) saturate(${saturation.toFixed(2)}); }
1712
+ }`;
1713
+ const whiteHighlight = isDark ? `radial-gradient(
1714
+ ellipse calc(24px * var(--beam-w-${id})) calc(28px * var(--beam-h-${id})) at calc(var(--beam-x-${id}) * 100%) calc(100% + 2px),
1715
+ rgba(255, 255, 255, 0.38) 0%,
1716
+ rgba(255, 255, 255, 0.12) 30%,
1717
+ transparent 65%
1718
+ )` : `radial-gradient(
1719
+ ellipse calc(35px * var(--beam-w-${id})) calc(28px * var(--beam-h-${id})) at calc(var(--beam-x-${id}) * 100%) calc(100% + 2px),
1720
+ rgba(0, 0, 0, 0.6) 0%,
1721
+ rgba(0, 0, 0, 0.25) 35%,
1722
+ transparent 70%
1723
+ )`;
1724
+ const colorGradients = getLineColorGradients(colorVariant, isDark, id);
1725
+ const innerGradients = getLineInnerGradients(colorVariant, id);
1726
+ const bloomGradients = getLineBloomGradients(colorVariant, isDark, id);
1727
+ const monoBloomBlur = colorVariant === "mono" ? "filter: blur(6px);" : "";
1728
+ return `
1729
+ @property --beam-x-${id} {
1730
+ syntax: "<number>";
1731
+ initial-value: 0;
1732
+ inherits: true;
1733
+ }
1734
+
1735
+ @property --beam-w-${id} {
1736
+ syntax: "<number>";
1737
+ initial-value: 1;
1738
+ inherits: true;
1739
+ }
1740
+
1741
+ @property --beam-h-${id} {
1742
+ syntax: "<number>";
1743
+ initial-value: 1;
1744
+ inherits: true;
1745
+ }
1746
+
1747
+ @property --beam-spike-${id} {
1748
+ syntax: "<number>";
1749
+ initial-value: 1;
1750
+ inherits: true;
1751
+ }
1752
+
1753
+ @property --beam-spike2-${id} {
1754
+ syntax: "<number>";
1755
+ initial-value: 1;
1756
+ inherits: true;
1757
+ }
1758
+
1759
+ @property --beam-edge-${id} {
1760
+ syntax: "<number>";
1761
+ initial-value: 1;
1762
+ inherits: true;
1763
+ }
1764
+
1765
+ @property --beam-opacity-${id} {
1766
+ syntax: "<number>";
1767
+ initial-value: 0;
1768
+ inherits: true;
1769
+ }
1770
+
1771
+ [data-beam="${id}"] {
1772
+ position: relative;
1773
+ border-radius: ${borderRadius}px;
1774
+ overflow: hidden;
1775
+ }
1776
+
1777
+ [data-beam="${id}"][data-active] {
1778
+ animation:
1779
+ beam-travel-${id} ${duration}s linear infinite,
1780
+ beam-edge-fade-${id} ${duration}s linear infinite,
1781
+ beam-breathe-${id} ${(duration * 1.3).toFixed(1)}s ease-in-out infinite,
1782
+ beam-spike-${id} ${(duration * 1.33).toFixed(1)}s ease-in-out infinite,
1783
+ beam-spike2-${id} ${(duration * 1.7).toFixed(1)}s ease-in-out infinite,
1784
+ beam-fade-in-${id} 0.6s ease forwards;
1785
+ }
1786
+
1787
+ [data-beam="${id}"][data-fading] {
1788
+ animation:
1789
+ beam-travel-${id} ${duration}s linear infinite,
1790
+ beam-edge-fade-${id} ${duration}s linear infinite,
1791
+ beam-breathe-${id} ${(duration * 1.3).toFixed(1)}s ease-in-out infinite,
1792
+ beam-spike-${id} ${(duration * 1.33).toFixed(1)}s ease-in-out infinite,
1793
+ beam-spike2-${id} ${(duration * 1.7).toFixed(1)}s ease-in-out infinite,
1794
+ beam-fade-out-${id} 0.5s ease forwards;
1795
+ }
1796
+
1797
+ [data-beam="${id}"][data-active]::after,
1798
+ [data-beam="${id}"][data-fading]::after {
1799
+ content: "";
1800
+ position: absolute;
1801
+ inset: 0;
1802
+ border-radius: ${innerRadius}px;
1803
+ padding: ${borderWidth}px;
1804
+ clip-path: inset(0 round ${borderRadius}px);
1805
+ background: ${whiteHighlight}, ${colorGradients};
1806
+ -webkit-mask:
1807
+ radial-gradient(
1808
+ ellipse calc(78px * var(--beam-w-${id})) calc(60px * var(--beam-h-${id})) at calc(var(--beam-x-${id}) * 100%) 100%,
1809
+ white 0%, rgba(255, 255, 255, 0.5) 45%, transparent 100%
1810
+ ),
1811
+ linear-gradient(#fff 0 0) content-box,
1812
+ linear-gradient(#fff 0 0);
1813
+ -webkit-mask-composite: source-in, xor;
1814
+ mask:
1815
+ radial-gradient(
1816
+ ellipse calc(78px * var(--beam-w-${id})) calc(60px * var(--beam-h-${id})) at calc(var(--beam-x-${id}) * 100%) 100%,
1817
+ white 0%, rgba(255, 255, 255, 0.5) 45%, transparent 100%
1818
+ ),
1819
+ linear-gradient(#fff 0 0) content-box,
1820
+ linear-gradient(#fff 0 0);
1821
+ mask-composite: intersect, exclude;
1822
+ pointer-events: none;
1823
+ z-index: 2;
1824
+ opacity: calc(var(--beam-opacity-${id}) * var(--beam-edge-${id}) * ${finalStrokeOpacity.toFixed(2)} * var(--beam-stroke-opacity, 1) * var(--beam-strength, 1));
1825
+ ${hueShiftAnimation}
1826
+ }
1827
+
1828
+ [data-beam="${id}"][data-active]::before,
1829
+ [data-beam="${id}"][data-fading]::before {
1830
+ content: "";
1831
+ position: absolute;
1832
+ inset: 0;
1833
+ border-radius: ${borderRadius}px;
1834
+ background: ${innerGradients};
1835
+ box-shadow: inset 0 0 9px 1px ${innerShadow};
1836
+ -webkit-mask-image:
1837
+ radial-gradient(
1838
+ ellipse calc(78px * var(--beam-w-${id})) calc(60px * var(--beam-h-${id})) at calc(var(--beam-x-${id}) * 100%) 100%,
1839
+ white 0%, rgba(255, 255, 255, 0.5) 45%, transparent 100%
1840
+ ),
1841
+ linear-gradient(white, transparent 28px, transparent calc(100% - 28px), white),
1842
+ linear-gradient(to right, white, transparent 28px, transparent calc(100% - 28px), white);
1843
+ -webkit-mask-composite: source-in, source-over;
1844
+ mask-image:
1845
+ radial-gradient(
1846
+ ellipse calc(78px * var(--beam-w-${id})) calc(60px * var(--beam-h-${id})) at calc(var(--beam-x-${id}) * 100%) 100%,
1847
+ white 0%, rgba(255, 255, 255, 0.5) 45%, transparent 100%
1848
+ ),
1849
+ linear-gradient(white, transparent 28px, transparent calc(100% - 28px), white),
1850
+ linear-gradient(to right, white, transparent 28px, transparent calc(100% - 28px), white);
1851
+ mask-composite: intersect, add;
1852
+ pointer-events: none;
1853
+ z-index: 1;
1854
+ opacity: calc(var(--beam-opacity-${id}) * var(--beam-edge-${id}) * ${finalInnerOpacity.toFixed(2)} * var(--beam-inner-opacity, 1) * var(--beam-strength, 1));
1855
+ clip-path: inset(0 round ${borderRadius}px);
1856
+ ${hueShiftAnimation}
1857
+ }
1858
+
1859
+ [data-beam="${id}"] [data-beam-bloom] {
1860
+ display: none;
1861
+ position: absolute;
1862
+ inset: 0;
1863
+ border-radius: ${innerRadius}px;
1864
+ clip-path: inset(0 round ${borderRadius}px);
1865
+ padding: 0;
1866
+ -webkit-mask: radial-gradient(
1867
+ ellipse calc(84px * var(--beam-w-${id})) calc(110px * var(--beam-h-${id})) at calc(var(--beam-x-${id}) * 100%) 100%,
1868
+ white 0%, rgba(255, 255, 255, 0.5) 35%, transparent 100%
1869
+ );
1870
+ -webkit-mask-composite: source-over;
1871
+ mask: radial-gradient(
1872
+ ellipse calc(84px * var(--beam-w-${id})) calc(110px * var(--beam-h-${id})) at calc(var(--beam-x-${id}) * 100%) 100%,
1873
+ white 0%, rgba(255, 255, 255, 0.5) 35%, transparent 100%
1874
+ );
1875
+ mask-composite: add;
1876
+ background: ${bloomGradients};
1877
+ ${monoBloomBlur}
1878
+ pointer-events: none;
1879
+ z-index: 3;
1880
+ opacity: 0;
1881
+ }
1882
+
1883
+ [data-beam="${id}"][data-active] [data-beam-bloom],
1884
+ [data-beam="${id}"][data-fading] [data-beam-bloom] {
1885
+ display: block;
1886
+ opacity: calc(var(--beam-opacity-${id}) * var(--beam-edge-${id}) * ${finalBloomOpacity.toFixed(2)} * var(--beam-bloom-opacity, 1) * var(--beam-strength, 1));
1887
+ ${hueShiftBloomAnimation}
1888
+ }
1889
+
1890
+ @keyframes beam-travel-${id} {
1891
+ 0% { --beam-x-${id}: 0.06; --beam-w-${id}: 0.5; }
1892
+ 10% { --beam-x-${id}: 0.15; --beam-w-${id}: 0.8; }
1893
+ 20% { --beam-x-${id}: 0.25; --beam-w-${id}: 1.1; }
1894
+ 30% { --beam-x-${id}: 0.35; --beam-w-${id}: 1.3; }
1895
+ 40% { --beam-x-${id}: 0.44; --beam-w-${id}: 1.45; }
1896
+ 50% { --beam-x-${id}: 0.5; --beam-w-${id}: 1.5; }
1897
+ 60% { --beam-x-${id}: 0.56; --beam-w-${id}: 1.45; }
1898
+ 70% { --beam-x-${id}: 0.65; --beam-w-${id}: 1.3; }
1899
+ 80% { --beam-x-${id}: 0.75; --beam-w-${id}: 1.1; }
1900
+ 90% { --beam-x-${id}: 0.85; --beam-w-${id}: 0.8; }
1901
+ 100% { --beam-x-${id}: 0.94; --beam-w-${id}: 0.5; }
1902
+ }
1903
+
1904
+ @keyframes beam-edge-fade-${id} {
1905
+ 0% { --beam-edge-${id}: 0; }
1906
+ 12.5% { --beam-edge-${id}: 0; }
1907
+ 32.5% { --beam-edge-${id}: 1; }
1908
+ 67.5% { --beam-edge-${id}: 1; }
1909
+ 87.5% { --beam-edge-${id}: 0; }
1910
+ 100% { --beam-edge-${id}: 0; }
1911
+ }
1912
+
1913
+ @keyframes beam-breathe-${id} {
1914
+ 0%, 100% { --beam-h-${id}: 0.8; }
1915
+ 25% { --beam-h-${id}: 1.25; }
1916
+ 55% { --beam-h-${id}: 0.85; }
1917
+ 80% { --beam-h-${id}: 1.3; }
1918
+ }
1919
+
1920
+ @keyframes beam-spike-${id} {
1921
+ 0% { --beam-spike-${id}: 0.8; }
1922
+ 25% { --beam-spike-${id}: 1.3; }
1923
+ 50% { --beam-spike-${id}: 0.9; }
1924
+ 75% { --beam-spike-${id}: 1.4; }
1925
+ 100% { --beam-spike-${id}: 0.8; }
1926
+ }
1927
+
1928
+ @keyframes beam-spike2-${id} {
1929
+ 0% { --beam-spike2-${id}: 1.2; }
1930
+ 25% { --beam-spike2-${id}: 0.7; }
1931
+ 50% { --beam-spike2-${id}: 1.4; }
1932
+ 75% { --beam-spike2-${id}: 0.8; }
1933
+ 100% { --beam-spike2-${id}: 1.2; }
1934
+ }
1935
+
1936
+ @keyframes beam-fade-in-${id} {
1937
+ to { --beam-opacity-${id}: 1; }
1938
+ }
1939
+
1940
+ @keyframes beam-fade-out-${id} {
1941
+ from { --beam-opacity-${id}: 1; }
1942
+ to { --beam-opacity-${id}: 0; }
1943
+ }
1944
+ ${hueShiftKeyframes}
1945
+ ${pausedAnimationsRule(id)}
1946
+ `;
1947
+ }
1948
+
1949
+ // src/border-beam/pulseDriver.ts
1950
+ var instances = /* @__PURE__ */ new Set();
1951
+ var rafId = null;
1952
+ var lastFrame = 0;
1953
+ var FRAME_INTERVAL = 1e3 / 30 - 2;
1954
+ var TWO_PI = Math.PI * 2;
1955
+ function pingPong(phase) {
1956
+ return (1 - Math.cos(TWO_PI * phase)) / 2;
1957
+ }
1958
+ function frame(ts) {
1959
+ rafId = requestAnimationFrame(frame);
1960
+ if (ts - lastFrame < FRAME_INTERVAL) return;
1961
+ lastFrame = ts;
1962
+ const tSec = ts / 1e3;
1963
+ instances.forEach(({ el, config }) => {
1964
+ for (const osc of config.oscillators) {
1965
+ const phase = (tSec - osc.delay) / osc.period;
1966
+ const value = osc.a + (osc.b - osc.a) * pingPong(phase);
1967
+ el.style.setProperty(
1968
+ osc.prop,
1969
+ osc.unit === "px" ? `${value.toFixed(2)}px` : value.toFixed(4)
1970
+ );
1971
+ }
1972
+ if (config.hue) {
1973
+ const { prop, range, period, continuous } = config.hue;
1974
+ const value = continuous ? tSec / period % 1 * range : -range + 2 * range * pingPong(tSec / period);
1975
+ el.style.setProperty(prop, `${value.toFixed(2)}deg`);
1976
+ }
1977
+ });
1978
+ }
1979
+ function startLoop() {
1980
+ if (rafId == null) {
1981
+ lastFrame = 0;
1982
+ rafId = requestAnimationFrame(frame);
1983
+ }
1984
+ }
1985
+ function stopLoopIfIdle() {
1986
+ if (instances.size === 0 && rafId != null) {
1987
+ cancelAnimationFrame(rafId);
1988
+ rafId = null;
1989
+ }
1990
+ }
1991
+ function registerPulseInstance(el, config) {
1992
+ const instance = { el, config };
1993
+ instances.add(instance);
1994
+ startLoop();
1995
+ return () => {
1996
+ instances.delete(instance);
1997
+ stopLoopIfIdle();
1998
+ };
1999
+ }
2000
+ function documentTheme() {
2001
+ if (typeof document === "undefined") return null;
2002
+ const root = document.documentElement;
2003
+ const attr = root.getAttribute("data-theme");
2004
+ if (attr === "dark" || attr === "light") return attr;
2005
+ if (root.classList.contains("dark")) return "dark";
2006
+ if (root.classList.contains("light")) return "light";
2007
+ return null;
2008
+ }
2009
+ function useSystemTheme(enabled) {
2010
+ const [theme, setTheme] = useState(() => {
2011
+ const fromDocument = documentTheme();
2012
+ if (fromDocument) return fromDocument;
2013
+ if (typeof window === "undefined") return "dark";
2014
+ return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
2015
+ });
2016
+ useEffect(() => {
2017
+ if (!enabled || typeof window === "undefined") return;
2018
+ const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
2019
+ const resolve = () => {
2020
+ setTheme(documentTheme() ?? (mediaQuery.matches ? "dark" : "light"));
2021
+ };
2022
+ resolve();
2023
+ mediaQuery.addEventListener("change", resolve);
2024
+ const observer = typeof MutationObserver !== "undefined" ? new MutationObserver(resolve) : null;
2025
+ observer?.observe(document.documentElement, {
2026
+ attributes: true,
2027
+ attributeFilter: ["class", "data-theme"]
2028
+ });
2029
+ return () => {
2030
+ mediaQuery.removeEventListener("change", resolve);
2031
+ observer?.disconnect();
2032
+ };
2033
+ }, [enabled]);
2034
+ return theme;
2035
+ }
2036
+ function resolveTheme(theme, systemTheme) {
2037
+ return theme === "auto" ? systemTheme : theme;
2038
+ }
2039
+ var BorderBeam = forwardRef(
2040
+ function BorderBeam2({
2041
+ children,
2042
+ size = "md",
2043
+ colorVariant = "colorful",
2044
+ theme = "dark",
2045
+ staticColors = false,
2046
+ duration,
2047
+ active = true,
2048
+ borderRadius: customBorderRadius,
2049
+ brightness: brightnessProp,
2050
+ saturation,
2051
+ hueRange = 30,
2052
+ strength = 1,
2053
+ className,
2054
+ style,
2055
+ onActivate,
2056
+ onDeactivate,
2057
+ onAnimationEnd: consumerOnAnimationEnd,
2058
+ ...props
2059
+ }, ref) {
2060
+ const baseId = useId();
2061
+ const id = baseId.replace(/:/g, "-");
2062
+ const internalRef = useRef(null);
2063
+ const [isActive, setIsActive] = useState(active);
2064
+ const [isFading, setIsFading] = useState(false);
2065
+ const [isVisible, setIsVisible] = useState(true);
2066
+ const [detectedRadius, setDetectedRadius] = useState(null);
2067
+ const [pulseGlowScale, setPulseGlowScale] = useState({ x: 1, y: 1 });
2068
+ const effectsOn = isActive || isFading;
2069
+ const systemTheme = useSystemTheme(effectsOn);
2070
+ useEffect(() => {
2071
+ if (!effectsOn || customBorderRadius != null) return;
2072
+ const el = internalRef.current;
2073
+ if (!el) return;
2074
+ const detect = () => {
2075
+ const child = el.firstElementChild;
2076
+ if (!child) return;
2077
+ const computed = getComputedStyle(child);
2078
+ const raw = parseFloat(computed.borderTopLeftRadius);
2079
+ if (!isNaN(raw) && raw > 0) {
2080
+ setDetectedRadius(raw);
2081
+ }
2082
+ };
2083
+ detect();
2084
+ const observer = new MutationObserver(detect);
2085
+ observer.observe(el, { childList: true, subtree: false });
2086
+ return () => observer.disconnect();
2087
+ }, [effectsOn, customBorderRadius, children]);
2088
+ useEffect(() => {
2089
+ if (active && !isActive && !isFading) {
2090
+ setIsActive(true);
2091
+ } else if (!active && isActive && !isFading) {
2092
+ setIsFading(true);
2093
+ }
2094
+ }, [active, isActive, isFading]);
2095
+ useEffect(() => {
2096
+ if (!effectsOn) return;
2097
+ const el = internalRef.current;
2098
+ if (!el || typeof IntersectionObserver === "undefined") return;
2099
+ const observer = new IntersectionObserver(
2100
+ (entries) => {
2101
+ for (const entry of entries) setIsVisible(entry.isIntersecting);
2102
+ },
2103
+ // Start animating slightly before the element scrolls into view.
2104
+ { rootMargin: "256px" }
2105
+ );
2106
+ observer.observe(el);
2107
+ return () => observer.disconnect();
2108
+ }, [effectsOn]);
2109
+ useEffect(() => {
2110
+ if (!effectsOn || size !== "pulse-outside") {
2111
+ setPulseGlowScale({ x: 1, y: 1 });
2112
+ return;
2113
+ }
2114
+ const el = internalRef.current;
2115
+ if (!el) return;
2116
+ const REF_WIDTH = 350;
2117
+ const REF_HEIGHT = 140;
2118
+ const MIN_SCALE = 0.35;
2119
+ const MAX_SCALE = 4;
2120
+ const clamp = (value) => Math.max(MIN_SCALE, Math.min(MAX_SCALE, value));
2121
+ const measure = () => {
2122
+ const child2 = el.firstElementChild;
2123
+ if (!child2) return;
2124
+ const rect = child2.getBoundingClientRect();
2125
+ if (!rect.width || !rect.height) return;
2126
+ const x = +clamp(rect.width / REF_WIDTH).toFixed(3);
2127
+ const y = +clamp(rect.height / REF_HEIGHT).toFixed(3);
2128
+ setPulseGlowScale((prev) => prev.x === x && prev.y === y ? prev : { x, y });
2129
+ };
2130
+ measure();
2131
+ if (typeof ResizeObserver === "undefined") return;
2132
+ const child = el.firstElementChild;
2133
+ if (!child) return;
2134
+ const resizeObserver = new ResizeObserver(measure);
2135
+ resizeObserver.observe(child);
2136
+ return () => resizeObserver.disconnect();
2137
+ }, [effectsOn, size, children]);
2138
+ const handleAnimationEnd = useCallback(
2139
+ (e) => {
2140
+ const animationName = e.animationName;
2141
+ if (animationName.includes("fade-out")) {
2142
+ setIsActive(false);
2143
+ setIsFading(false);
2144
+ onDeactivate?.();
2145
+ } else if (animationName.includes("fade-in")) {
2146
+ onActivate?.();
2147
+ }
2148
+ consumerOnAnimationEnd?.(e);
2149
+ },
2150
+ [onActivate, onDeactivate, consumerOnAnimationEnd]
2151
+ );
2152
+ const resolvedTheme = resolveTheme(theme, systemTheme);
2153
+ const themeConfig = sizeThemePresets[size][resolvedTheme];
2154
+ const sizeConfig = sizePresets[size];
2155
+ const isPulse = size === "pulse-inner" || size === "pulse-outside";
2156
+ const finalBorderRadius = customBorderRadius ?? detectedRadius ?? sizeConfig.borderRadius;
2157
+ const finalDuration = duration ?? (size === "line" ? 3.1 : isPulse ? 2.3 : 1.96);
2158
+ const finalSaturation = saturation ?? themeConfig.saturation;
2159
+ const finalBrightness = brightnessProp ?? themeConfig.brightness ?? 1.3;
2160
+ const finalHueRange = size === "line" ? Math.min(hueRange, 13) : hueRange;
2161
+ const finalStaticColors = colorVariant === "mono" ? true : staticColors;
2162
+ const cssStyles = useMemo(
2163
+ () => !effectsOn ? "" : generateBeamCSS({
2164
+ id,
2165
+ borderRadius: finalBorderRadius,
2166
+ borderWidth: sizeConfig.borderWidth,
2167
+ duration: finalDuration,
2168
+ strokeOpacity: themeConfig.strokeOpacity,
2169
+ innerOpacity: themeConfig.innerOpacity,
2170
+ bloomOpacity: themeConfig.bloomOpacity,
2171
+ innerShadow: themeConfig.innerShadow,
2172
+ size,
2173
+ colorVariant,
2174
+ staticColors: finalStaticColors,
2175
+ brightness: finalBrightness,
2176
+ saturation: finalSaturation,
2177
+ hueRange: finalHueRange,
2178
+ theme: resolvedTheme,
2179
+ hairlineOpacity: themeConfig.hairlineOpacity
2180
+ }),
2181
+ [
2182
+ effectsOn,
2183
+ id,
2184
+ finalBorderRadius,
2185
+ sizeConfig.borderWidth,
2186
+ finalDuration,
2187
+ themeConfig.strokeOpacity,
2188
+ themeConfig.innerOpacity,
2189
+ themeConfig.bloomOpacity,
2190
+ themeConfig.innerShadow,
2191
+ themeConfig.hairlineOpacity,
2192
+ size,
2193
+ colorVariant,
2194
+ finalStaticColors,
2195
+ finalBrightness,
2196
+ finalSaturation,
2197
+ finalHueRange,
2198
+ resolvedTheme
2199
+ ]
2200
+ );
2201
+ const driverConfig = useMemo(
2202
+ () => isPulse ? getPulseDriverConfig(size, resolvedTheme, finalDuration, finalHueRange, finalStaticColors, id) : null,
2203
+ [isPulse, size, resolvedTheme, finalDuration, finalHueRange, finalStaticColors, id]
2204
+ );
2205
+ useEffect(() => {
2206
+ if (!driverConfig) return;
2207
+ if (!(isActive || isFading) || !isVisible) return;
2208
+ const el = internalRef.current;
2209
+ if (!el) return;
2210
+ if (typeof window !== "undefined" && window.matchMedia?.("(prefers-reduced-motion: reduce)").matches) {
2211
+ return;
2212
+ }
2213
+ return registerPulseInstance(el, driverConfig);
2214
+ }, [driverConfig, isActive, isFading, isVisible]);
2215
+ const setRefs = useCallback(
2216
+ (node) => {
2217
+ internalRef.current = node;
2218
+ if (typeof ref === "function") {
2219
+ ref(node);
2220
+ } else if (ref) {
2221
+ ref.current = node;
2222
+ }
2223
+ },
2224
+ [ref]
2225
+ );
2226
+ const mergedStyle = {
2227
+ ...style ?? {},
2228
+ "--beam-strength": Math.max(0, Math.min(1, strength)),
2229
+ ...size === "pulse-outside" ? { "--pulse-glow-sx": pulseGlowScale.x, "--pulse-glow-sy": pulseGlowScale.y } : {}
2230
+ };
2231
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
2232
+ effectsOn && /* @__PURE__ */ jsx("style", { children: cssStyles }),
2233
+ /* @__PURE__ */ jsxs(
2234
+ "div",
2235
+ {
2236
+ ...props,
2237
+ ref: setRefs,
2238
+ "data-beam": id,
2239
+ "data-active": isActive && !isFading ? "" : void 0,
2240
+ "data-fading": isFading ? "" : void 0,
2241
+ "data-paused": isActive && !isFading && !isVisible ? "" : void 0,
2242
+ className,
2243
+ style: mergedStyle,
2244
+ onAnimationEnd: handleAnimationEnd,
2245
+ children: [
2246
+ children,
2247
+ /* @__PURE__ */ jsx("div", { "data-beam-bloom": true })
2248
+ ]
2249
+ }
2250
+ )
2251
+ ] });
2252
+ }
2253
+ );
2254
+ var ROTATE_SIZES = /* @__PURE__ */ new Set(["sm", "md", "line"]);
2255
+ var REDUCED_MOTION_QUERY = "(prefers-reduced-motion: reduce)";
2256
+ function subscribeReducedMotion(onChange) {
2257
+ if (typeof window === "undefined" || !window.matchMedia) return () => {
2258
+ };
2259
+ const mediaQuery = window.matchMedia(REDUCED_MOTION_QUERY);
2260
+ mediaQuery.addEventListener("change", onChange);
2261
+ return () => mediaQuery.removeEventListener("change", onChange);
2262
+ }
2263
+ function readReducedMotion() {
2264
+ if (typeof window === "undefined" || !window.matchMedia) return false;
2265
+ return window.matchMedia(REDUCED_MOTION_QUERY).matches;
2266
+ }
2267
+ function readReducedMotionServer() {
2268
+ return false;
2269
+ }
2270
+ function BrandBeam({
2271
+ children,
2272
+ size = "md",
2273
+ active = true,
2274
+ strength,
2275
+ borderRadius,
2276
+ className
2277
+ }) {
2278
+ const reducedMotion = useSyncExternalStore(
2279
+ subscribeReducedMotion,
2280
+ readReducedMotion,
2281
+ readReducedMotionServer
2282
+ );
2283
+ const effectiveActive = active && !(reducedMotion && ROTATE_SIZES.has(size));
2284
+ return /* @__PURE__ */ jsx(
2285
+ BorderBeam,
2286
+ {
2287
+ size,
2288
+ colorVariant: "brand",
2289
+ theme: "auto",
2290
+ active: effectiveActive,
2291
+ strength,
2292
+ borderRadius,
2293
+ className,
2294
+ children
2295
+ }
2296
+ );
2297
+ }
2298
+
2299
+ export { BrandBeam };
2300
+ //# sourceMappingURL=brand-beam.js.map
2301
+ //# sourceMappingURL=brand-beam.js.map