@almadar/ui 6.53.1 → 6.55.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 (120) hide show
  1. package/dist/{AwaitingSkeletonContext-Bh399p1x.d.ts → AwaitingSkeletonContext-DPgW__WV.d.ts} +3 -1
  2. package/dist/{Canvas3DHost-B-y2TNij.d.ts → Canvas3DHost-DfAhg6EH.d.ts} +2 -0
  3. package/dist/Typography-7PDT62PG.js +5 -0
  4. package/dist/{UISlotRenderer-P7A4SZSK.js → UISlotRenderer-QTHFT6Z4.js} +8 -8
  5. package/dist/avl/index.cjs +3031 -1790
  6. package/dist/avl/index.js +57 -745
  7. package/dist/{avl-3d-context-MAt_NuU9.d.ts → avl-3d-context-BpBKZIbc.d.ts} +1 -0
  8. package/dist/{chunk-ERXIHZW3.js → chunk-D2E44ODB.js} +29 -15
  9. package/dist/{chunk-UOTYAPV5.js → chunk-F4ZTPKZL.js} +3 -3
  10. package/dist/{chunk-53VTY5CC.js → chunk-FQM37C56.js} +352 -162
  11. package/dist/{chunk-HB4C27KU.js → chunk-HCSJHRC4.js} +1 -1
  12. package/dist/{chunk-7KSLPY56.js → chunk-HRCR53OW.js} +11 -1
  13. package/dist/{chunk-O7OLVVBR.js → chunk-Q47ZN2DW.js} +24 -22
  14. package/dist/{chunk-DQTV6QVS.js → chunk-QGH4NAQO.js} +53 -2
  15. package/dist/{chunk-QVXLKFUQ.js → chunk-RNY5LJXJ.js} +1 -1
  16. package/dist/{chunk-FUQASYEW.js → chunk-SGJHVPHC.js} +2 -2
  17. package/dist/{chunk-6O37FCX4.js → chunk-V3FGTQUE.js} +37 -2
  18. package/dist/{chunk-HUG25TT3.js → chunk-XZKGRSIO.js} +2745 -1644
  19. package/dist/{chunk-7LM6I3NA.js → chunk-Y53Q55H5.js} +522 -24
  20. package/dist/components/index.cjs +4614 -2858
  21. package/dist/components/index.d.ts +122 -53
  22. package/dist/components/index.js +16 -17
  23. package/dist/context/index.cjs +38 -1
  24. package/dist/context/index.d.ts +1 -1
  25. package/dist/context/index.js +3 -1
  26. package/dist/design-classes/index.cjs +29 -15
  27. package/dist/design-classes/index.d.cts +1 -0
  28. package/dist/design-classes/index.d.ts +1 -0
  29. package/dist/design-classes/index.js +29 -15
  30. package/dist/hooks/index.cjs +16 -1
  31. package/dist/hooks/index.d.ts +10 -1
  32. package/dist/hooks/index.js +3 -4
  33. package/dist/lib/drawable/three/index.cjs +444 -82
  34. package/dist/lib/drawable/three/index.d.ts +4 -4
  35. package/dist/lib/drawable/three/index.js +28 -24
  36. package/dist/lib/index.cjs +53 -3
  37. package/dist/lib/index.d.ts +1 -1
  38. package/dist/lib/index.js +4 -4
  39. package/dist/locales/index.cjs +33 -3
  40. package/dist/locales/index.js +23 -3
  41. package/dist/providers/index.cjs +4987 -3183
  42. package/dist/providers/index.d.ts +2 -2
  43. package/dist/providers/index.js +14 -11
  44. package/dist/runtime/index.cjs +8973 -7000
  45. package/dist/runtime/index.d.ts +28 -6
  46. package/dist/runtime/index.js +16 -13
  47. package/dist/ssr/index.cjs +26 -9
  48. package/dist/ssr/index.js +26 -9
  49. package/dist/{themeTokens-Ccu7EmGY.d.ts → themeTokens-D6MFwKrC.d.ts} +6 -2
  50. package/locales/ar.json +11 -1
  51. package/locales/en.json +11 -1
  52. package/locales/sl.json +11 -1
  53. package/package.json +8 -7
  54. package/scripts/audit-tailwind-safelist.ts +21 -1
  55. package/scripts/theme-contrast-audit.mjs +20 -1
  56. package/tailwind-preset.cjs +5 -6
  57. package/themes/_base.css +61 -0
  58. package/themes/_contract.md +37 -0
  59. package/themes/_fonts.css +6 -4
  60. package/themes/_presets.css +2 -0
  61. package/themes/almadar-heritage.css +455 -0
  62. package/themes/almadar-website.css +82 -0
  63. package/themes/almadar.css +82 -0
  64. package/themes/aqua.css +82 -0
  65. package/themes/arabesque.css +82 -0
  66. package/themes/art-deco.css +82 -0
  67. package/themes/art-nouveau.css +82 -0
  68. package/themes/atelier.css +82 -0
  69. package/themes/bauhaus.css +82 -0
  70. package/themes/bloomberg-dense.css +83 -1
  71. package/themes/blueprint.css +84 -0
  72. package/themes/clay.css +82 -0
  73. package/themes/comic.css +82 -0
  74. package/themes/constructivist.css +82 -0
  75. package/themes/corporate.css +82 -0
  76. package/themes/cyberpunk.css +82 -0
  77. package/themes/frutiger-aero.css +83 -0
  78. package/themes/game-adventure.css +15 -0
  79. package/themes/game-rpg.css +16 -0
  80. package/themes/game-sci-fi.css +15 -0
  81. package/themes/game-ui-pack.css +15 -0
  82. package/themes/gazette.css +82 -0
  83. package/themes/glass.css +82 -0
  84. package/themes/gothic.css +82 -0
  85. package/themes/ink-wash.css +82 -0
  86. package/themes/kawaii.css +82 -0
  87. package/themes/kiosk.css +82 -0
  88. package/themes/linear-clean.css +82 -0
  89. package/themes/luxury.css +82 -0
  90. package/themes/mac-classic.css +90 -8
  91. package/themes/material.css +82 -0
  92. package/themes/memphis.css +82 -0
  93. package/themes/mid-century.css +82 -0
  94. package/themes/minimalist.css +82 -0
  95. package/themes/mudcloth.css +82 -0
  96. package/themes/neon.css +83 -0
  97. package/themes/neumorphic.css +82 -0
  98. package/themes/newsprint.css +82 -0
  99. package/themes/notion-editorial.css +82 -0
  100. package/themes/orb.css +455 -0
  101. package/themes/pixel.css +82 -0
  102. package/themes/prism.css +82 -0
  103. package/themes/retro.css +83 -0
  104. package/themes/risograph.css +82 -0
  105. package/themes/scandi.css +82 -0
  106. package/themes/sketch.css +82 -0
  107. package/themes/solarpunk.css +82 -0
  108. package/themes/steampunk.css +82 -0
  109. package/themes/swiss.css +82 -0
  110. package/themes/terminal.css +84 -1
  111. package/themes/trait-wars.css +82 -0
  112. package/themes/ukiyo-e.css +82 -0
  113. package/themes/vaporwave.css +82 -0
  114. package/themes/victorian.css +82 -0
  115. package/themes/wabi-sabi.css +82 -0
  116. package/themes/win95.css +84 -0
  117. package/themes/wireframe.css +82 -0
  118. package/themes/zine.css +82 -0
  119. package/dist/Typography-7QEWUTW3.js +0 -5
  120. package/dist/chunk-E37BYSXY.js +0 -51
package/themes/_base.css CHANGED
@@ -361,3 +361,64 @@ body {
361
361
  .ui-slot-renderer {
362
362
  padding-inline-end: var(--almadar-dock-contained-inset, 0px);
363
363
  }
364
+
365
+ /* --------------------------------------------------------------------
366
+ * Drawing surfaces — canvas, chart, diagram, game board, 3D scene.
367
+ * Defaults derived from each theme's own tokens, so a theme that sets no
368
+ * `diagram`/`scene` axis still draws in its own palette, border weight,
369
+ * faces and corners. Declared on every theme scope (not only :root): a
370
+ * var() alias resolves where it is declared, so a :root-only default would
371
+ * freeze the root theme's colors inside a [data-theme] subtree.
372
+ * -------------------------------------------------------------------- */
373
+ :root,
374
+ [data-theme],
375
+ [data-orbital-theme] {
376
+ --surface-diagram: var(--color-card);
377
+
378
+ --color-diagram-ink: var(--color-foreground);
379
+ --color-diagram-label: var(--color-muted-foreground);
380
+ --color-diagram-guide: var(--color-muted-foreground);
381
+ --color-diagram-axis: var(--color-foreground);
382
+ --color-diagram-grid: var(--color-border);
383
+ --color-diagram-highlight: var(--color-primary);
384
+ --color-diagram-fill: var(--color-muted);
385
+
386
+ /* A categorical palette carries no status meaning: the theme's primary
387
+ * turned around the hue wheel at its own lightness and chroma. */
388
+ --color-series-1: var(--color-primary);
389
+ --color-series-2: oklch(from var(--color-primary) clamp(0.45, l, 0.72) max(c, 0.12) calc(h + 45));
390
+ --color-series-3: oklch(from var(--color-primary) clamp(0.45, l, 0.72) max(c, 0.12) calc(h + 90));
391
+ --color-series-4: oklch(from var(--color-primary) clamp(0.45, l, 0.72) max(c, 0.12) calc(h + 135));
392
+ --color-series-5: oklch(from var(--color-primary) clamp(0.45, l, 0.72) max(c, 0.12) calc(h + 180));
393
+ --color-series-6: oklch(from var(--color-primary) clamp(0.45, l, 0.72) max(c, 0.12) calc(h + 225));
394
+ --color-series-7: oklch(from var(--color-primary) clamp(0.45, l, 0.72) max(c, 0.12) calc(h + 270));
395
+ --color-series-8: oklch(from var(--color-primary) clamp(0.45, l, 0.72) max(c, 0.12) calc(h + 315));
396
+
397
+ --diagram-stroke-thin: var(--border-hairline, var(--border-width-thin, 1px));
398
+ --diagram-stroke-normal: calc(var(--border-standard, var(--border-width, 1px)) * 1.5);
399
+ --diagram-stroke-bold: calc(var(--border-heavy, var(--border-width-thick, 2px)) * 1.5);
400
+ --diagram-line-cap: round;
401
+ --diagram-line-join: round;
402
+ --diagram-dash: 6 4;
403
+ --diagram-dot: 1 4;
404
+ --diagram-fill-style: tint;
405
+ --diagram-fill-opacity: 0.18;
406
+ --diagram-roughness: 0;
407
+ --diagram-glow: 0;
408
+ --diagram-shadow: none;
409
+ --diagram-marker: triangle;
410
+ --diagram-label-font: body;
411
+ --diagram-label-size: sm;
412
+ --diagram-label-weight: var(--font-weight-medium, 500);
413
+ --diagram-label-case: none;
414
+ --diagram-corner: var(--radius-sm, 4px);
415
+
416
+ --material-roughness: 0.6;
417
+ --material-metalness: 0;
418
+ --material-flat: 0;
419
+ --material-outline: 0;
420
+ --light-ambient: 0.55;
421
+ --light-key: 1;
422
+ --light-key-color: #ffffff;
423
+ --scene-fog: 0;
424
+ }
@@ -253,6 +253,37 @@ These separate artistic styles (Art Deco vs Win95 vs wabi-sabi) along dimensions
253
253
 
254
254
  ---
255
255
 
256
+ ### Drawing axes — `diagram`, `scene`, diagram colors, `--surface-diagram`
257
+
258
+ How every drawing surface (learning canvases, charts, graph canvases, game boards, AVL, 3D
259
+ scenes) draws its marks. Components never hardcode a drawing color, weight or face; they resolve
260
+ these through `useCanvasTheme` (`hooks/useCanvasTheme.ts`). Defaults in `_base.css` derive every
261
+ var from the theme's own tokens, so a preset that sets nothing still draws in its own palette,
262
+ border weight, faces and corners. A preset sets them to give its drawings a hand of their own
263
+ (sketch wobble, neon glow, blueprint dashes, Bauhaus square caps).
264
+
265
+ | Var | Source key | Meaning |
266
+ |---|---|---|
267
+ | `--surface-diagram` | `surface.diagram` | Ground a drawing sits on (default `--color-card`) |
268
+ | `--color-series-1…8` | `colors.series-N` | Categorical data palette with no status meaning (default: primary turned around the hue wheel) |
269
+ | `--color-diagram-ink` / `-label` / `-guide` / `-axis` / `-grid` / `-highlight` / `-fill` | `colors.diagram-*` | Mark roles: default stroke, label text, construction lines, axes, grid, the one emphasized mark, default fill |
270
+ | `--diagram-stroke-thin` / `-normal` / `-bold` | `diagram.strokeThin/Normal/Bold` | Stroke weights for guides / marks / emphasis (default from the border rhythm) |
271
+ | `--diagram-line-cap` / `-line-join` | `diagram.lineCap/lineJoin` | `butt\|round\|square` / `miter\|round\|bevel` |
272
+ | `--diagram-dash` / `-dot` | `diagram.dash/dot` | Dash patterns (space-separated lengths) of dashed / dotted marks |
273
+ | `--diagram-fill-style` / `-fill-opacity` | `diagram.fillStyle/fillOpacity` | `solid\|tint\|outline\|hatch`; tint strength |
274
+ | `--diagram-roughness` | `diagram.roughness` | Hand-drawn wobble in px (`0` = exact) |
275
+ | `--diagram-glow` | `diagram.glow` | Glow blur in px around strokes (`0` = none) |
276
+ | `--diagram-shadow` | `diagram.shadow` | Shadow recipe on filled marks |
277
+ | `--diagram-marker` | `diagram.marker` | Arrowhead: `triangle\|open\|line\|dot` |
278
+ | `--diagram-label-font` / `-size` / `-weight` / `-case` | `diagram.label*` | Label face (`body\|display\|mono`), type-scale step, weight, `none\|uppercase` |
279
+ | `--diagram-corner` | `diagram.corner` | Corner radius of rects and bars |
280
+ | `--material-roughness` / `-metalness` / `-flat` / `-outline` | `scene.material*` | 3D material response; `flat` `1` = flat shading; `outline` = toon outline px |
281
+ | `--light-ambient` / `-key` / `-key-color` | `scene.light*` | 3D lighting |
282
+ | `--scene-fog` | `scene.fog` | Depth haze 0–1 |
283
+
284
+ Motion has no drawing-specific vars: animated surfaces use `--duration-*` / `--easing-*` and stop
285
+ when `--motion-enable: off` or `prefers-reduced-motion` is set.
286
+
256
287
  ## Authoring rules
257
288
 
258
289
  1. **Backfill agents** (B1, B2, B3): copy the defaults above verbatim into each existing theme's light and dark blocks. Do not change any pre-existing variable. The migration must produce pixel-identical output to today for every pre-Layer-1 theme.
@@ -262,3 +293,9 @@ These separate artistic styles (Art Deco vs Win95 vs wabi-sabi) along dimensions
262
293
  5. **Wireframe and trait-wars exceptions**. Wireframe's `--easing-standard` is `linear` not the default cubic-bezier; trait-wars's iconography may remain `lucide` even if its visual personality diverges. Document any per-theme override at the top of the theme file.
263
294
  6. **Contrast is gated.** Every theme's canonical foreground/fill pairs must pass WCAG AA 4.5:1 — enforced by `scripts/theme-contrast-audit.mjs` (`pnpm verify:themes`), which runs in CI and before every npm publish and exits non-zero on any violation. A new or edited theme that fails the audit blocks the publish. The script also accepts `--dir <themes-dir>` (`scripts/` is published) so another package can audit its own theme dir with the same rules.
264
295
  7. **No hardcoded palette colors in components.** Components must consume these tokens only (no `text-white`, `bg-gray-800`, `border-indigo-300`, `text-[#hex]`). Enforced by the `almadar/no-hardcoded-colors` ESLint rule (`@almadar/eslint-plugin`, enabled in this package's `eslint.config.cjs`). The single sanctioned exception is media-overlay chrome (white text / dark scrims painted over images or video), which requires an inline `eslint-disable-next-line almadar/no-hardcoded-colors` comment stating the reason.
296
+
297
+ **Drawing roles stay apart.** In every theme mode the roles a canvas draws meaning with — `diagram-ink`,
298
+ `diagram-highlight`, `muted-foreground`, `success`, `warning`, `error`, `series-1`…`series-8` — are at least
299
+ ΔE 10 (CIEDE2000) from each other (`@almadar/core` `__tests__/theme-tone-colors.test.ts`; `INDISTINCT_DELTA_E`).
300
+ A monochrome theme keeps its UI monochrome and gives its drawings a small on-identity palette. In an `outline`
301
+ fill-style theme a mark's meaningful fill becomes its (bold) outline, so the outline look never erases a state.
package/themes/_fonts.css CHANGED
@@ -4,7 +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,600;0,700;1,400;1,600;1,700&family=Fredoka:wght@400;500;600;700&family=Geist:wght@400;500;600&family=Geist+Mono:wght@400;500&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+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&family=Noto+Serif+SC:wght@400;500;700&display=swap");
9
- @import url("https://fonts.googleapis.com/css2?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&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&family=Schibsted+Grotesk:wght@400;500;600;700&display=swap");
10
- @import url("https://fonts.googleapis.com/css2?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+Serif+4: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=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,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");
11
+ @import url("https://fonts.googleapis.com/css2?family=Source+Serif+4:wght@400;600;700&display=swap");
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");
@@ -5,6 +5,7 @@
5
5
  */
6
6
 
7
7
  @import "./almadar.css";
8
+ @import "./almadar-heritage.css";
8
9
  @import "./almadar-website.css";
9
10
  @import "./aqua.css";
10
11
  @import "./arabesque.css";
@@ -42,6 +43,7 @@
42
43
  @import "./neumorphic.css";
43
44
  @import "./newsprint.css";
44
45
  @import "./notion-editorial.css";
46
+ @import "./orb.css";
45
47
  @import "./pixel.css";
46
48
  @import "./prism.css";
47
49
  @import "./retro.css";
@@ -0,0 +1,455 @@
1
+ /**
2
+ * GENERATED — do not edit by hand.
3
+ * Source: packages/almadar-core/themes/almadar-heritage.json
4
+ * Regenerate: node tools/almadar-pattern-sync/dist/index.js themes (or `almadar-sync themes`)
5
+ */
6
+
7
+ [data-theme="almadar-heritage-light"] {
8
+ --color-primary: #00767c;
9
+ --color-primary-hover: #006369;
10
+ --color-primary-foreground: #ffffff;
11
+ --color-secondary: #eef2f2;
12
+ --color-secondary-hover: #e2e9e9;
13
+ --color-secondary-foreground: #0f172a;
14
+ --color-accent: #c9a227;
15
+ --color-accent-foreground: #0f172a;
16
+ --color-tertiary: #b3412f;
17
+ --color-tertiary-hover: #9c3727;
18
+ --color-tertiary-foreground: #ffffff;
19
+ --color-tertiary-muted: rgba(179, 65, 47, 0.12);
20
+ --color-muted: #f1eee8;
21
+ --color-muted-foreground: #475569;
22
+ --color-background: #faf8f5;
23
+ --color-foreground: #0f172a;
24
+ --color-card: #ffffff;
25
+ --color-card-foreground: #0f172a;
26
+ --color-surface: #f3f0ea;
27
+ --color-border: #e4e0d8;
28
+ --color-input: #d6d1c6;
29
+ --color-ring: #00b1b8;
30
+ --color-error: #b42318;
31
+ --color-error-foreground: #ffffff;
32
+ --color-success: #15803d;
33
+ --color-success-foreground: #ffffff;
34
+ --color-warning: #b45309;
35
+ --color-warning-foreground: #ffffff;
36
+ --color-info: #00767c;
37
+ --color-info-foreground: #ffffff;
38
+ --color-scrim: rgba(15, 23, 42, 0.55);
39
+ --color-series-1: #00767c;
40
+ --color-series-2: #7d7d12;
41
+ --color-series-3: #215eac;
42
+ --color-series-4: #a4444c;
43
+ --color-series-5: #536225;
44
+ --color-series-6: #7a4a8a;
45
+ --color-series-7: #875c27;
46
+ --color-series-8: #6b7689;
47
+ --color-diagram-ink: #1f2d3d;
48
+ --color-diagram-label: #334155;
49
+ --color-diagram-guide: #8a8f98;
50
+ --color-diagram-axis: #64748b;
51
+ --color-diagram-grid: #e4e0d8;
52
+ --color-diagram-highlight: #a07a10;
53
+ --color-diagram-fill: #00767c;
54
+ --radius-none: 0px;
55
+ --radius-sm: 4px;
56
+ --radius-md: 6px;
57
+ --radius-lg: 10px;
58
+ --radius-xl: 14px;
59
+ --radius-full: 9999px;
60
+ --border-width: 1px;
61
+ --border-width-thin: 1px;
62
+ --border-width-thick: 2px;
63
+ --font-family: "Cairo", "Noto Naskh Arabic", "Segoe UI", sans-serif;
64
+ --font-weight-normal: 400;
65
+ --font-weight-medium: 500;
66
+ --font-weight-bold: 700;
67
+ --letter-spacing: 0em;
68
+ --line-height: 1.6;
69
+ --icon-color: #0f766e;
70
+ --transition-fast: 150ms;
71
+ --transition-normal: 250ms;
72
+ --transition-slow: 400ms;
73
+ --transition-timing: cubic-bezier(0.4, 0, 0.2, 1);
74
+ --hover-scale: 1;
75
+ --hover-translate-y: 0px;
76
+ --hover-translate-x: 0px;
77
+ --active-scale: 1;
78
+ --active-translate-y: 0px;
79
+ --focus-ring-width: 2px;
80
+ --focus-ring-offset: 2px;
81
+ --focus-ring-color: #14b8a6;
82
+ --shadow-main: 0 6px 20px rgba(15, 23, 42, 0.08), 0 1px 3px rgba(15, 23, 42, 0.05);
83
+ --shadow-sm: 0 1px 3px rgba(15, 23, 42, 0.06);
84
+ --shadow-lg: 0 16px 40px rgba(15, 23, 42, 0.12);
85
+ --shadow-inner: inset 0 1px 3px rgba(31,63,143,0.12);
86
+ --shadow-none: none;
87
+ --shadow-hover: 0 18px 44px rgba(15, 23, 42, 0.12);
88
+ --shadow-active: 0 1px 2px rgba(31,63,143,0.15);
89
+ --space-0: 0px;
90
+ --space-1: 4px;
91
+ --space-2: 8px;
92
+ --space-3: 12px;
93
+ --space-4: 16px;
94
+ --space-5: 20px;
95
+ --space-6: 24px;
96
+ --space-7: 28px;
97
+ --space-8: 32px;
98
+ --space-9: 36px;
99
+ --space-10: 40px;
100
+ --space-11: 44px;
101
+ --space-12: 48px;
102
+ --button-height-sm: 30px;
103
+ --button-height-md: 40px;
104
+ --button-height-lg: 48px;
105
+ --input-height-sm: 30px;
106
+ --input-height-md: 40px;
107
+ --input-height-lg: 48px;
108
+ --row-height-compact: 32px;
109
+ --row-height-normal: 40px;
110
+ --row-height-spacious: 48px;
111
+ --card-padding-sm: 12px;
112
+ --card-padding-md: 18px;
113
+ --card-padding-lg: 24px;
114
+ --dialog-padding: 24px;
115
+ --section-gap: 32px;
116
+ --font-family-display: "Plus Jakarta Sans", "IBM Plex Sans Arabic", system-ui, sans-serif;
117
+ --font-family-body: "Plus Jakarta Sans", "IBM Plex Sans Arabic", system-ui, sans-serif;
118
+ --font-family-mono: "IBM Plex Mono", "IBM Plex Sans Arabic", ui-monospace, SFMono-Regular, Menlo, monospace;
119
+ --heading-weight: 700;
120
+ --heading-transform: none;
121
+ --heading-tracking: -0.02em;
122
+ --heading-style: normal;
123
+ --heading-shadow: none;
124
+ --text-xs: 12px;
125
+ --leading-xs: 16px;
126
+ --text-sm: 14px;
127
+ --leading-sm: 20px;
128
+ --text-base: 16px;
129
+ --leading-base: 24px;
130
+ --text-lg: 18px;
131
+ --leading-lg: 28px;
132
+ --text-xl: 20px;
133
+ --leading-xl: 28px;
134
+ --text-2xl: 24px;
135
+ --leading-2xl: 32px;
136
+ --text-3xl: 30px;
137
+ --leading-3xl: 36px;
138
+ --text-4xl: 36px;
139
+ --leading-4xl: 40px;
140
+ --text-display-1: 48px;
141
+ --leading-display-1: 52px;
142
+ --text-display-2: 60px;
143
+ --leading-display-2: 64px;
144
+ --intent-heading-major-size: var(--text-2xl);
145
+ --intent-heading-major-weight: var(--font-weight-bold);
146
+ --intent-heading-major-leading: var(--leading-2xl);
147
+ --intent-heading-minor-size: var(--text-lg);
148
+ --intent-heading-minor-weight: var(--font-weight-bold);
149
+ --intent-heading-minor-leading: var(--leading-lg);
150
+ --intent-body-emphasis-size: var(--text-base);
151
+ --intent-body-emphasis-weight: var(--font-weight-medium);
152
+ --intent-body-emphasis-leading: var(--leading-base);
153
+ --intent-body-default-size: var(--text-sm);
154
+ --intent-body-default-weight: var(--font-weight-normal);
155
+ --intent-body-default-leading: var(--leading-sm);
156
+ --intent-body-quiet-size: var(--text-sm);
157
+ --intent-body-quiet-weight: var(--font-weight-normal);
158
+ --intent-body-quiet-leading: var(--leading-sm);
159
+ --intent-caption-size: var(--text-xs);
160
+ --intent-caption-weight: var(--font-weight-normal);
161
+ --intent-caption-leading: var(--leading-xs);
162
+ --intent-numeric-size: var(--text-sm);
163
+ --intent-numeric-weight: var(--font-weight-medium);
164
+ --intent-numeric-leading: var(--leading-sm);
165
+ --duration-instant: 0ms;
166
+ --duration-fast: var(--transition-fast);
167
+ --duration-normal: var(--transition-normal);
168
+ --duration-slow: var(--transition-slow);
169
+ --duration-dramatic: 700ms;
170
+ --easing-linear: linear;
171
+ --easing-standard: var(--transition-timing);
172
+ --easing-emphasized: cubic-bezier(0.22, 0.61, 0.36, 1);
173
+ --easing-spring: cubic-bezier(0.25, 0.8, 0.25, 1);
174
+ --motion-modal-enter-from-transform: scale(0.96);
175
+ --motion-modal-exit-to-transform: scale(0.96);
176
+ --motion-popover-enter-from-transform: scale(0.97);
177
+ --motion-popover-exit-to-transform: scale(0.97);
178
+ --motion-toast-enter-from-transform: translateY(-12px);
179
+ --motion-toast-exit-to-transform: translateY(-12px);
180
+ --motion-page-enter-from-transform: translateY(8px);
181
+ --icon-family: phosphor-duotone;
182
+ --icon-stroke-width: 1.5;
183
+ --icon-default-size: 18px;
184
+ --elevation-card: var(--shadow-sm);
185
+ --elevation-popover: var(--shadow-main);
186
+ --elevation-dialog: var(--shadow-lg);
187
+ --elevation-toast: var(--shadow-main);
188
+ --elevation-interactive: var(--shadow-sm);
189
+ --elevation-pressed: var(--shadow-active);
190
+ --radius-container: var(--radius-lg);
191
+ --radius-interactive: var(--radius-md);
192
+ --radius-pill: var(--radius-full);
193
+ --border-hairline: 1px;
194
+ --border-standard: var(--border-width);
195
+ --border-heavy: var(--border-width-thick);
196
+ --corner-shape: round;
197
+ --corner-shape-pill: round;
198
+ --border-style: none;
199
+ --border-style-interactive: solid;
200
+ --surface-backdrop: none;
201
+ --surface-card-image: none;
202
+ --surface-page-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='48' height='48' viewBox='0 0 48 48'><g fill='none' stroke='%2300767c' stroke-opacity='0.07' stroke-width='1'><path d='M24 0V48M0 24H48'/><path d='M24 18L30 24L24 30L18 24Z'/></g></svg>");
203
+ --surface-page-image-size: 48px 48px;
204
+ --diagram-stroke-thin: 1px;
205
+ --diagram-stroke-normal: 1.5px;
206
+ --diagram-stroke-bold: 2.5px;
207
+ --diagram-line-cap: round;
208
+ --diagram-line-join: round;
209
+ --diagram-dash: 6 4;
210
+ --diagram-dot: 1 4;
211
+ --diagram-fill-style: tint;
212
+ --diagram-fill-opacity: 0.16;
213
+ --diagram-roughness: 0;
214
+ --diagram-glow: 0;
215
+ --diagram-shadow: 0 2px 6px rgba(15, 23, 42, 0.12);
216
+ --diagram-marker: triangle;
217
+ --diagram-label-font: body;
218
+ --diagram-label-size: sm;
219
+ --diagram-label-weight: 600;
220
+ --diagram-label-case: none;
221
+ --diagram-corner: 6px;
222
+ --material-roughness: 0.55;
223
+ --material-metalness: 0.25;
224
+ --material-flat: 0;
225
+ --material-outline: 0;
226
+ --light-ambient: 0.55;
227
+ --light-key: 1;
228
+ --light-key-color: #fff4d6;
229
+ --scene-fog: 0.05;
230
+ }
231
+
232
+ [data-theme="almadar-heritage-dark"] {
233
+ --color-primary: #00b1b8;
234
+ --color-primary-hover: #2cc7cd;
235
+ --color-primary-foreground: #0f172a;
236
+ --color-secondary: #1e293b;
237
+ --color-secondary-hover: #283548;
238
+ --color-secondary-foreground: #f1f5f9;
239
+ --color-accent: #d4b44a;
240
+ --color-accent-foreground: #0f172a;
241
+ --color-tertiary: #e0715e;
242
+ --color-tertiary-hover: #e8887a;
243
+ --color-tertiary-foreground: #0f172a;
244
+ --color-tertiary-muted: rgba(224, 113, 94, 0.16);
245
+ --color-muted: #1a2436;
246
+ --color-muted-foreground: #9aa6b8;
247
+ --color-background: #0f172a;
248
+ --color-foreground: #f5f2ea;
249
+ --color-card: #152036;
250
+ --color-card-foreground: #f5f2ea;
251
+ --color-surface: #152036;
252
+ --color-border: #2a3750;
253
+ --color-input: #334360;
254
+ --color-ring: #00b1b8;
255
+ --color-error: #f87171;
256
+ --color-error-foreground: #000000;
257
+ --color-success: #4ade80;
258
+ --color-success-foreground: #000000;
259
+ --color-warning: #fbbf24;
260
+ --color-warning-foreground: #000000;
261
+ --color-info: #2cc7cd;
262
+ --color-info-foreground: #000000;
263
+ --color-scrim: rgba(0, 0, 0, 0.7);
264
+ --color-series-1: #0a98a0;
265
+ --color-series-2: #a9841b;
266
+ --color-series-3: #568acf;
267
+ --color-series-4: #b86a60;
268
+ --color-series-5: #7d9146;
269
+ --color-series-6: #a379b1;
270
+ --color-series-7: #b57b43;
271
+ --color-series-8: #758091;
272
+ --color-diagram-ink: #e6e1d4;
273
+ --color-diagram-label: #c9ced8;
274
+ --color-diagram-guide: #7f8aa0;
275
+ --color-diagram-axis: #98a2b6;
276
+ --color-diagram-grid: #2a3650;
277
+ --color-diagram-highlight: #c3ae41;
278
+ --color-diagram-fill: #00b1b8;
279
+ --radius-none: 0px;
280
+ --radius-sm: 6px;
281
+ --radius-md: 10px;
282
+ --radius-lg: 14px;
283
+ --radius-xl: 20px;
284
+ --radius-full: 9999px;
285
+ --border-width: 1px;
286
+ --border-width-thin: 1px;
287
+ --border-width-thick: 2px;
288
+ --font-family: "Cairo", "Noto Naskh Arabic", "Segoe UI", sans-serif;
289
+ --font-weight-normal: 400;
290
+ --font-weight-medium: 500;
291
+ --font-weight-bold: 700;
292
+ --letter-spacing: 0em;
293
+ --line-height: 1.6;
294
+ --icon-color: #2dd4bf;
295
+ --transition-fast: 150ms;
296
+ --transition-normal: 250ms;
297
+ --transition-slow: 400ms;
298
+ --transition-timing: cubic-bezier(0.4, 0, 0.2, 1);
299
+ --hover-scale: 1;
300
+ --hover-translate-y: 0px;
301
+ --hover-translate-x: 0px;
302
+ --active-scale: 1;
303
+ --active-translate-y: 0px;
304
+ --focus-ring-width: 2px;
305
+ --focus-ring-offset: 2px;
306
+ --focus-ring-color: #2dd4bf;
307
+ --shadow-main: 0 6px 20px rgba(0, 0, 0, 0.45);
308
+ --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.35);
309
+ --shadow-lg: 0 16px 40px rgba(0, 0, 0, 0.55);
310
+ --shadow-inner: inset 0 1px 3px rgba(0,0,0,0.4);
311
+ --shadow-none: none;
312
+ --shadow-hover: 0 18px 44px rgba(0, 0, 0, 0.55);
313
+ --shadow-active: 0 1px 2px rgba(0,0,0,0.5);
314
+ --space-0: 0px;
315
+ --space-1: 4px;
316
+ --space-2: 8px;
317
+ --space-3: 12px;
318
+ --space-4: 16px;
319
+ --space-5: 20px;
320
+ --space-6: 24px;
321
+ --space-7: 28px;
322
+ --space-8: 32px;
323
+ --space-9: 36px;
324
+ --space-10: 40px;
325
+ --space-11: 44px;
326
+ --space-12: 48px;
327
+ --button-height-sm: 30px;
328
+ --button-height-md: 40px;
329
+ --button-height-lg: 48px;
330
+ --input-height-sm: 30px;
331
+ --input-height-md: 40px;
332
+ --input-height-lg: 48px;
333
+ --row-height-compact: 32px;
334
+ --row-height-normal: 40px;
335
+ --row-height-spacious: 48px;
336
+ --card-padding-sm: 12px;
337
+ --card-padding-md: 18px;
338
+ --card-padding-lg: 24px;
339
+ --dialog-padding: 24px;
340
+ --section-gap: 32px;
341
+ --font-family-display: "Source Serif 4", "IBM Plex Sans Arabic", Georgia, serif;
342
+ --font-family-body: "Inter", "IBM Plex Sans Arabic", system-ui, sans-serif;
343
+ --font-family-mono: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
344
+ --heading-weight: 600;
345
+ --heading-transform: none;
346
+ --heading-tracking: -0.02em;
347
+ --heading-style: normal;
348
+ --heading-shadow: none;
349
+ --text-xs: 12px;
350
+ --leading-xs: 16px;
351
+ --text-sm: 14px;
352
+ --leading-sm: 20px;
353
+ --text-base: 16px;
354
+ --leading-base: 24px;
355
+ --text-lg: 18px;
356
+ --leading-lg: 28px;
357
+ --text-xl: 20px;
358
+ --leading-xl: 28px;
359
+ --text-2xl: 24px;
360
+ --leading-2xl: 32px;
361
+ --text-3xl: 30px;
362
+ --leading-3xl: 36px;
363
+ --text-4xl: 36px;
364
+ --leading-4xl: 40px;
365
+ --text-display-1: 48px;
366
+ --leading-display-1: 52px;
367
+ --text-display-2: 60px;
368
+ --leading-display-2: 64px;
369
+ --intent-heading-major-size: var(--text-2xl);
370
+ --intent-heading-major-weight: var(--font-weight-bold);
371
+ --intent-heading-major-leading: var(--leading-2xl);
372
+ --intent-heading-minor-size: var(--text-lg);
373
+ --intent-heading-minor-weight: var(--font-weight-bold);
374
+ --intent-heading-minor-leading: var(--leading-lg);
375
+ --intent-body-emphasis-size: var(--text-base);
376
+ --intent-body-emphasis-weight: var(--font-weight-medium);
377
+ --intent-body-emphasis-leading: var(--leading-base);
378
+ --intent-body-default-size: var(--text-sm);
379
+ --intent-body-default-weight: var(--font-weight-normal);
380
+ --intent-body-default-leading: var(--leading-sm);
381
+ --intent-body-quiet-size: var(--text-sm);
382
+ --intent-body-quiet-weight: var(--font-weight-normal);
383
+ --intent-body-quiet-leading: var(--leading-sm);
384
+ --intent-caption-size: var(--text-xs);
385
+ --intent-caption-weight: var(--font-weight-normal);
386
+ --intent-caption-leading: var(--leading-xs);
387
+ --intent-numeric-size: var(--text-sm);
388
+ --intent-numeric-weight: var(--font-weight-medium);
389
+ --intent-numeric-leading: var(--leading-sm);
390
+ --duration-instant: 0ms;
391
+ --duration-fast: var(--transition-fast);
392
+ --duration-normal: var(--transition-normal);
393
+ --duration-slow: var(--transition-slow);
394
+ --duration-dramatic: 700ms;
395
+ --easing-linear: linear;
396
+ --easing-standard: var(--transition-timing);
397
+ --easing-emphasized: cubic-bezier(0.22, 0.61, 0.36, 1);
398
+ --easing-spring: cubic-bezier(0.25, 0.8, 0.25, 1);
399
+ --motion-modal-enter-from-transform: scale(0.96);
400
+ --motion-modal-exit-to-transform: scale(0.96);
401
+ --motion-popover-enter-from-transform: scale(0.97);
402
+ --motion-popover-exit-to-transform: scale(0.97);
403
+ --motion-toast-enter-from-transform: translateY(-12px);
404
+ --motion-toast-exit-to-transform: translateY(-12px);
405
+ --motion-page-enter-from-transform: translateY(8px);
406
+ --icon-family: phosphor-duotone;
407
+ --icon-stroke-width: 1.5;
408
+ --icon-default-size: 18px;
409
+ --elevation-card: var(--shadow-sm);
410
+ --elevation-popover: var(--shadow-main);
411
+ --elevation-dialog: var(--shadow-lg);
412
+ --elevation-toast: var(--shadow-main);
413
+ --elevation-interactive: var(--shadow-sm);
414
+ --elevation-pressed: var(--shadow-active);
415
+ --radius-container: var(--radius-lg);
416
+ --radius-interactive: var(--radius-md);
417
+ --radius-pill: var(--radius-full);
418
+ --border-hairline: 1px;
419
+ --border-standard: var(--border-width);
420
+ --border-heavy: var(--border-width-thick);
421
+ --corner-shape: round;
422
+ --corner-shape-pill: round;
423
+ --border-style: none;
424
+ --border-style-interactive: solid;
425
+ --surface-backdrop: none;
426
+ --surface-card-image: none;
427
+ --surface-page-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='48' height='48' viewBox='0 0 48 48'><g fill='none' stroke='%2300b1b8' stroke-opacity='0.06' stroke-width='1'><path d='M24 0V48M0 24H48'/><path d='M24 18L30 24L24 30L18 24Z'/></g></svg>");
428
+ --surface-page-image-size: 72px 72px;
429
+ --diagram-stroke-thin: 1px;
430
+ --diagram-stroke-normal: 1.5px;
431
+ --diagram-stroke-bold: 2.5px;
432
+ --diagram-line-cap: round;
433
+ --diagram-line-join: round;
434
+ --diagram-dash: 6 4;
435
+ --diagram-dot: 1 4;
436
+ --diagram-fill-style: tint;
437
+ --diagram-fill-opacity: 0.16;
438
+ --diagram-roughness: 0;
439
+ --diagram-glow: 0;
440
+ --diagram-shadow: 0 2px 6px rgba(15, 23, 42, 0.12);
441
+ --diagram-marker: triangle;
442
+ --diagram-label-font: body;
443
+ --diagram-label-size: sm;
444
+ --diagram-label-weight: 600;
445
+ --diagram-label-case: none;
446
+ --diagram-corner: 6px;
447
+ --material-roughness: 0.55;
448
+ --material-metalness: 0.25;
449
+ --material-flat: 0;
450
+ --material-outline: 0;
451
+ --light-ambient: 0.55;
452
+ --light-key: 1;
453
+ --light-key-color: #fff4d6;
454
+ --scene-fog: 0.05;
455
+ }