@nadicodeai/ui 0.8.0 → 0.10.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 +3 -1
- package/README.md +1 -0
- package/dist/components/ai-elements/commit.d.ts.map +1 -1
- package/dist/components/ai-elements/commit.js +3 -1
- package/dist/components/ai-elements/file-tree.d.ts.map +1 -1
- package/dist/components/ai-elements/file-tree.js +5 -3
- package/dist/components/ai-elements/stack-trace.d.ts.map +1 -1
- package/dist/components/ai-elements/stack-trace.js +3 -1
- package/dist/components/automation-section.d.ts.map +1 -1
- package/dist/components/automation-section.js +1 -1
- package/dist/components/chart-breakdown-table.d.ts +10 -1
- package/dist/components/chart-breakdown-table.d.ts.map +1 -1
- package/dist/components/chart-breakdown-table.js +9 -5
- package/dist/components/chart-date-range-control.d.ts +6 -1
- package/dist/components/chart-date-range-control.d.ts.map +1 -1
- package/dist/components/chart-date-range-control.js +7 -2
- package/dist/components/confirm-dialog.d.ts +16 -0
- package/dist/components/confirm-dialog.d.ts.map +1 -0
- package/dist/components/confirm-dialog.js +18 -0
- package/dist/components/input-group.d.ts.map +1 -1
- package/dist/components/input-group.js +3 -1
- package/dist/components/toast.d.ts +3 -0
- package/dist/components/toast.d.ts.map +1 -0
- package/dist/components/toast.js +4 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/use-below-breakpoint.d.ts +3 -0
- package/dist/hooks/use-below-breakpoint.d.ts.map +1 -0
- package/dist/hooks/use-below-breakpoint.js +20 -0
- package/dist/hooks/use-confirm-action.d.ts +17 -0
- package/dist/hooks/use-confirm-action.d.ts.map +1 -0
- package/dist/hooks/use-confirm-action.js +59 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/docs/agents/nadicodeai-ui.md +1 -0
- package/docs/migration/nadia-consumer-readiness.md +100 -0
- package/llms.txt +1 -0
- package/package.json +5 -2
package/AGENTS.md
CHANGED
|
@@ -31,6 +31,7 @@ skills.
|
|
|
31
31
|
- **Reusable sections and compositions live here after proof.** Bento grids, media mounts, demo surfaces, page frames, section intros, CTA bands, proof slots, benefits grids, generic shells, and homepage/use-case sections belong in `@nadicodeai/ui` when a second concrete consumer, a plan-approved shared component, or a named validation slice proves the package boundary. Website, portal, and sibling Nadia routes should pass data and media children into existing compositions instead of rebuilding layout locally.
|
|
32
32
|
- **Brand renderers live here for React consumers.** `BrandMark` is the logo mark, and `BrandWordmark` is the text-only wordmark. A full lockup is exactly one `BrandMark` followed by one `BrandWordmark`; compact mark-only usage uses `BrandMark` alone. These adapters are the only place React code imports the raw `@nadicodeai/design-system/assets/*` logo SVG exports. Website, portal, and sibling routes use these adapters instead of importing logo assets directly, drawing brand SVG inline, masking/recoloring assets, or embedding the mark inside the wordmark.
|
|
33
33
|
- **No fake proof APIs.** Components may support future testimonials, logos, stats, and proof slots, but they must render nothing public when the proof is absent. Do not ship placeholder customer names, metrics, or logos.
|
|
34
|
+
- **Tier-1 accessibility is tested, browser-free.** Every `src/components/**/*.test.tsx` renders its component through `tests/support/a11y.tsx` `expectAccessible(ui, ruleOverrides?)` — a `@testing-library/react` mount checked with raw `axe-core`, the helper owning the full mount/unmount lifecycle — and `tests/guards/a11y-axe-coverage.test.ts` fails the suite if any component test file omits the call (a justified ignore list covers non-rendering tests only). Component test files opt into jsdom per file with a `/** @vitest-environment jsdom */` pragma; the workspace default stays `environment: "node"`, and jsdom is not a browser session, so the browser-free gate rule holds unchanged. This tier is structural only: `color-contrast` and `region` are globally disabled because jsdom computes neither rendered color nor landmark context, and it exercises no runtime focus or keyboard behavior. Rendered contrast, landmark/region context, and focus/keyboard interaction are tier 2 (real-browser axe via Playwright) and are explicitly out of this suite. The library ESLint config (`createLibraryEslintConfig`) additionally enforces seven `eslint-plugin-jsx-a11y` rules at `error` (alt-text, aria-props, aria-proptypes, aria-unsupported-elements, role-has-required-aria-props, role-supports-aria-props, no-noninteractive-element-interactions) as a static complement to the render tier.
|
|
34
35
|
|
|
35
36
|
## Component Admission
|
|
36
37
|
|
|
@@ -115,6 +116,7 @@ Use public component subpaths for product UI:
|
|
|
115
116
|
- `@nadicodeai/ui/components/chart-kpi-stat`
|
|
116
117
|
- `@nadicodeai/ui/components/chart-sparkline`
|
|
117
118
|
- `@nadicodeai/ui/components/chart-time-series`
|
|
119
|
+
- `@nadicodeai/ui/components/confirm-dialog`
|
|
118
120
|
- `@nadicodeai/ui/components/dashboard-shell`
|
|
119
121
|
- `@nadicodeai/ui/components/desktop-shell`
|
|
120
122
|
- `@nadicodeai/ui/components/feedback-state`
|
|
@@ -138,4 +140,4 @@ through `docs/terminal-tui-semantics.md`.
|
|
|
138
140
|
| `npm run build:fast -w @nadicodeai/ui` | One-shot incremental `dist/` refresh for local development after the full package has already been built |
|
|
139
141
|
| `npm run build -w @nadicodeai/ui` | Emit the consumable `dist/` package surface before packing or app builds |
|
|
140
142
|
| `npm pack --dry-run -w @nadicodeai/ui` | Verify exactly what external npm consumers would receive after package surface, export, CSS, docs, or skill changes |
|
|
141
|
-
| `npm run test -w @nadicodeai/ui` | Run this workspace's guards (browser-free; also runs inside the root `npm run test` gate) |
|
|
143
|
+
| `npm run test -w @nadicodeai/ui` | Run this workspace's guards plus the per-file jsdom + axe-core tier-1 accessibility checks (browser-free; also runs inside the root `npm run test` gate) |
|
package/README.md
CHANGED
|
@@ -142,6 +142,7 @@ Current product subpaths:
|
|
|
142
142
|
- `@nadicodeai/ui/components/chart-kpi-stat`
|
|
143
143
|
- `@nadicodeai/ui/components/chart-sparkline`
|
|
144
144
|
- `@nadicodeai/ui/components/chart-time-series`
|
|
145
|
+
- `@nadicodeai/ui/components/confirm-dialog`
|
|
145
146
|
- `@nadicodeai/ui/components/dashboard-shell`
|
|
146
147
|
- `@nadicodeai/ui/components/desktop-shell`
|
|
147
148
|
- `@nadicodeai/ui/components/feedback-state`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../../src/components/ai-elements/commit.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAkB,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE/F,OAAO,EAAuB,QAAQ,EAAsC,MAAM,cAAc,CAAC;AACjG,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAG5D,MAAM,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,WAAW,CAAC,CAAC;AAE7D,eAAO,MAAM,MAAM,GAAI,mCAAmC,WAAW,gCAIpE,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE1E,eAAO,MAAM,YAAY,GAAI,mCAAmC,iBAAiB,gCAehF,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,cAAc,CAAC,eAAe,CAAC,CAAC;AAE9D,eAAO,MAAM,UAAU,GAAI,mCAAmC,eAAe,gCAK5E,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAAC,eAAe,CAAC,CAAC;AAEjE,eAAO,MAAM,aAAa,GAAI,mCAAmC,kBAAkB,gCAIlF,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;AAEjE,eAAO,MAAM,cAAc,GAAI,mCAAmC,mBAAmB,gCAOpF,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,cAAc,CAAC,eAAe,CAAC,CAAC;AAEnE,eAAO,MAAM,eAAe,GAAI,mCAAmC,oBAAoB,gCAItF,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;AAE7D,eAAO,MAAM,UAAU,GAAI,mCAAmC,eAAe,gCAI5E,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;AAE/D,eAAO,MAAM,YAAY,GAAI,mCAAmC,iBAAiB,gCAIhF,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,cAAc,CAAC,OAAO,MAAM,CAAC,GAAG;IACpE,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,mCAAmC,uBAAuB,gCAI5F,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,cAAc,CAAC,eAAe,CAAC,GAAG;IACnE,IAAI,EAAE,IAAI,CAAC;CACZ,CAAC;AAWF,eAAO,MAAM,eAAe,GAAI,yCAAyC,oBAAoB,gCAgB5F,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;AAKhE,eAAO,MAAM,aAAa,GAAI,mCAAmC,kBAAkB,
|
|
1
|
+
{"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../../src/components/ai-elements/commit.tsx"],"names":[],"mappings":"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"}
|
|
@@ -34,7 +34,9 @@ export const CommitTimestamp = ({ date, className, children, ...props }) => {
|
|
|
34
34
|
};
|
|
35
35
|
const handleActionsClick = (e) => e.stopPropagation();
|
|
36
36
|
const handleActionsKeyDown = (e) => e.stopPropagation();
|
|
37
|
-
export const CommitActions = ({ className, children, ...props }) => (
|
|
37
|
+
export const CommitActions = ({ className, children, ...props }) => (
|
|
38
|
+
// eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- The group only intercepts bubbled events from its interactive child controls so the parent commit is not activated.
|
|
39
|
+
_jsx("div", { className: cn("flex items-center gap-1", className), onClick: handleActionsClick, onKeyDown: handleActionsKeyDown, role: "group", ...props, children: children }));
|
|
38
40
|
export const CommitCopyButton = ({ hash, onCopy, onError, timeout = 2000, children, className, ...props }) => {
|
|
39
41
|
const [isCopied, setIsCopied] = useState(false);
|
|
40
42
|
const timeoutRef = useRef(0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-tree.d.ts","sourceRoot":"","sources":["../../../src/components/ai-elements/file-tree.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAoBvD,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,GAAG;IAC7E,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;CACpD,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,4HAStB,aAAa,gCAkCf,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,eAAe,CAAC,CAAC;AAEhE,eAAO,MAAM,YAAY,GAAI,mCAAmC,iBAAiB,gCAIhF,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,eAAe,CAAC,CAAC;AAEhE,eAAO,MAAM,YAAY,GAAI,mCAAmC,iBAAiB,gCAIhF,CAAC;AAcF,MAAM,MAAM,mBAAmB,GAAG,cAAc,CAAC,cAAc,CAAC,GAAG;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,+CAM5B,mBAAmB,
|
|
1
|
+
{"version":3,"file":"file-tree.d.ts","sourceRoot":"","sources":["../../../src/components/ai-elements/file-tree.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAoBvD,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,GAAG;IAC7E,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;CACpD,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,4HAStB,aAAa,gCAkCf,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,eAAe,CAAC,CAAC;AAEhE,eAAO,MAAM,YAAY,GAAI,mCAAmC,iBAAiB,gCAIhF,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,eAAe,CAAC,CAAC;AAEhE,eAAO,MAAM,YAAY,GAAI,mCAAmC,iBAAiB,gCAIhF,CAAC;AAcF,MAAM,MAAM,mBAAmB,GAAG,cAAc,CAAC,cAAc,CAAC,GAAG;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,+CAM5B,mBAAmB,gCAoErB,CAAC;AAYF,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,cAAc,CAAC,GAAG;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,qDAO1B,iBAAiB,gCA+CnB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;AAIlE,eAAO,MAAM,eAAe,GAAI,mCAAmC,oBAAoB,gCAWtF,CAAC"}
|
|
@@ -47,7 +47,7 @@ export const FileTreeFolder = ({ path, name, className, children, ...props }) =>
|
|
|
47
47
|
onSelect?.(path);
|
|
48
48
|
}, [onSelect, path]);
|
|
49
49
|
const folderContextValue = useMemo(() => ({ isExpanded, name, path }), [isExpanded, name, path]);
|
|
50
|
-
return (_jsx(FileTreeFolderContext.Provider, { value: folderContextValue, children: _jsx(Collapsible, { onOpenChange: handleOpenChange, open: isExpanded, children: _jsxs("div", { className: cn("", className), role: "treeitem", tabIndex: 0, ...props, children: [_jsxs("div", { className: cn("flex w-full items-center gap-1 rounded px-2 py-1 text-left transition-colors hover:bg-muted/50", isSelected && "bg-muted"), children: [_jsx(CollapsibleTrigger, { render: _jsx("button", { className: "flex shrink-0 cursor-pointer items-center border-none bg-transparent p-0", type: "button", children: _jsx(ChevronRightIcon, { className: cn("size-4 shrink-0 text-muted-foreground transition-transform", isExpanded && "rotate-90") }) }) }), _jsxs("button", { className: "flex min-w-0 flex-1 cursor-pointer items-center gap-1 border-none bg-transparent p-0 text-left", onClick: handleSelect, type: "button", children: [_jsx(FileTreeIcon, { children: isExpanded ? (_jsx(FolderOpenIcon, { className: "size-4 text-[var(--nc-link-deep)]" })) : (_jsx(FolderIcon, { className: "size-4 text-[var(--nc-link-deep)]" })) }), _jsx(FileTreeName, { children: name })] })] }), _jsx(CollapsibleContent, { children: _jsx("div", { className: "ml-4 border-l pl-2", children: children }) })] }) }) }));
|
|
50
|
+
return (_jsx(FileTreeFolderContext.Provider, { value: folderContextValue, children: _jsx(Collapsible, { onOpenChange: handleOpenChange, open: isExpanded, children: _jsxs("div", { "aria-selected": isSelected, className: cn("", className), role: "treeitem", tabIndex: 0, ...props, children: [_jsxs("div", { className: cn("flex w-full items-center gap-1 rounded px-2 py-1 text-left transition-colors hover:bg-muted/50", isSelected && "bg-muted"), children: [_jsx(CollapsibleTrigger, { render: _jsx("button", { className: "flex shrink-0 cursor-pointer items-center border-none bg-transparent p-0", type: "button", children: _jsx(ChevronRightIcon, { className: cn("size-4 shrink-0 text-muted-foreground transition-transform", isExpanded && "rotate-90") }) }) }), _jsxs("button", { className: "flex min-w-0 flex-1 cursor-pointer items-center gap-1 border-none bg-transparent p-0 text-left", onClick: handleSelect, type: "button", children: [_jsx(FileTreeIcon, { children: isExpanded ? (_jsx(FolderOpenIcon, { className: "size-4 text-[var(--nc-link-deep)]" })) : (_jsx(FolderIcon, { className: "size-4 text-[var(--nc-link-deep)]" })) }), _jsx(FileTreeName, { children: name })] })] }), _jsx(CollapsibleContent, { children: _jsx("div", { className: "ml-4 border-l pl-2", children: children }) })] }) }) }));
|
|
51
51
|
};
|
|
52
52
|
const FileTreeFileContext = createContext({
|
|
53
53
|
name: "",
|
|
@@ -65,7 +65,9 @@ export const FileTreeFile = ({ path, name, icon, className, children, ...props }
|
|
|
65
65
|
}
|
|
66
66
|
}, [onSelect, path]);
|
|
67
67
|
const fileContextValue = useMemo(() => ({ name, path }), [name, path]);
|
|
68
|
-
return (_jsx(FileTreeFileContext.Provider, { value: fileContextValue, children: _jsx("div", { className: cn("flex cursor-pointer items-center gap-1 rounded px-2 py-1 transition-colors hover:bg-muted/50", isSelected && "bg-muted", className), onClick: handleClick, onKeyDown: handleKeyDown, role: "treeitem", tabIndex: 0, ...props, children: children ?? (_jsxs(_Fragment, { children: [_jsx("span", { className: "size-4 shrink-0" }), _jsx(FileTreeIcon, { children: icon ?? _jsx(FileIcon, { className: "size-4 text-muted-foreground" }) }), _jsx(FileTreeName, { children: name })] })) }) }));
|
|
68
|
+
return (_jsx(FileTreeFileContext.Provider, { value: fileContextValue, children: _jsx("div", { className: cn("flex cursor-pointer items-center gap-1 rounded px-2 py-1 transition-colors hover:bg-muted/50", isSelected && "bg-muted", className), onClick: handleClick, onKeyDown: handleKeyDown, role: "treeitem", "aria-selected": isSelected, tabIndex: 0, ...props, children: children ?? (_jsxs(_Fragment, { children: [_jsx("span", { className: "size-4 shrink-0" }), _jsx(FileTreeIcon, { children: icon ?? _jsx(FileIcon, { className: "size-4 text-muted-foreground" }) }), _jsx(FileTreeName, { children: name })] })) }) }));
|
|
69
69
|
};
|
|
70
70
|
const stopPropagation = (e) => e.stopPropagation();
|
|
71
|
-
export const FileTreeActions = ({ className, children, ...props }) => (
|
|
71
|
+
export const FileTreeActions = ({ className, children, ...props }) => (
|
|
72
|
+
// eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- The group only intercepts bubbled events from its interactive child controls so the parent tree item is not activated.
|
|
73
|
+
_jsx("div", { className: cn("ml-auto flex items-center gap-1", className), onClick: stopPropagation, onKeyDown: stopPropagation, role: "group", ...props, children: children }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stack-trace.d.ts","sourceRoot":"","sources":["../../../src/components/ai-elements/stack-trace.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAe,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAG/F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AA4I5C,MAAM,MAAM,eAAe,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9E,CAAC;AAEF,eAAO,MAAM,UAAU,mIAUlB,eAAe,iCAkCnB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,cAAc,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9E,eAAO,MAAM,gBAAgB,0EAA4C,qBAAqB,iCAqB5F,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;AAEzD,eAAO,MAAM,eAAe,0EAA4C,oBAAoB,iCAK1F,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;AAE9D,eAAO,MAAM,mBAAmB,0EACM,wBAAwB,iCAS7D,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;AAEjE,eAAO,MAAM,sBAAsB,0EACG,2BAA2B,iCAShE,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;AAS3D,eAAO,MAAM,iBAAiB,0EACQ,sBAAsB,
|
|
1
|
+
{"version":3,"file":"stack-trace.d.ts","sourceRoot":"","sources":["../../../src/components/ai-elements/stack-trace.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAe,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAG/F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AA4I5C,MAAM,MAAM,eAAe,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9E,CAAC;AAEF,eAAO,MAAM,UAAU,mIAUlB,eAAe,iCAkCnB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,cAAc,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9E,eAAO,MAAM,gBAAgB,0EAA4C,qBAAqB,iCAqB5F,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;AAEzD,eAAO,MAAM,eAAe,0EAA4C,oBAAoB,iCAK1F,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;AAE9D,eAAO,MAAM,mBAAmB,0EACM,wBAAwB,iCAS7D,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;AAEjE,eAAO,MAAM,sBAAsB,0EACG,2BAA2B,iCAShE,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;AAS3D,eAAO,MAAM,iBAAiB,0EACQ,sBAAsB,iCAY3D,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,cAAc,CAAC,OAAO,MAAM,CAAC,GAAG;IACtE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,oBAAoB,oGAQ5B,yBAAyB,iCA0C7B,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;AAEhE,eAAO,MAAM,sBAAsB,gEACP,2BAA2B,iCActD,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,cAAc,CAAC,OAAO,kBAAkB,CAAC,GAAG;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,iBAAiB,qFACyB,sBAAsB,iCAmB5E,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG;IAC1D,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAqCF,eAAO,MAAM,gBAAgB,oFAC0B,qBAAqB,iCAyC3E,CAAC"}
|
|
@@ -130,7 +130,9 @@ const handleActionsKeyDown = (e) => {
|
|
|
130
130
|
e.stopPropagation();
|
|
131
131
|
}
|
|
132
132
|
};
|
|
133
|
-
export const StackTraceActions = memo(({ className, children, ...props }) => (
|
|
133
|
+
export const StackTraceActions = memo(({ className, children, ...props }) => (
|
|
134
|
+
// eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- The group only intercepts bubbled events from its interactive child controls so the parent stack frame is not activated.
|
|
135
|
+
_jsx("div", { className: cn("flex shrink-0 items-center gap-1", className), onClick: handleActionsClick, onKeyDown: handleActionsKeyDown, role: "group", ...props, children: children })));
|
|
134
136
|
export const StackTraceCopyButton = memo(({ onCopy, onError, timeout = 2000, className, children, ...props }) => {
|
|
135
137
|
const [isCopied, setIsCopied] = useState(false);
|
|
136
138
|
const timeoutRef = useRef(0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automation-section.d.ts","sourceRoot":"","sources":["../../src/components/automation-section.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"automation-section.d.ts","sourceRoot":"","sources":["../../src/components/automation-section.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAW/B,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAU3C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAG/E,KAAK,gBAAgB,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;AAE9E,KAAK,cAAc,GAAG;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,KAAK,sBAAsB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,GAAG;IAC7E,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,gBAAgB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACnC,yBAAyB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7E,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AAEF,KAAK,uBAAuB,GAAG;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;IAClD,OAAO,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,aAAa,CAAC,CAAC,UAAU,CAAC,CAAC;CAClE,CAAC;AAEF,KAAK,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,EAAE,UAAU,CAAC,GAAG;IAC5F,MAAM,EAAE,uBAAuB,EAAE,CAAC;CACnC,CAAC;AAEF,KAAK,eAAe,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;AAErE,KAAK,gBAAgB,GAAG;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEF,KAAK,sBAAsB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,EAAE,UAAU,CAAC,GAAG;IAC7F,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,qBAAqB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACtE,CAAC;AAEF,KAAK,wBAAwB,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC;AAErE,KAAK,0BAA0B,GAAG;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,wBAAwB,CAAC;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEF,KAAK,iCAAiC,GAAG,IAAI,CAC3C,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,EAC5C,UAAU,CACX,GAAG;IACF,SAAS,EAAE,0BAA0B,EAAE,CAAC;CACzC,CAAC;AAwDF,iBAAS,iBAAiB,CAAC,EACzB,KAAK,EACL,WAAW,EACX,OAAO,EACP,WAAgB,EAChB,UAAwC,EACxC,gBAA0F,EAC1F,yBAAyB,EACzB,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,sBAAsB,qBAwFxB;AA4BD,iBAAS,gBAAgB,CAAC,EACxB,MAAM,EACN,KAA2B,EAC3B,WAA8E,EAC9E,GAAG,KAAK,EACT,EAAE,qBAAqB,qBAQvB;AAED,iBAAS,iBAAiB,CAAC,EACzB,OAAO,EACP,KAAqB,EACrB,WAA6F,EAC7F,qBAAqB,EACrB,GAAG,KAAK,EACT,EAAE,sBAAsB,qBAqCxB;AAED,iBAAS,4BAA4B,CAAC,EACpC,SAAS,EACT,KAA+B,EAC/B,WAAsE,EACtE,GAAG,KAAK,EACT,EAAE,iCAAiC,qBAuCnC;AAED,OAAO,EAAE,iBAAiB,EAAE,4BAA4B,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;AAChG,YAAY,EACV,cAAc,EACd,sBAAsB,EACtB,uBAAuB,EACvB,gBAAgB,EAChB,0BAA0B,EAC1B,wBAAwB,EACxB,iCAAiC,EACjC,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,EACf,qBAAqB,GACtB,CAAC"}
|
|
@@ -49,7 +49,7 @@ const environmentStateMeta = {
|
|
|
49
49
|
function AutomationSection({ title, description, actions, automations = [], emptyTitle = "No automations configured", emptyDescription = "Add automation rows from the consuming app when there is work to run.", onAutomationEnabledChange, children, className, ...props }) {
|
|
50
50
|
return (_jsxs("section", { "data-slot": "automation-section", className: cn("grid gap-5 rounded-lg border bg-background p-5", className), ...props, children: [(title || description || actions) && (_jsxs("div", { "data-slot": "automation-section-header", className: "flex flex-wrap items-start justify-between gap-3", children: [_jsxs("div", { className: "grid gap-1", children: [title && (_jsx("h2", { "data-slot": "automation-section-title", className: "text-base font-semibold", children: title })), description && (_jsx("p", { "data-slot": "automation-section-description", className: "text-sm text-muted-foreground", children: description }))] }), actions && _jsx("div", { "data-slot": "automation-section-actions", children: actions })] })), automations.length > 0 ? (_jsx(ItemGroup, { "data-slot": "automation-section-items", className: "gap-2", children: automations.map((automation) => {
|
|
51
51
|
const status = automation.status ?? "ready";
|
|
52
|
-
return (_jsxs(Item, { "data-slot": "automation-section-item", "data-status": status, "data-enabled": automation.enabled, "data-disabled": automation.disabled ? true : undefined, variant: "outline", children: [_jsx(ItemMedia, { variant: "icon", "aria-hidden": "true", children: automationStatusMeta[status].icon }), _jsxs(ItemContent, { children: [_jsx(ItemTitle, { children: automation.title }), automation.description && (_jsx(ItemDescription, { children: automation.description })), automation.meta && (_jsx("div", { className: "text-sm text-muted-foreground", children: automation.meta }))] }), _jsxs(ItemActions, { children: [_jsx(Badge, { variant: automationStatusMeta[status].variant, children: automationStatusMeta[status].label }), _jsx(Switch, { "aria-label": automation.toggleLabel ?? "Toggle automation", checked: Boolean(automation.enabled), disabled: automation.disabled, onCheckedChange: (enabled) => onAutomationEnabledChange?.(automation.id, enabled) }), automation.actions] })] }, automation.id));
|
|
52
|
+
return (_jsxs(Item, { role: "listitem", "data-slot": "automation-section-item", "data-status": status, "data-enabled": automation.enabled, "data-disabled": automation.disabled ? true : undefined, variant: "outline", children: [_jsx(ItemMedia, { variant: "icon", "aria-hidden": "true", children: automationStatusMeta[status].icon }), _jsxs(ItemContent, { children: [_jsx(ItemTitle, { children: automation.title }), automation.description && (_jsx(ItemDescription, { children: automation.description })), automation.meta && (_jsx("div", { className: "text-sm text-muted-foreground", children: automation.meta }))] }), _jsxs(ItemActions, { children: [_jsx(Badge, { variant: automationStatusMeta[status].variant, children: automationStatusMeta[status].label }), _jsx(Switch, { "aria-label": automation.toggleLabel ?? "Toggle automation", checked: Boolean(automation.enabled), disabled: automation.disabled, onCheckedChange: (enabled) => onAutomationEnabledChange?.(automation.id, enabled) }), automation.actions] })] }, automation.id));
|
|
53
53
|
}) })) : (_jsx(FeedbackState, { "data-slot": "automation-section-empty", status: "empty", title: emptyTitle, description: emptyDescription, compact: true, className: "rounded-md" })), children] }));
|
|
54
54
|
}
|
|
55
55
|
function renderAutomationSettingsField(field) {
|
|
@@ -10,6 +10,9 @@ import { type EntityColorMap } from "./chart-entity-colors";
|
|
|
10
10
|
* bar + share of total, with the entity-color dot resolved from the shared
|
|
11
11
|
* page-context assignment map. `topN` folds the tail into a single
|
|
12
12
|
* "everything else" rollup row on the neutral register — never an extra hue.
|
|
13
|
+
* When the caller has already bounded the read store-side, `otherValue` passes
|
|
14
|
+
* the precomputed tail sum instead: the given entities render as-is (no local
|
|
15
|
+
* fold) and the rollup row and shares account for that tail.
|
|
13
16
|
*/
|
|
14
17
|
type BreakdownEntity = {
|
|
15
18
|
/** Stable entity id — the key the entity-color map assigns by. */
|
|
@@ -17,7 +20,7 @@ type BreakdownEntity = {
|
|
|
17
20
|
label: React.ReactNode;
|
|
18
21
|
value: number;
|
|
19
22
|
};
|
|
20
|
-
declare function BreakdownTable({ entities, entityColorMap, label, topN, valueFormatter, columnLabels, otherLabel, className, ...props }: Omit<React.ComponentProps<typeof Table>, "children"> & {
|
|
23
|
+
declare function BreakdownTable({ entities, entityColorMap, label, topN, otherValue, valueFormatter, columnLabels, otherLabel, className, ...props }: Omit<React.ComponentProps<typeof Table>, "children"> & {
|
|
21
24
|
entities: readonly BreakdownEntity[];
|
|
22
25
|
/** The shared page-context entity-color assignment map. */
|
|
23
26
|
entityColorMap: EntityColorMap;
|
|
@@ -25,6 +28,12 @@ declare function BreakdownTable({ entities, entityColorMap, label, topN, valueFo
|
|
|
25
28
|
label: string;
|
|
26
29
|
/** Keep the top N entities by value; the rest fold into one rollup row. */
|
|
27
30
|
topN?: number;
|
|
31
|
+
/**
|
|
32
|
+
* Precomputed tail sum for a read the caller already bounded store-side. When
|
|
33
|
+
* set, `entities` render as given (no local `topN` fold) and this value backs
|
|
34
|
+
* the neutral rollup row and the share denominator.
|
|
35
|
+
*/
|
|
36
|
+
otherValue?: number;
|
|
28
37
|
valueFormatter?: (value: number) => string;
|
|
29
38
|
columnLabels?: {
|
|
30
39
|
entity?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-breakdown-table.d.ts","sourceRoot":"","sources":["../../src/components/chart-breakdown-table.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EACL,KAAK,EAON,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,kCAAkC,CAAC;AAE1C
|
|
1
|
+
{"version":3,"file":"chart-breakdown-table.d.ts","sourceRoot":"","sources":["../../src/components/chart-breakdown-table.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EACL,KAAK,EAON,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,kCAAkC,CAAC;AAE1C;;;;;;;;;;;;GAYG;AAEH,KAAK,eAAe,GAAG;IACrB,kEAAkE;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAkEF,iBAAS,cAAc,CAAC,EACtB,QAAQ,EACR,cAAc,EACd,KAAK,EACL,IAAI,EACJ,UAAU,EACV,cAA8B,EAC9B,YAAY,EACZ,UAA8B,EAC9B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,KAAK,CAAC,EAAE,UAAU,CAAC,GAAG;IACxD,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAC;IACrC,2DAA2D;IAC3D,cAAc,EAAE,cAAc,CAAC;IAC/B,uEAAuE;IACvE,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3C,YAAY,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnE,wCAAwC;IACxC,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC9B,qBA8CA;AAED,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,YAAY,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -17,11 +17,15 @@ function BreakdownRow({ label, value, share, color, valueFormatter, ...props })
|
|
|
17
17
|
backgroundColor: color,
|
|
18
18
|
} }) }), _jsx("span", { className: "w-12 text-right font-mono text-xs text-muted-foreground tabular-nums", children: formatShare(share) })] }) })] }));
|
|
19
19
|
}
|
|
20
|
-
function BreakdownTable({ entities, entityColorMap, label, topN, valueFormatter = defaultFormat, columnLabels, otherLabel = "Everything else", className, ...props }) {
|
|
21
|
-
const
|
|
20
|
+
function BreakdownTable({ entities, entityColorMap, label, topN, otherValue, valueFormatter = defaultFormat, columnLabels, otherLabel = "Everything else", className, ...props }) {
|
|
21
|
+
const providedOther = otherValue !== undefined;
|
|
22
22
|
const sorted = [...entities].sort((a, b) => b.value - a.value);
|
|
23
|
-
const visible = topN !== undefined && topN < sorted.length ? sorted.slice(0, topN) : sorted;
|
|
24
|
-
const foldedValue =
|
|
25
|
-
|
|
23
|
+
const visible = !providedOther && topN !== undefined && topN < sorted.length ? sorted.slice(0, topN) : sorted;
|
|
24
|
+
const foldedValue = providedOther
|
|
25
|
+
? otherValue
|
|
26
|
+
: sorted.slice(visible.length).reduce((sum, entity) => sum + entity.value, 0);
|
|
27
|
+
const total = sorted.reduce((sum, entity) => sum + entity.value, 0) + (providedOther ? otherValue : 0);
|
|
28
|
+
const showOther = providedOther ? otherValue > 0 : visible.length < sorted.length;
|
|
29
|
+
return (_jsxs(Table, { "data-slot": "breakdown-table", className: cn("text-sm", className), ...props, children: [_jsx(TableCaption, { className: "sr-only", children: label }), _jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: columnLabels?.entity ?? "Entity" }), _jsx(TableHead, { className: "text-right", children: columnLabels?.value ?? "Value" }), _jsx(TableHead, { children: columnLabels?.share ?? "Share of total" })] }) }), _jsxs(TableBody, { children: [visible.map((entity) => (_jsx(BreakdownRow, { label: entity.label, value: entity.value, share: percentOf(entity.value, total), color: entityColor(entityColorMap, entity.id), valueFormatter: valueFormatter }, entity.id))), showOther ? (_jsx(BreakdownRow, { "data-slot": "breakdown-table-other", label: otherLabel, value: foldedValue, share: percentOf(foldedValue, total), color: CHART_ENTITY_OTHER_COLOR, valueFormatter: valueFormatter })) : null] })] }));
|
|
26
30
|
}
|
|
27
31
|
export { BreakdownTable };
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { type DateRangePreset, type DateRangeValue } from "./chart-date-range";
|
|
3
|
-
declare function DateRangeControl({ value, onChange, label, presetLabels, customLabel, className, ...props }: Omit<React.ComponentProps<"div">, "children" | "onChange"> & {
|
|
3
|
+
declare function DateRangeControl({ value, onChange, label, presets, presetLabels, customLabel, className, ...props }: Omit<React.ComponentProps<"div">, "children" | "onChange"> & {
|
|
4
4
|
value: DateRangeValue;
|
|
5
5
|
onChange: (value: DateRangeValue) => void;
|
|
6
6
|
/** Accessible name for the control group. */
|
|
7
7
|
label?: string;
|
|
8
|
+
/**
|
|
9
|
+
* Which preset buttons to render, in order. Defaults to the full codec set;
|
|
10
|
+
* pass a subset to offer fewer presets (the codec enum is unchanged).
|
|
11
|
+
*/
|
|
12
|
+
presets?: readonly DateRangePreset[];
|
|
8
13
|
presetLabels?: Partial<Record<DateRangePreset, string>>;
|
|
9
14
|
customLabel?: string;
|
|
10
15
|
}): React.JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-date-range-control.d.ts","sourceRoot":"","sources":["../../src/components/chart-date-range-control.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAQ/B,OAAO,EAIL,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"chart-date-range-control.d.ts","sourceRoot":"","sources":["../../src/components/chart-date-range-control.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAQ/B,OAAO,EAIL,KAAK,eAAe,EACpB,KAAK,cAAc,EACpB,MAAM,+BAA+B,CAAC;AA0BvC,iBAAS,gBAAgB,CAAC,EACxB,KAAK,EACL,QAAQ,EACR,KAAoB,EACpB,OAA4B,EAC5B,YAAY,EACZ,WAAsB,EACtB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC,GAAG;IAC9D,KAAK,EAAE,cAAc,CAAC;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IAC1C,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACrC,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,qBA2EA;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -17,6 +17,11 @@ import { DATE_RANGE_PRESETS, formatIsoDay, parseIsoDay, } from "./chart-date-ran
|
|
|
17
17
|
* `chart-date-range` (kept in a separate server-safe module because the
|
|
18
18
|
* package owns no routing). Preset buttons expose their pressed state via
|
|
19
19
|
* `aria-pressed`.
|
|
20
|
+
*
|
|
21
|
+
* `presets` narrows which preset buttons render (in the order given), defaulting
|
|
22
|
+
* to the full codec set. It only filters the rendered buttons — the codec enum
|
|
23
|
+
* (`DATE_RANGE_PRESETS`) is unchanged, so a URL arriving with an un-offered but
|
|
24
|
+
* valid preset token still decodes; the consumer decides its fallback.
|
|
20
25
|
*/
|
|
21
26
|
const DEFAULT_PRESET_LABELS = {
|
|
22
27
|
"7d": "7d",
|
|
@@ -24,7 +29,7 @@ const DEFAULT_PRESET_LABELS = {
|
|
|
24
29
|
"30d": "30d",
|
|
25
30
|
cycle: "This cycle",
|
|
26
31
|
};
|
|
27
|
-
function DateRangeControl({ value, onChange, label = "Date range", presetLabels, customLabel = "Custom", className, ...props }) {
|
|
32
|
+
function DateRangeControl({ value, onChange, label = "Date range", presets = DATE_RANGE_PRESETS, presetLabels, customLabel = "Custom", className, ...props }) {
|
|
28
33
|
const [open, setOpen] = React.useState(false);
|
|
29
34
|
const [pending, setPending] = React.useState(undefined);
|
|
30
35
|
const isCustom = value.kind === "custom";
|
|
@@ -49,7 +54,7 @@ function DateRangeControl({ value, onChange, label = "Date range", presetLabels,
|
|
|
49
54
|
}
|
|
50
55
|
setPending(range);
|
|
51
56
|
}
|
|
52
|
-
return (_jsxs("div", { "data-slot": "date-range-control", role: "group", "aria-label": label, className: cn("flex flex-wrap items-center gap-1", className), ...props, children: [
|
|
57
|
+
return (_jsxs("div", { "data-slot": "date-range-control", role: "group", "aria-label": label, className: cn("flex flex-wrap items-center gap-1", className), ...props, children: [presets.map((preset) => {
|
|
53
58
|
const active = value.kind === "preset" && value.preset === preset;
|
|
54
59
|
return (_jsx(Button, { size: "sm", variant: active ? "secondary" : "ghost", "aria-pressed": active, onClick: () => onChange({ kind: "preset", preset }), children: presetLabels?.[preset] ?? DEFAULT_PRESET_LABELS[preset] }, preset));
|
|
55
60
|
}), _jsxs(Popover, { open: open, onOpenChange: handleOpenChange, children: [_jsx(PopoverTrigger, { render: _jsxs(Button, { size: "sm", variant: isCustom ? "secondary" : "ghost", "aria-pressed": isCustom, children: [_jsx(CalendarIcon, { "data-icon": "inline-start" }), isCustom ? `${value.from} – ${value.to}` : customLabel] }) }), _jsx(PopoverContent, { align: "start", className: "w-auto p-0", children: _jsx(Calendar, { mode: "range", numberOfMonths: 2, defaultMonth: selected?.from, selected: selected, onSelect: handleSelect }) })] })] }));
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
interface ConfirmDialogProps {
|
|
3
|
+
open: boolean;
|
|
4
|
+
onConfirm: () => void;
|
|
5
|
+
onCancel: () => void;
|
|
6
|
+
title: React.ReactNode;
|
|
7
|
+
description?: React.ReactNode;
|
|
8
|
+
confirmLabel?: React.ReactNode;
|
|
9
|
+
cancelLabel?: React.ReactNode;
|
|
10
|
+
destructive?: boolean;
|
|
11
|
+
loading?: boolean;
|
|
12
|
+
}
|
|
13
|
+
declare function ConfirmDialog({ open, onConfirm, onCancel, title, description, confirmLabel, cancelLabel, destructive, loading, }: ConfirmDialogProps): React.JSX.Element;
|
|
14
|
+
export { ConfirmDialog };
|
|
15
|
+
export type { ConfirmDialogProps };
|
|
16
|
+
//# sourceMappingURL=confirm-dialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirm-dialog.d.ts","sourceRoot":"","sources":["../../src/components/confirm-dialog.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAapC,UAAU,kBAAkB;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAOD,iBAAS,aAAa,CAAC,EACrB,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,KAAK,EACL,WAAW,EACX,YAAwB,EACxB,WAAsB,EACtB,WAAmB,EACnB,OAAe,GAChB,EAAE,kBAAkB,qBA+BpB;AAED,OAAO,EAAE,aAAa,EAAE,CAAC;AACzB,YAAY,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { AlertDialog, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "./alert-dialog.js";
|
|
4
|
+
import { Button } from "./button.js";
|
|
5
|
+
import { Spinner } from "./spinner.js";
|
|
6
|
+
// Fully controlled confirm dialog over the registry AlertDialog parts. The
|
|
7
|
+
// confirm action is a plain Button (not AlertDialogAction) so a failed confirm
|
|
8
|
+
// can keep the dialog open; the only closing gesture is Escape (alert dialogs
|
|
9
|
+
// take no backdrop dismissal), which routes through onCancel, and loading
|
|
10
|
+
// disables both buttons while the action runs.
|
|
11
|
+
function ConfirmDialog({ open, onConfirm, onCancel, title, description, confirmLabel = "Confirm", cancelLabel = "Cancel", destructive = false, loading = false, }) {
|
|
12
|
+
return (_jsx(AlertDialog, { open: open, onOpenChange: (nextOpen) => {
|
|
13
|
+
if (!nextOpen) {
|
|
14
|
+
onCancel();
|
|
15
|
+
}
|
|
16
|
+
}, children: _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: title }), description ? _jsx(AlertDialogDescription, { children: description }) : null] }), _jsxs(AlertDialogFooter, { children: [_jsx(Button, { variant: "outline", onClick: onCancel, disabled: loading, children: cancelLabel }), _jsxs(Button, { variant: destructive ? "destructive" : "default", onClick: onConfirm, disabled: loading, children: [loading ? _jsx(Spinner, {}) : null, confirmLabel] })] })] }) }));
|
|
17
|
+
}
|
|
18
|
+
export { ConfirmDialog };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-group.d.ts","sourceRoot":"","sources":["../../src/components/input-group.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGlE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAI7C,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAYvE;AAED,QAAA,MAAM,uBAAuB;;8EAiB5B,CAAC;AAEF,iBAAS,eAAe,CAAC,EACvB,SAAS,EACT,KAAsB,EACtB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,OAAO,uBAAuB,CAAC,
|
|
1
|
+
{"version":3,"file":"input-group.d.ts","sourceRoot":"","sources":["../../src/components/input-group.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGlE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAI7C,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAYvE;AAED,QAAA,MAAM,uBAAuB;;8EAiB5B,CAAC;AAEF,iBAAS,eAAe,CAAC,EACvB,SAAS,EACT,KAAsB,EACtB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,OAAO,uBAAuB,CAAC,qBAiB5E;AAED,QAAA,MAAM,wBAAwB;;8EAY5B,CAAC;AAEH,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,IAAe,EACf,OAAiB,EACjB,IAAW,EACX,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,GAC3D,YAAY,CAAC,OAAO,wBAAwB,CAAC,GAAG;IAC9C,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;CACtC,qBAUF;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,qBAU5E;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,qBAW9E;AAED,iBAAS,kBAAkB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,qBAWpF;AAED,OAAO,EACL,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,kBAAkB,GACnB,CAAC"}
|
|
@@ -22,7 +22,9 @@ const inputGroupAddonVariants = cva("flex h-auto cursor-text items-center justif
|
|
|
22
22
|
},
|
|
23
23
|
});
|
|
24
24
|
function InputGroupAddon({ className, align = "inline-start", ...props }) {
|
|
25
|
-
return (
|
|
25
|
+
return (
|
|
26
|
+
// eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions -- Clicking non-button addon content is a pointer convenience that focuses the already keyboard-accessible input; the group may also contain buttons.
|
|
27
|
+
_jsx("div", { role: "group", "data-slot": "input-group-addon", "data-align": align, className: cn(inputGroupAddonVariants({ align }), className), onClick: (e) => {
|
|
26
28
|
if (e.target.closest("button")) {
|
|
27
29
|
return;
|
|
28
30
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../../src/components/toast.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,YAAY,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC"}
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,cAAc,0BAA0B,CAAC;AACzC,cAAc,cAAc,CAAC"}
|
package/dist/hooks/index.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-below-breakpoint.d.ts","sourceRoot":"","sources":["../../src/hooks/use-below-breakpoint.ts"],"names":[],"mappings":"AAMA,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CActD"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
// Strictly-below max-width query for a pixel breakpoint, mirroring
|
|
4
|
+
// use-mobile's `${breakpoint - 1}px` convention: true only under `px`, never at.
|
|
5
|
+
export function belowBreakpointQuery(px) {
|
|
6
|
+
return `(max-width: ${px - 1}px)`;
|
|
7
|
+
}
|
|
8
|
+
export function useBelowBreakpoint(px) {
|
|
9
|
+
const [isBelow, setIsBelow] = React.useState(undefined);
|
|
10
|
+
React.useEffect(() => {
|
|
11
|
+
const mql = window.matchMedia(belowBreakpointQuery(px));
|
|
12
|
+
const onChange = () => {
|
|
13
|
+
setIsBelow(mql.matches);
|
|
14
|
+
};
|
|
15
|
+
mql.addEventListener("change", onChange);
|
|
16
|
+
setIsBelow(mql.matches);
|
|
17
|
+
return () => mql.removeEventListener("change", onChange);
|
|
18
|
+
}, [px]);
|
|
19
|
+
return !!isBelow;
|
|
20
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface ConfirmActionGate {
|
|
2
|
+
busy: boolean;
|
|
3
|
+
}
|
|
4
|
+
export declare function requestConfirmAction<T>(gate: ConfirmActionGate, value: T, setPending: (value: T | null) => void): void;
|
|
5
|
+
export declare function cancelConfirmAction<T>(gate: ConfirmActionGate, setPending: (value: T | null) => void): void;
|
|
6
|
+
export declare function runConfirmAction<T>(gate: ConfirmActionGate, pending: T | null, onConfirm: (value: T) => void | Promise<void>, setPending: (value: T | null) => void, setBusy: (busy: boolean) => void): Promise<void>;
|
|
7
|
+
export declare function useConfirmAction<T>({ onConfirm, }: {
|
|
8
|
+
onConfirm: (value: T) => void | Promise<void>;
|
|
9
|
+
}): {
|
|
10
|
+
readonly request: (value: T) => void;
|
|
11
|
+
readonly cancel: () => void;
|
|
12
|
+
readonly confirm: () => Promise<void>;
|
|
13
|
+
readonly isBusy: boolean;
|
|
14
|
+
readonly isOpen: boolean;
|
|
15
|
+
readonly pending: T | null;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=use-confirm-action.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-confirm-action.d.ts","sourceRoot":"","sources":["../../src/hooks/use-confirm-action.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;CACf;AAID,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,IAAI,EAAE,iBAAiB,EACvB,KAAK,EAAE,CAAC,EACR,UAAU,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,GACpC,IAAI,CAKN;AAID,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,IAAI,EAAE,iBAAiB,EACvB,UAAU,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,GACpC,IAAI,CAKN;AAKD,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,CAAC,GAAG,IAAI,EACjB,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAC7C,UAAU,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,EACrC,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GAC/B,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,EAClC,SAAS,GACV,EAAE;IACD,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/C;8BAK2C,CAAC;;;;;;EAqB5C"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
// Request stages a value for confirmation; ignored while a confirm is in
|
|
4
|
+
// flight so the pending value cannot change under a running action.
|
|
5
|
+
export function requestConfirmAction(gate, value, setPending) {
|
|
6
|
+
if (gate.busy) {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
setPending(value);
|
|
10
|
+
}
|
|
11
|
+
// Cancel clears the pending value, but is a no-op while a confirm is in flight
|
|
12
|
+
// so the dialog cannot be dismissed mid-action.
|
|
13
|
+
export function cancelConfirmAction(gate, setPending) {
|
|
14
|
+
if (gate.busy) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
setPending(null);
|
|
18
|
+
}
|
|
19
|
+
// Confirm marks busy, awaits `onConfirm`, and clears the pending value on
|
|
20
|
+
// success. A thrown error is swallowed so the dialog stays open (the caller
|
|
21
|
+
// surfaces the error inside `onConfirm`); busy always resets in `finally`.
|
|
22
|
+
export async function runConfirmAction(gate, pending, onConfirm, setPending, setBusy) {
|
|
23
|
+
if (gate.busy || pending === null) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
gate.busy = true;
|
|
27
|
+
setBusy(true);
|
|
28
|
+
try {
|
|
29
|
+
await onConfirm(pending);
|
|
30
|
+
setPending(null);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// Keep the pending value so the dialog stays open.
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
gate.busy = false;
|
|
37
|
+
setBusy(false);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export function useConfirmAction({ onConfirm, }) {
|
|
41
|
+
const [pending, setPending] = React.useState(null);
|
|
42
|
+
const [isBusy, setIsBusy] = React.useState(false);
|
|
43
|
+
const gateRef = React.useRef({ busy: false });
|
|
44
|
+
const request = React.useCallback((value) => {
|
|
45
|
+
requestConfirmAction(gateRef.current, value, setPending);
|
|
46
|
+
}, []);
|
|
47
|
+
const cancel = React.useCallback(() => {
|
|
48
|
+
cancelConfirmAction(gateRef.current, setPending);
|
|
49
|
+
}, []);
|
|
50
|
+
const confirm = React.useCallback(() => runConfirmAction(gateRef.current, pending, onConfirm, setPending, setIsBusy), [pending, onConfirm]);
|
|
51
|
+
return {
|
|
52
|
+
request,
|
|
53
|
+
cancel,
|
|
54
|
+
confirm,
|
|
55
|
+
isBusy,
|
|
56
|
+
isOpen: pending !== null,
|
|
57
|
+
pending,
|
|
58
|
+
};
|
|
59
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -41,6 +41,7 @@ export * from "./components/code-editor-mockup";
|
|
|
41
41
|
export * from "./components/collapsible";
|
|
42
42
|
export * from "./components/combobox";
|
|
43
43
|
export * from "./components/command";
|
|
44
|
+
export * from "./components/confirm-dialog";
|
|
44
45
|
export * from "./components/contact";
|
|
45
46
|
export * from "./components/context-menu";
|
|
46
47
|
export * from "./components/dashboard-shell";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -41,6 +41,7 @@ export * from "./components/code-editor-mockup.js";
|
|
|
41
41
|
export * from "./components/collapsible.js";
|
|
42
42
|
export * from "./components/combobox.js";
|
|
43
43
|
export * from "./components/command.js";
|
|
44
|
+
export * from "./components/confirm-dialog.js";
|
|
44
45
|
export * from "./components/contact.js";
|
|
45
46
|
export * from "./components/context-menu.js";
|
|
46
47
|
export * from "./components/dashboard-shell.js";
|
|
@@ -88,6 +88,7 @@ Current shipped product subpaths:
|
|
|
88
88
|
- `@nadicodeai/ui/components/chart-kpi-stat`
|
|
89
89
|
- `@nadicodeai/ui/components/chart-sparkline`
|
|
90
90
|
- `@nadicodeai/ui/components/chart-time-series`
|
|
91
|
+
- `@nadicodeai/ui/components/confirm-dialog`
|
|
91
92
|
- `@nadicodeai/ui/components/dashboard-shell`
|
|
92
93
|
- `@nadicodeai/ui/components/desktop-shell`
|
|
93
94
|
- `@nadicodeai/ui/components/feedback-state`
|
|
@@ -27,6 +27,106 @@ Use first-party shadcn registry source directly in the consuming app for generic
|
|
|
27
27
|
data tables, command palettes, and chart cards. Do not migrate those patterns
|
|
28
28
|
through a NadicodeAI package wrapper.
|
|
29
29
|
|
|
30
|
+
## Consumer Mapping
|
|
31
|
+
|
|
32
|
+
### Toast
|
|
33
|
+
|
|
34
|
+
The imperative toast API is package-owned. Import it from the
|
|
35
|
+
`@nadicodeai/ui/components/toast` subpath, and mount `<Toaster />` from
|
|
36
|
+
`@nadicodeai/ui/components/sonner` once at the app root.
|
|
37
|
+
|
|
38
|
+
```tsx
|
|
39
|
+
import { toast } from "@nadicodeai/ui/components/toast";
|
|
40
|
+
|
|
41
|
+
showToast(message, "success"); // → toast.success(message)
|
|
42
|
+
showToast(message, "error"); // → toast.error(message)
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Per-toast duration is a sonner option passed as the second argument.
|
|
46
|
+
Consumers must not depend on `sonner` directly.
|
|
47
|
+
|
|
48
|
+
### Confirm flows
|
|
49
|
+
|
|
50
|
+
`ConfirmDialog` from `@nadicodeai/ui/components/confirm-dialog` takes `open`,
|
|
51
|
+
`onConfirm`, `onCancel`, `title`, and optional `description`, `confirmLabel`,
|
|
52
|
+
`cancelLabel`, `destructive`, `loading`. `useConfirmAction` from
|
|
53
|
+
`@nadicodeai/ui/hooks` replaces bespoke delete-confirm hooks:
|
|
54
|
+
|
|
55
|
+
```tsx
|
|
56
|
+
useConfirmAction({ onConfirm }); // (value) => Promise<void> | void
|
|
57
|
+
// → { request, cancel, confirm, isBusy, isOpen, pending }
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
| Old (`useConfirmDelete`) | New (`useConfirmAction`) |
|
|
61
|
+
| --- | --- |
|
|
62
|
+
| `onDelete` | `onConfirm` |
|
|
63
|
+
| `requestDelete` | `request` |
|
|
64
|
+
| `isDeleting` | `isBusy` |
|
|
65
|
+
| `pendingId` | `pending` |
|
|
66
|
+
|
|
67
|
+
A throw inside `onConfirm` keeps the dialog open and the hook swallows it —
|
|
68
|
+
surface errors from inside `onConfirm` yourself, with a toast or an inline
|
|
69
|
+
alert. Non-delete confirms (restart, reset, reload) use the same component
|
|
70
|
+
with either plain boolean state or the same hook.
|
|
71
|
+
|
|
72
|
+
### Typography
|
|
73
|
+
|
|
74
|
+
The package ships no `Text`/`Heading` component — the same boundary that
|
|
75
|
+
keeps `DataTable` and `CommandPalette` out. The type scale is design-system
|
|
76
|
+
CSS consumed as classes on raw elements: `nc-type-display-xl/lg/md/sm`,
|
|
77
|
+
`nc-type-title-lg/md/sm`, `nc-type-body-lg/md/sm` (plus `-strong` variants
|
|
78
|
+
for `body-md`/`body-sm`), `nc-type-caption` (plus `-strong` and `-mono`),
|
|
79
|
+
`nc-type-code`, and `nc-type-button-md/lg`.
|
|
80
|
+
|
|
81
|
+
| Old usage | New usage |
|
|
82
|
+
| --- | --- |
|
|
83
|
+
| Page-level heading | `<h1 className="nc-type-title-lg">` (or a `display-*` class at hero scale) |
|
|
84
|
+
| Section header (the dominant H2 `variant="sm"` pattern) | `<h2 className="nc-type-title-sm">` |
|
|
85
|
+
| Body copy | `<p className="nc-type-body-md">` |
|
|
86
|
+
| Fine print / labels | `nc-type-caption` |
|
|
87
|
+
| Code | `nc-type-code` |
|
|
88
|
+
|
|
89
|
+
### Segmented control
|
|
90
|
+
|
|
91
|
+
Single-select segmented UI is the existing `ToggleGroup`:
|
|
92
|
+
|
|
93
|
+
```tsx
|
|
94
|
+
<ToggleGroup spacing={0} variant="outline">
|
|
95
|
+
<ToggleGroupItem value="day">Day</ToggleGroupItem>
|
|
96
|
+
<ToggleGroupItem value="week">Week</ToggleGroupItem>
|
|
97
|
+
</ToggleGroup>
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Base UI's `ToggleGroup` is single-select by default (`toggleMultiple`
|
|
101
|
+
defaults to `false`), and its value is an array. Controlled usage is
|
|
102
|
+
`value={[current]}` with:
|
|
103
|
+
|
|
104
|
+
```tsx
|
|
105
|
+
onValueChange={(next) => {
|
|
106
|
+
if (next.length) setCurrent(next[0]);
|
|
107
|
+
}}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
The length guard preserves radio semantics by ignoring deselection of the
|
|
111
|
+
active item. A label-plus-group row ("FilterGroup") is an app-level flex
|
|
112
|
+
composition, not package surface.
|
|
113
|
+
|
|
114
|
+
### Copy affordances
|
|
115
|
+
|
|
116
|
+
Copy-to-clipboard UI is the AI Elements surface — a sanctioned public path.
|
|
117
|
+
Use `Snippet`/`SnippetCopyButton` and `CodeBlockCopyButton` from
|
|
118
|
+
`@nadicodeai/ui/ai-elements`.
|
|
119
|
+
|
|
120
|
+
| Old | New |
|
|
121
|
+
| --- | --- |
|
|
122
|
+
| `CommandBlock(label, code)` | `Snippet` with `SnippetCopyButton` |
|
|
123
|
+
| Bare `CopyButton(text)` | `SnippetCopyButton` inside a `Snippet`, or an app-local `Button` when no snippet chrome is wanted |
|
|
124
|
+
|
|
125
|
+
### Breakpoints
|
|
126
|
+
|
|
127
|
+
`useIsMobile()` (fixed 768) and `useBelowBreakpoint(px)` (true strictly below
|
|
128
|
+
`px`) both ship from `@nadicodeai/ui/hooks`.
|
|
129
|
+
|
|
30
130
|
## Migration Order
|
|
31
131
|
|
|
32
132
|
1. Web admin or portal validation slice.
|
package/llms.txt
CHANGED
|
@@ -41,6 +41,7 @@ Component surface:
|
|
|
41
41
|
- `@nadicodeai/ui/components/chart-kpi-stat`
|
|
42
42
|
- `@nadicodeai/ui/components/chart-sparkline`
|
|
43
43
|
- `@nadicodeai/ui/components/chart-time-series`
|
|
44
|
+
- `@nadicodeai/ui/components/confirm-dialog`
|
|
44
45
|
- `@nadicodeai/ui/components/dashboard-shell`
|
|
45
46
|
- `@nadicodeai/ui/components/desktop-shell`
|
|
46
47
|
- `@nadicodeai/ui/components/feedback-state`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nadicodeai/ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
},
|
|
64
64
|
"dependencies": {
|
|
65
65
|
"@base-ui/react": "^1.6.0",
|
|
66
|
-
"@nadicodeai/design-system": "0.
|
|
66
|
+
"@nadicodeai/design-system": "0.10.0",
|
|
67
67
|
"@rive-app/react-webgl2": "^4.29.1",
|
|
68
68
|
"@streamdown/cjk": "^1.0.3",
|
|
69
69
|
"@streamdown/code": "^1.1.1",
|
|
@@ -102,10 +102,13 @@
|
|
|
102
102
|
"tailwindcss": "^4.3.1"
|
|
103
103
|
},
|
|
104
104
|
"devDependencies": {
|
|
105
|
+
"@testing-library/react": "^16.3.2",
|
|
105
106
|
"@tailwindcss/postcss": "^4.3.1",
|
|
106
107
|
"@types/react": "^19",
|
|
107
108
|
"@types/react-dom": "^19",
|
|
109
|
+
"axe-core": "^4.12.0",
|
|
108
110
|
"eslint": "^9.39.4",
|
|
111
|
+
"jsdom": "^26.1.0",
|
|
109
112
|
"react": "19.2.7",
|
|
110
113
|
"react-dom": "19.2.7",
|
|
111
114
|
"shadcn": "4.13.0",
|