@hraness/design-kit 0.31.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 (345) hide show
  1. package/ARTICLE_COPY.md +208 -0
  2. package/HERO_FIELDS.md +55 -0
  3. package/ICONS.md +56 -0
  4. package/LANTERN_MATERIAL.md +60 -0
  5. package/LICENSE +21 -0
  6. package/MARKETING_COPY.md +49 -0
  7. package/MARKETING_PRESET.md +108 -0
  8. package/PALETTES.md +90 -0
  9. package/PAPER_THEME.md +128 -0
  10. package/README.md +745 -0
  11. package/STATUS_PAGES.md +67 -0
  12. package/STYLE.md +245 -0
  13. package/WRITING.md +72 -0
  14. package/dist/browser/index.js +2345 -0
  15. package/dist/chunk-44djxk16.js +6872 -0
  16. package/dist/chunk-5gtx3pza.js +9 -0
  17. package/dist/chunk-77391vmq.js +454 -0
  18. package/dist/chunk-7b1586eb.js +1209 -0
  19. package/dist/chunk-8834fh4n.js +6 -0
  20. package/dist/chunk-9t8xyqte.js +870 -0
  21. package/dist/chunk-cejpzyfh.js +446 -0
  22. package/dist/chunk-eh71jz57.js +429 -0
  23. package/dist/chunk-evb02bc1.js +516 -0
  24. package/dist/chunk-h4k7yv6x.js +368 -0
  25. package/dist/chunk-he8eznb1.js +760 -0
  26. package/dist/chunk-mr1vdcjq.js +404 -0
  27. package/dist/chunk-wzvdn8ey.js +116 -0
  28. package/dist/fonts/nebula-sans/social-fonts.generated.js +53 -0
  29. package/dist/icons.js +48 -0
  30. package/dist/index.js +237 -0
  31. package/dist/launch.js +41 -0
  32. package/dist/mockups/client.js +422 -0
  33. package/dist/mockups/index.js +1850 -0
  34. package/dist/portfolio.js +1549 -0
  35. package/dist/provider-marks.js +19 -0
  36. package/dist/react/charts.js +11 -0
  37. package/dist/react/hero-backdrop.js +8 -0
  38. package/dist/react/index.js +7252 -0
  39. package/dist/react/platform-install.js +10 -0
  40. package/dist/react/server.js +137 -0
  41. package/dist/stylex-manifest.json +1 -0
  42. package/dist/stylex.css +5392 -0
  43. package/dist/syntax-highlighting.js +15 -0
  44. package/dist/testing.js +250 -0
  45. package/package.json +377 -0
  46. package/portfolio-inventory.json +31 -0
  47. package/scripts/check-lantern-material-snapshot.d.mts +26 -0
  48. package/scripts/check-lantern-material-snapshot.mjs +126 -0
  49. package/scripts/check-marketing-snapshot.d.mts +12 -0
  50. package/scripts/check-marketing-snapshot.mjs +58 -0
  51. package/scripts/lantern-material-snapshot.ts +101 -0
  52. package/scripts/marketing-textures.ts +48 -0
  53. package/scripts/paper-theme-snapshot.ts +97 -0
  54. package/scripts/product-marketing-snapshot.ts +149 -0
  55. package/src/appearance-menu.css +266 -0
  56. package/src/appearance.ts +32 -0
  57. package/src/article-html.ts +269 -0
  58. package/src/article.ts +686 -0
  59. package/src/browser/appearance-menu.ts +604 -0
  60. package/src/browser/artifact-share.ts +164 -0
  61. package/src/browser/design-palette.ts +197 -0
  62. package/src/browser/foil.ts +124 -0
  63. package/src/browser/hero-light.ts +11 -0
  64. package/src/browser/index.ts +29 -0
  65. package/src/browser/status-field.ts +432 -0
  66. package/src/browser/status-page.ts +100 -0
  67. package/src/browser/sticky-offset.ts +82 -0
  68. package/src/browser/theme-color-sync.ts +213 -0
  69. package/src/charts.css +7 -0
  70. package/src/compiler-components.css +34 -0
  71. package/src/compiler-foundation.css +18 -0
  72. package/src/compiler-palettes.css +7 -0
  73. package/src/compiler-tokens.css +342 -0
  74. package/src/components.css +3 -0
  75. package/src/design-gallery.css +431 -0
  76. package/src/effects.css +14 -0
  77. package/src/fonts/geist-mono/GeistMono[wght].woff2 +0 -0
  78. package/src/fonts/geist-mono/OFL.txt +93 -0
  79. package/src/fonts/geist-mono/PROVENANCE.md +12 -0
  80. package/src/fonts/instrument-serif/OFL.txt +93 -0
  81. package/src/fonts/instrument-serif/UPSTREAM.md +14 -0
  82. package/src/fonts/instrument-serif/instrument-serif-latin-400.woff2 +0 -0
  83. package/src/fonts/nebula-sans/LICENSE.txt +96 -0
  84. package/src/fonts/nebula-sans/NebulaSans-Black.woff2 +0 -0
  85. package/src/fonts/nebula-sans/NebulaSans-BlackItalic.woff2 +0 -0
  86. package/src/fonts/nebula-sans/NebulaSans-Bold.otf +0 -0
  87. package/src/fonts/nebula-sans/NebulaSans-Bold.woff2 +0 -0
  88. package/src/fonts/nebula-sans/NebulaSans-BoldItalic.woff2 +0 -0
  89. package/src/fonts/nebula-sans/NebulaSans-Book.otf +0 -0
  90. package/src/fonts/nebula-sans/NebulaSans-Book.woff2 +0 -0
  91. package/src/fonts/nebula-sans/NebulaSans-BookItalic.woff2 +0 -0
  92. package/src/fonts/nebula-sans/NebulaSans-Light.woff2 +0 -0
  93. package/src/fonts/nebula-sans/NebulaSans-LightItalic.woff2 +0 -0
  94. package/src/fonts/nebula-sans/NebulaSans-Medium.woff2 +0 -0
  95. package/src/fonts/nebula-sans/NebulaSans-MediumItalic.woff2 +0 -0
  96. package/src/fonts/nebula-sans/NebulaSans-Semibold.woff2 +0 -0
  97. package/src/fonts/nebula-sans/NebulaSans-SemiboldItalic.woff2 +0 -0
  98. package/src/fonts/nebula-sans/PROVENANCE.md +14 -0
  99. package/src/fonts/nebula-sans/social-fonts.generated.ts +3873 -0
  100. package/src/fonts.css +106 -0
  101. package/src/icons/act60/act60.svg +5 -0
  102. package/src/icons/act60/application.svg +9 -0
  103. package/src/icons/act60/chapter-compare.svg +3 -0
  104. package/src/icons/act60/decree-residence.svg +6 -0
  105. package/src/icons/act60/estimate.svg +7 -0
  106. package/src/icons/act60/export-services.svg +4 -0
  107. package/src/icons/act60/investor.svg +13 -0
  108. package/src/icons/act60/presence.svg +7 -0
  109. package/src/icons/aicharts/aicharts.svg +6 -0
  110. package/src/icons/aicharts/cost-compare.svg +4 -0
  111. package/src/icons/aicharts/task-audio.svg +7 -0
  112. package/src/icons/aicharts/task-coding.svg +6 -0
  113. package/src/icons/aicharts/task-images.svg +3 -0
  114. package/src/icons/aicharts/task-reasoning.svg +9 -0
  115. package/src/icons/aicharts/task-research.svg +5 -0
  116. package/src/icons/aicharts/task-video.svg +4 -0
  117. package/src/icons/manifest.json +1371 -0
  118. package/src/icons/platonik/conversation.svg +3 -0
  119. package/src/icons/platonik/creature.svg +7 -0
  120. package/src/icons/platonik/economy.svg +4 -0
  121. package/src/icons/platonik/keep-light.svg +6 -0
  122. package/src/icons/platonik/platonik.svg +7 -0
  123. package/src/icons/platonik/spark-route.svg +15 -0
  124. package/src/icons/receipts/act60-retry.receipt.json +888 -0
  125. package/src/icons/receipts/act60.receipt.json +1366 -0
  126. package/src/icons/receipts/aicharts.receipt.json +1546 -0
  127. package/src/icons/receipts/platonik.receipt.json +1011 -0
  128. package/src/icons/receipts/roughday.receipt.json +770 -0
  129. package/src/icons/receipts/shared.receipt.json +1296 -0
  130. package/src/icons/receipts/slopcamera.receipt.json +1495 -0
  131. package/src/icons/receipts/soundfish-retry.receipt.json +460 -0
  132. package/src/icons/receipts/soundfish.receipt.json +1709 -0
  133. package/src/icons/receipts/sponge.receipt.json +1743 -0
  134. package/src/icons/receipts/stripe-history-retry.receipt.json +145 -0
  135. package/src/icons/receipts/stripe-history.receipt.json +1202 -0
  136. package/src/icons/receipts/wordcell.receipt.json +1924 -0
  137. package/src/icons/roughday/finance.svg +7 -0
  138. package/src/icons/roughday/roughday.svg +6 -0
  139. package/src/icons/roughday/technology.svg +4 -0
  140. package/src/icons/roughday/world.svg +4 -0
  141. package/src/icons/sets/act60.json +63 -0
  142. package/src/icons/sets/aicharts.json +63 -0
  143. package/src/icons/sets/platonik.json +39 -0
  144. package/src/icons/sets/roughday.json +25 -0
  145. package/src/icons/sets/shared.json +12 -0
  146. package/src/icons/sets/slopcamera.json +47 -0
  147. package/src/icons/sets/soundfish.json +43 -0
  148. package/src/icons/sets/sponge.json +51 -0
  149. package/src/icons/sets/stripe-history.json +39 -0
  150. package/src/icons/sets/wordcell.json +51 -0
  151. package/src/icons/shared/agent-skill.svg +4 -0
  152. package/src/icons/shared/cli.svg +5 -0
  153. package/src/icons/shared/privacy.svg +3 -0
  154. package/src/icons/shared/research.svg +7 -0
  155. package/src/icons/shared/sdk.svg +3 -0
  156. package/src/icons/slopcamera/diagram.svg +3 -0
  157. package/src/icons/slopcamera/direct-scene.svg +5 -0
  158. package/src/icons/slopcamera/edit-video.svg +17 -0
  159. package/src/icons/slopcamera/mcp.svg +3 -0
  160. package/src/icons/slopcamera/native-world.svg +3 -0
  161. package/src/icons/slopcamera/slopcamera.svg +11 -0
  162. package/src/icons/soundfish/agent-ui.svg +7 -0
  163. package/src/icons/soundfish/collaborate.svg +5 -0
  164. package/src/icons/soundfish/compose.svg +3 -0
  165. package/src/icons/soundfish/hear.svg +6 -0
  166. package/src/icons/soundfish/human-ui.svg +6 -0
  167. package/src/icons/soundfish/share.svg +3 -0
  168. package/src/icons/soundfish/soundfish.svg +6 -0
  169. package/src/icons/sponge/api.svg +3 -0
  170. package/src/icons/sponge/documents.svg +3 -0
  171. package/src/icons/sponge/library.svg +3 -0
  172. package/src/icons/sponge/one-question.svg +5 -0
  173. package/src/icons/sponge/people-direct.svg +5 -0
  174. package/src/icons/sponge/read.svg +3 -0
  175. package/src/icons/sponge/save.svg +4 -0
  176. package/src/icons/sponge/sponge.svg +7 -0
  177. package/src/icons/stripe-history/company-history.svg +3 -0
  178. package/src/icons/stripe-history/evidence.svg +4 -0
  179. package/src/icons/stripe-history/independence.svg +7 -0
  180. package/src/icons/stripe-history/publications.svg +11 -0
  181. package/src/icons/stripe-history/sources.svg +6 -0
  182. package/src/icons/stripe-history/stripe-history.svg +3 -0
  183. package/src/icons/wordcell/backlinks.svg +6 -0
  184. package/src/icons/wordcell/capture.svg +6 -0
  185. package/src/icons/wordcell/git-provenance.svg +4 -0
  186. package/src/icons/wordcell/kb.svg +4 -0
  187. package/src/icons/wordcell/markdown.svg +4 -0
  188. package/src/icons/wordcell/scopes.svg +3 -0
  189. package/src/icons/wordcell/search.svg +7 -0
  190. package/src/icons.generated.ts +734 -0
  191. package/src/icons.ts +51 -0
  192. package/src/index.ts +275 -0
  193. package/src/lantern-material.css +213 -0
  194. package/src/launch.ts +624 -0
  195. package/src/marketing-assets/UPSTREAM.md +18 -0
  196. package/src/marketing-assets/cells.svg +1 -0
  197. package/src/marketing-assets/grain.svg +1 -0
  198. package/src/marketing-forced-colors.css +12 -0
  199. package/src/mockups/client.tsx +415 -0
  200. package/src/mockups/core.tsx +318 -0
  201. package/src/mockups/frames.tsx +368 -0
  202. package/src/mockups/index.ts +14 -0
  203. package/src/mockups/surfaces.tsx +681 -0
  204. package/src/mockups.css +2607 -0
  205. package/src/palette-appearance.ts +45 -0
  206. package/src/palette-bridge.css +124 -0
  207. package/src/palette-color.ts +41 -0
  208. package/src/palette-system.css +721 -0
  209. package/src/palette-themes.ts +23 -0
  210. package/src/palette-tokens.stylex.ts +519 -0
  211. package/src/palettes.css +3 -0
  212. package/src/palettes.ts +161 -0
  213. package/src/paper-theme.css +244 -0
  214. package/src/plain-publication.css +1241 -0
  215. package/src/plain-site.css +397 -0
  216. package/src/platforms.ts +151 -0
  217. package/src/portfolio.generated.json +1595 -0
  218. package/src/portfolio.generated.ts +1596 -0
  219. package/src/portfolio.ts +226 -0
  220. package/src/product-marketing-foundation.css +433 -0
  221. package/src/product-marketing-preset.css +261 -0
  222. package/src/product-marketing.css +2186 -0
  223. package/src/provider-marks.generated.ts +112 -0
  224. package/src/provider-marks.ts +143 -0
  225. package/src/react/animated-rail-stage.stylex.ts +15 -0
  226. package/src/react/animated-rail-stage.tsx +51 -0
  227. package/src/react/app-shell.stylex.ts +104 -0
  228. package/src/react/app-shell.tsx +121 -0
  229. package/src/react/article.tsx +602 -0
  230. package/src/react/aurora-dots-background.tsx +34 -0
  231. package/src/react/charts.stylex.ts +563 -0
  232. package/src/react/charts.tsx +610 -0
  233. package/src/react/chat.stylex.ts +34 -0
  234. package/src/react/chat.tsx +155 -0
  235. package/src/react/design-gallery.tsx +943 -0
  236. package/src/react/design-palette.stylex.ts +124 -0
  237. package/src/react/design-palette.tsx +196 -0
  238. package/src/react/design-theme-context.tsx +41 -0
  239. package/src/react/effects.stylex.ts +325 -0
  240. package/src/react/fader.stylex.ts +71 -0
  241. package/src/react/fader.tsx +151 -0
  242. package/src/react/foil-card-math.ts +100 -0
  243. package/src/react/foil-card-surface.stylex.ts +326 -0
  244. package/src/react/foil-card-surface.tsx +742 -0
  245. package/src/react/foil-mark.tsx +35 -0
  246. package/src/react/foil.stylex.ts +163 -0
  247. package/src/react/haptics.ts +228 -0
  248. package/src/react/hero-backdrop.tsx +22 -0
  249. package/src/react/index.ts +38 -0
  250. package/src/react/keyboard-shortcuts.ts +228 -0
  251. package/src/react/lantern-material-gallery.tsx +166 -0
  252. package/src/react/lantern-material.stylex.ts +39 -0
  253. package/src/react/launch-beats.tsx +73 -0
  254. package/src/react/navigation-rail.stylex.ts +130 -0
  255. package/src/react/navigation-rail.tsx +228 -0
  256. package/src/react/particle-halo.tsx +115 -0
  257. package/src/react/phaser-dots.tsx +501 -0
  258. package/src/react/platform-icons.tsx +94 -0
  259. package/src/react/platform-install.stylex.ts +385 -0
  260. package/src/react/platform-install.tsx +389 -0
  261. package/src/react/playback-transport.stylex.ts +14 -0
  262. package/src/react/playback-transport.tsx +112 -0
  263. package/src/react/procedural-backdrop.tsx +192 -0
  264. package/src/react/procedural-recipe.ts +323 -0
  265. package/src/react/product-marketing.stylex.ts +4469 -0
  266. package/src/react/product-marketing.tsx +1611 -0
  267. package/src/react/production-data-preview-notice.stylex.ts +40 -0
  268. package/src/react/production-data-preview-notice.tsx +34 -0
  269. package/src/react/provider-mark.stylex.ts +132 -0
  270. package/src/react/provider-mark.tsx +120 -0
  271. package/src/react/relative-time.tsx +117 -0
  272. package/src/react/route-state.stylex.ts +39 -0
  273. package/src/react/route-state.tsx +350 -0
  274. package/src/react/server.ts +11 -0
  275. package/src/react/social-kit-panel.tsx +103 -0
  276. package/src/react/sticky-offset.tsx +33 -0
  277. package/src/react/surfaces.stylex.ts +179 -0
  278. package/src/react/surfaces.tsx +330 -0
  279. package/src/react/syntax-code.tsx +33 -0
  280. package/src/react/theme-color-sync.ts +1 -0
  281. package/src/react/theme-resolution.ts +11 -0
  282. package/src/react/theme.stylex.ts +276 -0
  283. package/src/react/theme.tsx +402 -0
  284. package/src/reading.css +72 -0
  285. package/src/relative-time.ts +185 -0
  286. package/src/reset.css +2 -0
  287. package/src/site-shell.css +16 -0
  288. package/src/status-page-html.ts +63 -0
  289. package/src/status-page.css +276 -0
  290. package/src/status-page.ts +323 -0
  291. package/src/styles.css +21 -0
  292. package/src/syntax-code-lexers.ts +303 -0
  293. package/src/syntax-highlighting.css +78 -0
  294. package/src/syntax-highlighting.ts +477 -0
  295. package/src/syntax-tokens.ts +33 -0
  296. package/src/testing.ts +307 -0
  297. package/src/tokens.css +3 -0
  298. package/src/typography.css +86 -0
  299. package/vendor/evilcharts/LICENSE +21 -0
  300. package/vendor/evilcharts/UPSTREAM.md +14 -0
  301. package/vendor/platform-marks/LICENSE +30 -0
  302. package/vendor/platform-marks/UPSTREAM.md +15 -0
  303. package/vendor/platform-marks/apple.svg +1 -0
  304. package/vendor/platform-marks/linux.svg +1 -0
  305. package/vendor/provider-marks/CRUSH-LICENSE.md +134 -0
  306. package/vendor/provider-marks/LICENSE +21 -0
  307. package/vendor/provider-marks/UPSTREAM.md +27 -0
  308. package/vendor/provider-marks/aider.svg +3 -0
  309. package/vendor/provider-marks/crush-heartbit.svg +8 -0
  310. package/vendor/provider-marks/lobehub/alibabacloud-color.svg +1 -0
  311. package/vendor/provider-marks/lobehub/alibabacloud.svg +1 -0
  312. package/vendor/provider-marks/lobehub/amp-color.svg +1 -0
  313. package/vendor/provider-marks/lobehub/amp.svg +1 -0
  314. package/vendor/provider-marks/lobehub/anthropic.svg +1 -0
  315. package/vendor/provider-marks/lobehub/claude-color.svg +1 -0
  316. package/vendor/provider-marks/lobehub/claude.svg +1 -0
  317. package/vendor/provider-marks/lobehub/claudecode-color.svg +1 -0
  318. package/vendor/provider-marks/lobehub/claudecode.svg +1 -0
  319. package/vendor/provider-marks/lobehub/codex-color.svg +1 -0
  320. package/vendor/provider-marks/lobehub/codex.svg +1 -0
  321. package/vendor/provider-marks/lobehub/cursor.svg +1 -0
  322. package/vendor/provider-marks/lobehub/deepseek-color.svg +1 -0
  323. package/vendor/provider-marks/lobehub/deepseek.svg +1 -0
  324. package/vendor/provider-marks/lobehub/devin-color.svg +1 -0
  325. package/vendor/provider-marks/lobehub/devin.svg +1 -0
  326. package/vendor/provider-marks/lobehub/gemini-color.svg +1 -0
  327. package/vendor/provider-marks/lobehub/gemini.svg +1 -0
  328. package/vendor/provider-marks/lobehub/geminicli-color.svg +1 -0
  329. package/vendor/provider-marks/lobehub/geminicli.svg +1 -0
  330. package/vendor/provider-marks/lobehub/goose.svg +1 -0
  331. package/vendor/provider-marks/lobehub/meta-color.svg +1 -0
  332. package/vendor/provider-marks/lobehub/meta.svg +1 -0
  333. package/vendor/provider-marks/lobehub/mistral-color.svg +1 -0
  334. package/vendor/provider-marks/lobehub/mistral.svg +1 -0
  335. package/vendor/provider-marks/lobehub/moonshot.svg +1 -0
  336. package/vendor/provider-marks/lobehub/nvidia-color.svg +1 -0
  337. package/vendor/provider-marks/lobehub/nvidia.svg +1 -0
  338. package/vendor/provider-marks/lobehub/openai.svg +1 -0
  339. package/vendor/provider-marks/lobehub/opencode.svg +1 -0
  340. package/vendor/provider-marks/lobehub/perplexity-color.svg +1 -0
  341. package/vendor/provider-marks/lobehub/perplexity.svg +1 -0
  342. package/vendor/provider-marks/lobehub/qwen-color.svg +1 -0
  343. package/vendor/provider-marks/lobehub/qwen.svg +1 -0
  344. package/vendor/provider-marks/lobehub/xai.svg +1 -0
  345. package/vendor/provider-marks/lobehub/zai.svg +1 -0
@@ -0,0 +1,71 @@
1
+ import * as stylex from "@stylexjs/stylex";
2
+
3
+ export const faderStyles = stylex.create({
4
+ caption: {
5
+ fontSize: "var(--text-caption)",
6
+ },
7
+ compact: {
8
+ "--hraness-design-fader-thumb-block-size": "0.75rem",
9
+ "--hraness-design-fader-thumb-inline-size": "1.5rem",
10
+ "--hraness-design-fader-track-length": "var(--interactive-target-min)",
11
+ },
12
+ fillRail: {
13
+ backgroundColor: "var(--primary)",
14
+ "block-size": "100%",
15
+ "inset-block-end": 0,
16
+ },
17
+ focusVisible: {
18
+ outlineColor: "var(--focus)",
19
+ outlineOffset: 3,
20
+ outlineStyle: "solid",
21
+ outlineWidth: 3,
22
+ },
23
+ horizontalRoot: {
24
+ "min-inline-size": "8rem",
25
+ },
26
+ horizontalTrack: {
27
+ "block-size": "var(--interactive-target-min)",
28
+ "inline-size": "100%",
29
+ },
30
+ labelRow: {
31
+ alignItems: "center",
32
+ display: "flex",
33
+ gap: "var(--space-1)",
34
+ },
35
+ rail: {
36
+ borderRadius: "var(--radius-round)",
37
+ "inline-size": 4,
38
+ "inset-inline": "calc(50% - 2px)",
39
+ position: "absolute",
40
+ },
41
+ root: {
42
+ "--hraness-design-fader-thumb-block-size": "1.125rem",
43
+ "--hraness-design-fader-thumb-inline-size": "1.75rem",
44
+ "--hraness-design-fader-track-length": "6rem",
45
+ display: "grid",
46
+ gap: "var(--space-2)",
47
+ justifyItems: "center",
48
+ "min-inline-size": "var(--interactive-target-min)",
49
+ },
50
+ thumb: {
51
+ backgroundColor: "var(--primary)",
52
+ "block-size": "var(--hraness-design-fader-thumb-block-size)",
53
+ borderColor: "var(--background)",
54
+ borderRadius: "var(--radius-sm)",
55
+ borderStyle: "solid",
56
+ borderWidth: 2,
57
+ boxShadow: "0 0 0 1px var(--line)",
58
+ "inline-size": "var(--hraness-design-fader-thumb-inline-size)",
59
+ left: "50%",
60
+ top: "50%",
61
+ },
62
+ track: {
63
+ "block-size": "var(--hraness-design-fader-track-length)",
64
+ "inline-size": "var(--interactive-target-min)",
65
+ position: "relative",
66
+ },
67
+ trackRail: {
68
+ backgroundColor: "var(--grid)",
69
+ "inset-block": 0,
70
+ },
71
+ });
@@ -0,0 +1,151 @@
1
+ "use client";
2
+
3
+ import type { ReactNode, Ref, RefObject } from "react";
4
+ import {
5
+ Label,
6
+ Slider as AriaSlider,
7
+ SliderFill,
8
+ SliderOutput,
9
+ type SliderProps as AriaSliderProps,
10
+ SliderThumb,
11
+ SliderTrack,
12
+ } from "react-aria-components";
13
+ import * as stylex from "@stylexjs/stylex";
14
+
15
+ import { cn } from "@hraness/ui";
16
+
17
+ import { faderStyles } from "./fader.stylex.js";
18
+
19
+ export type FaderProps = Omit<
20
+ AriaSliderProps<number>,
21
+ "children" | "className"
22
+ > & {
23
+ readonly className?: string;
24
+ readonly density?: "compact" | "default";
25
+ readonly faderRef?: Ref<HTMLDivElement>;
26
+ readonly inputRef?: RefObject<HTMLInputElement | null>;
27
+ readonly label: ReactNode;
28
+ /** Supplementary action rendered beside the real clickable slider label. */
29
+ readonly labelAccessory?: ReactNode;
30
+ readonly showLabel?: boolean;
31
+ readonly showOutput?: boolean;
32
+ };
33
+
34
+ /** A single-value vertical slider with a touch-sized track and native keyboard semantics. */
35
+ export function Fader({
36
+ className,
37
+ density = "default",
38
+ faderRef,
39
+ inputRef,
40
+ label,
41
+ labelAccessory,
42
+ orientation = "vertical",
43
+ showLabel = false,
44
+ showOutput = false,
45
+ ...props
46
+ }: FaderProps) {
47
+ const rootPresentation = stylex.props(
48
+ faderStyles.root,
49
+ density === "compact" && faderStyles.compact,
50
+ orientation === "horizontal" && faderStyles.horizontalRoot,
51
+ );
52
+ const labelRowPresentation = stylex.props(faderStyles.labelRow);
53
+ const captionPresentation = stylex.props(faderStyles.caption);
54
+ const trackPresentation = stylex.props(
55
+ faderStyles.track,
56
+ orientation === "horizontal" && faderStyles.horizontalTrack,
57
+ );
58
+ const trackRailPresentation = stylex.props(
59
+ faderStyles.rail,
60
+ faderStyles.trackRail,
61
+ );
62
+ const fillRailPresentation = stylex.props(faderStyles.rail, faderStyles.fillRail);
63
+
64
+ return (
65
+ <AriaSlider
66
+ {...props}
67
+ className={cn(
68
+ "hraness-design-fader",
69
+ rootPresentation.className,
70
+ className,
71
+ )}
72
+ data-density={density}
73
+ orientation={orientation}
74
+ ref={faderRef}
75
+ >
76
+ {showLabel && labelAccessory !== undefined ? (
77
+ <div
78
+ className={cn(
79
+ "hraness-design-fader__label-row",
80
+ labelRowPresentation.className,
81
+ )}
82
+ >
83
+ <Label
84
+ className={cn(
85
+ "hraness-design-fader__label",
86
+ captionPresentation.className,
87
+ )}
88
+ >
89
+ {label}
90
+ </Label>
91
+ <span className="hraness-design-fader__label-accessory">{labelAccessory}</span>
92
+ </div>
93
+ ) : showLabel ? (
94
+ <Label
95
+ className={cn(
96
+ "hraness-design-fader__label",
97
+ captionPresentation.className,
98
+ )}
99
+ >
100
+ {label}
101
+ </Label>
102
+ ) : (
103
+ <Label className="hraness-design-visually-hidden">{label}</Label>
104
+ )}
105
+ {showOutput ? (
106
+ <SliderOutput
107
+ className={cn(
108
+ "hraness-design-fader__output",
109
+ captionPresentation.className,
110
+ )}
111
+ />
112
+ ) : null}
113
+ <SliderTrack
114
+ className={cn(
115
+ "hraness-design-fader__track",
116
+ trackPresentation.className,
117
+ )}
118
+ >
119
+ <span
120
+ aria-hidden="true"
121
+ className={cn(
122
+ "hraness-design-fader__track-rail",
123
+ trackRailPresentation.className,
124
+ )}
125
+ />
126
+ <SliderFill className="hraness-design-fader__fill">
127
+ <span
128
+ aria-hidden="true"
129
+ className={cn(
130
+ "hraness-design-fader__fill-rail",
131
+ fillRailPresentation.className,
132
+ )}
133
+ />
134
+ </SliderFill>
135
+ <SliderThumb
136
+ className={({ isFocusVisible }) => {
137
+ const thumbPresentation = stylex.props(
138
+ faderStyles.thumb,
139
+ isFocusVisible && faderStyles.focusVisible,
140
+ );
141
+ return cn(
142
+ "hraness-design-fader__thumb",
143
+ thumbPresentation.className,
144
+ );
145
+ }}
146
+ {...(inputRef === undefined ? {} : { inputRef })}
147
+ />
148
+ </SliderTrack>
149
+ </AriaSlider>
150
+ );
151
+ }
@@ -0,0 +1,100 @@
1
+ export interface FoilCardPose {
2
+ /** Horizontal highlight origin, expressed as a percentage from the inline start. */
3
+ readonly highlightX: number;
4
+ /** Vertical highlight origin, expressed as a percentage from the block start. */
5
+ readonly highlightY: number;
6
+ /** Rotation around the horizontal axis, in degrees. */
7
+ readonly rotateX: number;
8
+ /** Rotation around the vertical axis, in degrees. */
9
+ readonly rotateY: number;
10
+ /** Direction of the diffracted spectrum, in degrees. */
11
+ readonly spectrumAngle?: number;
12
+ }
13
+
14
+ export interface FoilCardSeedPose extends FoilCardPose {
15
+ /** Stable gradient phase, in degrees. */
16
+ readonly spectrumAngle: number;
17
+ }
18
+
19
+ function normalizedSeed(seed: string): string {
20
+ const normalized = seed.trim();
21
+ if (normalized.length === 0) {
22
+ throw new RangeError("A foil card seed must contain a non-whitespace character.");
23
+ }
24
+ return normalized;
25
+ }
26
+
27
+ function rounded(value: number, places = 3): number {
28
+ const scale = 10 ** places;
29
+ const result = Math.round(value * scale) / scale;
30
+ return result === 0 ? 0 : result;
31
+ }
32
+
33
+ function unitFromHash(hash: number): number {
34
+ return hash / 4_294_967_296;
35
+ }
36
+
37
+ function mixedHash(hash: number, salt: number): number {
38
+ let value = (hash ^ salt) >>> 0;
39
+ value = Math.imul(value ^ (value >>> 16), 0x21f0aaad);
40
+ value = Math.imul(value ^ (value >>> 15), 0x735a2d97);
41
+ return (value ^ (value >>> 15)) >>> 0;
42
+ }
43
+
44
+ /**
45
+ * Produces a stable unsigned 32-bit identity for visual variation. This is a
46
+ * presentation hash, not a cryptographic or privacy boundary.
47
+ */
48
+ export function hashFoilCardSeed(seed: string): number {
49
+ const normalized = normalizedSeed(seed);
50
+ let hash = 0x811c9dc5;
51
+ for (let index = 0; index < normalized.length; index += 1) {
52
+ hash ^= normalized.charCodeAt(index);
53
+ hash = Math.imul(hash, 0x01000193);
54
+ }
55
+ return hash >>> 0;
56
+ }
57
+
58
+ /** Returns deterministic, bounded first-paint geometry for a seeded card. */
59
+ export function createFoilCardSeedPose(seed: string): FoilCardSeedPose {
60
+ const hash = hashFoilCardSeed(seed);
61
+ const value = (salt: number): number => unitFromHash(mixedHash(hash, salt));
62
+
63
+ return {
64
+ highlightX: rounded(38 + value(0x243f6a88) * 24),
65
+ highlightY: rounded(38 + value(0x85a308d3) * 24),
66
+ rotateX: rounded(-1.2 + value(0x13198a2e) * 2.4),
67
+ rotateY: rounded(-1.4 + value(0x03707344) * 2.8),
68
+ spectrumAngle: rounded(value(0xa4093822) * 360),
69
+ };
70
+ }
71
+
72
+ function finiteUnit(value: number, label: string): number {
73
+ if (!Number.isFinite(value)) {
74
+ throw new RangeError(`${label} must be a finite number.`);
75
+ }
76
+ return Math.min(1, Math.max(0, value));
77
+ }
78
+
79
+ /**
80
+ * Maps normalized pointer coordinates to bounded highlight and tilt values.
81
+ * Values outside the card are clamped so event geometry cannot create an
82
+ * unbounded transform.
83
+ */
84
+ export function createFoilCardPointerPose(
85
+ normalizedX: number,
86
+ normalizedY: number,
87
+ ): FoilCardPose {
88
+ const x = finiteUnit(normalizedX, "Foil card pointer x");
89
+ const y = finiteUnit(normalizedY, "Foil card pointer y");
90
+ const rawSpectrumAngle = Math.atan2(y - 0.5, x - 0.5) * 180 / Math.PI + 90;
91
+ const spectrumAngle = (rawSpectrumAngle + 360) % 360;
92
+
93
+ return {
94
+ highlightX: rounded(x * 100),
95
+ highlightY: rounded(y * 100),
96
+ rotateX: rounded((0.5 - y) * 10),
97
+ rotateY: rounded((x - 0.5) * 12),
98
+ spectrumAngle: rounded(spectrumAngle),
99
+ };
100
+ }
@@ -0,0 +1,326 @@
1
+ import * as stylex from "@stylexjs/stylex";
2
+
3
+ const reducedOrStaticTransform = {
4
+ default: "none",
5
+ "@media (hover: hover) and (pointer: fine) and (prefers-reduced-motion: no-preference) and (forced-colors: none)":
6
+ "perspective(72rem) rotateX(var(--foil-rotate-x, 0deg)) rotateY(var(--foil-rotate-y, 0deg))",
7
+ } as const;
8
+
9
+ const layerDisplay = {
10
+ default: "block",
11
+ "@media (forced-colors: active)": "none",
12
+ } as const;
13
+
14
+ export const foilCardSurfaceStyles = stylex.create({
15
+ base: {
16
+ backgroundColor: {
17
+ default: "var(--card, var(--surface, #111217))",
18
+ "@media (forced-colors: active)": "Canvas",
19
+ },
20
+ borderRadius: "var(--foil-card-radius, var(--radius-lg, 0.75rem))",
21
+ boxShadow: {
22
+ default:
23
+ "0 1.2rem 3.6rem rgb(4 6 12 / 0.24), inset 0 1px 0 rgb(255 255 255 / 0.28)",
24
+ "@media (forced-colors: active)": "none",
25
+ },
26
+ color: "var(--card-foreground, var(--foreground, currentColor))",
27
+ contain: "paint",
28
+ display: "grid",
29
+ isolation: "isolate",
30
+ outlineColor: "currentColor",
31
+ outlineOffset: -1,
32
+ outlineStyle: "solid",
33
+ outlineWidth: {
34
+ default: 1,
35
+ "@media (prefers-contrast: more)": 2,
36
+ },
37
+ overflow: "hidden",
38
+ transformOrigin: "center",
39
+ transformStyle: "preserve-3d",
40
+ },
41
+ interactive: {
42
+ transform: reducedOrStaticTransform,
43
+ transitionDuration: {
44
+ default: "180ms",
45
+ "@media (prefers-reduced-motion: reduce)": "0ms",
46
+ },
47
+ transitionProperty: "transform, box-shadow",
48
+ transitionTimingFunction: "cubic-bezier(0.2, 0.75, 0.25, 1)",
49
+ willChange: "auto",
50
+ },
51
+ active: {
52
+ boxShadow:
53
+ "0 1.75rem 5rem rgb(4 6 12 / 0.32), 0 0 2.4rem rgb(112 177 255 / 0.12), inset 0 1px 0 rgb(255 255 255 / 0.34)",
54
+ willChange: "transform",
55
+ },
56
+ static: {
57
+ transform: "none",
58
+ transitionDuration: "0ms",
59
+ transitionProperty: "none",
60
+ willChange: "auto",
61
+ },
62
+ content: {
63
+ gridColumnEnd: 2,
64
+ gridColumnStart: 1,
65
+ gridRowEnd: 2,
66
+ gridRowStart: 1,
67
+ zIndex: 2,
68
+ },
69
+ layer: {
70
+ display: layerDisplay,
71
+ gridColumnEnd: 2,
72
+ gridColumnStart: 1,
73
+ gridRowEnd: 2,
74
+ gridRowStart: 1,
75
+ pointerEvents: "none",
76
+ },
77
+ baseLayer: {
78
+ backgroundPosition: "var(--foil-light-x, 50%) var(--foil-light-y, 50%)",
79
+ backgroundSize: "160% 160%",
80
+ filter: "saturate(1.08)",
81
+ zIndex: 0,
82
+ },
83
+ spectrumLayer: {
84
+ backgroundPosition: "var(--foil-light-x, 50%) var(--foil-light-y, 50%)",
85
+ backgroundSize: "180% 180%",
86
+ mixBlendMode: "screen",
87
+ transitionDuration: {
88
+ default: "90ms",
89
+ "@media (prefers-reduced-motion: reduce)": "0ms",
90
+ },
91
+ transitionProperty: "background-position, opacity",
92
+ transitionTimingFunction: "linear",
93
+ zIndex: 1,
94
+ },
95
+ sheenLayer: {
96
+ backgroundImage:
97
+ "radial-gradient(circle at var(--foil-light-x, 50%) var(--foil-light-y, 50%), rgb(255 255 255 / 0.94) 0, rgb(255 255 255 / 0.36) 10%, transparent 36%)",
98
+ mixBlendMode: "screen",
99
+ transitionDuration: {
100
+ default: "90ms",
101
+ "@media (prefers-reduced-motion: reduce)": "0ms",
102
+ },
103
+ transitionProperty: "background-image, opacity",
104
+ transitionTimingFunction: "linear",
105
+ zIndex: 1,
106
+ },
107
+ textureLayer: {
108
+ backgroundImage:
109
+ "repeating-linear-gradient(calc(var(--foil-spectrum-angle, 0deg) + 24deg), transparent 0 3px, rgb(255 255 255 / 0.42) 3px 4px, transparent 4px 9px)",
110
+ backgroundSize: "18px 18px",
111
+ mixBlendMode: "soft-light",
112
+ backgroundPosition: "var(--foil-light-x, 50%) var(--foil-light-y, 50%)",
113
+ zIndex: 1,
114
+ },
115
+ ornamentLayer: {
116
+ backgroundRepeat: "no-repeat",
117
+ borderRadius: "inherit",
118
+ filter: "drop-shadow(0 0 0.35rem rgb(255 255 255 / 0.22))",
119
+ mixBlendMode: "screen",
120
+ zIndex: 3,
121
+ },
122
+
123
+ prismBase: {
124
+ backgroundImage:
125
+ "conic-gradient(from var(--foil-spectrum-angle, 0deg) at 50% 50%, #ff5f8f, #ffd66e, #71f4d1, #6bb7ff, #b987ff, #ff5f8f)",
126
+ },
127
+ prismSpectrum: {
128
+ backgroundImage:
129
+ "linear-gradient(calc(var(--foil-spectrum-angle, 0deg) + 112deg), transparent 8%, rgb(255 82 166 / 0.74) 24%, rgb(255 239 132 / 0.76) 39%, rgb(111 245 219 / 0.78) 54%, rgb(106 175 255 / 0.78) 69%, rgb(207 139 255 / 0.72) 84%, transparent 96%)",
130
+ },
131
+ prismTexture: {
132
+ backgroundSize: "14px 14px",
133
+ },
134
+
135
+ auroraBase: {
136
+ backgroundImage:
137
+ "radial-gradient(ellipse at 16% 18%, #9cf7de 0, transparent 42%), radial-gradient(ellipse at 82% 22%, #82b5ff 0, transparent 46%), radial-gradient(ellipse at 54% 88%, #c69bff 0, transparent 48%), linear-gradient(145deg, #152743, #2b1841)",
138
+ },
139
+ auroraSpectrum: {
140
+ backgroundImage:
141
+ "radial-gradient(ellipse at var(--foil-light-x, 50%) var(--foil-light-y, 50%), rgb(167 255 232 / 0.84), rgb(117 169 255 / 0.56) 28%, rgb(208 145 255 / 0.42) 52%, transparent 72%)",
142
+ },
143
+ auroraTexture: {
144
+ backgroundImage:
145
+ "repeating-radial-gradient(ellipse at 50% 120%, transparent 0 11px, rgb(255 255 255 / 0.34) 12px 13px, transparent 14px 23px)",
146
+ backgroundSize: "100% 100%",
147
+ },
148
+
149
+ etchedBase: {
150
+ backgroundImage:
151
+ "linear-gradient(142deg, #d8dce7 0, #666d7d 22%, #f4f5f8 43%, #4f5563 67%, #c9ced9 100%)",
152
+ },
153
+ etchedSpectrum: {
154
+ backgroundImage:
155
+ "linear-gradient(calc(var(--foil-spectrum-angle, 0deg) + 96deg), transparent 12%, rgb(144 217 255 / 0.48) 34%, rgb(255 232 164 / 0.52) 48%, rgb(223 175 255 / 0.46) 62%, transparent 86%)",
156
+ mixBlendMode: "overlay",
157
+ },
158
+ etchedTexture: {
159
+ backgroundImage:
160
+ "repeating-linear-gradient(calc(var(--foil-spectrum-angle, 0deg) + 18deg), rgb(20 24 31 / 0.48) 0 1px, transparent 1px 5px, rgb(255 255 255 / 0.34) 5px 6px, transparent 6px 11px)",
161
+ backgroundSize: "12px 12px",
162
+ mixBlendMode: "overlay",
163
+ },
164
+
165
+ goldBase: {
166
+ backgroundImage:
167
+ "conic-gradient(from var(--foil-spectrum-angle, 0deg) at 48% 46%, #6f4213, #e0a72c, #fff0a6, #a96512, #f6ca50, #7b4915, #6f4213)",
168
+ },
169
+ goldSpectrum: {
170
+ backgroundImage:
171
+ "radial-gradient(ellipse at var(--foil-light-x, 50%) var(--foil-light-y, 50%), rgb(255 252 211 / 0.96) 0, rgb(255 205 78 / 0.62) 25%, rgb(156 85 15 / 0.38) 52%, transparent 74%)",
172
+ },
173
+ goldTexture: {
174
+ backgroundImage:
175
+ "repeating-linear-gradient(calc(var(--foil-spectrum-angle, 0deg) + 38deg), transparent 0 4px, rgb(255 247 190 / 0.52) 5px 6px, transparent 7px 13px)",
176
+ backgroundSize: "15px 15px",
177
+ },
178
+
179
+ fastBase: {
180
+ backgroundImage:
181
+ "linear-gradient(128deg, #061c32 0, #0c6c96 32%, #8cf5e5 47%, #1684ba 62%, #071d38 100%)",
182
+ },
183
+ fastSpectrum: {
184
+ backgroundImage:
185
+ "repeating-linear-gradient(calc(var(--foil-spectrum-angle, 0deg) + 116deg), transparent 0 7%, rgb(178 255 247 / 0.72) 8% 10%, transparent 11% 18%, rgb(135 190 255 / 0.64) 19% 21%, transparent 22% 31%)",
186
+ backgroundSize: "190% 190%",
187
+ },
188
+ fastTexture: {
189
+ backgroundImage:
190
+ "repeating-linear-gradient(116deg, transparent 0 9px, rgb(226 255 255 / 0.52) 10px 11px, transparent 12px 22px)",
191
+ backgroundSize: "24px 24px",
192
+ },
193
+
194
+ maxBase: {
195
+ backgroundImage:
196
+ "radial-gradient(circle at 18% 16%, #ffcf70 0, transparent 34%), radial-gradient(circle at 88% 26%, #54d9db 0, transparent 42%), radial-gradient(circle at 56% 92%, #a06dff 0, transparent 48%), linear-gradient(138deg, #261044, #081d35 56%, #25102e)",
197
+ },
198
+ maxSpectrum: {
199
+ backgroundImage:
200
+ "conic-gradient(from var(--foil-spectrum-angle, 0deg) at var(--foil-light-x, 50%) var(--foil-light-y, 50%), transparent 0 8%, rgb(255 201 92 / 0.72) 18%, rgb(106 245 226 / 0.72) 36%, rgb(117 162 255 / 0.68) 52%, rgb(194 116 255 / 0.72) 69%, rgb(255 120 177 / 0.64) 84%, transparent 96%)",
201
+ },
202
+ maxTexture: {
203
+ backgroundImage:
204
+ "repeating-radial-gradient(circle at 50% 50%, transparent 0 5px, rgb(255 255 255 / 0.38) 6px 7px, transparent 8px 15px)",
205
+ backgroundSize: "32px 32px",
206
+ },
207
+
208
+ baseSubtle: {
209
+ opacity: {
210
+ default: "var(--foil-base-opacity, 0.34)",
211
+ "@media (prefers-contrast: more)": 0.14,
212
+ },
213
+ },
214
+ baseStandard: {
215
+ opacity: {
216
+ default: "var(--foil-base-opacity, 0.44)",
217
+ "@media (prefers-contrast: more)": 0.18,
218
+ },
219
+ },
220
+ baseVivid: {
221
+ opacity: {
222
+ default: "var(--foil-base-opacity, 0.56)",
223
+ "@media (prefers-contrast: more)": 0.22,
224
+ },
225
+ },
226
+ spectrumSubtle: {
227
+ opacity: {
228
+ default: "var(--foil-spectrum-opacity, 0.08)",
229
+ "@media (prefers-contrast: more)": 0.12,
230
+ },
231
+ },
232
+ spectrumStandard: {
233
+ opacity: {
234
+ default: "var(--foil-spectrum-opacity, 0.12)",
235
+ "@media (prefers-contrast: more)": 0.18,
236
+ },
237
+ },
238
+ spectrumVivid: {
239
+ opacity: {
240
+ default: "var(--foil-spectrum-opacity, 0.18)",
241
+ "@media (prefers-contrast: more)": 0.24,
242
+ },
243
+ },
244
+ sheenSubtle: {
245
+ opacity: {
246
+ default: "var(--foil-sheen-opacity, 0.03)",
247
+ "@media (prefers-contrast: more)": 0.1,
248
+ },
249
+ },
250
+ sheenStandard: {
251
+ opacity: {
252
+ default: "var(--foil-sheen-opacity, 0.04)",
253
+ "@media (prefers-contrast: more)": 0.14,
254
+ },
255
+ },
256
+ sheenVivid: {
257
+ opacity: {
258
+ default: "var(--foil-sheen-opacity, 0.06)",
259
+ "@media (prefers-contrast: more)": 0.2,
260
+ },
261
+ },
262
+ textureSubtle: {
263
+ opacity: {
264
+ default: "var(--foil-texture-opacity, 0.04)",
265
+ "@media (prefers-contrast: more)": 0.04,
266
+ },
267
+ },
268
+ textureStandard: {
269
+ opacity: {
270
+ default: "var(--foil-texture-opacity, 0.06)",
271
+ "@media (prefers-contrast: more)": 0.05,
272
+ },
273
+ },
274
+ textureVivid: {
275
+ opacity: {
276
+ default: "var(--foil-texture-opacity, 0.08)",
277
+ "@media (prefers-contrast: more)": 0.06,
278
+ },
279
+ },
280
+ ornamentSubtle: {
281
+ opacity: "var(--foil-ornament-opacity, 0.14)",
282
+ },
283
+ ornamentStandard: {
284
+ opacity: "var(--foil-ornament-opacity, 0.2)",
285
+ },
286
+ ornamentVivid: {
287
+ opacity: "var(--foil-ornament-opacity, 0.26)",
288
+ },
289
+ ornamentNone: {
290
+ display: "none",
291
+ },
292
+ ornamentCorners: {
293
+ backgroundImage:
294
+ "linear-gradient(90deg, transparent, rgb(255 255 255 / 0.88)), linear-gradient(180deg, transparent, rgb(255 255 255 / 0.88)), linear-gradient(270deg, transparent, rgb(255 255 255 / 0.88)), linear-gradient(180deg, rgb(255 255 255 / 0.88), transparent), linear-gradient(90deg, rgb(255 255 255 / 0.88), transparent), linear-gradient(0deg, rgb(255 255 255 / 0.88), transparent), linear-gradient(270deg, rgb(255 255 255 / 0.88), transparent), linear-gradient(0deg, transparent, rgb(255 255 255 / 0.88))",
295
+ backgroundPosition:
296
+ "left 0.8rem top 0.8rem, left 0.8rem top 0.8rem, right 0.8rem top 0.8rem, right 0.8rem top 0.8rem, left 0.8rem bottom 0.8rem, left 0.8rem bottom 0.8rem, right 0.8rem bottom 0.8rem, right 0.8rem bottom 0.8rem",
297
+ backgroundSize:
298
+ "28% 1px, 1px 20%, 28% 1px, 1px 20%, 28% 1px, 1px 20%, 28% 1px, 1px 20%",
299
+ },
300
+ ornamentRails: {
301
+ backgroundImage:
302
+ "repeating-linear-gradient(90deg, rgb(255 255 255 / 0.84) 0 0.45rem, transparent 0.45rem 0.78rem), repeating-linear-gradient(90deg, rgb(255 255 255 / 0.84) 0 0.45rem, transparent 0.45rem 0.78rem), repeating-linear-gradient(0deg, rgb(255 255 255 / 0.72) 0 0.45rem, transparent 0.45rem 0.8rem), repeating-linear-gradient(0deg, rgb(255 255 255 / 0.72) 0 0.45rem, transparent 0.45rem 0.8rem)",
303
+ backgroundPosition: "left 1rem top 0.65rem, left 1rem bottom 0.65rem, left 0.65rem top 1rem, right 0.65rem top 1rem",
304
+ backgroundSize: "calc(100% - 2rem) 1px, calc(100% - 2rem) 1px, 1px calc(100% - 2rem), 1px calc(100% - 2rem)",
305
+ },
306
+ ornamentCircuit: {
307
+ backgroundImage:
308
+ "radial-gradient(circle, rgb(255 255 255 / 0.96) 0 1px, transparent 1.5px), linear-gradient(90deg, rgb(255 255 255 / 0.78), transparent), radial-gradient(circle, rgb(255 255 255 / 0.96) 0 1px, transparent 1.5px), linear-gradient(270deg, rgb(255 255 255 / 0.78), transparent), radial-gradient(circle, rgb(255 255 255 / 0.86) 0 1px, transparent 1.5px), linear-gradient(0deg, rgb(255 255 255 / 0.68), transparent), radial-gradient(circle, rgb(255 255 255 / 0.86) 0 1px, transparent 1.5px), linear-gradient(180deg, rgb(255 255 255 / 0.68), transparent)",
309
+ backgroundPosition:
310
+ "left 0.7rem top 1.4rem, left 0.75rem top 1.45rem, right 0.7rem bottom 1.4rem, right 0.75rem bottom 1.45rem, left 1.35rem bottom 0.7rem, left 1.4rem bottom 0.75rem, right 1.35rem top 0.7rem, right 1.4rem top 0.75rem",
311
+ backgroundSize:
312
+ "5px 5px, 34% 1px, 5px 5px, 34% 1px, 5px 5px, 1px 26%, 5px 5px, 1px 26%",
313
+ },
314
+ ornamentRadial: {
315
+ backgroundImage:
316
+ "repeating-radial-gradient(circle at 0 0, transparent 0 0.38rem, rgb(255 255 255 / 0.7) 0.42rem 0.46rem, transparent 0.5rem 0.84rem), repeating-radial-gradient(circle at 100% 0, transparent 0 0.38rem, rgb(255 255 255 / 0.7) 0.42rem 0.46rem, transparent 0.5rem 0.84rem), repeating-radial-gradient(circle at 0 100%, transparent 0 0.38rem, rgb(255 255 255 / 0.7) 0.42rem 0.46rem, transparent 0.5rem 0.84rem), repeating-radial-gradient(circle at 100% 100%, transparent 0 0.38rem, rgb(255 255 255 / 0.7) 0.42rem 0.46rem, transparent 0.5rem 0.84rem)",
317
+ backgroundPosition: "left top, right top, left bottom, right bottom",
318
+ backgroundSize: "30% 24%, 30% 24%, 30% 24%, 30% 24%",
319
+ },
320
+ ornamentFacets: {
321
+ backgroundImage:
322
+ "conic-gradient(from 270deg at 0 0, transparent 0 24deg, rgb(255 255 255 / 0.82) 25deg 42deg, transparent 43deg), conic-gradient(from 0deg at 100% 0, transparent 0 24deg, rgb(255 255 255 / 0.82) 25deg 42deg, transparent 43deg), conic-gradient(from 180deg at 0 100%, transparent 0 24deg, rgb(255 255 255 / 0.82) 25deg 42deg, transparent 43deg), conic-gradient(from 90deg at 100% 100%, transparent 0 24deg, rgb(255 255 255 / 0.82) 25deg 42deg, transparent 43deg)",
323
+ backgroundPosition: "left top, right top, left bottom, right bottom",
324
+ backgroundSize: "34% 24%, 34% 24%, 34% 24%, 34% 24%",
325
+ },
326
+ });