basalt-ui 1.5.0 → 1.7.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.
- package/AGENTS.md +1 -1
- package/CHANGELOG.md +25 -0
- package/agent/rules/basalt-mantine.md +80 -40
- package/agent/rules/basalt-tokens.md +3 -1
- package/agent/skills/basalt-design/SKILL.md +21 -7
- package/agent/templates/CLAUDE-block.md.tpl +3 -2
- package/agent/templates/DESIGN.md.tpl +2 -1
- package/configs/oxlint-plugin.js +75 -1
- package/configs/oxlint.json +1 -0
- package/dist/agent/stick-to-bottom.d.ts.map +1 -1
- package/dist/agent/stick-to-bottom.js +2 -1
- package/dist/agent-chat/composer.d.ts.map +1 -1
- package/dist/agent-chat/composer.js +5 -4
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/dashboard/index.d.ts +1 -1
- package/dist/dashboard/index.d.ts.map +1 -1
- package/dist/dashboard/stat-card.d.ts +6 -1
- package/dist/dashboard/stat-card.d.ts.map +1 -1
- package/dist/dashboard/stat-card.js +37 -4
- package/dist/guard/index.d.ts +7 -1
- package/dist/guard/index.d.ts.map +1 -1
- package/dist/guard/index.js +16 -1
- package/dist/guard/types.d.ts +18 -3
- package/dist/guard/types.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/shell/app-sidebar.module.css +4 -6
- package/dist/shell/sidebar-search.module.css +4 -2
- package/dist/surfaces.d.ts +2 -2
- package/dist/surfaces.d.ts.map +1 -1
- package/dist/surfaces.js +8 -2
- package/dist/theme/controls.module.css +167 -26
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +36 -19
- package/dist/theme/nav-link.module.css +10 -10
- package/dist/tokens/index.d.ts +1 -0
- package/dist/tokens/index.d.ts.map +1 -1
- package/dist/tokens/index.js +4 -0
- package/dist/tokens/palette.d.ts +31 -0
- package/dist/tokens/palette.d.ts.map +1 -1
- package/dist/tokens/palette.js +31 -0
- package/dist/tokens.css +2 -0
- package/dist/vite.d.ts +6 -0
- package/dist/vite.d.ts.map +1 -1
- package/dist/vite.js +21 -1
- package/llms.txt +3 -3
- package/package.json +1 -1
- package/src/agent/stick-to-bottom.tsx +2 -1
- package/src/agent-chat/composer.tsx +5 -4
- package/src/cli/index.ts +11 -0
- package/src/dashboard/index.ts +1 -1
- package/src/dashboard/stat-card.tsx +61 -2
- package/src/guard/check-source.test.ts +63 -1
- package/src/guard/index.ts +39 -3
- package/src/guard/types.ts +18 -2
- package/src/index.ts +1 -0
- package/src/shell/app-sidebar.module.css +4 -6
- package/src/shell/sidebar-search.module.css +4 -2
- package/src/surfaces.ts +8 -2
- package/src/theme/controls.module.css +167 -26
- package/src/theme/index.ts +50 -19
- package/src/theme/nav-link.module.css +10 -10
- package/src/theme/shadow-surfaces.test.ts +72 -33
- package/src/tokens/index.ts +4 -0
- package/src/tokens/palette.ts +31 -0
- package/src/vite.ts +62 -1
package/dist/guard/index.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export type { Finding, GuardConfig, GuardKind, GuardSeverity };
|
|
|
9
9
|
/** Shared default config — CLI and tests import this to avoid duplication. */
|
|
10
10
|
export declare const DEFAULT_GUARD_CONFIG: GuardConfig;
|
|
11
11
|
/**
|
|
12
|
-
* The closed registry of all
|
|
12
|
+
* The closed registry of all 20 guard kinds. The triad test asserts
|
|
13
13
|
* `surface.guardKinds ⊆ keyof GUARD_RULES` at runtime.
|
|
14
14
|
*
|
|
15
15
|
* raw-surface, raw-html-layout, and sub-16-input-font are handled inline in checkSource
|
|
@@ -51,6 +51,12 @@ export declare const GUARD_RULES: {
|
|
|
51
51
|
readonly appliesTo: (relPath: string) => boolean;
|
|
52
52
|
readonly message: "For an off-identity accent use blue/gray or a status hue (red/green/orange/yellow).";
|
|
53
53
|
};
|
|
54
|
+
readonly 'mantine-shade-index': {
|
|
55
|
+
readonly kind: "mantine-shade-index";
|
|
56
|
+
readonly pattern: RegExp;
|
|
57
|
+
readonly enabled: (cfg: GuardConfig) => boolean;
|
|
58
|
+
readonly message: "Shade-pinned Mantine color — one fixed swatch in BOTH color schemes, so it cannot stay legible in either. Use VX.status.* / --vx-status-* for a verdict color, or the bare hue name (c=\"red\") to let the theme resolve the shade per scheme.";
|
|
59
|
+
};
|
|
54
60
|
readonly 'raw-spacing': {
|
|
55
61
|
readonly kind: "raw-spacing";
|
|
56
62
|
readonly pattern: (cfg: GuardConfig) => RegExp;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/guard/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE7E,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/guard/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE7E,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,CAAA;AAoP9D,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,EAAE,WAoBlC,CAAA;AAoTD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;gCA0BL,WAAW;;;;;;;gCAcX,WAAW;;;;;gCAMX,WAAW;;;;;;;gCAaX,WAAW;;;;;;;gCAQX,WAAW;;;;;;gCAOX,WAAW;;;;;;;gCASX,WAAW;;;;;;gCAOX,WAAW;;;;;;;gCASX,WAAW;;;;;;gCAMX,WAAW;;;;;;;gCASX,WAAW;;;;;;;gCAUX,WAAW;;;;;;;gCAUX,WAAW;;;;;;;gCASX,WAAW;;;;;;;gCASX,WAAW;;;;;;;gCAUX,WAAW;;;;CAOmB,CAAA;AAUjD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,EAAE,CA2PtF"}
|
package/dist/guard/index.js
CHANGED
|
@@ -13,6 +13,7 @@ const SURFACE_SHADOW = /\bboxShadow\s*:\s*(?!['"`]?[^'"`]*(?:var\(|\$\{))['"`][^
|
|
|
13
13
|
const CARD_SURFACE_TAG = /<(?:Card|Paper)(?![\w.])(?:=>|[^>])*?>/g;
|
|
14
14
|
const WITH_BORDER_PROP = /\bwithBorder\b(?!\s*=\s*\{\s*false\s*\})/;
|
|
15
15
|
const OFF_SYSTEM_SURFACE_VAR = /var\(--mantine-color-(gray|dark)-\d/g;
|
|
16
|
+
const MANTINE_SHADE_INDEX = /\b(?:color|c|bg|backgroundColor|borderColor)\s*=\s*\{?\s*['"][a-z]+\.\d\b|var\(--mantine-color-(?!gray-|dark-)[a-z]+-\d/g;
|
|
16
17
|
const RAW_HTML_TAG = /<(?:div|span|section|header|nav|footer|aside|main|article|ul|ol)\b/;
|
|
17
18
|
const INLINE_STYLE = /style=\{\{/;
|
|
18
19
|
const LAYOUT_SURFACE_PROP = /\b(?:display|padding|margin|gap|flex|grid|border|background|width|height)\b/;
|
|
@@ -59,6 +60,7 @@ const DEFAULT_GUARD_CONFIG = {
|
|
|
59
60
|
spacingSteps: DEFAULT_SPACING_STEPS,
|
|
60
61
|
rawRadius: true,
|
|
61
62
|
forbiddenAccents: DEFAULT_FORBIDDEN_ACCENTS,
|
|
63
|
+
mantineShadeIndex: true,
|
|
62
64
|
rawSurface: true,
|
|
63
65
|
cardWithBorder: true,
|
|
64
66
|
offSystemSurfaceVar: true,
|
|
@@ -75,7 +77,9 @@ const DEFAULT_GUARD_CONFIG = {
|
|
|
75
77
|
exemptRules: {},
|
|
76
78
|
severity: {}
|
|
77
79
|
};
|
|
78
|
-
const GRACE_PERIOD_KINDS = {
|
|
80
|
+
const GRACE_PERIOD_KINDS = {
|
|
81
|
+
"mantine-shade-index": "introduced 1.7.0 \u2014 promote to error in 1.8.0"
|
|
82
|
+
};
|
|
79
83
|
function severityOf(kind, cfg) {
|
|
80
84
|
return cfg.severity?.[kind] ?? (kind in GRACE_PERIOD_KINDS ? "warn" : "error");
|
|
81
85
|
}
|
|
@@ -283,6 +287,12 @@ const GUARD_RULES = {
|
|
|
283
287
|
appliesTo: (relPath) => !relPath.endsWith(".css"),
|
|
284
288
|
message: "For an off-identity accent use blue/gray or a status hue (red/green/orange/yellow)."
|
|
285
289
|
},
|
|
290
|
+
"mantine-shade-index": {
|
|
291
|
+
kind: "mantine-shade-index",
|
|
292
|
+
pattern: MANTINE_SHADE_INDEX,
|
|
293
|
+
enabled: (cfg) => cfg.mantineShadeIndex,
|
|
294
|
+
message: 'Shade-pinned Mantine color \u2014 one fixed swatch in BOTH color schemes, so it cannot stay legible in either. Use VX.status.* / --vx-status-* for a verdict color, or the bare hue name (c="red") to let the theme resolve the shade per scheme.'
|
|
295
|
+
},
|
|
286
296
|
"raw-spacing": {
|
|
287
297
|
kind: "raw-spacing",
|
|
288
298
|
pattern: (cfg) => new RegExp(
|
|
@@ -469,6 +479,11 @@ function checkSource(text, relPath, cfg) {
|
|
|
469
479
|
findings.push({ relPath, line: i + 1, token: m[0], kind: "off-system-surface-var" });
|
|
470
480
|
}
|
|
471
481
|
}
|
|
482
|
+
if (GUARD_RULES["mantine-shade-index"].enabled(cfg)) {
|
|
483
|
+
for (const m of line.matchAll(GUARD_RULES["mantine-shade-index"].pattern)) {
|
|
484
|
+
findings.push({ relPath, line: i + 1, token: m[0], kind: "mantine-shade-index" });
|
|
485
|
+
}
|
|
486
|
+
}
|
|
472
487
|
if (GUARD_RULES["raw-html-layout"].enabled(cfg) && ruleApplies("raw-html-layout", relPath) && RAW_HTML_TAG.test(line) && INLINE_STYLE.test(line) && LAYOUT_SURFACE_PROP.test(line)) {
|
|
473
488
|
findings.push({ relPath, line: i + 1, token: "<raw-html style>", kind: "raw-html-layout" });
|
|
474
489
|
}
|
package/dist/guard/types.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Guard types — Mantine-free, dependency-free (zero imports beyond TS types).
|
|
3
3
|
*
|
|
4
|
-
* GuardKind is the closed set of
|
|
4
|
+
* GuardKind is the closed set of 20 violation kinds the theme guard can emit.
|
|
5
5
|
* Finding is the structured result per violation, replacing the old `Violation` shape.
|
|
6
6
|
* GuardConfig is the per-run configuration that drives checkSource.
|
|
7
7
|
*/
|
|
8
|
-
/** The
|
|
9
|
-
export type GuardKind = 'raw-hex' | 'raw-color-fn' | 'localstorage-theme' | 'off-identity-accent' | 'raw-spacing' | 'raw-radius' | 'raw-surface' | 'card-with-border' | 'off-system-surface-var' | 'raw-html-layout' | 'inline-spacing' | 'inline-display' | 'raw-visx-axis' | 'raw-motion-value' | 'unframed-chart' | 'chart-missing-aria-label' | 'raw-form-control' | 'sub-16-input-font' | 'raw-font-family';
|
|
8
|
+
/** The 20 theme-guard violation kinds. */
|
|
9
|
+
export type GuardKind = 'raw-hex' | 'raw-color-fn' | 'localstorage-theme' | 'off-identity-accent' | 'mantine-shade-index' | 'raw-spacing' | 'raw-radius' | 'raw-surface' | 'card-with-border' | 'off-system-surface-var' | 'raw-html-layout' | 'inline-spacing' | 'inline-display' | 'raw-visx-axis' | 'raw-motion-value' | 'unframed-chart' | 'chart-missing-aria-label' | 'raw-form-control' | 'sub-16-input-font' | 'raw-font-family';
|
|
10
10
|
/**
|
|
11
11
|
* How hard a finding lands. `error` fails the build; `warn` reports and passes.
|
|
12
12
|
*
|
|
@@ -59,6 +59,21 @@ export type GuardConfig = {
|
|
|
59
59
|
readonly rawRadius: boolean;
|
|
60
60
|
/** Off-identity Mantine accent families forbidden as chrome accents. */
|
|
61
61
|
readonly forbiddenAccents: readonly string[];
|
|
62
|
+
/**
|
|
63
|
+
* Flag a SHADE-PINNED Mantine color — `c="yellow.7"`, `bg="blue.4"`, `var(--mantine-color-red-6)`.
|
|
64
|
+
*
|
|
65
|
+
* This is the sibling of `off-identity-accent`, and the two are deliberately disjoint. That kind
|
|
66
|
+
* polices WHICH hue you reach for and permits the bare status names (`c="red"`, `color="green"`)
|
|
67
|
+
* on purpose: they resolve through the theme, so they flip correctly across color schemes. This
|
|
68
|
+
* kind polices the SHADE INDEX, which does not — a pinned step is one fixed swatch in both
|
|
69
|
+
* schemes, so a `yellow.7` legible on the dark page is the one that fails contrast on the light
|
|
70
|
+
* one. Status color belongs on `VX.status.*` (`--vx-status-warn|bad|good|…`), which is emitted per
|
|
71
|
+
* scheme.
|
|
72
|
+
*
|
|
73
|
+
* `gray-*`/`dark-*` in `var()` form are excluded here because `off-system-surface-var` already
|
|
74
|
+
* owns them (surface color, its own message). Default true.
|
|
75
|
+
*/
|
|
76
|
+
readonly mantineShadeIndex: boolean;
|
|
62
77
|
/** Flag ad-hoc inline surface styling (border/borderRadius/boxShadow literals). Default true. */
|
|
63
78
|
readonly rawSurface: boolean;
|
|
64
79
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/guard/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,MAAM,SAAS,GACjB,SAAS,GACT,cAAc,GACd,oBAAoB,GACpB,qBAAqB,GACrB,aAAa,GACb,YAAY,GACZ,aAAa,GACb,kBAAkB,GAClB,wBAAwB,GACxB,iBAAiB,GACjB,gBAAgB,GAChB,gBAAgB,GAChB,eAAe,GACf,kBAAkB,GAClB,gBAAgB,GAChB,0BAA0B,GAC1B,kBAAkB,GAClB,mBAAmB,GACnB,iBAAiB,CAAA;AAErB;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,CAAA;AAE5C;;;;;;;GAOG;AACH,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,oFAAoF;IACpF,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAA;CACjC,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,wGAAwG;IACxG,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;IACxC,uEAAuE;IACvE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,wEAAwE;IACxE,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAA;IAC5C,iGAAiG;IACjG,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;IAC5B;;;;;;OAMG;IACH,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAChC,2GAA2G;IAC3G,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAA;IACrC,sGAAsG;IACtG,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B,8EAA8E;IAC9E,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B,4FAA4F;IAC5F,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B,yFAAyF;IACzF,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAA;IAC7B,kGAAkG;IAClG,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAChC;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAA;IACvC;;;;;;OAMG;IACH,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAChC;;;;;;OAMG;IACH,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAChC;;;OAGG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B;;;;;;;;;;;;;;;;;;;OAmBG;IACH,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;IAC1D;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAA;CAC7D,CAAA"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/guard/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,0CAA0C;AAC1C,MAAM,MAAM,SAAS,GACjB,SAAS,GACT,cAAc,GACd,oBAAoB,GACpB,qBAAqB,GACrB,qBAAqB,GACrB,aAAa,GACb,YAAY,GACZ,aAAa,GACb,kBAAkB,GAClB,wBAAwB,GACxB,iBAAiB,GACjB,gBAAgB,GAChB,gBAAgB,GAChB,eAAe,GACf,kBAAkB,GAClB,gBAAgB,GAChB,0BAA0B,GAC1B,kBAAkB,GAClB,mBAAmB,GACnB,iBAAiB,CAAA;AAErB;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,CAAA;AAE5C;;;;;;;GAOG;AACH,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,oFAAoF;IACpF,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAA;CACjC,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GAAG;IACxB,wGAAwG;IACxG,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;IACxC,uEAAuE;IACvE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,wEAAwE;IACxE,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAA;IAC5C;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAA;IACnC,iGAAiG;IACjG,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;IAC5B;;;;;;OAMG;IACH,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAChC,2GAA2G;IAC3G,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAA;IACrC,sGAAsG;IACtG,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B,8EAA8E;IAC9E,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B,4FAA4F;IAC5F,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B,yFAAyF;IACzF,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAA;IAC7B,kGAAkG;IAClG,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAChC;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAA;IACvC;;;;;;OAMG;IACH,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAChC;;;;;;OAMG;IACH,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;IAChC;;;OAGG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B;;;;;;;;;;;;;;;;;;;OAmBG;IACH,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;IAC1D;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAA;CAC7D,CAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ export { MOTION_DURATION, MOTION_SPRING, MOTION_EASE_STANDARD } from './motion/i
|
|
|
13
13
|
export { BasaltShell, NavCountBadge, AppSidebar, SidebarSearch, type SidebarSearchConfig, SidebarAccount, MobileNav, AppBreadcrumbs, type BreadcrumbLinkRenderer, PageHeaderProvider, PageActions, PageActionsOutlet, type SidebarSection, type SidebarItem, type BasaltShellProps, type BrandConfig, type SettingsMenuItem, type AppSidebarProps, type MobileNavItem, type MobileNavSection, type NavLinkRenderer, type MobileNavLinkRenderer, type AccountBadgeTone, type BasaltIdentity, type BasaltRole, type BasaltPlan, type AccountMenuItem, type BasaltAccountState, type BasaltAccountActions, type BasaltAccountProps, } from './shell/index.js';
|
|
14
14
|
export { type BasaltRegister, type Slot, type Series, type SeriesKey, type AsyncState, assertNever, type StandardSchemaV1, } from './register.js';
|
|
15
15
|
export { createPersistedState, type PersistedStateOptions, useOnlineStatus, readPersistedValue, } from './state.js';
|
|
16
|
-
export { DeltaBadge, type DeltaBadgeProps, StatCard, type StatCardProps, EmptyState, type EmptyStateProps, SettingsSection, type SettingsSectionProps, SettingsRow, type SettingsRowProps, DangerZone, type DangerZoneProps, } from './dashboard/index.js';
|
|
16
|
+
export { DeltaBadge, type DeltaBadgeProps, StatCard, type StatCardProps, type StatCardTone, EmptyState, type EmptyStateProps, SettingsSection, type SettingsSectionProps, SettingsRow, type SettingsRowProps, DangerZone, type DangerZoneProps, } from './dashboard/index.js';
|
|
17
17
|
export { ConnectivityProvider, ConnectivityIndicator, useConnectivity } from './connectivity/index.js';
|
|
18
18
|
export type { ConnectivityStatus, ConnectivitySnapshot, ConnectivityProviderProps, ConnectivityOverride, } from './connectivity/index.js';
|
|
19
19
|
export type { SurfaceSpec, RuleName, SkillName } from './surfaces.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,EACxB,mBAAmB,EACnB,KAAK,kBAAkB,GACxB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAC5E,YAAY,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAC1E,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAC/E,OAAO,EACL,WAAW,EACX,aAAa,EACb,UAAU,EACV,aAAa,EACb,KAAK,mBAAmB,EACxB,cAAc,EACd,SAAS,EACT,cAAc,EACd,KAAK,sBAAsB,EAC3B,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,GACxB,MAAM,SAAS,CAAA;AAKhB,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,IAAI,EACT,KAAK,MAAM,EACX,KAAK,SAAS,EACd,KAAK,UAAU,EACf,WAAW,EACX,KAAK,gBAAgB,GACtB,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,oBAAoB,EACpB,KAAK,qBAAqB,EAC1B,eAAe,EACf,kBAAkB,GACnB,MAAM,SAAS,CAAA;AAGhB,OAAO,EACL,UAAU,EACV,KAAK,eAAe,EACpB,QAAQ,EACR,KAAK,aAAa,EAClB,UAAU,EACV,KAAK,eAAe,EACpB,eAAe,EACf,KAAK,oBAAoB,EACzB,WAAW,EACX,KAAK,gBAAgB,EACrB,UAAU,EACV,KAAK,eAAe,GACrB,MAAM,aAAa,CAAA;AAGpB,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAC7F,YAAY,EACV,kBAAkB,EAClB,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,gBAAgB,CAAA;AAKvB,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAClE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAU9C,OAAO,EACL,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EACjB,QAAQ,EACR,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,cAAc,CAAA;AACrB,YAAY,EACV,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,EACtB,aAAa,EACb,qBAAqB,GACtB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAClF,YAAY,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,WAAW,EACX,SAAS,EACT,cAAc,GACf,MAAM,SAAS,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,EACxB,mBAAmB,EACnB,KAAK,kBAAkB,GACxB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAC5E,YAAY,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAC1E,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAC/E,OAAO,EACL,WAAW,EACX,aAAa,EACb,UAAU,EACV,aAAa,EACb,KAAK,mBAAmB,EACxB,cAAc,EACd,SAAS,EACT,cAAc,EACd,KAAK,sBAAsB,EAC3B,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,GACxB,MAAM,SAAS,CAAA;AAKhB,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,IAAI,EACT,KAAK,MAAM,EACX,KAAK,SAAS,EACd,KAAK,UAAU,EACf,WAAW,EACX,KAAK,gBAAgB,GACtB,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,oBAAoB,EACpB,KAAK,qBAAqB,EAC1B,eAAe,EACf,kBAAkB,GACnB,MAAM,SAAS,CAAA;AAGhB,OAAO,EACL,UAAU,EACV,KAAK,eAAe,EACpB,QAAQ,EACR,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,UAAU,EACV,KAAK,eAAe,EACpB,eAAe,EACf,KAAK,oBAAoB,EACzB,WAAW,EACX,KAAK,gBAAgB,EACrB,UAAU,EACV,KAAK,eAAe,GACrB,MAAM,aAAa,CAAA;AAGpB,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAC7F,YAAY,EACV,kBAAkB,EAClB,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,gBAAgB,CAAA;AAKvB,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAClE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAU9C,OAAO,EACL,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EACjB,QAAQ,EACR,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,cAAc,CAAA;AACrB,YAAY,EACV,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,EACtB,aAAa,EACb,qBAAqB,GACtB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAClF,YAAY,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,WAAW,EACX,SAAS,EACT,cAAc,GACf,MAAM,SAAS,CAAA"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* line is the child-list left guide (`--vx-divider`). Never reintroduce brand/section/footer
|
|
7
7
|
* borders.
|
|
8
8
|
*
|
|
9
|
-
* The active
|
|
9
|
+
* The active tint and icon-accent color live in the Mantine theme
|
|
10
10
|
* (`NavLink.extend` + `theme/nav-link.module.css`) so they apply to EVERY render path, including a
|
|
11
11
|
* consumer's router `<Link>` via `renderNavLink` (which never sees this CSS module). This module
|
|
12
12
|
* owns the shell-local layout (docs/DESIGN-SPEC.md §5) and the INACTIVE state (muted text, faint
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
/* Hover — ink-6% tint + ink text, for inactive rows only (an active row already carries the
|
|
53
|
-
* theme's
|
|
53
|
+
* theme's stronger ink-9% tint and keeps its own hover via `--nl-hover`). */
|
|
54
54
|
@media (hover: hover) {
|
|
55
55
|
.link:not([data-active]):not([aria-current='page']):hover {
|
|
56
56
|
background-color: color-mix(in srgb, var(--vx-ink) 6%, transparent) !important;
|
|
@@ -316,16 +316,14 @@
|
|
|
316
316
|
|
|
317
317
|
/*
|
|
318
318
|
* Active child = accent text, weight 600, NO fill (docs/DESIGN-SPEC.md §5) — unlike a top-level
|
|
319
|
-
* active row (
|
|
320
|
-
*
|
|
321
|
-
* module's active shadow-card.
|
|
319
|
+
* active row (ink-9% tint). Overrides the `--nl-*` custom properties the theme sets inline on the
|
|
320
|
+
* SAME NavLink root, so `!important` is required.
|
|
322
321
|
*/
|
|
323
322
|
.childList :global(.mantine-NavLink-root[data-active]),
|
|
324
323
|
.childList :global(.mantine-NavLink-root[aria-current='page']) {
|
|
325
324
|
--nl-color: var(--vx-accent) !important;
|
|
326
325
|
--nl-bg: transparent !important;
|
|
327
326
|
--nl-hover: color-mix(in srgb, var(--vx-ink) 5%, transparent) !important;
|
|
328
|
-
box-shadow: none !important;
|
|
329
327
|
}
|
|
330
328
|
|
|
331
329
|
/* Child hover (inactive) — ink-5% + ink, one step quieter than the parent rows' 6%. Outranks the
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* Sidebar search trigger — replicates the former header search trigger (panel surface +
|
|
3
|
-
* shadow-
|
|
3
|
+
* shadow-raised, control radius, faint icon/label, mono Kbd) at full width inside the sidebar.
|
|
4
|
+
* `shadow-raised` is the shared CONTROL depth — §5 specifies this trigger and the header icon
|
|
5
|
+
* button as a matched pair, so the two must never drift onto different depth tokens.
|
|
4
6
|
*/
|
|
5
7
|
|
|
6
8
|
.trigger {
|
|
@@ -12,7 +14,7 @@
|
|
|
12
14
|
padding: 0 var(--vx-space-row-inset-x);
|
|
13
15
|
border-radius: var(--vx-radius-ctrl);
|
|
14
16
|
background-color: var(--vx-surface-panel);
|
|
15
|
-
box-shadow: var(--vx-shadow-
|
|
17
|
+
box-shadow: var(--vx-shadow-raised);
|
|
16
18
|
color: var(--vx-faint);
|
|
17
19
|
}
|
|
18
20
|
|
package/dist/surfaces.d.ts
CHANGED
|
@@ -130,8 +130,8 @@ export declare const SURFACES: {
|
|
|
130
130
|
readonly layer: "mantine-coupled";
|
|
131
131
|
readonly rule: "mantine";
|
|
132
132
|
readonly skill: readonly ["basalt-app", "basalt-design"];
|
|
133
|
-
readonly guardKinds: readonly ["raw-motion-value", "card-with-border", "raw-form-control", "sub-16-input-font"];
|
|
134
|
-
readonly description: "BasaltProvider, createBasaltTheme, BasaltShell + sidebar/mobile-nav/breadcrumbs, NavCountBadge, ThemeToggle, ThreadWorkspace + thread-chat components, dashboard composites (DeltaBadge, StatCard, EmptyState, SettingsSection/SettingsRow/DangerZone)";
|
|
133
|
+
readonly guardKinds: readonly ["raw-motion-value", "card-with-border", "raw-form-control", "sub-16-input-font", "mantine-shade-index"];
|
|
134
|
+
readonly description: "BasaltProvider, createBasaltTheme, BasaltShell + sidebar/mobile-nav/breadcrumbs, NavCountBadge, ThemeToggle, ThreadWorkspace + thread-chat components, dashboard composites (DeltaBadge, StatCard with threshold tone, EmptyState, SettingsSection/SettingsRow/DangerZone)";
|
|
135
135
|
readonly optionalPeers: readonly ["react-markdown", "remark-gfm", "shiki", "beautiful-mermaid"];
|
|
136
136
|
readonly forbiddenImports: readonly [];
|
|
137
137
|
};
|
package/dist/surfaces.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"surfaces.d.ts","sourceRoot":"","sources":["../src/surfaces.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAI9C;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAChB,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,OAAO,GACP,OAAO,GACP,OAAO,GACP,eAAe,GACf,UAAU,GACV,MAAM,GACN,OAAO,GACP,SAAS,GACT,KAAK,CAAA;AAET;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,eAAe,GAAG,eAAe,CAAA;AAExE;;;;GAIG;AACH,MAAM,MAAM,KAAK,GAAG,iBAAiB,GAAG,UAAU,GAAG,YAAY,GAAG,cAAc,CAAA;AAElF;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,wFAAwF;IACxF,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAA;IAChC,oFAAoF;IACpF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,oFAAoF;IACpF,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,CAAA;IAC3B,2FAA2F;IAC3F,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAA;CACzB,CAAA;AAED;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,CAAA;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAA;CACrC,CAAA;AAID,KAAK,WAAW,GAAG;IACjB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;IACrB,QAAQ,CAAC,gBAAgB,EAAE,SAAS,eAAe,EAAE,CAAA;IACrD,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,YAAY,EAAE,CAAA;IAChD;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE;QACf,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;QACnC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;KACjC,CAAA;IACD;;;;;;OAMG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC3C,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG;IACvC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;IACzB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;IACvB,iGAAiG;IACjG,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAA;IACpC,2FAA2F;IAC3F,QAAQ,CAAC,UAAU,EAAE,SAAS,SAAS,EAAE,CAAA;CAC1C,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG;IACtC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAA;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAA;IACtB,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,CAAA;CAC5B,CAAA;AAED,kEAAkE;AAClE,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,WAAW,CAAA;AA8BpD;;;;;;;;;GASG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"surfaces.d.ts","sourceRoot":"","sources":["../src/surfaces.ts"],"names":[],"mappings":"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"}
|
package/dist/surfaces.js
CHANGED
|
@@ -22,8 +22,14 @@ const SURFACES = {
|
|
|
22
22
|
layer: "mantine-coupled",
|
|
23
23
|
rule: "mantine",
|
|
24
24
|
skill: ["basalt-app", "basalt-design"],
|
|
25
|
-
guardKinds: [
|
|
26
|
-
|
|
25
|
+
guardKinds: [
|
|
26
|
+
"raw-motion-value",
|
|
27
|
+
"card-with-border",
|
|
28
|
+
"raw-form-control",
|
|
29
|
+
"sub-16-input-font",
|
|
30
|
+
"mantine-shade-index"
|
|
31
|
+
],
|
|
32
|
+
description: "BasaltProvider, createBasaltTheme, BasaltShell + sidebar/mobile-nav/breadcrumbs, NavCountBadge, ThemeToggle, ThreadWorkspace + thread-chat components, dashboard composites (DeltaBadge, StatCard with threshold tone, EmptyState, SettingsSection/SettingsRow/DangerZone)",
|
|
27
33
|
optionalPeers: ["react-markdown", "remark-gfm", "shiki", "beautiful-mermaid"],
|
|
28
34
|
forbiddenImports: []
|
|
29
35
|
// the no-charts/tokens-reexport invariant is comment-only today; Phase-4 plugin
|
|
@@ -6,10 +6,19 @@
|
|
|
6
6
|
|
|
7
7
|
/*
|
|
8
8
|
* Field idiom (docs/DESIGN-SPEC.md §5): inputs read slightly inset on the panel — field surface
|
|
9
|
-
* (white on light, a page-bg step below panel on dark), depth via `shadow-
|
|
10
|
-
* + ring baked into the one value — DESIGN-SPEC doctrine inversion #1: depth is
|
|
11
|
-
*
|
|
9
|
+
* (white on light, a page-bg step below panel on dark), depth via `shadow-raised` (a whisper shadow
|
|
10
|
+
* + ring baked into the one value — DESIGN-SPEC doctrine inversion #1: depth is a shadow, not a
|
|
11
|
+
* hairline; borders-as-borders stay reserved for layout dividers), faint placeholder, and an
|
|
12
12
|
* accent border on focus (Mantine's own `:focus` rule swaps `--input-bd` to `--input-bd-focus`).
|
|
13
|
+
*
|
|
14
|
+
* `shadow-raised` — the SAME token Button/ActionIcon take below, and that sharing is deliberate.
|
|
15
|
+
* A `size="md"` Input and a `size="md"` Button are pinned to identical heights by
|
|
16
|
+
* `--vx-space-control-height`, so they are read as one row of controls; when the buttons moved onto
|
|
17
|
+
* `shadow-raised` and the fields stayed on `shadow-card`, that row visibly split in two. Panels
|
|
18
|
+
* (Card/Paper/Notification/ChartCard/SettingsSection) keep `shadow-card` — the line is
|
|
19
|
+
* control-vs-panel, not component-by-component. Its inset ring also suits a field better than
|
|
20
|
+
* `card`'s outset one ever did: an outset ring draws a boundary AROUND the box, while an inset edge
|
|
21
|
+
* darkens the field's own rim, which is what "recessed into the panel" actually looks like.
|
|
13
22
|
* The `--input-bd` box itself stays a TRANSPARENT 1px border (not `border: none`) so focus can
|
|
14
23
|
* recolor the same box with no layout shift, and `[data-error]` still wins a real red border.
|
|
15
24
|
*
|
|
@@ -30,13 +39,15 @@ html[data-mantine-color-scheme] .inputWrapper[data-variant='default']:not([data-
|
|
|
30
39
|
}
|
|
31
40
|
|
|
32
41
|
/*
|
|
33
|
-
* Depth lands on the INPUT ELEMENT, never on the wrapper above — `--vx-shadow-
|
|
42
|
+
* Depth lands on the INPUT ELEMENT, never on the wrapper above — `--vx-shadow-raised` bakes a 1px
|
|
34
43
|
* ring into the shadow, and the ring follows the shadowed box's OWN `border-radius`, not any other
|
|
35
44
|
* element's. Mantine's input wrapper (`.m_6c018570`) is a bare `position: relative` box with
|
|
36
45
|
* `border-radius: 0`; the ring drawn there squares off around the rounded input inside it and leaks
|
|
37
46
|
* visible corner nubs. The input element itself carries `border-radius: var(--input-radius)`
|
|
38
|
-
* (Input.css), so the ring follows the rounded edge exactly.
|
|
39
|
-
*
|
|
47
|
+
* (Input.css), so the ring follows the rounded edge exactly. `raised`'s ring being INSET rather than
|
|
48
|
+
* outset does not soften this: an inset ring is drawn by the same box and follows the same corners,
|
|
49
|
+
* so a mismatch leaks nubs on the inside of the corner instead of the outside. This is the general
|
|
50
|
+
* rule for every depth token — see shadow-surfaces.test.ts.
|
|
40
51
|
*
|
|
41
52
|
* Mantine never declares a `box-shadow` on the input at any specificity, so a plain `.input` class
|
|
42
53
|
* (0,1,0) wins uncontested. `--field-depth` carries the resting shadow so the `:focus` rule below
|
|
@@ -51,32 +62,162 @@ html[data-mantine-color-scheme] .inputWrapper[data-variant='default']:not([data-
|
|
|
51
62
|
}
|
|
52
63
|
|
|
53
64
|
.input[data-variant='default'] {
|
|
54
|
-
--field-depth: var(--vx-shadow-
|
|
65
|
+
--field-depth: var(--vx-shadow-raised);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/*
|
|
69
|
+
* Button / ActionIcon depth (docs/DESIGN-SPEC.md §5's Button idiom; the header's search trigger and
|
|
70
|
+
* icon button are specified there as a matched pair and both land on `shadow-raised`, same as the
|
|
71
|
+
* field above).
|
|
72
|
+
*
|
|
73
|
+
* THE LAW: depth says "this is a control surface"; it is NOT the emphasis axis. Emphasis lives
|
|
74
|
+
* entirely in fill weight (`filled` > `light`/`outline` > `subtle`), exactly as every surveyed
|
|
75
|
+
* system resolves it — Material 3's filled button, Radix's `solid`, and Primer's primary all rank
|
|
76
|
+
* by fill and saturation, never by z-height. So every variant that OWNS A BOX gets the same
|
|
77
|
+
* resting depth, and only the tier that owns no box stays flat.
|
|
78
|
+
*
|
|
79
|
+
* This replaces a `default`-only rule that inverted the hierarchy in practice: `default` was the
|
|
80
|
+
* one variant carrying depth, so the SECONDARY button read as a physical object while the primary
|
|
81
|
+
* (`filled`) read as paint on the page. Raising the rest is what removes the inversion — flattening
|
|
82
|
+
* `default` instead would fix it too, but it is not open to us: DESIGN-SPEC doctrine inversion #1
|
|
83
|
+
* ("depth is a shadow, not a hairline") already raised Card/Paper/Input/Chip/CheckboxCard, so a flat
|
|
84
|
+
* Button would be the only flat control in a row of raised ones — most visibly beside a
|
|
85
|
+
* `size="md"` TextInput, which the `--vx-space-control-height` coupling in theme/index.ts pins to
|
|
86
|
+
* the exact same height.
|
|
87
|
+
*
|
|
88
|
+
* ONE depth value for the raised family, and it is `shadow-raised` — a drop plus a 1px INSET edge:
|
|
89
|
+
* - `default`/`filled`/`light` all take it, unmodified. The shared value is the point. An earlier
|
|
90
|
+
* revision split them (`default` on `shadow-card`, the rest on ring-free `shadow-ctrl`) and
|
|
91
|
+
* `default` visibly read a step more three-dimensional than the other two: it was the only one
|
|
92
|
+
* with a DEFINED EDGE, and on dark it also carried a wider blur. A soft drop alone reads as
|
|
93
|
+
* "something is under this"; a crisp boundary is what actually reads as an object. Landing them
|
|
94
|
+
* on one value is what closed that gap — `default` came down (no more 3px/0.4 dark blur, no
|
|
95
|
+
* outset ring), `filled`/`light` came up (they gained an edge at all).
|
|
96
|
+
* - The edge is INSET, which is exactly why one value can cover all three — see `SHADOW.raised`
|
|
97
|
+
* in tokens/palette.ts for the full reasoning. Short version: an outset ring paints in the color
|
|
98
|
+
* of what it is drawn over, so `card`'s pale hairline ring would read as a grey outline around a
|
|
99
|
+
* saturated `filled` button on light scheme; an inset edge is drawn over the control's OWN
|
|
100
|
+
* background and works on a fill, a 13% tint and a neutral panel alike. It also keeps `default`
|
|
101
|
+
* legible inside a Card, where button and card share `--vx-surface-panel` and the inset edge is
|
|
102
|
+
* the only thing separating them (its border is pinned `transparent` by
|
|
103
|
+
* `cssVariablesResolver`, which kills the stock hairline `defaultVariantColorsResolver` draws
|
|
104
|
+
* for EVERY default-variant control — so this edge really is its only one).
|
|
105
|
+
* - `outline` is the one raised variant NOT on it: it already carries a real 1px accent border,
|
|
106
|
+
* and an inset edge tucked just inside a border is muddy. It takes ring-free `shadow-ctrl`
|
|
107
|
+
* instead — the same token, for the same reason, that SegmentedControl's active segment uses to
|
|
108
|
+
* say "this is the lifted one". Its border is its edge, so it is not missing one.
|
|
109
|
+
*
|
|
110
|
+
* `subtle` is the one tier that owns no box — it is a text affordance, not an object, and every
|
|
111
|
+
* system surveyed keeps that tier flat. It stays flat in BOTH states here: its hover is Mantine's
|
|
112
|
+
* own background tint and nothing else, which is exactly how the spec's "ghost icon button" (§5:
|
|
113
|
+
* transparent, faint icon, hover ink-6% + ink icon) already behaved. Button's `subtle` and
|
|
114
|
+
* ActionIcon's therefore need no asymmetry between them. See the note below the variant rules for
|
|
115
|
+
* why an earlier hover-depth attempt was reverted.
|
|
116
|
+
*
|
|
117
|
+
* Mantine never declares a `box-shadow` on either component at ANY specificity, so a plain
|
|
118
|
+
* module-class + attribute selector wins uncontested — no `html[...]` prefix fight, unlike the
|
|
119
|
+
* input-variable overrides above. Depth rides `--ctrl-depth` rather than landing on `box-shadow`
|
|
120
|
+
* directly (the same indirection `.input` uses for `--field-depth`) so the disabled rule below
|
|
121
|
+
* moves ONE variable instead of restating a value per variant.
|
|
122
|
+
*/
|
|
123
|
+
.buttonRoot,
|
|
124
|
+
.actionIconRoot {
|
|
125
|
+
--ctrl-depth: 0 0 transparent;
|
|
126
|
+
|
|
127
|
+
box-shadow: var(--ctrl-depth);
|
|
128
|
+
transition: box-shadow 120ms ease;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.buttonRoot[data-variant='default'],
|
|
132
|
+
.buttonRoot[data-variant='filled'],
|
|
133
|
+
.buttonRoot[data-variant='light'] {
|
|
134
|
+
--ctrl-depth: var(--vx-shadow-raised);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.actionIconRoot[data-variant='default'],
|
|
138
|
+
.actionIconRoot[data-variant='filled'],
|
|
139
|
+
.actionIconRoot[data-variant='light'] {
|
|
140
|
+
--ctrl-depth: var(--vx-shadow-raised);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.buttonRoot[data-variant='outline'] {
|
|
144
|
+
--ctrl-depth: var(--vx-shadow-ctrl);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.actionIconRoot[data-variant='outline'] {
|
|
148
|
+
--ctrl-depth: var(--vx-shadow-ctrl);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/*
|
|
152
|
+
* DEPTH HERE IS STATIC. No variant changes depth or position on hover or press — the raised variants
|
|
153
|
+
* already get hover feedback from Mantine's own background change, so anything layered on top just
|
|
154
|
+
* restates a signal that is already there. Two attempts at adding one were made and both reverted,
|
|
155
|
+
* for reasons worth keeping:
|
|
156
|
+
*
|
|
157
|
+
* - A 1px `translateY` lift on hover, reversed on press. It restated the background change AND
|
|
158
|
+
* cost something real: Floating UI measures a transformed rect, so a Tooltip or Popover anchored
|
|
159
|
+
* to the button visibly shifts with it.
|
|
160
|
+
* - `subtle` materializing into `shadow-raised` on hover. The theory was that `subtle` owns no box
|
|
161
|
+
* at rest, so gaining one under the cursor is the affordance rather than decoration. In practice
|
|
162
|
+
* `shadow-raised`'s INSET edge is a hard rim, and a rim appearing around a ghost button makes it
|
|
163
|
+
* read as an `outline` button rather than as a text affordance that lit up — the tint alone
|
|
164
|
+
* already says "pressable", and the rim says something else entirely. `subtle` is now flat in
|
|
165
|
+
* BOTH states, which also collapses an asymmetry that had to be documented twice: Button's
|
|
166
|
+
* `subtle` and ActionIcon's ghost icon button finally behave identically.
|
|
167
|
+
*
|
|
168
|
+
* DON'T REINTRODUCE EITHER. If a future pass wants `subtle` to gain depth on hover, the token to
|
|
169
|
+
* reach for is ring-free `shadow-ctrl`, not `shadow-raised` — the drop is the part that reads as
|
|
170
|
+
* lift, the rim is the part that read as wrong.
|
|
171
|
+
*/
|
|
172
|
+
|
|
173
|
+
/*
|
|
174
|
+
* Disabled is flat and grounded — a raised control reads as pressable, which is the one thing a
|
|
175
|
+
* disabled control must not do. Mantine's own disabled rule (Button.css/ActionIcon.css) recolors
|
|
176
|
+
* background and text but never touches the shadow, so nothing here fights it; the `[data-loading]`
|
|
177
|
+
* exclusion mirrors that same rule, keeping a loading button's chrome intact while it works.
|
|
178
|
+
* Written as real (0,3,0) selectors rather than a `:where()` group so this outranks the (0,2,0)
|
|
179
|
+
* variant rules above on specificity alone, independent of source order.
|
|
180
|
+
*/
|
|
181
|
+
.buttonRoot:disabled:not([data-loading]),
|
|
182
|
+
.buttonRoot[data-disabled]:not([data-loading]),
|
|
183
|
+
.actionIconRoot:disabled:not([data-loading]),
|
|
184
|
+
.actionIconRoot[data-disabled]:not([data-loading]) {
|
|
185
|
+
--ctrl-depth: 0 0 transparent;
|
|
55
186
|
}
|
|
56
187
|
|
|
57
188
|
/*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
* `
|
|
67
|
-
* deterministic. `filled`/`subtle`/`light` variants are untouched by the attribute scope.
|
|
189
|
+
* Fields ground when disabled for the same reason, and this rule is why the field/button split had
|
|
190
|
+
* to close on BOTH sides: buttons got the treatment above when they moved onto `shadow-raised`,
|
|
191
|
+
* while inputs — which sat on `shadow-card` at the time — never had one at all, so a disabled
|
|
192
|
+
* TextInput stayed raised. Once fields joined the same depth family that gap became a visible
|
|
193
|
+
* inconsistency inside one form rather than a quiet oversight.
|
|
194
|
+
*
|
|
195
|
+
* `:disabled` covers the real `<input>`/`<textarea>`; `[data-disabled]` covers the composite fields
|
|
196
|
+
* (Select, MultiSelect, DatePicker) where Mantine disables a readonly input via the attribute
|
|
197
|
+
* instead. No `[data-loading]` exclusion here — inputs have no loading state, unlike Button.
|
|
68
198
|
*/
|
|
69
|
-
.
|
|
70
|
-
|
|
199
|
+
.input:disabled,
|
|
200
|
+
.input[data-disabled] {
|
|
201
|
+
--field-depth: 0 0 transparent;
|
|
71
202
|
}
|
|
72
203
|
|
|
73
|
-
|
|
74
|
-
|
|
204
|
+
/*
|
|
205
|
+
* Reduced motion drops the fade, never the shadow: a static shadow is not motion, and removing it
|
|
206
|
+
* would strip the very hierarchy this pass exists to establish from the users who asked for less
|
|
207
|
+
* animation. `subtle`'s hover depth still lands — it just lands instantly.
|
|
208
|
+
*/
|
|
209
|
+
@media (prefers-reduced-motion: reduce) {
|
|
210
|
+
.buttonRoot,
|
|
211
|
+
.actionIconRoot {
|
|
212
|
+
transition: none;
|
|
213
|
+
}
|
|
75
214
|
}
|
|
76
215
|
|
|
77
216
|
/*
|
|
78
|
-
* CheckboxCard / RadioCard (`withBorder`, the default): panel bg +
|
|
79
|
-
*
|
|
217
|
+
* CheckboxCard / RadioCard (`withBorder`, the default): panel bg + depth, no border — the same
|
|
218
|
+
* triad as Card/Paper, but on `shadow-raised`, since a selection card is something you click (the
|
|
219
|
+
* control-vs-panel line, see the header above). Mantine's own border-color rule wraps
|
|
220
|
+
* `[data-with-border]` in
|
|
80
221
|
* `:where()` (0 specificity), so a plain class + real attribute selector ((0,2,0)) already wins;
|
|
81
222
|
* no `html[…]` prefix fight needed, same reasoning as Button/ActionIcon above.
|
|
82
223
|
*/
|
|
@@ -84,7 +225,7 @@ html[data-mantine-color-scheme] .inputWrapper[data-variant='default']:not([data-
|
|
|
84
225
|
.radioCardRoot[data-with-border] {
|
|
85
226
|
background-color: var(--vx-surface-panel);
|
|
86
227
|
border-color: transparent;
|
|
87
|
-
box-shadow: var(--vx-shadow-
|
|
228
|
+
box-shadow: var(--vx-shadow-raised);
|
|
88
229
|
}
|
|
89
230
|
|
|
90
231
|
/*
|
|
@@ -96,12 +237,12 @@ html[data-mantine-color-scheme] .inputWrapper[data-variant='default']:not([data-
|
|
|
96
237
|
*/
|
|
97
238
|
.chipLabel:not([data-checked]):not([data-disabled]) {
|
|
98
239
|
background-color: var(--vx-surface-panel);
|
|
99
|
-
box-shadow: var(--vx-shadow-
|
|
240
|
+
box-shadow: var(--vx-shadow-raised);
|
|
100
241
|
}
|
|
101
242
|
|
|
102
243
|
/*
|
|
103
244
|
* Focus = accent border (via --input-bd-focus above) + a subtle accent ring layered over the
|
|
104
|
-
* resting `--field-depth`, so the field keeps its shadow-
|
|
245
|
+
* resting `--field-depth`, so the field keeps its `shadow-raised` depth while focused.
|
|
105
246
|
*/
|
|
106
247
|
.input:focus,
|
|
107
248
|
.input:focus-within {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/theme/index.ts"],"names":[],"mappings":"AA+DA,OAAO,KAAK,EACV,oBAAoB,EAGpB,oBAAoB,EAErB,MAAM,eAAe,CAAA;AAStB,OAAO,KAAK,EAAe,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAOlD;;;;;GAKG;AACH,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAIlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AASvD,OAAO,QAAQ,eAAe,CAAC;IAC7B,UAAU,iBAAiB;QACzB,YAAY,CAAC,EAAE,YAAY,CAAA;QAC3B,WAAW,CAAC,EAAE,iBAAiB,CAAA;QAC/B,YAAY,CAAC,EAAE,YAAY,CAAA;QAC3B,aAAa,CAAC,EAAE,WAAW,CAAA;KAC5B;CACF;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/theme/index.ts"],"names":[],"mappings":"AA+DA,OAAO,KAAK,EACV,oBAAoB,EAGpB,oBAAoB,EAErB,MAAM,eAAe,CAAA;AAStB,OAAO,KAAK,EAAe,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAOlD;;;;;GAKG;AACH,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAIlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AASvD,OAAO,QAAQ,eAAe,CAAC;IAC7B,UAAU,iBAAiB;QACzB,YAAY,CAAC,EAAE,YAAY,CAAA;QAC3B,WAAW,CAAC,EAAE,iBAAiB,CAAA;QAC/B,YAAY,CAAC,EAAE,YAAY,CAAA;QAC3B,aAAa,CAAC,EAAE,WAAW,CAAA;KAC5B;CACF;AAk5BD;+EAC+E;AAC/E,eAAO,MAAM,SAAS,EAAE,oBAAuD,CAAA;AAmJ/E;;8FAE8F;AAC9F,eAAO,MAAM,oBAAoB,EAAE,oBACc,CAAA;AAEjD,kEAAkE;AAClE,MAAM,MAAM,wBAAwB,GAAG;IACrC;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAA;IAE9B;;;;;;;;;;;;;;;;OAgBG;IACH,KAAK,CAAC,EAAE,iBAAiB,CAAA;IAEzB;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAYD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,CAAC,EAAE,oBAAoB,EAChC,OAAO,CAAC,EAAE,wBAAwB,GACjC,oBAAoB,CA+BtB"}
|