@almadar/ui 6.59.0 → 6.62.0

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 (91) hide show
  1. package/dist/BehaviorValueFrame-3ORZHPWQ.css +1252 -0
  2. package/dist/BehaviorValueFrame-QYFJEMN5.js +18 -0
  3. package/dist/TraitValueFrame-2WMYJOA5.css +1252 -0
  4. package/dist/TraitValueFrame-X6IL3UST.js +17 -0
  5. package/dist/Typography-KBATMU2V.js +5 -0
  6. package/dist/{UISlotRenderer-YNY7V2UJ.js → UISlotRenderer-NZBV5BUI.js} +12 -10
  7. package/dist/avl/index.cjs +32263 -28103
  8. package/dist/avl/index.d.ts +36 -13
  9. package/dist/avl/index.js +298 -6130
  10. package/dist/{avl-3d-context-BpBKZIbc.d.ts → avl-3d-context-Dxun3-ri.d.ts} +2 -0
  11. package/dist/{chunk-YYYHH5BA.js → chunk-7JRWELUC.js} +4 -6
  12. package/dist/{chunk-723MJUU3.js → chunk-CXQENFO2.js} +1 -1
  13. package/dist/chunk-D4NAA2JW.js +49 -0
  14. package/dist/{chunk-I5QOYW2Z.js → chunk-DXPCAQJU.js} +205 -2
  15. package/dist/{chunk-J755QADM.js → chunk-EDPUQ2ZJ.js} +327 -18
  16. package/dist/{chunk-4ZGXIW3B.js → chunk-ERDYADVZ.js} +1 -1
  17. package/dist/{chunk-7CVXM2KS.js → chunk-EZ5FSNOE.js} +2 -2
  18. package/dist/{chunk-E6MWYQVZ.js → chunk-G6EFTACU.js} +9713 -786
  19. package/dist/{chunk-MZIDOJMD.js → chunk-GVQOTA7T.js} +2 -1
  20. package/dist/{chunk-Q47ZN2DW.js → chunk-N23SVGTH.js} +83 -1
  21. package/dist/{chunk-KJGVLXEN.js → chunk-N4IJS5DD.js} +50 -116
  22. package/dist/{chunk-LZRW6GXG.js → chunk-QOV3TUAA.js} +2 -3
  23. package/dist/chunk-WBWXBA5H.js +434 -0
  24. package/dist/{chunk-V3FGTQUE.js → chunk-ZR45FGW3.js} +7 -1
  25. package/dist/{cn-DIql5232.d.ts → cn-CDIhHCUC.d.ts} +40 -16
  26. package/dist/components/index.cjs +14779 -4354
  27. package/dist/components/index.d.ts +200 -180
  28. package/dist/components/index.js +16 -17
  29. package/dist/context/index.cjs +9 -1
  30. package/dist/context/index.js +3 -1
  31. package/dist/hooks/index.cjs +78 -9
  32. package/dist/hooks/index.d.ts +43 -2
  33. package/dist/hooks/index.js +6 -7
  34. package/dist/lib/drawable/three/index.cjs +361 -27
  35. package/dist/lib/drawable/three/index.d.ts +2 -2
  36. package/dist/lib/drawable/three/index.js +28 -7
  37. package/dist/lib/index.cjs +117 -5
  38. package/dist/lib/index.d.ts +2 -2
  39. package/dist/lib/index.js +99 -6
  40. package/dist/locales/index.cjs +6 -9
  41. package/dist/locales/index.js +2 -2
  42. package/dist/providers/index.cjs +14137 -1311
  43. package/dist/providers/index.d.ts +36 -4
  44. package/dist/providers/index.js +37 -17
  45. package/dist/runtime/index.cjs +28769 -18640
  46. package/dist/runtime/index.d.ts +70 -3
  47. package/dist/runtime/index.js +15 -381
  48. package/dist/ssr/index.cjs +508 -134
  49. package/dist/ssr/index.d.cts +56 -4
  50. package/dist/ssr/index.d.ts +56 -4
  51. package/dist/ssr/index.js +446 -72
  52. package/dist/{verificationRegistry-B3dj1Zl8.d.ts → verificationRegistry-B5aGl7WF.d.ts} +2 -1
  53. package/locales/ar.json +2 -3
  54. package/locales/en.json +2 -3
  55. package/locales/sl.json +2 -3
  56. package/package.json +8 -8
  57. package/tailwind-preset.cjs +78 -8
  58. package/themes/_base.css +27 -0
  59. package/themes/_contract.md +6 -0
  60. package/themes/_fonts.css +4 -4
  61. package/themes/_foundation.css +11 -0
  62. package/themes/_presets.css +2 -0
  63. package/themes/almadar-website.css +10 -0
  64. package/themes/almadar.css +10 -0
  65. package/themes/atelier.css +10 -0
  66. package/themes/bauhaus.css +10 -0
  67. package/themes/bloomberg-dense.css +10 -0
  68. package/themes/clay.css +10 -0
  69. package/themes/corporate.css +10 -0
  70. package/themes/gazette.css +10 -0
  71. package/themes/glass.css +10 -0
  72. package/themes/kflow.css +5 -0
  73. package/themes/kiosk.css +10 -0
  74. package/themes/linear-clean.css +10 -0
  75. package/themes/material.css +10 -0
  76. package/themes/minimalist.css +10 -0
  77. package/themes/nata.css +304 -0
  78. package/themes/neon.css +10 -0
  79. package/themes/notion-editorial.css +10 -0
  80. package/themes/orb.css +10 -0
  81. package/themes/prism.css +10 -0
  82. package/themes/rawi.css +304 -0
  83. package/themes/retro.css +10 -0
  84. package/themes/risograph.css +10 -0
  85. package/themes/scandi.css +10 -0
  86. package/themes/solarpunk.css +10 -0
  87. package/themes/terminal.css +138 -128
  88. package/dist/Typography-LZTP72Y4.js +0 -5
  89. package/dist/chunk-D2E44ODB.js +0 -350
  90. package/dist/chunk-N7JIG57B.js +0 -138
  91. package/dist/chunk-QJIAJ6EH.js +0 -2256
@@ -80,6 +80,7 @@ declare function bindEventBus(eventBus: {
80
80
  emit: (type: string, payload?: EventPayload) => void;
81
81
  onAny?: (listener: (event: BusEvent) => void) => () => void;
82
82
  }): void;
83
+ declare function bindConfigApplier(applyConfig: NonNullable<OrbitalVerificationAPI['applyConfig']>): () => void;
83
84
  /**
84
85
  * Bind a trait state getter so automation can query current states.
85
86
  */
@@ -114,4 +115,4 @@ declare function bindLastDrawables(getDrawables: () => DrawableNode[] | null): v
114
115
  declare function updateAssetStatus(url: string, status: AssetLoadStatus): void;
115
116
  declare function clearVerification(): void;
116
117
 
117
- export { type TraitSnapshotGetter as T, bindEventBus as a, bindCanvasCapture as b, bindLastDrawables as c, bindTraitStateGetter as d, clearVerification as e, getBridgeHealth as f, getAllChecks as g, getSnapshot as h, getSummary as i, getTraitSnapshots as j, getTransitions as k, getTransitionsForTrait as l, recordServerResponse as m, recordTransition as n, recordingTransport as o, registerCheck as p, registerTraitSnapshot as q, recordOrbitalResponse as r, serverEffectTraces as s, subscribeToVerification as t, updateAssetStatus as u, updateBridgeHealth as v, updateCheck as w, waitForTransition as x };
118
+ export { type TraitSnapshotGetter as T, bindConfigApplier as a, bindCanvasCapture as b, bindEventBus as c, bindLastDrawables as d, bindTraitStateGetter as e, clearVerification as f, getAllChecks as g, getBridgeHealth as h, getSnapshot as i, getSummary as j, getTraitSnapshots as k, getTransitions as l, getTransitionsForTrait as m, recordServerResponse as n, recordTransition as o, recordingTransport as p, registerCheck as q, recordOrbitalResponse as r, registerTraitSnapshot as s, serverEffectTraces as t, subscribeToVerification as u, updateAssetStatus as v, updateBridgeHealth as w, updateCheck as x, waitForTransition as y };
package/locales/ar.json CHANGED
@@ -129,7 +129,6 @@
129
129
  "aria.upvote": "تصويت إيجابي",
130
130
  "aria.downvote": "تصويت سلبي",
131
131
  "aria.qrScanner": "ماسح QR",
132
- "aria.mockScanDev": "مسح تجريبي (تطوير)",
133
132
  "aria.openMenu": "فتح القائمة",
134
133
  "aria.closeMenu": "إغلاق القائمة",
135
134
  "aria.openSidebar": "فتح الشريط الجانبي",
@@ -327,7 +326,6 @@
327
326
  "qrScanner.pauseScanning": "إيقاف المسح مؤقتًا",
328
327
  "qrScanner.switchToFrontCamera": "التبديل إلى الكاميرا الأمامية",
329
328
  "qrScanner.switchToRearCamera": "التبديل إلى الكاميرا الخلفية",
330
- "qrScanner.mockScan": "مسح تجريبي",
331
329
  "docSearch.placeholder": "البحث في الوثائق...",
332
330
  "stateMachine.loading": "جارٍ تحميل آلة الحالة…",
333
331
  "stateMachine.noStateMachine": "لا توجد آلة حالة لعرضها",
@@ -1253,5 +1251,6 @@
1253
1251
  "avl.stateInitial": "البداية",
1254
1252
  "avl.stateTerminal": "النهاية",
1255
1253
  "avl.guardCaption": "لا يحدث الانتقال إلا عندما يكون هذا الشرط صحيحًا.",
1256
- "avl.effectsCaption": "ما يُنفَّذ، بالترتيب، عند حدوث الانتقال."
1254
+ "avl.effectsCaption": "ما يُنفَّذ، بالترتيب، عند حدوث الانتقال.",
1255
+ "aria.carousel": "عرض شرائح"
1257
1256
  }
package/locales/en.json CHANGED
@@ -133,7 +133,6 @@
133
133
  "aria.upvote": "Upvote",
134
134
  "aria.downvote": "Downvote",
135
135
  "aria.qrScanner": "QR scanner",
136
- "aria.mockScanDev": "Mock scan (dev)",
137
136
  "aria.openMenu": "Open menu",
138
137
  "aria.closeMenu": "Close menu",
139
138
  "aria.openSidebar": "Open sidebar",
@@ -331,7 +330,6 @@
331
330
  "qrScanner.pauseScanning": "Pause scanning",
332
331
  "qrScanner.switchToFrontCamera": "Switch to front camera",
333
332
  "qrScanner.switchToRearCamera": "Switch to rear camera",
334
- "qrScanner.mockScan": "Mock Scan",
335
333
  "docSearch.placeholder": "Search documentation...",
336
334
  "stateMachine.loading": "Loading state machine…",
337
335
  "stateMachine.noStateMachine": "No state machine to visualize",
@@ -1253,5 +1251,6 @@
1253
1251
  "avl.stateInitial": "start",
1254
1252
  "avl.stateTerminal": "end",
1255
1253
  "avl.guardCaption": "The transition only fires when this check is true.",
1256
- "avl.effectsCaption": "What runs, in order, when the transition fires."
1254
+ "avl.effectsCaption": "What runs, in order, when the transition fires.",
1255
+ "aria.carousel": "carousel"
1257
1256
  }
package/locales/sl.json CHANGED
@@ -129,7 +129,6 @@
129
129
  "aria.upvote": "Glasuj za",
130
130
  "aria.downvote": "Glasuj proti",
131
131
  "aria.qrScanner": "QR skener",
132
- "aria.mockScanDev": "Simuliraj skeniranje (dev)",
133
132
  "aria.openMenu": "Odpri meni",
134
133
  "aria.closeMenu": "Zapri meni",
135
134
  "aria.openSidebar": "Odpri stransko vrstico",
@@ -327,7 +326,6 @@
327
326
  "qrScanner.pauseScanning": "Začasno ustavi skeniranje",
328
327
  "qrScanner.switchToFrontCamera": "Preklopi na sprednjo kamero",
329
328
  "qrScanner.switchToRearCamera": "Preklopi na zadnjo kamero",
330
- "qrScanner.mockScan": "Preizkusno skeniranje",
331
329
  "docSearch.placeholder": "Iskanje po dokumentaciji...",
332
330
  "stateMachine.loading": "Nalaganje stanjskega stroja…",
333
331
  "stateMachine.noStateMachine": "Ni stanjskega stroja za prikaz",
@@ -1253,5 +1251,6 @@
1253
1251
  "avl.stateInitial": "začetek",
1254
1252
  "avl.stateTerminal": "konec",
1255
1253
  "avl.guardCaption": "Prehod se zgodi le, ko je ta pogoj izpolnjen.",
1256
- "avl.effectsCaption": "Kaj se izvede, po vrsti, ko se prehod zgodi."
1254
+ "avl.effectsCaption": "Kaj se izvede, po vrsti, ko se prehod zgodi.",
1255
+ "aria.carousel": "vrtiljak"
1257
1256
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/ui",
3
- "version": "6.59.0",
3
+ "version": "6.62.0",
4
4
  "description": "React UI components, hooks, and providers for Almadar",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -126,13 +126,13 @@
126
126
  "access": "public"
127
127
  },
128
128
  "dependencies": {
129
- "@almadar/core": "^10.121.0",
130
- "@almadar/db": "^0.1.1",
131
- "@almadar/evaluator": "^2.56.0",
129
+ "@almadar/core": "^10.124.0",
130
+ "@almadar/db": "^0.1.3",
131
+ "@almadar/evaluator": "^2.58.0",
132
132
  "@almadar/logger": "^1.17.0",
133
- "@almadar/runtime": "^6.106.0",
134
- "@almadar/std": "^16.246.0",
135
- "@almadar/syntax": "^1.19.1",
133
+ "@almadar/runtime": "^6.108.0",
134
+ "@almadar/std": "^16.248.0",
135
+ "@almadar/syntax": "^1.20.0",
136
136
  "@dnd-kit/core": "^6.3.1",
137
137
  "@dnd-kit/sortable": "^10.0.0",
138
138
  "@dnd-kit/utilities": "^3.2.2",
@@ -192,7 +192,7 @@
192
192
  }
193
193
  },
194
194
  "devDependencies": {
195
- "@almadar-io/behaviors": "^0.16.194",
195
+ "@almadar-io/behaviors": "^0.16.198",
196
196
  "@almadar/eslint-plugin": "^2.21.0",
197
197
  "@react-three/drei": "^10.7.7",
198
198
  "@react-three/fiber": "^9.6.0",
@@ -33,6 +33,9 @@ const { allDesignClasses } = require('./dist/design-classes/index.cjs');
33
33
  module.exports = {
34
34
  darkMode: 'class',
35
35
  safelist: [
36
+ 'proof-marquee', 'proof-marquee-track', 'animate-almadar-marquee',
37
+ 'hover:[animation-play-state:paused]', 'motion-reduce:animate-none', 'motion-reduce:w-auto',
38
+ 'motion-reduce:flex-wrap', 'motion-reduce:justify-center', 'motion-reduce:hidden', 'motion-reduce:[mask-image:none]',
36
39
  ...allDesignClasses(),
37
40
  // Standard utilities used via dynamic className from .orb schemas
38
41
  'contents',
@@ -46,9 +49,9 @@ module.exports = {
46
49
  'grid-cols-1', 'grid-cols-2', 'grid-cols-3', 'grid-cols-4',
47
50
  'sm:grid-cols-2', 'md:grid-cols-2', 'md:grid-cols-3', 'lg:grid-cols-3', 'lg:grid-cols-4',
48
51
  'text-center', 'text-left', 'text-right',
49
- // Split composes its column widths as `${breakpoint}${ratio}` at runtime
50
- ...['sm:', 'md:', 'lg:', 'xl:'].flatMap((bp) => [
51
- 'w-1/2', 'w-1/3', 'w-2/3', 'w-1/4', 'w-3/4', 'w-1/5', 'w-4/5', 'w-2/5', 'w-3/5', 'flex-row-reverse',
52
+ // Split composes its stacking classes as `${containerBreakpoint}${cls}` at runtime
53
+ ...['@sm:', '@md:', '@lg:', '@xl:'].flatMap((bp) => [
54
+ 'w-1/2', 'w-1/3', 'w-2/3', 'w-1/4', 'w-3/4', 'w-1/5', 'w-4/5', 'w-2/5', 'w-3/5', 'flex-row', 'flex-row-reverse',
52
55
  ].map((cls) => `${bp}${cls}`)),
53
56
  // Non-theme CSS variable classes (no semantic equivalent in theme config)
54
57
  'active:scale-[var(--active-scale)]',
@@ -429,10 +432,10 @@ module.exports = {
429
432
  'max-h-[80%]',
430
433
  'max-w-[1440px]',
431
434
  'max-w-[16rem]',
432
- 'min-w-[min(400px,100%)]',
433
- 'min-w-[min(520px,100%)]',
434
- 'min-w-[min(600px,100%)]',
435
- 'min-w-[min(700px,100%)]',
435
+ 'min-w-[min(theme(minWidth.modal-sm),100%)]',
436
+ 'min-w-[min(theme(minWidth.modal-md),100%)]',
437
+ 'min-w-[min(theme(minWidth.modal-lg),100%)]',
438
+ 'min-w-[min(theme(minWidth.modal-xl),100%)]',
436
439
  'pb-[calc(5rem+env(safe-area-inset-bottom))]',
437
440
  'pb-[env(safe-area-inset-bottom)]',
438
441
  'pt-[10%]',
@@ -601,6 +604,10 @@ module.exports = {
601
604
  spring: 'var(--easing-spring, cubic-bezier(0.34, 1.56, 0.64, 1))',
602
605
  },
603
606
  keyframes: {
607
+ 'almadar-marquee': {
608
+ from: { transform: 'translateX(0)' },
609
+ to: { transform: 'translateX(var(--marquee-shift, -50%))' },
610
+ },
604
611
  'modal-in': {
605
612
  '0%': {
606
613
  opacity: 'var(--motion-modal-enter-from-opacity, 0)',
@@ -733,6 +740,7 @@ module.exports = {
733
740
  },
734
741
  },
735
742
  animation: {
743
+ 'almadar-marquee': 'almadar-marquee 40s linear infinite',
736
744
  // Motion-token-driven durations/easings (fall back to legacy
737
745
  // --transition-* so themes that haven't migrated keep working).
738
746
  'modal-in': 'modal-in var(--duration-normal, var(--transition-normal, 250ms)) var(--easing-standard, var(--transition-timing, cubic-bezier(0.4, 0, 0.2, 1)))',
@@ -817,6 +825,12 @@ module.exports = {
817
825
  'row-normal': 'var(--row-height-normal, 40px)',
818
826
  'row-spacious': 'var(--row-height-spacious, 48px)',
819
827
  },
828
+ minWidth: {
829
+ 'modal-sm': '25rem',
830
+ 'modal-md': '32.5rem',
831
+ 'modal-lg': '37.5rem',
832
+ 'modal-xl': '43.75rem',
833
+ },
820
834
  width: {
821
835
  'icon-default': 'var(--icon-default-size, 16px)',
822
836
  },
@@ -848,7 +862,9 @@ module.exports = {
848
862
  // Chrome-skin utilities: sprite-driven panel/button chrome, opt-in per theme.
849
863
  // No-op (`none`) unless the active theme defines the backing --game-* vars —
850
864
  // zero visual change for every theme that doesn't set them.
851
- require('tailwindcss/plugin')(({ addUtilities }) => {
865
+ require('tailwindcss/plugin')(({ addBase, addUtilities }) => {
866
+ // AnimatedReveal marks a band away from the viewport; nothing inside it needs to animate.
867
+ addBase({ '[data-on-screen="false"] *': { 'animation-play-state': 'paused !important' } });
852
868
  addUtilities({
853
869
  '.chrome-panel': {
854
870
  'border-image-source': 'var(--game-panel-border-image, none)',
@@ -884,6 +900,60 @@ module.exports = {
884
900
  'border-radius': 'var(--surface-content-radius, var(--radius-container, var(--radius-md)))',
885
901
  'box-shadow': 'var(--surface-content-shadow, var(--elevation-card, var(--shadow-sm)))',
886
902
  },
903
+ // Logo / wordmark marquee (std-proof `proofLook: marquee`): two copies of the strip scroll as one loop.
904
+ '.proof-marquee': {
905
+ overflow: 'hidden',
906
+ 'mask-image': 'linear-gradient(to right, transparent, black 8%, black 92%, transparent)',
907
+ '-webkit-mask-image': 'linear-gradient(to right, transparent, black 8%, black 92%, transparent)',
908
+ },
909
+ '.proof-marquee-track': { display: 'flex', width: 'max-content' },
910
+ // An RTL strip starts at the right edge, so the loop slides right.
911
+ '[dir="rtl"] .proof-marquee-track': { '--marquee-shift': '50%' },
912
+ // Full-width band layers (Box edgeTop/edgeBottom/texture/backdrop, std-hero scrim).
913
+ '.band': { position: 'relative', overflow: 'hidden', isolation: 'isolate' },
914
+ '.band > :not([data-band-layer])': { position: 'relative', 'z-index': '1' },
915
+ '.band-backdrop': { position: 'absolute', inset: '0', 'pointer-events': 'none', 'z-index': '0' },
916
+ '.band-backdrop img': { width: '100%', height: '100%', 'object-fit': 'cover' },
917
+ '.band-scrim': {
918
+ position: 'absolute', inset: '0', 'pointer-events': 'none', 'z-index': '0',
919
+ 'background-image': 'var(--surface-scrim, linear-gradient(to top, rgb(0 0 0 / 0.55), rgb(0 0 0 / 0.15)))',
920
+ },
921
+ '.band-texture': {
922
+ position: 'absolute', inset: '0', 'pointer-events': 'none', 'z-index': '0',
923
+ 'background-color': 'color-mix(in oklab, var(--color-primary) 14%, transparent)',
924
+ 'mask-image': "var(--surface-texture-mask, url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24'><circle cx='3' cy='3' r='1.5'/></svg>\"))",
925
+ '-webkit-mask-image': "var(--surface-texture-mask, url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24'><circle cx='3' cy='3' r='1.5'/></svg>\"))",
926
+ 'mask-size': 'var(--surface-texture-size, 24px 24px)',
927
+ '-webkit-mask-size': 'var(--surface-texture-size, 24px 24px)',
928
+ 'mask-repeat': 'repeat',
929
+ '-webkit-mask-repeat': 'repeat',
930
+ },
931
+ '.band-edge': {
932
+ position: 'absolute', left: '0', right: '0', 'pointer-events': 'none', 'z-index': '0',
933
+ 'mask-size': '100% 100%', '-webkit-mask-size': '100% 100%',
934
+ 'mask-repeat': 'no-repeat', '-webkit-mask-repeat': 'no-repeat',
935
+ },
936
+ '.band-edge-top': { top: '0' },
937
+ '.band-edge-bottom': { bottom: '0' },
938
+ '.band-gradient': {
939
+ 'background-color': 'var(--color-muted)',
940
+ 'background-image': 'var(--surface-accent-image, linear-gradient(180deg, color-mix(in oklab, var(--color-primary) 12%, var(--color-background)), var(--color-background)))',
941
+ color: 'var(--color-foreground)',
942
+ },
943
+ '.band-inverse': {
944
+ '--band-fg': 'var(--color-foreground)',
945
+ '--band-bg': 'var(--color-background)',
946
+ 'background-color': 'var(--color-foreground)',
947
+ color: 'var(--color-background)',
948
+ },
949
+ '.band-inverse > :not([data-band-layer])': {
950
+ '--color-foreground': 'var(--band-bg)',
951
+ '--color-background': 'var(--band-fg)',
952
+ '--color-card': 'color-mix(in oklab, var(--band-fg) 90%, var(--band-bg))',
953
+ '--color-muted': 'color-mix(in oklab, var(--band-fg) 85%, var(--band-bg))',
954
+ '--color-muted-foreground': 'color-mix(in oklab, var(--band-bg) 72%, var(--band-fg))',
955
+ '--color-border': 'color-mix(in oklab, var(--band-bg) 22%, var(--band-fg))',
956
+ },
887
957
  // Surface material on the page background (app shell / themed root).
888
958
  '.surface-page': {
889
959
  'background-image': 'var(--surface-page-image, none)',
package/themes/_base.css CHANGED
@@ -321,6 +321,33 @@
321
321
  .almadar-enter-delay-7 { --enter-index: 7; }
322
322
  .almadar-enter-delay-8 { --enter-index: 8; }
323
323
 
324
+ /* SVG atom motion (`lib/svgMotion.ts`). One dash period of the `8 6` dash per loop. */
325
+ @keyframes almadar-svg-flow-dash {
326
+ from { stroke-dashoffset: 14; }
327
+ to { stroke-dashoffset: 0; }
328
+ }
329
+ .almadar-svg-flow-dash {
330
+ animation: almadar-svg-flow-dash 1s linear infinite;
331
+ }
332
+ @keyframes almadar-svg-pulse-ring {
333
+ from { transform: scale(0.6); opacity: 0.3; }
334
+ to { transform: scale(1); opacity: 0; }
335
+ }
336
+ .almadar-svg-pulse-ring {
337
+ transform-box: fill-box;
338
+ transform-origin: center;
339
+ animation: almadar-svg-pulse-ring 2s ease-out infinite;
340
+ }
341
+ @keyframes almadar-svg-pulse-expand {
342
+ from { transform: scale(0.3); opacity: 0.4; }
343
+ to { transform: scale(1); opacity: 0; }
344
+ }
345
+ .almadar-svg-pulse-expand {
346
+ transform-box: fill-box;
347
+ transform-origin: center;
348
+ animation: almadar-svg-pulse-expand 2s ease-out infinite;
349
+ }
350
+
324
351
  /* The shimmer gradient background. Pair with the `animate-shimmer` utility
325
352
  * (defined in tailwind-preset) which sweeps background-position. */
326
353
  .almadar-shimmer {
@@ -241,6 +241,12 @@ These separate artistic styles (Art Deco vs Win95 vs wabi-sabi) along dimensions
241
241
  | `surface.contentBorderColor` | `--surface-content-border-color` | `.surface-content` | `--color-border` |
242
242
  | `surface.contentRadius` | `--surface-content-radius` | `.surface-content` | `--radius-container` |
243
243
  | `surface.contentShadow` | `--surface-content-shadow` | `.surface-content` | `--elevation-card` |
244
+ | `surface.edgeMask` | `--surface-edge-mask` | `.band-edge` (Box `edgeTop`/`edgeBottom: curve`) | `none` (straight edge) |
245
+ | `surface.edgeHeight` | `--surface-edge-height` | `.band-edge` (curve only) | `clamp(24px, 6vw, 96px)` |
246
+ | `surface.textureMask` | `--surface-texture-mask` | `.band-texture` (Box `texture`) | built-in dot tile |
247
+ | `surface.textureSize` | `--surface-texture-size` | `.band-texture` | `24px 24px` |
248
+ | `surface.accentImage` | `--surface-accent-image` | `.band-gradient` (Box `bg: gradient`) | faint primary-tinted linear gradient |
249
+ | `surface.scrim` | `--surface-scrim` | `.band-scrim` (std-hero `surface: image`) | dark bottom-up gradient |
244
250
 
245
251
  | `motion.shapes.modalEnter` / `modalExit` | `--motion-modal-enter-from-transform` / `--motion-modal-exit-to-transform` | `Modal` (every modal slot: runtime, contained preview, compiled) | `scale(.96) translateY(8px)` / `scale(.92) translateY(16px)` |
246
252
  | `motion.shapes.popoverEnter` / `popoverExit` | `--motion-popover-enter-from-transform` / `--motion-popover-exit-to-transform` | `Popover`, menus | `scale(.95)` |
package/themes/_fonts.css CHANGED
@@ -4,9 +4,9 @@
4
4
  * Regenerate: node tools/almadar-pattern-sync/dist/index.js themes (or `almadar-sync themes`)
5
5
  */
6
6
 
7
- @import url("https://fonts.googleapis.com/css2?family=Amiri:wght@400;700&family=Anton&family=Archivo:wght@400;500;700;800&family=Archivo+Black&family=Baloo+2:wght@500;600;700;800&family=Bangers&family=Bungee&family=Cairo:wght@300;400;500;600;700&family=Cinzel:wght@400;600;700;900&family=Cinzel+Decorative:wght@400;700&family=Cormorant+Garamond:ital,wght@0,300;0,400;0,500;0,700;1,500;1,700&family=Crimson+Pro:wght@500;600;700&family=DM+Sans:wght@400;500;700&family=DM+Serif+Display&family=DotGothic16&family=EB+Garamond:wght@400;500;600;700&family=Exo+2:wght@300;400;500;600;700&family=Fraunces:ital,wght@0,400;0,500;0,600;0,700;1,400;1,600;1,700&family=Fredoka:wght@400;500;600;700&family=Geist:wght@400;500;600;700&family=Geist+Mono:wght@400;500;600&family=Hanken+Grotesk:wght@300;400;500;600&family=IBM+Plex+Mono:wght@400;500;600;700&family=IBM+Plex+Sans:wght@400;500;600;700&display=swap");
8
- @import url("https://fonts.googleapis.com/css2?family=IBM+Plex+Sans+Arabic:wght@400;500;600;700&family=IBM+Plex+Sans+Condensed:wght@400;500;600;700&family=IM+Fell+English&family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@400;500;700;800&family=JetBrains+Mono:wght@400;500;700&family=Josefin+Sans:wght@400;500;700&family=Jost:wght@300;400;500;700;800&family=Kalam:wght@300;400;700&family=Karla:wght@400;500;700&family=Libre+Baskerville:wght@400;700&family=Lilita+One&family=Limelight&family=Lora:wght@400;500;600;700&family=M+PLUS+Rounded+1c:wght@400;500;700;800&family=Ma+Shan+Zheng&family=Manrope:wght@400;500;600;700;800&family=MedievalSharp&family=Newsreader:wght@400;500;600&family=Noto+Naskh+Arabic:wght@400;500;700&family=Noto+Sans:wght@400;500;700;800&family=Noto+Sans+Arabic:wght@400;500;600;700&family=Noto+Sans+Mono:wght@400;500&family=Noto+Serif+JP:wght@400;500;700&display=swap");
9
- @import url("https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;500;700&family=Nunito:wght@400;500;600;700;800&family=Nunito+Sans:wght@400;600;700&family=Old+Standard+TT&family=Orbitron:wght@500;700;900&family=Oswald:wght@500;700&family=Outfit:wght@300;400;500;600&family=Patrick+Hand&family=Pixelify+Sans:wght@400;500;700&family=Playfair+Display:ital,wght@0,400;0,500;0,700;0,900;1,500;1,700&family=Plus+Jakarta+Sans:wght@300;400;500;600;700;800&family=Poiret+One&family=Poppins:wght@500;600;700&family=Press+Start+2P&family=Quicksand:wght@500;600;700&family=Rajdhani:wght@400;500;600;700&family=Reem+Kufi:wght@400;500;600;700&family=Roboto:wght@400;500;700&family=Roboto+Condensed:wght@400;500;700&family=Roboto+Flex:wght@400;500;600;700&family=Roboto+Mono:wght@400;500&family=Rubik:wght@400;500;700&family=Rubik+Mono+One&family=Russo+One&display=swap");
10
- @import url("https://fonts.googleapis.com/css2?family=Schibsted+Grotesk:wght@400;500;600;700&family=Share+Tech+Mono&family=Shippori+Mincho:wght@400;500&family=Shrikhand&family=Silkscreen:wght@400;700&family=Sora:wght@400;600;700&family=Space+Mono:wght@400;700&family=Special+Elite&family=Tilt+Neon&family=UnifrakturCook:wght@700&family=VT323&family=Work+Sans:wght@400;500;600;700&family=Zen+Antique&family=Zen+Kaku+Gothic+New:wght@300;400;500;700&display=swap");
7
+ @import url("https://fonts.googleapis.com/css2?family=Amiri:wght@400;700&family=Anton&family=Archivo:wght@400;500;700;800&family=Archivo+Black&family=Baloo+2:wght@500;600;700;800&family=Bangers&family=Bricolage+Grotesque:wght@500;600;700&family=Bungee&family=Cairo:wght@300;400;500;600;700&family=Cinzel:wght@400;600;700;900&family=Cinzel+Decorative:wght@400;700&family=Cormorant+Garamond:ital,wght@0,300;0,400;0,500;0,700;1,500;1,700&family=Crimson+Pro:wght@500;600;700&family=DM+Sans:wght@400;500;700&family=DM+Serif+Display&family=DotGothic16&family=EB+Garamond:wght@400;500;600;700&family=Exo+2:wght@300;400;500;600;700&family=Fraunces:ital,wght@0,400;0,500;0,600;0,700;1,400;1,600;1,700&family=Fredoka:wght@400;500;600;700&family=Geist:wght@400;500;600;700&family=Geist+Mono:wght@400;500;600&family=Hanken+Grotesk:wght@300;400;500;600&family=IBM+Plex+Mono:wght@400;500;600&display=swap");
8
+ @import url("https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600;700&family=IBM+Plex+Sans+Arabic:wght@400;500;600;700&family=IBM+Plex+Sans+Condensed:wght@400;500;600;700&family=IM+Fell+English&family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@400;500;700;800&family=JetBrains+Mono:wght@400;500;600;700&family=Josefin+Sans:wght@400;500;700&family=Jost:wght@300;400;500;700;800&family=Kalam:wght@300;400;700&family=Karla:wght@400;500;700&family=Libre+Baskerville:wght@400;700&family=Lilita+One&family=Limelight&family=Lora:wght@400;500;600;700&family=M+PLUS+Rounded+1c:wght@400;500;700;800&family=Ma+Shan+Zheng&family=Manrope:wght@400;500;600;700;800&family=MedievalSharp&family=Newsreader:wght@400;500;600;700&family=Noto+Naskh+Arabic:wght@400;500;700&family=Noto+Sans:wght@400;500;700;800&family=Noto+Sans+Arabic:wght@400;500;600;700&family=Noto+Sans+Mono:wght@400;500&display=swap");
9
+ @import url("https://fonts.googleapis.com/css2?family=Noto+Serif+JP:wght@400;500;700&family=Noto+Serif+SC:wght@400;500;700&family=Nunito:wght@400;500;600;700;800&family=Nunito+Sans:wght@400;600;700&family=Old+Standard+TT&family=Orbitron:wght@500;700;900&family=Oswald:wght@500;700&family=Outfit:wght@300;400;500;600&family=Patrick+Hand&family=Pixelify+Sans:wght@400;500;700&family=Playfair+Display:ital,wght@0,400;0,500;0,700;0,900;1,500;1,700&family=Plus+Jakarta+Sans:wght@300;400;500;600;700;800&family=Poiret+One&family=Poppins:wght@500;600;700&family=Press+Start+2P&family=Quicksand:wght@500;600;700&family=Rajdhani:wght@400;500;600;700&family=Reem+Kufi:wght@400;500;600;700&family=Roboto:wght@400;500;700&family=Roboto+Condensed:wght@400;500;700&family=Roboto+Flex:wght@400;500;600;700&family=Roboto+Mono:wght@400;500&family=Rubik:wght@400;500;700&family=Rubik+Mono+One&display=swap");
10
+ @import url("https://fonts.googleapis.com/css2?family=Russo+One&family=Schibsted+Grotesk:wght@400;500;600;700&family=Share+Tech+Mono&family=Shippori+Mincho:wght@400;500&family=Shrikhand&family=Silkscreen:wght@400;700&family=Sora:wght@400;600;700&family=Source+Sans+3:wght@400;500;600;700&family=Space+Mono:wght@400;700&family=Special+Elite&family=Tilt+Neon&family=UnifrakturCook:wght@700&family=VT323&family=Work+Sans:wght@400;500;600;700&family=Zen+Antique&family=Zen+Kaku+Gothic+New:wght@300;400;500;700&display=swap");
11
11
  @import url("https://fonts.googleapis.com/css2?family=Source+Serif+4:wght@400;600;700&display=swap");
12
12
  @import url("https://fonts.googleapis.com/css2?family=Source+Serif+4:opsz,wght@8..60,500;8..60,600;8..60,700&display=swap");
@@ -92,3 +92,14 @@
92
92
  font-style: var(--heading-style, normal);
93
93
  text-shadow: var(--heading-shadow, none);
94
94
  }
95
+
96
+ /* Presentation motion: a subtree whose changes are there to be watched (a live demo,
97
+ * `Box animateChanges`) plays them over the theme's dramatic duration with its standard
98
+ * ease-in-out instead of the snappy emphasized timing. Lives here because every app
99
+ * (runtime and compiled) loads the foundation; doubled attribute so it wins over a
100
+ * `[data-theme]` block on the same element. */
101
+ [data-motion="presentation"][data-motion] {
102
+ --duration-normal: var(--duration-dramatic, 600ms);
103
+ --duration-slow: var(--duration-dramatic, 600ms);
104
+ --easing-emphasized: var(--easing-standard, cubic-bezier(0.4, 0, 0.2, 1));
105
+ }
@@ -40,6 +40,7 @@
40
40
  @import "./mid-century.css";
41
41
  @import "./minimalist.css";
42
42
  @import "./mudcloth.css";
43
+ @import "./nata.css";
43
44
  @import "./neon.css";
44
45
  @import "./neumorphic.css";
45
46
  @import "./newsprint.css";
@@ -47,6 +48,7 @@
47
48
  @import "./orb.css";
48
49
  @import "./pixel.css";
49
50
  @import "./prism.css";
51
+ @import "./rawi.css";
50
52
  @import "./retro.css";
51
53
  @import "./risograph.css";
52
54
  @import "./scandi.css";
@@ -101,6 +101,11 @@
101
101
  --border-hairline: 1px;
102
102
  --border-standard: var(--border-width);
103
103
  --border-heavy: var(--border-width-thick);
104
+ --surface-edge-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 100' preserveAspectRatio='none'><path d='M0 60 C240 100 480 100 720 60 C960 20 1200 20 1440 60 V100 H0 Z'/></svg>");
105
+ --surface-edge-height: clamp(24px, 6vw, 96px);
106
+ --surface-texture-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24'><circle cx='3' cy='3' r='1.5'/></svg>");
107
+ --surface-texture-size: 24px 24px;
108
+ --surface-accent-image: radial-gradient(60% 80% at 15% 20%, color-mix(in oklab, var(--color-primary) 22%, transparent), transparent 70%), radial-gradient(50% 70% at 85% 30%, color-mix(in oklab, var(--color-accent) 20%, transparent), transparent 70%);
104
109
  --diagram-stroke-thin: 0.75px;
105
110
  --diagram-stroke-normal: 1.5px;
106
111
  --diagram-stroke-bold: 2.25px;
@@ -230,6 +235,11 @@
230
235
  --border-hairline: 1px;
231
236
  --border-standard: var(--border-width);
232
237
  --border-heavy: var(--border-width-thick);
238
+ --surface-edge-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 100' preserveAspectRatio='none'><path d='M0 60 C240 100 480 100 720 60 C960 20 1200 20 1440 60 V100 H0 Z'/></svg>");
239
+ --surface-edge-height: clamp(24px, 6vw, 96px);
240
+ --surface-texture-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24'><circle cx='3' cy='3' r='1.5'/></svg>");
241
+ --surface-texture-size: 24px 24px;
242
+ --surface-accent-image: radial-gradient(60% 80% at 15% 20%, color-mix(in oklab, var(--color-primary) 22%, transparent), transparent 70%), radial-gradient(50% 70% at 85% 30%, color-mix(in oklab, var(--color-accent) 20%, transparent), transparent 70%);
233
243
  --diagram-stroke-thin: 0.75px;
234
244
  --diagram-stroke-normal: 1.5px;
235
245
  --diagram-stroke-bold: 2.25px;
@@ -103,6 +103,11 @@
103
103
  --border-heavy: var(--border-width-thick);
104
104
  --corner-shape: squircle;
105
105
  --surface-card-image: linear-gradient(160deg, rgba(20,184,166,0.07), rgba(20,184,166,0) 55%);
106
+ --surface-edge-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 100' preserveAspectRatio='none'><path d='M0 60 C240 100 480 100 720 60 C960 20 1200 20 1440 60 V100 H0 Z'/></svg>");
107
+ --surface-edge-height: clamp(24px, 6vw, 96px);
108
+ --surface-texture-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24'><circle cx='3' cy='3' r='1.5'/></svg>");
109
+ --surface-texture-size: 24px 24px;
110
+ --surface-accent-image: radial-gradient(60% 80% at 15% 20%, color-mix(in oklab, var(--color-primary) 22%, transparent), transparent 70%), radial-gradient(50% 70% at 85% 30%, color-mix(in oklab, var(--color-accent) 20%, transparent), transparent 70%);
106
111
  --diagram-stroke-thin: 1px;
107
112
  --diagram-stroke-normal: 2px;
108
113
  --diagram-stroke-bold: 3px;
@@ -230,6 +235,11 @@
230
235
  --border-heavy: var(--border-width-thick);
231
236
  --corner-shape: squircle;
232
237
  --surface-card-image: linear-gradient(160deg, rgba(20,184,166,0.07), rgba(20,184,166,0) 55%);
238
+ --surface-edge-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 100' preserveAspectRatio='none'><path d='M0 60 C240 100 480 100 720 60 C960 20 1200 20 1440 60 V100 H0 Z'/></svg>");
239
+ --surface-edge-height: clamp(24px, 6vw, 96px);
240
+ --surface-texture-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24'><circle cx='3' cy='3' r='1.5'/></svg>");
241
+ --surface-texture-size: 24px 24px;
242
+ --surface-accent-image: radial-gradient(60% 80% at 15% 20%, color-mix(in oklab, var(--color-primary) 22%, transparent), transparent 70%), radial-gradient(50% 70% at 85% 30%, color-mix(in oklab, var(--color-accent) 20%, transparent), transparent 70%);
233
243
  --diagram-stroke-thin: 1px;
234
244
  --diagram-stroke-normal: 2px;
235
245
  --diagram-stroke-bold: 3px;
@@ -200,6 +200,11 @@
200
200
  --corner-shape-pill: squircle;
201
201
  --border-style: solid;
202
202
  --border-style-interactive: solid;
203
+ --surface-edge-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 100' preserveAspectRatio='none'><path d='M0 60 C240 100 480 100 720 60 C960 20 1200 20 1440 60 V100 H0 Z'/></svg>");
204
+ --surface-edge-height: clamp(24px, 6vw, 96px);
205
+ --surface-texture-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24'><circle cx='3' cy='3' r='1.5'/></svg>");
206
+ --surface-texture-size: 24px 24px;
207
+ --surface-accent-image: radial-gradient(60% 80% at 15% 20%, color-mix(in oklab, var(--color-primary) 22%, transparent), transparent 70%), radial-gradient(50% 70% at 85% 30%, color-mix(in oklab, var(--color-accent) 20%, transparent), transparent 70%);
203
208
  --diagram-stroke-thin: 1px;
204
209
  --diagram-stroke-normal: 1.5px;
205
210
  --diagram-stroke-bold: 2px;
@@ -424,6 +429,11 @@
424
429
  --corner-shape-pill: squircle;
425
430
  --border-style: solid;
426
431
  --border-style-interactive: solid;
432
+ --surface-edge-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 100' preserveAspectRatio='none'><path d='M0 60 C240 100 480 100 720 60 C960 20 1200 20 1440 60 V100 H0 Z'/></svg>");
433
+ --surface-edge-height: clamp(24px, 6vw, 96px);
434
+ --surface-texture-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24'><circle cx='3' cy='3' r='1.5'/></svg>");
435
+ --surface-texture-size: 24px 24px;
436
+ --surface-accent-image: radial-gradient(60% 80% at 15% 20%, color-mix(in oklab, var(--color-primary) 22%, transparent), transparent 70%), radial-gradient(50% 70% at 85% 30%, color-mix(in oklab, var(--color-accent) 20%, transparent), transparent 70%);
427
437
  --diagram-stroke-thin: 1px;
428
438
  --diagram-stroke-normal: 1.5px;
429
439
  --diagram-stroke-bold: 2px;
@@ -199,6 +199,11 @@
199
199
  --corner-shape-pill: round;
200
200
  --border-style: solid;
201
201
  --border-style-interactive: solid;
202
+ --surface-edge-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 100' preserveAspectRatio='none'><path d='M0 100 Q720 0 1440 100 Z'/></svg>");
203
+ --surface-edge-height: clamp(24px, 6vw, 96px);
204
+ --surface-texture-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='40' height='40'><path d='M0 .5H40M.5 0V40' stroke='black' stroke-width='1' fill='none'/></svg>");
205
+ --surface-texture-size: 40px 40px;
206
+ --surface-accent-image: radial-gradient(60% 80% at 15% 20%, color-mix(in oklab, var(--color-primary) 22%, transparent), transparent 70%), radial-gradient(50% 70% at 85% 30%, color-mix(in oklab, var(--color-accent) 20%, transparent), transparent 70%);
202
207
  --diagram-stroke-thin: 3px;
203
208
  --diagram-stroke-normal: 5px;
204
209
  --diagram-stroke-bold: 8px;
@@ -422,6 +427,11 @@
422
427
  --corner-shape-pill: round;
423
428
  --border-style: solid;
424
429
  --border-style-interactive: solid;
430
+ --surface-edge-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 100' preserveAspectRatio='none'><path d='M0 100 Q720 0 1440 100 Z'/></svg>");
431
+ --surface-edge-height: clamp(24px, 6vw, 96px);
432
+ --surface-texture-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='40' height='40'><path d='M0 .5H40M.5 0V40' stroke='black' stroke-width='1' fill='none'/></svg>");
433
+ --surface-texture-size: 40px 40px;
434
+ --surface-accent-image: radial-gradient(60% 80% at 15% 20%, color-mix(in oklab, var(--color-primary) 22%, transparent), transparent 70%), radial-gradient(50% 70% at 85% 30%, color-mix(in oklab, var(--color-accent) 20%, transparent), transparent 70%);
425
435
  --diagram-stroke-thin: 3px;
426
436
  --diagram-stroke-normal: 5px;
427
437
  --diagram-stroke-bold: 8px;
@@ -200,6 +200,11 @@
200
200
  --corner-shape-pill: round;
201
201
  --border-style: solid;
202
202
  --border-style-interactive: solid;
203
+ --surface-edge-mask: none;
204
+ --surface-edge-height: 0px;
205
+ --surface-texture-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='40' height='40'><path d='M0 .5H40M.5 0V40' stroke='black' stroke-width='1' fill='none'/></svg>");
206
+ --surface-texture-size: 40px 40px;
207
+ --surface-accent-image: none;
203
208
  --diagram-stroke-thin: 0.75px;
204
209
  --diagram-stroke-normal: 1px;
205
210
  --diagram-stroke-bold: 2px;
@@ -424,6 +429,11 @@
424
429
  --corner-shape-pill: round;
425
430
  --border-style: solid;
426
431
  --border-style-interactive: solid;
432
+ --surface-edge-mask: none;
433
+ --surface-edge-height: 0px;
434
+ --surface-texture-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='40' height='40'><path d='M0 .5H40M.5 0V40' stroke='black' stroke-width='1' fill='none'/></svg>");
435
+ --surface-texture-size: 40px 40px;
436
+ --surface-accent-image: none;
427
437
  --diagram-stroke-thin: 0.75px;
428
438
  --diagram-stroke-normal: 1px;
429
439
  --diagram-stroke-bold: 2px;
package/themes/clay.css CHANGED
@@ -193,6 +193,11 @@
193
193
  --corner-shape-pill: round;
194
194
  --border-style: solid;
195
195
  --border-style-interactive: solid;
196
+ --surface-edge-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 100' preserveAspectRatio='none'><path d='M0 60 C240 100 480 100 720 60 C960 20 1200 20 1440 60 V100 H0 Z'/></svg>");
197
+ --surface-edge-height: clamp(24px, 6vw, 96px);
198
+ --surface-texture-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24'><circle cx='3' cy='3' r='1.5'/></svg>");
199
+ --surface-texture-size: 24px 24px;
200
+ --surface-accent-image: radial-gradient(60% 80% at 15% 20%, color-mix(in oklab, var(--color-primary) 22%, transparent), transparent 70%), radial-gradient(50% 70% at 85% 30%, color-mix(in oklab, var(--color-accent) 20%, transparent), transparent 70%);
196
201
  --diagram-stroke-thin: 2px;
197
202
  --diagram-stroke-normal: 3px;
198
203
  --diagram-stroke-bold: 5px;
@@ -410,6 +415,11 @@
410
415
  --corner-shape-pill: round;
411
416
  --border-style: solid;
412
417
  --border-style-interactive: solid;
418
+ --surface-edge-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 100' preserveAspectRatio='none'><path d='M0 60 C240 100 480 100 720 60 C960 20 1200 20 1440 60 V100 H0 Z'/></svg>");
419
+ --surface-edge-height: clamp(24px, 6vw, 96px);
420
+ --surface-texture-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24'><circle cx='3' cy='3' r='1.5'/></svg>");
421
+ --surface-texture-size: 24px 24px;
422
+ --surface-accent-image: radial-gradient(60% 80% at 15% 20%, color-mix(in oklab, var(--color-primary) 22%, transparent), transparent 70%), radial-gradient(50% 70% at 85% 30%, color-mix(in oklab, var(--color-accent) 20%, transparent), transparent 70%);
413
423
  --diagram-stroke-thin: 2px;
414
424
  --diagram-stroke-normal: 3px;
415
425
  --diagram-stroke-bold: 5px;
@@ -193,6 +193,11 @@
193
193
  --corner-shape-pill: round;
194
194
  --border-style: solid;
195
195
  --border-style-interactive: solid;
196
+ --surface-edge-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 100' preserveAspectRatio='none'><path d='M0 100 Q720 0 1440 100 Z'/></svg>");
197
+ --surface-edge-height: clamp(16px, 4vw, 56px);
198
+ --surface-texture-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='40' height='40'><path d='M0 .5H40M.5 0V40' stroke='black' stroke-width='1' fill='none'/></svg>");
199
+ --surface-texture-size: 40px 40px;
200
+ --surface-accent-image: linear-gradient(180deg, color-mix(in oklab, var(--color-primary) 8%, var(--color-background)), var(--color-background));
196
201
  --diagram-stroke-thin: 1px;
197
202
  --diagram-stroke-normal: 1.5px;
198
203
  --diagram-stroke-bold: 2px;
@@ -410,6 +415,11 @@
410
415
  --corner-shape-pill: round;
411
416
  --border-style: solid;
412
417
  --border-style-interactive: solid;
418
+ --surface-edge-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 100' preserveAspectRatio='none'><path d='M0 100 Q720 0 1440 100 Z'/></svg>");
419
+ --surface-edge-height: clamp(16px, 4vw, 56px);
420
+ --surface-texture-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='40' height='40'><path d='M0 .5H40M.5 0V40' stroke='black' stroke-width='1' fill='none'/></svg>");
421
+ --surface-texture-size: 40px 40px;
422
+ --surface-accent-image: linear-gradient(180deg, color-mix(in oklab, var(--color-primary) 8%, var(--color-background)), var(--color-background));
413
423
  --diagram-stroke-thin: 1px;
414
424
  --diagram-stroke-normal: 1.5px;
415
425
  --diagram-stroke-bold: 2px;
@@ -193,6 +193,11 @@
193
193
  --corner-shape-pill: round;
194
194
  --border-style: solid;
195
195
  --border-style-interactive: solid;
196
+ --surface-edge-mask: none;
197
+ --surface-edge-height: 0px;
198
+ --surface-texture-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='32' height='32'><path d='M0 31.5H32' stroke='black' stroke-width='1'/></svg>");
199
+ --surface-texture-size: 32px 32px;
200
+ --surface-accent-image: none;
196
201
  --diagram-stroke-thin: 0.75px;
197
202
  --diagram-stroke-normal: 1px;
198
203
  --diagram-stroke-bold: 2px;
@@ -410,6 +415,11 @@
410
415
  --corner-shape-pill: round;
411
416
  --border-style: solid;
412
417
  --border-style-interactive: solid;
418
+ --surface-edge-mask: none;
419
+ --surface-edge-height: 0px;
420
+ --surface-texture-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='32' height='32'><path d='M0 31.5H32' stroke='black' stroke-width='1'/></svg>");
421
+ --surface-texture-size: 32px 32px;
422
+ --surface-accent-image: none;
413
423
  --diagram-stroke-thin: 0.75px;
414
424
  --diagram-stroke-normal: 1px;
415
425
  --diagram-stroke-bold: 2px;
package/themes/glass.css CHANGED
@@ -197,6 +197,11 @@
197
197
  --surface-card-image: linear-gradient(135deg, rgba(255,255,255,0.45), rgba(255,255,255,0.05));
198
198
  --surface-page-image: radial-gradient(60% 50% at 15% 10%, rgba(64,88,214,0.22), transparent 70%), radial-gradient(50% 45% at 85% 20%, rgba(194,65,122,0.14), transparent 70%), radial-gradient(55% 50% at 70% 90%, rgba(56,160,190,0.16), transparent 70%), radial-gradient(45% 40% at 10% 85%, rgba(64,88,214,0.12), transparent 70%);
199
199
  --surface-page-image-size: 100% 100%;
200
+ --surface-edge-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 100' preserveAspectRatio='none'><path d='M0 60 C240 100 480 100 720 60 C960 20 1200 20 1440 60 V100 H0 Z'/></svg>");
201
+ --surface-edge-height: clamp(24px, 6vw, 96px);
202
+ --surface-texture-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24'><circle cx='3' cy='3' r='1.5'/></svg>");
203
+ --surface-texture-size: 24px 24px;
204
+ --surface-accent-image: radial-gradient(60% 80% at 15% 20%, color-mix(in oklab, var(--color-primary) 22%, transparent), transparent 70%), radial-gradient(50% 70% at 85% 30%, color-mix(in oklab, var(--color-accent) 20%, transparent), transparent 70%);
200
205
  --diagram-stroke-thin: 1;
201
206
  --diagram-stroke-normal: 1.5;
202
207
  --diagram-stroke-bold: 2.5;
@@ -418,6 +423,11 @@
418
423
  --surface-card-image: linear-gradient(135deg, rgba(255,255,255,0.10), rgba(255,255,255,0.01));
419
424
  --surface-page-image: radial-gradient(60% 50% at 15% 10%, rgba(138,160,255,0.28), transparent 70%), radial-gradient(50% 45% at 85% 20%, rgba(240,140,176,0.16), transparent 70%), radial-gradient(55% 50% at 70% 90%, rgba(56,160,190,0.16), transparent 70%), radial-gradient(45% 40% at 10% 85%, rgba(138,160,255,0.14), transparent 70%);
420
425
  --surface-page-image-size: 100% 100%;
426
+ --surface-edge-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 100' preserveAspectRatio='none'><path d='M0 60 C240 100 480 100 720 60 C960 20 1200 20 1440 60 V100 H0 Z'/></svg>");
427
+ --surface-edge-height: clamp(24px, 6vw, 96px);
428
+ --surface-texture-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24'><circle cx='3' cy='3' r='1.5'/></svg>");
429
+ --surface-texture-size: 24px 24px;
430
+ --surface-accent-image: radial-gradient(60% 80% at 15% 20%, color-mix(in oklab, var(--color-primary) 22%, transparent), transparent 70%), radial-gradient(50% 70% at 85% 30%, color-mix(in oklab, var(--color-accent) 20%, transparent), transparent 70%);
421
431
  --diagram-stroke-thin: 1;
422
432
  --diagram-stroke-normal: 1.5;
423
433
  --diagram-stroke-bold: 2.5;
package/themes/kflow.css CHANGED
@@ -123,6 +123,11 @@
123
123
  --border-style: solid;
124
124
  --border-style-interactive: solid;
125
125
  --surface-card-image: linear-gradient(135deg, rgba(99, 102, 241, 0.07) 0%, rgba(34, 211, 238, 0.05) 55%, rgba(16, 185, 129, 0.06) 100%);
126
+ --surface-edge-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 100' preserveAspectRatio='none'><path d='M0 60 C240 100 480 100 720 60 C960 20 1200 20 1440 60 V100 H0 Z'/></svg>");
127
+ --surface-edge-height: clamp(24px, 6vw, 96px);
128
+ --surface-texture-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='24' height='24'><circle cx='3' cy='3' r='1.5'/></svg>");
129
+ --surface-texture-size: 24px 24px;
130
+ --surface-accent-image: radial-gradient(60% 80% at 15% 20%, color-mix(in oklab, var(--color-primary) 22%, transparent), transparent 70%), radial-gradient(50% 70% at 85% 30%, color-mix(in oklab, var(--color-accent) 20%, transparent), transparent 70%);
126
131
  --diagram-stroke-thin: 1px;
127
132
  --diagram-stroke-normal: 2px;
128
133
  --diagram-stroke-bold: 3px;