@almadar/ui 4.57.5 → 5.1.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 (48) hide show
  1. package/dist/avl/index.cjs +2499 -1903
  2. package/dist/avl/index.js +1111 -518
  3. package/dist/components/atoms/Icon.d.ts +7 -4
  4. package/dist/components/index.cjs +2064 -1636
  5. package/dist/components/index.js +905 -480
  6. package/dist/components/molecules/Breadcrumb.d.ts +4 -4
  7. package/dist/components/molecules/EmptyState.d.ts +1 -1
  8. package/dist/components/templates/DashboardLayout.d.ts +1 -1
  9. package/dist/context/index.cjs +199 -0
  10. package/dist/context/index.js +199 -0
  11. package/dist/context/themeTokens.d.ts +1 -1
  12. package/dist/docs/index.cjs +456 -98
  13. package/dist/docs/index.d.cts +7 -4
  14. package/dist/docs/index.js +429 -74
  15. package/dist/lib/iconFamily.d.ts +41 -0
  16. package/dist/marketing/index.cjs +480 -124
  17. package/dist/marketing/index.d.cts +7 -4
  18. package/dist/marketing/index.js +446 -93
  19. package/dist/providers/index.cjs +1933 -1505
  20. package/dist/providers/index.js +909 -484
  21. package/dist/runtime/index.cjs +2130 -1534
  22. package/dist/runtime/index.js +1071 -478
  23. package/package.json +5 -2
  24. package/tailwind-preset.cjs +118 -3
  25. package/themes/_contract.md +198 -0
  26. package/themes/almadar-website.css +212 -0
  27. package/themes/almadar.css +210 -0
  28. package/themes/arctic.css +210 -0
  29. package/themes/atelier.css +427 -0
  30. package/themes/copper.css +210 -0
  31. package/themes/ember.css +210 -0
  32. package/themes/forest.css +210 -0
  33. package/themes/gazette.css +411 -0
  34. package/themes/index.css +12 -0
  35. package/themes/kiosk.css +412 -0
  36. package/themes/lavender.css +210 -0
  37. package/themes/midnight.css +210 -0
  38. package/themes/minimalist.css +210 -0
  39. package/themes/neon.css +210 -0
  40. package/themes/ocean.css +210 -0
  41. package/themes/prism.css +406 -0
  42. package/themes/rose.css +210 -0
  43. package/themes/sand.css +210 -0
  44. package/themes/slate.css +210 -0
  45. package/themes/sunset.css +210 -0
  46. package/themes/terminal.css +422 -0
  47. package/themes/trait-wars.css +210 -0
  48. package/themes/wireframe.css +216 -0
@@ -20,9 +20,9 @@ export interface BreadcrumbItem {
20
20
  */
21
21
  path?: string;
22
22
  /**
23
- * Item icon
23
+ * Item icon (canonical kebab-case name or LucideIcon component)
24
24
  */
25
- icon?: LucideIcon;
25
+ icon?: LucideIcon | string;
26
26
  /**
27
27
  * Click handler (if href not provided)
28
28
  */
@@ -40,9 +40,9 @@ export interface BreadcrumbProps {
40
40
  */
41
41
  items: BreadcrumbItem[];
42
42
  /**
43
- * Separator icon
43
+ * Separator icon (canonical kebab-case name or LucideIcon component)
44
44
  */
45
- separator?: LucideIcon;
45
+ separator?: LucideIcon | string;
46
46
  /**
47
47
  * Maximum items to show (truncates with ellipsis)
48
48
  */
@@ -1,6 +1,6 @@
1
1
  import React from "react";
2
2
  import type { EventEmit } from "@almadar/core";
3
- import { LucideIcon } from "lucide-react";
3
+ import type { LucideIcon } from "lucide-react";
4
4
  export interface EmptyStateProps {
5
5
  /**
6
6
  * Icon to display. Accepts either:
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import { LucideIcon } from "lucide-react";
2
+ import type { LucideIcon } from "lucide-react";
3
3
  import type { EventEmit, EventKey } from "@almadar/core";
4
4
  export interface NavItem {
5
5
  label: string;
@@ -467,6 +467,37 @@ var BUILT_IN_THEMES = [
467
467
  displayName: "Copper",
468
468
  hasLightMode: true,
469
469
  hasDarkMode: true
470
+ },
471
+ // Layer 1 skin axes — truly-unique themes (compact tech / editorial / brutalist dense / display-heavy / touch-first)
472
+ {
473
+ name: "prism",
474
+ displayName: "Prism",
475
+ hasLightMode: true,
476
+ hasDarkMode: true
477
+ },
478
+ {
479
+ name: "gazette",
480
+ displayName: "Gazette",
481
+ hasLightMode: true,
482
+ hasDarkMode: true
483
+ },
484
+ {
485
+ name: "terminal",
486
+ displayName: "Terminal",
487
+ hasLightMode: true,
488
+ hasDarkMode: true
489
+ },
490
+ {
491
+ name: "atelier",
492
+ displayName: "Atelier",
493
+ hasLightMode: true,
494
+ hasDarkMode: true
495
+ },
496
+ {
497
+ name: "kiosk",
498
+ displayName: "Kiosk",
499
+ hasLightMode: true,
500
+ hasDarkMode: true
470
501
  }
471
502
  ];
472
503
  var ThemeContext = react.createContext(void 0);
@@ -662,8 +693,176 @@ function themeTokensToCssVars(tokens, mode = "light", darkVariant) {
662
693
  vars[`--shadow-${key}`] = value;
663
694
  }
664
695
  }
696
+ const pickDensity = isDark && darkVariant?.density ? darkVariant.density : tokens.density;
697
+ emitDensity(pickDensity, vars);
698
+ const pickTypeScale = isDark && darkVariant?.typeScale ? darkVariant.typeScale : tokens.typeScale;
699
+ emitTypeScale(pickTypeScale, vars);
700
+ const pickMotion = isDark && darkVariant?.motion ? darkVariant.motion : tokens.motion;
701
+ emitMotion(pickMotion, vars);
702
+ const pickIconography = isDark && darkVariant?.iconography ? darkVariant.iconography : tokens.iconography;
703
+ emitIconography(pickIconography, vars);
704
+ const pickElevation = isDark && darkVariant?.elevation ? darkVariant.elevation : tokens.elevation;
705
+ emitElevation(pickElevation, vars);
706
+ const pickGeometry = isDark && darkVariant?.geometry ? darkVariant.geometry : tokens.geometry;
707
+ emitGeometry(pickGeometry, vars);
665
708
  return vars;
666
709
  }
710
+ function emitDensity(density, vars) {
711
+ if (!density) return;
712
+ if (density.spacing) {
713
+ const s = density.spacing;
714
+ const pairs2 = [
715
+ ["0", s.space0],
716
+ ["1", s.space1],
717
+ ["2", s.space2],
718
+ ["3", s.space3],
719
+ ["4", s.space4],
720
+ ["5", s.space5],
721
+ ["6", s.space6],
722
+ ["7", s.space7],
723
+ ["8", s.space8],
724
+ ["9", s.space9],
725
+ ["10", s.space10],
726
+ ["11", s.space11],
727
+ ["12", s.space12]
728
+ ];
729
+ for (const [k, v] of pairs2) {
730
+ if (v !== void 0) vars[`--space-${k}`] = v;
731
+ }
732
+ }
733
+ const pairs = [
734
+ ["button-height-sm", density.buttonHeightSm],
735
+ ["button-height-md", density.buttonHeightMd],
736
+ ["button-height-lg", density.buttonHeightLg],
737
+ ["input-height-sm", density.inputHeightSm],
738
+ ["input-height-md", density.inputHeightMd],
739
+ ["input-height-lg", density.inputHeightLg],
740
+ ["row-height-compact", density.rowHeightCompact],
741
+ ["row-height-normal", density.rowHeightNormal],
742
+ ["row-height-spacious", density.rowHeightSpacious],
743
+ ["card-padding-sm", density.cardPaddingSm],
744
+ ["card-padding-md", density.cardPaddingMd],
745
+ ["card-padding-lg", density.cardPaddingLg],
746
+ ["dialog-padding", density.dialogPadding],
747
+ ["section-gap", density.sectionGap]
748
+ ];
749
+ for (const [k, v] of pairs) {
750
+ if (v !== void 0) vars[`--${k}`] = v;
751
+ }
752
+ }
753
+ function typeSizeKeyStr(k) {
754
+ return k;
755
+ }
756
+ function typeWeightStr(w) {
757
+ return w;
758
+ }
759
+ function emitTypeIntent(name, intent, vars) {
760
+ const sizeKey = typeSizeKeyStr(intent.size);
761
+ const weight = typeWeightStr(intent.weight);
762
+ vars[`--intent-${name}-size`] = `var(--text-${sizeKey})`;
763
+ vars[`--intent-${name}-weight`] = `var(--font-weight-${weight})`;
764
+ vars[`--intent-${name}-leading`] = `var(--leading-${sizeKey})`;
765
+ }
766
+ function emitTypeScale(ts, vars) {
767
+ if (!ts) return;
768
+ if (ts.displayFamily !== void 0) vars["--font-family-display"] = ts.displayFamily;
769
+ if (ts.bodyFamily !== void 0) vars["--font-family-body"] = ts.bodyFamily;
770
+ if (ts.monoFamily !== void 0) vars["--font-family-mono"] = ts.monoFamily;
771
+ if (ts.scale) {
772
+ const s = ts.scale;
773
+ const pairs = [
774
+ ["xs", s.xs],
775
+ ["sm", s.sm],
776
+ ["base", s.base],
777
+ ["lg", s.lg],
778
+ ["xl", s.xl],
779
+ ["2xl", s["2xl"]],
780
+ ["3xl", s["3xl"]],
781
+ ["4xl", s["4xl"]],
782
+ ["display-1", s["display-1"]],
783
+ ["display-2", s["display-2"]]
784
+ ];
785
+ for (const [k, entry] of pairs) {
786
+ if (entry !== void 0) {
787
+ vars[`--text-${k}`] = entry.size;
788
+ vars[`--leading-${k}`] = entry.lineHeight;
789
+ }
790
+ }
791
+ }
792
+ if (ts.intents) {
793
+ const i = ts.intents;
794
+ if (i.headingMajor) emitTypeIntent("heading-major", i.headingMajor, vars);
795
+ if (i.headingMinor) emitTypeIntent("heading-minor", i.headingMinor, vars);
796
+ if (i.bodyEmphasis) emitTypeIntent("body-emphasis", i.bodyEmphasis, vars);
797
+ if (i.bodyDefault) emitTypeIntent("body-default", i.bodyDefault, vars);
798
+ if (i.bodyQuiet) emitTypeIntent("body-quiet", i.bodyQuiet, vars);
799
+ if (i.caption) emitTypeIntent("caption", i.caption, vars);
800
+ if (i.numeric) emitTypeIntent("numeric", i.numeric, vars);
801
+ }
802
+ }
803
+ function emitMotionIntent(name, intent, vars) {
804
+ vars[`--intent-${name}-duration`] = `var(--duration-${intent.duration})`;
805
+ vars[`--intent-${name}-easing`] = `var(--easing-${intent.easing})`;
806
+ }
807
+ function emitMotion(m, vars) {
808
+ if (!m) return;
809
+ if (m.durations) {
810
+ const d = m.durations;
811
+ const pairs = [
812
+ ["instant", d.instant],
813
+ ["fast", d.fast],
814
+ ["normal", d.normal],
815
+ ["slow", d.slow],
816
+ ["dramatic", d.dramatic]
817
+ ];
818
+ for (const [k, v] of pairs) {
819
+ if (v !== void 0) vars[`--duration-${k}`] = v;
820
+ }
821
+ }
822
+ if (m.easings) {
823
+ const e = m.easings;
824
+ const pairs = [
825
+ ["linear", e.linear],
826
+ ["standard", e.standard],
827
+ ["emphasized", e.emphasized],
828
+ ["spring", e.spring]
829
+ ];
830
+ for (const [k, v] of pairs) {
831
+ if (v !== void 0) vars[`--easing-${k}`] = v;
832
+ }
833
+ }
834
+ if (m.intents) {
835
+ const i = m.intents;
836
+ if (i.enter) emitMotionIntent("enter", i.enter, vars);
837
+ if (i.exit) emitMotionIntent("exit", i.exit, vars);
838
+ if (i.hover) emitMotionIntent("hover", i.hover, vars);
839
+ if (i.press) emitMotionIntent("press", i.press, vars);
840
+ if (i.expand) emitMotionIntent("expand", i.expand, vars);
841
+ if (i.transition) emitMotionIntent("transition", i.transition, vars);
842
+ }
843
+ }
844
+ function emitIconography(i, vars) {
845
+ if (!i) return;
846
+ if (i.family !== void 0) vars["--icon-family"] = i.family;
847
+ if (i.strokeWidth !== void 0) vars["--icon-stroke-width"] = i.strokeWidth;
848
+ if (i.defaultSize !== void 0) vars["--icon-default-size"] = i.defaultSize;
849
+ }
850
+ function emitElevation(e, vars) {
851
+ if (!e) return;
852
+ if (e.cardElevation !== void 0) vars["--elevation-card"] = e.cardElevation;
853
+ if (e.popoverElevation !== void 0) vars["--elevation-popover"] = e.popoverElevation;
854
+ if (e.dialogElevation !== void 0) vars["--elevation-dialog"] = e.dialogElevation;
855
+ if (e.toastElevation !== void 0) vars["--elevation-toast"] = e.toastElevation;
856
+ }
857
+ function emitGeometry(g, vars) {
858
+ if (!g) return;
859
+ if (g.radiusContainer !== void 0) vars["--radius-container"] = g.radiusContainer;
860
+ if (g.radiusInteractive !== void 0) vars["--radius-interactive"] = g.radiusInteractive;
861
+ if (g.radiusPill !== void 0) vars["--radius-pill"] = g.radiusPill;
862
+ if (g.borderHairline !== void 0) vars["--border-hairline"] = g.borderHairline;
863
+ if (g.borderStandard !== void 0) vars["--border-standard"] = g.borderStandard;
864
+ if (g.borderHeavy !== void 0) vars["--border-heavy"] = g.borderHeavy;
865
+ }
667
866
  function resolveThemeForRuntime(theme) {
668
867
  if (theme === void 0) return void 0;
669
868
  if (typeof theme === "string") return void 0;
@@ -465,6 +465,37 @@ var BUILT_IN_THEMES = [
465
465
  displayName: "Copper",
466
466
  hasLightMode: true,
467
467
  hasDarkMode: true
468
+ },
469
+ // Layer 1 skin axes — truly-unique themes (compact tech / editorial / brutalist dense / display-heavy / touch-first)
470
+ {
471
+ name: "prism",
472
+ displayName: "Prism",
473
+ hasLightMode: true,
474
+ hasDarkMode: true
475
+ },
476
+ {
477
+ name: "gazette",
478
+ displayName: "Gazette",
479
+ hasLightMode: true,
480
+ hasDarkMode: true
481
+ },
482
+ {
483
+ name: "terminal",
484
+ displayName: "Terminal",
485
+ hasLightMode: true,
486
+ hasDarkMode: true
487
+ },
488
+ {
489
+ name: "atelier",
490
+ displayName: "Atelier",
491
+ hasLightMode: true,
492
+ hasDarkMode: true
493
+ },
494
+ {
495
+ name: "kiosk",
496
+ displayName: "Kiosk",
497
+ hasLightMode: true,
498
+ hasDarkMode: true
468
499
  }
469
500
  ];
470
501
  var ThemeContext = createContext(void 0);
@@ -660,8 +691,176 @@ function themeTokensToCssVars(tokens, mode = "light", darkVariant) {
660
691
  vars[`--shadow-${key}`] = value;
661
692
  }
662
693
  }
694
+ const pickDensity = isDark && darkVariant?.density ? darkVariant.density : tokens.density;
695
+ emitDensity(pickDensity, vars);
696
+ const pickTypeScale = isDark && darkVariant?.typeScale ? darkVariant.typeScale : tokens.typeScale;
697
+ emitTypeScale(pickTypeScale, vars);
698
+ const pickMotion = isDark && darkVariant?.motion ? darkVariant.motion : tokens.motion;
699
+ emitMotion(pickMotion, vars);
700
+ const pickIconography = isDark && darkVariant?.iconography ? darkVariant.iconography : tokens.iconography;
701
+ emitIconography(pickIconography, vars);
702
+ const pickElevation = isDark && darkVariant?.elevation ? darkVariant.elevation : tokens.elevation;
703
+ emitElevation(pickElevation, vars);
704
+ const pickGeometry = isDark && darkVariant?.geometry ? darkVariant.geometry : tokens.geometry;
705
+ emitGeometry(pickGeometry, vars);
663
706
  return vars;
664
707
  }
708
+ function emitDensity(density, vars) {
709
+ if (!density) return;
710
+ if (density.spacing) {
711
+ const s = density.spacing;
712
+ const pairs2 = [
713
+ ["0", s.space0],
714
+ ["1", s.space1],
715
+ ["2", s.space2],
716
+ ["3", s.space3],
717
+ ["4", s.space4],
718
+ ["5", s.space5],
719
+ ["6", s.space6],
720
+ ["7", s.space7],
721
+ ["8", s.space8],
722
+ ["9", s.space9],
723
+ ["10", s.space10],
724
+ ["11", s.space11],
725
+ ["12", s.space12]
726
+ ];
727
+ for (const [k, v] of pairs2) {
728
+ if (v !== void 0) vars[`--space-${k}`] = v;
729
+ }
730
+ }
731
+ const pairs = [
732
+ ["button-height-sm", density.buttonHeightSm],
733
+ ["button-height-md", density.buttonHeightMd],
734
+ ["button-height-lg", density.buttonHeightLg],
735
+ ["input-height-sm", density.inputHeightSm],
736
+ ["input-height-md", density.inputHeightMd],
737
+ ["input-height-lg", density.inputHeightLg],
738
+ ["row-height-compact", density.rowHeightCompact],
739
+ ["row-height-normal", density.rowHeightNormal],
740
+ ["row-height-spacious", density.rowHeightSpacious],
741
+ ["card-padding-sm", density.cardPaddingSm],
742
+ ["card-padding-md", density.cardPaddingMd],
743
+ ["card-padding-lg", density.cardPaddingLg],
744
+ ["dialog-padding", density.dialogPadding],
745
+ ["section-gap", density.sectionGap]
746
+ ];
747
+ for (const [k, v] of pairs) {
748
+ if (v !== void 0) vars[`--${k}`] = v;
749
+ }
750
+ }
751
+ function typeSizeKeyStr(k) {
752
+ return k;
753
+ }
754
+ function typeWeightStr(w) {
755
+ return w;
756
+ }
757
+ function emitTypeIntent(name, intent, vars) {
758
+ const sizeKey = typeSizeKeyStr(intent.size);
759
+ const weight = typeWeightStr(intent.weight);
760
+ vars[`--intent-${name}-size`] = `var(--text-${sizeKey})`;
761
+ vars[`--intent-${name}-weight`] = `var(--font-weight-${weight})`;
762
+ vars[`--intent-${name}-leading`] = `var(--leading-${sizeKey})`;
763
+ }
764
+ function emitTypeScale(ts, vars) {
765
+ if (!ts) return;
766
+ if (ts.displayFamily !== void 0) vars["--font-family-display"] = ts.displayFamily;
767
+ if (ts.bodyFamily !== void 0) vars["--font-family-body"] = ts.bodyFamily;
768
+ if (ts.monoFamily !== void 0) vars["--font-family-mono"] = ts.monoFamily;
769
+ if (ts.scale) {
770
+ const s = ts.scale;
771
+ const pairs = [
772
+ ["xs", s.xs],
773
+ ["sm", s.sm],
774
+ ["base", s.base],
775
+ ["lg", s.lg],
776
+ ["xl", s.xl],
777
+ ["2xl", s["2xl"]],
778
+ ["3xl", s["3xl"]],
779
+ ["4xl", s["4xl"]],
780
+ ["display-1", s["display-1"]],
781
+ ["display-2", s["display-2"]]
782
+ ];
783
+ for (const [k, entry] of pairs) {
784
+ if (entry !== void 0) {
785
+ vars[`--text-${k}`] = entry.size;
786
+ vars[`--leading-${k}`] = entry.lineHeight;
787
+ }
788
+ }
789
+ }
790
+ if (ts.intents) {
791
+ const i = ts.intents;
792
+ if (i.headingMajor) emitTypeIntent("heading-major", i.headingMajor, vars);
793
+ if (i.headingMinor) emitTypeIntent("heading-minor", i.headingMinor, vars);
794
+ if (i.bodyEmphasis) emitTypeIntent("body-emphasis", i.bodyEmphasis, vars);
795
+ if (i.bodyDefault) emitTypeIntent("body-default", i.bodyDefault, vars);
796
+ if (i.bodyQuiet) emitTypeIntent("body-quiet", i.bodyQuiet, vars);
797
+ if (i.caption) emitTypeIntent("caption", i.caption, vars);
798
+ if (i.numeric) emitTypeIntent("numeric", i.numeric, vars);
799
+ }
800
+ }
801
+ function emitMotionIntent(name, intent, vars) {
802
+ vars[`--intent-${name}-duration`] = `var(--duration-${intent.duration})`;
803
+ vars[`--intent-${name}-easing`] = `var(--easing-${intent.easing})`;
804
+ }
805
+ function emitMotion(m, vars) {
806
+ if (!m) return;
807
+ if (m.durations) {
808
+ const d = m.durations;
809
+ const pairs = [
810
+ ["instant", d.instant],
811
+ ["fast", d.fast],
812
+ ["normal", d.normal],
813
+ ["slow", d.slow],
814
+ ["dramatic", d.dramatic]
815
+ ];
816
+ for (const [k, v] of pairs) {
817
+ if (v !== void 0) vars[`--duration-${k}`] = v;
818
+ }
819
+ }
820
+ if (m.easings) {
821
+ const e = m.easings;
822
+ const pairs = [
823
+ ["linear", e.linear],
824
+ ["standard", e.standard],
825
+ ["emphasized", e.emphasized],
826
+ ["spring", e.spring]
827
+ ];
828
+ for (const [k, v] of pairs) {
829
+ if (v !== void 0) vars[`--easing-${k}`] = v;
830
+ }
831
+ }
832
+ if (m.intents) {
833
+ const i = m.intents;
834
+ if (i.enter) emitMotionIntent("enter", i.enter, vars);
835
+ if (i.exit) emitMotionIntent("exit", i.exit, vars);
836
+ if (i.hover) emitMotionIntent("hover", i.hover, vars);
837
+ if (i.press) emitMotionIntent("press", i.press, vars);
838
+ if (i.expand) emitMotionIntent("expand", i.expand, vars);
839
+ if (i.transition) emitMotionIntent("transition", i.transition, vars);
840
+ }
841
+ }
842
+ function emitIconography(i, vars) {
843
+ if (!i) return;
844
+ if (i.family !== void 0) vars["--icon-family"] = i.family;
845
+ if (i.strokeWidth !== void 0) vars["--icon-stroke-width"] = i.strokeWidth;
846
+ if (i.defaultSize !== void 0) vars["--icon-default-size"] = i.defaultSize;
847
+ }
848
+ function emitElevation(e, vars) {
849
+ if (!e) return;
850
+ if (e.cardElevation !== void 0) vars["--elevation-card"] = e.cardElevation;
851
+ if (e.popoverElevation !== void 0) vars["--elevation-popover"] = e.popoverElevation;
852
+ if (e.dialogElevation !== void 0) vars["--elevation-dialog"] = e.dialogElevation;
853
+ if (e.toastElevation !== void 0) vars["--elevation-toast"] = e.toastElevation;
854
+ }
855
+ function emitGeometry(g, vars) {
856
+ if (!g) return;
857
+ if (g.radiusContainer !== void 0) vars["--radius-container"] = g.radiusContainer;
858
+ if (g.radiusInteractive !== void 0) vars["--radius-interactive"] = g.radiusInteractive;
859
+ if (g.radiusPill !== void 0) vars["--radius-pill"] = g.radiusPill;
860
+ if (g.borderHairline !== void 0) vars["--border-hairline"] = g.borderHairline;
861
+ if (g.borderStandard !== void 0) vars["--border-standard"] = g.borderStandard;
862
+ if (g.borderHeavy !== void 0) vars["--border-heavy"] = g.borderHeavy;
863
+ }
665
864
  function resolveThemeForRuntime(theme) {
666
865
  if (theme === void 0) return void 0;
667
866
  if (typeof theme === "string") return void 0;
@@ -24,7 +24,7 @@
24
24
  *
25
25
  * @packageDocumentation
26
26
  */
27
- import type { ThemeDefinition, ThemeTokens, ThemeVariant, ThemeRef } from '@almadar/core';
27
+ import type { ThemeDefinition, ThemeRef, ThemeTokens, ThemeVariant } from '@almadar/core';
28
28
  /** Resolved color mode. Mirrors `ThemeContext.resolvedMode`. */
29
29
  export type ThemeMode = 'light' | 'dark';
30
30
  /**