@braedonsaunders/appkit-ui 0.2.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/LICENSE +661 -0
- package/README.md +11 -0
- package/account-menu.d.ts +49 -0
- package/account-menu.d.ts.map +1 -0
- package/account-menu.js +66 -0
- package/account-menu.js.map +1 -0
- package/alert.d.ts +13 -0
- package/alert.d.ts.map +1 -0
- package/alert.js +22 -0
- package/alert.js.map +1 -0
- package/animated-number.d.ts +13 -0
- package/animated-number.d.ts.map +1 -0
- package/animated-number.js +53 -0
- package/animated-number.js.map +1 -0
- package/api-reference.d.ts +44 -0
- package/api-reference.d.ts.map +1 -0
- package/api-reference.js +82 -0
- package/api-reference.js.map +1 -0
- package/app-shell.d.ts +39 -0
- package/app-shell.d.ts.map +1 -0
- package/app-shell.js +21 -0
- package/app-shell.js.map +1 -0
- package/app-sidebar.d.ts +22 -0
- package/app-sidebar.d.ts.map +1 -0
- package/app-sidebar.js +30 -0
- package/app-sidebar.js.map +1 -0
- package/avatar.d.ts +9 -0
- package/avatar.d.ts.map +1 -0
- package/avatar.js +18 -0
- package/avatar.js.map +1 -0
- package/badge.d.ts +9 -0
- package/badge.d.ts.map +1 -0
- package/badge.js +23 -0
- package/badge.js.map +1 -0
- package/button.d.ts +24 -0
- package/button.d.ts.map +1 -0
- package/button.js +50 -0
- package/button.js.map +1 -0
- package/card.d.ts +21 -0
- package/card.d.ts.map +1 -0
- package/card.js +36 -0
- package/card.js.map +1 -0
- package/checkbox.d.ts +4 -0
- package/checkbox.d.ts.map +1 -0
- package/checkbox.js +6 -0
- package/checkbox.js.map +1 -0
- package/confirm-dialog.d.ts +23 -0
- package/confirm-dialog.d.ts.map +1 -0
- package/confirm-dialog.js +67 -0
- package/confirm-dialog.js.map +1 -0
- package/context-menu.d.ts +47 -0
- package/context-menu.d.ts.map +1 -0
- package/context-menu.js +90 -0
- package/context-menu.js.map +1 -0
- package/dialog.d.ts +25 -0
- package/dialog.d.ts.map +1 -0
- package/dialog.js +89 -0
- package/dialog.js.map +1 -0
- package/document-title.d.ts +11 -0
- package/document-title.d.ts.map +1 -0
- package/document-title.js +17 -0
- package/document-title.js.map +1 -0
- package/drawer.d.ts +63 -0
- package/drawer.d.ts.map +1 -0
- package/drawer.js +188 -0
- package/drawer.js.map +1 -0
- package/empty-state.d.ts +10 -0
- package/empty-state.d.ts.map +1 -0
- package/empty-state.js +7 -0
- package/empty-state.js.map +1 -0
- package/file-uploader.d.ts +67 -0
- package/file-uploader.d.ts.map +1 -0
- package/file-uploader.js +156 -0
- package/file-uploader.js.map +1 -0
- package/filter-chips.d.ts +47 -0
- package/filter-chips.d.ts.map +1 -0
- package/filter-chips.js +62 -0
- package/filter-chips.js.map +1 -0
- package/global-search.d.ts +41 -0
- package/global-search.d.ts.map +1 -0
- package/global-search.js +116 -0
- package/global-search.js.map +1 -0
- package/index.d.ts +70 -0
- package/index.d.ts.map +1 -0
- package/index.js +70 -0
- package/index.js.map +1 -0
- package/input.d.ts +9 -0
- package/input.d.ts.map +1 -0
- package/input.js +11 -0
- package/input.js.map +1 -0
- package/label.d.ts +3 -0
- package/label.d.ts.map +1 -0
- package/label.js +6 -0
- package/label.js.map +1 -0
- package/line-grid.d.ts +48 -0
- package/line-grid.d.ts.map +1 -0
- package/line-grid.js +155 -0
- package/line-grid.js.map +1 -0
- package/link-context.d.ts +44 -0
- package/link-context.d.ts.map +1 -0
- package/link-context.js +32 -0
- package/link-context.js.map +1 -0
- package/list-nav.d.ts +28 -0
- package/list-nav.d.ts.map +1 -0
- package/list-nav.js +41 -0
- package/list-nav.js.map +1 -0
- package/list-pagination.d.ts +27 -0
- package/list-pagination.d.ts.map +1 -0
- package/list-pagination.js +43 -0
- package/list-pagination.js.map +1 -0
- package/list-params.d.ts +41 -0
- package/list-params.d.ts.map +1 -0
- package/list-params.js +84 -0
- package/list-params.js.map +1 -0
- package/list-search-input-state.d.ts +13 -0
- package/list-search-input-state.d.ts.map +1 -0
- package/list-search-input-state.js +27 -0
- package/list-search-input-state.js.map +1 -0
- package/list-search-input.d.ts +16 -0
- package/list-search-input.d.ts.map +1 -0
- package/list-search-input.js +51 -0
- package/list-search-input.js.map +1 -0
- package/mobile-tab-bar.d.ts +14 -0
- package/mobile-tab-bar.d.ts.map +1 -0
- package/mobile-tab-bar.js +25 -0
- package/mobile-tab-bar.js.map +1 -0
- package/multi-select.d.ts +32 -0
- package/multi-select.d.ts.map +1 -0
- package/multi-select.js +52 -0
- package/multi-select.js.map +1 -0
- package/nav-overflow.d.ts +12 -0
- package/nav-overflow.d.ts.map +1 -0
- package/nav-overflow.js +30 -0
- package/nav-overflow.js.map +1 -0
- package/navigation-config-editor.d.ts +26 -0
- package/navigation-config-editor.d.ts.map +1 -0
- package/navigation-config-editor.js +57 -0
- package/navigation-config-editor.js.map +1 -0
- package/navigation-config.d.ts +48 -0
- package/navigation-config.d.ts.map +1 -0
- package/navigation-config.js +75 -0
- package/navigation-config.js.map +1 -0
- package/navigation-mode.d.ts +16 -0
- package/navigation-mode.d.ts.map +1 -0
- package/navigation-mode.js +30 -0
- package/navigation-mode.js.map +1 -0
- package/notifications-bell.d.ts +22 -0
- package/notifications-bell.d.ts.map +1 -0
- package/notifications-bell.js +30 -0
- package/notifications-bell.js.map +1 -0
- package/org-chart.d.ts +85 -0
- package/org-chart.d.ts.map +1 -0
- package/org-chart.js +193 -0
- package/org-chart.js.map +1 -0
- package/package.json +61 -0
- package/page-header.d.ts +32 -0
- package/page-header.d.ts.map +1 -0
- package/page-header.js +14 -0
- package/page-header.js.map +1 -0
- package/page-layout.d.ts +29 -0
- package/page-layout.d.ts.map +1 -0
- package/page-layout.js +23 -0
- package/page-layout.js.map +1 -0
- package/page-transition.d.ts +13 -0
- package/page-transition.d.ts.map +1 -0
- package/page-transition.js +14 -0
- package/page-transition.js.map +1 -0
- package/paged-table.d.ts +54 -0
- package/paged-table.d.ts.map +1 -0
- package/paged-table.js +74 -0
- package/paged-table.js.map +1 -0
- package/popover.d.ts +16 -0
- package/popover.d.ts.map +1 -0
- package/popover.js +99 -0
- package/popover.js.map +1 -0
- package/progress.d.ts +7 -0
- package/progress.d.ts.map +1 -0
- package/progress.js +8 -0
- package/progress.js.map +1 -0
- package/prompt-dialog.d.ts +21 -0
- package/prompt-dialog.d.ts.map +1 -0
- package/prompt-dialog.js +109 -0
- package/prompt-dialog.js.map +1 -0
- package/record-list.d.ts +76 -0
- package/record-list.d.ts.map +1 -0
- package/record-list.js +51 -0
- package/record-list.js.map +1 -0
- package/search-select.d.ts +42 -0
- package/search-select.d.ts.map +1 -0
- package/search-select.js +194 -0
- package/search-select.js.map +1 -0
- package/select-options.d.ts +16 -0
- package/select-options.d.ts.map +1 -0
- package/select-options.js +119 -0
- package/select-options.js.map +1 -0
- package/select.d.ts +24 -0
- package/select.d.ts.map +1 -0
- package/select.js +65 -0
- package/select.js.map +1 -0
- package/separator.d.ts +6 -0
- package/separator.d.ts.map +1 -0
- package/separator.js +7 -0
- package/separator.js.map +1 -0
- package/settings-layout.d.ts +79 -0
- package/settings-layout.d.ts.map +1 -0
- package/settings-layout.js +74 -0
- package/settings-layout.js.map +1 -0
- package/sidebar-nav.d.ts +67 -0
- package/sidebar-nav.d.ts.map +1 -0
- package/sidebar-nav.js +291 -0
- package/sidebar-nav.js.map +1 -0
- package/signature-pad.d.ts +16 -0
- package/signature-pad.d.ts.map +1 -0
- package/signature-pad.js +355 -0
- package/signature-pad.js.map +1 -0
- package/skeleton.d.ts +9 -0
- package/skeleton.d.ts.map +1 -0
- package/skeleton.js +12 -0
- package/skeleton.js.map +1 -0
- package/slider.d.ts +13 -0
- package/slider.d.ts.map +1 -0
- package/slider.js +15 -0
- package/slider.js.map +1 -0
- package/sortable-th.d.ts +28 -0
- package/sortable-th.d.ts.map +1 -0
- package/sortable-th.js +35 -0
- package/sortable-th.js.map +1 -0
- package/sparkline.d.ts +16 -0
- package/sparkline.d.ts.map +1 -0
- package/sparkline.js +46 -0
- package/sparkline.js.map +1 -0
- package/spinner.d.ts +11 -0
- package/spinner.d.ts.map +1 -0
- package/spinner.js +11 -0
- package/spinner.js.map +1 -0
- package/styles.css +166 -0
- package/subtab-nav.d.ts +17 -0
- package/subtab-nav.d.ts.map +1 -0
- package/subtab-nav.js +11 -0
- package/subtab-nav.js.map +1 -0
- package/switch.d.ts +9 -0
- package/switch.d.ts.map +1 -0
- package/switch.js +11 -0
- package/switch.js.map +1 -0
- package/tab-content.d.ts +24 -0
- package/tab-content.d.ts.map +1 -0
- package/tab-content.js +26 -0
- package/tab-content.js.map +1 -0
- package/table.d.ts +28 -0
- package/table.d.ts.map +1 -0
- package/table.js +21 -0
- package/table.js.map +1 -0
- package/tabs.d.ts +18 -0
- package/tabs.d.ts.map +1 -0
- package/tabs.js +18 -0
- package/tabs.js.map +1 -0
- package/text-context.d.ts +9 -0
- package/text-context.d.ts.map +1 -0
- package/text-context.js +12 -0
- package/text-context.js.map +1 -0
- package/textarea.d.ts +4 -0
- package/textarea.d.ts.map +1 -0
- package/textarea.js +6 -0
- package/textarea.js.map +1 -0
- package/theme-script.d.ts +3 -0
- package/theme-script.d.ts.map +1 -0
- package/theme-script.js +6 -0
- package/theme-script.js.map +1 -0
- package/theme.d.ts +28 -0
- package/theme.d.ts.map +1 -0
- package/theme.js +92 -0
- package/theme.js.map +1 -0
- package/toast.d.ts +52 -0
- package/toast.d.ts.map +1 -0
- package/toast.js +178 -0
- package/toast.js.map +1 -0
- package/tooltip.d.ts +12 -0
- package/tooltip.d.ts.map +1 -0
- package/tooltip.js +14 -0
- package/tooltip.js.map +1 -0
- package/top-nav.d.ts +18 -0
- package/top-nav.d.ts.map +1 -0
- package/top-nav.js +160 -0
- package/top-nav.js.map +1 -0
- package/upload-limits.d.ts +4 -0
- package/upload-limits.d.ts.map +1 -0
- package/upload-limits.js +21 -0
- package/upload-limits.js.map +1 -0
- package/use-element-size.d.ts +7 -0
- package/use-element-size.d.ts.map +1 -0
- package/use-element-size.js +21 -0
- package/use-element-size.js.map +1 -0
- package/utils.d.ts +4 -0
- package/utils.d.ts.map +1 -0
- package/utils.js +7 -0
- package/utils.js.map +1 -0
- package/workspace-launcher.d.ts +50 -0
- package/workspace-launcher.d.ts.map +1 -0
- package/workspace-launcher.js +127 -0
- package/workspace-launcher.js.map +1 -0
package/global-search.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { CornerDownLeft, Loader2, Search, X } from 'lucide-react';
|
|
5
|
+
import { Badge } from './badge.js';
|
|
6
|
+
import { NavIcon } from './sidebar-nav.js';
|
|
7
|
+
import { cn } from './utils.js';
|
|
8
|
+
const DEFAULT_LABELS = {
|
|
9
|
+
placeholder: 'Search…',
|
|
10
|
+
ariaLabel: 'Search the application',
|
|
11
|
+
clear: 'Clear search',
|
|
12
|
+
searching: 'Searching…',
|
|
13
|
+
noMatches: (query) => `No matches for “${query}”`,
|
|
14
|
+
navigate: 'navigate',
|
|
15
|
+
open: 'open',
|
|
16
|
+
close: 'close',
|
|
17
|
+
resultCount: (count) => `${count} result${count === 1 ? '' : 's'}`,
|
|
18
|
+
};
|
|
19
|
+
function Highlight({ text, query }) {
|
|
20
|
+
const index = text.toLowerCase().indexOf(query.toLowerCase());
|
|
21
|
+
if (!query || index < 0)
|
|
22
|
+
return text;
|
|
23
|
+
return _jsxs(_Fragment, { children: [text.slice(0, index), _jsx("mark", { className: "bg-transparent font-semibold text-primary", children: text.slice(index, index + query.length) }), text.slice(index + query.length)] });
|
|
24
|
+
}
|
|
25
|
+
/** Production sibling search interaction with app-owned querying and navigation. */
|
|
26
|
+
export function GlobalSearch({ search, onNavigate, className, labels = DEFAULT_LABELS, minimumQueryLength = 2, debounceMs = 180, }) {
|
|
27
|
+
const inputRef = React.useRef(null);
|
|
28
|
+
const rootRef = React.useRef(null);
|
|
29
|
+
const resultsId = React.useId();
|
|
30
|
+
const [query, setQuery] = React.useState('');
|
|
31
|
+
const [open, setOpen] = React.useState(false);
|
|
32
|
+
const [loading, setLoading] = React.useState(false);
|
|
33
|
+
const [result, setResult] = React.useState(null);
|
|
34
|
+
const [active, setActive] = React.useState(0);
|
|
35
|
+
const hits = React.useMemo(() => result?.groups.flatMap((group) => group.hits) ?? [], [result]);
|
|
36
|
+
React.useEffect(() => {
|
|
37
|
+
function onKey(event) {
|
|
38
|
+
if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'k') {
|
|
39
|
+
event.preventDefault();
|
|
40
|
+
inputRef.current?.focus();
|
|
41
|
+
inputRef.current?.select();
|
|
42
|
+
setOpen(true);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
window.addEventListener('keydown', onKey);
|
|
46
|
+
return () => window.removeEventListener('keydown', onKey);
|
|
47
|
+
}, []);
|
|
48
|
+
React.useEffect(() => {
|
|
49
|
+
function onPointerDown(event) {
|
|
50
|
+
if (!rootRef.current?.contains(event.target))
|
|
51
|
+
setOpen(false);
|
|
52
|
+
}
|
|
53
|
+
document.addEventListener('pointerdown', onPointerDown);
|
|
54
|
+
return () => document.removeEventListener('pointerdown', onPointerDown);
|
|
55
|
+
}, []);
|
|
56
|
+
React.useEffect(() => {
|
|
57
|
+
const term = query.trim();
|
|
58
|
+
if (term.length < minimumQueryLength) {
|
|
59
|
+
setResult(null);
|
|
60
|
+
setLoading(false);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const controller = new AbortController();
|
|
64
|
+
setLoading(true);
|
|
65
|
+
const timeout = window.setTimeout(async () => {
|
|
66
|
+
try {
|
|
67
|
+
const next = await search(term, controller.signal);
|
|
68
|
+
setResult(next);
|
|
69
|
+
setActive(0);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
if (error.name !== 'AbortError')
|
|
73
|
+
setResult({ groups: [], total: 0 });
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
if (!controller.signal.aborted)
|
|
77
|
+
setLoading(false);
|
|
78
|
+
}
|
|
79
|
+
}, debounceMs);
|
|
80
|
+
return () => { window.clearTimeout(timeout); controller.abort(); };
|
|
81
|
+
}, [debounceMs, minimumQueryLength, query, search]);
|
|
82
|
+
const go = React.useCallback((hit) => {
|
|
83
|
+
if (!hit)
|
|
84
|
+
return;
|
|
85
|
+
setOpen(false);
|
|
86
|
+
setQuery('');
|
|
87
|
+
setResult(null);
|
|
88
|
+
inputRef.current?.blur();
|
|
89
|
+
onNavigate(hit);
|
|
90
|
+
}, [onNavigate]);
|
|
91
|
+
function onKeyDown(event) {
|
|
92
|
+
if (event.key === 'Escape') {
|
|
93
|
+
setOpen(false);
|
|
94
|
+
inputRef.current?.blur();
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (!hits.length)
|
|
98
|
+
return;
|
|
99
|
+
if (event.key === 'ArrowDown') {
|
|
100
|
+
event.preventDefault();
|
|
101
|
+
setActive((value) => (value + 1) % hits.length);
|
|
102
|
+
}
|
|
103
|
+
else if (event.key === 'ArrowUp') {
|
|
104
|
+
event.preventDefault();
|
|
105
|
+
setActive((value) => (value - 1 + hits.length) % hits.length);
|
|
106
|
+
}
|
|
107
|
+
else if (event.key === 'Enter') {
|
|
108
|
+
event.preventDefault();
|
|
109
|
+
go(hits[active]);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const showPanel = open && query.trim().length >= minimumQueryLength;
|
|
113
|
+
let itemIndex = -1;
|
|
114
|
+
return (_jsxs("div", { ref: rootRef, className: cn('relative', className), children: [_jsxs("div", { className: "relative", children: [_jsx(Search, { size: 15, className: "pointer-events-none absolute top-1/2 left-3 -translate-y-1/2 text-fg-subtle" }), _jsx("input", { ref: inputRef, value: query, onChange: (event) => { setQuery(event.target.value); setOpen(true); }, onFocus: () => setOpen(true), onKeyDown: onKeyDown, placeholder: labels.placeholder, "aria-label": labels.ariaLabel, role: "combobox", "aria-expanded": showPanel, "aria-controls": resultsId, className: "h-9 w-full rounded-lg border border-border bg-bg-subtle pr-16 pl-9 text-sm text-fg transition-colors placeholder:text-fg-subtle hover:border-border-strong focus:border-primary focus:bg-surface focus:ring-2 focus:ring-ring/20 focus:outline-none" }), _jsx("div", { className: "absolute top-1/2 right-2.5 flex -translate-y-1/2 items-center gap-1", children: loading ? _jsx(Loader2, { size: 14, className: "animate-spin text-fg-subtle" }) : query ? _jsx("button", { type: "button", onClick: () => { setQuery(''); setResult(null); inputRef.current?.focus(); }, className: "rounded p-0.5 text-fg-subtle hover:text-fg", "aria-label": labels.clear, children: _jsx(X, { size: 14 }) }) : _jsx("kbd", { className: "hidden rounded border border-border bg-surface px-1.5 py-0.5 font-sans text-[10px] font-medium text-fg-subtle sm:inline", children: "\u2318K" }) })] }), showPanel ? (_jsx("div", { id: resultsId, className: "absolute top-[calc(100%+6px)] left-0 z-50 max-h-[70vh] w-full min-w-88 overflow-y-auto rounded-xl border border-border bg-elevated p-1.5 shadow-lg", role: "listbox", children: result && result.total > 0 ? _jsxs(_Fragment, { children: [result.groups.map((group) => _jsxs("div", { className: "mb-1 last:mb-0", children: [_jsx("div", { className: "px-2 pt-1.5 pb-1 text-[11px] font-semibold tracking-wider text-fg-subtle uppercase", children: group.label }), group.hits.map((hit) => { itemIndex += 1; const index = itemIndex; const selected = index === active; return _jsxs("button", { type: "button", role: "option", "aria-selected": selected, onMouseEnter: () => setActive(index), onMouseDown: (event) => { event.preventDefault(); go(hit); }, className: cn('flex w-full items-center gap-3 rounded-lg px-2 py-1.5 text-left transition-colors', selected ? 'bg-primary-subtle' : 'hover:bg-surface-hover'), children: [_jsx("span", { className: cn('grid size-7 shrink-0 place-items-center rounded-md', selected ? 'bg-surface text-primary' : 'bg-bg-subtle text-fg-muted'), children: hit.iconKey ? _jsx(NavIcon, { iconKey: hit.iconKey, size: 15 }) : _jsx(Search, { size: 15 }) }), _jsxs("span", { className: "min-w-0 flex-1", children: [_jsxs("span", { className: "flex items-center gap-2", children: [_jsx("span", { className: "truncate text-sm text-fg", children: _jsx(Highlight, { text: hit.title, query: query.trim() }) }), hit.badge ? _jsx(Badge, { variant: "secondary", className: "text-[10px]", children: hit.badge }) : null] }), hit.subtitle ? _jsx("span", { className: "block truncate text-xs text-fg-muted", children: hit.subtitle }) : null] }), hit.meta ? _jsx("span", { className: "shrink-0 font-mono text-xs tabular-nums text-fg-muted", children: hit.meta }) : null, selected ? _jsx(CornerDownLeft, { size: 13, className: "shrink-0 text-primary" }) : null] }, `${hit.type}-${hit.id}`); })] }, group.id)), _jsxs("div", { className: "mt-1 flex items-center justify-between border-t border-border-subtle px-2 py-1.5 text-[11px] text-fg-subtle", children: [_jsxs("span", { children: [_jsx("kbd", { className: "font-sans", children: "\u2191\u2193" }), " ", labels.navigate, "\u00A0\u00A0", _jsx("kbd", { className: "font-sans", children: "\u21B5" }), " ", labels.open, "\u00A0\u00A0", _jsx("kbd", { className: "font-sans", children: "esc" }), " ", labels.close] }), _jsx("span", { children: labels.resultCount(result.total) })] })] }) : loading ? _jsxs("div", { className: "flex items-center gap-2 px-3 py-6 text-sm text-fg-subtle", children: [_jsx(Loader2, { size: 15, className: "animate-spin" }), labels.searching] }) : _jsx("div", { className: "px-3 py-6 text-center text-sm text-fg-subtle", children: labels.noMatches(query.trim()) }) })) : null] }));
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=global-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-search.js","sourceRoot":"","sources":["../src/global-search.tsx"],"names":[],"mappings":"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","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { CornerDownLeft, Loader2, Search, X } from 'lucide-react'\nimport { Badge } from './badge'\nimport { NavIcon } from './sidebar-nav'\nimport { cn } from './utils'\n\nexport type GlobalSearchHit = {\n id: string\n type: string\n title: string\n subtitle?: string\n href: string\n iconKey?: string\n badge?: string\n meta?: string\n}\n\nexport type GlobalSearchGroup = { id: string; label: string; hits: GlobalSearchHit[] }\nexport type GlobalSearchResult = { groups: GlobalSearchGroup[]; total: number }\nexport type GlobalSearchLabels = {\n placeholder: string\n ariaLabel: string\n clear: string\n searching: string\n noMatches: (query: string) => string\n navigate: string\n open: string\n close: string\n resultCount: (count: number) => string\n}\n\nconst DEFAULT_LABELS: GlobalSearchLabels = {\n placeholder: 'Search…',\n ariaLabel: 'Search the application',\n clear: 'Clear search',\n searching: 'Searching…',\n noMatches: (query) => `No matches for “${query}”`,\n navigate: 'navigate',\n open: 'open',\n close: 'close',\n resultCount: (count) => `${count} result${count === 1 ? '' : 's'}`,\n}\n\nfunction Highlight({ text, query }: { text: string; query: string }) {\n const index = text.toLowerCase().indexOf(query.toLowerCase())\n if (!query || index < 0) return text\n return <>{text.slice(0, index)}<mark className=\"bg-transparent font-semibold text-primary\">{text.slice(index, index + query.length)}</mark>{text.slice(index + query.length)}</>\n}\n\n/** Production sibling search interaction with app-owned querying and navigation. */\nexport function GlobalSearch({\n search,\n onNavigate,\n className,\n labels = DEFAULT_LABELS,\n minimumQueryLength = 2,\n debounceMs = 180,\n}: {\n search: (query: string, signal: AbortSignal) => Promise<GlobalSearchResult>\n onNavigate: (hit: GlobalSearchHit) => void\n className?: string\n labels?: GlobalSearchLabels\n minimumQueryLength?: number\n debounceMs?: number\n}) {\n const inputRef = React.useRef<HTMLInputElement>(null)\n const rootRef = React.useRef<HTMLDivElement>(null)\n const resultsId = React.useId()\n const [query, setQuery] = React.useState('')\n const [open, setOpen] = React.useState(false)\n const [loading, setLoading] = React.useState(false)\n const [result, setResult] = React.useState<GlobalSearchResult | null>(null)\n const [active, setActive] = React.useState(0)\n const hits = React.useMemo(() => result?.groups.flatMap((group) => group.hits) ?? [], [result])\n\n React.useEffect(() => {\n function onKey(event: KeyboardEvent) {\n if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'k') {\n event.preventDefault()\n inputRef.current?.focus()\n inputRef.current?.select()\n setOpen(true)\n }\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [])\n\n React.useEffect(() => {\n function onPointerDown(event: PointerEvent) {\n if (!rootRef.current?.contains(event.target as Node)) setOpen(false)\n }\n document.addEventListener('pointerdown', onPointerDown)\n return () => document.removeEventListener('pointerdown', onPointerDown)\n }, [])\n\n React.useEffect(() => {\n const term = query.trim()\n if (term.length < minimumQueryLength) {\n setResult(null)\n setLoading(false)\n return\n }\n const controller = new AbortController()\n setLoading(true)\n const timeout = window.setTimeout(async () => {\n try {\n const next = await search(term, controller.signal)\n setResult(next)\n setActive(0)\n } catch (error) {\n if ((error as Error).name !== 'AbortError') setResult({ groups: [], total: 0 })\n } finally {\n if (!controller.signal.aborted) setLoading(false)\n }\n }, debounceMs)\n return () => { window.clearTimeout(timeout); controller.abort() }\n }, [debounceMs, minimumQueryLength, query, search])\n\n const go = React.useCallback((hit: GlobalSearchHit | undefined) => {\n if (!hit) return\n setOpen(false)\n setQuery('')\n setResult(null)\n inputRef.current?.blur()\n onNavigate(hit)\n }, [onNavigate])\n\n function onKeyDown(event: React.KeyboardEvent<HTMLInputElement>) {\n if (event.key === 'Escape') { setOpen(false); inputRef.current?.blur(); return }\n if (!hits.length) return\n if (event.key === 'ArrowDown') { event.preventDefault(); setActive((value) => (value + 1) % hits.length) }\n else if (event.key === 'ArrowUp') { event.preventDefault(); setActive((value) => (value - 1 + hits.length) % hits.length) }\n else if (event.key === 'Enter') { event.preventDefault(); go(hits[active]) }\n }\n\n const showPanel = open && query.trim().length >= minimumQueryLength\n let itemIndex = -1\n return (\n <div ref={rootRef} className={cn('relative', className)}>\n <div className=\"relative\">\n <Search size={15} className=\"pointer-events-none absolute top-1/2 left-3 -translate-y-1/2 text-fg-subtle\" />\n <input ref={inputRef} value={query} onChange={(event) => { setQuery(event.target.value); setOpen(true) }} onFocus={() => setOpen(true)} onKeyDown={onKeyDown} placeholder={labels.placeholder} aria-label={labels.ariaLabel} role=\"combobox\" aria-expanded={showPanel} aria-controls={resultsId} className=\"h-9 w-full rounded-lg border border-border bg-bg-subtle pr-16 pl-9 text-sm text-fg transition-colors placeholder:text-fg-subtle hover:border-border-strong focus:border-primary focus:bg-surface focus:ring-2 focus:ring-ring/20 focus:outline-none\" />\n <div className=\"absolute top-1/2 right-2.5 flex -translate-y-1/2 items-center gap-1\">\n {loading ? <Loader2 size={14} className=\"animate-spin text-fg-subtle\" /> : query ? <button type=\"button\" onClick={() => { setQuery(''); setResult(null); inputRef.current?.focus() }} className=\"rounded p-0.5 text-fg-subtle hover:text-fg\" aria-label={labels.clear}><X size={14} /></button> : <kbd className=\"hidden rounded border border-border bg-surface px-1.5 py-0.5 font-sans text-[10px] font-medium text-fg-subtle sm:inline\">⌘K</kbd>}\n </div>\n </div>\n {showPanel ? (\n <div id={resultsId} className=\"absolute top-[calc(100%+6px)] left-0 z-50 max-h-[70vh] w-full min-w-88 overflow-y-auto rounded-xl border border-border bg-elevated p-1.5 shadow-lg\" role=\"listbox\">\n {result && result.total > 0 ? <>\n {result.groups.map((group) => <div key={group.id} className=\"mb-1 last:mb-0\"><div className=\"px-2 pt-1.5 pb-1 text-[11px] font-semibold tracking-wider text-fg-subtle uppercase\">{group.label}</div>{group.hits.map((hit) => { itemIndex += 1; const index = itemIndex; const selected = index === active; return <button key={`${hit.type}-${hit.id}`} type=\"button\" role=\"option\" aria-selected={selected} onMouseEnter={() => setActive(index)} onMouseDown={(event) => { event.preventDefault(); go(hit) }} className={cn('flex w-full items-center gap-3 rounded-lg px-2 py-1.5 text-left transition-colors', selected ? 'bg-primary-subtle' : 'hover:bg-surface-hover')}><span className={cn('grid size-7 shrink-0 place-items-center rounded-md', selected ? 'bg-surface text-primary' : 'bg-bg-subtle text-fg-muted')}>{hit.iconKey ? <NavIcon iconKey={hit.iconKey} size={15} /> : <Search size={15} />}</span><span className=\"min-w-0 flex-1\"><span className=\"flex items-center gap-2\"><span className=\"truncate text-sm text-fg\"><Highlight text={hit.title} query={query.trim()} /></span>{hit.badge ? <Badge variant=\"secondary\" className=\"text-[10px]\">{hit.badge}</Badge> : null}</span>{hit.subtitle ? <span className=\"block truncate text-xs text-fg-muted\">{hit.subtitle}</span> : null}</span>{hit.meta ? <span className=\"shrink-0 font-mono text-xs tabular-nums text-fg-muted\">{hit.meta}</span> : null}{selected ? <CornerDownLeft size={13} className=\"shrink-0 text-primary\" /> : null}</button>})}</div>)}\n <div className=\"mt-1 flex items-center justify-between border-t border-border-subtle px-2 py-1.5 text-[11px] text-fg-subtle\"><span><kbd className=\"font-sans\">↑↓</kbd> {labels.navigate} <kbd className=\"font-sans\">↵</kbd> {labels.open} <kbd className=\"font-sans\">esc</kbd> {labels.close}</span><span>{labels.resultCount(result.total)}</span></div>\n </> : loading ? <div className=\"flex items-center gap-2 px-3 py-6 text-sm text-fg-subtle\"><Loader2 size={15} className=\"animate-spin\" />{labels.searching}</div> : <div className=\"px-3 py-6 text-center text-sm text-fg-subtle\">{labels.noMatches(query.trim())}</div>}\n </div>\n ) : null}\n </div>\n )\n}\n"]}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export { cn } from './utils.js';
|
|
2
|
+
export { Button, buttonVariants, type ButtonProps } from './button.js';
|
|
3
|
+
export { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter, type CardProps, } from './card.js';
|
|
4
|
+
export { Input, type InputProps } from './input.js';
|
|
5
|
+
export { Textarea, type TextareaProps } from './textarea.js';
|
|
6
|
+
export { Label } from './label.js';
|
|
7
|
+
export { Badge, badgeVariants, type BadgeProps } from './badge.js';
|
|
8
|
+
export { Alert, AlertTitle, AlertDescription, alertVariants, type AlertProps } from './alert.js';
|
|
9
|
+
export { Switch, type SwitchProps } from './switch.js';
|
|
10
|
+
export { Checkbox, type CheckboxProps } from './checkbox.js';
|
|
11
|
+
export { Separator, type SeparatorProps } from './separator.js';
|
|
12
|
+
export { Progress, type ProgressProps } from './progress.js';
|
|
13
|
+
export { Slider, type SliderProps } from './slider.js';
|
|
14
|
+
export { Skeleton, type SkeletonProps } from './skeleton.js';
|
|
15
|
+
export { Spinner, type SpinnerProps } from './spinner.js';
|
|
16
|
+
export { Avatar, type AvatarProps } from './avatar.js';
|
|
17
|
+
export { AnimatedNumber, formatNumber, type AnimatedNumberProps } from './animated-number.js';
|
|
18
|
+
export { Sparkline, type SparklineProps, type SparklineTone } from './sparkline.js';
|
|
19
|
+
export { Tabs, type TabsProps, type TabItem } from './tabs.js';
|
|
20
|
+
export { TabContent } from './tab-content.js';
|
|
21
|
+
export { Tooltip, type TooltipProps } from './tooltip.js';
|
|
22
|
+
export { EmptyState, type EmptyStateProps } from './empty-state.js';
|
|
23
|
+
export { PageHeader, DetailHeader, type PageHeaderProps, type DetailHeaderProps, } from './page-header.js';
|
|
24
|
+
export { DocumentTitle } from './document-title.js';
|
|
25
|
+
export { UiLinkProvider, UiLink, UiBackLinkProvider, UiBackLink, type UiLinkComponent, type BackLinkProps, type BackLinkLike, type BackLinkComponent, } from './link-context.js';
|
|
26
|
+
export { ThemeProvider, ThemeToggle, useTheme, type Theme, type ResolvedTheme, type ThemeToggleLabels, } from './theme.js';
|
|
27
|
+
export { getThemeScript } from './theme-script.js';
|
|
28
|
+
export { NavigationModeProvider, useNavigationMode } from './navigation-mode.js';
|
|
29
|
+
export { AccountMenu, type AccountMenuProps, type AccountMenuChoice, type AccountMenuOption, type AccountMenuLabels, } from './account-menu.js';
|
|
30
|
+
export { GlobalSearch, type GlobalSearchHit, type GlobalSearchGroup, type GlobalSearchResult, type GlobalSearchLabels, } from './global-search.js';
|
|
31
|
+
export { NotificationsBell, type NotificationItem, type NotificationsBellLabels, } from './notifications-bell.js';
|
|
32
|
+
export { ApiReference, ApiEndpoint, MethodBadge, CodeBlock, type ApiEndpointDoc, type ApiParamDoc, } from './api-reference.js';
|
|
33
|
+
export { AppShell, type AppShellNavigationMode } from './app-shell.js';
|
|
34
|
+
export { AppSidebar } from './app-sidebar.js';
|
|
35
|
+
export { TopNav } from './top-nav.js';
|
|
36
|
+
export { MobileTabBar } from './mobile-tab-bar.js';
|
|
37
|
+
export { SidebarNav, findActiveNavHref, isFlatNavigation, selectMobileTabs, toBlocks, NavIcon, type NavBlock, type SidebarNavItem, type SidebarNavGroup, } from './sidebar-nav.js';
|
|
38
|
+
export { buildDefaultNavigationConfig, reconcileNavigationConfig, resolveNavigationItems, stampKnownNavigationItems, isTenantNavigationConfig, type NavigationRegistryItem, type NavigationItemConfig, type TenantNavigationConfig, type ResolvedNavigationItem, } from './navigation-config.js';
|
|
39
|
+
export { NavigationConfigEditor, type NavigationConfigEditorProps, type NavigationConfigEditorLabels, } from './navigation-config-editor.js';
|
|
40
|
+
export { PageContainer, ListPageLayout, DetailPageLayout, WizardLayout } from './page-layout.js';
|
|
41
|
+
export { parseListParams, parsePrefixedListParams, pickString, clamp, buildHref, mergeHref, buildExportHref, isUuid, type ListParams, type ListSearchParams, } from './list-params.js';
|
|
42
|
+
export { ListNavProvider, useListNav, useListNavClick, type ListNav } from './list-nav.js';
|
|
43
|
+
export { SearchInput } from './list-search-input.js';
|
|
44
|
+
export { FilterChips, SearchSelectFilter, type FilterOption } from './filter-chips.js';
|
|
45
|
+
export { SortableTh, SortTh } from './sortable-th.js';
|
|
46
|
+
export { Pagination, type PaginationLabels } from './list-pagination.js';
|
|
47
|
+
export { PagedTable, type PagedColumn, type PagedSortValue, type PagedTableLabels, type PagedTableProps, type PagedTableSort, } from './paged-table.js';
|
|
48
|
+
export { SubtabNav, type SubtabItem, type SubtabNavProps } from './subtab-nav.js';
|
|
49
|
+
export { OrgChart, buildOrgTree, canReparent, orgChartDescendantIds, type OrgChartNode, type OrgChartTreeNode, type OrgChartLabels, type OrgChartProps, } from './org-chart.js';
|
|
50
|
+
export { AdminHub, SettingsShell, SettingsNav, SettingsSection, SettingsRow, type AdminHubCard, type AdminHubGroup, type AdminHubAccent, type SettingsNavItem, type SettingsNavGroup, type LinkRender, } from './settings-layout.js';
|
|
51
|
+
export { Popover } from './popover.js';
|
|
52
|
+
export { ContextMenu, useContextMenu, type ContextMenuItem, type ContextMenuEntry, type ContextMenuController, } from './context-menu.js';
|
|
53
|
+
export { SearchSelect, type SearchSelectProps, type SelectOption } from './search-select.js';
|
|
54
|
+
export { MultiSelect, type MultiSelectProps, type MultiSelectOption, } from './multi-select.js';
|
|
55
|
+
export { Select, type SelectProps } from './select.js';
|
|
56
|
+
export { Dialog, type DialogProps, type DialogSize } from './dialog.js';
|
|
57
|
+
export { ConfirmRoot, cancelConfirmDialog, confirmDialog, type ConfirmDialogOptions, type ConfirmRootProps, type ConfirmTone, } from './confirm-dialog.js';
|
|
58
|
+
export { PromptRoot, promptDialog, cancelPromptDialog, type PromptDialogOptions, } from './prompt-dialog.js';
|
|
59
|
+
export { toast, Toaster, type ToastT, type ExternalToast, type ToastType, type ToasterPosition, } from './toast.js';
|
|
60
|
+
export { Table, TableHeader, TableBody, TableRow, TableHead, TableCell, type TableRowProps, } from './table.js';
|
|
61
|
+
export { LineGrid, type LineGridProps, type LineGridColumn, type LineGridLabels, } from './line-grid.js';
|
|
62
|
+
export { RecordList, type RecordListProps, type RecordColumn, type RecordCellKind, type RecordListLink, } from './record-list.js';
|
|
63
|
+
export { WorkspaceLauncher, type WorkspaceLauncherProps, type WorkspaceLaunchItem, type WorkspaceLaunchBreakdown, type WorkspaceLaunchSegment, type WorkspaceLaunchTone, } from './workspace-launcher.js';
|
|
64
|
+
export { Drawer, UrlDrawer, DrawerTextProvider, DrawerNavigateContext, type DrawerProps, type UrlDrawerProps, type DrawerSize, type DrawerSide, type DrawerText, } from './drawer.js';
|
|
65
|
+
export { UiTextProvider, useUiText, type UiTextTranslator } from './text-context.js';
|
|
66
|
+
export { FileUploader, uploadReservedFile, type FileUploaderProps, type UploadRequestResult, type FinalizeUploadInput, type RequestUploadAction, type FinalizeUploadAction, type UploadedFile, } from './file-uploader.js';
|
|
67
|
+
export { defaultMaxUploadBytes, formatUploadSizeLimit, type AttachmentKind, } from './upload-limits.js';
|
|
68
|
+
export { SignaturePad, type SignaturePadProps } from './signature-pad.js';
|
|
69
|
+
export { useElementSize } from './use-element-size.js';
|
|
70
|
+
//# sourceMappingURL=index.d.ts.map
|
package/index.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAA;AACnE,OAAO,EACL,IAAI,EACJ,UAAU,EACV,SAAS,EACT,eAAe,EACf,WAAW,EACX,UAAU,EACV,KAAK,SAAS,GACf,MAAM,QAAQ,CAAA;AACf,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAA;AAC/D,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAA;AAC7F,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA;AACzD,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5D,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA;AACzD,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAC1F,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AAChF,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAA;AACtD,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAA;AAChE,OAAO,EACL,UAAU,EACV,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,iBAAiB,GACvB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EACL,cAAc,EACd,MAAM,EACN,kBAAkB,EAClB,UAAU,EACV,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,iBAAiB,GACvB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,aAAa,EACb,WAAW,EACX,QAAQ,EACR,KAAK,KAAK,EACV,KAAK,aAAa,EAClB,KAAK,iBAAiB,GACvB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC7E,OAAO,EACL,WAAW,EACX,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,GACvB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EACL,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,GACxB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,iBAAiB,EACjB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,GAC7B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,YAAY,EACZ,WAAW,EACX,WAAW,EACX,SAAS,EACT,KAAK,cAAc,EACnB,KAAK,WAAW,GACjB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,QAAQ,EAAE,KAAK,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,QAAQ,EACR,OAAO,EACP,KAAK,QAAQ,EACb,KAAK,cAAc,EACnB,KAAK,eAAe,GACrB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,4BAA4B,EAC5B,yBAAyB,EACzB,sBAAsB,EACtB,yBAAyB,EACzB,wBAAwB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,GAC5B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,sBAAsB,EACtB,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,GAClC,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC7F,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,UAAU,EACV,KAAK,EACL,SAAS,EACT,SAAS,EACT,eAAe,EACf,MAAM,EACN,KAAK,UAAU,EACf,KAAK,gBAAgB,GACtB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,OAAO,EAAE,MAAM,YAAY,CAAA;AACvF,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAA;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACrE,OAAO,EACL,UAAU,EACV,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,cAAc,GACpB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,SAAS,EAAE,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AAC9E,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,qBAAqB,EACrB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,aAAa,GACnB,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,QAAQ,EACR,aAAa,EACb,WAAW,EACX,eAAe,EACf,WAAW,EACX,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,UAAU,GAChB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EACL,WAAW,EACX,cAAc,EACd,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,GAC3B,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACzF,OAAO,EACL,WAAW,EACX,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,GACvB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAA;AACnD,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAA;AACpE,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,aAAa,EACb,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,WAAW,GACjB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,KAAK,mBAAmB,GACzB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,KAAK,EACL,OAAO,EACP,KAAK,MAAM,EACX,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,eAAe,GACrB,MAAM,SAAS,CAAA;AAChB,OAAO,EACL,KAAK,EACL,WAAW,EACX,SAAS,EACT,QAAQ,EACR,SAAS,EACT,SAAS,EACT,KAAK,aAAa,GACnB,MAAM,SAAS,CAAA;AAChB,OAAO,EACL,QAAQ,EACR,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,UAAU,EACV,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,GACzB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,MAAM,EACN,SAAS,EACT,kBAAkB,EAClB,qBAAqB,EACrB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,UAAU,GAChB,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjF,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,YAAY,GAClB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,KAAK,cAAc,GACpB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA"}
|
package/index.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export { cn } from './utils.js';
|
|
2
|
+
export { Button, buttonVariants } from './button.js';
|
|
3
|
+
export { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter, } from './card.js';
|
|
4
|
+
export { Input } from './input.js';
|
|
5
|
+
export { Textarea } from './textarea.js';
|
|
6
|
+
export { Label } from './label.js';
|
|
7
|
+
export { Badge, badgeVariants } from './badge.js';
|
|
8
|
+
export { Alert, AlertTitle, AlertDescription, alertVariants } from './alert.js';
|
|
9
|
+
export { Switch } from './switch.js';
|
|
10
|
+
export { Checkbox } from './checkbox.js';
|
|
11
|
+
export { Separator } from './separator.js';
|
|
12
|
+
export { Progress } from './progress.js';
|
|
13
|
+
export { Slider } from './slider.js';
|
|
14
|
+
export { Skeleton } from './skeleton.js';
|
|
15
|
+
export { Spinner } from './spinner.js';
|
|
16
|
+
export { Avatar } from './avatar.js';
|
|
17
|
+
export { AnimatedNumber, formatNumber } from './animated-number.js';
|
|
18
|
+
export { Sparkline } from './sparkline.js';
|
|
19
|
+
export { Tabs } from './tabs.js';
|
|
20
|
+
export { TabContent } from './tab-content.js';
|
|
21
|
+
export { Tooltip } from './tooltip.js';
|
|
22
|
+
export { EmptyState } from './empty-state.js';
|
|
23
|
+
export { PageHeader, DetailHeader, } from './page-header.js';
|
|
24
|
+
export { DocumentTitle } from './document-title.js';
|
|
25
|
+
export { UiLinkProvider, UiLink, UiBackLinkProvider, UiBackLink, } from './link-context.js';
|
|
26
|
+
export { ThemeProvider, ThemeToggle, useTheme, } from './theme.js';
|
|
27
|
+
export { getThemeScript } from './theme-script.js';
|
|
28
|
+
export { NavigationModeProvider, useNavigationMode } from './navigation-mode.js';
|
|
29
|
+
export { AccountMenu, } from './account-menu.js';
|
|
30
|
+
export { GlobalSearch, } from './global-search.js';
|
|
31
|
+
export { NotificationsBell, } from './notifications-bell.js';
|
|
32
|
+
export { ApiReference, ApiEndpoint, MethodBadge, CodeBlock, } from './api-reference.js';
|
|
33
|
+
export { AppShell } from './app-shell.js';
|
|
34
|
+
export { AppSidebar } from './app-sidebar.js';
|
|
35
|
+
export { TopNav } from './top-nav.js';
|
|
36
|
+
export { MobileTabBar } from './mobile-tab-bar.js';
|
|
37
|
+
export { SidebarNav, findActiveNavHref, isFlatNavigation, selectMobileTabs, toBlocks, NavIcon, } from './sidebar-nav.js';
|
|
38
|
+
export { buildDefaultNavigationConfig, reconcileNavigationConfig, resolveNavigationItems, stampKnownNavigationItems, isTenantNavigationConfig, } from './navigation-config.js';
|
|
39
|
+
export { NavigationConfigEditor, } from './navigation-config-editor.js';
|
|
40
|
+
export { PageContainer, ListPageLayout, DetailPageLayout, WizardLayout } from './page-layout.js';
|
|
41
|
+
export { parseListParams, parsePrefixedListParams, pickString, clamp, buildHref, mergeHref, buildExportHref, isUuid, } from './list-params.js';
|
|
42
|
+
export { ListNavProvider, useListNav, useListNavClick } from './list-nav.js';
|
|
43
|
+
export { SearchInput } from './list-search-input.js';
|
|
44
|
+
export { FilterChips, SearchSelectFilter } from './filter-chips.js';
|
|
45
|
+
export { SortableTh, SortTh } from './sortable-th.js';
|
|
46
|
+
export { Pagination } from './list-pagination.js';
|
|
47
|
+
export { PagedTable, } from './paged-table.js';
|
|
48
|
+
export { SubtabNav } from './subtab-nav.js';
|
|
49
|
+
export { OrgChart, buildOrgTree, canReparent, orgChartDescendantIds, } from './org-chart.js';
|
|
50
|
+
export { AdminHub, SettingsShell, SettingsNav, SettingsSection, SettingsRow, } from './settings-layout.js';
|
|
51
|
+
export { Popover } from './popover.js';
|
|
52
|
+
export { ContextMenu, useContextMenu, } from './context-menu.js';
|
|
53
|
+
export { SearchSelect } from './search-select.js';
|
|
54
|
+
export { MultiSelect, } from './multi-select.js';
|
|
55
|
+
export { Select } from './select.js';
|
|
56
|
+
export { Dialog } from './dialog.js';
|
|
57
|
+
export { ConfirmRoot, cancelConfirmDialog, confirmDialog, } from './confirm-dialog.js';
|
|
58
|
+
export { PromptRoot, promptDialog, cancelPromptDialog, } from './prompt-dialog.js';
|
|
59
|
+
export { toast, Toaster, } from './toast.js';
|
|
60
|
+
export { Table, TableHeader, TableBody, TableRow, TableHead, TableCell, } from './table.js';
|
|
61
|
+
export { LineGrid, } from './line-grid.js';
|
|
62
|
+
export { RecordList, } from './record-list.js';
|
|
63
|
+
export { WorkspaceLauncher, } from './workspace-launcher.js';
|
|
64
|
+
export { Drawer, UrlDrawer, DrawerTextProvider, DrawerNavigateContext, } from './drawer.js';
|
|
65
|
+
export { UiTextProvider, useUiText } from './text-context.js';
|
|
66
|
+
export { FileUploader, uploadReservedFile, } from './file-uploader.js';
|
|
67
|
+
export { defaultMaxUploadBytes, formatUploadSizeLimit, } from './upload-limits.js';
|
|
68
|
+
export { SignaturePad } from './signature-pad.js';
|
|
69
|
+
export { useElementSize } from './use-element-size.js';
|
|
70
|
+
//# sourceMappingURL=index.js.map
|
package/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["export { cn } from './utils'\nexport { Button, buttonVariants, type ButtonProps } from './button'\nexport {\n Card,\n CardHeader,\n CardTitle,\n CardDescription,\n CardContent,\n CardFooter,\n type CardProps,\n} from './card'\nexport { Input, type InputProps } from './input'\nexport { Textarea, type TextareaProps } from './textarea'\nexport { Label } from './label'\nexport { Badge, badgeVariants, type BadgeProps } from './badge'\nexport { Alert, AlertTitle, AlertDescription, alertVariants, type AlertProps } from './alert'\nexport { Switch, type SwitchProps } from './switch'\nexport { Checkbox, type CheckboxProps } from './checkbox'\nexport { Separator, type SeparatorProps } from './separator'\nexport { Progress, type ProgressProps } from './progress'\nexport { Slider, type SliderProps } from './slider'\nexport { Skeleton, type SkeletonProps } from './skeleton'\nexport { Spinner, type SpinnerProps } from './spinner'\nexport { Avatar, type AvatarProps } from './avatar'\nexport { AnimatedNumber, formatNumber, type AnimatedNumberProps } from './animated-number'\nexport { Sparkline, type SparklineProps, type SparklineTone } from './sparkline'\nexport { Tabs, type TabsProps, type TabItem } from './tabs'\nexport { TabContent } from './tab-content'\nexport { Tooltip, type TooltipProps } from './tooltip'\nexport { EmptyState, type EmptyStateProps } from './empty-state'\nexport {\n PageHeader,\n DetailHeader,\n type PageHeaderProps,\n type DetailHeaderProps,\n} from './page-header'\nexport { DocumentTitle } from './document-title'\nexport {\n UiLinkProvider,\n UiLink,\n UiBackLinkProvider,\n UiBackLink,\n type UiLinkComponent,\n type BackLinkProps,\n type BackLinkLike,\n type BackLinkComponent,\n} from './link-context'\nexport {\n ThemeProvider,\n ThemeToggle,\n useTheme,\n type Theme,\n type ResolvedTheme,\n type ThemeToggleLabels,\n} from './theme'\nexport { getThemeScript } from './theme-script'\nexport { NavigationModeProvider, useNavigationMode } from './navigation-mode'\nexport {\n AccountMenu,\n type AccountMenuProps,\n type AccountMenuChoice,\n type AccountMenuOption,\n type AccountMenuLabels,\n} from './account-menu'\nexport {\n GlobalSearch,\n type GlobalSearchHit,\n type GlobalSearchGroup,\n type GlobalSearchResult,\n type GlobalSearchLabels,\n} from './global-search'\nexport {\n NotificationsBell,\n type NotificationItem,\n type NotificationsBellLabels,\n} from './notifications-bell'\nexport {\n ApiReference,\n ApiEndpoint,\n MethodBadge,\n CodeBlock,\n type ApiEndpointDoc,\n type ApiParamDoc,\n} from './api-reference'\nexport { AppShell, type AppShellNavigationMode } from './app-shell'\nexport { AppSidebar } from './app-sidebar'\nexport { TopNav } from './top-nav'\nexport { MobileTabBar } from './mobile-tab-bar'\nexport {\n SidebarNav,\n findActiveNavHref,\n isFlatNavigation,\n selectMobileTabs,\n toBlocks,\n NavIcon,\n type NavBlock,\n type SidebarNavItem,\n type SidebarNavGroup,\n} from './sidebar-nav'\nexport {\n buildDefaultNavigationConfig,\n reconcileNavigationConfig,\n resolveNavigationItems,\n stampKnownNavigationItems,\n isTenantNavigationConfig,\n type NavigationRegistryItem,\n type NavigationItemConfig,\n type TenantNavigationConfig,\n type ResolvedNavigationItem,\n} from './navigation-config'\nexport {\n NavigationConfigEditor,\n type NavigationConfigEditorProps,\n type NavigationConfigEditorLabels,\n} from './navigation-config-editor'\nexport { PageContainer, ListPageLayout, DetailPageLayout, WizardLayout } from './page-layout'\nexport {\n parseListParams,\n parsePrefixedListParams,\n pickString,\n clamp,\n buildHref,\n mergeHref,\n buildExportHref,\n isUuid,\n type ListParams,\n type ListSearchParams,\n} from './list-params'\nexport { ListNavProvider, useListNav, useListNavClick, type ListNav } from './list-nav'\nexport { SearchInput } from './list-search-input'\nexport { FilterChips, SearchSelectFilter, type FilterOption } from './filter-chips'\nexport { SortableTh, SortTh } from './sortable-th'\nexport { Pagination, type PaginationLabels } from './list-pagination'\nexport {\n PagedTable,\n type PagedColumn,\n type PagedSortValue,\n type PagedTableLabels,\n type PagedTableProps,\n type PagedTableSort,\n} from './paged-table'\nexport { SubtabNav, type SubtabItem, type SubtabNavProps } from './subtab-nav'\nexport {\n OrgChart,\n buildOrgTree,\n canReparent,\n orgChartDescendantIds,\n type OrgChartNode,\n type OrgChartTreeNode,\n type OrgChartLabels,\n type OrgChartProps,\n} from './org-chart'\nexport {\n AdminHub,\n SettingsShell,\n SettingsNav,\n SettingsSection,\n SettingsRow,\n type AdminHubCard,\n type AdminHubGroup,\n type AdminHubAccent,\n type SettingsNavItem,\n type SettingsNavGroup,\n type LinkRender,\n} from './settings-layout'\nexport { Popover } from './popover'\nexport {\n ContextMenu,\n useContextMenu,\n type ContextMenuItem,\n type ContextMenuEntry,\n type ContextMenuController,\n} from './context-menu'\nexport { SearchSelect, type SearchSelectProps, type SelectOption } from './search-select'\nexport {\n MultiSelect,\n type MultiSelectProps,\n type MultiSelectOption,\n} from './multi-select'\nexport { Select, type SelectProps } from './select'\nexport { Dialog, type DialogProps, type DialogSize } from './dialog'\nexport {\n ConfirmRoot,\n cancelConfirmDialog,\n confirmDialog,\n type ConfirmDialogOptions,\n type ConfirmRootProps,\n type ConfirmTone,\n} from './confirm-dialog'\nexport {\n PromptRoot,\n promptDialog,\n cancelPromptDialog,\n type PromptDialogOptions,\n} from './prompt-dialog'\nexport {\n toast,\n Toaster,\n type ToastT,\n type ExternalToast,\n type ToastType,\n type ToasterPosition,\n} from './toast'\nexport {\n Table,\n TableHeader,\n TableBody,\n TableRow,\n TableHead,\n TableCell,\n type TableRowProps,\n} from './table'\nexport {\n LineGrid,\n type LineGridProps,\n type LineGridColumn,\n type LineGridLabels,\n} from './line-grid'\nexport {\n RecordList,\n type RecordListProps,\n type RecordColumn,\n type RecordCellKind,\n type RecordListLink,\n} from './record-list'\nexport {\n WorkspaceLauncher,\n type WorkspaceLauncherProps,\n type WorkspaceLaunchItem,\n type WorkspaceLaunchBreakdown,\n type WorkspaceLaunchSegment,\n type WorkspaceLaunchTone,\n} from './workspace-launcher'\nexport {\n Drawer,\n UrlDrawer,\n DrawerTextProvider,\n DrawerNavigateContext,\n type DrawerProps,\n type UrlDrawerProps,\n type DrawerSize,\n type DrawerSide,\n type DrawerText,\n} from './drawer'\nexport { UiTextProvider, useUiText, type UiTextTranslator } from './text-context'\nexport {\n FileUploader,\n uploadReservedFile,\n type FileUploaderProps,\n type UploadRequestResult,\n type FinalizeUploadInput,\n type RequestUploadAction,\n type FinalizeUploadAction,\n type UploadedFile,\n} from './file-uploader'\nexport {\n defaultMaxUploadBytes,\n formatUploadSizeLimit,\n type AttachmentKind,\n} from './upload-limits'\nexport { SignaturePad, type SignaturePadProps } from './signature-pad'\nexport { useElementSize } from './use-element-size'\n"]}
|
package/input.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export type InputProps = React.InputHTMLAttributes<HTMLInputElement>;
|
|
3
|
+
/**
|
|
4
|
+
* Input — tokenized field. `text-base` under sm: keeps iOS Safari from zooming
|
|
5
|
+
* the viewport on focus (anything under 16px triggers it). `aria-invalid`
|
|
6
|
+
* drives the error styling, so validation is a single attribute away.
|
|
7
|
+
*/
|
|
8
|
+
export declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<HTMLInputElement>>;
|
|
9
|
+
//# sourceMappingURL=input.d.ts.map
|
package/input.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../src/input.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,MAAM,MAAM,UAAU,GAAG,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAA;AAEpE;;;;GAIG;AACH,eAAO,MAAM,KAAK,qFAgBjB,CAAA"}
|
package/input.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { cn } from './utils.js';
|
|
4
|
+
/**
|
|
5
|
+
* Input — tokenized field. `text-base` under sm: keeps iOS Safari from zooming
|
|
6
|
+
* the viewport on focus (anything under 16px triggers it). `aria-invalid`
|
|
7
|
+
* drives the error styling, so validation is a single attribute away.
|
|
8
|
+
*/
|
|
9
|
+
export const Input = React.forwardRef(({ className, type, ...props }, ref) => (_jsx("input", { ref: ref, type: type, className: cn('flex h-10 w-full rounded-md border border-border bg-surface px-3 py-2 text-base text-fg placeholder:text-fg-subtle sm:text-sm', 'transition-shadow duration-150 ease-out', 'focus-visible:border-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40', 'disabled:cursor-not-allowed disabled:bg-bg-subtle disabled:opacity-50', 'aria-[invalid=true]:border-danger aria-[invalid=true]:focus-visible:ring-danger/30', className), ...props })));
|
|
10
|
+
Input.displayName = 'Input';
|
|
11
|
+
//# sourceMappingURL=input.js.map
|
package/input.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../src/input.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AAI5B;;;;GAIG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CACnC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CACtC,gBACE,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,EAAE,CACX,+HAA+H,EAC/H,yCAAyC,EACzC,yGAAyG,EACzG,uEAAuE,EACvE,oFAAoF,EACpF,SAAS,CACV,KACG,KAAK,GACT,CACH,CACF,CAAA;AACD,KAAK,CAAC,WAAW,GAAG,OAAO,CAAA","sourcesContent":["import * as React from 'react'\nimport { cn } from './utils'\n\nexport type InputProps = React.InputHTMLAttributes<HTMLInputElement>\n\n/**\n * Input — tokenized field. `text-base` under sm: keeps iOS Safari from zooming\n * the viewport on focus (anything under 16px triggers it). `aria-invalid`\n * drives the error styling, so validation is a single attribute away.\n */\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => (\n <input\n ref={ref}\n type={type}\n className={cn(\n 'flex h-10 w-full rounded-md border border-border bg-surface px-3 py-2 text-base text-fg placeholder:text-fg-subtle sm:text-sm',\n 'transition-shadow duration-150 ease-out',\n 'focus-visible:border-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/40',\n 'disabled:cursor-not-allowed disabled:bg-bg-subtle disabled:opacity-50',\n 'aria-[invalid=true]:border-danger aria-[invalid=true]:focus-visible:ring-danger/30',\n className,\n )}\n {...props}\n />\n ),\n)\nInput.displayName = 'Input'\n"]}
|
package/label.d.ts
ADDED
package/label.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../src/label.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,eAAO,MAAM,KAAK,sHAYhB,CAAA"}
|
package/label.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { cn } from './utils.js';
|
|
4
|
+
export const Label = React.forwardRef(({ className, ...props }, ref) => (_jsx("label", { ref: ref, className: cn('text-sm font-medium leading-none text-fg peer-disabled:cursor-not-allowed peer-disabled:opacity-70', className), ...props })));
|
|
5
|
+
Label.displayName = 'Label';
|
|
6
|
+
//# sourceMappingURL=label.js.map
|
package/label.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"label.js","sourceRoot":"","sources":["../src/label.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AAE5B,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAGnC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAClC,gBACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,oGAAoG,EACpG,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC,CAAA;AACF,KAAK,CAAC,WAAW,GAAG,OAAO,CAAA","sourcesContent":["import * as React from 'react'\nimport { cn } from './utils'\n\nexport const Label = React.forwardRef<\n HTMLLabelElement,\n React.LabelHTMLAttributes<HTMLLabelElement>\n>(({ className, ...props }, ref) => (\n <label\n ref={ref}\n className={cn(\n 'text-sm font-medium leading-none text-fg peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\n className,\n )}\n {...props}\n />\n))\nLabel.displayName = 'Label'\n"]}
|
package/line-grid.d.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LineGrid — a spreadsheet-grade line-item editor for documents (invoices,
|
|
3
|
+
* bills, journals, estimates). Controlled: rows in, rows out; the parent owns
|
|
4
|
+
* persistence and any computed columns.
|
|
5
|
+
*
|
|
6
|
+
* - Enter commits + moves down (appending a row at the bottom)
|
|
7
|
+
* - Alt+↑/↓ moves the row, ⌘/Ctrl+D duplicates, ⌘/Ctrl+⌫ deletes
|
|
8
|
+
* - per-row grip menu: insert above/below, duplicate, remove
|
|
9
|
+
* - amount cells edit raw, normalize to 2dp on blur, flag non-numeric
|
|
10
|
+
* - columns are data: text / amount / select / readonly (+ custom render)
|
|
11
|
+
*/
|
|
12
|
+
import * as React from 'react';
|
|
13
|
+
import { type SelectOption } from './search-select.js';
|
|
14
|
+
export type LineGridColumn<Row extends Record<string, unknown>> = {
|
|
15
|
+
key: string;
|
|
16
|
+
label: string;
|
|
17
|
+
/** CSS grid track, e.g. 'minmax(180px,2fr)' or '110px'. */
|
|
18
|
+
width: string;
|
|
19
|
+
type: 'text' | 'amount' | 'select' | 'readonly';
|
|
20
|
+
align?: 'left' | 'right';
|
|
21
|
+
options?: SelectOption[];
|
|
22
|
+
placeholder?: string;
|
|
23
|
+
required?: boolean;
|
|
24
|
+
/** Renderer for readonly columns (computed cells). */
|
|
25
|
+
render?: (row: Row, index: number) => React.ReactNode;
|
|
26
|
+
};
|
|
27
|
+
export type LineGridLabels = {
|
|
28
|
+
addLine: string;
|
|
29
|
+
keyboardHint: string;
|
|
30
|
+
insertAbove: string;
|
|
31
|
+
insertBelow: string;
|
|
32
|
+
duplicate: string;
|
|
33
|
+
removeLine: string;
|
|
34
|
+
clearLine: string;
|
|
35
|
+
lineActions: (n: number) => string;
|
|
36
|
+
};
|
|
37
|
+
export type LineGridProps<Row extends Record<string, unknown>> = {
|
|
38
|
+
columns: LineGridColumn<Row>[];
|
|
39
|
+
rows: Row[];
|
|
40
|
+
onRowsChange: (rows: Row[]) => void;
|
|
41
|
+
emptyRow: () => Row;
|
|
42
|
+
readOnly?: boolean;
|
|
43
|
+
minRows?: number;
|
|
44
|
+
footer?: React.ReactNode;
|
|
45
|
+
labels?: Partial<LineGridLabels>;
|
|
46
|
+
};
|
|
47
|
+
export declare function LineGrid<Row extends Record<string, unknown>>({ columns, rows, onRowsChange, emptyRow, readOnly, minRows, footer, labels: labelOverrides, }: LineGridProps<Row>): React.JSX.Element;
|
|
48
|
+
//# sourceMappingURL=line-grid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"line-grid.d.ts","sourceRoot":"","sources":["../src/line-grid.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAGjE,MAAM,MAAM,cAAc,CAAC,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI;IAChE,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAA;IAC/C,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACxB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAA;IACxB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,sDAAsD;IACtD,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAA;CACtD,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;CACnC,CAAA;AAmBD,MAAM,MAAM,aAAa,CAAC,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI;IAC/D,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC,EAAE,CAAA;IAC9B,IAAI,EAAE,GAAG,EAAE,CAAA;IACX,YAAY,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;IACnC,QAAQ,EAAE,MAAM,GAAG,CAAA;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;CACjC,CAAA;AAED,wBAAgB,QAAQ,CAAC,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC5D,OAAO,EACP,IAAI,EACJ,YAAY,EACZ,QAAQ,EACR,QAAgB,EAChB,OAAW,EACX,MAAM,EACN,MAAM,EAAE,cAAc,GACvB,EAAE,aAAa,CAAC,GAAG,CAAC,qBAwOpB"}
|
package/line-grid.js
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* LineGrid — a spreadsheet-grade line-item editor for documents (invoices,
|
|
5
|
+
* bills, journals, estimates). Controlled: rows in, rows out; the parent owns
|
|
6
|
+
* persistence and any computed columns.
|
|
7
|
+
*
|
|
8
|
+
* - Enter commits + moves down (appending a row at the bottom)
|
|
9
|
+
* - Alt+↑/↓ moves the row, ⌘/Ctrl+D duplicates, ⌘/Ctrl+⌫ deletes
|
|
10
|
+
* - per-row grip menu: insert above/below, duplicate, remove
|
|
11
|
+
* - amount cells edit raw, normalize to 2dp on blur, flag non-numeric
|
|
12
|
+
* - columns are data: text / amount / select / readonly (+ custom render)
|
|
13
|
+
*/
|
|
14
|
+
import * as React from 'react';
|
|
15
|
+
import { ArrowDown, ArrowUp, Copy, GripVertical, Plus, Trash2 } from 'lucide-react';
|
|
16
|
+
import { Button } from './button.js';
|
|
17
|
+
import { ContextMenu, useContextMenu } from './context-menu.js';
|
|
18
|
+
import { SearchSelect } from './search-select.js';
|
|
19
|
+
import { cn } from './utils.js';
|
|
20
|
+
const DEFAULT_LABELS = {
|
|
21
|
+
addLine: 'Add line',
|
|
22
|
+
keyboardHint: 'Enter to add a row · Alt+↑/↓ to move · ⌘D to duplicate · ⌘⌫ to remove',
|
|
23
|
+
insertAbove: 'Insert above',
|
|
24
|
+
insertBelow: 'Insert below',
|
|
25
|
+
duplicate: 'Duplicate',
|
|
26
|
+
removeLine: 'Remove line',
|
|
27
|
+
clearLine: 'Clear line',
|
|
28
|
+
lineActions: (n) => `Line ${n} actions`,
|
|
29
|
+
};
|
|
30
|
+
function normalizeAmount(v) {
|
|
31
|
+
const n = Number(v);
|
|
32
|
+
if (v.trim() === '' || Number.isNaN(n))
|
|
33
|
+
return v;
|
|
34
|
+
return n.toFixed(2);
|
|
35
|
+
}
|
|
36
|
+
export function LineGrid({ columns, rows, onRowsChange, emptyRow, readOnly = false, minRows = 1, footer, labels: labelOverrides, }) {
|
|
37
|
+
const labels = { ...DEFAULT_LABELS, ...labelOverrides };
|
|
38
|
+
const containerRef = React.useRef(null);
|
|
39
|
+
const focusedCol = React.useRef(0);
|
|
40
|
+
const menu = useContextMenu();
|
|
41
|
+
const [menuRow, setMenuRow] = React.useState(null);
|
|
42
|
+
const template = readOnly
|
|
43
|
+
? columns.map((c) => c.width).join(' ')
|
|
44
|
+
: `34px ${columns.map((c) => c.width).join(' ')}`;
|
|
45
|
+
const setCell = React.useCallback((i, key, value) => {
|
|
46
|
+
onRowsChange(rows.map((r, j) => (j === i ? { ...r, [key]: value } : r)));
|
|
47
|
+
}, [rows, onRowsChange]);
|
|
48
|
+
function focusCell(row, col) {
|
|
49
|
+
requestAnimationFrame(() => {
|
|
50
|
+
const el = containerRef.current?.querySelector(`[data-lg-row="${row}"][data-lg-col="${col}"] input, [data-lg-row="${row}"][data-lg-col="${col}"] button`);
|
|
51
|
+
el?.focus();
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
const insertRow = (at) => {
|
|
55
|
+
const next = [...rows];
|
|
56
|
+
next.splice(at, 0, emptyRow());
|
|
57
|
+
onRowsChange(next);
|
|
58
|
+
focusCell(at, 0);
|
|
59
|
+
};
|
|
60
|
+
const duplicateRow = (i) => {
|
|
61
|
+
const next = [...rows];
|
|
62
|
+
next.splice(i + 1, 0, { ...rows[i] });
|
|
63
|
+
onRowsChange(next);
|
|
64
|
+
focusCell(i + 1, 0);
|
|
65
|
+
};
|
|
66
|
+
const removeRow = (i) => {
|
|
67
|
+
if (rows.length <= minRows) {
|
|
68
|
+
onRowsChange(rows.map((r, j) => (j === i ? emptyRow() : r)));
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
onRowsChange(rows.filter((_, j) => j !== i));
|
|
72
|
+
};
|
|
73
|
+
const moveRow = (i, delta) => {
|
|
74
|
+
const j = i + delta;
|
|
75
|
+
if (j < 0 || j >= rows.length)
|
|
76
|
+
return;
|
|
77
|
+
const next = [...rows];
|
|
78
|
+
const [row] = next.splice(i, 1);
|
|
79
|
+
next.splice(j, 0, row);
|
|
80
|
+
onRowsChange(next);
|
|
81
|
+
focusCell(j, focusedCol.current);
|
|
82
|
+
};
|
|
83
|
+
function handleKeyDown(e, i, colIndex) {
|
|
84
|
+
focusedCol.current = colIndex;
|
|
85
|
+
const mod = e.metaKey || e.ctrlKey;
|
|
86
|
+
if (e.key === 'Enter' && !e.shiftKey && !mod) {
|
|
87
|
+
if (e.target.getAttribute('aria-expanded') === 'true')
|
|
88
|
+
return;
|
|
89
|
+
e.preventDefault();
|
|
90
|
+
if (i === rows.length - 1) {
|
|
91
|
+
onRowsChange([...rows, emptyRow()]);
|
|
92
|
+
focusCell(i + 1, colIndex);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
focusCell(i + 1, colIndex);
|
|
96
|
+
}
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (e.altKey && e.key === 'ArrowUp') {
|
|
100
|
+
e.preventDefault();
|
|
101
|
+
moveRow(i, -1);
|
|
102
|
+
}
|
|
103
|
+
else if (e.altKey && e.key === 'ArrowDown') {
|
|
104
|
+
e.preventDefault();
|
|
105
|
+
moveRow(i, 1);
|
|
106
|
+
}
|
|
107
|
+
else if (mod && (e.key === 'd' || e.key === 'D')) {
|
|
108
|
+
e.preventDefault();
|
|
109
|
+
duplicateRow(i);
|
|
110
|
+
}
|
|
111
|
+
else if (mod && e.key === 'Backspace') {
|
|
112
|
+
e.preventDefault();
|
|
113
|
+
removeRow(i);
|
|
114
|
+
focusCell(Math.max(0, i - 1), colIndex);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const cellBase = 'flex min-h-[38px] items-center border-b border-border-subtle px-1';
|
|
118
|
+
const inputBase = 'w-full rounded-sm border-0 bg-transparent px-1.5 py-1 text-sm text-fg outline-none focus:ring-2 focus:ring-ring/50';
|
|
119
|
+
return (_jsxs("div", { children: [_jsx("div", { ref: containerRef, className: "overflow-x-auto rounded-lg border border-border bg-surface", children: _jsxs("div", { className: "grid min-w-fit", style: { gridTemplateColumns: template }, children: [!readOnly ? _jsx("div", { className: "border-b border-border" }) : null, columns.map((c) => (_jsxs("div", { className: cn('border-b border-border px-2.5 py-2 text-[11px] font-semibold tracking-wide text-fg-muted uppercase', c.align === 'right' && 'text-right'), children: [c.label, c.required && !readOnly ? _jsx("span", { className: "text-danger", children: " *" }) : null] }, c.key))), rows.map((row, i) => (_jsxs(React.Fragment, { children: [!readOnly ? (_jsx("div", { className: cn(cellBase, 'justify-center px-0'), children: _jsxs("button", { type: "button", "aria-label": labels.lineActions(i + 1), onClick: (e) => {
|
|
120
|
+
setMenuRow(i);
|
|
121
|
+
menu.openBelow(e.currentTarget);
|
|
122
|
+
}, className: "group flex size-7 items-center justify-center rounded text-fg-subtle transition-colors hover:bg-surface-hover hover:text-fg-muted", children: [_jsx("span", { className: "text-[11px] tabular-nums group-hover:hidden", children: i + 1 }), _jsx(GripVertical, { size: 13, className: "hidden group-hover:block" })] }) })) : null, columns.map((c, colIndex) => {
|
|
123
|
+
const value = row[c.key];
|
|
124
|
+
if (readOnly || c.type === 'readonly') {
|
|
125
|
+
let display;
|
|
126
|
+
if (c.render)
|
|
127
|
+
display = c.render(row, i);
|
|
128
|
+
else if (c.type === 'select' && value)
|
|
129
|
+
display = c.options?.find((o) => o.value === value)?.label ?? '';
|
|
130
|
+
else
|
|
131
|
+
display = value ?? '';
|
|
132
|
+
return (_jsx("div", { className: cn(cellBase, 'px-2.5 text-sm', c.align === 'right' && 'justify-end tabular-nums'), children: display }, c.key));
|
|
133
|
+
}
|
|
134
|
+
return (_jsx("div", { "data-lg-row": i, "data-lg-col": colIndex, className: cellBase, onKeyDown: (e) => handleKeyDown(e, i, colIndex), children: c.type === 'select' ? (_jsx(SearchSelect, { value: value ?? '', onChange: (v) => setCell(i, c.key, v), options: c.options ?? [], placeholder: c.placeholder ?? '—', triggerClassName: "h-auto min-h-0 border-0 bg-transparent px-1.5 py-1 focus-visible:ring-1" })) : c.type === 'amount' ? (_jsx("input", { inputMode: "decimal", value: value ?? '', placeholder: c.placeholder ?? '0.00', "aria-invalid": value !== '' && value != null && Number.isNaN(Number(value)) ? true : undefined, onChange: (e) => setCell(i, c.key, e.target.value), onBlur: (e) => setCell(i, c.key, normalizeAmount(e.target.value)), className: cn(inputBase, 'text-right tabular-nums', value !== '' && value != null && Number.isNaN(Number(value)) &&
|
|
135
|
+
'text-danger focus:ring-danger/50') })) : (_jsx("input", { value: value ?? '', placeholder: c.placeholder, onChange: (e) => setCell(i, c.key, e.target.value), className: inputBase })) }, c.key));
|
|
136
|
+
})] }, i)))] }) }), _jsxs("div", { className: "mt-2 flex items-center justify-between gap-3", children: [!readOnly ? (_jsxs(Button, { type: "button", variant: "outline", size: "sm", onClick: () => insertRow(rows.length), children: [_jsx(Plus, { size: 14 }), " ", labels.addLine] })) : (_jsx("span", {})), footer] }), !readOnly ? _jsx("p", { className: "mt-1.5 text-[11px] text-fg-subtle", children: labels.keyboardHint }) : null, _jsx(ContextMenu, { open: menu.open && menuRow != null, position: menu.position, onClose: () => {
|
|
137
|
+
menu.close();
|
|
138
|
+
setMenuRow(null);
|
|
139
|
+
}, items: menuRow == null
|
|
140
|
+
? []
|
|
141
|
+
: [
|
|
142
|
+
{ key: 'above', label: labels.insertAbove, icon: ArrowUp, onSelect: () => insertRow(menuRow) },
|
|
143
|
+
{ key: 'below', label: labels.insertBelow, icon: ArrowDown, onSelect: () => insertRow(menuRow + 1) },
|
|
144
|
+
{ key: 'dup', label: labels.duplicate, icon: Copy, onSelect: () => duplicateRow(menuRow) },
|
|
145
|
+
{ key: 'sep', separator: true },
|
|
146
|
+
{
|
|
147
|
+
key: 'rm',
|
|
148
|
+
label: rows.length > minRows ? labels.removeLine : labels.clearLine,
|
|
149
|
+
icon: Trash2,
|
|
150
|
+
danger: true,
|
|
151
|
+
onSelect: () => removeRow(menuRow),
|
|
152
|
+
},
|
|
153
|
+
] })] }));
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=line-grid.js.map
|