@chances-ai/design-system 24.1.0 → 24.3.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.
@@ -1 +1 @@
1
- {"version":3,"file":"heroui-theme.d.ts","sourceRoot":"","sources":["../src/heroui-theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAExE;;uEAEuE;AACvE,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA0BtD,CAAC;AAEF;;sEAEsE;AACtE,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAa5D,CAAC;AAEF;;;wFAGwF;AACxF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAE5D;AAED;6CAC6C;AAC7C,eAAO,MAAM,yBAAyB,EAAE,WAAW,CAAC,MAAM,CAEzD,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,MAAM,CAAsD,CAAC"}
1
+ {"version":3,"file":"heroui-theme.d.ts","sourceRoot":"","sources":["../src/heroui-theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAExE;;uEAEuE;AACvE,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA4BtD,CAAC;AAEF;;sEAEsE;AACtE,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAW5D,CAAC;AAEF;;;wFAGwF;AACxF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAE5D;AAED;6CAC6C;AAC7C,eAAO,MAAM,yBAAyB,EAAE,WAAW,CAAC,MAAM,CAEzD,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,MAAM,CAAsD,CAAC"}
@@ -33,6 +33,8 @@ export const HEROUI_BASE_VAR_MAP = {
33
33
  "--muted": "textWeak",
34
34
  "--default": "bgWeak",
35
35
  "--default-foreground": "textBase",
36
+ "--accent": "interactive",
37
+ "--accent-foreground": "textOnInteractive",
36
38
  "--success": "success",
37
39
  "--success-foreground": "textOnSuccess",
38
40
  "--warning": "warning",
@@ -50,10 +52,8 @@ export const HEROUI_BASE_VAR_MAP = {
50
52
  * its reason. The test asserts every key here still exists in HeroUI's
51
53
  * `variables.css` (so a stale exclusion gets flagged on upgrade). */
52
54
  export const HEROUI_BASE_VARS_UNMAPPED = {
53
- "--accent": "action/interactive color kept as HeroUI's blue. It already sits in our `permission` periwinkle family AND ships a contrast-correct `--accent-foreground`; overriding it without a matching `on(permission)` token would risk illegible button/focus text. Revisit when a `textOnPermission` token lands.",
54
- "--accent-foreground": "paired with --accent (see above).",
55
- "--focus": "= --accent by default; follows the accent decision.",
56
- "--link": "= --foreground by default, which is already our text color.",
55
+ "--focus": "= var(--accent) in HeroUI's own variables.css automatically resolves to our overridden --accent at use-time (CSS var refs resolve against the cascade), so no explicit override needed. Same mechanism as the --accent-hover/--accent-soft calculated vars.",
56
+ "--link": "= --foreground by default, which is already our text color (links are body text → must stay legible on bg; the interactive fill is not).",
57
57
  "--field-placeholder": "= --muted by default; --muted IS mapped, so the placeholder inherits our value.",
58
58
  "--field-border": "transparent by default (HeroUI fields are borderless); chrome borders come from --border.",
59
59
  "--backdrop": "a fixed translucent-black scrim; mode-agnostic, not a themed surface.",
@@ -1 +1 @@
1
- {"version":3,"file":"heroui-theme.js","sourceRoot":"","sources":["../src/heroui-theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,UAAU,EAAE,KAAK,EAAkB,MAAM,qBAAqB,CAAC;AAExE;;uEAEuE;AACvE,MAAM,CAAC,MAAM,mBAAmB,GAA2B;IACzD,cAAc,EAAE,QAAQ;IACxB,cAAc,EAAE,UAAU;IAC1B,WAAW,EAAE,aAAa;IAC1B,sBAAsB,EAAE,UAAU;IAClC,qBAAqB,EAAE,eAAe;IACtC,gCAAgC,EAAE,UAAU;IAC5C,oBAAoB,EAAE,QAAQ;IAC9B,+BAA+B,EAAE,UAAU;IAC3C,WAAW,EAAE,eAAe;IAC5B,sBAAsB,EAAE,UAAU;IAClC,SAAS,EAAE,UAAU;IACrB,WAAW,EAAE,QAAQ;IACrB,sBAAsB,EAAE,UAAU;IAClC,WAAW,EAAE,SAAS;IACtB,sBAAsB,EAAE,eAAe;IACvC,WAAW,EAAE,SAAS;IACtB,sBAAsB,EAAE,eAAe;IACvC,UAAU,EAAE,OAAO;IACnB,qBAAqB,EAAE,aAAa;IACpC,UAAU,EAAE,YAAY;IACxB,aAAa,EAAE,YAAY;IAC3B,oBAAoB,EAAE,WAAW;IACjC,oBAAoB,EAAE,UAAU;IAChC,WAAW,EAAE,eAAe;IAC5B,sBAAsB,EAAE,UAAU;CACnC,CAAC;AAEF;;sEAEsE;AACtE,MAAM,CAAC,MAAM,yBAAyB,GAA2B;IAC/D,UAAU,EACR,4SAA4S;IAC9S,qBAAqB,EAAE,mCAAmC;IAC1D,SAAS,EAAE,qDAAqD;IAChE,QAAQ,EAAE,6DAA6D;IACvE,qBAAqB,EAAE,iFAAiF;IACxG,gBAAgB,EAAE,2FAA2F;IAC7G,YAAY,EAAE,uEAAuE;IACrF,SAAS,EAAE,yCAAyC;IACpD,SAAS,EAAE,yCAAyC;IACpD,QAAQ,EAAE,yCAAyC;IACnD,WAAW,EAAE,yCAAyC;CACvD,CAAC;AAEF;;;wFAGwF;AACxF,MAAM,UAAU,oBAAoB,CAAC,IAAe;IAClD,OAAO,iBAAiB,IAAI,EAAE,CAAC;AACjC,CAAC;AAED;6CAC6C;AAC7C,MAAM,CAAC,MAAM,yBAAyB,GAAwB,IAAI,GAAG,CACnE,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAClE,CAAC;AAEF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"heroui-theme.js","sourceRoot":"","sources":["../src/heroui-theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,UAAU,EAAE,KAAK,EAAkB,MAAM,qBAAqB,CAAC;AAExE;;uEAEuE;AACvE,MAAM,CAAC,MAAM,mBAAmB,GAA2B;IACzD,cAAc,EAAE,QAAQ;IACxB,cAAc,EAAE,UAAU;IAC1B,WAAW,EAAE,aAAa;IAC1B,sBAAsB,EAAE,UAAU;IAClC,qBAAqB,EAAE,eAAe;IACtC,gCAAgC,EAAE,UAAU;IAC5C,oBAAoB,EAAE,QAAQ;IAC9B,+BAA+B,EAAE,UAAU;IAC3C,WAAW,EAAE,eAAe;IAC5B,sBAAsB,EAAE,UAAU;IAClC,SAAS,EAAE,UAAU;IACrB,WAAW,EAAE,QAAQ;IACrB,sBAAsB,EAAE,UAAU;IAClC,UAAU,EAAE,aAAa;IACzB,qBAAqB,EAAE,mBAAmB;IAC1C,WAAW,EAAE,SAAS;IACtB,sBAAsB,EAAE,eAAe;IACvC,WAAW,EAAE,SAAS;IACtB,sBAAsB,EAAE,eAAe;IACvC,UAAU,EAAE,OAAO;IACnB,qBAAqB,EAAE,aAAa;IACpC,UAAU,EAAE,YAAY;IACxB,aAAa,EAAE,YAAY;IAC3B,oBAAoB,EAAE,WAAW;IACjC,oBAAoB,EAAE,UAAU;IAChC,WAAW,EAAE,eAAe;IAC5B,sBAAsB,EAAE,UAAU;CACnC,CAAC;AAEF;;sEAEsE;AACtE,MAAM,CAAC,MAAM,yBAAyB,GAA2B;IAC/D,SAAS,EACP,+PAA+P;IACjQ,QAAQ,EAAE,0IAA0I;IACpJ,qBAAqB,EAAE,iFAAiF;IACxG,gBAAgB,EAAE,2FAA2F;IAC7G,YAAY,EAAE,uEAAuE;IACrF,SAAS,EAAE,yCAAyC;IACpD,SAAS,EAAE,yCAAyC;IACpD,QAAQ,EAAE,yCAAyC;IACnD,WAAW,EAAE,yCAAyC;CACvD,CAAC;AAEF;;;wFAGwF;AACxF,MAAM,UAAU,oBAAoB,CAAC,IAAe;IAClD,OAAO,iBAAiB,IAAI,EAAE,CAAC;AACjC,CAAC;AAED;6CAC6C;AAC7C,MAAM,CAAC,MAAM,yBAAyB,GAAwB,IAAI,GAAG,CACnE,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAClE,CAAC;AAEF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * GENERATED by scripts/gen-sprite.ts — DO NOT EDIT. Run `bun run gen:sprite`.
3
+ * The build-time SVG spritesheet `[11.7]` (design §3.4). Mount <SpriteSheet/>
4
+ * once near the app root; reference glyphs by id via <Sprite name=…> (icon/sprite).
5
+ */
6
+ import type { JSX } from "react";
7
+ export declare const SPRITE_PREFIX = "ch-sprite-";
8
+ /** The domain glyph ids baked into the sheet (sorted). */
9
+ export type SpriteName = "file" | "folder";
10
+ export declare const SPRITE_IDS: readonly SpriteName[];
11
+ /** Hidden <symbol> defs — mount ONCE (e.g. at the panel root). */
12
+ export declare function SpriteSheet(): JSX.Element;
13
+ //# sourceMappingURL=sprite-sheet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sprite-sheet.d.ts","sourceRoot":"","sources":["../../src/icon/sprite-sheet.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAEjC,eAAO,MAAM,aAAa,eAAe,CAAC;AAE1C,0DAA0D;AAC1D,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;AAC3C,eAAO,MAAM,UAAU,EAAE,SAAS,UAAU,EAAuB,CAAC;AAEpE,kEAAkE;AAClE,wBAAgB,WAAW,IAAI,GAAG,CAAC,OAAO,CAOzC"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export const SPRITE_PREFIX = "ch-sprite-";
3
+ export const SPRITE_IDS = ["file", "folder"];
4
+ /** Hidden <symbol> defs — mount ONCE (e.g. at the panel root). */
5
+ export function SpriteSheet() {
6
+ return (_jsxs("svg", { width: 0, height: 0, "aria-hidden": "true", focusable: "false", style: { position: "absolute" }, children: [_jsxs("symbol", { id: `${SPRITE_PREFIX}file`, viewBox: "0 0 16 16", children: [_jsx("path", { d: "M4 2h5l3 3v9H4z" }), _jsx("path", { d: "M9 2v3h3" })] }), _jsx("symbol", { id: `${SPRITE_PREFIX}folder`, viewBox: "0 0 16 16", children: _jsx("path", { d: "M2 4h4l1.5 1.5H14v8H2z" }) })] }));
7
+ }
8
+ //# sourceMappingURL=sprite-sheet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sprite-sheet.js","sourceRoot":"","sources":["../../src/icon/sprite-sheet.tsx"],"names":[],"mappings":";AAOA,MAAM,CAAC,MAAM,aAAa,GAAG,YAAY,CAAC;AAI1C,MAAM,CAAC,MAAM,UAAU,GAA0B,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAEpE,kEAAkE;AAClE,MAAM,UAAU,WAAW;IACzB,OAAO,CACL,eAAK,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,iBAAc,MAAM,EAAC,SAAS,EAAC,OAAO,EAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,aAC5F,kBAAQ,EAAE,EAAE,GAAG,aAAa,MAAM,EAAE,OAAO,EAAC,WAAW,aAAC,eAAM,CAAC,EAAC,iBAAiB,GAAE,EAAA,eAAM,CAAC,EAAC,UAAU,GAAE,IAAS,EAChH,iBAAQ,EAAE,EAAE,GAAG,aAAa,QAAQ,EAAE,OAAO,EAAC,WAAW,YAAC,eAAM,CAAC,EAAC,wBAAwB,GAAE,GAAS,IACjG,CACP,CAAC;AACJ,CAAC"}
@@ -1,18 +1,30 @@
1
1
  /**
2
- * (7.3 / task 03 — W2) Domain-icon tier — SCAFFOLD `[11.7]`. The high-cardinality
3
- * domain glyphs (Monaco file-type tree, provider logos) will ship as a build-time
4
- * SVG spritesheet (opencode `vite` spritesheet plugin pattern): `src/icons/*.svg`
5
- * → one `<symbol>` sheet a `<use href="#id">` component, so hundreds of glyphs
6
- * cost one request and tree-shake by id.
2
+ * (7.3 / task 03 — W2 + followup) Domain-icon tier `[11.7]` (design §3.4). The
3
+ * build-time SVG spritesheet is now WIRED: `scripts/gen-sprite.ts` reads
4
+ * `src/icons/*.svg` `sprite-sheet.tsx` (one hidden `<symbol>` sheet), and
5
+ * `<Sprite name=…>` references a glyph by id via `<use>`, so high-cardinality
6
+ * domain glyphs (Monaco file-type tree, provider logos) cost one request +
7
+ * tree-shake by id, themed by `currentColor`.
7
8
  *
8
- * Per the W2 scope cut (docs/7.3 §3.4): the build-time plugin + the full
9
- * file-type icon set land with **task 05** (the Monaco file tree that consumes
10
- * them) building them now would pre-create glyphs nothing renders yet. W2 ships
11
- * the CONCRETE, in-use bit only: the git-status indicator below (the IDE git
12
- * surface uses it today). NOT a silent truncationthe file-type set is tracked
13
- * to task 05.
9
+ * SCAFFOLD scope (docs/7.3 §3.4): the mechanism + example glyphs (file/folder) +
10
+ * the in-use `GitStatusIcon`. The FULL file-type set lands with **task 05** (the
11
+ * Monaco file tree that consumes it) tracked, not a silent truncation.
12
+ * (Divergence from opencode's vite virtual-module plugin: a committed generated
13
+ * sheet is build-time-equivalent but safe under `bun test`/`tsc`see gen-sprite.)
14
14
  */
15
15
  import type { LucideProps } from "lucide-react";
16
+ import { type SpriteName } from "./sprite-sheet.js";
17
+ export interface SpriteProps {
18
+ name: SpriteName;
19
+ size?: number;
20
+ className?: string;
21
+ /** Provide for a meaningful glyph; omit to mark decorative (aria-hidden). */
22
+ "aria-label"?: string;
23
+ }
24
+ /** Render a domain glyph from the spritesheet by id. Requires <SpriteSheet/> to
25
+ * be mounted once in the tree (icon/sprite-sheet). */
26
+ export declare function Sprite({ name, size, className, "aria-label": ariaLabel }: SpriteProps): import("react/jsx-runtime").JSX.Element;
27
+ export { SpriteSheet, SPRITE_IDS, type SpriteName } from "./sprite-sheet.js";
16
28
  /** Git working-tree status → a curated chrome glyph + tone token class.
17
29
  * (5-block change-bar density lives in the diff module; this is the tree/sidebar
18
30
  * per-file marker.) */
@@ -1 +1 @@
1
- {"version":3,"file":"sprite.d.ts","sourceRoot":"","sources":["../../src/icon/sprite.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD;;wBAEwB;AACxB,eAAO,MAAM,eAAe;;;;;;CAMqE,CAAC;AAElG,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,MAAM,CAAC;IAC3E,MAAM,EAAE,MAAM,OAAO,eAAe,CAAC;CACtC;AAED,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,kBAAkB,2CAEpE"}
1
+ {"version":3,"file":"sprite.d.ts","sourceRoot":"","sources":["../../src/icon/sprite.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEnE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;uDACuD;AACvD,wBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,IAAS,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,WAAW,2CAa1F;AAED,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE7E;;wBAEwB;AACxB,eAAO,MAAM,eAAe;;;;;;CAMqE,CAAC;AAElG,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,MAAM,CAAC;IAC3E,MAAM,EAAE,MAAM,OAAO,eAAe,CAAC;CACtC;AAED,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,kBAAkB,2CAEpE"}
@@ -1,5 +1,12 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { Icon } from "./icon.js";
3
+ import { SPRITE_PREFIX } from "./sprite-sheet.js";
4
+ /** Render a domain glyph from the spritesheet by id. Requires <SpriteSheet/> to
5
+ * be mounted once in the tree (icon/sprite-sheet). */
6
+ export function Sprite({ name, size = 16, className, "aria-label": ariaLabel }) {
7
+ return (_jsx("svg", { width: size, height: size, className: className, role: ariaLabel ? "img" : undefined, "aria-label": ariaLabel, "aria-hidden": ariaLabel ? undefined : true, children: _jsx("use", { href: `#${SPRITE_PREFIX}${name}` }) }));
8
+ }
9
+ export { SpriteSheet, SPRITE_IDS } from "./sprite-sheet.js";
3
10
  /** Git working-tree status → a curated chrome glyph + tone token class.
4
11
  * (5-block change-bar density lives in the diff module; this is the tree/sidebar
5
12
  * per-file marker.) */
@@ -1 +1 @@
1
- {"version":3,"file":"sprite.js","sourceRoot":"","sources":["../../src/icon/sprite.tsx"],"names":[],"mappings":";AAeA,OAAO,EAAE,IAAI,EAAiB,MAAM,WAAW,CAAC;AAEhD;;wBAEwB;AACxB,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,KAAK,EAAE,MAAM;IACb,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,OAAO;IAChB,SAAS,EAAE,YAAY;IACvB,OAAO,EAAE,eAAe;CACuE,CAAC;AAMlG,MAAM,UAAU,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAsB;IACnE,OAAO,KAAC,IAAI,IAAC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,KAAM,IAAI,GAAI,CAAC;AAC3D,CAAC"}
1
+ {"version":3,"file":"sprite.js","sourceRoot":"","sources":["../../src/icon/sprite.tsx"],"names":[],"mappings":";AAeA,OAAO,EAAE,IAAI,EAAiB,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,aAAa,EAAmB,MAAM,mBAAmB,CAAC;AAUnE;uDACuD;AACvD,MAAM,UAAU,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAe;IACzF,OAAO,CACL,cACE,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,IAAI,EACZ,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,gBACvB,SAAS,iBACR,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,YAEzC,cAAK,IAAI,EAAE,IAAI,aAAa,GAAG,IAAI,EAAE,GAAI,GACrC,CACP,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,UAAU,EAAmB,MAAM,mBAAmB,CAAC;AAE7E;;wBAEwB;AACxB,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,KAAK,EAAE,MAAM;IACb,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,OAAO;IAChB,SAAS,EAAE,YAAY;IACvB,OAAO,EAAE,eAAe;CACuE,CAAC;AAMlG,MAAM,UAAU,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAsB;IACnE,OAAO,KAAC,IAAI,IAAC,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,KAAM,IAAI,GAAI,CAAC;AAC3D,CAAC"}
package/dist/index.d.ts CHANGED
@@ -17,9 +17,11 @@ export { Text, text, type TextProps, type TextVariants } from "./primitives/text
17
17
  export { Button, button, type ButtonProps, type ButtonVariants } from "./primitives/button.js";
18
18
  export { Card } from "./primitives/card.js";
19
19
  export { ScrollArea } from "./primitives/scroll-area.js";
20
+ export { Tabs, type TabItem, type TabsProps } from "./primitives/tabs.js";
20
21
  export { StatusBadge, statusBadge, type StatusBadgeProps, type StatusBadgeVariants } from "./primitives/status-badge.js";
21
22
  export { Icon, ICON_REGISTRY, type IconName, type IconProps } from "./icon/icon.js";
22
23
  export { GitStatusIcon, GIT_STATUS_ICON, type GitStatusIconProps } from "./icon/sprite.js";
24
+ export { Sprite, SpriteSheet, SPRITE_IDS, type SpriteName, type SpriteProps } from "./icon/sprite.js";
23
25
  export { HEROUI_BASE_VAR_MAP, HEROUI_BASE_VARS_UNMAPPED, heroUiThemeClassName, } from "./heroui-theme.js";
24
26
  export { ChangeBar, changeBarBlocks, type ChangeBarProps, type ChangeBarBlocks } from "./diff/change-bar.js";
25
27
  export { seedThemeToMonaco, type MonacoThemeData, type MonacoTokenRule } from "./diff/monaco-theme.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAI9E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACpG,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAGzH,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAM3F,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC7G,OAAO,EAAE,iBAAiB,EAAE,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAI9E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACpG,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAGzD,OAAO,EAAE,IAAI,EAAE,KAAK,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAGzH,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAG3F,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAMtG,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAI3B,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC7G,OAAO,EAAE,iBAAiB,EAAE,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
package/dist/index.js CHANGED
@@ -19,10 +19,16 @@ export { Text, text } from "./primitives/text.js";
19
19
  export { Button, button } from "./primitives/button.js";
20
20
  export { Card } from "./primitives/card.js";
21
21
  export { ScrollArea } from "./primitives/scroll-area.js";
22
+ // Lightweight self-built Tabs (design §3.2); the HeroUI `Tabs` (richer collection
23
+ // behavior) is the separate `./widgets` entry.
24
+ export { Tabs } from "./primitives/tabs.js";
22
25
  export { StatusBadge, statusBadge } from "./primitives/status-badge.js";
23
26
  // (W2) Icons: typed lucide facade (general tier) + git-status domain glyph.
24
27
  export { Icon, ICON_REGISTRY } from "./icon/icon.js";
25
28
  export { GitStatusIcon, GIT_STATUS_ICON } from "./icon/sprite.js";
29
+ // (followup) build-time SVG spritesheet [11.7]: mount <SpriteSheet/> once, render
30
+ // domain glyphs by id via <Sprite>. Scaffold glyphs; full file-type set → task 05.
31
+ export { Sprite, SpriteSheet, SPRITE_IDS } from "./icon/sprite.js";
26
32
  // (W3a) HeroUI theme wiring — the base-var override map + the panel-root class
27
33
  // helper. HeroUI-FREE (just the map + a kebab string), so it lives in the main
28
34
  // barrel; the HeroUI widget wrappers themselves are the separate `./widgets`
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,cAAc,EAAoB,MAAM,iBAAiB,CAAC;AAE9E,2EAA2E;AAC3E,6EAA6E;AAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAA2C,MAAM,yBAAyB,CAAC;AACpG,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAqC,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAyC,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAmD,MAAM,8BAA8B,CAAC;AAEzH,4EAA4E;AAC5E,OAAO,EAAE,IAAI,EAAE,aAAa,EAAiC,MAAM,gBAAgB,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,eAAe,EAA2B,MAAM,kBAAkB,CAAC;AAE3F,+EAA+E;AAC/E,+EAA+E;AAC/E,6EAA6E;AAC7E,2EAA2E;AAC3E,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAE3B,8EAA8E;AAC9E,4DAA4D;AAC5D,OAAO,EAAE,SAAS,EAAE,eAAe,EAA6C,MAAM,sBAAsB,CAAC;AAC7G,OAAO,EAAE,iBAAiB,EAA8C,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,cAAc,EAAoB,MAAM,iBAAiB,CAAC;AAE9E,2EAA2E;AAC3E,6EAA6E;AAC7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAA2C,MAAM,yBAAyB,CAAC;AACpG,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAqC,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAyC,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,kFAAkF;AAClF,+CAA+C;AAC/C,OAAO,EAAE,IAAI,EAAgC,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,WAAW,EAAmD,MAAM,8BAA8B,CAAC;AAEzH,4EAA4E;AAC5E,OAAO,EAAE,IAAI,EAAE,aAAa,EAAiC,MAAM,gBAAgB,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,eAAe,EAA2B,MAAM,kBAAkB,CAAC;AAC3F,kFAAkF;AAClF,mFAAmF;AACnF,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAqC,MAAM,kBAAkB,CAAC;AAEtG,+EAA+E;AAC/E,+EAA+E;AAC/E,6EAA6E;AAC7E,2EAA2E;AAC3E,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAE3B,8EAA8E;AAC9E,4DAA4D;AAC5D,OAAO,EAAE,SAAS,EAAE,eAAe,EAA6C,MAAM,sBAAsB,CAAC;AAC7G,OAAO,EAAE,iBAAiB,EAA8C,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * (7.3 / task 03 — followup) `motion`-powered high-value animations `[11.8]`
3
+ * (design §3.6). The design's rule is "CSS transitions for 90%, reach for motion
4
+ * ONLY at high-value moments" — these are exactly those two moments:
5
+ * - `AnimatedNumber` — a streaming token-count / context-gauge that springs from
6
+ * its old value to the new one (the live-number moment);
7
+ * - `SlideIn` — mount/unmount slide+fade for transient surfaces (the panel
8
+ * slide-in moment), via `AnimatePresence`.
9
+ *
10
+ * `motion` honours `prefers-reduced-motion` automatically. Browser-safe (no
11
+ * `node:*`); `motion/react` is a normal dep. These live on a separate `./motion`
12
+ * entry so the chrome barrel stays motion-free for consumers that don't need it.
13
+ */
14
+ import { type ReactNode } from "react";
15
+ export interface AnimatedNumberProps {
16
+ value: number;
17
+ className?: string;
18
+ /** Locale for the formatted output (default: host locale). */
19
+ locale?: string;
20
+ }
21
+ /** A number that springs smoothly to `value` as it changes — for live token
22
+ * counts / context gauges. Renders the rounded, locale-formatted value. */
23
+ export declare function AnimatedNumber({ value, className, locale }: AnimatedNumberProps): import("react/jsx-runtime").JSX.Element;
24
+ export interface SlideInProps {
25
+ children: ReactNode;
26
+ /** When false, the child animates out (and unmounts). */
27
+ show?: boolean;
28
+ /** Edge the panel slides from. */
29
+ from?: "right" | "left" | "bottom" | "top";
30
+ className?: string;
31
+ }
32
+ /** Slide + fade a transient surface (drawer/sidebar/notification) in and out. */
33
+ export declare function SlideIn({ children, show, from, className }: SlideInProps): import("react/jsx-runtime").JSX.Element;
34
+ //# sourceMappingURL=animated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animated.d.ts","sourceRoot":"","sources":["../../src/motion/animated.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAIlD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;4EAC4E;AAC5E,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,mBAAmB,2CAO/E;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,SAAS,CAAC;IACpB,yDAAyD;IACzD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,kCAAkC;IAClC,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AASD,iFAAiF;AACjF,wBAAgB,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAW,EAAE,IAAc,EAAE,SAAS,EAAE,EAAE,YAAY,2CAiBzF"}
@@ -0,0 +1,39 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * (7.3 / task 03 — followup) `motion`-powered high-value animations `[11.8]`
4
+ * (design §3.6). The design's rule is "CSS transitions for 90%, reach for motion
5
+ * ONLY at high-value moments" — these are exactly those two moments:
6
+ * - `AnimatedNumber` — a streaming token-count / context-gauge that springs from
7
+ * its old value to the new one (the live-number moment);
8
+ * - `SlideIn` — mount/unmount slide+fade for transient surfaces (the panel
9
+ * slide-in moment), via `AnimatePresence`.
10
+ *
11
+ * `motion` honours `prefers-reduced-motion` automatically. Browser-safe (no
12
+ * `node:*`); `motion/react` is a normal dep. These live on a separate `./motion`
13
+ * entry so the chrome barrel stays motion-free for consumers that don't need it.
14
+ */
15
+ import { useEffect } from "react";
16
+ import { AnimatePresence, motion, useSpring, useTransform } from "motion/react";
17
+ import { cn } from "../cn.js";
18
+ /** A number that springs smoothly to `value` as it changes — for live token
19
+ * counts / context gauges. Renders the rounded, locale-formatted value. */
20
+ export function AnimatedNumber({ value, className, locale }) {
21
+ const spring = useSpring(value, { stiffness: 140, damping: 22, mass: 0.6 });
22
+ const text = useTransform(spring, (v) => Math.round(v).toLocaleString(locale));
23
+ useEffect(() => {
24
+ spring.set(value);
25
+ }, [value, spring]);
26
+ return _jsx(motion.span, { className: cn("tabular-nums", className), children: text });
27
+ }
28
+ const OFFSET = {
29
+ right: { x: 24 },
30
+ left: { x: -24 },
31
+ bottom: { y: 24 },
32
+ top: { y: -24 },
33
+ };
34
+ /** Slide + fade a transient surface (drawer/sidebar/notification) in and out. */
35
+ export function SlideIn({ children, show = true, from = "right", className }) {
36
+ const offset = OFFSET[from];
37
+ return (_jsx(AnimatePresence, { children: show && (_jsx(motion.div, { className: className, initial: { opacity: 0, ...offset }, animate: { opacity: 1, x: 0, y: 0 }, exit: { opacity: 0, ...offset }, transition: { type: "spring", stiffness: 300, damping: 30 }, children: children })) }));
38
+ }
39
+ //# sourceMappingURL=animated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animated.js","sourceRoot":"","sources":["../../src/motion/animated.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,SAAS,EAAkB,MAAM,OAAO,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAS9B;4EAC4E;AAC5E,MAAM,UAAU,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAuB;IAC9E,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5E,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/E,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IACpB,OAAO,KAAC,MAAM,CAAC,IAAI,IAAC,SAAS,EAAE,EAAE,CAAC,cAAc,EAAE,SAAS,CAAC,YAAG,IAAI,GAAe,CAAC;AACrF,CAAC;AAWD,MAAM,MAAM,GAA0E;IACpF,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE;IAChB,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;IAChB,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE;IACjB,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;CAChB,CAAC;AAEF,iFAAiF;AACjF,MAAM,UAAU,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,OAAO,EAAE,SAAS,EAAgB;IACxF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,CACL,KAAC,eAAe,cACb,IAAI,IAAI,CACP,KAAC,MAAM,CAAC,GAAG,IACT,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,MAAM,EAAE,EAClC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EACnC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,MAAM,EAAE,EAC/B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,YAE1D,QAAQ,GACE,CACd,GACe,CACnB,CAAC;AACJ,CAAC"}
@@ -14,7 +14,7 @@ export declare const statusBadge: import("tailwind-variants").TVReturnType<{
14
14
  error: string;
15
15
  neutral: string;
16
16
  };
17
- }, undefined, "inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium", {
17
+ }, undefined, "inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium transition-colors", {
18
18
  tone: {
19
19
  plan: string;
20
20
  accept: string;
@@ -32,7 +32,7 @@ export declare const statusBadge: import("tailwind-variants").TVReturnType<{
32
32
  error: string;
33
33
  neutral: string;
34
34
  };
35
- }, undefined, "inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium", unknown, unknown, undefined>>;
35
+ }, undefined, "inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium transition-colors", unknown, unknown, undefined>>;
36
36
  export type StatusBadgeVariants = VariantProps<typeof statusBadge>;
37
37
  export interface StatusBadgeProps extends StatusBadgeVariants {
38
38
  children?: ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"status-badge.d.ts","sourceRoot":"","sources":["../../src/primitives/status-badge.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAG1D,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;0HAatB,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,YAAY,CAAC,OAAO,WAAW,CAAC,CAAC;AAEnE,MAAM,WAAW,gBAAiB,SAAQ,mBAAmB;IAC3D,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,gBAAgB,2CAE1E"}
1
+ {"version":3,"file":"status-badge.d.ts","sourceRoot":"","sources":["../../src/primitives/status-badge.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAG1D,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;4IAetB,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,YAAY,CAAC,OAAO,WAAW,CAAC,CAAC;AAEnE,MAAM,WAAW,gBAAiB,SAAQ,mBAAmB;IAC3D,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,gBAAgB,2CAE1E"}
@@ -2,7 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { tv } from "tailwind-variants";
3
3
  import { cn } from "../cn.js";
4
4
  export const statusBadge = tv({
5
- base: "inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium",
5
+ base: "inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium transition-colors",
6
6
  variants: {
7
7
  tone: {
8
8
  plan: "text-plan-mode border border-plan-mode",
@@ -10,6 +10,8 @@ export const statusBadge = tv({
10
10
  success: "text-success border border-success",
11
11
  warning: "text-warning border border-warning",
12
12
  error: "text-error border border-error",
13
+ // text-weak (AA-normal after the neutral-scale repair, §11) + a neutral
14
+ // border — muted but legible at the badge's xs size.
13
15
  neutral: "text-text-weak border border-border-base",
14
16
  },
15
17
  },
@@ -1 +1 @@
1
- {"version":3,"file":"status-badge.js","sourceRoot":"","sources":["../../src/primitives/status-badge.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,EAAE,EAAqB,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAE9B,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;IAC5B,IAAI,EAAE,6EAA6E;IACnF,QAAQ,EAAE;QACR,IAAI,EAAE;YACJ,IAAI,EAAE,wCAAwC;YAC9C,MAAM,EAAE,4CAA4C;YACpD,OAAO,EAAE,oCAAoC;YAC7C,OAAO,EAAE,oCAAoC;YAC7C,KAAK,EAAE,gCAAgC;YACvC,OAAO,EAAE,0CAA0C;SACpD;KACF;IACD,eAAe,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;CACrC,CAAC,CAAC;AASH,MAAM,UAAU,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAoB;IACzE,OAAO,eAAM,SAAS,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,YAAG,QAAQ,GAAQ,CAAC;AAClF,CAAC"}
1
+ {"version":3,"file":"status-badge.js","sourceRoot":"","sources":["../../src/primitives/status-badge.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,EAAE,EAAqB,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAE9B,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;IAC5B,IAAI,EAAE,+FAA+F;IACrG,QAAQ,EAAE;QACR,IAAI,EAAE;YACJ,IAAI,EAAE,wCAAwC;YAC9C,MAAM,EAAE,4CAA4C;YACpD,OAAO,EAAE,oCAAoC;YAC7C,OAAO,EAAE,oCAAoC;YAC7C,KAAK,EAAE,gCAAgC;YACvC,wEAAwE;YACxE,qDAAqD;YACrD,OAAO,EAAE,0CAA0C;SACpD;KACF;IACD,eAAe,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;CACrC,CAAC,CAAC;AASH,MAAM,UAAU,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAoB;IACzE,OAAO,eAAM,SAAS,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,YAAG,QAAQ,GAAQ,CAAC;AAClF,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * (7.3 / task 03 — followup) `Tabs` — the self-built LIGHTWEIGHT tab control
3
+ * `[11.1]` (design §3.2: "Tabs 自建轻量;重 Tabs 用 HeroUI"). For simple segmented
4
+ * views that don't need HeroUI's full overlay/collection machinery — a panel
5
+ * switcher with correct ARIA (`tablist`/`tab`/`tabpanel`, `aria-selected`,
6
+ * `aria-controls`, roving `tabIndex` + ←/→/Home/End keyboard nav) so it clears
7
+ * the a11y gate. Controlled (`selectedId`) or uncontrolled (`defaultSelectedId`).
8
+ * `transition-colors` on the tabs ([11.8] CSS-transition tier). Browser-safe.
9
+ *
10
+ * Reach for the HeroUI `Tabs` (./widgets) when you need its richer collection /
11
+ * orientation / disabled-key behavior; this stays deliberately small.
12
+ */
13
+ import { type ReactNode } from "react";
14
+ export interface TabItem {
15
+ id: string;
16
+ label: ReactNode;
17
+ /** Panel content; rendered only for the active tab. */
18
+ content?: ReactNode;
19
+ }
20
+ export interface TabsProps {
21
+ items: readonly TabItem[];
22
+ /** Controlled active tab id. Omit + use `defaultSelectedId` for uncontrolled. */
23
+ selectedId?: string;
24
+ defaultSelectedId?: string;
25
+ onSelect?: (id: string) => void;
26
+ /** Required: the tablist has no visible label of its own. */
27
+ "aria-label": string;
28
+ className?: string;
29
+ }
30
+ export declare function Tabs({ items, selectedId, defaultSelectedId, onSelect, "aria-label": ariaLabel, className }: TabsProps): import("react/jsx-runtime").JSX.Element;
31
+ //# sourceMappingURL=tabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/primitives/tabs.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAA4D,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAIjG,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,uDAAuD;IACvD,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;IAC1B,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,6DAA6D;IAC7D,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAeD,wBAAgB,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,SAAS,2CAwErH"}
@@ -0,0 +1,70 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * (7.3 / task 03 — followup) `Tabs` — the self-built LIGHTWEIGHT tab control
4
+ * `[11.1]` (design §3.2: "Tabs 自建轻量;重 Tabs 用 HeroUI"). For simple segmented
5
+ * views that don't need HeroUI's full overlay/collection machinery — a panel
6
+ * switcher with correct ARIA (`tablist`/`tab`/`tabpanel`, `aria-selected`,
7
+ * `aria-controls`, roving `tabIndex` + ←/→/Home/End keyboard nav) so it clears
8
+ * the a11y gate. Controlled (`selectedId`) or uncontrolled (`defaultSelectedId`).
9
+ * `transition-colors` on the tabs ([11.8] CSS-transition tier). Browser-safe.
10
+ *
11
+ * Reach for the HeroUI `Tabs` (./widgets) when you need its richer collection /
12
+ * orientation / disabled-key behavior; this stays deliberately small.
13
+ */
14
+ import { useCallback, useId, useRef, useState } from "react";
15
+ import { tv } from "tailwind-variants";
16
+ import { cn } from "../cn.js";
17
+ const tab = tv({
18
+ base: "relative px-3 py-1.5 text-sm font-medium transition-colors outline-none border-b-2 -mb-px focus-visible:ring-2 focus-visible:ring-border-focus rounded-t-sm",
19
+ variants: {
20
+ // Inactive tabs use text-weak (now AA-normal in every theme after the
21
+ // neutral-scale repair, §11) for the proper de-emphasis; active adds weight +
22
+ // the accent underline. Both clear WCAG AA at this sm size.
23
+ active: {
24
+ true: "text-text-base border-accent font-semibold",
25
+ false: "text-text-weak border-transparent hover:text-text-base hover:border-border-base",
26
+ },
27
+ },
28
+ });
29
+ export function Tabs({ items, selectedId, defaultSelectedId, onSelect, "aria-label": ariaLabel, className }) {
30
+ const baseId = useId();
31
+ const isControlled = selectedId != null;
32
+ const [internal, setInternal] = useState(defaultSelectedId ?? items[0]?.id ?? "");
33
+ const active = isControlled ? selectedId : internal;
34
+ const tabRefs = useRef({});
35
+ const select = useCallback((id) => {
36
+ if (!isControlled)
37
+ setInternal(id);
38
+ onSelect?.(id);
39
+ }, [isControlled, onSelect]);
40
+ const onKeyDown = (e) => {
41
+ const idx = items.findIndex((it) => it.id === active);
42
+ if (idx < 0)
43
+ return;
44
+ let next = idx;
45
+ if (e.key === "ArrowRight")
46
+ next = (idx + 1) % items.length;
47
+ else if (e.key === "ArrowLeft")
48
+ next = (idx - 1 + items.length) % items.length;
49
+ else if (e.key === "Home")
50
+ next = 0;
51
+ else if (e.key === "End")
52
+ next = items.length - 1;
53
+ else
54
+ return;
55
+ e.preventDefault();
56
+ const nextId = items[next]?.id;
57
+ if (nextId == null)
58
+ return;
59
+ select(nextId);
60
+ tabRefs.current[nextId]?.focus();
61
+ };
62
+ const activeItem = items.find((it) => it.id === active);
63
+ return (_jsxs("div", { className: cn("flex flex-col", className), children: [_jsx("div", { role: "tablist", "aria-label": ariaLabel, className: "flex flex-row border-b border-border-base", children: items.map((it) => {
64
+ const isActive = it.id === active;
65
+ return (_jsx("button", { ref: (el) => {
66
+ tabRefs.current[it.id] = el;
67
+ }, role: "tab", type: "button", id: `${baseId}-tab-${it.id}`, "aria-selected": isActive, "aria-controls": `${baseId}-panel-${it.id}`, tabIndex: isActive ? 0 : -1, className: tab({ active: isActive }), onClick: () => select(it.id), onKeyDown: onKeyDown, children: it.label }, it.id));
68
+ }) }), activeItem && (_jsx("div", { role: "tabpanel", id: `${baseId}-panel-${activeItem.id}`, "aria-labelledby": `${baseId}-tab-${activeItem.id}`, tabIndex: 0, className: "pt-3 outline-none animate-in fade-in duration-150", children: activeItem.content }))] }));
69
+ }
70
+ //# sourceMappingURL=tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../src/primitives/tabs.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/primitives/text.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAG1D,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+CAqBf,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,IAAI,CAAC,CAAC;AAErD,KAAK,WAAW,GAAG,MAAM,GAAG,GAAG,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,GAAG,QAAQ,CAAC;AAElG,MAAM,WAAW,SAAU,SAAQ,YAAY;IAC7C,EAAE,CAAC,EAAE,WAAW,CAAC;IACjB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,IAAI,CAAC,EAAE,EAAW,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,SAAS,2CAOhH"}
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/primitives/text.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAG1D,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+CA2Bf,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,IAAI,CAAC,CAAC;AAErD,KAAK,WAAW,GAAG,MAAM,GAAG,GAAG,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,GAAG,QAAQ,CAAC;AAElG,MAAM,WAAW,SAAU,SAAQ,YAAY;IAC7C,EAAE,CAAC,EAAE,WAAW,CAAC;IACjB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,IAAI,CAAC,EAAE,EAAW,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,SAAS,2CAOhH"}
@@ -4,6 +4,12 @@ import { cn } from "../cn.js";
4
4
  export const text = tv({
5
5
  base: "",
6
6
  variants: {
7
+ // CONTRAST CONTRACT (engine-measured, see ui-core engine.test WCAG gate):
8
+ // base/weak/strong → WCAG AA-normal (≥4.5) — safe for body copy at any size.
9
+ // weaker → AA-large (≥3.0) — distinguishable secondary/dim text.
10
+ // Guaranteed across every built-in theme × mode by the neutral-scale repair
11
+ // (§11): the text segment is monotonic + meets these floors even in light mode.
12
+ // The Storybook axe gate (scripts/a11y-stories.ts) still backstops misuse.
7
13
  tone: {
8
14
  base: "text-text-base",
9
15
  weak: "text-text-weak",
@@ -1 +1 @@
1
- {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/primitives/text.tsx"],"names":[],"mappings":";AAQA,OAAO,EAAE,EAAE,EAAqB,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAE9B,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;IACrB,IAAI,EAAE,EAAE;IACR,QAAQ,EAAE;QACR,IAAI,EAAE;YACJ,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,gBAAgB;YACtB,MAAM,EAAE,kBAAkB;YAC1B,MAAM,EAAE,kBAAkB;YAC1B,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE,cAAc;YACvB,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE,cAAc;YACvB,UAAU,EAAE,iBAAiB;YAC7B,OAAO,EAAE,EAAE;SACZ;QACD,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE;QACrF,MAAM,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE;QACtG,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE;QACtC,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE;KAC1C;IACD,eAAe,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE;CAChE,CAAC,CAAC;AAcH,MAAM,UAAU,IAAI,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAa;IAC/G,MAAM,IAAI,GAAG,EAAE,CAAC;IAChB,OAAO,CACL,KAAC,IAAI,IAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,CAAC,KAAM,IAAI,YACnF,QAAQ,GACJ,CACR,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/primitives/text.tsx"],"names":[],"mappings":";AAQA,OAAO,EAAE,EAAE,EAAqB,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAE9B,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;IACrB,IAAI,EAAE,EAAE;IACR,QAAQ,EAAE;QACR,0EAA0E;QAC1E,+EAA+E;QAC/E,6EAA6E;QAC7E,4EAA4E;QAC5E,gFAAgF;QAChF,2EAA2E;QAC3E,IAAI,EAAE;YACJ,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,gBAAgB;YACtB,MAAM,EAAE,kBAAkB;YAC1B,MAAM,EAAE,kBAAkB;YAC1B,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE,cAAc;YACvB,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE,cAAc;YACvB,UAAU,EAAE,iBAAiB;YAC7B,OAAO,EAAE,EAAE;SACZ;QACD,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE;QACrF,MAAM,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE;QACtG,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE;QACtC,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE;KAC1C;IACD,eAAe,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE;CAChE,CAAC,CAAC;AAcH,MAAM,UAAU,IAAI,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAa;IAC/G,MAAM,IAAI,GAAG,EAAE,CAAC;IAChB,OAAO,CACL,KAAC,IAAI,IAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,CAAC,KAAM,IAAI,YACnF,QAAQ,GACJ,CACR,CAAC;AACJ,CAAC"}
@@ -12,6 +12,6 @@
12
12
  * model-picker substrate). Self-built chrome (Surface/Text/Button/…) lives in
13
13
  * the main barrel — NOT here — per the two-tier split (design §3.2/§3.3).
14
14
  */
15
- export { Autocomplete, Select, Modal, Drawer, Popover, Menu, Tabs, Tooltip, ListBox, ListBoxItem, ListBoxSection, SearchField, EmptyState, Label, Separator, Spinner, } from "@heroui/react";
15
+ export { Autocomplete, Select, Modal, Drawer, Popover, Menu, Dropdown, Tabs, Tooltip, DatePicker, Calendar, Toast, ToastProvider, toast, ListBox, ListBoxItem, ListBoxSection, SearchField, EmptyState, Label, Separator, Spinner, } from "@heroui/react";
16
16
  export { FilterAutocomplete, type FilterAutocompleteProps } from "./filter-autocomplete.js";
17
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/widgets/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EACL,YAAY,EACZ,MAAM,EACN,KAAK,EACL,MAAM,EACN,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,OAAO,EACP,WAAW,EACX,cAAc,EACd,WAAW,EACX,UAAU,EACV,KAAK,EACL,SAAS,EACT,OAAO,GACR,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/widgets/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EACL,YAAY,EACZ,MAAM,EACN,KAAK,EACL,MAAM,EACN,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,UAAU,EACV,QAAQ,EACR,KAAK,EACL,aAAa,EACb,KAAK,EACL,OAAO,EACP,WAAW,EACX,cAAc,EACd,WAAW,EACX,UAAU,EACV,KAAK,EACL,SAAS,EACT,OAAO,GACR,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -12,6 +12,6 @@
12
12
  * model-picker substrate). Self-built chrome (Surface/Text/Button/…) lives in
13
13
  * the main barrel — NOT here — per the two-tier split (design §3.2/§3.3).
14
14
  */
15
- export { Autocomplete, Select, Modal, Drawer, Popover, Menu, Tabs, Tooltip, ListBox, ListBoxItem, ListBoxSection, SearchField, EmptyState, Label, Separator, Spinner, } from "@heroui/react";
15
+ export { Autocomplete, Select, Modal, Drawer, Popover, Menu, Dropdown, Tabs, Tooltip, DatePicker, Calendar, Toast, ToastProvider, toast, ListBox, ListBoxItem, ListBoxSection, SearchField, EmptyState, Label, Separator, Spinner, } from "@heroui/react";
16
16
  export { FilterAutocomplete } from "./filter-autocomplete.js";
17
17
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/widgets/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EACL,YAAY,EACZ,MAAM,EACN,KAAK,EACL,MAAM,EACN,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,OAAO,EACP,WAAW,EACX,cAAc,EACd,WAAW,EACX,UAAU,EACV,KAAK,EACL,SAAS,EACT,OAAO,GACR,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,kBAAkB,EAAgC,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/widgets/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EACL,YAAY,EACZ,MAAM,EACN,KAAK,EACL,MAAM,EACN,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,UAAU,EACV,QAAQ,EACR,KAAK,EACL,aAAa,EACb,KAAK,EACL,OAAO,EACP,WAAW,EACX,cAAc,EACd,WAAW,EACX,UAAU,EACV,KAAK,EACL,SAAS,EACT,OAAO,GACR,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,kBAAkB,EAAgC,MAAM,0BAA0B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chances-ai/design-system",
3
- "version": "24.1.0",
3
+ "version": "24.3.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -13,6 +13,10 @@
13
13
  "types": "./dist/widgets/index.d.ts",
14
14
  "import": "./dist/widgets/index.js"
15
15
  },
16
+ "./motion": {
17
+ "types": "./dist/motion/animated.d.ts",
18
+ "import": "./dist/motion/animated.js"
19
+ },
16
20
  "./styles": "./src/tokens.css",
17
21
  "./heroui-theme.css": "./src/heroui-theme.css"
18
22
  },
@@ -22,9 +26,10 @@
22
26
  "src/heroui-theme.css"
23
27
  ],
24
28
  "dependencies": {
25
- "@chances-ai/ui-core": "24.1.0",
29
+ "@chances-ai/ui-core": "24.3.0",
26
30
  "clsx": "^2.1.1",
27
31
  "lucide-react": "1.17.0",
32
+ "motion": "12.40.0",
28
33
  "tailwind-merge": "^3.4.0",
29
34
  "tailwind-variants": "^3.2.2"
30
35
  },
@@ -74,8 +79,10 @@
74
79
  "check": "tsc -b",
75
80
  "test": "bun test --timeout 30000",
76
81
  "test:stories": "vitest run",
82
+ "test:a11y": "bun run scripts/a11y-stories.ts",
77
83
  "storybook": "storybook dev -p 6006 --no-open --disable-telemetry",
78
84
  "build:storybook": "storybook build --disable-telemetry",
79
- "gen:theme": "bun ../../scripts/gen-theme-css.ts"
85
+ "gen:theme": "bun ../../scripts/gen-theme-css.ts",
86
+ "gen:sprite": "bun scripts/gen-sprite.ts"
80
87
  }
81
88
  }
@@ -25,6 +25,8 @@
25
25
  --muted: var(--ch-text-weak);
26
26
  --default: var(--ch-bg-weak);
27
27
  --default-foreground: var(--ch-text-base);
28
+ --accent: var(--ch-interactive);
29
+ --accent-foreground: var(--ch-text-on-interactive);
28
30
  --success: var(--ch-success);
29
31
  --success-foreground: var(--ch-text-on-success);
30
32
  --warning: var(--ch-warning);
package/src/tokens.css CHANGED
@@ -56,6 +56,7 @@
56
56
  --color-button-primary: var(--ch-button-primary);
57
57
  --color-button-secondary: var(--ch-button-secondary);
58
58
  --color-button-ghost-hover: var(--ch-button-ghost-hover);
59
+ --color-interactive: var(--ch-interactive);
59
60
  --color-diff-add-surface: var(--ch-diff-add-surface);
60
61
  --color-diff-delete-surface: var(--ch-diff-delete-surface);
61
62
  --color-diff-change-bar-add: var(--ch-diff-change-bar-add);
@@ -71,6 +72,7 @@
71
72
  --color-text-on-success: var(--ch-text-on-success);
72
73
  --color-text-on-error: var(--ch-text-on-error);
73
74
  --color-text-on-warning: var(--ch-text-on-warning);
75
+ --color-text-on-interactive: var(--ch-text-on-interactive);
74
76
  }
75
77
 
76
78
  :root {
@@ -106,8 +108,8 @@
106
108
  --ch-surface-hover: rgb(17,17,17);
107
109
  --ch-surface-active: rgb(22,22,22);
108
110
  --ch-text-base: rgb(255,255,255);
109
- --ch-text-weak: rgb(98,98,98);
110
- --ch-text-weaker: rgb(73,73,73);
111
+ --ch-text-weak: rgb(122,122,122);
112
+ --ch-text-weaker: rgb(105,105,105);
111
113
  --ch-text-strong: rgb(240,240,240);
112
114
  --ch-border-base: rgb(85,85,85);
113
115
  --ch-border-weak: rgb(22,22,22);
@@ -118,13 +120,14 @@
118
120
  --ch-input-hover: rgb(17,17,17);
119
121
  --ch-input-focus: rgb(36,46,157);
120
122
  --ch-input-disabled: rgb(22,22,22);
121
- --ch-icon-base: rgb(127,127,127);
123
+ --ch-icon-base: rgb(134,134,134);
122
124
  --ch-icon-weak: rgb(52,52,52);
123
125
  --ch-icon-strong: rgb(240,240,240);
124
126
  --ch-icon-disabled: rgb(39,39,39);
125
127
  --ch-button-primary: rgb(240,240,240);
126
128
  --ch-button-secondary: rgb(17,17,17);
127
129
  --ch-button-ghost-hover: rgb(17,17,17);
130
+ --ch-interactive: rgb(85,111,246);
128
131
  --ch-diff-add-surface: rgb(0,20,5);
129
132
  --ch-diff-delete-surface: rgb(36,0,9);
130
133
  --ch-diff-change-bar-add: rgb(22,108,57);
@@ -140,4 +143,5 @@
140
143
  --ch-text-on-success: rgb(0,0,0);
141
144
  --ch-text-on-error: rgb(0,0,0);
142
145
  --ch-text-on-warning: rgb(0,0,0);
146
+ --ch-text-on-interactive: rgb(0,0,0);
143
147
  }