basalt-ui 1.19.1 → 1.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/AGENTS.md +19 -1
  2. package/CHANGELOG.md +39 -0
  3. package/MIGRATING.md +326 -0
  4. package/README.md +87 -9
  5. package/agent/rules/basalt-app.md +84 -0
  6. package/agent/rules/basalt-charts.md +32 -17
  7. package/agent/rules/basalt-content.md +4 -0
  8. package/agent/rules/basalt-mantine.md +25 -10
  9. package/agent/rules/basalt-router.md +79 -15
  10. package/agent/rules/basalt-state.md +21 -3
  11. package/agent/rules/basalt-tokens.md +132 -6
  12. package/agent/skills/basalt-app/SKILL.md +45 -6
  13. package/agent/skills/basalt-charts/SKILL.md +5 -3
  14. package/agent/templates/CLAUDE-block.md.tpl +11 -5
  15. package/configs/check.yml +11 -4
  16. package/configs/lefthook.yml +59 -7
  17. package/configs/oxlint-plugin.js +633 -30
  18. package/configs/oxlint-plugin.test.ts +594 -15
  19. package/configs/oxlint.json +10 -1
  20. package/dist/agent/stick-to-bottom.js +1 -1
  21. package/dist/agent-chat/thread-detail-panel.js +1 -1
  22. package/dist/agent-chat/thread-message.js +2 -2
  23. package/dist/agent-chat/tool-chip.js +1 -1
  24. package/dist/charts/kinds/Bars.d.ts +1 -1
  25. package/dist/charts/kinds/Bars.d.ts.map +1 -1
  26. package/dist/charts/kinds/Donut.d.ts +1 -1
  27. package/dist/charts/kinds/Donut.d.ts.map +1 -1
  28. package/dist/charts/kinds/Donut.js +1 -1
  29. package/dist/charts/kinds/DualPanel.d.ts +1 -1
  30. package/dist/charts/kinds/DualPanel.d.ts.map +1 -1
  31. package/dist/charts/kinds/Heatmap.d.ts +1 -1
  32. package/dist/charts/kinds/Heatmap.d.ts.map +1 -1
  33. package/dist/charts/kinds/MultiLine.d.ts +1 -1
  34. package/dist/charts/kinds/MultiLine.d.ts.map +1 -1
  35. package/dist/charts/kinds/StackedArea.d.ts +1 -1
  36. package/dist/charts/kinds/StackedArea.d.ts.map +1 -1
  37. package/dist/charts/kinds/ZonedLine.d.ts +1 -1
  38. package/dist/charts/kinds/ZonedLine.d.ts.map +1 -1
  39. package/dist/charts/primitives/ChartLegend.js +2 -2
  40. package/dist/charts/primitives/ChartTooltip.js +1 -1
  41. package/dist/cli/index.d.ts +146 -20
  42. package/dist/cli/index.d.ts.map +1 -1
  43. package/dist/cli/index.js +901 -101
  44. package/dist/cli/toolchain-wiring.test.d.ts +2 -0
  45. package/dist/cli/toolchain-wiring.test.d.ts.map +1 -0
  46. package/dist/cli/waiver-audit.test.d.ts +2 -0
  47. package/dist/cli/waiver-audit.test.d.ts.map +1 -0
  48. package/dist/dashboard/delta-badge.js +2 -2
  49. package/dist/dashboard/stat-card.js +1 -1
  50. package/dist/data/virtual-list.js +5 -5
  51. package/dist/guard/index.d.ts +101 -2
  52. package/dist/guard/index.d.ts.map +1 -1
  53. package/dist/guard/index.js +474 -62
  54. package/dist/guard/types.d.ts +25 -5
  55. package/dist/guard/types.d.ts.map +1 -1
  56. package/dist/register.d.ts +25 -0
  57. package/dist/register.d.ts.map +1 -1
  58. package/dist/router-tanstack/multi-search-param-store.d.ts +13 -0
  59. package/dist/router-tanstack/multi-search-param-store.d.ts.map +1 -1
  60. package/dist/router-tanstack/multi-search-param-store.js +4 -1
  61. package/dist/router-tanstack/search-param-store.d.ts +29 -5
  62. package/dist/router-tanstack/search-param-store.d.ts.map +1 -1
  63. package/dist/router-tanstack/search-param-store.js +31 -3
  64. package/dist/router-tanstack/search-param-store.test.d.ts +2 -0
  65. package/dist/router-tanstack/search-param-store.test.d.ts.map +1 -0
  66. package/dist/shell/app-mobile-nav.module.css +11 -3
  67. package/dist/shell/index.d.ts +12 -5
  68. package/dist/shell/index.d.ts.map +1 -1
  69. package/dist/shell/index.js +24 -6
  70. package/dist/surfaces.d.ts +1 -1
  71. package/dist/surfaces.js +1 -1
  72. package/dist/tokens/index.d.ts +5 -3
  73. package/dist/tokens/index.d.ts.map +1 -1
  74. package/dist/tokens/index.js +7 -1
  75. package/dist/tokens/palette.d.ts +35 -27
  76. package/dist/tokens/palette.d.ts.map +1 -1
  77. package/dist/tokens/palette.js +24 -18
  78. package/dist/tokens/text-scale.test.d.ts +2 -0
  79. package/dist/tokens/text-scale.test.d.ts.map +1 -0
  80. package/dist/tokens.css +21 -17
  81. package/dist/vite-color-mix.js +2 -2
  82. package/dist/vite.d.ts +24 -2
  83. package/dist/vite.d.ts.map +1 -1
  84. package/dist/vite.js +54 -13
  85. package/llms.txt +3 -3
  86. package/package.json +4 -3
  87. package/src/agent/stick-to-bottom.tsx +1 -1
  88. package/src/agent-chat/thread-detail-panel.tsx +1 -1
  89. package/src/agent-chat/thread-message.tsx +3 -3
  90. package/src/agent-chat/tool-chip.tsx +1 -1
  91. package/src/charts/kinds/Bars.tsx +1 -1
  92. package/src/charts/kinds/Donut.tsx +3 -2
  93. package/src/charts/kinds/DualPanel.tsx +2 -2
  94. package/src/charts/kinds/Heatmap.tsx +1 -1
  95. package/src/charts/kinds/MultiLine.tsx +1 -1
  96. package/src/charts/kinds/StackedArea.tsx +1 -1
  97. package/src/charts/kinds/ZonedLine.tsx +1 -1
  98. package/src/charts/primitives/ChartLegend.tsx +2 -2
  99. package/src/charts/primitives/ChartTooltip.tsx +1 -1
  100. package/src/cli/index.ts +1614 -164
  101. package/src/cli/init-sync.test.ts +21 -3
  102. package/src/cli/template-ledger.test.ts +1 -1
  103. package/src/cli/tokens-css.test.ts +27 -14
  104. package/src/cli/toolchain-wiring.test.ts +856 -0
  105. package/src/cli/waiver-audit.test.ts +131 -0
  106. package/src/dashboard/delta-badge.tsx +3 -3
  107. package/src/dashboard/stat-card.tsx +1 -1
  108. package/src/data/virtual-list.tsx +8 -8
  109. package/src/guard/check-source.test.ts +1104 -12
  110. package/src/guard/index.ts +1106 -103
  111. package/src/guard/types.ts +29 -4
  112. package/src/register.ts +32 -0
  113. package/src/router-tanstack/multi-search-param-store.ts +16 -1
  114. package/src/router-tanstack/search-param-store.test.ts +135 -0
  115. package/src/router-tanstack/search-param-store.ts +90 -8
  116. package/src/shell/app-mobile-nav.module.css +11 -3
  117. package/src/shell/app-mobile-nav.tsx +1 -1
  118. package/src/shell/index.test.tsx +52 -0
  119. package/src/shell/index.tsx +64 -13
  120. package/src/surfaces.ts +1 -1
  121. package/src/theme/density-relations.test.ts +8 -5
  122. package/src/theme/spacing.test.ts +2 -0
  123. package/src/theme-toggle/index.tsx +2 -2
  124. package/src/tokens/index.ts +28 -3
  125. package/src/tokens/palette.ts +24 -18
  126. package/src/tokens/text-scale.test.ts +51 -0
  127. package/src/vite-color-mix.ts +2 -2
  128. package/src/vite.test.ts +125 -6
  129. package/src/vite.ts +148 -20
@@ -77,12 +77,12 @@ export declare const p: (fam: readonly string[], light?: number, dark?: number)
77
77
  */
78
78
  export declare const SHADOW: {
79
79
  readonly card: {
80
- readonly light: "0 1px 2px rgba(28,25,23,0.05), 0 0 0 1px var(--vx-surface-hairline)";
81
- readonly dark: "0 1px 3px rgba(0,0,0,0.4), inset 0 0 0 1px color-mix(in srgb, #ffffff 4%, transparent)";
80
+ readonly light: "0 1px 2px rgba(28, 25, 23, 0.05), 0 0 0 1px var(--vx-surface-hairline)";
81
+ readonly dark: "0 1px 3px rgba(0, 0, 0, 0.4), inset 0 0 0 1px color-mix(in srgb, #ffffff 4%, transparent)";
82
82
  };
83
83
  readonly ctrl: {
84
- readonly light: "0 1px 2px rgba(28,25,23,0.12)";
85
- readonly dark: "0 1px 2px rgba(0,0,0,0.35)";
84
+ readonly light: "0 1px 2px rgba(28, 25, 23, 0.12)";
85
+ readonly dark: "0 1px 2px rgba(0, 0, 0, 0.35)";
86
86
  };
87
87
  /**
88
88
  * Interactive-control depth — the ONE value every raised Button/ActionIcon/Input variant shares
@@ -112,12 +112,12 @@ export declare const SHADOW: {
112
112
  * ever needs more, raise the DROP. Do not reintroduce an edge; both shapes have been tried.
113
113
  */
114
114
  readonly raised: {
115
- readonly light: "0 1px 2px rgba(28,25,23,0.10)";
116
- readonly dark: "0 1px 2px rgba(0,0,0,0.35), inset 0 0 0 1px color-mix(in srgb, #ffffff 8%, transparent)";
115
+ readonly light: "0 1px 2px rgba(28, 25, 23, 0.1)";
116
+ readonly dark: "0 1px 2px rgba(0, 0, 0, 0.35), inset 0 0 0 1px color-mix(in srgb, #ffffff 8%, transparent)";
117
117
  };
118
118
  readonly overlay: {
119
- readonly light: "0 8px 24px rgba(28,25,23,0.10)";
120
- readonly dark: "0 8px 24px rgba(0,0,0,0.5)";
119
+ readonly light: "0 8px 24px rgba(28, 25, 23, 0.1)";
120
+ readonly dark: "0 8px 24px rgba(0, 0, 0, 0.5)";
121
121
  };
122
122
  };
123
123
  /**
@@ -499,8 +499,14 @@ declare const SPACE_STEP_BASE: {
499
499
  * `env(safe-area-inset-bottom)` to it. JS-consumed (AppShell `footer.height`), no `--vx-*` var,
500
500
  * same shape as `appShellHeaderHeight`. Floored at 48px in `deriveSpacing`. */
501
501
  readonly mobileNavBarHeight: 56;
502
- /** Slot icon box. */
502
+ /** Slot icon box. Also the MIN box of the icon slot itself, so the active pill keeps its shape
503
+ * when a destination ships no icon (an icon-less consumer is a supported configuration). */
503
504
  readonly mobileNavIconSize: 24;
505
+ /** Active-pill inset around the slot icon, vertical. Sub-scale on its own, but it is one half of
506
+ * a pair with `mobileNavTabInsetX` — a step keeps the pill's shape tracking density. */
507
+ readonly mobileNavTabInsetY: 2;
508
+ /** Active-pill inset around the slot icon, horizontal. */
509
+ readonly mobileNavTabInsetX: 12;
504
510
  /** Menu/sheet row height. Floored at 44px in `deriveSpacing` (Apple HIG 44pt / WCAG 2.5.5 AAA). */
505
511
  readonly mobileNavRowHeight: 44;
506
512
  /** More/group `<Menu width={…}>`. JS-consumed, no var — same rationale as
@@ -883,6 +889,8 @@ export declare const SPACE_STEP: {
883
889
  readonly mobileNavTabGap: number;
884
890
  readonly mobileNavBarHeight: number;
885
891
  readonly mobileNavIconSize: number;
892
+ readonly mobileNavTabInsetY: number;
893
+ readonly mobileNavTabInsetX: number;
886
894
  readonly mobileNavRowHeight: number;
887
895
  readonly mobileNavMenuWidth: number;
888
896
  readonly chartLegendGap: number;
@@ -971,19 +979,19 @@ declare function buildPaletteDataUncached(config: DeriveConfig): {
971
979
  };
972
980
  readonly axis: {
973
981
  readonly light: string;
974
- readonly dark: "rgba(255,255,255,0.6)";
982
+ readonly dark: "rgba(255, 255, 255, 0.6)";
975
983
  };
976
984
  readonly axisStroke: {
977
985
  readonly light: string;
978
- readonly dark: "rgba(255,255,255,0.12)";
986
+ readonly dark: "rgba(255, 255, 255, 0.12)";
979
987
  };
980
988
  readonly grid: {
981
989
  readonly light: string;
982
- readonly dark: "rgba(255,255,255,0.06)";
990
+ readonly dark: "rgba(255, 255, 255, 0.06)";
983
991
  };
984
992
  readonly crosshair: {
985
993
  readonly light: string;
986
- readonly dark: "rgba(255,255,255,0.42)";
994
+ readonly dark: "rgba(255, 255, 255, 0.42)";
987
995
  };
988
996
  readonly dotStroke: {
989
997
  readonly light: "#ffffff";
@@ -991,15 +999,15 @@ declare function buildPaletteDataUncached(config: DeriveConfig): {
991
999
  };
992
1000
  readonly tooltipBg: {
993
1001
  readonly light: "#ffffff";
994
- readonly dark: "rgba(39,39,42,0.96)";
1002
+ readonly dark: "rgba(39, 39, 42, 0.96)";
995
1003
  };
996
1004
  readonly tooltipText: {
997
1005
  readonly light: string;
998
- readonly dark: "rgba(255,255,255,0.88)";
1006
+ readonly dark: "rgba(255, 255, 255, 0.88)";
999
1007
  };
1000
1008
  readonly tooltipMuted: {
1001
1009
  readonly light: string;
1002
- readonly dark: "rgba(255,255,255,0.5)";
1010
+ readonly dark: "rgba(255, 255, 255, 0.5)";
1003
1011
  };
1004
1012
  readonly tooltipBorder: {
1005
1013
  readonly light: "1px solid #e4e4e7";
@@ -1007,11 +1015,11 @@ declare function buildPaletteDataUncached(config: DeriveConfig): {
1007
1015
  };
1008
1016
  readonly tooltipShadow: {
1009
1017
  readonly light: `0 2px 8px ${string}`;
1010
- readonly dark: "0 2px 8px rgba(0,0,0,0.35)";
1018
+ readonly dark: "0 2px 8px rgba(0, 0, 0, 0.35)";
1011
1019
  };
1012
1020
  readonly legendText: {
1013
1021
  readonly light: string;
1014
- readonly dark: "rgba(255,255,255,0.92)";
1022
+ readonly dark: "rgba(255, 255, 255, 0.92)";
1015
1023
  };
1016
1024
  readonly neutral: ColorPair;
1017
1025
  };
@@ -1072,19 +1080,19 @@ export declare const NEUTRAL: {
1072
1080
  };
1073
1081
  readonly axis: {
1074
1082
  readonly light: string;
1075
- readonly dark: "rgba(255,255,255,0.6)";
1083
+ readonly dark: "rgba(255, 255, 255, 0.6)";
1076
1084
  };
1077
1085
  readonly axisStroke: {
1078
1086
  readonly light: string;
1079
- readonly dark: "rgba(255,255,255,0.12)";
1087
+ readonly dark: "rgba(255, 255, 255, 0.12)";
1080
1088
  };
1081
1089
  readonly grid: {
1082
1090
  readonly light: string;
1083
- readonly dark: "rgba(255,255,255,0.06)";
1091
+ readonly dark: "rgba(255, 255, 255, 0.06)";
1084
1092
  };
1085
1093
  readonly crosshair: {
1086
1094
  readonly light: string;
1087
- readonly dark: "rgba(255,255,255,0.42)";
1095
+ readonly dark: "rgba(255, 255, 255, 0.42)";
1088
1096
  };
1089
1097
  readonly dotStroke: {
1090
1098
  readonly light: "#ffffff";
@@ -1092,15 +1100,15 @@ export declare const NEUTRAL: {
1092
1100
  };
1093
1101
  readonly tooltipBg: {
1094
1102
  readonly light: "#ffffff";
1095
- readonly dark: "rgba(39,39,42,0.96)";
1103
+ readonly dark: "rgba(39, 39, 42, 0.96)";
1096
1104
  };
1097
1105
  readonly tooltipText: {
1098
1106
  readonly light: string;
1099
- readonly dark: "rgba(255,255,255,0.88)";
1107
+ readonly dark: "rgba(255, 255, 255, 0.88)";
1100
1108
  };
1101
1109
  readonly tooltipMuted: {
1102
1110
  readonly light: string;
1103
- readonly dark: "rgba(255,255,255,0.5)";
1111
+ readonly dark: "rgba(255, 255, 255, 0.5)";
1104
1112
  };
1105
1113
  readonly tooltipBorder: {
1106
1114
  readonly light: "1px solid #e4e4e7";
@@ -1108,11 +1116,11 @@ export declare const NEUTRAL: {
1108
1116
  };
1109
1117
  readonly tooltipShadow: {
1110
1118
  readonly light: `0 2px 8px ${string}`;
1111
- readonly dark: "0 2px 8px rgba(0,0,0,0.35)";
1119
+ readonly dark: "0 2px 8px rgba(0, 0, 0, 0.35)";
1112
1120
  };
1113
1121
  readonly legendText: {
1114
1122
  readonly light: string;
1115
- readonly dark: "rgba(255,255,255,0.92)";
1123
+ readonly dark: "rgba(255, 255, 255, 0.92)";
1116
1124
  };
1117
1125
  readonly neutral: ColorPair;
1118
1126
  };
@@ -1 +1 @@
1
- {"version":3,"file":"palette.d.ts","sourceRoot":"","sources":["../../src/tokens/palette.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"palette.d.ts","sourceRoot":"","sources":["../../src/tokens/palette.ts"],"names":[],"mappings":"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"}
@@ -37,12 +37,12 @@ const p = (fam, light = 2, dark = 3) => ({
37
37
  });
38
38
  const SHADOW = {
39
39
  card: {
40
- light: "0 1px 2px rgba(28,25,23,0.05), 0 0 0 1px var(--vx-surface-hairline)",
41
- dark: "0 1px 3px rgba(0,0,0,0.4), inset 0 0 0 1px color-mix(in srgb, #ffffff 4%, transparent)"
40
+ light: "0 1px 2px rgba(28, 25, 23, 0.05), 0 0 0 1px var(--vx-surface-hairline)",
41
+ dark: "0 1px 3px rgba(0, 0, 0, 0.4), inset 0 0 0 1px color-mix(in srgb, #ffffff 4%, transparent)"
42
42
  },
43
43
  ctrl: {
44
- light: "0 1px 2px rgba(28,25,23,0.12)",
45
- dark: "0 1px 2px rgba(0,0,0,0.35)"
44
+ light: "0 1px 2px rgba(28, 25, 23, 0.12)",
45
+ dark: "0 1px 2px rgba(0, 0, 0, 0.35)"
46
46
  },
47
47
  /**
48
48
  * Interactive-control depth — the ONE value every raised Button/ActionIcon/Input variant shares
@@ -72,16 +72,16 @@ const SHADOW = {
72
72
  * ever needs more, raise the DROP. Do not reintroduce an edge; both shapes have been tried.
73
73
  */
74
74
  raised: {
75
- light: "0 1px 2px rgba(28,25,23,0.10)",
76
- dark: "0 1px 2px rgba(0,0,0,0.35), inset 0 0 0 1px color-mix(in srgb, #ffffff 8%, transparent)"
75
+ light: "0 1px 2px rgba(28, 25, 23, 0.1)",
76
+ dark: "0 1px 2px rgba(0, 0, 0, 0.35), inset 0 0 0 1px color-mix(in srgb, #ffffff 8%, transparent)"
77
77
  },
78
78
  // Floating-layer elevation (menus, popovers, tooltips, modals, drawers) — a REAL drop shadow, a
79
79
  // step above `card`, so detached surfaces read as lifted off the page (`docs/DESIGN-SPEC.md` §5).
80
80
  // Unlike `card`, no embedded ring: floating surfaces carry a real 1px `--vx-surface-border` so
81
81
  // Mantine's rotated-square arrow inherits a proper edge.
82
82
  overlay: {
83
- light: "0 8px 24px rgba(28,25,23,0.10)",
84
- dark: "0 8px 24px rgba(0,0,0,0.5)"
83
+ light: "0 8px 24px rgba(28, 25, 23, 0.1)",
84
+ dark: "0 8px 24px rgba(0, 0, 0, 0.5)"
85
85
  }
86
86
  };
87
87
  function clampRadius(n) {
@@ -414,8 +414,14 @@ const SPACE_STEP_BASE = {
414
414
  * `env(safe-area-inset-bottom)` to it. JS-consumed (AppShell `footer.height`), no `--vx-*` var,
415
415
  * same shape as `appShellHeaderHeight`. Floored at 48px in `deriveSpacing`. */
416
416
  mobileNavBarHeight: 56,
417
- /** Slot icon box. */
417
+ /** Slot icon box. Also the MIN box of the icon slot itself, so the active pill keeps its shape
418
+ * when a destination ships no icon (an icon-less consumer is a supported configuration). */
418
419
  mobileNavIconSize: 24,
420
+ /** Active-pill inset around the slot icon, vertical. Sub-scale on its own, but it is one half of
421
+ * a pair with `mobileNavTabInsetX` — a step keeps the pill's shape tracking density. */
422
+ mobileNavTabInsetY: 2,
423
+ /** Active-pill inset around the slot icon, horizontal. */
424
+ mobileNavTabInsetX: 12,
419
425
  /** Menu/sheet row height. Floored at 44px in `deriveSpacing` (Apple HIG 44pt / WCAG 2.5.5 AAA). */
420
426
  mobileNavRowHeight: 44,
421
427
  /** More/group `<Menu width={…}>`. JS-consumed, no var — same rationale as
@@ -582,23 +588,23 @@ function buildPaletteDataUncached(config) {
582
588
  // primary line
583
589
  line2: { light: BP.gray[1], dark: BP.gray[2] },
584
590
  // secondary line
585
- axis: { light: inkRgba(inkLight, 0.6), dark: "rgba(255,255,255,0.6)" },
586
- axisStroke: { light: inkRgba(inkLight, 0.12), dark: "rgba(255,255,255,0.12)" },
587
- grid: { light: inkRgba(inkLight, 0.07), dark: "rgba(255,255,255,0.06)" },
588
- crosshair: { light: inkRgba(inkLight, 0.32), dark: "rgba(255,255,255,0.42)" },
591
+ axis: { light: inkRgba(inkLight, 0.6), dark: "rgba(255, 255, 255, 0.6)" },
592
+ axisStroke: { light: inkRgba(inkLight, 0.12), dark: "rgba(255, 255, 255, 0.12)" },
593
+ grid: { light: inkRgba(inkLight, 0.07), dark: "rgba(255, 255, 255, 0.06)" },
594
+ crosshair: { light: inkRgba(inkLight, 0.32), dark: "rgba(255, 255, 255, 0.42)" },
589
595
  dotStroke: { light: BP.white, dark: BP.darkGray[1] },
590
596
  // matches chart-area bg
591
- tooltipBg: { light: BP.white, dark: "rgba(39,39,42,0.96)" },
592
- tooltipText: { light: inkRgba(inkLight, 0.88), dark: "rgba(255,255,255,0.88)" },
593
- tooltipMuted: { light: inkRgba(inkLight, 0.5), dark: "rgba(255,255,255,0.5)" },
597
+ tooltipBg: { light: BP.white, dark: "rgba(39, 39, 42, 0.96)" },
598
+ tooltipText: { light: inkRgba(inkLight, 0.88), dark: "rgba(255, 255, 255, 0.88)" },
599
+ tooltipMuted: { light: inkRgba(inkLight, 0.5), dark: "rgba(255, 255, 255, 0.5)" },
594
600
  tooltipBorder: { light: `1px solid ${BP.lightGray[1]}`, dark: "none" },
595
601
  tooltipShadow: {
596
602
  light: `0 2px 8px ${inkRgba(inkLight, 0.1)}`,
597
- dark: "0 2px 8px rgba(0,0,0,0.35)"
603
+ dark: "0 2px 8px rgba(0, 0, 0, 0.35)"
598
604
  },
599
605
  // Chart legend text — same DERIVED-ink treatment as axis/grid/tooltip* above (light keys off
600
606
  // `inkLight`; dark stays flat white like every other neutral chart-chrome pair here).
601
- legendText: { light: inkRgba(inkLight, 0.82), dark: "rgba(255,255,255,0.92)" },
607
+ legendText: { light: inkRgba(inkLight, 0.82), dark: "rgba(255, 255, 255, 0.92)" },
602
608
  // Base neutral for hairlines / muted / DIMMED text / overlays — apply opacity via alpha().
603
609
  // Binds to --mantine-color-dimmed, so it is THE dimmed-text lever. Equal to `INK.muted` (the
604
610
  // spec's "muted (secondary text)" row) — kept as its own pair for the pre-existing `--vx-neutral`
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=text-scale.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-scale.test.d.ts","sourceRoot":"","sources":["../../src/tokens/text-scale.test.ts"],"names":[],"mappings":""}
package/dist/tokens.css CHANGED
@@ -96,6 +96,8 @@
96
96
  --vx-space-app-header-mobile-actions-height: 52px;
97
97
  --vx-space-mobile-nav-tab-gap: 3px;
98
98
  --vx-space-mobile-nav-icon-size: 24px;
99
+ --vx-space-mobile-nav-tab-inset-y: 2px;
100
+ --vx-space-mobile-nav-tab-inset-x: 12px;
99
101
  --vx-space-mobile-nav-row-height: 44px;
100
102
  --vx-space-agent-rail-inset-x: 10px;
101
103
  --vx-space-agent-part-gap-top: 6px;
@@ -136,6 +138,7 @@
136
138
  --vx-fill-hover-lime: color-mix(in srgb, var(--vx-fill-lime) 88%, #000);
137
139
  --vx-fill-hover-yellow: color-mix(in srgb, var(--vx-fill-yellow) 88%, #000);
138
140
  --vx-fill-hover-orange: color-mix(in srgb, var(--vx-fill-orange) 88%, #000);
141
+ --vx-text-nano: 10px;
139
142
  --vx-text-micro: 11px;
140
143
  --vx-text-xs: 12.5px;
141
144
  --vx-text-sm: 13.5px;
@@ -145,6 +148,7 @@
145
148
  --vx-text-h2: 21px;
146
149
  --vx-text-kpi: 24px;
147
150
  --vx-text-h1: 26px;
151
+ --vx-text-display: 30px;
148
152
  --vx-area-top: 22%;
149
153
  --vx-area-bottom: 1%;
150
154
  --vx-good: color-mix(in srgb, var(--vx-good-solid) 18%, transparent);
@@ -185,17 +189,17 @@ html[data-mantine-color-scheme='dark'] {
185
189
  --vx-neutral: #d4d4d8;
186
190
  --vx-line: #e4e4e7;
187
191
  --vx-line2: #a1a1aa;
188
- --vx-axis: rgba(255,255,255,0.6);
189
- --vx-axis-stroke: rgba(255,255,255,0.12);
190
- --vx-grid: rgba(255,255,255,0.06);
191
- --vx-crosshair: rgba(255,255,255,0.42);
192
+ --vx-axis: rgba(255, 255, 255, 0.6);
193
+ --vx-axis-stroke: rgba(255, 255, 255, 0.12);
194
+ --vx-grid: rgba(255, 255, 255, 0.06);
195
+ --vx-crosshair: rgba(255, 255, 255, 0.42);
192
196
  --vx-dot-stroke: #27272a;
193
- --vx-tooltip-bg: rgba(39,39,42,0.96);
194
- --vx-tooltip-text: rgba(255,255,255,0.88);
195
- --vx-tooltip-muted: rgba(255,255,255,0.5);
197
+ --vx-tooltip-bg: rgba(39, 39, 42, 0.96);
198
+ --vx-tooltip-text: rgba(255, 255, 255, 0.88);
199
+ --vx-tooltip-muted: rgba(255, 255, 255, 0.5);
196
200
  --vx-tooltip-border: none;
197
- --vx-tooltip-shadow: 0 2px 8px rgba(0,0,0,0.35);
198
- --vx-legend-text: rgba(255,255,255,0.92);
201
+ --vx-tooltip-shadow: 0 2px 8px rgba(0, 0, 0, 0.35);
202
+ --vx-legend-text: rgba(255, 255, 255, 0.92);
199
203
  --vx-ink: #e5e5e9;
200
204
  --vx-ink2: #dddde1;
201
205
  --vx-muted: #d4d4d8;
@@ -206,10 +210,10 @@ html[data-mantine-color-scheme='dark'] {
206
210
  --vx-accent-fill-hover: #3c6895;
207
211
  --vx-on-accent: #ffffff;
208
212
  --vx-divider: color-mix(in srgb, #ffffff 6%, transparent);
209
- --vx-shadow-card: 0 1px 3px rgba(0,0,0,0.4), inset 0 0 0 1px color-mix(in srgb, #ffffff 4%, transparent);
210
- --vx-shadow-ctrl: 0 1px 2px rgba(0,0,0,0.35);
211
- --vx-shadow-raised: 0 1px 2px rgba(0,0,0,0.35), inset 0 0 0 1px color-mix(in srgb, #ffffff 8%, transparent);
212
- --vx-shadow-overlay: 0 8px 24px rgba(0,0,0,0.5);
213
+ --vx-shadow-card: 0 1px 3px rgba(0, 0, 0, 0.4), inset 0 0 0 1px color-mix(in srgb, #ffffff 4%, transparent);
214
+ --vx-shadow-ctrl: 0 1px 2px rgba(0, 0, 0, 0.35);
215
+ --vx-shadow-raised: 0 1px 2px rgba(0, 0, 0, 0.35), inset 0 0 0 1px color-mix(in srgb, #ffffff 8%, transparent);
216
+ --vx-shadow-overlay: 0 8px 24px rgba(0, 0, 0, 0.5);
213
217
  --vx-surface-bg: #27272a;
214
218
  --vx-surface-panel: #2b2b2e;
215
219
  --vx-surface-panel-hover: #38383b;
@@ -270,10 +274,10 @@ html[data-mantine-color-scheme='light'] {
270
274
  --vx-accent-fill-hover: #3c6895;
271
275
  --vx-on-accent: #ffffff;
272
276
  --vx-divider: color-mix(in srgb, #e5e5e5 65%, transparent);
273
- --vx-shadow-card: 0 1px 2px rgba(28,25,23,0.05), 0 0 0 1px var(--vx-surface-hairline);
274
- --vx-shadow-ctrl: 0 1px 2px rgba(28,25,23,0.12);
275
- --vx-shadow-raised: 0 1px 2px rgba(28,25,23,0.10);
276
- --vx-shadow-overlay: 0 8px 24px rgba(28,25,23,0.10);
277
+ --vx-shadow-card: 0 1px 2px rgba(28, 25, 23, 0.05), 0 0 0 1px var(--vx-surface-hairline);
278
+ --vx-shadow-ctrl: 0 1px 2px rgba(28, 25, 23, 0.12);
279
+ --vx-shadow-raised: 0 1px 2px rgba(28, 25, 23, 0.1);
280
+ --vx-shadow-overlay: 0 8px 24px rgba(28, 25, 23, 0.1);
277
281
  --vx-surface-bg: #f2f2f5;
278
282
  --vx-surface-panel: #fafafd;
279
283
  --vx-surface-panel-hover: #ffffff;
@@ -1,8 +1,8 @@
1
1
  const NAMED_COLORS = {
2
2
  white: "#ffffff",
3
- // theme-allow — CSS keyword definition, not a design color
3
+ // theme-allow raw-hex — the CSS keyword's definition, not a design color
4
4
  black: "#000000"
5
- // theme-allow — CSS keyword definition, not a design color
5
+ // theme-allow raw-hex — the CSS keyword's definition, not a design color
6
6
  };
7
7
  function normalizeHex(hex) {
8
8
  const body = hex.slice(1);
package/dist/vite.d.ts CHANGED
@@ -49,7 +49,21 @@ export type BasaltAppOptions = {
49
49
  light: string;
50
50
  dark: string;
51
51
  };
52
- /** Manifest `background_color` + anti-FOUC paint color. Default: the resolved dark theme color. */
52
+ /**
53
+ * Which scheme the anti-FOUC `<style>` paints before the app boots. Default `'dark'` —
54
+ * `BasaltProvider`'s own default. `'light'` paints the light surface, `'auto'` declares
55
+ * `color-scheme: light dark` and picks the background off `prefers-color-scheme`, and `false`
56
+ * paints the background but declares no `color-scheme` at all (leave native controls to Mantine).
57
+ *
58
+ * Set this to whatever the app passes as `defaultColorScheme` — a mismatch is a visible flash of
59
+ * the wrong surface, not a correctness bug: the boot rule stops applying the moment Mantine
60
+ * writes `data-mantine-color-scheme` on `<html>` (see `BOOT_SCOPE`).
61
+ */
62
+ colorScheme?: 'dark' | 'light' | 'auto' | false;
63
+ /**
64
+ * Manifest `background_color` + anti-FOUC paint color. Default: the theme color matching
65
+ * `colorScheme` (the dark one for `'dark'` / `'auto'` / `false`, the light one for `'light'`).
66
+ */
53
67
  backgroundColor?: string;
54
68
  /** Manifest `display` mode. Default: `'standalone'`. */
55
69
  display?: 'standalone' | 'minimal-ui' | 'fullscreen' | 'browser';
@@ -104,13 +118,21 @@ export type BasaltAppOptions = {
104
118
  * manifest `theme_color` both need a FLAT color, so the flattening step is the contract this
105
119
  * plugin owes its output regardless of which shape the palette hands it.
106
120
  *
121
+ * Two behaviours worth knowing before adopting it, both of which the plugin owns because the
122
+ * consumer cannot reach them:
123
+ * • It HOISTS the shell's `<meta charset>` ahead of everything it injects, so the encoding
124
+ * declaration stays inside the spec's first 1024 bytes (see `hoistCharset`).
125
+ * • The anti-FOUC `<style>` expires the moment Mantine resolves the real scheme, and `colorScheme`
126
+ * selects which surface it paints until then (see `BOOT_SCOPE` / `buildBootStyle`).
127
+ *
107
128
  * @example
108
129
  * // vite.config.ts
109
130
  * import { basaltAppPlugin, basaltViteConfig } from 'basalt-ui/vite'
110
131
  *
111
132
  * export default {
112
133
  * ...basaltViteConfig({ port: 5173 }),
113
- * plugins: [react(), ...basaltAppPlugin({ name: 'Argo' })],
134
+ * // colorScheme mirrors <BasaltProvider defaultColorScheme> — omit it for the dark default.
135
+ * plugins: [react(), ...basaltAppPlugin({ name: 'Argo', colorScheme: 'auto' })],
114
136
  * }
115
137
  */
116
138
  export declare function basaltAppPlugin(options: BasaltAppOptions): PluginOption[];
@@ -1 +1 @@
1
- {"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAA6B,YAAY,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AAI/E,MAAM,MAAM,iBAAiB,GAAG;IAC9B,4FAA4F;IAC5F,IAAI,EAAE,MAAM,CAAA;IACZ,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACvB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAC5B,CAAA;AA6CD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,UAAU,CAgFpE;AAgBD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,gGAAgG;IAChG,IAAI,EAAE,MAAM,CAAA;IACZ,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gGAAgG;IAChG,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACrD,mGAAmG;IACnG,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,wDAAwD;IACxD,OAAO,CAAC,EAAE,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,SAAS,CAAA;IAChE;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,mGAAmG;IACnG,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,wFAAwF;IACxF,KAAK,CAAC,EAAE,KAAK,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAChC,8FAA8F;IAC9F,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;IAC3B,oFAAoF;IACpF,GAAG,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,SAAS,GAAG,qBAAqB,CAAA;KAAE,CAAA;IACvF,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,KAAK,CAAA;IAChB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClD,CAAA;AAuZD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,YAAY,EAAE,CAMzE"}
1
+ {"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAA6B,YAAY,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AAI/E,MAAM,MAAM,iBAAiB,GAAG;IAC9B,4FAA4F;IAC5F,IAAI,EAAE,MAAM,CAAA;IACZ,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACvB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAC5B,CAAA;AA6CD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,UAAU,CAgFpE;AAgBD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,gGAAgG;IAChG,IAAI,EAAE,MAAM,CAAA;IACZ,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gGAAgG;IAChG,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IACrD;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,CAAA;IAC/C;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,wDAAwD;IACxD,OAAO,CAAC,EAAE,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,SAAS,CAAA;IAChE;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,mGAAmG;IACnG,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,wFAAwF;IACxF,KAAK,CAAC,EAAE,KAAK,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAChC,8FAA8F;IAC9F,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;IAC3B,oFAAoF;IACpF,GAAG,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,SAAS,GAAG,qBAAqB,CAAA;KAAE,CAAA;IACvF,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,KAAK,CAAA;IAChB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClD,CAAA;AAigBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,YAAY,EAAE,CAMzE"}
package/dist/vite.js CHANGED
@@ -140,6 +140,29 @@ const VIEWPORT_TAG = {
140
140
  tag: "meta",
141
141
  attrs: { name: "viewport", content: "width=device-width, initial-scale=1.0, viewport-fit=cover" }
142
142
  };
143
+ const BOOT_SCOPE = "html:not([data-mantine-color-scheme])";
144
+ const BOOT_COLOR_SCHEME = { dark: "dark", light: "light", auto: "light dark" };
145
+ function buildBootStyle(input) {
146
+ const { colorScheme, themeColor, backgroundColor, explicitBackground } = input;
147
+ if (colorScheme === false) return `${BOOT_SCOPE}{background-color:${backgroundColor}}`;
148
+ const scheme = BOOT_COLOR_SCHEME[colorScheme];
149
+ if (colorScheme !== "auto" || explicitBackground) {
150
+ return `${BOOT_SCOPE}{background-color:${backgroundColor};color-scheme:${scheme}}`;
151
+ }
152
+ return `${BOOT_SCOPE}{background-color:${themeColor.light};color-scheme:${scheme}}@media(prefers-color-scheme:dark){${BOOT_SCOPE}{background-color:${themeColor.dark}}}`;
153
+ }
154
+ const CHARSET_META_RE = /[ \t]*<meta\s+charset\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'>=]+))\s*\/?>[ \t]*\r?\n?/i;
155
+ const HTTP_EQUIV_CHARSET_RE = /<meta\s[^>]*http-equiv\s*=\s*["']?content-type["']?[^>]*>/i;
156
+ const DEFAULT_CHARSET = "UTF-8";
157
+ function hoistCharset(html) {
158
+ if (HTTP_EQUIV_CHARSET_RE.test(html)) return { html, tag: void 0 };
159
+ const match = CHARSET_META_RE.exec(html);
160
+ const charset = match?.[1] ?? match?.[2] ?? match?.[3] ?? DEFAULT_CHARSET;
161
+ return {
162
+ html: match ? html.replace(CHARSET_META_RE, "") : html,
163
+ tag: { tag: "meta", attrs: { charset } }
164
+ };
165
+ }
143
166
  function buildSeoTags(input) {
144
167
  const { name, description, seo } = input;
145
168
  const tags = [];
@@ -183,7 +206,7 @@ function buildStaticTags(input) {
183
206
  options,
184
207
  shortName,
185
208
  themeColor,
186
- backgroundColor,
209
+ bootStyle,
187
210
  iconsEnabled,
188
211
  iconsDir,
189
212
  darkreader,
@@ -210,10 +233,7 @@ function buildStaticTags(input) {
210
233
  }
211
234
  }
212
235
  );
213
- tags.push({
214
- tag: "style",
215
- children: `html{background-color:${backgroundColor};color-scheme:dark}`
216
- });
236
+ tags.push({ tag: "style", children: bootStyle });
217
237
  if (iconsEnabled) {
218
238
  tags.push(
219
239
  {
@@ -274,7 +294,7 @@ function buildManifestJson(input) {
274
294
  scope,
275
295
  id,
276
296
  display,
277
- themeColor,
297
+ schemeColor,
278
298
  backgroundColor,
279
299
  iconsDir,
280
300
  base
@@ -287,7 +307,9 @@ function buildManifestJson(input) {
287
307
  start_url: startUrl,
288
308
  scope,
289
309
  display,
290
- theme_color: themeColor.dark,
310
+ // A manifest carries ONE theme color, so it follows the boot scheme rather than the dual
311
+ // `<meta name="theme-color">` pair. Unchanged for the default (`'dark'`) and for `'auto'`.
312
+ theme_color: schemeColor,
291
313
  background_color: backgroundColor,
292
314
  icons: [
293
315
  {
@@ -313,7 +335,15 @@ function createMainPlugin(options) {
313
335
  const iconsDir = options.icons === false ? void 0 : options.icons?.dir;
314
336
  const manifestEnabled = options.manifest !== false;
315
337
  const themeColor = resolveThemeColors(options.themeColor);
316
- const backgroundColor = options.backgroundColor ?? themeColor.dark;
338
+ const colorScheme = options.colorScheme ?? "dark";
339
+ const schemeColor = colorScheme === "light" ? themeColor.light : themeColor.dark;
340
+ const backgroundColor = options.backgroundColor ?? schemeColor;
341
+ const bootStyle = buildBootStyle({
342
+ colorScheme,
343
+ themeColor,
344
+ backgroundColor,
345
+ explicitBackground: options.backgroundColor !== void 0
346
+ });
317
347
  let manifestJson = "";
318
348
  let manifestHref = "/site.webmanifest";
319
349
  let staticTags = [];
@@ -332,7 +362,7 @@ function createMainPlugin(options) {
332
362
  scope,
333
363
  id,
334
364
  display,
335
- themeColor,
365
+ schemeColor,
336
366
  backgroundColor,
337
367
  iconsDir,
338
368
  base
@@ -341,7 +371,7 @@ function createMainPlugin(options) {
341
371
  options,
342
372
  shortName,
343
373
  themeColor,
344
- backgroundColor,
374
+ bootStyle,
345
375
  iconsEnabled,
346
376
  iconsDir,
347
377
  darkreader,
@@ -350,9 +380,20 @@ function createMainPlugin(options) {
350
380
  manifestHref
351
381
  });
352
382
  },
353
- transformIndexHtml(html) {
354
- const tags = hasViewportMeta(html) ? staticTags : [VIEWPORT_TAG, ...staticTags];
355
- return { html, tags };
383
+ transformIndexHtml: {
384
+ // `pre` so this plugin's tags are the FIRST head-prepend contributions Vite collects — that
385
+ // ordering is what puts the hoisted <meta charset> at the very top of <head> rather than
386
+ // behind another plugin's tags. Vite injects all collected tags after every hook has run.
387
+ order: "pre",
388
+ handler(html) {
389
+ const hoisted = hoistCharset(html);
390
+ const tags = [
391
+ ...hoisted.tag ? [hoisted.tag] : [],
392
+ ...hasViewportMeta(html) ? [] : [VIEWPORT_TAG],
393
+ ...staticTags
394
+ ];
395
+ return { html: hoisted.html, tags };
396
+ }
356
397
  },
357
398
  generateBundle() {
358
399
  if (!manifestEnabled) return;
package/llms.txt CHANGED
@@ -1,4 +1,4 @@
1
- # basalt-ui v1.19.1
1
+ # basalt-ui v1.21.0
2
2
  # Opinionated framework for Mantine-based React apps — theme, app shell, visx charts, toolchain presets
3
3
  #
4
4
  # basalt-ui is an opinionated framework for Mantine-based React apps.
@@ -19,7 +19,7 @@
19
19
  # ./tokens.css subpath. Guide: docs/FRAMEWORK-FREE.md in the repo.
20
20
 
21
21
  Package: basalt-ui
22
- Version: 1.19.1
22
+ Version: 1.21.0
23
23
 
24
24
  ## basalt-ui
25
25
  Import: import { ... } from 'basalt-ui'
@@ -152,7 +152,7 @@ Layer: non-js-asset
152
152
 
153
153
  ## basalt-ui/tokens.css
154
154
  Asset: basalt-ui/tokens.css
155
- Description: Prebuilt --vx-* token stylesheet — the default buildPaletteCss() output as a plain file, for a consumer with no bundler, no React and no Mantine; retune the selector or trim the spacing set with `basalt-ui tokens:css`
155
+ Description: Prebuilt --vx-* token stylesheet — the default buildPaletteCss() output as a plain file, for a consumer that has a bundler to resolve the subpath but no React and no Mantine; with no bundler, emit a file you own via `basalt-ui tokens:css`
156
156
  Layer: non-js-asset
157
157
 
158
158
  ## basalt-ui/configs/*
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "basalt-ui",
3
- "version": "1.19.1",
3
+ "version": "1.21.0",
4
4
  "description": "Opinionated framework for Mantine-based React apps — theme, app shell, visx charts, toolchain presets",
5
5
  "keywords": [
6
6
  "charts",
@@ -37,7 +37,8 @@
37
37
  "llms.txt",
38
38
  "AGENTS.md",
39
39
  "README.md",
40
- "CHANGELOG.md"
40
+ "CHANGELOG.md",
41
+ "MIGRATING.md"
41
42
  ],
42
43
  "type": "module",
43
44
  "sideEffects": [
@@ -131,7 +132,7 @@
131
132
  },
132
133
  "scripts": {
133
134
  "build": "tsup && tsc --emitDeclarationOnly --declarationMap && bun scripts/copy-assets.mjs && bun scripts/gen-tokens-css.mjs && bun scripts/fix-esm-extensions.mjs",
134
- "typecheck": "tsc --noEmit",
135
+ "typecheck": "tsc --noEmit && tsc -p tests/layout/tsconfig.json",
135
136
  "test": "cd ../.. && bun test packages/basalt-ui",
136
137
  "pack-test": "bash scripts/pack-test.sh",
137
138
  "prepack": "bun run build",
@@ -39,7 +39,7 @@ type WrapperProps = {
39
39
  /** Plain scrollable container rendered when use-stick-to-bottom peer is absent. */
40
40
  function PlainContainerFallback({ children, className, style }: WrapperProps): JSX.Element {
41
41
  const props: { className?: string; style?: CSSProperties } = {
42
- // theme-allow — scroll anchoring needs a real scrollable node it owns, not a ScrollArea.
42
+ // theme-allow raw-scroll-container — scroll anchoring needs a real scrollable node it owns, not a ScrollArea.
43
43
  style: { overflowY: 'auto', ...style },
44
44
  }
45
45
  if (className !== undefined) props.className = className
@@ -135,7 +135,7 @@ export function ThreadDetailPanel({
135
135
  <BasaltStickToBottom
136
136
  style={{
137
137
  height: '100%',
138
- // theme-allow — BasaltStickToBottom owns this scroll node (see stick-to-bottom.tsx).
138
+ // theme-allow raw-scroll-container — BasaltStickToBottom owns this scroll node (see stick-to-bottom.tsx).
139
139
  overflowY: 'auto',
140
140
  padding: 'var(--vx-space-agent-transcript-inset)',
141
141
  }}