@adea-ai/themes 0.6.1 → 0.6.3

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.
@@ -26,6 +26,24 @@ import type { AdeaTheme, AdeaThemeColors, ShadcnThemeProjection } from '../schem
26
26
  export type ShadcnTheme = AdeaTheme & {
27
27
  shadcn?: ShadcnThemeProjection;
28
28
  };
29
+ /** The solid destructive pair consumed by filled shadcn actions. */
30
+ export interface ShadcnDestructiveProjection {
31
+ /** Presentation fill derived from, but distinct from, the canonical error role. */
32
+ readonly fill: string;
33
+ /** Text color that clears the solid and 90%-hover presentation floors. */
34
+ readonly foreground: string;
35
+ }
36
+ /**
37
+ * The shared destructive solid fill and foreground as rendered by the UI.
38
+ *
39
+ * A filled destructive button uses `--destructive/90` on hover. A foreground that
40
+ * clears the original fill can fall below AA when that color is alpha-composited
41
+ * over a light or dark surface. This projection keeps the canonical error color
42
+ * untouched, adjusts only the presentation lightness along its hue, and tests the
43
+ * rounded sRGB output against the canvas and both card surfaces. The 5:1 internal
44
+ * margin protects the 4.5:1 AA floor from browser quantization.
45
+ */
46
+ export declare function shadcnDestructiveProjection(theme: ShadcnTheme): ShadcnDestructiveProjection;
29
47
  /**
30
48
  * Canonical role → shadcn custom-property name.
31
49
  *
@@ -1 +1 @@
1
- {"version":3,"file":"shadcn.d.ts","sourceRoot":"","sources":["../../src/adapters/shadcn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAGrF,iFAAiF;AACjF,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG;IAAE,MAAM,CAAC,EAAE,qBAAqB,CAAA;CAAE,CAAA;AAExE;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,eAAe,EAAE,MAAM,CAAC,CAsBzE,CAAA;AAEF;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAItE;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAyD1E;AAED,0CAA0C;AAC1C,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,SAAU,GAAG,MAAM,CAKxE"}
1
+ {"version":3,"file":"shadcn.d.ts","sourceRoot":"","sources":["../../src/adapters/shadcn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAYrF,iFAAiF;AACjF,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG;IAAE,MAAM,CAAC,EAAE,qBAAqB,CAAA;CAAE,CAAA;AAExE,oEAAoE;AACpE,MAAM,WAAW,2BAA2B;IAC1C,mFAAmF;IACnF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B;AAwBD;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,WAAW,GAAG,2BAA2B,CA6D3F;AAED;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,eAAe,EAAE,MAAM,CAAC,CAsBzE,CAAA;AAEF;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAItE;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAmE1E;AAED,0CAA0C;AAC1C,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,SAAU,GAAG,MAAM,CAKxE"}
@@ -21,7 +21,92 @@
21
21
  *
22
22
  * A table of the whole mapping is in `docs/shadcn-bridge.md`.
23
23
  */
24
+ import { primaryHover, primarySubtleCss } from '../accents.js';
24
25
  import { STATUS_ROLES, statusForeground, tint } from '../derive.js';
26
+ import { contrastRatio, formatOklch, gamutMap, hexToOklch, oklchToHex, parseColor, } from '../oklch.js';
27
+ const DESTRUCTIVE_PRESENTATION_FLOOR = 5;
28
+ const DESTRUCTIVE_HOVER_OPACITY = 0.9;
29
+ const DESTRUCTIVE_PRESENTATION_SURFACES = ['background', 'surface', 'surfaceElevated'];
30
+ function renderedColor(value) {
31
+ const color = parseColor(value);
32
+ return color ? hexToOklch(oklchToHex(color)) : undefined;
33
+ }
34
+ function compositeSrgb(foreground, background, alpha) {
35
+ const foregroundHex = oklchToHex(parseColor(foreground));
36
+ const backgroundHex = oklchToHex(parseColor(background));
37
+ const channels = [1, 3, 5].map((offset) => {
38
+ const front = Number.parseInt(foregroundHex.slice(offset, offset + 2), 16);
39
+ const back = Number.parseInt(backgroundHex.slice(offset, offset + 2), 16);
40
+ return Math.round(front * alpha + back * (1 - alpha))
41
+ .toString(16)
42
+ .padStart(2, '0');
43
+ });
44
+ return hexToOklch(`#${channels.join('')}`);
45
+ }
46
+ /**
47
+ * The shared destructive solid fill and foreground as rendered by the UI.
48
+ *
49
+ * A filled destructive button uses `--destructive/90` on hover. A foreground that
50
+ * clears the original fill can fall below AA when that color is alpha-composited
51
+ * over a light or dark surface. This projection keeps the canonical error color
52
+ * untouched, adjusts only the presentation lightness along its hue, and tests the
53
+ * rounded sRGB output against the canvas and both card surfaces. The 5:1 internal
54
+ * margin protects the 4.5:1 AA floor from browser quantization.
55
+ */
56
+ export function shadcnDestructiveProjection(theme) {
57
+ const sourceFill = parseColor(theme.colors.error);
58
+ const sourceForeground = parseColor(theme.colors.foreground);
59
+ const sourceBackground = parseColor(theme.colors.background);
60
+ if (!sourceFill || !sourceForeground || !sourceBackground) {
61
+ throw new Error(`theme ${theme.id} has an invalid destructive color pair`);
62
+ }
63
+ const preferredForeground = statusForeground(theme, 'error');
64
+ const alternateForeground = contrastRatio(sourceForeground, sourceFill) >= contrastRatio(sourceBackground, sourceFill)
65
+ ? theme.colors.background
66
+ : theme.colors.foreground;
67
+ const foregrounds = [preferredForeground, alternateForeground]
68
+ .map((value) => ({ value, rendered: renderedColor(value) }))
69
+ .filter((entry) => Boolean(entry.rendered));
70
+ const surfaceValues = [
71
+ ...DESTRUCTIVE_PRESENTATION_SURFACES.map((role) => theme.colors[role]),
72
+ theme.shadcn?.card ?? theme.colors.surface,
73
+ theme.shadcn?.popover ?? theme.colors.surfaceElevated,
74
+ ];
75
+ const surfaces = surfaceValues
76
+ .map((value) => ({ value, rendered: renderedColor(value) }))
77
+ .filter((entry) => Boolean(entry.rendered));
78
+ if (surfaces.length !== surfaceValues.length) {
79
+ throw new Error(`theme ${theme.id} has an invalid destructive presentation surface`);
80
+ }
81
+ for (let step = 0; step <= 250; step += 1) {
82
+ const directions = step === 0 ? [0] : [-1, 1];
83
+ for (const direction of directions) {
84
+ const candidate = gamutMap({
85
+ ...sourceFill,
86
+ l: sourceFill.l + direction * step * 0.001,
87
+ });
88
+ if (candidate.l < 0.02 || candidate.l > 0.98)
89
+ continue;
90
+ const fill = formatOklch(candidate);
91
+ const renderedFill = renderedColor(fill);
92
+ if (!renderedFill)
93
+ continue;
94
+ for (const foreground of foregrounds) {
95
+ const solidRatio = contrastRatio(foreground.rendered, renderedFill);
96
+ if (solidRatio < DESTRUCTIVE_PRESENTATION_FLOOR)
97
+ continue;
98
+ const clearsHoverFloor = surfaces.every(({ rendered }) => {
99
+ const composite = compositeSrgb(fill, formatOklch(rendered), DESTRUCTIVE_HOVER_OPACITY);
100
+ return (composite !== undefined &&
101
+ contrastRatio(foreground.rendered, composite) >= DESTRUCTIVE_PRESENTATION_FLOOR);
102
+ });
103
+ if (clearsHoverFloor)
104
+ return { fill, foreground: foreground.value };
105
+ }
106
+ }
107
+ }
108
+ throw new Error(`theme ${theme.id} cannot meet the shared destructive presentation floor`);
109
+ }
25
110
  /**
26
111
  * Canonical role → shadcn custom-property name.
27
112
  *
@@ -71,9 +156,15 @@ export function shadcnRoles(theme) {
71
156
  */
72
157
  export function shadcnVariables(theme) {
73
158
  const variables = {};
159
+ const destructive = shadcnDestructiveProjection(theme);
74
160
  for (const [role, name] of Object.entries(SHADCN_MAPPING)) {
75
- variables[`--${name}`] = theme.colors[role];
161
+ variables[`--${name}`] = role === 'error' ? destructive.fill : theme.colors[role];
76
162
  }
163
+ // Keep primary states on the shared appearance-aware accent derivation. Hover is
164
+ // resolved because its uniform lightness step cannot be expressed as a mix; the
165
+ // subtle tint stays tied to --primary so it follows runtime primary overrides.
166
+ variables['--primary-hover'] = primaryHover(theme.colors.accent, theme.appearance);
167
+ variables['--primary-subtle'] = primarySubtleCss(theme.appearance);
77
168
  variables['--accent'] = theme.colors.surfaceHover;
78
169
  variables['--accent-foreground'] = theme.colors.text;
79
170
  variables['--ring'] = theme.shadcn?.ring ?? theme.colors.accent;
@@ -99,13 +190,15 @@ export function shadcnVariables(theme) {
99
190
  variables['--sidebar-primary-foreground'] = theme.colors.accentForeground;
100
191
  variables['--sidebar-ring'] = theme.colors.accent;
101
192
  variables['--sidebar-muted-foreground'] = theme.colors.textMuted;
193
+ variables['--destructive-foreground'] = destructive.foreground;
102
194
  for (const role of STATUS_ROLES) {
103
195
  // Status labels on a subtle fill use the theme's body foreground; this
104
196
  // foreground is reserved for text on the role's solid colour. Keep the
105
197
  // generated shadcn names aligned with SHADCN_MAPPING, especially error →
106
198
  // destructive, and resolve the tint against a real canvas so it is opaque.
107
199
  const shadcnRole = SHADCN_MAPPING[role];
108
- variables[`--${shadcnRole}-foreground`] = statusForeground(theme, role);
200
+ variables[`--${shadcnRole}-foreground`] =
201
+ role === 'error' ? destructive.foreground : statusForeground(theme, role);
109
202
  variables[`--${shadcnRole}-subtle`] = tint(theme.colors[role], theme.colors.background);
110
203
  }
111
204
  variables['--surface-sunken'] = theme.colors.background;
@@ -1 +1 @@
1
- {"version":3,"file":"shadcn.js","sourceRoot":"","sources":["../../src/adapters/shadcn.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shadcn.js","sourceRoot":"","sources":["../../src/adapters/shadcn.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -65,5 +65,6 @@ export type { TailwindOptions } from './adapters/tailwind.js';
65
65
  export { toTailwindTheme } from './adapters/tailwind.js';
66
66
  export type { ShikiThemeRegistration, ShikiTokenSetting } from './adapters/shiki.js';
67
67
  export { toShikiTheme, toShikiThemes } from './adapters/shiki.js';
68
- export { SHADCN_MAPPING, shadcnCss, shadcnRoles, shadcnVariables } from './adapters/shadcn.js';
68
+ export type { ShadcnDestructiveProjection } from './adapters/shadcn.js';
69
+ export { SHADCN_MAPPING, shadcnCss, shadcnDestructiveProjection, shadcnRoles, shadcnVariables, } from './adapters/shadcn.js';
69
70
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAGH,YAAY,EACV,QAAQ,EACR,SAAS,EACT,eAAe,EACf,eAAe,EACf,OAAO,EACP,eAAe,EACf,aAAa,EACb,WAAW,EACX,aAAa,EACb,eAAe,EACf,qBAAqB,GACtB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAEzD,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC7D,OAAO,EACL,OAAO,EACP,iBAAiB,EACjB,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,WAAW,EACX,WAAW,EACX,SAAS,EACT,YAAY,EACZ,gBAAgB,GACjB,MAAM,cAAc,CAAA;AAGrB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,aAAa,EACb,QAAQ,EACR,MAAM,EACN,kBAAkB,EAClB,OAAO,GACR,MAAM,gBAAgB,CAAA;AAGvB,YAAY,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACvD,OAAO,EACL,aAAa,EACb,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,UAAU,EACV,OAAO,EACP,GAAG,EACH,UAAU,EACV,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,cAAc,GACf,MAAM,YAAY,CAAA;AAGnB,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAC5E,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,aAAa,GACd,MAAM,eAAe,CAAA;AAGtB,YAAY,EAAE,oBAAoB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAC5F,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAGhE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACrE,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,WAAW,EACX,cAAc,EACd,IAAI,GACL,MAAM,aAAa,CAAA;AAGpB,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACnF,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,QAAQ,GACT,MAAM,sBAAsB,CAAA;AAE7B,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAElD,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAE9F,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAExD,YAAY,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACpF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEjE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -55,5 +55,5 @@ export { toXtermTheme } from './adapters/xterm.js';
55
55
  export { catalogueCss, cssVariableName, themeCss, themeCssVariables } from './adapters/css.js';
56
56
  export { toTailwindTheme } from './adapters/tailwind.js';
57
57
  export { toShikiTheme, toShikiThemes } from './adapters/shiki.js';
58
- export { SHADCN_MAPPING, shadcnCss, shadcnRoles, shadcnVariables } from './adapters/shadcn.js';
58
+ export { SHADCN_MAPPING, shadcnCss, shadcnDestructiveProjection, shadcnRoles, shadcnVariables, } from './adapters/shadcn.js';
59
59
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAgBH,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAGzD,OAAO,EACL,OAAO,EACP,iBAAiB,EACjB,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,WAAW,EACX,WAAW,EACX,SAAS,EACT,YAAY,EACZ,gBAAgB,GACjB,MAAM,cAAc,CAAA;AAErB,8EAA8E;AAC9E,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,aAAa,EACb,QAAQ,EACR,MAAM,EACN,kBAAkB,EAClB,OAAO,GACR,MAAM,gBAAgB,CAAA;AAIvB,OAAO,EACL,aAAa,EACb,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,UAAU,EACV,OAAO,EACP,GAAG,EACH,UAAU,EACV,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,cAAc,GACf,MAAM,YAAY,CAAA;AAInB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,aAAa,GACd,MAAM,eAAe,CAAA;AAItB,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAIhE,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,WAAW,EACX,cAAc,EACd,IAAI,GACL,MAAM,aAAa,CAAA;AAIpB,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,QAAQ,GACT,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAGlD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAG9F,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAGxD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEjE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAgBH,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAGzD,OAAO,EACL,OAAO,EACP,iBAAiB,EACjB,UAAU,EACV,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,EACxB,WAAW,EACX,WAAW,EACX,SAAS,EACT,YAAY,EACZ,gBAAgB,GACjB,MAAM,cAAc,CAAA;AAErB,8EAA8E;AAC9E,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,aAAa,EACb,QAAQ,EACR,MAAM,EACN,kBAAkB,EAClB,OAAO,GACR,MAAM,gBAAgB,CAAA;AAIvB,OAAO,EACL,aAAa,EACb,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,UAAU,EACV,OAAO,EACP,GAAG,EACH,UAAU,EACV,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,cAAc,GACf,MAAM,YAAY,CAAA;AAInB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,aAAa,GACd,MAAM,eAAe,CAAA;AAItB,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAIhE,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,WAAW,EACX,cAAc,EACd,IAAI,GACL,MAAM,aAAa,CAAA;AAIpB,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,QAAQ,GACT,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAGlD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAG9F,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAGxD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAGjE,OAAO,EACL,cAAc,EACd,SAAS,EACT,2BAA2B,EAC3B,WAAW,EACX,eAAe,GAChB,MAAM,sBAAsB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adea-ai/themes",
3
- "version": "0.6.1",
3
+ "version": "0.6.3",
4
4
  "description": "The Adea theme catalogue: first-party and imported semantic OKLCH themes, with Base24, terminal, CSS and syntax adapters.",
5
5
  "keywords": [
6
6
  "adea",
@@ -23,11 +23,123 @@
23
23
  */
24
24
 
25
25
  import type { AdeaTheme, AdeaThemeColors, ShadcnThemeProjection } from '../schema.js'
26
+ import { primaryHover, primarySubtleCss } from '../accents.js'
26
27
  import { STATUS_ROLES, statusForeground, tint } from '../derive.js'
28
+ import {
29
+ contrastRatio,
30
+ formatOklch,
31
+ gamutMap,
32
+ hexToOklch,
33
+ oklchToHex,
34
+ parseColor,
35
+ } from '../oklch.js'
27
36
 
28
37
  /** A canonical theme with optional owner-authored shadcn presentation values. */
29
38
  export type ShadcnTheme = AdeaTheme & { shadcn?: ShadcnThemeProjection }
30
39
 
40
+ /** The solid destructive pair consumed by filled shadcn actions. */
41
+ export interface ShadcnDestructiveProjection {
42
+ /** Presentation fill derived from, but distinct from, the canonical error role. */
43
+ readonly fill: string
44
+ /** Text color that clears the solid and 90%-hover presentation floors. */
45
+ readonly foreground: string
46
+ }
47
+
48
+ const DESTRUCTIVE_PRESENTATION_FLOOR = 5
49
+ const DESTRUCTIVE_HOVER_OPACITY = 0.9
50
+ const DESTRUCTIVE_PRESENTATION_SURFACES = ['background', 'surface', 'surfaceElevated'] as const
51
+
52
+ function renderedColor(value: string) {
53
+ const color = parseColor(value)
54
+ return color ? hexToOklch(oklchToHex(color)) : undefined
55
+ }
56
+
57
+ function compositeSrgb(foreground: string, background: string, alpha: number) {
58
+ const foregroundHex = oklchToHex(parseColor(foreground)!)
59
+ const backgroundHex = oklchToHex(parseColor(background)!)
60
+ const channels = [1, 3, 5].map((offset) => {
61
+ const front = Number.parseInt(foregroundHex.slice(offset, offset + 2), 16)
62
+ const back = Number.parseInt(backgroundHex.slice(offset, offset + 2), 16)
63
+ return Math.round(front * alpha + back * (1 - alpha))
64
+ .toString(16)
65
+ .padStart(2, '0')
66
+ })
67
+ return hexToOklch(`#${channels.join('')}`)
68
+ }
69
+
70
+ /**
71
+ * The shared destructive solid fill and foreground as rendered by the UI.
72
+ *
73
+ * A filled destructive button uses `--destructive/90` on hover. A foreground that
74
+ * clears the original fill can fall below AA when that color is alpha-composited
75
+ * over a light or dark surface. This projection keeps the canonical error color
76
+ * untouched, adjusts only the presentation lightness along its hue, and tests the
77
+ * rounded sRGB output against the canvas and both card surfaces. The 5:1 internal
78
+ * margin protects the 4.5:1 AA floor from browser quantization.
79
+ */
80
+ export function shadcnDestructiveProjection(theme: ShadcnTheme): ShadcnDestructiveProjection {
81
+ const sourceFill = parseColor(theme.colors.error)
82
+ const sourceForeground = parseColor(theme.colors.foreground)
83
+ const sourceBackground = parseColor(theme.colors.background)
84
+ if (!sourceFill || !sourceForeground || !sourceBackground) {
85
+ throw new Error(`theme ${theme.id} has an invalid destructive color pair`)
86
+ }
87
+
88
+ const preferredForeground = statusForeground(theme, 'error')
89
+ const alternateForeground =
90
+ contrastRatio(sourceForeground, sourceFill) >= contrastRatio(sourceBackground, sourceFill)
91
+ ? theme.colors.background
92
+ : theme.colors.foreground
93
+ const foregrounds = [preferredForeground, alternateForeground]
94
+ .map((value) => ({ value, rendered: renderedColor(value) }))
95
+ .filter((entry): entry is { value: string; rendered: NonNullable<typeof entry.rendered> } =>
96
+ Boolean(entry.rendered)
97
+ )
98
+ const surfaceValues = [
99
+ ...DESTRUCTIVE_PRESENTATION_SURFACES.map((role) => theme.colors[role]),
100
+ theme.shadcn?.card ?? theme.colors.surface,
101
+ theme.shadcn?.popover ?? theme.colors.surfaceElevated,
102
+ ]
103
+ const surfaces = surfaceValues
104
+ .map((value) => ({ value, rendered: renderedColor(value) }))
105
+ .filter((entry): entry is { value: string; rendered: NonNullable<typeof entry.rendered> } =>
106
+ Boolean(entry.rendered)
107
+ )
108
+ if (surfaces.length !== surfaceValues.length) {
109
+ throw new Error(`theme ${theme.id} has an invalid destructive presentation surface`)
110
+ }
111
+
112
+ for (let step = 0; step <= 250; step += 1) {
113
+ const directions = step === 0 ? [0] : [-1, 1]
114
+ for (const direction of directions) {
115
+ const candidate = gamutMap({
116
+ ...sourceFill,
117
+ l: sourceFill.l + direction * step * 0.001,
118
+ })
119
+ if (candidate.l < 0.02 || candidate.l > 0.98) continue
120
+ const fill = formatOklch(candidate)
121
+ const renderedFill = renderedColor(fill)
122
+ if (!renderedFill) continue
123
+
124
+ for (const foreground of foregrounds) {
125
+ const solidRatio = contrastRatio(foreground.rendered, renderedFill)
126
+ if (solidRatio < DESTRUCTIVE_PRESENTATION_FLOOR) continue
127
+
128
+ const clearsHoverFloor = surfaces.every(({ rendered }) => {
129
+ const composite = compositeSrgb(fill, formatOklch(rendered), DESTRUCTIVE_HOVER_OPACITY)
130
+ return (
131
+ composite !== undefined &&
132
+ contrastRatio(foreground.rendered, composite) >= DESTRUCTIVE_PRESENTATION_FLOOR
133
+ )
134
+ })
135
+ if (clearsHoverFloor) return { fill, foreground: foreground.value }
136
+ }
137
+ }
138
+ }
139
+
140
+ throw new Error(`theme ${theme.id} cannot meet the shared destructive presentation floor`)
141
+ }
142
+
31
143
  /**
32
144
  * Canonical role → shadcn custom-property name.
33
145
  *
@@ -81,11 +193,18 @@ export function shadcnRoles(theme: ShadcnTheme): Record<string, string> {
81
193
  */
82
194
  export function shadcnVariables(theme: ShadcnTheme): Record<string, string> {
83
195
  const variables: Record<string, string> = {}
196
+ const destructive = shadcnDestructiveProjection(theme)
84
197
 
85
198
  for (const [role, name] of Object.entries(SHADCN_MAPPING) as [keyof AdeaThemeColors, string][]) {
86
- variables[`--${name}`] = theme.colors[role]
199
+ variables[`--${name}`] = role === 'error' ? destructive.fill : theme.colors[role]
87
200
  }
88
201
 
202
+ // Keep primary states on the shared appearance-aware accent derivation. Hover is
203
+ // resolved because its uniform lightness step cannot be expressed as a mix; the
204
+ // subtle tint stays tied to --primary so it follows runtime primary overrides.
205
+ variables['--primary-hover'] = primaryHover(theme.colors.accent, theme.appearance)
206
+ variables['--primary-subtle'] = primarySubtleCss(theme.appearance)
207
+
89
208
  variables['--accent'] = theme.colors.surfaceHover
90
209
  variables['--accent-foreground'] = theme.colors.text
91
210
  variables['--ring'] = theme.shadcn?.ring ?? theme.colors.accent
@@ -113,13 +232,16 @@ export function shadcnVariables(theme: ShadcnTheme): Record<string, string> {
113
232
  variables['--sidebar-ring'] = theme.colors.accent
114
233
  variables['--sidebar-muted-foreground'] = theme.colors.textMuted
115
234
 
235
+ variables['--destructive-foreground'] = destructive.foreground
236
+
116
237
  for (const role of STATUS_ROLES) {
117
238
  // Status labels on a subtle fill use the theme's body foreground; this
118
239
  // foreground is reserved for text on the role's solid colour. Keep the
119
240
  // generated shadcn names aligned with SHADCN_MAPPING, especially error →
120
241
  // destructive, and resolve the tint against a real canvas so it is opaque.
121
242
  const shadcnRole = SHADCN_MAPPING[role]
122
- variables[`--${shadcnRole}-foreground`] = statusForeground(theme, role)
243
+ variables[`--${shadcnRole}-foreground`] =
244
+ role === 'error' ? destructive.foreground : statusForeground(theme, role)
123
245
  variables[`--${shadcnRole}-subtle`] = tint(theme.colors[role], theme.colors.background)
124
246
  }
125
247
 
package/src/index.ts CHANGED
@@ -161,4 +161,11 @@ export { toTailwindTheme } from './adapters/tailwind.js'
161
161
  export type { ShikiThemeRegistration, ShikiTokenSetting } from './adapters/shiki.js'
162
162
  export { toShikiTheme, toShikiThemes } from './adapters/shiki.js'
163
163
 
164
- export { SHADCN_MAPPING, shadcnCss, shadcnRoles, shadcnVariables } from './adapters/shadcn.js'
164
+ export type { ShadcnDestructiveProjection } from './adapters/shadcn.js'
165
+ export {
166
+ SHADCN_MAPPING,
167
+ shadcnCss,
168
+ shadcnDestructiveProjection,
169
+ shadcnRoles,
170
+ shadcnVariables,
171
+ } from './adapters/shadcn.js'