@marwes-ui/core 1.3.0 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,8 +1,24 @@
1
+ // src/theme/text-variant.ts
2
+ var TextVariant = {
3
+ display: "display",
4
+ label: "label",
5
+ labelSmall: "label-small",
6
+ caption: "caption",
7
+ overline: "overline",
8
+ micro: "micro"
9
+ };
10
+
1
11
  // src/theme/theme-types.ts
2
12
  var ThemeMode = {
3
13
  light: "light",
4
14
  dark: "dark"
5
15
  };
16
+ var defaultThemeBreakpoints = {
17
+ mobile: 640,
18
+ tablet: 900,
19
+ desktop: 1200,
20
+ wideDesktop: 1440
21
+ };
6
22
 
7
23
  // src/theme/theme-mode.ts
8
24
  function isThemeMode(value) {
@@ -90,9 +106,24 @@ function statusColorVars(role, tokens) {
90
106
  [`--mw-color-status-${role}-text`]: tokens.text,
91
107
  [`--mw-color-status-${role}-icon`]: tokens.icon,
92
108
  [`--mw-color-status-${role}-border`]: tokens.border,
109
+ ...tokens.borderAccessible ? { [`--mw-color-status-${role}-border-accessible`]: tokens.borderAccessible } : {},
93
110
  [`--mw-color-status-${role}-border-strong`]: tokens.borderStrong
94
111
  };
95
112
  }
113
+ function typographyStyleVars(prefix, style) {
114
+ return {
115
+ [`${prefix}-font-size`]: `${style.fontSize}px`,
116
+ [`${prefix}-line-height`]: `${style.lineHeight}`,
117
+ [`${prefix}-font-weight`]: `${style.fontWeight}`,
118
+ [`${prefix}-letter-spacing`]: `${style.letterSpacing}px`
119
+ };
120
+ }
121
+ function textTypographyStyleVars(variant, style) {
122
+ return {
123
+ ...typographyStyleVars(`--mw-typography-text-${variant}`, style),
124
+ [`--mw-typography-text-${variant}-transform`]: style.textTransform ?? "none"
125
+ };
126
+ }
96
127
  function themeToCSSVars(theme) {
97
128
  const { color, font, ui, typography } = theme;
98
129
  return {
@@ -106,10 +137,12 @@ function themeToCSSVars(theme) {
106
137
  ...colorRoleVars("secondary", color.secondary),
107
138
  "--mw-color-secondary-border": color.secondary.border,
108
139
  "--mw-color-secondary-border-disabled": color.secondary.borderDisabled,
109
- // Surface / semantic neutrals (16)
140
+ // Surface / semantic neutrals (24)
110
141
  "--mw-color-background": color.background,
111
142
  "--mw-color-surface": color.surface,
143
+ "--mw-color-surface-primary": color.surfacePrimary,
112
144
  "--mw-color-surface-subtle": color.surfaceSubtle,
145
+ "--mw-color-surface-brand": color.surfaceBrand,
113
146
  "--mw-color-surface-elevated": color.surfaceElevated,
114
147
  "--mw-color-surface-disabled": color.surfaceDisabled,
115
148
  "--mw-color-surface-inverted": color.surfaceInverted,
@@ -119,13 +152,17 @@ function themeToCSSVars(theme) {
119
152
  "--mw-color-text-disabled": color.textDisabled,
120
153
  "--mw-color-text-inverted": color.textInverted,
121
154
  "--mw-color-text-brand": color.textBrand,
155
+ "--mw-color-text-link": color.textLink,
156
+ "--mw-color-icon-muted": color.iconMuted,
157
+ "--mw-color-border-low": color.borderLow,
122
158
  "--mw-color-border": color.border,
123
159
  "--mw-color-border-subtle": color.borderSubtle,
124
160
  "--mw-color-border-strong": color.borderStrong,
125
161
  "--mw-color-border-disabled": color.borderDisabled,
126
162
  "--mw-color-border-brand": color.borderBrand,
163
+ "--mw-color-border-full": color.borderFull,
127
164
  "--mw-color-focus": color.focus,
128
- // Status role tokens (4 × 5 = 20)
165
+ // Status role tokens (4 × 5 + optional accessible warning border = 21)
129
166
  ...statusColorVars("success", color.status.success),
130
167
  ...statusColorVars("warning", color.status.warning),
131
168
  ...statusColorVars("error", color.status.error),
@@ -138,19 +175,17 @@ function themeToCSSVars(theme) {
138
175
  "--mw-ui-radius": `${ui.radius}px`,
139
176
  // Density (10)
140
177
  ...densityToCSSVars(ui.density),
141
- // Typography — headings (3 × 4 = 12)
142
- "--mw-typography-h1-font-size": `${typography.h1.fontSize}px`,
143
- "--mw-typography-h1-line-height": `${typography.h1.lineHeight}`,
144
- "--mw-typography-h1-font-weight": `${typography.h1.fontWeight}`,
145
- "--mw-typography-h1-letter-spacing": `${typography.h1.letterSpacing}px`,
146
- "--mw-typography-h2-font-size": `${typography.h2.fontSize}px`,
147
- "--mw-typography-h2-line-height": `${typography.h2.lineHeight}`,
148
- "--mw-typography-h2-font-weight": `${typography.h2.fontWeight}`,
149
- "--mw-typography-h2-letter-spacing": `${typography.h2.letterSpacing}px`,
150
- "--mw-typography-h3-font-size": `${typography.h3.fontSize}px`,
151
- "--mw-typography-h3-line-height": `${typography.h3.lineHeight}`,
152
- "--mw-typography-h3-font-weight": `${typography.h3.fontWeight}`,
153
- "--mw-typography-h3-letter-spacing": `${typography.h3.letterSpacing}px`,
178
+ // Typography
179
+ ...typographyStyleVars("--mw-typography-display", typography.display),
180
+ ...typographyStyleVars("--mw-typography-h1", typography.h1),
181
+ ...typographyStyleVars("--mw-typography-h2", typography.h2),
182
+ ...typographyStyleVars("--mw-typography-h3", typography.h3),
183
+ ...textTypographyStyleVars("display", typography.text.display),
184
+ ...textTypographyStyleVars("label", typography.text.label),
185
+ ...textTypographyStyleVars("label-small", typography.text["label-small"]),
186
+ ...textTypographyStyleVars("caption", typography.text.caption),
187
+ ...textTypographyStyleVars("overline", typography.text.overline),
188
+ ...textTypographyStyleVars("micro", typography.text.micro),
154
189
  // Typography — paragraph (3 × 2 = 6)
155
190
  "--mw-typography-paragraph-sm-font-size": `${typography.paragraph.sm.fontSize}px`,
156
191
  "--mw-typography-paragraph-sm-line-height": `${typography.paragraph.sm.lineHeight}`,
@@ -365,7 +400,9 @@ var lightThemeDefaults = {
365
400
  // Background & Surface
366
401
  background: "#FFFFFF",
367
402
  surface: "#F8F8F8",
403
+ surfacePrimary: "#FFFFFF",
368
404
  surfaceSubtle: "#F5F5F5",
405
+ surfaceBrand: "#EEEEFF",
369
406
  surfaceElevated: "#FFFFFF",
370
407
  surfaceDisabled: "#F5F5F5",
371
408
  surfaceInverted: "#141414",
@@ -376,12 +413,16 @@ var lightThemeDefaults = {
376
413
  textDisabled: "#737373",
377
414
  textInverted: "#FFFFFF",
378
415
  textBrand: "#2F31FC",
416
+ textLink: "#2527CA",
417
+ iconMuted: "#A3A3A3",
379
418
  // Borders
419
+ borderLow: "#00000026",
380
420
  border: "#D8D8D8",
381
421
  borderSubtle: "#D8D8D8",
382
422
  borderStrong: "#A3A3A3",
383
423
  borderDisabled: "#D8D8D8",
384
424
  borderBrand: "#2F31FC",
425
+ borderFull: "#000000",
385
426
  // Focus
386
427
  focus: "#2F31FC",
387
428
  // Semantic colors
@@ -401,6 +442,7 @@ var lightThemeDefaults = {
401
442
  text: "#B45309",
402
443
  icon: "#D97706",
403
444
  border: "#FDE08A",
445
+ borderAccessible: "#B45309",
404
446
  borderStrong: "#E46F00"
405
447
  },
406
448
  error: {
@@ -428,7 +470,14 @@ var lightThemeDefaults = {
428
470
  radius: 4,
429
471
  density: "comfortable"
430
472
  },
473
+ breakpoint: defaultThemeBreakpoints,
431
474
  typography: {
475
+ display: {
476
+ fontSize: 44,
477
+ lineHeight: 1.1818181818,
478
+ fontWeight: 700,
479
+ letterSpacing: -1.32
480
+ },
432
481
  h1: {
433
482
  fontSize: 32,
434
483
  lineHeight: 1.1875,
@@ -447,6 +496,45 @@ var lightThemeDefaults = {
447
496
  fontWeight: 500,
448
497
  letterSpacing: -0.6
449
498
  },
499
+ text: {
500
+ display: {
501
+ fontSize: 44,
502
+ lineHeight: 1.1818181818,
503
+ fontWeight: 700,
504
+ letterSpacing: -1.32
505
+ },
506
+ label: {
507
+ fontSize: 14,
508
+ lineHeight: 1.1428571429,
509
+ fontWeight: 500,
510
+ letterSpacing: -0.42
511
+ },
512
+ "label-small": {
513
+ fontSize: 12,
514
+ lineHeight: 1,
515
+ fontWeight: 500,
516
+ letterSpacing: -0.36
517
+ },
518
+ caption: {
519
+ fontSize: 12,
520
+ lineHeight: 1.3333333333,
521
+ fontWeight: 500,
522
+ letterSpacing: 0
523
+ },
524
+ overline: {
525
+ fontSize: 11,
526
+ lineHeight: 1.4545454545,
527
+ fontWeight: 500,
528
+ letterSpacing: 0.88,
529
+ textTransform: "uppercase"
530
+ },
531
+ micro: {
532
+ fontSize: 11,
533
+ lineHeight: 1.2727272727,
534
+ fontWeight: 400,
535
+ letterSpacing: -0.33
536
+ }
537
+ },
450
538
  paragraph: {
451
539
  sm: {
452
540
  fontSize: 14,
@@ -471,7 +559,9 @@ var darkThemeDefaults = {
471
559
  // Background & Surface
472
560
  background: "#0F0F0F",
473
561
  surface: "#1A1A1A",
562
+ surfacePrimary: "#0F0F0F",
474
563
  surfaceSubtle: "#050505",
564
+ surfaceBrand: "#090A32",
475
565
  surfaceElevated: "#2B2B2B",
476
566
  surfaceDisabled: "#1A1A1A",
477
567
  surfaceInverted: "#FFFFFF",
@@ -482,12 +572,16 @@ var darkThemeDefaults = {
482
572
  textDisabled: "#595959",
483
573
  textInverted: "#141414",
484
574
  textBrand: "#8182FC",
575
+ textLink: "#8182FC",
576
+ iconMuted: "#595959",
485
577
  // Borders
578
+ borderLow: "#FFFFFF26",
486
579
  border: "#474747",
487
580
  borderSubtle: "#474747",
488
581
  borderStrong: "#A3A3A3",
489
582
  borderDisabled: "#474747",
490
583
  borderBrand: "#5859FC",
584
+ borderFull: "#FFFFFF",
491
585
  // Focus
492
586
  focus: "#8182FC",
493
587
  // Semantic colors
@@ -507,6 +601,7 @@ var darkThemeDefaults = {
507
601
  text: "#FCC94A",
508
602
  icon: "#F9B21A",
509
603
  border: "#E46F00",
604
+ borderAccessible: "#B45309",
510
605
  borderStrong: "#B45308"
511
606
  },
512
607
  error: {
@@ -534,7 +629,14 @@ var darkThemeDefaults = {
534
629
  radius: 4,
535
630
  density: "comfortable"
536
631
  },
632
+ breakpoint: defaultThemeBreakpoints,
537
633
  typography: {
634
+ display: {
635
+ fontSize: 44,
636
+ lineHeight: 1.1818181818,
637
+ fontWeight: 700,
638
+ letterSpacing: -1.32
639
+ },
538
640
  h1: {
539
641
  fontSize: 32,
540
642
  lineHeight: 1.1875,
@@ -553,6 +655,45 @@ var darkThemeDefaults = {
553
655
  fontWeight: 500,
554
656
  letterSpacing: -0.6
555
657
  },
658
+ text: {
659
+ display: {
660
+ fontSize: 44,
661
+ lineHeight: 1.1818181818,
662
+ fontWeight: 700,
663
+ letterSpacing: -1.32
664
+ },
665
+ label: {
666
+ fontSize: 14,
667
+ lineHeight: 1.1428571429,
668
+ fontWeight: 500,
669
+ letterSpacing: -0.42
670
+ },
671
+ "label-small": {
672
+ fontSize: 12,
673
+ lineHeight: 1,
674
+ fontWeight: 500,
675
+ letterSpacing: -0.36
676
+ },
677
+ caption: {
678
+ fontSize: 12,
679
+ lineHeight: 1.3333333333,
680
+ fontWeight: 500,
681
+ letterSpacing: 0
682
+ },
683
+ overline: {
684
+ fontSize: 11,
685
+ lineHeight: 1.4545454545,
686
+ fontWeight: 500,
687
+ letterSpacing: 0.88,
688
+ textTransform: "uppercase"
689
+ },
690
+ micro: {
691
+ fontSize: 11,
692
+ lineHeight: 1.2727272727,
693
+ fontWeight: 400,
694
+ letterSpacing: -0.33
695
+ }
696
+ },
556
697
  paragraph: {
557
698
  sm: {
558
699
  fontSize: 14,
@@ -705,6 +846,7 @@ var darkDefaultColorRoles = {
705
846
  };
706
847
  function resolveThemeInput(input) {
707
848
  const mode = input.mode ?? ThemeMode.light;
849
+ const personality = input.personality ?? "flat";
708
850
  const colorBase = mode === ThemeMode.dark ? darkThemeDefaults.color : lightThemeDefaults.color;
709
851
  const defaultColorRoles = mode === ThemeMode.dark ? darkDefaultColorRoles : lightDefaultColorRoles;
710
852
  const base = lightThemeDefaults;
@@ -717,6 +859,7 @@ function resolveThemeInput(input) {
717
859
  const info = input.color?.primary === void 0 ? normalizeColorInput(defaultColorRoles.info) : resolveInfoRole(primary);
718
860
  return {
719
861
  mode,
862
+ personality,
720
863
  color: {
721
864
  primary,
722
865
  secondary,
@@ -726,7 +869,9 @@ function resolveThemeInput(input) {
726
869
  info,
727
870
  background: input.color?.background ?? colorBase.background,
728
871
  surface: input.color?.surface ?? colorBase.surface,
872
+ surfacePrimary: input.color?.surfacePrimary ?? colorBase.surfacePrimary,
729
873
  surfaceSubtle: input.color?.surfaceSubtle ?? colorBase.surfaceSubtle,
874
+ surfaceBrand: input.color?.surfaceBrand ?? colorBase.surfaceBrand,
730
875
  surfaceElevated: input.color?.surfaceElevated ?? colorBase.surfaceElevated,
731
876
  surfaceDisabled: input.color?.surfaceDisabled ?? colorBase.surfaceDisabled,
732
877
  surfaceInverted: input.color?.surfaceInverted ?? colorBase.surfaceInverted,
@@ -736,20 +881,62 @@ function resolveThemeInput(input) {
736
881
  textDisabled: input.color?.textDisabled ?? colorBase.textDisabled,
737
882
  textInverted: input.color?.textInverted ?? colorBase.textInverted,
738
883
  textBrand: colorBase.textBrand,
884
+ textLink: input.color?.textLink ?? colorBase.textLink,
885
+ iconMuted: input.color?.iconMuted ?? colorBase.iconMuted,
886
+ borderLow: input.color?.borderLow ?? colorBase.borderLow,
739
887
  border: input.color?.border ?? colorBase.border,
740
888
  borderSubtle: input.color?.borderSubtle ?? colorBase.borderSubtle,
741
889
  borderStrong: input.color?.borderStrong ?? colorBase.borderStrong,
742
890
  borderDisabled: input.color?.borderDisabled ?? colorBase.borderDisabled,
743
891
  borderBrand: colorBase.borderBrand,
892
+ borderFull: input.color?.borderFull ?? colorBase.borderFull,
744
893
  focus: input.color?.focus ?? colorBase.focus,
745
894
  status: colorBase.status
746
895
  },
747
896
  font: { ...base.font, ...tone.font, ...input.font },
748
897
  ui: { ...base.ui, ...tone.ui, ...input.ui },
898
+ breakpoint: { ...defaultThemeBreakpoints, ...input.breakpoint },
749
899
  typography: {
900
+ display: {
901
+ ...base.typography.display,
902
+ ...tone.typography?.display,
903
+ ...input.typography?.display
904
+ },
750
905
  h1: { ...base.typography.h1, ...tone.typography?.h1, ...input.typography?.h1 },
751
906
  h2: { ...base.typography.h2, ...tone.typography?.h2, ...input.typography?.h2 },
752
907
  h3: { ...base.typography.h3, ...tone.typography?.h3, ...input.typography?.h3 },
908
+ text: {
909
+ display: {
910
+ ...base.typography.text.display,
911
+ ...tone.typography?.text?.display,
912
+ ...input.typography?.text?.display
913
+ },
914
+ label: {
915
+ ...base.typography.text.label,
916
+ ...tone.typography?.text?.label,
917
+ ...input.typography?.text?.label
918
+ },
919
+ "label-small": {
920
+ ...base.typography.text["label-small"],
921
+ ...tone.typography?.text?.["label-small"],
922
+ ...input.typography?.text?.["label-small"]
923
+ },
924
+ caption: {
925
+ ...base.typography.text.caption,
926
+ ...tone.typography?.text?.caption,
927
+ ...input.typography?.text?.caption
928
+ },
929
+ overline: {
930
+ ...base.typography.text.overline,
931
+ ...tone.typography?.text?.overline,
932
+ ...input.typography?.text?.overline
933
+ },
934
+ micro: {
935
+ ...base.typography.text.micro,
936
+ ...tone.typography?.text?.micro,
937
+ ...input.typography?.text?.micro
938
+ }
939
+ },
753
940
  paragraph: {
754
941
  sm: {
755
942
  ...base.typography.paragraph.sm,
@@ -822,6 +1009,21 @@ function serializeScriptData(value) {
822
1009
  function mwVar(name, fallback) {
823
1010
  return fallback === void 0 ? `var(${name})` : `var(${name}, ${fallback})`;
824
1011
  }
1012
+ function createMwThemeMedia(breakpoint) {
1013
+ return {
1014
+ mobileAndAbove: `@media (min-width: ${breakpoint.mobile}px)`,
1015
+ tabletAndAbove: `@media (min-width: ${breakpoint.tablet}px)`,
1016
+ desktopAndAbove: `@media (min-width: ${breakpoint.desktop}px)`,
1017
+ wideDesktopAndAbove: `@media (min-width: ${breakpoint.wideDesktop}px)`,
1018
+ mobileAndBelow: `@media (max-width: ${formatMaxBreakpoint(breakpoint.mobile)}px)`,
1019
+ tabletAndBelow: `@media (max-width: ${formatMaxBreakpoint(breakpoint.tablet)}px)`,
1020
+ desktopAndBelow: `@media (max-width: ${formatMaxBreakpoint(breakpoint.desktop)}px)`,
1021
+ wideDesktopAndBelow: `@media (max-width: ${formatMaxBreakpoint(breakpoint.wideDesktop)}px)`
1022
+ };
1023
+ }
1024
+ function formatMaxBreakpoint(value) {
1025
+ return `${Number((value - 0.02).toFixed(2))}`;
1026
+ }
825
1027
  var mwThemeVarNames = {
826
1028
  color: {
827
1029
  primary: {
@@ -876,7 +1078,9 @@ var mwThemeVarNames = {
876
1078
  },
877
1079
  background: "--mw-color-background",
878
1080
  surface: "--mw-color-surface",
1081
+ surfacePrimary: "--mw-color-surface-primary",
879
1082
  surfaceSubtle: "--mw-color-surface-subtle",
1083
+ surfaceBrand: "--mw-color-surface-brand",
880
1084
  surfaceElevated: "--mw-color-surface-elevated",
881
1085
  surfaceDisabled: "--mw-color-surface-disabled",
882
1086
  surfaceInverted: "--mw-color-surface-inverted",
@@ -886,11 +1090,15 @@ var mwThemeVarNames = {
886
1090
  textDisabled: "--mw-color-text-disabled",
887
1091
  textInverted: "--mw-color-text-inverted",
888
1092
  textBrand: "--mw-color-text-brand",
1093
+ textLink: "--mw-color-text-link",
1094
+ iconMuted: "--mw-color-icon-muted",
1095
+ borderLow: "--mw-color-border-low",
889
1096
  border: "--mw-color-border",
890
1097
  borderSubtle: "--mw-color-border-subtle",
891
1098
  borderStrong: "--mw-color-border-strong",
892
1099
  borderDisabled: "--mw-color-border-disabled",
893
1100
  borderBrand: "--mw-color-border-brand",
1101
+ borderFull: "--mw-color-border-full",
894
1102
  focus: "--mw-color-focus",
895
1103
  status: {
896
1104
  success: {
@@ -905,6 +1113,7 @@ var mwThemeVarNames = {
905
1113
  text: "--mw-color-status-warning-text",
906
1114
  icon: "--mw-color-status-warning-icon",
907
1115
  border: "--mw-color-status-warning-border",
1116
+ borderAccessible: "--mw-color-status-warning-border-accessible",
908
1117
  borderStrong: "--mw-color-status-warning-border-strong"
909
1118
  },
910
1119
  error: {
@@ -928,6 +1137,7 @@ var mwThemeVarNames = {
928
1137
  sp2: "--mw-spacing-sp-2",
929
1138
  sp4: "--mw-spacing-sp-4",
930
1139
  sp8: "--mw-spacing-sp-8",
1140
+ sp12: "--mw-spacing-sp-12",
931
1141
  sp16: "--mw-spacing-sp-16",
932
1142
  sp24: "--mw-spacing-sp-24",
933
1143
  sp32: "--mw-spacing-sp-32",
@@ -964,6 +1174,12 @@ var mwThemeVarNames = {
964
1174
  fontSizeSm: "--mw-density-font-size-sm"
965
1175
  },
966
1176
  typography: {
1177
+ display: {
1178
+ fontSize: "--mw-typography-display-font-size",
1179
+ lineHeight: "--mw-typography-display-line-height",
1180
+ fontWeight: "--mw-typography-display-font-weight",
1181
+ letterSpacing: "--mw-typography-display-letter-spacing"
1182
+ },
967
1183
  h1: {
968
1184
  fontSize: "--mw-typography-h1-font-size",
969
1185
  lineHeight: "--mw-typography-h1-line-height",
@@ -982,6 +1198,50 @@ var mwThemeVarNames = {
982
1198
  fontWeight: "--mw-typography-h3-font-weight",
983
1199
  letterSpacing: "--mw-typography-h3-letter-spacing"
984
1200
  },
1201
+ text: {
1202
+ display: {
1203
+ fontSize: "--mw-typography-text-display-font-size",
1204
+ lineHeight: "--mw-typography-text-display-line-height",
1205
+ fontWeight: "--mw-typography-text-display-font-weight",
1206
+ letterSpacing: "--mw-typography-text-display-letter-spacing",
1207
+ textTransform: "--mw-typography-text-display-transform"
1208
+ },
1209
+ label: {
1210
+ fontSize: "--mw-typography-text-label-font-size",
1211
+ lineHeight: "--mw-typography-text-label-line-height",
1212
+ fontWeight: "--mw-typography-text-label-font-weight",
1213
+ letterSpacing: "--mw-typography-text-label-letter-spacing",
1214
+ textTransform: "--mw-typography-text-label-transform"
1215
+ },
1216
+ "label-small": {
1217
+ fontSize: "--mw-typography-text-label-small-font-size",
1218
+ lineHeight: "--mw-typography-text-label-small-line-height",
1219
+ fontWeight: "--mw-typography-text-label-small-font-weight",
1220
+ letterSpacing: "--mw-typography-text-label-small-letter-spacing",
1221
+ textTransform: "--mw-typography-text-label-small-transform"
1222
+ },
1223
+ caption: {
1224
+ fontSize: "--mw-typography-text-caption-font-size",
1225
+ lineHeight: "--mw-typography-text-caption-line-height",
1226
+ fontWeight: "--mw-typography-text-caption-font-weight",
1227
+ letterSpacing: "--mw-typography-text-caption-letter-spacing",
1228
+ textTransform: "--mw-typography-text-caption-transform"
1229
+ },
1230
+ overline: {
1231
+ fontSize: "--mw-typography-text-overline-font-size",
1232
+ lineHeight: "--mw-typography-text-overline-line-height",
1233
+ fontWeight: "--mw-typography-text-overline-font-weight",
1234
+ letterSpacing: "--mw-typography-text-overline-letter-spacing",
1235
+ textTransform: "--mw-typography-text-overline-transform"
1236
+ },
1237
+ micro: {
1238
+ fontSize: "--mw-typography-text-micro-font-size",
1239
+ lineHeight: "--mw-typography-text-micro-line-height",
1240
+ fontWeight: "--mw-typography-text-micro-font-weight",
1241
+ letterSpacing: "--mw-typography-text-micro-letter-spacing",
1242
+ textTransform: "--mw-typography-text-micro-transform"
1243
+ }
1244
+ },
985
1245
  paragraph: {
986
1246
  sm: {
987
1247
  fontSize: "--mw-typography-paragraph-sm-font-size",
@@ -1052,7 +1312,9 @@ var mwThemeVars = {
1052
1312
  },
1053
1313
  background: "var(--mw-color-background)",
1054
1314
  surface: "var(--mw-color-surface)",
1315
+ surfacePrimary: "var(--mw-color-surface-primary)",
1055
1316
  surfaceSubtle: "var(--mw-color-surface-subtle)",
1317
+ surfaceBrand: "var(--mw-color-surface-brand)",
1056
1318
  surfaceElevated: "var(--mw-color-surface-elevated)",
1057
1319
  surfaceDisabled: "var(--mw-color-surface-disabled)",
1058
1320
  surfaceInverted: "var(--mw-color-surface-inverted)",
@@ -1062,11 +1324,15 @@ var mwThemeVars = {
1062
1324
  textDisabled: "var(--mw-color-text-disabled)",
1063
1325
  textInverted: "var(--mw-color-text-inverted)",
1064
1326
  textBrand: "var(--mw-color-text-brand)",
1327
+ textLink: "var(--mw-color-text-link)",
1328
+ iconMuted: "var(--mw-color-icon-muted)",
1329
+ borderLow: "var(--mw-color-border-low)",
1065
1330
  border: "var(--mw-color-border)",
1066
1331
  borderSubtle: "var(--mw-color-border-subtle)",
1067
1332
  borderStrong: "var(--mw-color-border-strong)",
1068
1333
  borderDisabled: "var(--mw-color-border-disabled)",
1069
1334
  borderBrand: "var(--mw-color-border-brand)",
1335
+ borderFull: "var(--mw-color-border-full)",
1070
1336
  focus: "var(--mw-color-focus)",
1071
1337
  status: {
1072
1338
  success: {
@@ -1081,6 +1347,7 @@ var mwThemeVars = {
1081
1347
  text: "var(--mw-color-status-warning-text)",
1082
1348
  icon: "var(--mw-color-status-warning-icon)",
1083
1349
  border: "var(--mw-color-status-warning-border)",
1350
+ borderAccessible: "var(--mw-color-status-warning-border-accessible)",
1084
1351
  borderStrong: "var(--mw-color-status-warning-border-strong)"
1085
1352
  },
1086
1353
  error: {
@@ -1104,6 +1371,7 @@ var mwThemeVars = {
1104
1371
  sp2: "var(--mw-spacing-sp-2)",
1105
1372
  sp4: "var(--mw-spacing-sp-4)",
1106
1373
  sp8: "var(--mw-spacing-sp-8)",
1374
+ sp12: "var(--mw-spacing-sp-12)",
1107
1375
  sp16: "var(--mw-spacing-sp-16)",
1108
1376
  sp24: "var(--mw-spacing-sp-24)",
1109
1377
  sp32: "var(--mw-spacing-sp-32)",
@@ -1140,6 +1408,12 @@ var mwThemeVars = {
1140
1408
  fontSizeSm: "var(--mw-density-font-size-sm)"
1141
1409
  },
1142
1410
  typography: {
1411
+ display: {
1412
+ fontSize: "var(--mw-typography-display-font-size)",
1413
+ lineHeight: "var(--mw-typography-display-line-height)",
1414
+ fontWeight: "var(--mw-typography-display-font-weight)",
1415
+ letterSpacing: "var(--mw-typography-display-letter-spacing)"
1416
+ },
1143
1417
  h1: {
1144
1418
  fontSize: "var(--mw-typography-h1-font-size)",
1145
1419
  lineHeight: "var(--mw-typography-h1-line-height)",
@@ -1158,6 +1432,50 @@ var mwThemeVars = {
1158
1432
  fontWeight: "var(--mw-typography-h3-font-weight)",
1159
1433
  letterSpacing: "var(--mw-typography-h3-letter-spacing)"
1160
1434
  },
1435
+ text: {
1436
+ display: {
1437
+ fontSize: "var(--mw-typography-text-display-font-size)",
1438
+ lineHeight: "var(--mw-typography-text-display-line-height)",
1439
+ fontWeight: "var(--mw-typography-text-display-font-weight)",
1440
+ letterSpacing: "var(--mw-typography-text-display-letter-spacing)",
1441
+ textTransform: "var(--mw-typography-text-display-transform)"
1442
+ },
1443
+ label: {
1444
+ fontSize: "var(--mw-typography-text-label-font-size)",
1445
+ lineHeight: "var(--mw-typography-text-label-line-height)",
1446
+ fontWeight: "var(--mw-typography-text-label-font-weight)",
1447
+ letterSpacing: "var(--mw-typography-text-label-letter-spacing)",
1448
+ textTransform: "var(--mw-typography-text-label-transform)"
1449
+ },
1450
+ "label-small": {
1451
+ fontSize: "var(--mw-typography-text-label-small-font-size)",
1452
+ lineHeight: "var(--mw-typography-text-label-small-line-height)",
1453
+ fontWeight: "var(--mw-typography-text-label-small-font-weight)",
1454
+ letterSpacing: "var(--mw-typography-text-label-small-letter-spacing)",
1455
+ textTransform: "var(--mw-typography-text-label-small-transform)"
1456
+ },
1457
+ caption: {
1458
+ fontSize: "var(--mw-typography-text-caption-font-size)",
1459
+ lineHeight: "var(--mw-typography-text-caption-line-height)",
1460
+ fontWeight: "var(--mw-typography-text-caption-font-weight)",
1461
+ letterSpacing: "var(--mw-typography-text-caption-letter-spacing)",
1462
+ textTransform: "var(--mw-typography-text-caption-transform)"
1463
+ },
1464
+ overline: {
1465
+ fontSize: "var(--mw-typography-text-overline-font-size)",
1466
+ lineHeight: "var(--mw-typography-text-overline-line-height)",
1467
+ fontWeight: "var(--mw-typography-text-overline-font-weight)",
1468
+ letterSpacing: "var(--mw-typography-text-overline-letter-spacing)",
1469
+ textTransform: "var(--mw-typography-text-overline-transform)"
1470
+ },
1471
+ micro: {
1472
+ fontSize: "var(--mw-typography-text-micro-font-size)",
1473
+ lineHeight: "var(--mw-typography-text-micro-line-height)",
1474
+ fontWeight: "var(--mw-typography-text-micro-font-weight)",
1475
+ letterSpacing: "var(--mw-typography-text-micro-letter-spacing)",
1476
+ textTransform: "var(--mw-typography-text-micro-transform)"
1477
+ }
1478
+ },
1161
1479
  paragraph: {
1162
1480
  sm: {
1163
1481
  fontSize: "var(--mw-typography-paragraph-sm-font-size)",
@@ -1174,7 +1492,19 @@ var mwThemeVars = {
1174
1492
  }
1175
1493
  }
1176
1494
  };
1177
- var mwStyledTheme = mwThemeVars;
1495
+ function createMwTheme(theme) {
1496
+ return {
1497
+ ...mwThemeVars,
1498
+ breakpoint: theme.breakpoint,
1499
+ media: createMwThemeMedia(theme.breakpoint)
1500
+ };
1501
+ }
1502
+ var mwTheme = {
1503
+ ...mwThemeVars,
1504
+ breakpoint: defaultThemeBreakpoints,
1505
+ media: createMwThemeMedia(defaultThemeBreakpoints)
1506
+ };
1507
+ var mwStyledTheme = mwTheme;
1178
1508
 
1179
1509
  // src/theme/font-loader.ts
1180
1510
  var mwFontFallbacks = {
@@ -1291,9 +1621,13 @@ function shouldLoadGoogleFont(name, config = "auto") {
1291
1621
  }
1292
1622
  function extractUsedWeights(typography) {
1293
1623
  const weights = /* @__PURE__ */ new Set([400, 500]);
1624
+ if (typography.display) weights.add(typography.display.fontWeight);
1294
1625
  weights.add(typography.h1.fontWeight);
1295
1626
  weights.add(typography.h2.fontWeight);
1296
1627
  weights.add(typography.h3.fontWeight);
1628
+ for (const textStyle of Object.values(typography.text ?? {})) {
1629
+ weights.add(textStyle.fontWeight);
1630
+ }
1297
1631
  return [...weights].sort((a, b) => a - b);
1298
1632
  }
1299
1633
 
@@ -1314,7 +1648,17 @@ var canonicalSemanticAttributeNames = [
1314
1648
  "data-orientation"
1315
1649
  ];
1316
1650
  var semanticLayers = ["atom", "molecule", "purpose"];
1317
- var semanticFamilies = ["button", "badge", "avatar", "toast", "dialog"];
1651
+ var semanticFamilies = [
1652
+ "button",
1653
+ "badge",
1654
+ "banner",
1655
+ "avatar",
1656
+ "toast",
1657
+ "dialog",
1658
+ "drawer",
1659
+ "context-menu",
1660
+ "breadcrumb"
1661
+ ];
1318
1662
  var semanticIntents = [
1319
1663
  "success",
1320
1664
  "error",
@@ -1354,12 +1698,19 @@ var toastPurposes = [
1354
1698
  "warning-toast",
1355
1699
  "info-toast"
1356
1700
  ];
1701
+ var bannerPurposes = [
1702
+ "info-banner",
1703
+ "success-banner",
1704
+ "warning-banner",
1705
+ "error-banner"
1706
+ ];
1357
1707
  var dialogPurposes = ["confirm-dialog", "destructive-dialog", "info-dialog"];
1358
1708
  var semanticPurposes = [
1359
1709
  ...buttonPurposes,
1360
1710
  ...badgePurposes,
1361
1711
  ...avatarPurposes,
1362
1712
  ...toastPurposes,
1713
+ ...bannerPurposes,
1363
1714
  ...dialogPurposes
1364
1715
  ];
1365
1716
 
@@ -1428,7 +1779,7 @@ var canonicalSemanticAttributes = {
1428
1779
  name: "data-destructive",
1429
1780
  description: "Boolean marker for destructive actions or flows.",
1430
1781
  allowedValues: ["true", "false"],
1431
- applicableFamilies: ["button", "dialog"],
1782
+ applicableFamilies: ["button", "dialog", "context-menu"],
1432
1783
  applicableLayers: semanticLayers
1433
1784
  },
1434
1785
  "data-confirmation-required": {
@@ -1502,6 +1853,16 @@ var familySemanticsRegistry = {
1502
1853
  allowedPurposes: ["status", "priority", "notification"],
1503
1854
  notes: "Badge needs base family identity normalized before full parity governance."
1504
1855
  },
1856
+ banner: {
1857
+ family: "banner",
1858
+ defaultLayer: "atom",
1859
+ baseAttributes: {
1860
+ "data-component": "banner"
1861
+ },
1862
+ canonicalAttributes: ["data-component", "data-variant"],
1863
+ allowedPurposes: ["info-banner", "success-banner", "warning-banner", "error-banner"],
1864
+ notes: "Banner is a single-atom family with thin purpose variants that preset the variant prop and emit canonical data-purpose metadata."
1865
+ },
1505
1866
  avatar: {
1506
1867
  family: "avatar",
1507
1868
  defaultLayer: "atom",
@@ -1531,6 +1892,36 @@ var familySemanticsRegistry = {
1531
1892
  canonicalAttributes: ["data-component", "data-size", "data-intent"],
1532
1893
  allowedPurposes: ["confirm-dialog", "destructive-dialog", "info-dialog"],
1533
1894
  notes: "Dialog already has a strong purpose mapping and workflow semantics in adapters."
1895
+ },
1896
+ drawer: {
1897
+ family: "drawer",
1898
+ defaultLayer: "atom",
1899
+ baseAttributes: {
1900
+ "data-component": "drawer"
1901
+ },
1902
+ canonicalAttributes: ["data-component", "data-size"],
1903
+ allowedPurposes: [],
1904
+ notes: "Drawer shares dialog semantics while adding panel placement and scrim composition at the family level."
1905
+ },
1906
+ "context-menu": {
1907
+ family: "context-menu",
1908
+ defaultLayer: "atom",
1909
+ baseAttributes: {
1910
+ "data-component": "context-menu"
1911
+ },
1912
+ canonicalAttributes: ["data-component", "data-destructive"],
1913
+ allowedPurposes: [],
1914
+ notes: "ContextMenu exposes a menu surface and button-backed menu items while popover/open-state orchestration stays adapter-owned."
1915
+ },
1916
+ breadcrumb: {
1917
+ family: "breadcrumb",
1918
+ defaultLayer: "atom",
1919
+ baseAttributes: {
1920
+ "data-component": "breadcrumb"
1921
+ },
1922
+ canonicalAttributes: ["data-component"],
1923
+ allowedPurposes: [],
1924
+ notes: "Breadcrumb exposes navigation hierarchy while routing, link resolution, and page ownership stay consumer-owned."
1534
1925
  }
1535
1926
  };
1536
1927
 
@@ -1834,6 +2225,48 @@ var toastPurposeSemantics = {
1834
2225
  supportedFrameworks: frameworks
1835
2226
  }
1836
2227
  };
2228
+ var bannerPurposeSemantics = {
2229
+ infoBanner: {
2230
+ purpose: "info-banner",
2231
+ family: "banner",
2232
+ layer: "purpose",
2233
+ attributes: {
2234
+ "data-purpose": "info-banner",
2235
+ "data-intent": "info"
2236
+ },
2237
+ supportedFrameworks: frameworks
2238
+ },
2239
+ successBanner: {
2240
+ purpose: "success-banner",
2241
+ family: "banner",
2242
+ layer: "purpose",
2243
+ attributes: {
2244
+ "data-purpose": "success-banner",
2245
+ "data-intent": "success"
2246
+ },
2247
+ supportedFrameworks: frameworks
2248
+ },
2249
+ warningBanner: {
2250
+ purpose: "warning-banner",
2251
+ family: "banner",
2252
+ layer: "purpose",
2253
+ attributes: {
2254
+ "data-purpose": "warning-banner",
2255
+ "data-intent": "warning"
2256
+ },
2257
+ supportedFrameworks: frameworks
2258
+ },
2259
+ errorBanner: {
2260
+ purpose: "error-banner",
2261
+ family: "banner",
2262
+ layer: "purpose",
2263
+ attributes: {
2264
+ "data-purpose": "error-banner",
2265
+ "data-intent": "error"
2266
+ },
2267
+ supportedFrameworks: frameworks
2268
+ }
2269
+ };
1837
2270
  var dialogPurposeSemantics = {
1838
2271
  confirmDialog: {
1839
2272
  purpose: "confirm-dialog",
@@ -1873,6 +2306,7 @@ var purposeSemanticsRegistry = {
1873
2306
  ...badgePurposeSemantics,
1874
2307
  ...avatarPurposeSemantics,
1875
2308
  ...toastPurposeSemantics,
2309
+ ...bannerPurposeSemantics,
1876
2310
  ...dialogPurposeSemantics
1877
2311
  };
1878
2312
 
@@ -3889,7 +4323,8 @@ var buttonVariantVisualStyles = [
3889
4323
  { label: "secondary", text: "Outlined, brand-accent emphasis (action utilities)" },
3890
4324
  { label: "neutral", text: "Outlined, low-chroma emphasis (cancel/close/filter actions)" },
3891
4325
  { label: "text", text: "Minimal, low emphasis (tertiary/inline actions)" },
3892
- { label: "success", text: "Filled, positive emphasis (confirm actions)" }
4326
+ { label: "success", text: "Filled, positive emphasis (confirm actions)" },
4327
+ { label: "danger", text: "Filled, destructive emphasis (delete/discard actions)" }
3893
4328
  ];
3894
4329
  var buttonActionSemanticPurposes = [
3895
4330
  { label: "submit", text: "Form submission" },
@@ -4355,14 +4790,15 @@ function resolveAvatarA11y(options, resolvedType, normalizedInitials) {
4355
4790
  };
4356
4791
  }
4357
4792
  if (resolvedType === AvatarType.image) {
4358
- if (__DEV__ && !options.alt && !options.ariaLabel) {
4793
+ const imageAccessibleLabel = options.ariaLabel ?? options.label;
4794
+ if (__DEV__ && !options.alt && !imageAccessibleLabel) {
4359
4795
  console.warn(
4360
- "[marwes] Avatar: an image avatar was rendered without alt text or ariaLabel. Provide alt to describe the person, or ariaLabel as a fallback, or use decorative={true} to explicitly mark it as presentational."
4796
+ "[marwes] Avatar: an image avatar was rendered without alt text, ariaLabel, or label. Provide alt to describe the person, ariaLabel/label as a fallback, or use decorative={true} to explicitly mark it as presentational."
4361
4797
  );
4362
4798
  }
4363
4799
  return {};
4364
4800
  }
4365
- const accessibleLabel = options.ariaLabel ?? normalizedInitials ?? "Avatar";
4801
+ const accessibleLabel = options.ariaLabel ?? options.label ?? normalizedInitials ?? "Avatar";
4366
4802
  return {
4367
4803
  role: "img",
4368
4804
  ariaLabel: accessibleLabel
@@ -4515,6 +4951,305 @@ function createDialogRecipe(opts = {}) {
4515
4951
  };
4516
4952
  }
4517
4953
 
4954
+ // src/components/atoms/drawer/drawer-a11y.ts
4955
+ function resolveDrawerA11y(opts) {
4956
+ const a11y = {
4957
+ role: "dialog"
4958
+ };
4959
+ if (opts.modal) {
4960
+ a11y.ariaModal = true;
4961
+ }
4962
+ if (opts.ariaLabel) {
4963
+ a11y.ariaLabel = opts.ariaLabel;
4964
+ }
4965
+ if (opts.ariaLabelledBy) {
4966
+ a11y.ariaLabelledBy = opts.ariaLabelledBy;
4967
+ }
4968
+ if (opts.ariaDescribedBy) {
4969
+ a11y.ariaDescribedBy = opts.ariaDescribedBy;
4970
+ }
4971
+ return a11y;
4972
+ }
4973
+
4974
+ // src/components/atoms/drawer/drawer-recipe.ts
4975
+ function cx4(...parts) {
4976
+ return parts.filter(Boolean).join(" ");
4977
+ }
4978
+ function createDrawerRecipe(opts = {}) {
4979
+ const size = opts.size ?? "medium";
4980
+ const placement = opts.placement ?? "right";
4981
+ const showFooter = opts.showFooter ?? true;
4982
+ const showCloseButton = opts.dismissible ?? true;
4983
+ const showScrim = opts.showScrim ?? true;
4984
+ const rootDataAttributes = {
4985
+ ...createFamilySemanticAttributes("drawer", {
4986
+ "data-size": size
4987
+ }),
4988
+ "data-placement": placement,
4989
+ "data-footer": showFooter ? "true" : "false",
4990
+ "data-dismissible": showCloseButton ? "true" : "false",
4991
+ "data-scrim": showScrim ? "true" : "false",
4992
+ ...opts.dataAttributes
4993
+ };
4994
+ return {
4995
+ tag: "div",
4996
+ className: cx4(
4997
+ "mw-drawer",
4998
+ `mw-drawer--${placement}`,
4999
+ `mw-drawer--${size}`,
5000
+ showFooter ? "mw-drawer--with-footer" : "mw-drawer--without-footer",
5001
+ showScrim && "mw-drawer--with-scrim",
5002
+ showCloseButton && "mw-drawer--dismissible"
5003
+ ),
5004
+ vars: {},
5005
+ size,
5006
+ placement,
5007
+ showFooter,
5008
+ showCloseButton,
5009
+ showScrim,
5010
+ dataAttributes: rootDataAttributes,
5011
+ panel: {
5012
+ tag: "div",
5013
+ className: "mw-drawer__panel",
5014
+ vars: {},
5015
+ a11y: resolveDrawerA11y(opts),
5016
+ dataAttributes: {
5017
+ ...rootDataAttributes,
5018
+ "data-part": "panel"
5019
+ }
5020
+ },
5021
+ scrim: {
5022
+ tag: "div",
5023
+ className: "mw-drawer__scrim",
5024
+ vars: {},
5025
+ dataAttributes: {
5026
+ "data-component": "drawer",
5027
+ "data-part": "scrim",
5028
+ "data-placement": placement
5029
+ }
5030
+ }
5031
+ };
5032
+ }
5033
+
5034
+ // src/components/atoms/context-menu/context-menu-a11y.ts
5035
+ function resolveContextMenuA11y(options = {}) {
5036
+ return {
5037
+ role: "menu",
5038
+ ariaLabel: options.ariaLabel ?? "Context menu"
5039
+ };
5040
+ }
5041
+ function resolveContextMenuItemA11y(disabled = false) {
5042
+ return {
5043
+ role: "menuitem",
5044
+ type: "button",
5045
+ ...disabled ? {
5046
+ disabled: true,
5047
+ ariaDisabled: "true"
5048
+ } : {}
5049
+ };
5050
+ }
5051
+ function resolveContextMenuDividerA11y() {
5052
+ return {
5053
+ role: "separator",
5054
+ ariaOrientation: "horizontal"
5055
+ };
5056
+ }
5057
+
5058
+ // src/components/atoms/context-menu/context-menu-recipe.ts
5059
+ function cx5(...parts) {
5060
+ return parts.filter(Boolean).join(" ");
5061
+ }
5062
+ function isActionItem(item) {
5063
+ return item.kind !== "divider";
5064
+ }
5065
+ function createContextMenuItemKey(item, index) {
5066
+ if (isActionItem(item)) {
5067
+ return `item-${item.value}`;
5068
+ }
5069
+ return item.id ?? `divider-${index}`;
5070
+ }
5071
+ function createContextMenuRecipe(options = {}) {
5072
+ const rootDataAttributes = {
5073
+ ...createFamilySemanticAttributes("context-menu"),
5074
+ ...options.dataAttributes
5075
+ };
5076
+ return {
5077
+ tag: "div",
5078
+ className: "mw-context-menu",
5079
+ vars: {},
5080
+ a11y: resolveContextMenuA11y(options),
5081
+ dataAttributes: rootDataAttributes,
5082
+ items: (options.items ?? []).map((item, index) => {
5083
+ const key = createContextMenuItemKey(item, index);
5084
+ if (!isActionItem(item)) {
5085
+ return {
5086
+ kind: "divider",
5087
+ key,
5088
+ item,
5089
+ className: "mw-context-menu__divider",
5090
+ vars: {},
5091
+ a11y: resolveContextMenuDividerA11y(),
5092
+ dataAttributes: {
5093
+ "data-component": "context-menu",
5094
+ "data-part": "divider",
5095
+ ...item.dataAttributes
5096
+ }
5097
+ };
5098
+ }
5099
+ const disabled = item.disabled ?? false;
5100
+ const destructive = item.destructive ?? false;
5101
+ return {
5102
+ kind: "item",
5103
+ key,
5104
+ item,
5105
+ label: item.label,
5106
+ value: item.value,
5107
+ ...item.icon ? { icon: item.icon } : {},
5108
+ className: cx5(
5109
+ "mw-context-menu__item",
5110
+ destructive && "mw-context-menu__item--destructive",
5111
+ disabled && "mw-context-menu__item--disabled"
5112
+ ),
5113
+ vars: {},
5114
+ a11y: resolveContextMenuItemA11y(disabled),
5115
+ dataAttributes: {
5116
+ "data-component": "context-menu",
5117
+ "data-part": "item",
5118
+ "data-value": item.value,
5119
+ "data-disabled": disabled ? "true" : void 0,
5120
+ "data-destructive": destructive ? "true" : void 0,
5121
+ ...item.dataAttributes
5122
+ }
5123
+ };
5124
+ })
5125
+ };
5126
+ }
5127
+
5128
+ // src/components/atoms/breadcrumb/breadcrumb-a11y.ts
5129
+ function resolveBreadcrumbA11y(options = {}) {
5130
+ return {
5131
+ ariaLabel: options.ariaLabel ?? "Breadcrumb"
5132
+ };
5133
+ }
5134
+ function resolveBreadcrumbListA11y() {
5135
+ return {
5136
+ role: "list"
5137
+ };
5138
+ }
5139
+ function resolveBreadcrumbSeparatorA11y() {
5140
+ return {
5141
+ ariaHidden: true
5142
+ };
5143
+ }
5144
+ function resolveBreadcrumbHomeA11y(homeLabel) {
5145
+ return {
5146
+ ariaLabel: homeLabel
5147
+ };
5148
+ }
5149
+ function resolveBreadcrumbItemA11y(item, current) {
5150
+ return {
5151
+ ...current ? { ariaCurrent: "page" } : {},
5152
+ ...item.ariaLabel ? { ariaLabel: item.ariaLabel } : {}
5153
+ };
5154
+ }
5155
+
5156
+ // src/components/atoms/breadcrumb/breadcrumb-recipe.ts
5157
+ function cx6(...parts) {
5158
+ return parts.filter(Boolean).join(" ");
5159
+ }
5160
+ function createItemKey(item, index) {
5161
+ return item.id ?? item.value ?? `${index}-${item.href ?? item.label}`;
5162
+ }
5163
+ function resolveCurrentIndex(items) {
5164
+ const explicitIndex = items.findIndex((item) => item.current === true);
5165
+ if (explicitIndex >= 0) return explicitIndex;
5166
+ return items.length - 1;
5167
+ }
5168
+ function createBreadcrumbItemRenderKit(item, index, currentIndex) {
5169
+ const current = index === currentIndex;
5170
+ const value = item.value ?? item.id ?? item.href ?? item.label;
5171
+ return {
5172
+ key: `item-${createItemKey(item, index)}`,
5173
+ kind: "item",
5174
+ item,
5175
+ label: item.label,
5176
+ value,
5177
+ ...item.href ? { href: item.href } : {},
5178
+ current,
5179
+ className: cx6("mw-breadcrumb__item", current && "mw-breadcrumb__item--current"),
5180
+ actionClassName: cx6("mw-breadcrumb__action", current && "mw-breadcrumb__current"),
5181
+ vars: {},
5182
+ a11y: resolveBreadcrumbItemA11y(item, current),
5183
+ dataAttributes: {
5184
+ "data-component": "breadcrumb",
5185
+ "data-part": "item",
5186
+ "data-current": current ? "true" : void 0,
5187
+ "data-value": value,
5188
+ ...item.dataAttributes
5189
+ }
5190
+ };
5191
+ }
5192
+ function createBreadcrumbRecipe(options = {}) {
5193
+ const showHome = options.showHome ?? true;
5194
+ const homeLabel = options.homeLabel ?? "Home";
5195
+ const items = options.items ?? [];
5196
+ const currentIndex = resolveCurrentIndex(items);
5197
+ const rootDataAttributes = {
5198
+ ...createFamilySemanticAttributes("breadcrumb"),
5199
+ ...options.dataAttributes
5200
+ };
5201
+ return {
5202
+ tag: "nav",
5203
+ className: "mw-breadcrumb",
5204
+ vars: {},
5205
+ a11y: resolveBreadcrumbA11y(options),
5206
+ dataAttributes: rootDataAttributes,
5207
+ list: {
5208
+ tag: "ol",
5209
+ className: "mw-breadcrumb__list",
5210
+ vars: {},
5211
+ a11y: resolveBreadcrumbListA11y()
5212
+ },
5213
+ separator: {
5214
+ tag: "span",
5215
+ className: "mw-breadcrumb__separator",
5216
+ vars: {},
5217
+ a11y: resolveBreadcrumbSeparatorA11y()
5218
+ },
5219
+ items: [
5220
+ ...showHome ? [
5221
+ {
5222
+ key: "home",
5223
+ kind: "home",
5224
+ label: homeLabel,
5225
+ value: "home",
5226
+ ...options.homeHref ? { href: options.homeHref } : {},
5227
+ current: items.length === 0,
5228
+ className: cx6(
5229
+ "mw-breadcrumb__item",
5230
+ "mw-breadcrumb__item--home",
5231
+ items.length === 0 && "mw-breadcrumb__item--current"
5232
+ ),
5233
+ actionClassName: cx6(
5234
+ "mw-breadcrumb__action",
5235
+ "mw-breadcrumb__home",
5236
+ items.length === 0 && "mw-breadcrumb__current"
5237
+ ),
5238
+ vars: {},
5239
+ a11y: resolveBreadcrumbHomeA11y(homeLabel),
5240
+ dataAttributes: {
5241
+ "data-component": "breadcrumb",
5242
+ "data-part": "home",
5243
+ "data-current": items.length === 0 ? "true" : void 0,
5244
+ "data-value": "home"
5245
+ }
5246
+ }
5247
+ ] : [],
5248
+ ...items.map((item, index) => createBreadcrumbItemRenderKit(item, index, currentIndex))
5249
+ ]
5250
+ };
5251
+ }
5252
+
4518
5253
  // src/components/atoms/toast/toast-a11y.ts
4519
5254
  function resolveToastA11y(opts) {
4520
5255
  const ariaLive = opts.ariaLive ?? "polite";
@@ -4526,14 +5261,14 @@ function resolveToastA11y(opts) {
4526
5261
  }
4527
5262
 
4528
5263
  // src/components/atoms/toast/toast-recipe.ts
4529
- function cx4(...parts) {
5264
+ function cx7(...parts) {
4530
5265
  return parts.filter(Boolean).join(" ");
4531
5266
  }
4532
5267
  function createToastRecipe(opts) {
4533
5268
  const variant = opts.variant ?? "outline";
4534
5269
  return {
4535
5270
  tag: "div",
4536
- className: cx4("mw-toast", `mw-toast--${variant}`),
5271
+ className: cx7("mw-toast", `mw-toast--${variant}`),
4537
5272
  vars: {},
4538
5273
  a11y: resolveToastA11y(opts),
4539
5274
  dataAttributes: createFamilySemanticAttributes("toast", {
@@ -4566,19 +5301,20 @@ function createTooltipRecipe(options = {}) {
4566
5301
  // src/components/atoms/badge/badge-a11y.ts
4567
5302
  function resolveBadgeA11y(opts) {
4568
5303
  const a11y = {};
4569
- if (opts.ariaLabel) a11y.ariaLabel = opts.ariaLabel;
5304
+ const accessibleLabel = opts.ariaLabel ?? opts.label;
5305
+ if (accessibleLabel) a11y.ariaLabel = accessibleLabel;
4570
5306
  return a11y;
4571
5307
  }
4572
5308
 
4573
5309
  // src/components/atoms/badge/badge-recipe.ts
4574
- function cx5(...parts) {
5310
+ function cx8(...parts) {
4575
5311
  return parts.filter(Boolean).join(" ");
4576
5312
  }
4577
5313
  function createBadgeRecipe(opts) {
4578
5314
  const variant = opts.variant ?? "neutral";
4579
5315
  return {
4580
5316
  tag: "span",
4581
- className: cx5("mw-badge", `mw-badge--${variant}`),
5317
+ className: cx8("mw-badge", `mw-badge--${variant}`),
4582
5318
  vars: {},
4583
5319
  a11y: resolveBadgeA11y(opts),
4584
5320
  dataAttributes: createFamilySemanticAttributes("badge", {
@@ -4596,6 +5332,65 @@ var BadgeVariant = {
4596
5332
  error: "error"
4597
5333
  };
4598
5334
 
5335
+ // src/components/atoms/banner/banner-a11y.ts
5336
+ function resolveBannerA11y(opts) {
5337
+ const variant = opts.variant ?? "neutral";
5338
+ const isUrgent = variant === "error" || variant === "warning";
5339
+ return {
5340
+ role: isUrgent ? "alert" : "status",
5341
+ ariaLabel: opts.ariaLabel,
5342
+ ariaLive: isUrgent ? "assertive" : "polite"
5343
+ };
5344
+ }
5345
+
5346
+ // src/components/atoms/banner/banner-recipe.ts
5347
+ function cx9(...parts) {
5348
+ return parts.filter(Boolean).join(" ");
5349
+ }
5350
+ function createBannerRecipe(opts) {
5351
+ const variant = opts.variant ?? "neutral";
5352
+ const showIcon = opts.showIcon ?? true;
5353
+ const showAction = opts.showAction ?? false;
5354
+ const dismissible = opts.dismissible ?? true;
5355
+ return {
5356
+ root: {
5357
+ className: cx9("mw-banner", `mw-banner--${variant}`),
5358
+ a11y: resolveBannerA11y(opts),
5359
+ dataAttributes: createFamilySemanticAttributes("banner", {
5360
+ "data-variant": variant
5361
+ })
5362
+ },
5363
+ content: {
5364
+ className: "mw-banner__content"
5365
+ },
5366
+ icon: {
5367
+ className: "mw-banner__icon",
5368
+ visible: showIcon
5369
+ },
5370
+ message: {
5371
+ className: "mw-banner__message"
5372
+ },
5373
+ action: {
5374
+ className: "mw-banner__action",
5375
+ visible: showAction
5376
+ },
5377
+ dismiss: {
5378
+ className: "mw-banner__dismiss",
5379
+ visible: dismissible,
5380
+ ariaLabel: "Dismiss banner"
5381
+ }
5382
+ };
5383
+ }
5384
+
5385
+ // src/components/atoms/banner/banner-types.ts
5386
+ var BannerVariant = {
5387
+ neutral: "neutral",
5388
+ info: "info",
5389
+ success: "success",
5390
+ warning: "warning",
5391
+ error: "error"
5392
+ };
5393
+
4599
5394
  // src/components/atoms/button/button-types.ts
4600
5395
  var ButtonSize = {
4601
5396
  xs: "xs",
@@ -4608,7 +5403,8 @@ var ButtonVariant = {
4608
5403
  secondary: "secondary",
4609
5404
  neutral: "neutral",
4610
5405
  text: "text",
4611
- success: "success"
5406
+ success: "success",
5407
+ danger: "danger"
4612
5408
  };
4613
5409
  var ButtonAction = {
4614
5410
  submit: "submit",
@@ -4687,13 +5483,21 @@ function resolveButtonA11y(opts, resolvedLoading) {
4687
5483
  const isDisabled = !!opts.disabled || resolvedLoading.isLoading && resolvedLoading.disableWhileLoading;
4688
5484
  if (__DEV__2) {
4689
5485
  const iconOnly = opts.iconOnly || opts.hasVisibleText === false;
5486
+ const accessibleLabel = opts.ariaLabel ?? opts.label;
4690
5487
  const loadingAccessibleLabel = resolvedLoading.isLoading ? resolvedLoading.loadingLabel : void 0;
4691
- if (iconOnly && !opts.ariaLabel && !loadingAccessibleLabel) {
4692
- console.warn("[marwes] Icon-only Button requires ariaLabel, or loadingLabel while loading.");
5488
+ if (iconOnly && !accessibleLabel && !loadingAccessibleLabel) {
5489
+ console.warn(
5490
+ "[marwes] Icon-only Button requires ariaLabel, label, or loadingLabel while loading."
5491
+ );
4693
5492
  }
4694
5493
  }
4695
5494
  const common = {};
4696
- if (opts.ariaLabel) common.ariaLabel = opts.ariaLabel;
5495
+ if (opts.ariaLabelledBy) {
5496
+ common.ariaLabelledBy = opts.ariaLabelledBy;
5497
+ } else {
5498
+ const accessibleLabel = opts.ariaLabel ?? opts.label;
5499
+ if (accessibleLabel) common.ariaLabel = accessibleLabel;
5500
+ }
4697
5501
  if (resolvedLoading.isLoading) common.ariaBusy = true;
4698
5502
  if (isDisabled) common.ariaDisabled = true;
4699
5503
  if (opts.toggle) common.ariaPressed = !!opts.pressed;
@@ -4724,6 +5528,7 @@ function createButtonRecipe(opts) {
4724
5528
  const size = opts.size ?? "md";
4725
5529
  const variant = opts.variant ?? "primary";
4726
5530
  const action = opts.action ?? (tag === "button" ? "button" : "navigate");
5531
+ const hasAffordance = resolvedLoading.isLoading || Boolean(opts.iconLeft || opts.iconRight);
4727
5532
  return {
4728
5533
  tag,
4729
5534
  blockClick,
@@ -4745,6 +5550,8 @@ function createButtonRecipe(opts) {
4745
5550
  "data-size": size
4746
5551
  }),
4747
5552
  "data-error": opts.error ? "true" : void 0,
5553
+ "data-has-affordance": hasAffordance ? "true" : void 0,
5554
+ "data-icon-only": opts.iconOnly ? "true" : void 0,
4748
5555
  ...opts.dataAttributes
4749
5556
  },
4750
5557
  vars: {}
@@ -4759,7 +5566,8 @@ function buildRadioA11y(opts) {
4759
5566
  if (opts.value) a11y.value = opts.value;
4760
5567
  if (opts.disabled) a11y.disabled = true;
4761
5568
  if (opts.required) a11y.required = true;
4762
- if (opts.ariaLabel) a11y.ariaLabel = opts.ariaLabel;
5569
+ const accessibleLabel = opts.ariaLabel ?? opts.label;
5570
+ if (accessibleLabel) a11y.ariaLabel = accessibleLabel;
4763
5571
  if (opts.ariaLabelledBy) a11y.ariaLabelledBy = opts.ariaLabelledBy;
4764
5572
  if (opts.ariaDescribedBy) a11y.ariaDescribedBy = opts.ariaDescribedBy;
4765
5573
  if (opts.invalid) a11y.ariaInvalid = true;
@@ -4767,7 +5575,7 @@ function buildRadioA11y(opts) {
4767
5575
  }
4768
5576
 
4769
5577
  // src/components/atoms/radio/radio-recipe.ts
4770
- function cx6(...parts) {
5578
+ function cx10(...parts) {
4771
5579
  return parts.filter(Boolean).join(" ");
4772
5580
  }
4773
5581
  function radioRecipe({
@@ -4775,7 +5583,7 @@ function radioRecipe({
4775
5583
  invalid = false,
4776
5584
  ...opts
4777
5585
  }) {
4778
- const className = cx6("mw-radio", disabled && "mw-radio--disabled", invalid && "mw-radio--invalid");
5586
+ const className = cx10("mw-radio", disabled && "mw-radio--disabled", invalid && "mw-radio--invalid");
4779
5587
  const kit = {
4780
5588
  tag: "input",
4781
5589
  className,
@@ -4797,8 +5605,9 @@ function resolveSwitchA11y(opts) {
4797
5605
  ariaChecked: opts.checked ?? false
4798
5606
  };
4799
5607
  if (opts.disabled) a11y.ariaDisabled = true;
4800
- if (opts.ariaLabel) a11y.ariaLabel = opts.ariaLabel;
4801
- if (opts.ariaLabelledby) a11y.ariaLabelledby = opts.ariaLabelledby;
5608
+ const accessibleLabel = opts.ariaLabel ?? opts.label;
5609
+ if (accessibleLabel) a11y.ariaLabel = accessibleLabel;
5610
+ if (opts.ariaLabelledBy) a11y.ariaLabelledBy = opts.ariaLabelledBy;
4802
5611
  if (opts.ariaDescribedBy) a11y.ariaDescribedBy = opts.ariaDescribedBy;
4803
5612
  return a11y;
4804
5613
  }
@@ -4811,14 +5620,14 @@ var SwitchSize = {
4811
5620
  };
4812
5621
 
4813
5622
  // src/components/atoms/switch/switch-recipe.ts
4814
- function cx7(...parts) {
5623
+ function cx11(...parts) {
4815
5624
  return parts.filter(Boolean).join(" ");
4816
5625
  }
4817
5626
  function createSwitchRecipe(opts) {
4818
5627
  const size = opts.size ?? SwitchSize.compact;
4819
5628
  return {
4820
5629
  tag: "button",
4821
- className: cx7(
5630
+ className: cx11(
4822
5631
  "mw-switch",
4823
5632
  `mw-switch--${size}`,
4824
5633
  opts.checked && "mw-switch--checked",
@@ -4865,7 +5674,8 @@ function resolveSliderA11y(opts) {
4865
5674
  if (opts.name) a11y.name = opts.name;
4866
5675
  if (opts.disabled) a11y.disabled = true;
4867
5676
  if (opts.required) a11y.required = true;
4868
- if (opts.ariaLabel) a11y.ariaLabel = opts.ariaLabel;
5677
+ const accessibleLabel = opts.ariaLabel ?? opts.label;
5678
+ if (accessibleLabel) a11y.ariaLabel = accessibleLabel;
4869
5679
  if (opts.ariaLabelledBy) a11y.ariaLabelledBy = opts.ariaLabelledBy;
4870
5680
  if (opts.ariaDescribedBy) a11y.ariaDescribedBy = opts.ariaDescribedBy;
4871
5681
  if (opts.ariaValueText) a11y.ariaValueText = opts.ariaValueText;
@@ -4886,13 +5696,13 @@ function resolveSliderCurrentValue(opts, min, max) {
4886
5696
  return clampSliderValue(candidateValue, min, max);
4887
5697
  }
4888
5698
  function resolveSliderFillPercentage(currentValue, min, max) {
4889
- const range = max - min;
4890
- if (range <= 0) {
5699
+ const range2 = max - min;
5700
+ if (range2 <= 0) {
4891
5701
  return 0;
4892
5702
  }
4893
- return (currentValue - min) / range * 100;
5703
+ return (currentValue - min) / range2 * 100;
4894
5704
  }
4895
- function cx8(...parts) {
5705
+ function cx12(...parts) {
4896
5706
  return parts.filter(Boolean).join(" ");
4897
5707
  }
4898
5708
  function createSliderRecipe(opts = {}) {
@@ -4904,7 +5714,7 @@ function createSliderRecipe(opts = {}) {
4904
5714
  const orientation = opts.orientation ?? "horizontal";
4905
5715
  return {
4906
5716
  tag: "div",
4907
- className: cx8(
5717
+ className: cx12(
4908
5718
  "mw-slider",
4909
5719
  `mw-slider--${orientation}`,
4910
5720
  opts.disabled && "mw-slider--disabled",
@@ -4939,7 +5749,8 @@ function buildCheckboxA11y(props) {
4939
5749
  if (props.value) a11y.value = props.value;
4940
5750
  if (props.disabled) a11y.disabled = true;
4941
5751
  if (props.required) a11y.required = true;
4942
- if (props.ariaLabel) a11y.ariaLabel = props.ariaLabel;
5752
+ const accessibleLabel = props.ariaLabel ?? props.label;
5753
+ if (accessibleLabel) a11y.ariaLabel = accessibleLabel;
4943
5754
  if (props.ariaLabelledBy) a11y.ariaLabelledBy = props.ariaLabelledBy;
4944
5755
  if (props.ariaDescribedBy) a11y.ariaDescribedBy = props.ariaDescribedBy;
4945
5756
  if (props.indeterminate) a11y.ariaChecked = "mixed";
@@ -4948,7 +5759,7 @@ function buildCheckboxA11y(props) {
4948
5759
  }
4949
5760
 
4950
5761
  // src/components/atoms/checkbox/checkbox-recipe.ts
4951
- function cx9(...parts) {
5762
+ function cx13(...parts) {
4952
5763
  return parts.filter(Boolean).join(" ");
4953
5764
  }
4954
5765
  function checkboxRecipe({
@@ -4957,7 +5768,7 @@ function checkboxRecipe({
4957
5768
  ...props
4958
5769
  }) {
4959
5770
  const size = props.size ?? "md";
4960
- const className = cx9(
5771
+ const className = cx13(
4961
5772
  "mw-checkbox",
4962
5773
  size === "sm" && "mw-checkbox--sm",
4963
5774
  size === "md" && "mw-checkbox--md",
@@ -5035,17 +5846,18 @@ function resolveSpinnerA11y(options = {}) {
5035
5846
  ariaHidden: true
5036
5847
  };
5037
5848
  }
5038
- if (options.ariaLabel) {
5849
+ const accessibleLabel = options.ariaLabel ?? options.label;
5850
+ if (accessibleLabel) {
5039
5851
  return {
5040
5852
  ...options.id ? { id: options.id } : {},
5041
5853
  role: "status",
5042
- ariaLabel: options.ariaLabel,
5854
+ ariaLabel: accessibleLabel,
5043
5855
  ariaLive: "polite"
5044
5856
  };
5045
5857
  }
5046
5858
  if (__DEV__3 && options.decorative === false) {
5047
5859
  console.warn(
5048
- "[marwes] Spinner: decorative={false} was passed without ariaLabel. The spinner stays hidden from assistive technology unless ariaLabel is also provided."
5860
+ "[marwes] Spinner: decorative={false} was passed without ariaLabel. The spinner stays hidden from assistive technology unless ariaLabel or label is also provided."
5049
5861
  );
5050
5862
  }
5051
5863
  return {
@@ -5324,7 +6136,7 @@ function createSpinnerSvgDefinition(variant) {
5324
6136
  }
5325
6137
 
5326
6138
  // src/components/atoms/spinner/spinner-recipe.ts
5327
- function cx10(...parts) {
6139
+ function cx14(...parts) {
5328
6140
  return parts.filter(Boolean).join(" ");
5329
6141
  }
5330
6142
  function resolveSpinnerDataSize(size) {
@@ -5339,7 +6151,7 @@ function createSpinnerRecipe(options = {}) {
5339
6151
  const resolvedSize = resolveSpinnerSize(requestedSize);
5340
6152
  return {
5341
6153
  tag: "span",
5342
- className: cx10("mw-spinner", `mw-spinner--${variant}`),
6154
+ className: cx14("mw-spinner", `mw-spinner--${variant}`),
5343
6155
  vars: {
5344
6156
  "--mw-spinner-size": `${resolvedSize}px`,
5345
6157
  "--mw-spinner-rotation-duration": "800ms"
@@ -5411,7 +6223,7 @@ var FIGMA_TEXT_HEIGHT = 12;
5411
6223
  var FIGMA_CIRCULAR_SIZE = 40;
5412
6224
  var FIGMA_RECTANGULAR_SIZE = 120;
5413
6225
  var FIGMA_RADIUS = 4;
5414
- function cx11(...parts) {
6226
+ function cx15(...parts) {
5415
6227
  return parts.filter(Boolean).join(" ");
5416
6228
  }
5417
6229
  function toCssDimension(value) {
@@ -5436,7 +6248,7 @@ function createSkeletonRecipe(options = {}) {
5436
6248
  const animation = options.animation ?? SkeletonAnimation.pulse;
5437
6249
  return {
5438
6250
  tag: "span",
5439
- className: cx11(
6251
+ className: cx15(
5440
6252
  "mw-skeleton",
5441
6253
  `mw-skeleton--${variant}`,
5442
6254
  animation !== SkeletonAnimation.none && `mw-skeleton--${animation}`
@@ -5455,6 +6267,117 @@ function createSkeletonRecipe(options = {}) {
5455
6267
  };
5456
6268
  }
5457
6269
 
6270
+ // src/components/atoms/progress-bar/progress-bar-a11y.ts
6271
+ var DEFAULT_PROGRESS_BAR_MIN = 0;
6272
+ var DEFAULT_PROGRESS_BAR_MAX = 100;
6273
+ var DEFAULT_PROGRESS_BAR_LABEL = "Progress";
6274
+ function resolveFiniteNumber(value, fallback) {
6275
+ return value === void 0 || !Number.isFinite(value) ? fallback : value;
6276
+ }
6277
+ function resolveProgressBarBounds(options) {
6278
+ const min = resolveFiniteNumber(options.min, DEFAULT_PROGRESS_BAR_MIN);
6279
+ const rawMax = resolveFiniteNumber(options.max, DEFAULT_PROGRESS_BAR_MAX);
6280
+ const max = rawMax > min ? rawMax : min + 1;
6281
+ return { min, max };
6282
+ }
6283
+ function clampProgressBarValue(value, min, max) {
6284
+ if (!Number.isFinite(value)) return min;
6285
+ return Math.min(max, Math.max(min, value));
6286
+ }
6287
+ function resolveProgressBarA11y(options, value) {
6288
+ const { min, max } = resolveProgressBarBounds(options);
6289
+ const label = options.label ?? DEFAULT_PROGRESS_BAR_LABEL;
6290
+ const labelId = options.id && options.showLabel !== false ? `${options.id}-label` : void 0;
6291
+ const ariaLabelledBy = options.ariaLabelledBy ?? labelId;
6292
+ const ariaLabel = ariaLabelledBy ? void 0 : options.ariaLabel ?? label;
6293
+ return {
6294
+ ...options.id ? { id: options.id } : {},
6295
+ role: "progressbar",
6296
+ ariaValueMin: min,
6297
+ ariaValueMax: max,
6298
+ ariaValueNow: value,
6299
+ ...options.valueLabel ? { ariaValueText: options.valueLabel } : {},
6300
+ ...ariaLabel ? { ariaLabel } : {},
6301
+ ...ariaLabelledBy ? { ariaLabelledBy } : {},
6302
+ ...options.ariaDescribedBy ? { ariaDescribedBy: options.ariaDescribedBy } : {},
6303
+ ...options.disabled ? { ariaDisabled: true } : {}
6304
+ };
6305
+ }
6306
+
6307
+ // src/components/atoms/progress-bar/progress-bar-types.ts
6308
+ var ProgressBarSize = {
6309
+ small: "small",
6310
+ default: "default"
6311
+ };
6312
+ var progressBarSizes = Object.values(ProgressBarSize);
6313
+ var ProgressBarState = {
6314
+ default: "default",
6315
+ hover: "hover",
6316
+ pressed: "pressed",
6317
+ focus: "focus"
6318
+ };
6319
+ var progressBarStates = Object.values(ProgressBarState);
6320
+
6321
+ // src/components/atoms/progress-bar/progress-bar-recipe.ts
6322
+ function cx16(...parts) {
6323
+ return parts.filter(Boolean).join(" ");
6324
+ }
6325
+ function resolveProgressBarPercentage(value, min, max) {
6326
+ const range2 = max - min;
6327
+ if (range2 <= 0) return 0;
6328
+ return (value - min) / range2 * 100;
6329
+ }
6330
+ function resolvePercentageLabel(percentage, valueLabel) {
6331
+ if (valueLabel) return valueLabel;
6332
+ return `${Math.round(percentage)}%`;
6333
+ }
6334
+ function createProgressBarRecipe(options = {}) {
6335
+ const { min, max } = resolveProgressBarBounds(options);
6336
+ const value = clampProgressBarValue(options.value ?? min, min, max);
6337
+ const percentage = resolveProgressBarPercentage(value, min, max);
6338
+ const size = options.size ?? ProgressBarSize.default;
6339
+ const state = options.state ?? ProgressBarState.default;
6340
+ const showLabel = options.showLabel !== false;
6341
+ const showPercentage = options.showPercentage !== false;
6342
+ const label = options.label ?? DEFAULT_PROGRESS_BAR_LABEL;
6343
+ const percentageLabel = resolvePercentageLabel(percentage, options.valueLabel);
6344
+ const a11y = resolveProgressBarA11y({ ...options, showLabel }, value);
6345
+ return {
6346
+ tag: "div",
6347
+ className: cx16(
6348
+ "mw-progress-bar",
6349
+ `mw-progress-bar--${size}`,
6350
+ state !== ProgressBarState.default && `mw-progress-bar--state-${state}`,
6351
+ options.disabled && "mw-progress-bar--disabled"
6352
+ ),
6353
+ trackClassName: "mw-progress-bar__track",
6354
+ fillClassName: "mw-progress-bar__fill",
6355
+ labelClassName: "mw-progress-bar__label",
6356
+ percentageClassName: "mw-progress-bar__percentage",
6357
+ ...a11y.ariaLabelledBy && options.id ? { labelId: `${options.id}-label` } : {},
6358
+ vars: {
6359
+ "--mw-progress-bar-value-percentage": `${percentage}%`
6360
+ },
6361
+ a11y,
6362
+ dataAttributes: {
6363
+ "data-component": "progress-bar",
6364
+ "data-size": size,
6365
+ "data-state": state,
6366
+ ...options.disabled ? { "data-disabled": "true" } : {}
6367
+ },
6368
+ label,
6369
+ percentageLabel,
6370
+ value,
6371
+ min,
6372
+ max,
6373
+ percentage,
6374
+ size,
6375
+ state,
6376
+ showLabel,
6377
+ showPercentage
6378
+ };
6379
+ }
6380
+
5458
6381
  // src/components/atoms/stat-tile/stat-tile-a11y.ts
5459
6382
  function resolveStatTileTrendLabel(direction, trendValue) {
5460
6383
  if (!direction || !trendValue) return void 0;
@@ -5598,6 +6521,9 @@ function createDayKit(day) {
5598
6521
  function createDatePickerRecipe(opts = {}) {
5599
6522
  const device = resolveDevice(opts.device);
5600
6523
  const weeks = opts.weeks ?? defaultWeeks;
6524
+ const calendarLabel = opts.ariaLabel ?? opts.calendarLabel ?? "Choose date";
6525
+ const a11y = opts.ariaLabelledBy ? { ariaLabelledBy: opts.ariaLabelledBy } : { ariaLabel: calendarLabel };
6526
+ if (opts.ariaDescribedBy) a11y.ariaDescribedBy = opts.ariaDescribedBy;
5601
6527
  return {
5602
6528
  className: ["mw-date-picker", `mw-date-picker--${device}`].join(" "),
5603
6529
  dataAttributes: {
@@ -5605,6 +6531,7 @@ function createDatePickerRecipe(opts = {}) {
5605
6531
  "data-component": "date-picker",
5606
6532
  "data-device": device
5607
6533
  },
6534
+ a11y,
5608
6535
  monthLabel: opts.monthLabel ?? "March 2026",
5609
6536
  weekdayLabels: opts.weekdayLabels ?? defaultWeekdayLabels,
5610
6537
  weeks,
@@ -5623,7 +6550,7 @@ function createDatePickerRecipe(opts = {}) {
5623
6550
  footerButtonClassName: "mw-date-picker__footer-button"
5624
6551
  },
5625
6552
  labels: {
5626
- calendar: opts.calendarLabel ?? "Choose date",
6553
+ calendar: calendarLabel,
5627
6554
  previousYear: opts.previousYearLabel ?? "Previous year",
5628
6555
  previousMonth: opts.previousMonthLabel ?? "Previous month",
5629
6556
  nextMonth: opts.nextMonthLabel ?? "Next month",
@@ -10507,7 +11434,12 @@ function resolveInputA11y(opts) {
10507
11434
  if (opts.inputMode) a11y.inputMode = opts.inputMode;
10508
11435
  if (opts.autoComplete) a11y.autoComplete = opts.autoComplete;
10509
11436
  if (opts.placeholder) a11y.placeholder = opts.placeholder;
10510
- if (opts.ariaLabel) a11y.ariaLabel = opts.ariaLabel;
11437
+ if (opts.ariaLabelledBy) {
11438
+ a11y.ariaLabelledBy = opts.ariaLabelledBy;
11439
+ } else {
11440
+ const accessibleLabel = opts.ariaLabel ?? opts.label;
11441
+ if (accessibleLabel) a11y.ariaLabel = accessibleLabel;
11442
+ }
10511
11443
  if (opts.invalid) a11y.ariaInvalid = true;
10512
11444
  if (opts.describedBy) a11y.ariaDescribedBy = opts.describedBy;
10513
11445
  return a11y;
@@ -10549,8 +11481,11 @@ function resolveInputOtpA11y(options) {
10549
11481
  if (options.required) {
10550
11482
  a11yProps.required = true;
10551
11483
  }
10552
- if (options.ariaLabel) {
10553
- a11yProps.ariaLabel = options.ariaLabel;
11484
+ if (options.ariaLabelledBy) {
11485
+ a11yProps.ariaLabelledBy = options.ariaLabelledBy;
11486
+ } else {
11487
+ const accessibleLabel = options.ariaLabel ?? options.label;
11488
+ if (accessibleLabel) a11yProps.ariaLabel = accessibleLabel;
10554
11489
  }
10555
11490
  if (options.invalid) {
10556
11491
  a11yProps.ariaInvalid = true;
@@ -10562,7 +11497,7 @@ function resolveInputOtpA11y(options) {
10562
11497
  }
10563
11498
 
10564
11499
  // src/components/atoms/input/input-otp-recipe.ts
10565
- function cx12(...parts) {
11500
+ function cx17(...parts) {
10566
11501
  return parts.filter(Boolean).join(" ");
10567
11502
  }
10568
11503
  function sanitizeInputOtpValue(rawValue, length) {
@@ -10598,7 +11533,7 @@ function createInputOtpRecipe(options) {
10598
11533
  };
10599
11534
  return {
10600
11535
  tag: "div",
10601
- className: cx12(
11536
+ className: cx17(
10602
11537
  "mw-input-otp",
10603
11538
  options.invalid && "mw-input-otp--invalid",
10604
11539
  options.disabled && "mw-input-otp--disabled",
@@ -10619,7 +11554,12 @@ function resolveSelectA11y(opts) {
10619
11554
  if (opts.name) a11y.name = opts.name;
10620
11555
  if (opts.disabled) a11y.disabled = true;
10621
11556
  if (opts.required) a11y.required = true;
10622
- if (opts.ariaLabel) a11y.ariaLabel = opts.ariaLabel;
11557
+ if (opts.ariaLabelledBy) {
11558
+ a11y.ariaLabelledBy = opts.ariaLabelledBy;
11559
+ } else {
11560
+ const accessibleLabel = opts.ariaLabel ?? opts.label;
11561
+ if (accessibleLabel) a11y.ariaLabel = accessibleLabel;
11562
+ }
10623
11563
  if (opts.invalid) a11y.ariaInvalid = true;
10624
11564
  if (opts.describedBy) a11y.ariaDescribedBy = opts.describedBy;
10625
11565
  return a11y;
@@ -10662,7 +11602,12 @@ function resolveTextareaA11y(opts) {
10662
11602
  if (opts.placeholder) a11y.placeholder = opts.placeholder;
10663
11603
  if (opts.rows !== void 0) a11y.rows = opts.rows;
10664
11604
  if (opts.cols !== void 0) a11y.cols = opts.cols;
10665
- if (opts.ariaLabel) a11y.ariaLabel = opts.ariaLabel;
11605
+ if (opts.ariaLabelledBy) {
11606
+ a11y.ariaLabelledBy = opts.ariaLabelledBy;
11607
+ } else {
11608
+ const accessibleLabel = opts.ariaLabel ?? opts.label;
11609
+ if (accessibleLabel) a11y.ariaLabel = accessibleLabel;
11610
+ }
10666
11611
  if (opts.invalid) a11y.ariaInvalid = true;
10667
11612
  if (opts.describedBy) a11y.ariaDescribedBy = opts.describedBy;
10668
11613
  return a11y;
@@ -10692,7 +11637,8 @@ function resolveRichTextA11y(opts) {
10692
11637
  ariaMultiline: true
10693
11638
  };
10694
11639
  if (opts.id) a11y.id = opts.id;
10695
- if (opts.ariaLabel) a11y.ariaLabel = opts.ariaLabel;
11640
+ const accessibleLabel = opts.ariaLabel ?? opts.label;
11641
+ if (accessibleLabel) a11y.ariaLabel = accessibleLabel;
10696
11642
  if (opts.labelledBy) a11y.ariaLabelledBy = opts.labelledBy;
10697
11643
  if (opts.describedBy) a11y.ariaDescribedBy = opts.describedBy;
10698
11644
  if (opts.invalid) a11y.ariaInvalid = true;
@@ -10770,7 +11716,14 @@ function normalizeRichTextHtml(rawHtml) {
10770
11716
  if (!trimmedHtml.includes("<")) {
10771
11717
  return escapeRichTextHtml(trimmedHtml);
10772
11718
  }
10773
- const normalizedHtml = trimmedHtml.replace(/<b(?:\s[^>]*)?>/gi, "<strong>").replace(/<\/b>/gi, "</strong>").replace(/<i(?:\s[^>]*)?>/gi, "<em>").replace(/<\/i>/gi, "</em>").replace(blockTagPattern, "<p>").replace(closingBlockTagPattern, "</p>").replace(openingParagraphPattern, "<p>").replace(openingStrongPattern, "<strong>").replace(openingEmphasisPattern, "<em>").replace(openingUnderlinePattern, "<u>").replace(lineBreakPattern, "<br>").replace(disallowedTagPattern, "").replace(unsupportedAnglePattern, "&lt;").replace(/\s+/g, " ").trim();
11719
+ let normalizedHtml = trimmedHtml.replace(/<b(?:\s[^>]*)?>/gi, "<strong>").replace(/<\/b>/gi, "</strong>").replace(/<i(?:\s[^>]*)?>/gi, "<em>").replace(/<\/i>/gi, "</em>").replace(blockTagPattern, "<p>").replace(closingBlockTagPattern, "</p>").replace(openingParagraphPattern, "<p>").replace(openingStrongPattern, "<strong>").replace(openingEmphasisPattern, "<em>").replace(openingUnderlinePattern, "<u>").replace(lineBreakPattern, "<br>");
11720
+ let previous;
11721
+ do {
11722
+ previous = normalizedHtml;
11723
+ normalizedHtml = normalizedHtml.replace(disallowedTagPattern, "");
11724
+ } while (normalizedHtml !== previous);
11725
+ normalizedHtml = normalizedHtml.replace(unsupportedAnglePattern, "&lt;");
11726
+ normalizedHtml = normalizedHtml.replace(/\s+/g, " ").trim();
10774
11727
  return isRichTextHtmlEmpty(normalizedHtml) ? "" : normalizedHtml;
10775
11728
  }
10776
11729
  function isRichTextHtmlEmpty(rawHtml) {
@@ -10830,6 +11783,27 @@ function paragraphRecipe(opts, theme) {
10830
11783
  };
10831
11784
  }
10832
11785
 
11786
+ // src/components/atoms/text/text-recipe.ts
11787
+ function textRecipe(opts, theme) {
11788
+ const variant = opts.variant ?? "caption";
11789
+ const tag = opts.headingLevel ? `h${opts.headingLevel}` : opts.as ?? "span";
11790
+ const className = ["mw-text", `mw-text--${variant}`].filter(Boolean).join(" ");
11791
+ const typo = theme.typography.text[variant];
11792
+ const vars = {
11793
+ "--mw-text-size": `${typo.fontSize}px`,
11794
+ "--mw-text-line-height": `${typo.lineHeight}`,
11795
+ "--mw-text-weight": `${typo.fontWeight}`,
11796
+ "--mw-text-letter-spacing": `${typo.letterSpacing}px`,
11797
+ "--mw-text-transform": typo.textTransform ?? "none"
11798
+ };
11799
+ return {
11800
+ tag,
11801
+ className,
11802
+ vars,
11803
+ a11y: opts.id ? { id: opts.id } : {}
11804
+ };
11805
+ }
11806
+
10833
11807
  // src/components/atoms/tab/tab-a11y.ts
10834
11808
  function resolveTabA11y(opts) {
10835
11809
  const a11y = {
@@ -10840,19 +11814,20 @@ function resolveTabA11y(opts) {
10840
11814
  tabIndex: opts.selected && !opts.disabled ? 0 : -1
10841
11815
  };
10842
11816
  if (opts.disabled) a11y.ariaDisabled = true;
10843
- if (opts.ariaLabel) a11y.ariaLabel = opts.ariaLabel;
11817
+ const accessibleLabel = opts.ariaLabel ?? opts.label;
11818
+ if (accessibleLabel) a11y.ariaLabel = accessibleLabel;
10844
11819
  if (opts.ariaControls) a11y.ariaControls = opts.ariaControls;
10845
11820
  return a11y;
10846
11821
  }
10847
11822
 
10848
11823
  // src/components/atoms/tab/tab-recipe.ts
10849
- function cx13(...parts) {
11824
+ function cx18(...parts) {
10850
11825
  return parts.filter(Boolean).join(" ");
10851
11826
  }
10852
11827
  function createTabRecipe(opts) {
10853
11828
  return {
10854
11829
  tag: "button",
10855
- className: cx13(
11830
+ className: cx18(
10856
11831
  "mw-tab",
10857
11832
  opts.selected && "mw-tab--selected",
10858
11833
  opts.disabled && "mw-tab--disabled"
@@ -10943,6 +11918,7 @@ var Spacings = {
10943
11918
  sp2: "sp-2",
10944
11919
  sp4: "sp-4",
10945
11920
  sp8: "sp-8",
11921
+ sp12: "sp-12",
10946
11922
  sp16: "sp-16",
10947
11923
  sp24: "sp-24",
10948
11924
  sp32: "sp-32",
@@ -10961,6 +11937,7 @@ var Spacings = {
10961
11937
  "sp-2": "sp-2",
10962
11938
  "sp-4": "sp-4",
10963
11939
  "sp-8": "sp-8",
11940
+ "sp-12": "sp-12",
10964
11941
  "sp-16": "sp-16",
10965
11942
  "sp-24": "sp-24",
10966
11943
  "sp-32": "sp-32",
@@ -10977,6 +11954,478 @@ var Spacings = {
10977
11954
  "sp-120": "sp-120"
10978
11955
  };
10979
11956
 
11957
+ // src/components/atoms/segmented-control/segmented-control-a11y.ts
11958
+ function resolveSegmentedControlA11y(opts) {
11959
+ const a11y = {
11960
+ role: "radiogroup"
11961
+ };
11962
+ if (opts.ariaLabelledBy) {
11963
+ a11y.ariaLabelledBy = opts.ariaLabelledBy;
11964
+ } else {
11965
+ const accessibleLabel = opts.ariaLabel ?? opts.label;
11966
+ if (accessibleLabel) a11y.ariaLabel = accessibleLabel;
11967
+ }
11968
+ if (opts.ariaDescribedBy) a11y.ariaDescribedBy = opts.ariaDescribedBy;
11969
+ if (opts.disabled) a11y.ariaDisabled = true;
11970
+ return a11y;
11971
+ }
11972
+ function resolveSegmentedControlItemA11y(opts) {
11973
+ const a11y = {
11974
+ role: "radio",
11975
+ ariaChecked: opts.selected ?? false,
11976
+ tabIndex: opts.selected && !opts.disabled ? 0 : -1
11977
+ };
11978
+ if (opts.disabled) a11y.ariaDisabled = true;
11979
+ const accessibleLabel = opts.ariaLabel ?? opts.label;
11980
+ if (accessibleLabel) a11y.ariaLabel = accessibleLabel;
11981
+ return a11y;
11982
+ }
11983
+ function resolveSegmentedControlValue(items, requestedValue) {
11984
+ if (items.length === 0) return void 0;
11985
+ if (requestedValue) {
11986
+ const match = items.find((item) => item.value === requestedValue && !item.disabled);
11987
+ if (match) return match.value;
11988
+ }
11989
+ return items.find((item) => !item.disabled)?.value;
11990
+ }
11991
+ function moveSegmentedControlSelection(items, currentValue, direction) {
11992
+ const enabled = items.filter((item) => !item.disabled);
11993
+ if (enabled.length === 0) return void 0;
11994
+ if (direction === "start") return enabled[0]?.value;
11995
+ if (direction === "end") return enabled[enabled.length - 1]?.value;
11996
+ const currentIndex = enabled.findIndex((item) => item.value === currentValue);
11997
+ if (currentIndex === -1) return enabled[0]?.value;
11998
+ const delta = direction === "next" ? 1 : -1;
11999
+ const nextIndex = (currentIndex + delta + enabled.length) % enabled.length;
12000
+ return enabled[nextIndex]?.value;
12001
+ }
12002
+
12003
+ // src/components/atoms/segmented-control/segmented-control-recipe.ts
12004
+ function cx19(...parts) {
12005
+ return parts.filter(Boolean).join(" ");
12006
+ }
12007
+ function createSegmentedControlRecipe(opts) {
12008
+ const variant = opts.variant ?? "default";
12009
+ const size = opts.size ?? "md";
12010
+ return {
12011
+ tag: "div",
12012
+ className: cx19(
12013
+ "mw-segmented-control",
12014
+ variant !== "default" && `mw-segmented-control--${variant}`,
12015
+ size !== "md" && `mw-segmented-control--${size}`,
12016
+ opts.disabled && "mw-segmented-control--disabled",
12017
+ opts.fullWidth && "mw-segmented-control--full-width"
12018
+ ),
12019
+ vars: {},
12020
+ a11y: resolveSegmentedControlA11y(opts)
12021
+ };
12022
+ }
12023
+ function createSegmentedControlItemRecipe(opts) {
12024
+ return {
12025
+ tag: "button",
12026
+ className: cx19(
12027
+ "mw-segmented-control__item",
12028
+ opts.selected && "mw-segmented-control__item--selected",
12029
+ opts.disabled && "mw-segmented-control__item--disabled",
12030
+ opts.iconOnly && "mw-segmented-control__item--icon-only"
12031
+ ),
12032
+ vars: {},
12033
+ a11y: resolveSegmentedControlItemA11y(opts)
12034
+ };
12035
+ }
12036
+
12037
+ // src/components/atoms/pagination/pagination-a11y.ts
12038
+ function resolvePaginationA11y(opts) {
12039
+ const a11y = {};
12040
+ if (opts.ariaLabelledBy) {
12041
+ a11y.ariaLabelledBy = opts.ariaLabelledBy;
12042
+ } else {
12043
+ a11y.ariaLabel = opts.ariaLabel ?? "Pagination";
12044
+ }
12045
+ if (opts.ariaDescribedBy) a11y.ariaDescribedBy = opts.ariaDescribedBy;
12046
+ if (opts.disabled) a11y.ariaDisabled = true;
12047
+ return a11y;
12048
+ }
12049
+ function resolvePaginationListA11y() {
12050
+ return { role: "list" };
12051
+ }
12052
+ function resolvePaginationControlA11y(opts) {
12053
+ const fallbackByDirection = {
12054
+ first: "First page",
12055
+ previous: "Previous page",
12056
+ next: "Next page",
12057
+ last: "Last page"
12058
+ };
12059
+ const a11y = {
12060
+ ariaLabel: opts.ariaLabel ?? opts.label ?? fallbackByDirection[opts.direction]
12061
+ };
12062
+ if (opts.disabled) a11y.ariaDisabled = true;
12063
+ return a11y;
12064
+ }
12065
+ function resolvePaginationPageA11y(opts) {
12066
+ const a11y = {
12067
+ ariaLabel: opts.ariaLabel ?? (opts.selected ? `Page ${opts.page}, current page` : `Go to page ${opts.page}`)
12068
+ };
12069
+ if (opts.selected) a11y.ariaCurrent = "page";
12070
+ if (opts.disabled) a11y.ariaDisabled = true;
12071
+ return a11y;
12072
+ }
12073
+ function resolvePaginationEllipsisA11y() {
12074
+ return { ariaHidden: true };
12075
+ }
12076
+ function resolvePaginationItemAriaLabel(getItemAriaLabel, item) {
12077
+ return getItemAriaLabel?.(item);
12078
+ }
12079
+
12080
+ // src/components/atoms/pagination/pagination-recipe.ts
12081
+ function cx20(...parts) {
12082
+ return parts.filter(Boolean).join(" ");
12083
+ }
12084
+ function normalizeCount(value, fallback) {
12085
+ if (value === void 0) return fallback;
12086
+ if (!Number.isFinite(value)) return fallback;
12087
+ return Math.max(0, Math.floor(value));
12088
+ }
12089
+ function range(start, end) {
12090
+ if (end < start) return [];
12091
+ return Array.from({ length: end - start + 1 }, (_, index) => start + index);
12092
+ }
12093
+ function toPageItem(pageNumber, currentPage) {
12094
+ return {
12095
+ type: "page",
12096
+ page: pageNumber,
12097
+ key: `page-${pageNumber}`,
12098
+ selected: pageNumber === currentPage
12099
+ };
12100
+ }
12101
+ function clampPaginationPage(page, pageCount) {
12102
+ const normalizedPageCount = normalizeCount(pageCount, 0);
12103
+ if (normalizedPageCount <= 0) return 0;
12104
+ if (page === void 0 || !Number.isFinite(page)) return 1;
12105
+ return Math.min(Math.max(1, Math.floor(page)), normalizedPageCount);
12106
+ }
12107
+ function resolvePaginationAdaptiveMaxVisibleItems(opts) {
12108
+ const containerWidth = Math.max(0, opts.containerWidth);
12109
+ if (containerWidth <= 0) return void 0;
12110
+ const itemSize = opts.itemSize ?? 32;
12111
+ const itemGap = opts.itemGap ?? 2;
12112
+ const sectionGap = opts.sectionGap ?? 12;
12113
+ const controlWidth = opts.controlWidth ?? 0;
12114
+ const controlCount = opts.controlCount ?? 0;
12115
+ const controlGaps = controlCount > 0 ? sectionGap * controlCount : 0;
12116
+ const availableItemWidth = Math.max(0, containerWidth - controlWidth - controlGaps);
12117
+ return Math.max(1, Math.floor((availableItemWidth + itemGap) / (itemSize + itemGap)));
12118
+ }
12119
+ function resolvePaginationListWidth(itemCount, itemSize, itemGap) {
12120
+ if (itemCount <= 0) return 0;
12121
+ return itemCount * itemSize + Math.max(0, itemCount - 1) * itemGap;
12122
+ }
12123
+ function resolvePaginationLayoutWidth(itemCount, controlWidth, controlCount, itemSize, itemGap, sectionGap) {
12124
+ const controlGaps = controlCount > 0 ? sectionGap * controlCount : 0;
12125
+ return controlWidth + controlGaps + resolvePaginationListWidth(itemCount, itemSize, itemGap);
12126
+ }
12127
+ function resolvePaginationReducedItemCount(opts, controlWidth) {
12128
+ return resolvePaginationAdaptiveMaxVisibleItems({
12129
+ containerWidth: opts.containerWidth,
12130
+ controlWidth,
12131
+ ...opts.controlCount !== void 0 ? { controlCount: opts.controlCount } : {},
12132
+ ...opts.itemSize !== void 0 ? { itemSize: opts.itemSize } : {},
12133
+ ...opts.itemGap !== void 0 ? { itemGap: opts.itemGap } : {},
12134
+ ...opts.sectionGap !== void 0 ? { sectionGap: opts.sectionGap } : {}
12135
+ });
12136
+ }
12137
+ function createPaginationAdaptiveProfile(opts, controlDisplay, maxVisibleItems) {
12138
+ return {
12139
+ controlDisplay,
12140
+ maxVisibleItems,
12141
+ reservedItemCount: resolvePaginationReservedItemCount({
12142
+ pageCount: opts.pageCount,
12143
+ ...opts.siblingCount !== void 0 ? { siblingCount: opts.siblingCount } : {},
12144
+ ...opts.boundaryCount !== void 0 ? { boundaryCount: opts.boundaryCount } : {},
12145
+ ...maxVisibleItems !== void 0 ? { maxVisibleItems } : {}
12146
+ })
12147
+ };
12148
+ }
12149
+ function resolvePaginationAdaptiveProfile(opts) {
12150
+ const containerWidth = Math.max(0, opts.containerWidth);
12151
+ const pageCount = normalizeCount(opts.pageCount, 0);
12152
+ const controlDisplay = opts.controlDisplay ?? "auto";
12153
+ if (containerWidth <= 0 || pageCount <= 0) {
12154
+ return createPaginationAdaptiveProfile(
12155
+ opts,
12156
+ controlDisplay === "icon" ? "icon" : "label",
12157
+ void 0
12158
+ );
12159
+ }
12160
+ const itemSize = opts.itemSize ?? 32;
12161
+ const itemGap = opts.itemGap ?? 2;
12162
+ const sectionGap = opts.sectionGap ?? 12;
12163
+ const controlCount = opts.controlCount ?? 0;
12164
+ const labelControlWidth = opts.labelControlWidth ?? opts.iconControlWidth ?? 0;
12165
+ const iconControlWidth = opts.iconControlWidth ?? labelControlWidth;
12166
+ const preferredItemCount = resolvePaginationReservedItemCount(opts);
12167
+ const preferredMaxVisibleItems = preferredItemCount > 0 ? preferredItemCount : void 0;
12168
+ const labelWidth = resolvePaginationLayoutWidth(
12169
+ preferredItemCount,
12170
+ labelControlWidth,
12171
+ controlCount,
12172
+ itemSize,
12173
+ itemGap,
12174
+ sectionGap
12175
+ );
12176
+ const iconWidth = resolvePaginationLayoutWidth(
12177
+ preferredItemCount,
12178
+ iconControlWidth,
12179
+ controlCount,
12180
+ itemSize,
12181
+ itemGap,
12182
+ sectionGap
12183
+ );
12184
+ if (controlDisplay === "label") {
12185
+ const maxVisibleItems = labelWidth <= containerWidth ? preferredMaxVisibleItems : resolvePaginationReducedItemCount(opts, labelControlWidth);
12186
+ return createPaginationAdaptiveProfile(opts, "label", maxVisibleItems);
12187
+ }
12188
+ if (controlDisplay === "icon") {
12189
+ const maxVisibleItems = iconWidth <= containerWidth ? preferredMaxVisibleItems : resolvePaginationReducedItemCount(opts, iconControlWidth);
12190
+ return createPaginationAdaptiveProfile(opts, "icon", maxVisibleItems);
12191
+ }
12192
+ if (labelWidth <= containerWidth) {
12193
+ return createPaginationAdaptiveProfile(opts, "label", preferredMaxVisibleItems);
12194
+ }
12195
+ if (iconWidth <= containerWidth) {
12196
+ return createPaginationAdaptiveProfile(opts, "icon", preferredMaxVisibleItems);
12197
+ }
12198
+ return createPaginationAdaptiveProfile(
12199
+ opts,
12200
+ "icon",
12201
+ resolvePaginationReducedItemCount(opts, iconControlWidth)
12202
+ );
12203
+ }
12204
+ function resolvePaginationReservedItemCount(opts) {
12205
+ const pageCount = normalizeCount(opts.pageCount, 0);
12206
+ if (pageCount <= 0) return 0;
12207
+ const maxVisibleItems = resolvePaginationEffectiveMaxVisibleItems(opts);
12208
+ if (maxVisibleItems > 0) return Math.min(pageCount, maxVisibleItems);
12209
+ const siblingCount = normalizeCount(opts.siblingCount, 1);
12210
+ const boundaryCount = normalizeCount(opts.boundaryCount, 1);
12211
+ const slotsWithEllipsis = boundaryCount * 2 + siblingCount * 2 + 3;
12212
+ return Math.min(pageCount, slotsWithEllipsis);
12213
+ }
12214
+ function resolvePaginationEffectiveMaxVisibleItems(opts) {
12215
+ const maxVisibleItems = normalizeCount(opts.maxVisibleItems, 0);
12216
+ if (maxVisibleItems <= 0) return 0;
12217
+ const siblingCount = normalizeCount(opts.siblingCount, 1);
12218
+ if (maxVisibleItems < 6 || siblingCount < 1) return maxVisibleItems;
12219
+ const pageCount = normalizeCount(opts.pageCount, 0);
12220
+ const boundaryCount = normalizeCount(opts.boundaryCount, 1);
12221
+ const muiMiddleRangeCount = boundaryCount * 2 + 5;
12222
+ return Math.min(pageCount, Math.max(maxVisibleItems, muiMiddleRangeCount));
12223
+ }
12224
+ function createFixedPaginationItems(opts) {
12225
+ const pageCount = normalizeCount(opts.pageCount, 0);
12226
+ if (pageCount <= 0) return [];
12227
+ const page = clampPaginationPage(opts.page, pageCount);
12228
+ const siblingCount = normalizeCount(opts.siblingCount, 1);
12229
+ const boundaryCount = normalizeCount(opts.boundaryCount, 1);
12230
+ const slotsWithoutEllipsis = boundaryCount * 2 + siblingCount * 2 + 1;
12231
+ const slotsWithEllipsis = slotsWithoutEllipsis + 2;
12232
+ if (pageCount <= slotsWithEllipsis) {
12233
+ return range(1, pageCount).map((pageNumber) => toPageItem(pageNumber, page));
12234
+ }
12235
+ const items = [];
12236
+ const startPages = range(1, Math.min(boundaryCount, pageCount));
12237
+ const endPages = range(Math.max(pageCount - boundaryCount + 1, boundaryCount + 1), pageCount);
12238
+ const leftSibling = Math.max(page - siblingCount, boundaryCount + 1);
12239
+ const rightSibling = Math.min(page + siblingCount, pageCount - boundaryCount);
12240
+ for (const pageNumber of startPages) items.push(toPageItem(pageNumber, page));
12241
+ if (leftSibling > boundaryCount + 1) {
12242
+ items.push({ type: "start-ellipsis", key: "ellipsis-start" });
12243
+ } else {
12244
+ for (const pageNumber of range(boundaryCount + 1, leftSibling - 1)) {
12245
+ items.push(toPageItem(pageNumber, page));
12246
+ }
12247
+ }
12248
+ for (const pageNumber of range(leftSibling, rightSibling)) {
12249
+ items.push(toPageItem(pageNumber, page));
12250
+ }
12251
+ if (rightSibling < pageCount - boundaryCount) {
12252
+ items.push({ type: "end-ellipsis", key: "ellipsis-end" });
12253
+ } else {
12254
+ for (const pageNumber of range(rightSibling + 1, pageCount - boundaryCount)) {
12255
+ items.push(toPageItem(pageNumber, page));
12256
+ }
12257
+ }
12258
+ for (const pageNumber of endPages) items.push(toPageItem(pageNumber, page));
12259
+ return items;
12260
+ }
12261
+ function createCompactPaginationItems(opts, maxVisibleItems) {
12262
+ const pageCount = normalizeCount(opts.pageCount, 0);
12263
+ const page = clampPaginationPage(opts.page, pageCount);
12264
+ if (pageCount <= 0 || maxVisibleItems <= 0) return [];
12265
+ if (maxVisibleItems === 1 || pageCount === 1) return [toPageItem(page, page)];
12266
+ if (maxVisibleItems === 2) {
12267
+ const edgePage = page === pageCount ? 1 : pageCount;
12268
+ return [page, edgePage].sort((a, b) => a - b).map((pageNumber) => toPageItem(pageNumber, page));
12269
+ }
12270
+ if (maxVisibleItems === 3) {
12271
+ return Array.from(/* @__PURE__ */ new Set([1, page, pageCount])).slice(0, maxVisibleItems).map((pageNumber) => toPageItem(pageNumber, page));
12272
+ }
12273
+ if (page <= 2) {
12274
+ return [
12275
+ toPageItem(1, page),
12276
+ toPageItem(2, page),
12277
+ { type: "end-ellipsis", key: "ellipsis-end" },
12278
+ toPageItem(pageCount, page)
12279
+ ];
12280
+ }
12281
+ if (page >= pageCount - 1) {
12282
+ return [
12283
+ toPageItem(1, page),
12284
+ { type: "start-ellipsis", key: "ellipsis-start" },
12285
+ toPageItem(pageCount - 1, page),
12286
+ toPageItem(pageCount, page)
12287
+ ];
12288
+ }
12289
+ return [
12290
+ toPageItem(1, page),
12291
+ { type: "start-ellipsis", key: "ellipsis-start" },
12292
+ toPageItem(page, page),
12293
+ toPageItem(pageCount, page)
12294
+ ];
12295
+ }
12296
+ function fillEdgePaginationItems(opts, maxVisibleItems, items) {
12297
+ const pageCount = normalizeCount(opts.pageCount, 0);
12298
+ const boundaryCount = normalizeCount(opts.boundaryCount, 1);
12299
+ const hasStartEllipsis = items.some((item) => item.type === "start-ellipsis");
12300
+ const hasEndEllipsis = items.some((item) => item.type === "end-ellipsis");
12301
+ if (items.length >= maxVisibleItems || pageCount <= maxVisibleItems) return items;
12302
+ if (hasStartEllipsis === hasEndEllipsis) return items;
12303
+ const page = clampPaginationPage(opts.page, pageCount);
12304
+ const edgePageCount = Math.max(boundaryCount + 1, maxVisibleItems - boundaryCount - 1);
12305
+ if (hasEndEllipsis) {
12306
+ const leadingPages = range(1, Math.min(edgePageCount, pageCount - boundaryCount - 1));
12307
+ return [
12308
+ ...leadingPages.map((pageNumber) => toPageItem(pageNumber, page)),
12309
+ { type: "end-ellipsis", key: "ellipsis-end" },
12310
+ ...range(Math.max(pageCount - boundaryCount + 1, edgePageCount + 1), pageCount).map(
12311
+ (pageNumber) => toPageItem(pageNumber, page)
12312
+ )
12313
+ ];
12314
+ }
12315
+ const trailingPages = range(Math.max(pageCount - edgePageCount + 1, boundaryCount + 2), pageCount);
12316
+ return [
12317
+ ...range(1, Math.min(boundaryCount, pageCount)).map(
12318
+ (pageNumber) => toPageItem(pageNumber, page)
12319
+ ),
12320
+ { type: "start-ellipsis", key: "ellipsis-start" },
12321
+ ...trailingPages.map((pageNumber) => toPageItem(pageNumber, page))
12322
+ ];
12323
+ }
12324
+ function createPaginationItems(opts) {
12325
+ const pageCount = normalizeCount(opts.pageCount, 0);
12326
+ const maxVisibleItems = resolvePaginationEffectiveMaxVisibleItems(opts);
12327
+ if (pageCount <= 0) return [];
12328
+ if (maxVisibleItems <= 0) return createFixedPaginationItems(opts);
12329
+ if (pageCount <= maxVisibleItems) return createFixedPaginationItems(opts);
12330
+ const siblingCount = normalizeCount(opts.siblingCount, 1);
12331
+ const boundaryCount = normalizeCount(opts.boundaryCount, 1);
12332
+ for (let nextBoundaryCount = boundaryCount; nextBoundaryCount >= 1; nextBoundaryCount -= 1) {
12333
+ for (let nextSiblingCount = siblingCount; nextSiblingCount >= 0; nextSiblingCount -= 1) {
12334
+ const items = createFixedPaginationItems({
12335
+ ...opts,
12336
+ boundaryCount: nextBoundaryCount,
12337
+ siblingCount: nextSiblingCount
12338
+ });
12339
+ if (items.length <= maxVisibleItems) {
12340
+ return fillEdgePaginationItems(opts, maxVisibleItems, items);
12341
+ }
12342
+ }
12343
+ }
12344
+ return createCompactPaginationItems(opts, maxVisibleItems);
12345
+ }
12346
+ function createPaginationRecipe(opts) {
12347
+ const reservedItemCount = resolvePaginationReservedItemCount(opts);
12348
+ const controlDisplay = opts.controlDisplay === "icon" ? "icon" : "label";
12349
+ return {
12350
+ tag: "nav",
12351
+ className: cx20(
12352
+ "mw-pagination",
12353
+ `mw-pagination--controls-${controlDisplay}`,
12354
+ opts.disabled && "mw-pagination--disabled"
12355
+ ),
12356
+ vars: reservedItemCount > 0 ? {
12357
+ "--mw-pagination-list-width": `calc(${reservedItemCount} * var(--mw-pagination-size) + ${Math.max(
12358
+ 0,
12359
+ reservedItemCount - 1
12360
+ )} * var(--mw-pagination-gap))`
12361
+ } : {},
12362
+ a11y: resolvePaginationA11y(opts),
12363
+ items: createPaginationItems(opts),
12364
+ reservedItemCount,
12365
+ controlDisplay,
12366
+ showPrevNext: opts.showPrevNext ?? true,
12367
+ showFirstLast: opts.showFirstLast ?? false
12368
+ };
12369
+ }
12370
+ function createPaginationListRecipe() {
12371
+ return {
12372
+ tag: "ul",
12373
+ className: "mw-pagination__list",
12374
+ vars: {},
12375
+ a11y: resolvePaginationListA11y()
12376
+ };
12377
+ }
12378
+ function createPaginationListItemRecipe() {
12379
+ return {
12380
+ tag: "li",
12381
+ className: "mw-pagination__list-item",
12382
+ vars: {}
12383
+ };
12384
+ }
12385
+ function createPaginationControlRecipe(opts) {
12386
+ return {
12387
+ tag: "button",
12388
+ className: cx20(
12389
+ "mw-pagination__control",
12390
+ `mw-pagination__control--${opts.direction}`,
12391
+ opts.disabled && "mw-pagination__control--disabled"
12392
+ ),
12393
+ vars: {},
12394
+ a11y: resolvePaginationControlA11y(opts)
12395
+ };
12396
+ }
12397
+ function createPaginationPageRecipe(opts) {
12398
+ return {
12399
+ tag: "button",
12400
+ className: cx20(
12401
+ "mw-pagination__page",
12402
+ opts.selected && "mw-pagination__page--selected",
12403
+ opts.disabled && "mw-pagination__page--disabled"
12404
+ ),
12405
+ vars: {},
12406
+ a11y: resolvePaginationPageA11y(opts)
12407
+ };
12408
+ }
12409
+ function createPaginationEllipsisRecipe() {
12410
+ return {
12411
+ tag: "span",
12412
+ className: "mw-pagination__ellipsis",
12413
+ vars: {},
12414
+ a11y: resolvePaginationEllipsisA11y()
12415
+ };
12416
+ }
12417
+
12418
+ // src/components/atoms/skip-link/skip-link-recipe.ts
12419
+ function cx21(...parts) {
12420
+ return parts.filter(Boolean).join(" ");
12421
+ }
12422
+ function createSkipLinkRecipe(opts) {
12423
+ return {
12424
+ tag: "a",
12425
+ className: cx21("mw-skip-link", opts.className)
12426
+ };
12427
+ }
12428
+
10980
12429
  // src/storybook/storybook-fixtures.ts
10981
12430
  var storybookLayout = {
10982
12431
  centered: { layout: "centered" },
@@ -10993,6 +12442,10 @@ var storybookA11yPolicy = {
10993
12442
  };
10994
12443
  var storybookIconNames = [...iconNames];
10995
12444
  var storybookOptionalIconNames = [void 0, ...storybookIconNames];
12445
+ var storybookButtonVariantArgType = {
12446
+ control: "select",
12447
+ options: ["primary", "secondary", "neutral", "text", "success", "danger"]
12448
+ };
10996
12449
  var storybookButtonIconArgTypes = {
10997
12450
  iconLeft: {
10998
12451
  control: "select",
@@ -11007,7 +12460,18 @@ var storybookButtonIconArgTypes = {
11007
12460
  }
11008
12461
  };
11009
12462
  var storybookButtonGeneralArgTypes = {
11010
- ...storybookButtonIconArgTypes
12463
+ ...storybookButtonIconArgTypes,
12464
+ variant: storybookButtonVariantArgType
12465
+ };
12466
+ var storybookIconButtonArgTypes = {
12467
+ icon: {
12468
+ control: "select",
12469
+ options: storybookIconNames
12470
+ },
12471
+ variant: storybookButtonVariantArgType,
12472
+ disabled: {
12473
+ control: "boolean"
12474
+ }
11011
12475
  };
11012
12476
  var storybookButtonPurposeArgTypes = {
11013
12477
  ...storybookButtonIconArgTypes
@@ -11086,6 +12550,27 @@ var storybookSkeletonArgTypes = {
11086
12550
  description: "Accessible label for standalone loading placeholder groups"
11087
12551
  }
11088
12552
  };
12553
+ var storybookProgressBarArgTypes = {
12554
+ label: { control: "text" },
12555
+ value: { control: { type: "number", min: -1e3, max: 1e3, step: 1 } },
12556
+ min: { control: { type: "number", min: -1e3, max: 1e3, step: 1 } },
12557
+ max: { control: { type: "number", min: -1e3, max: 1e3, step: 1 } },
12558
+ size: {
12559
+ control: "inline-radio",
12560
+ options: ["small", "default"],
12561
+ description: "Figma track size: small is 4px, default is 8px"
12562
+ },
12563
+ state: {
12564
+ control: "select",
12565
+ options: ["default", "hover", "pressed", "focus"],
12566
+ description: "Visual state for documentation and visual QA"
12567
+ },
12568
+ disabled: { control: "boolean" },
12569
+ showLabel: { control: "boolean" },
12570
+ showPercentage: { control: "boolean" },
12571
+ valueLabel: { control: "text" },
12572
+ ariaLabel: { control: "text" }
12573
+ };
11089
12574
  var storybookStatTileArgTypes = {
11090
12575
  tone: {
11091
12576
  control: "select",
@@ -11128,6 +12613,7 @@ var storybookSpacingArgTypes = {
11128
12613
  "sp-2",
11129
12614
  "sp-4",
11130
12615
  "sp-8",
12616
+ "sp-12",
11131
12617
  "sp-16",
11132
12618
  "sp-24",
11133
12619
  "sp-32",
@@ -11143,7 +12629,7 @@ var storybookSpacingArgTypes = {
11143
12629
  "sp-112",
11144
12630
  "sp-120"
11145
12631
  ],
11146
- description: "Size variant (sp-0=0 \u2026 sp-24=24 \u2026 sp-80=80 \u2026 sp-120=120px)"
12632
+ description: "Size variant (sp-0=0 \u2026 sp-12=12 \u2026 sp-24=24 \u2026 sp-120=120px)"
11147
12633
  },
11148
12634
  scale: {
11149
12635
  control: { type: "number", min: 1, max: 8, step: 0.5 },
@@ -11195,7 +12681,7 @@ var storybookSliderArgTypes = {
11195
12681
  };
11196
12682
  var storybookDocsDescription = {
11197
12683
  linkButton: "LinkButton locks navigation semantics, renders as an anchor, and keeps the canonical text treatment. Use Button for intentional visual deviations.",
11198
- destructiveButton: "DestructiveButton locks destructive semantics, uses the canonical primary + error treatment, and requires confirmation by default. Use Button for intentional exceptions.",
12684
+ destructiveButton: "DestructiveButton locks destructive semantics, uses the canonical danger treatment, and requires confirmation by default. Use Button for intentional exceptions.",
11199
12685
  submitButton: "SubmitButton locks form-submit semantics, always renders as a button, and keeps the canonical primary treatment.",
11200
12686
  saveButton: "SaveButton locks save semantics and the canonical primary treatment. Use Button if you need a different visual hierarchy.",
11201
12687
  confirmButton: "ConfirmButton locks affirmative confirmation semantics, always renders as a button, and keeps the canonical success treatment.",
@@ -11213,6 +12699,6 @@ var storybookDocsDescription = {
11213
12699
  colors: "Complete color palette from the design system. Semantic roles map to CSS variables, with label colors auto-derived by default and overrideable for brand-specific fills."
11214
12700
  };
11215
12701
 
11216
- export { AvatarSize, AvatarType, BadgeVariant, ButtonAction, ButtonSize, ButtonVariant, DENSITY_SCALES, IconName, SkeletonAnimation, SkeletonVariant, Spacings, SpinnerVariant, SpinnerVariants, SwitchSize, ThemeMode, accordionPurposeComponentReference, accordionWhyPurposeComponents, avatarPurposeSemantics, avatarPurposes, badgePurposeComponentReference, badgePurposeSemantics, badgePurposes, badgeWhyPurposeComponents, buildAccordionFieldA11yIds, buildCheckboxA11y, buildCheckboxFieldA11yIds, buildCheckboxGroupFieldA11yIds, buildCurrencyHelperText, buildGoogleFontsUrl, buildHeadingA11y, buildInputFieldA11yIds, buildRadioA11y, buildRadioGroupFieldA11yIds, buildRichTextFieldA11yIds, buildSliderFieldA11yIds, buildSwitchFieldA11yIds, buildTabGroupA11yIds, buttonActionSemanticPurposes, buttonPurposeSemantics, buttonPurposes, buttonVariantVisualStyles, buttonWhySemanticComponents, canonicalSemanticAttributeNames, canonicalSemanticAttributeRegistry, canonicalSemanticAttributes, cardPurposeComponentReference, cardWhyPurposeComponents, checkboxRecipe, createAccordionRecipe, createAvatarRecipe, createBadgeRecipe, createButtonRecipe, createCardRecipe, createDatePickerRecipe, createDialogRecipe, createDividerRecipe, createFamilySemanticAttributes, createFontStack, createIconRecipe, createInputOtpRecipe, createInputRecipe, createMarwesThemeScript, createMarwesThemeStyle, createPurposeSemanticAttributes, createRichTextRecipe, createSelectRecipe, createSkeletonRecipe, createSliderRecipe, createSpacingRecipe, createSpinnerRecipe, createStatTileRecipe, createSwitchRecipe, createTabRecipe, createTextareaRecipe, createToastRecipe, createTooltipRecipe, currencyCodes, darkThemeDefaults, densityToCSSVars, dialogPurposeComponentReference, dialogPurposeSemantics, dialogPurposes, dialogWhyPurposeComponents, emptySemanticAttributes, escapeRichTextHtml, extractFontFamilyName, extractUsedWeights, familySemanticsRegistry, fieldComparisonRows, fieldWhyPurposeComponents, filterUndefinedSemanticAttributes, getCurrencySymbol, headingRecipe, iconNames, iconNamesList, iconRegistry, iconSizeScale, iconStrokeWidthScale, isRichTextHtmlEmpty, isSystemFont, isThemeMode, isThemePreference, lightThemeDefaults, mergeIdRefs, mergeSemanticAttributes, moveTabSelection, mwAvailableFonts, mwFontFallbacks, mwGoogleFontFamilies, mwStyledTheme, mwThemeVarNames, mwThemeVars, mwVar, nextThemeMode, normalizeRichTextHtml, paragraphRecipe, purposeSemanticsRegistry, radioPurposeComponentReference, radioRecipe, radioWhyPurposeComponents, resolveAccordionA11y, resolveAvatarA11y, resolveBadgeA11y, resolveButtonLoading, resolveDatePickerDayLabel, resolveDialogA11y, resolveIconA11y, resolveIconSize, resolveIconStrokeWidth, resolveRichTextAllowedFormats, resolveSelectMode, resolveServerThemeMode, resolveSkeletonA11y, resolveSliderA11y, resolveSpinnerA11y, resolveSpinnerSize, resolveStatTileTrendLabel, resolveSwitchA11y, resolveTabA11y, resolveTabValue, resolveThemeInput, resolveThemePreference, resolveToastA11y, resolveTone, resolveTooltipA11y, richTextCommandByFormat, richTextFormattingReference, richTextWhyUseIt, sanitizeCurrencyValue, sanitizeInputOtpValue, semanticFamilies, semanticFrameworkSupport, semanticIntents, semanticLayers, semanticOrientations, semanticOutcomes, semanticPurposes, shouldLoadGoogleFont, skeletonAnimations, skeletonVariants, sliderPurposeComponentReference, sliderWhyPurposeComponents, spinnerSizeScale, spinnerSizes, spinnerVariants, storybookA11yPolicy, storybookButtonGeneralArgTypes, storybookButtonIconArgTypes, storybookButtonPurposeArgTypes, storybookCheckboxArgTypes, storybookDatePickerArgTypes, storybookDividerArgTypes, storybookDocsDescription, storybookIconGalleryArgTypes, storybookIconGalleryDefaults, storybookIconNames, storybookLayout, storybookOptionalIconNames, storybookRadioArgTypes, storybookSkeletonArgTypes, storybookSliderArgTypes, storybookSpacingArgTypes, storybookSpinnerArgTypes, storybookStatTileArgTypes, switchPurposeComponentReference, switchWhyPurposeComponents, tabPurposeComponentReference, tabWhyPurposeComponents, themeModesToCSSRules, themeToCSSRule, themeToCSSVars, toastPurposeComponentReference, toastPurposeSemantics, toastPurposes, toastWhyPurposeComponents, validateSemanticRegistry };
12702
+ export { AvatarSize, AvatarType, BadgeVariant, BannerVariant, ButtonAction, ButtonSize, ButtonVariant, DEFAULT_PROGRESS_BAR_LABEL, DEFAULT_PROGRESS_BAR_MAX, DEFAULT_PROGRESS_BAR_MIN, DENSITY_SCALES, IconName, ProgressBarSize, ProgressBarState, SkeletonAnimation, SkeletonVariant, Spacings, SpinnerVariant, SpinnerVariants, SwitchSize, TextVariant, ThemeMode, accordionPurposeComponentReference, accordionWhyPurposeComponents, avatarPurposeSemantics, avatarPurposes, badgePurposeComponentReference, badgePurposeSemantics, badgePurposes, badgeWhyPurposeComponents, bannerPurposeSemantics, bannerPurposes, buildAccordionFieldA11yIds, buildCheckboxA11y, buildCheckboxFieldA11yIds, buildCheckboxGroupFieldA11yIds, buildCurrencyHelperText, buildGoogleFontsUrl, buildHeadingA11y, buildInputFieldA11yIds, buildRadioA11y, buildRadioGroupFieldA11yIds, buildRichTextFieldA11yIds, buildSliderFieldA11yIds, buildSwitchFieldA11yIds, buildTabGroupA11yIds, buttonActionSemanticPurposes, buttonPurposeSemantics, buttonPurposes, buttonVariantVisualStyles, buttonWhySemanticComponents, canonicalSemanticAttributeNames, canonicalSemanticAttributeRegistry, canonicalSemanticAttributes, cardPurposeComponentReference, cardWhyPurposeComponents, checkboxRecipe, clampPaginationPage, clampProgressBarValue, createAccordionRecipe, createAvatarRecipe, createBadgeRecipe, createBannerRecipe, createBreadcrumbRecipe, createButtonRecipe, createCardRecipe, createContextMenuRecipe, createDatePickerRecipe, createDialogRecipe, createDividerRecipe, createDrawerRecipe, createFamilySemanticAttributes, createFontStack, createIconRecipe, createInputOtpRecipe, createInputRecipe, createMarwesThemeScript, createMarwesThemeStyle, createMwTheme, createMwThemeMedia, createPaginationControlRecipe, createPaginationEllipsisRecipe, createPaginationItems, createPaginationListItemRecipe, createPaginationListRecipe, createPaginationPageRecipe, createPaginationRecipe, createProgressBarRecipe, createPurposeSemanticAttributes, createRichTextRecipe, createSegmentedControlItemRecipe, createSegmentedControlRecipe, createSelectRecipe, createSkeletonRecipe, createSkipLinkRecipe, createSliderRecipe, createSpacingRecipe, createSpinnerRecipe, createStatTileRecipe, createSwitchRecipe, createTabRecipe, createTextareaRecipe, createToastRecipe, createTooltipRecipe, currencyCodes, darkThemeDefaults, defaultThemeBreakpoints, densityToCSSVars, dialogPurposeComponentReference, dialogPurposeSemantics, dialogPurposes, dialogWhyPurposeComponents, emptySemanticAttributes, escapeRichTextHtml, extractFontFamilyName, extractUsedWeights, familySemanticsRegistry, fieldComparisonRows, fieldWhyPurposeComponents, filterUndefinedSemanticAttributes, getCurrencySymbol, headingRecipe, iconNames, iconNamesList, iconRegistry, iconSizeScale, iconStrokeWidthScale, isRichTextHtmlEmpty, isSystemFont, isThemeMode, isThemePreference, lightThemeDefaults, mergeIdRefs, mergeSemanticAttributes, moveSegmentedControlSelection, moveTabSelection, mwAvailableFonts, mwFontFallbacks, mwGoogleFontFamilies, mwStyledTheme, mwTheme, mwThemeVarNames, mwThemeVars, mwVar, nextThemeMode, normalizeRichTextHtml, paragraphRecipe, progressBarSizes, progressBarStates, purposeSemanticsRegistry, radioPurposeComponentReference, radioRecipe, radioWhyPurposeComponents, resolveAccordionA11y, resolveAvatarA11y, resolveBadgeA11y, resolveBannerA11y, resolveBreadcrumbA11y, resolveBreadcrumbHomeA11y, resolveBreadcrumbItemA11y, resolveBreadcrumbListA11y, resolveBreadcrumbSeparatorA11y, resolveButtonLoading, resolveContextMenuA11y, resolveContextMenuDividerA11y, resolveContextMenuItemA11y, resolveDatePickerDayLabel, resolveDialogA11y, resolveDrawerA11y, resolveIconA11y, resolveIconSize, resolveIconStrokeWidth, resolvePaginationA11y, resolvePaginationAdaptiveMaxVisibleItems, resolvePaginationAdaptiveProfile, resolvePaginationControlA11y, resolvePaginationEllipsisA11y, resolvePaginationItemAriaLabel, resolvePaginationListA11y, resolvePaginationPageA11y, resolvePaginationReservedItemCount, resolveProgressBarA11y, resolveProgressBarBounds, resolveRichTextAllowedFormats, resolveSegmentedControlA11y, resolveSegmentedControlItemA11y, resolveSegmentedControlValue, resolveSelectMode, resolveServerThemeMode, resolveSkeletonA11y, resolveSliderA11y, resolveSpinnerA11y, resolveSpinnerSize, resolveStatTileTrendLabel, resolveSwitchA11y, resolveTabA11y, resolveTabValue, resolveThemeInput, resolveThemePreference, resolveToastA11y, resolveTone, resolveTooltipA11y, richTextCommandByFormat, richTextFormattingReference, richTextWhyUseIt, sanitizeCurrencyValue, sanitizeInputOtpValue, semanticFamilies, semanticFrameworkSupport, semanticIntents, semanticLayers, semanticOrientations, semanticOutcomes, semanticPurposes, shouldLoadGoogleFont, skeletonAnimations, skeletonVariants, sliderPurposeComponentReference, sliderWhyPurposeComponents, spinnerSizeScale, spinnerSizes, spinnerVariants, storybookA11yPolicy, storybookButtonGeneralArgTypes, storybookButtonIconArgTypes, storybookButtonPurposeArgTypes, storybookCheckboxArgTypes, storybookDatePickerArgTypes, storybookDividerArgTypes, storybookDocsDescription, storybookIconButtonArgTypes, storybookIconGalleryArgTypes, storybookIconGalleryDefaults, storybookIconNames, storybookLayout, storybookOptionalIconNames, storybookProgressBarArgTypes, storybookRadioArgTypes, storybookSkeletonArgTypes, storybookSliderArgTypes, storybookSpacingArgTypes, storybookSpinnerArgTypes, storybookStatTileArgTypes, switchPurposeComponentReference, switchWhyPurposeComponents, tabPurposeComponentReference, tabWhyPurposeComponents, textRecipe, themeModesToCSSRules, themeToCSSRule, themeToCSSVars, toastPurposeComponentReference, toastPurposeSemantics, toastPurposes, toastWhyPurposeComponents, validateSemanticRegistry };
11217
12703
  //# sourceMappingURL=index.js.map
11218
12704
  //# sourceMappingURL=index.js.map