@eifi1/ui-kit 0.16.1 → 0.18.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/README.md +34 -9
- package/dist/chart.d.ts +10 -1
- package/dist/components/account-chips.d.ts +153 -0
- package/dist/components/account-chips.js +135 -0
- package/dist/components/account-chips.js.map +1 -0
- package/dist/components/account-settings-labels.d.ts +10 -2
- package/dist/components/account-settings-labels.js +3 -0
- package/dist/components/account-settings-labels.js.map +1 -1
- package/dist/components/amount-input.d.ts +18 -1
- package/dist/components/amount-input.js.map +1 -1
- package/dist/components/button-group.d.ts +10 -1
- package/dist/components/calculator.d.ts +10 -1
- package/dist/components/chip.d.ts +25 -1
- package/dist/components/chip.js +143 -6
- package/dist/components/chip.js.map +1 -1
- package/dist/components/confirm-dialog.d.ts +42 -1
- package/dist/components/confirm-dialog.js +36 -5
- package/dist/components/confirm-dialog.js.map +1 -1
- package/dist/components/copy-button.d.ts +10 -1
- package/dist/components/danger-confirm.d.ts +55 -4
- package/dist/components/danger-confirm.js +67 -30
- package/dist/components/danger-confirm.js.map +1 -1
- package/dist/components/data-table-cells.d.ts +1 -1
- package/dist/components/data-table-filter-popover.d.ts +1 -1
- package/dist/components/data-table-filters.d.ts +1 -1
- package/dist/components/data-table.d.ts +1 -1
- package/dist/components/data-table.js +93 -3
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/facing-pair.d.ts +10 -1
- package/dist/components/file-button.d.ts +10 -1
- package/dist/components/file-dropzone.d.ts +10 -1
- package/dist/components/form-actions.d.ts +10 -1
- package/dist/components/form-actions.js +35 -1
- package/dist/components/form-actions.js.map +1 -1
- package/dist/components/line-items.d.ts +30 -6
- package/dist/components/line-items.js +77 -33
- package/dist/components/line-items.js.map +1 -1
- package/dist/components/list.d.ts +13 -1
- package/dist/components/list.js.map +1 -1
- package/dist/components/money-field.d.ts +10 -1
- package/dist/components/number-field.d.ts +11 -2
- package/dist/components/number-field.js +23 -22
- package/dist/components/number-field.js.map +1 -1
- package/dist/components/number-input.d.ts +10 -1
- package/dist/components/numpad-sheet.d.ts +10 -1
- package/dist/components/passkeys-setting.d.ts +27 -1
- package/dist/components/passkeys-setting.js +31 -5
- package/dist/components/passkeys-setting.js.map +1 -1
- package/dist/components/progress-bar.d.ts +25 -1
- package/dist/components/progress-bar.js +21 -4
- package/dist/components/progress-bar.js.map +1 -1
- package/dist/components/reauth-dialog.d.ts +90 -0
- package/dist/components/reauth-dialog.js +158 -0
- package/dist/components/reauth-dialog.js.map +1 -0
- package/dist/components/series-chart.d.ts +10 -1
- package/dist/components/server-wake.d.ts +58 -0
- package/dist/components/server-wake.js +58 -0
- package/dist/components/server-wake.js.map +1 -0
- package/dist/components/settings-fields.d.ts +10 -1
- package/dist/components/share-card.d.ts +61 -0
- package/dist/components/share-card.js +350 -0
- package/dist/components/share-card.js.map +1 -0
- package/dist/components/signed-amount.d.ts +12 -3
- package/dist/components/signed-amount.js +6 -4
- package/dist/components/signed-amount.js.map +1 -1
- package/dist/components/status-dot.d.ts +2 -0
- package/dist/components/text-link.d.ts +10 -1
- package/dist/components/time-input.d.ts +10 -1
- package/dist/components/toast.d.ts +10 -1
- package/dist/components/toast.js +42 -2
- package/dist/components/toast.js.map +1 -1
- package/dist/components/toggle-group.js +5 -2
- package/dist/components/toggle-group.js.map +1 -1
- package/dist/components/ui.d.ts +10 -1
- package/dist/components/ui.js +67 -30
- package/dist/components/ui.js.map +1 -1
- package/dist/components/use-table-state.d.ts +1 -1
- package/dist/components/user-avatar.d.ts +2 -0
- package/dist/components/write-lock.d.ts +68 -0
- package/dist/components/write-lock.js +33 -0
- package/dist/components/write-lock.js.map +1 -0
- package/dist/{data-table-CfVXtCeG.d.ts → data-table-3mi2R3so.d.ts} +59 -1
- package/dist/data-table.d.ts +1 -1
- package/dist/hooks/use-file-drop.d.ts +10 -1
- package/dist/hooks/use-overlay-history.js +16 -0
- package/dist/hooks/use-overlay-history.js.map +1 -1
- package/dist/i18n/defaults.d.ts +10 -1
- package/dist/i18n/defaults.js +11 -1
- package/dist/i18n/defaults.js.map +1 -1
- package/dist/i18n/german.d.ts +78 -0
- package/dist/i18n/{locales/de.js → german.js} +59 -9
- package/dist/i18n/german.js.map +1 -0
- package/dist/i18n/kit-labels.d.ts +10 -1
- package/dist/i18n/kit-labels.js +5 -0
- package/dist/i18n/kit-labels.js.map +1 -1
- package/dist/i18n/locales/de-CH.d.ts +23 -8
- package/dist/i18n/locales/de-CH.js +7 -3
- package/dist/i18n/locales/de-CH.js.map +1 -1
- package/dist/i18n/locales/{de.d.ts → en.d.ts} +24 -10
- package/dist/i18n/locales/en.js +95 -0
- package/dist/i18n/locales/en.js.map +1 -0
- package/dist/i18n/locales/es.d.ts +10 -1
- package/dist/i18n/locales/es.js +51 -1
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.d.ts +10 -1
- package/dist/i18n/locales/fr.js +51 -1
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.d.ts +10 -1
- package/dist/i18n/locales/hu.js +54 -1
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.d.ts +10 -1
- package/dist/i18n/locales/it.js +51 -1
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.d.ts +10 -1
- package/dist/i18n/locales/zh.js +50 -1
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/swiss.d.ts +3 -3
- package/dist/i18n/swiss.js.map +1 -1
- package/dist/index.d.ts +11 -6
- package/dist/index.js +33 -1
- package/dist/index.js.map +1 -1
- package/dist/{kit-labels-DE--LmCk.d.ts → kit-labels-CPbsjlXr.d.ts} +282 -10
- package/dist/lib/server-wake.d.ts +130 -0
- package/dist/lib/server-wake.js +121 -0
- package/dist/lib/server-wake.js.map +1 -0
- package/dist/rhf/fields.d.ts +10 -1
- package/dist/rhf/form.d.ts +10 -1
- package/dist/rhf/line-items.js.map +1 -1
- package/dist/rhf.d.ts +10 -1
- package/dist/search/global-search.d.ts +24 -4
- package/dist/search/global-search.js +31 -3
- package/dist/search/global-search.js.map +1 -1
- package/dist/search.d.ts +1 -1
- package/dist/shell/app-shell.d.ts +10 -1
- package/dist/shell/top-bar-brand.d.ts +10 -1
- package/dist/shell/topbar-action-menu.d.ts +2 -0
- package/dist/shell.d.ts +10 -1
- package/dist/wizard/stepper-nav.d.ts +10 -1
- package/dist/wizard.d.ts +10 -1
- package/package.json +1 -1
- package/src/components/account-chips.tsx +302 -0
- package/src/components/account-settings-labels.ts +16 -2
- package/src/components/amount-input.tsx +8 -0
- package/src/components/chip.tsx +239 -6
- package/src/components/confirm-dialog.tsx +82 -7
- package/src/components/danger-confirm.tsx +118 -33
- package/src/components/data-table.tsx +185 -3
- package/src/components/form-actions.tsx +93 -4
- package/src/components/line-items.tsx +116 -40
- package/src/components/list.tsx +13 -1
- package/src/components/number-field.tsx +32 -26
- package/src/components/passkeys-setting.tsx +68 -7
- package/src/components/progress-bar.tsx +40 -4
- package/src/components/reauth-dialog.tsx +273 -0
- package/src/components/server-wake.tsx +124 -0
- package/src/components/share-card.tsx +615 -0
- package/src/components/signed-amount.tsx +16 -5
- package/src/components/toast.tsx +72 -2
- package/src/components/toggle-group.tsx +5 -2
- package/src/components/ui.tsx +145 -34
- package/src/components/write-lock.tsx +96 -0
- package/src/hooks/use-overlay-history.ts +51 -0
- package/src/i18n/defaults.ts +10 -0
- package/src/i18n/{locales/de.ts → german.ts} +68 -13
- package/src/i18n/kit-labels.tsx +22 -2
- package/src/i18n/locales/de-CH.ts +17 -8
- package/src/i18n/locales/en.ts +116 -0
- package/src/i18n/locales/es.ts +51 -0
- package/src/i18n/locales/fr.ts +52 -0
- package/src/i18n/locales/hu.ts +55 -0
- package/src/i18n/locales/it.ts +51 -0
- package/src/i18n/locales/zh.ts +50 -0
- package/src/i18n/swiss.ts +3 -3
- package/src/index.ts +23 -1
- package/src/lib/server-wake.ts +270 -0
- package/src/rhf/line-items.tsx +2 -1
- package/src/search/global-search.tsx +59 -6
- package/dist/i18n/locales/de-CH-informal.d.ts +0 -61
- package/dist/i18n/locales/de-CH-informal.js +0 -8
- package/dist/i18n/locales/de-CH-informal.js.map +0 -1
- package/dist/i18n/locales/de-informal.d.ts +0 -82
- package/dist/i18n/locales/de-informal.js +0 -37
- package/dist/i18n/locales/de-informal.js.map +0 -1
- package/dist/i18n/locales/de.js.map +0 -1
- package/src/i18n/locales/de-CH-informal.ts +0 -10
- package/src/i18n/locales/de-informal.ts +0 -61
package/dist/index.js
CHANGED
|
@@ -60,7 +60,8 @@ export * from "./components/password-strength.js";
|
|
|
60
60
|
export * from "./components/page-contents.js";
|
|
61
61
|
export * from "./components/disclosure.js";
|
|
62
62
|
export * from "./components/dialog-frame.js";
|
|
63
|
-
|
|
63
|
+
import { DangerConfirm, DEFAULT_DANGER_CONFIRM_LABELS, typedMatches } from "./components/danger-confirm.js";
|
|
64
|
+
import { ReauthDialog, DEFAULT_REAUTH_DIALOG_LABELS } from "./components/reauth-dialog.js";
|
|
64
65
|
export * from "./components/confirm-dialog.js";
|
|
65
66
|
export * from "./components/floating-panel.js";
|
|
66
67
|
export * from "./components/bulk-action-bar.js";
|
|
@@ -100,6 +101,11 @@ export * from "./components/tree-view.js";
|
|
|
100
101
|
export * from "./components/chart.js";
|
|
101
102
|
export * from "./components/description-list.js";
|
|
102
103
|
export * from "./components/form-actions.js";
|
|
104
|
+
import { WriteLockProvider, useWriteLock, DEFAULT_WRITE_LOCK_LABELS } from "./components/write-lock.js";
|
|
105
|
+
import { RoleChip, AccountStateChip, DateMark, dateColumn, DEFAULT_ACCOUNT_STATE_LABELS, ACCOUNT_STATE_TONES } from "./components/account-chips.js";
|
|
106
|
+
import { createServerWake, serverWake, watchReadsAnd, attachServerWake, wrapFetch } from "./lib/server-wake.js";
|
|
107
|
+
import { ServerWakeNotice, useServerWakeStage, DEFAULT_SERVER_WAKE_LABELS } from "./components/server-wake.js";
|
|
108
|
+
import { ShareCard, ShareDialog, SharePanel, DEFAULT_SHARE_CARD_LABELS } from "./components/share-card.js";
|
|
103
109
|
export * from "./components/line-items.js";
|
|
104
110
|
export * from "./components/progress-bar.js";
|
|
105
111
|
import { Skeleton } from "./components/skeleton.js";
|
|
@@ -156,23 +162,43 @@ export * from "./search/global-search.js";
|
|
|
156
162
|
export * from "./i18n/kit-labels.js";
|
|
157
163
|
export * from "./i18n/defaults.js";
|
|
158
164
|
export {
|
|
165
|
+
ACCOUNT_STATE_TONES,
|
|
166
|
+
AccountStateChip,
|
|
159
167
|
AuthedImage,
|
|
168
|
+
DEFAULT_ACCOUNT_STATE_LABELS,
|
|
160
169
|
DEFAULT_AUTHED_IMAGE_LABELS,
|
|
170
|
+
DEFAULT_DANGER_CONFIRM_LABELS,
|
|
161
171
|
DEFAULT_FILE_PICKER_LABELS,
|
|
172
|
+
DEFAULT_REAUTH_DIALOG_LABELS,
|
|
173
|
+
DEFAULT_SERVER_WAKE_LABELS,
|
|
174
|
+
DEFAULT_SHARE_CARD_LABELS,
|
|
162
175
|
DEFAULT_TOAST_LABELS,
|
|
176
|
+
DEFAULT_WRITE_LOCK_LABELS,
|
|
177
|
+
DangerConfirm,
|
|
163
178
|
DataTable,
|
|
179
|
+
DateMark,
|
|
164
180
|
FileButton,
|
|
165
181
|
FilterPopover,
|
|
166
182
|
OVERLAY_EXIT_MS,
|
|
183
|
+
ReauthDialog,
|
|
184
|
+
RoleChip,
|
|
167
185
|
ScrollArea,
|
|
186
|
+
ServerWakeNotice,
|
|
187
|
+
ShareCard,
|
|
188
|
+
ShareDialog,
|
|
189
|
+
SharePanel,
|
|
168
190
|
Skeleton,
|
|
169
191
|
SwipeableRow,
|
|
170
192
|
TOAST_ACTION_DURATION,
|
|
171
193
|
TextLink,
|
|
172
194
|
Toaster,
|
|
195
|
+
WriteLockProvider,
|
|
173
196
|
anchoredPanelPlacement,
|
|
197
|
+
attachServerWake,
|
|
174
198
|
cn,
|
|
175
199
|
copyToClipboard,
|
|
200
|
+
createServerWake,
|
|
201
|
+
dateColumn,
|
|
176
202
|
dragHasFiles,
|
|
177
203
|
encodeQr,
|
|
178
204
|
logger,
|
|
@@ -181,8 +207,10 @@ export {
|
|
|
181
207
|
parseHotkey,
|
|
182
208
|
readStored,
|
|
183
209
|
readTableUrlState,
|
|
210
|
+
serverWake,
|
|
184
211
|
setStoreLog,
|
|
185
212
|
toast,
|
|
213
|
+
typedMatches,
|
|
186
214
|
useAnchoredPanel,
|
|
187
215
|
useAnchoredRect,
|
|
188
216
|
useAnnounce,
|
|
@@ -203,10 +231,14 @@ export {
|
|
|
203
231
|
useOverlayHistory,
|
|
204
232
|
useRowSwipe,
|
|
205
233
|
useSearchParamState,
|
|
234
|
+
useServerWakeStage,
|
|
206
235
|
useTabParam,
|
|
207
236
|
useTableUrlState,
|
|
208
237
|
useVisualViewport,
|
|
209
238
|
useWindowedRows,
|
|
239
|
+
useWriteLock,
|
|
240
|
+
watchReadsAnd,
|
|
241
|
+
wrapFetch,
|
|
210
242
|
writeStored
|
|
211
243
|
};
|
|
212
244
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// @eifi1/ui-kit — shared design-system barrel.\n//\n// Domain-free UI + theme surface shared across apps (lead app: Keksdose). Consumers import\n// components/theme from \"@eifi1/ui-kit\" and the token stylesheet from \"@eifi1/ui-kit/tokens.css\".\n\n// ── lib ────────────────────────────────────────────────────────────────────\nexport * from \"./lib/calc\";\nexport { cn } from \"./lib/cn\";\nexport { logger, setStoreLog } from \"./lib/logger\";\n// Intl number / money / percent / date / relative-time formatting, and `useKitFormat()`\n// for the same bound to the provider's locale (kastlan's formatters.ts, English \"5m ago\").\nexport * from \"./lib/format\";\n// localStorage that never throws (Safari private mode, blocked site data).\nexport { readStored, writeStored } from \"./lib/safe-storage\";\n// Date helpers are also available via the \"@eifi1/ui-kit/dates\" subpath.\n\n// ── hooks ────────────────────────────────────────────────────────────────────\nexport { useMediaQuery } from \"./hooks/use-media-query\";\nexport { useBodyScrollLock } from \"./hooks/use-body-scroll-lock\";\nexport { useAnchoredRect } from \"./hooks/use-anchored-rect\";\nexport type { AnchorRect } from \"./hooks/use-anchored-rect\";\nexport { useAnchoredPanel, anchoredPanelPlacement, useVisualViewport } from \"./hooks/use-anchored-panel\";\nexport type {\n AnchoredPanel,\n AnchoredPanelOptions,\n ViewportBox,\n} from \"./hooks/use-anchored-panel\";\nexport { useEscapeKey, useOutsideClick } from \"./hooks/use-dismiss\";\n// Focus containment for an overlay, and a live region for a change that moves no focus.\n// Both were extracted from the two components that already did them correctly (Modal and\n// CommandPalette) so the rest of the kit stops being the exception.\nexport { useFocusTrap } from \"./hooks/use-focus-trap\";\nexport type { FocusTrapOptions } from \"./hooks/use-focus-trap\";\nexport { useAnnounce } from \"./hooks/use-announce\";\nexport type { UseAnnounceReturn, UseAnnounceOptions, AnnounceRegionProps } from \"./hooks/use-announce\";\nexport { useOverlayHistory } from \"./hooks/use-overlay-history\";\nexport { useCloseTransition, OVERLAY_EXIT_MS } from \"./hooks/use-close-transition\";\nexport { useRowSwipe } from \"./hooks/use-row-swipe\";\nexport type { SwipeStage, RowSwipeOptions, RowSwipeReturn } from \"./hooks/use-row-swipe\";\n// Any element as a file drop target, screened like FileButton (kastlan).\nexport { useFileDrop, dragHasFiles } from \"./hooks/use-file-drop\";\nexport type { UseFileDropOptions, UseFileDropReturn, FileDropProps } from \"./hooks/use-file-drop\";\n// kastlan's search boxes each carried a hand-rolled copy, two without the cleanup.\nexport { useDebounce, useDebouncedCallback } from \"./hooks/use-debounce\";\nexport type { DebouncedCallbackOptions, DebouncedFunction } from \"./hooks/use-debounce\";\n// One search param as state, the active tab in `?tab=`, and a dialog's open state in the\n// URL (Modal's `urlParam`) — kastlan's and keksdose's use-search-param-state, in the kit.\nexport { useSearchParamState, useTabParam, useDialogParam } from \"./hooks/use-search-param-state\";\nexport type { SearchParamStateOptions, DialogParam } from \"./hooks/use-search-param-state\";\n// Copy that reports whether it worked — keksdose's copy buttons said \"Copied\" when it had not.\nexport { useCopyToClipboard, copyToClipboard } from \"./hooks/use-copy-to-clipboard\";\nexport type { CopyState, UseCopyToClipboardOptions, UseCopyToClipboardReturn } from \"./hooks/use-copy-to-clipboard\";\n// Keyboard shortcuts (\"Mod+K\", \"Ctrl+Shift+F\") that leave typing in fields alone.\nexport { useHotkey, parseHotkey, matchesHotkey } from \"./hooks/use-hotkey\";\nexport type { Hotkey, ParsedHotkey, UseHotkeyOptions } from \"./hooks/use-hotkey\";\n// A protected file as an object URL, fetched with the app's own auth (kastlan's AuthedImage).\nexport { useAuthedSrc } from \"./hooks/use-authed-src\";\nexport type { AuthedFetcher, AuthedSrcStatus, UseAuthedSrcOptions, UseAuthedSrcResult } from \"./hooks/use-authed-src\";\n\n// ── theme / palettes ─────────────────────────────────────────────────────────\nexport * from \"./theme/chart-palette\";\n// Colour maths (sRGB ↔ OKLCH, WCAG contrast, CVD simulation) and the palette deriver\n// that builds a whole, contrast-solved palette from one brand colour plus any colours\n// pinned by hand. `auditPalette` / `auditChartRamp` measure a palette rather than\n// trusting a comment about it.\nexport * from \"./theme/color\";\nexport * from \"./theme/palette-derive\";\nexport * from \"./theme/palette-presets\";\nexport * from \"./theme/theme-store\";\nexport * from \"./theme/palette-store\";\n\n// ── components ───────────────────────────────────────────────────────────────\nexport * from \"./components/ui\";\n// The label-ABOVE field group (label, hint, error, required), inside wizards or out.\nexport * from \"./components/field\";\nexport * from \"./components/search-field\";\nexport * from \"./components/dropdown\";\nexport * from \"./components/popover\";\nexport { SwipeableRow } from \"./components/swipeable-row\";\nexport type { SwipeAction, SwipeableRowProps } from \"./components/swipeable-row\";\nexport * from \"./components/calculator\";\nexport * from \"./components/numpad-sheet\";\nexport * from \"./components/number-input\";\nexport * from \"./components/currency-select\";\nexport * from \"./components/amount-input\";\nexport * from \"./components/money-field\";\nexport * from \"./components/combobox\";\nexport * from \"./components/picker-sheet\";\nexport * from \"./components/entity-combobox\";\nexport * from \"./components/multi-entity-combobox\";\nexport * from \"./components/multi-select\";\nexport * from \"./components/tooltip\";\nexport * from \"./components/user-avatar\";\nexport * from \"./components/settings-fields\";\n// Sync state for a database-backed field: the engine (`useFieldSync`) and the\n// affordance (`FieldSyncIndicator`), kept separate because the state is useful\n// without the dot — a form can gate its submit on any field being `pending`.\nexport * from \"./components/field-sync\";\nexport * from \"./components/month-picker\";\nexport * from \"./components/checkbox\";\nexport * from \"./components/switch\";\nexport * from \"./components/slider\";\nexport * from \"./components/time-input\";\nexport * from \"./components/number-field\";\nexport * from \"./components/sparkline\";\nexport * from \"./components/stat-tile\";\nexport * from \"./components/signature-pad\";\nexport * from \"./components/password-strength\";\nexport * from \"./components/page-contents\";\nexport * from \"./components/disclosure\";\nexport * from \"./components/dialog-frame\";\nexport * from \"./components/danger-confirm\";\n// `useConfirm()` — the promise-based replacement for `window.confirm`, one host per app.\nexport * from \"./components/confirm-dialog\";\n// A non-modal corner panel and its round trigger (keksdose's assistant launcher).\nexport * from \"./components/floating-panel\";\n// The count / clear / actions bar a selection brings up (keksdose's three copies).\nexport * from \"./components/bulk-action-bar\";\nexport * from \"./components/swatch-picker\";\nexport * from \"./components/icon-picker\";\nexport * from \"./components/choice-card\";\nexport * from \"./components/autocomplete\";\nexport * from \"./components/measured-grid\";\nexport { useWindowedRows } from \"./hooks/use-windowed-rows\";\nexport type { WindowedRows } from \"./hooks/use-windowed-rows\";\n// Named, not `export *`: file-button.tsx also holds the screening helpers the\n// dropzone shares, which are internal.\nexport { FileButton, useFilePicker, matchesAccept, DEFAULT_FILE_PICKER_LABELS } from \"./components/file-button\";\nexport type {\n FileButtonProps,\n UseFilePickerOptions,\n UseFilePickerReturn,\n FilePickerLabels,\n FileRejection,\n FileRejectionReason,\n FileScreenOptions,\n} from \"./components/file-button\";\nexport * from \"./components/treemap\";\nexport * from \"./components/series-chart\";\nexport * from \"./components/chart-zoom\";\nexport * from \"./components/toggle-legend\";\nexport * from \"./components/facing-pair\";\nexport * from \"./components/series-chart-labels\";\nexport * from \"./components/pie-chart\";\nexport * from \"./components/pie-chart-labels\";\nexport * from \"./components/account-settings\";\n// 0.12.0: the fourth account section, and the QR code TwoFactorSetting draws its\n// otpauth URI with (encoder in lib/qr-encode.ts — no dependency, see there).\nexport * from \"./components/passkeys-setting\";\nexport * from \"./components/qr-code\";\nexport { encodeQr } from \"./lib/qr-encode\";\nexport type { QrEncodeOptions, QrErrorCorrection, QrMatrix } from \"./lib/qr-encode\";\nexport * from \"./components/alert-banner\";\nexport * from \"./components/toggle-group\";\n// A wrapping set of links/buttons marked `aria-current` — Tabs-like looks, not tabs.\nexport * from \"./components/nav-pills\";\n// A pill carrying one VALUE — inert, a link, or a toggle, depending on which prop it is\n// given — and the list field built from it. Distinct from Button on purpose: a row of\n// buttons reads as \"choose an action\", a row of chips as \"here are the things\".\nexport * from \"./components/chip\";\nexport * from \"./components/wizard-stepper\";\nexport * from \"./components/hover-menu\";\nexport * from \"./components/modal\";\nexport * from \"./components/full-bleed-dialog\";\nexport * from \"./components/grouped-picker\";\nexport * from \"./components/file-dropzone\";\nexport * from \"./components/mini-calendar\";\nexport * from \"./components/calendar-heatmap\";\nexport * from \"./components/date-picker\";\nexport * from \"./components/tree-view\";\nexport * from \"./components/chart\";\n// 0.8.0 layout and feedback primitives the apps hand-rolled or took from shadcn/Radix.\nexport * from \"./components/description-list\";\n// The Save / Cancel row forms and dialogs end in, and the editable line-item repeater\n// (journal lines, lease components, invoice positions). 0.12.0.\nexport * from \"./components/form-actions\";\nexport * from \"./components/line-items\";\nexport * from \"./components/progress-bar\";\n// Named: skeleton.tsx also holds SKELETON_CLASS, the look StatTile shares — internal.\nexport { Skeleton } from \"./components/skeleton\";\nexport type { SkeletonProps, SkeletonShape } from \"./components/skeleton\";\n// 0.12.0: a centred spinner with words, signed figures and deltas, a render-error fallback.\nexport * from \"./components/loading-state\";\nexport * from \"./components/signed-amount\";\nexport * from \"./components/error-boundary\";\nexport * from \"./components/copy-button\";\nexport { AuthedImage, DEFAULT_AUTHED_IMAGE_LABELS } from \"./components/authed-image\";\nexport type { AuthedImageProps, AuthedImageLabels } from \"./components/authed-image\";\nexport * from \"./components/image-grid\";\nexport * from \"./components/lightbox\";\nexport * from \"./components/button-group\";\nexport * from \"./components/table\";\nexport * from \"./components/separator\";\n// Named: scroll-area.tsx also holds the overflow hook and scrollbar class Table shares.\nexport { ScrollArea } from \"./components/scroll-area\";\nexport type { ScrollAreaProps } from \"./components/scroll-area\";\n// 0.10.0 rows, menu rows, text primitives and page chrome the apps drew by hand.\nexport * from \"./components/list\";\nexport * from \"./components/menu-item\";\nexport * from \"./components/text\";\nexport * from \"./components/status-dot\";\nexport * from \"./components/page-header\";\nexport * from \"./components/breadcrumbs\";\n// The one inline link (kastlan's EntityLink / CellLink / legal and source links), through\n// `<UiKitProvider linkComponent>`. Named: the file also holds the kit's internal link picker.\nexport { TextLink } from \"./components/text-link\";\nexport type {\n TextLinkProps,\n TextLinkRenderProps,\n TextLinkTone,\n TextLinkUnderline,\n TextLinkCurrent,\n} from \"./components/text-link\";\n// The toast layer over sonner (an OPTIONAL peer, loaded lazily): `toast` mirrors sonner's\n// API so apps migrate by swapping the import; `<Toaster>` carries the placement, theme,\n// tones and z-index both apps had wired by hand.\nexport { toast, Toaster, DEFAULT_TOAST_LABELS, TOAST_ACTION_DURATION } from \"./components/toast\";\nexport type {\n ToastId,\n ToastAction,\n ToastOptions,\n ToastPromiseOptions,\n ToastUndoOptions,\n ToastRedoOptions,\n ToastLabels,\n ToastPosition,\n ToastSwipeDirection,\n ToasterOffset,\n ToasterProps,\n} from \"./components/toast\";\n\n// ── data-table suite ─────────────────────────────────────────────────────────\nexport * from \"./components/data-table-labels\";\nexport * from \"./components/data-table-sort\";\nexport * from \"./components/data-table-filters\";\nexport * from \"./components/data-table-pagination\";\nexport { FilterPopover } from \"./components/data-table-filter-popover\";\n// data-table re-exports SortState internally; export the rest explicitly to\n// avoid a duplicate SortState star-export (it comes from data-table-sort).\nexport { DataTable } from \"./components/data-table\";\nexport type {\n DataTableColumn,\n DataTableCellProps,\n DataTableHeadProps,\n DataTableProps,\n ServerPagination,\n FilterState,\n MobileSwipeActions,\n DataTableDensity,\n DataTableChrome,\n DataTableRowAction,\n} from \"./components/data-table\";\n// 0.12.0: the yes/no cell, and a server table's state held by its owner, URL-synced.\nexport * from \"./components/data-table-cells\";\nexport { useTableUrlState, readTableUrlState } from \"./components/use-table-state\";\nexport type {\n TableUrlState,\n TableUrlSync,\n TableUrlStateProps,\n UseTableUrlStateOptions,\n UseTableUrlStateReturn,\n} from \"./components/use-table-state\";\n\n// ── shell (composable app chrome) ────────────────────────────────────────────\nexport * from \"./shell/topbar-controls\";\nexport * from \"./shell/top-bar\";\nexport * from \"./shell/app-shell\";\nexport * from \"./shell/option-switcher-menu\";\nexport * from \"./shell/role-switcher\";\nexport * from \"./shell/topbar-action-menu\";\nexport * from \"./shell/top-bar-brand\";\nexport * from \"./shell/auth-layout\";\n\n// ── feedback ─────────────────────────────────────────────────────────────────\n// The form somebody files a report with, and the parts an inbox is built from:\n// the status vocabulary both apps share value for value, the policy about what a\n// row may move to from where it stands, and the look of a status control, a\n// category badge and an opened report. The app still wires its own API, columns\n// and strings — see the note at the top of `feedback-inbox.tsx` for what is\n// deliberately left to it.\nexport * from \"./feedback/feedback-attachment\";\nexport * from \"./feedback/feedback-dialog\";\nexport * from \"./feedback/feedback-inbox\";\nexport * from \"./feedback/feedback-thread\";\n\n// ── multi-step wizard ────────────────────────────────────────────────────────\n// The engine (step machine, validators, collected data), the chrome around it\n// (indicator + nav bar + cancel confirm) and the review step it ends on.\n// `components/wizard-stepper` next door is a different, much smaller thing: a bare\n// step indicator for a two-step import flow, with no engine.\n//\n// Two modules were removed here rather than kept as stock. `wizard-field` held a\n// `WizardField`/`WizardSelectField` pair that had never been rendered in any app —\n// a field group nothing was built from, which this comment used to advertise. And\n// `use-rhf-wizard-step` was the only thing in the package that touched\n// react-hook-form, for a hook neither consumer called: keeping it meant an optional\n// peer, a dev dependency and a type import in every consumer's typecheck, bought\n// for nobody. A design system may carry stock; untested stock nothing has ever\n// rendered is not stock, it is a liability with an export.\nexport * from \"./wizard/types\";\nexport * from \"./wizard/use-wizard\";\nexport * from \"./wizard/wizard-context\";\nexport * from \"./wizard/validation\";\nexport * from \"./wizard/wizard-step\";\nexport * from \"./wizard/wizard-summary\";\nexport * from \"./wizard/stepper-nav\";\n\n// ── guided tours ─────────────────────────────────────────────────────────────\nexport * from \"./tour/tour\";\n\n// ── command palette / global search ──────────────────────────────────────────\nexport * from \"./search/command-palette\";\nexport * from \"./search/search-index\";\nexport * from \"./search/global-search\";\n\n// ── i18n: one label tree, one optional provider ──────────────────────────────\n// `UiKitLabels` names every string the kit renders; `<UiKitProvider labels locale>`\n// hands a translation to every component below it. Precedence: a component's own\n// prop > the provider > the English default. See src/i18n/kit-labels.tsx.\nexport * from \"./i18n/kit-labels\";\nexport * from \"./i18n/defaults\";\n"],"mappings":";AAMA,cAAc;AACd,SAAS,UAAU;AACnB,SAAS,QAAQ,mBAAmB;AAGpC,cAAc;AAEd,SAAS,YAAY,mBAAmB;AAIxC,SAAS,qBAAqB;AAC9B,SAAS,yBAAyB;AAClC,SAAS,uBAAuB;AAEhC,SAAS,kBAAkB,wBAAwB,yBAAyB;AAM5E,SAAS,cAAc,uBAAuB;AAI9C,SAAS,oBAAoB;AAE7B,SAAS,mBAAmB;AAE5B,SAAS,yBAAyB;AAClC,SAAS,oBAAoB,uBAAuB;AACpD,SAAS,mBAAmB;AAG5B,SAAS,aAAa,oBAAoB;AAG1C,SAAS,aAAa,4BAA4B;AAIlD,SAAS,qBAAqB,aAAa,sBAAsB;AAGjE,SAAS,oBAAoB,uBAAuB;AAGpD,SAAS,WAAW,aAAa,qBAAqB;AAGtD,SAAS,oBAAoB;AAI7B,cAAc;AAKd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAAS,oBAAoB;AAE7B,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAId,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;AAEd,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAAS,uBAAuB;AAIhC,SAAS,YAAY,eAAe,eAAe,kCAAkC;AAUrF,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,SAAS,gBAAgB;AAEzB,cAAc;AACd,cAAc;AAEd,cAAc;AAId,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,SAAS,gBAAgB;AAGzB,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAAS,aAAa,mCAAmC;AAEzD,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,SAAS,kBAAkB;AAG3B,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,SAAS,gBAAgB;AAWzB,SAAS,OAAO,SAAS,sBAAsB,6BAA6B;AAgB5E,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAAS,qBAAqB;AAG9B,SAAS,iBAAiB;AAc1B,cAAc;AACd,SAAS,kBAAkB,yBAAyB;AAUpD,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AASd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAgBd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["// @eifi1/ui-kit — shared design-system barrel.\n//\n// Domain-free UI + theme surface shared across apps (lead app: Keksdose). Consumers import\n// components/theme from \"@eifi1/ui-kit\" and the token stylesheet from \"@eifi1/ui-kit/tokens.css\".\n\n// ── lib ────────────────────────────────────────────────────────────────────\nexport * from \"./lib/calc\";\nexport { cn } from \"./lib/cn\";\nexport { logger, setStoreLog } from \"./lib/logger\";\n// Intl number / money / percent / date / relative-time formatting, and `useKitFormat()`\n// for the same bound to the provider's locale (kastlan's formatters.ts, English \"5m ago\").\nexport * from \"./lib/format\";\n// localStorage that never throws (Safari private mode, blocked site data).\nexport { readStored, writeStored } from \"./lib/safe-storage\";\n// Date helpers are also available via the \"@eifi1/ui-kit/dates\" subpath.\n\n// ── hooks ────────────────────────────────────────────────────────────────────\nexport { useMediaQuery } from \"./hooks/use-media-query\";\nexport { useBodyScrollLock } from \"./hooks/use-body-scroll-lock\";\nexport { useAnchoredRect } from \"./hooks/use-anchored-rect\";\nexport type { AnchorRect } from \"./hooks/use-anchored-rect\";\nexport { useAnchoredPanel, anchoredPanelPlacement, useVisualViewport } from \"./hooks/use-anchored-panel\";\nexport type {\n AnchoredPanel,\n AnchoredPanelOptions,\n ViewportBox,\n} from \"./hooks/use-anchored-panel\";\nexport { useEscapeKey, useOutsideClick } from \"./hooks/use-dismiss\";\n// Focus containment for an overlay, and a live region for a change that moves no focus.\n// Both were extracted from the two components that already did them correctly (Modal and\n// CommandPalette) so the rest of the kit stops being the exception.\nexport { useFocusTrap } from \"./hooks/use-focus-trap\";\nexport type { FocusTrapOptions } from \"./hooks/use-focus-trap\";\nexport { useAnnounce } from \"./hooks/use-announce\";\nexport type { UseAnnounceReturn, UseAnnounceOptions, AnnounceRegionProps } from \"./hooks/use-announce\";\nexport { useOverlayHistory } from \"./hooks/use-overlay-history\";\nexport { useCloseTransition, OVERLAY_EXIT_MS } from \"./hooks/use-close-transition\";\nexport { useRowSwipe } from \"./hooks/use-row-swipe\";\nexport type { SwipeStage, RowSwipeOptions, RowSwipeReturn } from \"./hooks/use-row-swipe\";\n// Any element as a file drop target, screened like FileButton (kastlan).\nexport { useFileDrop, dragHasFiles } from \"./hooks/use-file-drop\";\nexport type { UseFileDropOptions, UseFileDropReturn, FileDropProps } from \"./hooks/use-file-drop\";\n// kastlan's search boxes each carried a hand-rolled copy, two without the cleanup.\nexport { useDebounce, useDebouncedCallback } from \"./hooks/use-debounce\";\nexport type { DebouncedCallbackOptions, DebouncedFunction } from \"./hooks/use-debounce\";\n// One search param as state, the active tab in `?tab=`, and a dialog's open state in the\n// URL (Modal's `urlParam`) — kastlan's and keksdose's use-search-param-state, in the kit.\nexport { useSearchParamState, useTabParam, useDialogParam } from \"./hooks/use-search-param-state\";\nexport type { SearchParamStateOptions, DialogParam } from \"./hooks/use-search-param-state\";\n// Copy that reports whether it worked — keksdose's copy buttons said \"Copied\" when it had not.\nexport { useCopyToClipboard, copyToClipboard } from \"./hooks/use-copy-to-clipboard\";\nexport type { CopyState, UseCopyToClipboardOptions, UseCopyToClipboardReturn } from \"./hooks/use-copy-to-clipboard\";\n// Keyboard shortcuts (\"Mod+K\", \"Ctrl+Shift+F\") that leave typing in fields alone.\nexport { useHotkey, parseHotkey, matchesHotkey } from \"./hooks/use-hotkey\";\nexport type { Hotkey, ParsedHotkey, UseHotkeyOptions } from \"./hooks/use-hotkey\";\n// A protected file as an object URL, fetched with the app's own auth (kastlan's AuthedImage).\nexport { useAuthedSrc } from \"./hooks/use-authed-src\";\nexport type { AuthedFetcher, AuthedSrcStatus, UseAuthedSrcOptions, UseAuthedSrcResult } from \"./hooks/use-authed-src\";\n\n// ── theme / palettes ─────────────────────────────────────────────────────────\nexport * from \"./theme/chart-palette\";\n// Colour maths (sRGB ↔ OKLCH, WCAG contrast, CVD simulation) and the palette deriver\n// that builds a whole, contrast-solved palette from one brand colour plus any colours\n// pinned by hand. `auditPalette` / `auditChartRamp` measure a palette rather than\n// trusting a comment about it.\nexport * from \"./theme/color\";\nexport * from \"./theme/palette-derive\";\nexport * from \"./theme/palette-presets\";\nexport * from \"./theme/theme-store\";\nexport * from \"./theme/palette-store\";\n\n// ── components ───────────────────────────────────────────────────────────────\nexport * from \"./components/ui\";\n// The label-ABOVE field group (label, hint, error, required), inside wizards or out.\nexport * from \"./components/field\";\nexport * from \"./components/search-field\";\nexport * from \"./components/dropdown\";\nexport * from \"./components/popover\";\nexport { SwipeableRow } from \"./components/swipeable-row\";\nexport type { SwipeAction, SwipeableRowProps } from \"./components/swipeable-row\";\nexport * from \"./components/calculator\";\nexport * from \"./components/numpad-sheet\";\nexport * from \"./components/number-input\";\nexport * from \"./components/currency-select\";\nexport * from \"./components/amount-input\";\nexport * from \"./components/money-field\";\nexport * from \"./components/combobox\";\nexport * from \"./components/picker-sheet\";\nexport * from \"./components/entity-combobox\";\nexport * from \"./components/multi-entity-combobox\";\nexport * from \"./components/multi-select\";\nexport * from \"./components/tooltip\";\nexport * from \"./components/user-avatar\";\nexport * from \"./components/settings-fields\";\n// Sync state for a database-backed field: the engine (`useFieldSync`) and the\n// affordance (`FieldSyncIndicator`), kept separate because the state is useful\n// without the dot — a form can gate its submit on any field being `pending`.\nexport * from \"./components/field-sync\";\nexport * from \"./components/month-picker\";\nexport * from \"./components/checkbox\";\nexport * from \"./components/switch\";\nexport * from \"./components/slider\";\nexport * from \"./components/time-input\";\nexport * from \"./components/number-field\";\nexport * from \"./components/sparkline\";\nexport * from \"./components/stat-tile\";\nexport * from \"./components/signature-pad\";\nexport * from \"./components/password-strength\";\nexport * from \"./components/page-contents\";\nexport * from \"./components/disclosure\";\nexport * from \"./components/dialog-frame\";\n// Named, not `*`: danger-confirm also holds the password field and pending hook that\n// ReauthDialog shares with it, which are kit-internal.\nexport { DangerConfirm, DEFAULT_DANGER_CONFIRM_LABELS, typedMatches } from \"./components/danger-confirm\";\nexport type { DangerConfirmLabels, DangerConfirmProps, TypedMatch } from \"./components/danger-confirm\";\n// 0.18: re-authentication before a sensitive action (Kurvenschmiede 4).\nexport { ReauthDialog, DEFAULT_REAUTH_DIALOG_LABELS } from \"./components/reauth-dialog\";\nexport type { ReauthDialogProps, ReauthDialogLabels } from \"./components/reauth-dialog\";\n// `useConfirm()` — the promise-based replacement for `window.confirm`, one host per app.\nexport * from \"./components/confirm-dialog\";\n// A non-modal corner panel and its round trigger (keksdose's assistant launcher).\nexport * from \"./components/floating-panel\";\n// The count / clear / actions bar a selection brings up (keksdose's three copies).\nexport * from \"./components/bulk-action-bar\";\nexport * from \"./components/swatch-picker\";\nexport * from \"./components/icon-picker\";\nexport * from \"./components/choice-card\";\nexport * from \"./components/autocomplete\";\nexport * from \"./components/measured-grid\";\nexport { useWindowedRows } from \"./hooks/use-windowed-rows\";\nexport type { WindowedRows } from \"./hooks/use-windowed-rows\";\n// Named, not `export *`: file-button.tsx also holds the screening helpers the\n// dropzone shares, which are internal.\nexport { FileButton, useFilePicker, matchesAccept, DEFAULT_FILE_PICKER_LABELS } from \"./components/file-button\";\nexport type {\n FileButtonProps,\n UseFilePickerOptions,\n UseFilePickerReturn,\n FilePickerLabels,\n FileRejection,\n FileRejectionReason,\n FileScreenOptions,\n} from \"./components/file-button\";\nexport * from \"./components/treemap\";\nexport * from \"./components/series-chart\";\nexport * from \"./components/chart-zoom\";\nexport * from \"./components/toggle-legend\";\nexport * from \"./components/facing-pair\";\nexport * from \"./components/series-chart-labels\";\nexport * from \"./components/pie-chart\";\nexport * from \"./components/pie-chart-labels\";\nexport * from \"./components/account-settings\";\n// 0.12.0: the fourth account section, and the QR code TwoFactorSetting draws its\n// otpauth URI with (encoder in lib/qr-encode.ts — no dependency, see there).\nexport * from \"./components/passkeys-setting\";\nexport * from \"./components/qr-code\";\nexport { encodeQr } from \"./lib/qr-encode\";\nexport type { QrEncodeOptions, QrErrorCorrection, QrMatrix } from \"./lib/qr-encode\";\nexport * from \"./components/alert-banner\";\nexport * from \"./components/toggle-group\";\n// A wrapping set of links/buttons marked `aria-current` — Tabs-like looks, not tabs.\nexport * from \"./components/nav-pills\";\n// A pill carrying one VALUE — inert, a link, or a toggle, depending on which prop it is\n// given — and the list field built from it. Distinct from Button on purpose: a row of\n// buttons reads as \"choose an action\", a row of chips as \"here are the things\".\nexport * from \"./components/chip\";\nexport * from \"./components/wizard-stepper\";\nexport * from \"./components/hover-menu\";\nexport * from \"./components/modal\";\nexport * from \"./components/full-bleed-dialog\";\nexport * from \"./components/grouped-picker\";\nexport * from \"./components/file-dropzone\";\nexport * from \"./components/mini-calendar\";\nexport * from \"./components/calendar-heatmap\";\nexport * from \"./components/date-picker\";\nexport * from \"./components/tree-view\";\nexport * from \"./components/chart\";\n// 0.8.0 layout and feedback primitives the apps hand-rolled or took from shadcn/Radix.\nexport * from \"./components/description-list\";\n// The Save / Cancel row forms and dialogs end in, and the editable line-item repeater\n// (journal lines, lease components, invoice positions). 0.12.0.\nexport * from \"./components/form-actions\";\n// 0.18: lock every opted-in commit under one provider, the reason in its tooltip\n// (Kurvenschmiede 2). `useCommitReason` stays internal.\nexport { WriteLockProvider, useWriteLock, DEFAULT_WRITE_LOCK_LABELS } from \"./components/write-lock\";\nexport type { WriteLock, WriteLockLabels, WriteLockProviderProps } from \"./components/write-lock\";\n// 0.18: the parts both apps' admin rosters repeat (Kurvenschmiede 6).\nexport { RoleChip, AccountStateChip, DateMark, dateColumn, DEFAULT_ACCOUNT_STATE_LABELS, ACCOUNT_STATE_TONES } from \"./components/account-chips\";\nexport type { RoleChipProps, RoleDefinition, RoleVocabulary, AccountState, AccountStateLabels, AccountStateChipProps, DateMarkProps, DateColumnOptions } from \"./components/account-chips\";\n// 0.18: the cold-start notice keksdose built (#199), for every app: a framework-free\n// watchdog over the app's requests and the corner notice that explains the wait.\nexport { createServerWake, serverWake, watchReadsAnd, attachServerWake, wrapFetch } from \"./lib/server-wake\";\nexport type { ServerWakeStage, ServerWakeFilter, ServerWakeOptions, ServerWakeRequest, ServerWakeWatcher, ServerWakeAxiosConfig, AxiosLikeInstance } from \"./lib/server-wake\";\nexport { ServerWakeNotice, useServerWakeStage, DEFAULT_SERVER_WAKE_LABELS } from \"./components/server-wake\";\nexport type { ServerWakeLabels, ServerWakeNoticeProps } from \"./components/server-wake\";\n// 0.18: sharing — grantees, roles, pending grants, candidates (Kurvenschmiede 1).\nexport { ShareCard, ShareDialog, SharePanel, DEFAULT_SHARE_CARD_LABELS } from \"./components/share-card\";\nexport type { ShareCardProps, ShareDialogProps, SharePanelProps, ShareCardLabels, ShareRole, ShareGrantee, SharePendingGrant, ShareCandidate, ShareAddRequest } from \"./components/share-card\";\nexport * from \"./components/line-items\";\nexport * from \"./components/progress-bar\";\n// Named: skeleton.tsx also holds SKELETON_CLASS, the look StatTile shares — internal.\nexport { Skeleton } from \"./components/skeleton\";\nexport type { SkeletonProps, SkeletonShape } from \"./components/skeleton\";\n// 0.12.0: a centred spinner with words, signed figures and deltas, a render-error fallback.\nexport * from \"./components/loading-state\";\nexport * from \"./components/signed-amount\";\nexport * from \"./components/error-boundary\";\nexport * from \"./components/copy-button\";\nexport { AuthedImage, DEFAULT_AUTHED_IMAGE_LABELS } from \"./components/authed-image\";\nexport type { AuthedImageProps, AuthedImageLabels } from \"./components/authed-image\";\nexport * from \"./components/image-grid\";\nexport * from \"./components/lightbox\";\nexport * from \"./components/button-group\";\nexport * from \"./components/table\";\nexport * from \"./components/separator\";\n// Named: scroll-area.tsx also holds the overflow hook and scrollbar class Table shares.\nexport { ScrollArea } from \"./components/scroll-area\";\nexport type { ScrollAreaProps } from \"./components/scroll-area\";\n// 0.10.0 rows, menu rows, text primitives and page chrome the apps drew by hand.\nexport * from \"./components/list\";\nexport * from \"./components/menu-item\";\nexport * from \"./components/text\";\nexport * from \"./components/status-dot\";\nexport * from \"./components/page-header\";\nexport * from \"./components/breadcrumbs\";\n// The one inline link (kastlan's EntityLink / CellLink / legal and source links), through\n// `<UiKitProvider linkComponent>`. Named: the file also holds the kit's internal link picker.\nexport { TextLink } from \"./components/text-link\";\nexport type {\n TextLinkProps,\n TextLinkRenderProps,\n TextLinkTone,\n TextLinkUnderline,\n TextLinkCurrent,\n} from \"./components/text-link\";\n// The toast layer over sonner (an OPTIONAL peer, loaded lazily): `toast` mirrors sonner's\n// API so apps migrate by swapping the import; `<Toaster>` carries the placement, theme,\n// tones and z-index both apps had wired by hand.\nexport { toast, Toaster, DEFAULT_TOAST_LABELS, TOAST_ACTION_DURATION } from \"./components/toast\";\nexport type {\n ToastId,\n ToastAction,\n ToastOptions,\n ToastPromiseOptions,\n ToastUndoOptions,\n ToastRedoOptions,\n ToastLabels,\n ToastPosition,\n ToastSwipeDirection,\n ToasterOffset,\n ToasterProps,\n} from \"./components/toast\";\n\n// ── data-table suite ─────────────────────────────────────────────────────────\nexport * from \"./components/data-table-labels\";\nexport * from \"./components/data-table-sort\";\nexport * from \"./components/data-table-filters\";\nexport * from \"./components/data-table-pagination\";\nexport { FilterPopover } from \"./components/data-table-filter-popover\";\n// data-table re-exports SortState internally; export the rest explicitly to\n// avoid a duplicate SortState star-export (it comes from data-table-sort).\nexport { DataTable } from \"./components/data-table\";\nexport type {\n DataTableColumn,\n DataTableCellProps,\n DataTableHeadProps,\n DataTableProps,\n ServerPagination,\n FilterState,\n MobileSwipeActions,\n DataTableDensity,\n DataTableChrome,\n DataTableRowAction,\n} from \"./components/data-table\";\n// 0.12.0: the yes/no cell, and a server table's state held by its owner, URL-synced.\nexport * from \"./components/data-table-cells\";\nexport { useTableUrlState, readTableUrlState } from \"./components/use-table-state\";\nexport type {\n TableUrlState,\n TableUrlSync,\n TableUrlStateProps,\n UseTableUrlStateOptions,\n UseTableUrlStateReturn,\n} from \"./components/use-table-state\";\n\n// ── shell (composable app chrome) ────────────────────────────────────────────\nexport * from \"./shell/topbar-controls\";\nexport * from \"./shell/top-bar\";\nexport * from \"./shell/app-shell\";\nexport * from \"./shell/option-switcher-menu\";\nexport * from \"./shell/role-switcher\";\nexport * from \"./shell/topbar-action-menu\";\nexport * from \"./shell/top-bar-brand\";\nexport * from \"./shell/auth-layout\";\n\n// ── feedback ─────────────────────────────────────────────────────────────────\n// The form somebody files a report with, and the parts an inbox is built from:\n// the status vocabulary both apps share value for value, the policy about what a\n// row may move to from where it stands, and the look of a status control, a\n// category badge and an opened report. The app still wires its own API, columns\n// and strings — see the note at the top of `feedback-inbox.tsx` for what is\n// deliberately left to it.\nexport * from \"./feedback/feedback-attachment\";\nexport * from \"./feedback/feedback-dialog\";\nexport * from \"./feedback/feedback-inbox\";\nexport * from \"./feedback/feedback-thread\";\n\n// ── multi-step wizard ────────────────────────────────────────────────────────\n// The engine (step machine, validators, collected data), the chrome around it\n// (indicator + nav bar + cancel confirm) and the review step it ends on.\n// `components/wizard-stepper` next door is a different, much smaller thing: a bare\n// step indicator for a two-step import flow, with no engine.\n//\n// Two modules were removed here rather than kept as stock. `wizard-field` held a\n// `WizardField`/`WizardSelectField` pair that had never been rendered in any app —\n// a field group nothing was built from, which this comment used to advertise. And\n// `use-rhf-wizard-step` was the only thing in the package that touched\n// react-hook-form, for a hook neither consumer called: keeping it meant an optional\n// peer, a dev dependency and a type import in every consumer's typecheck, bought\n// for nobody. A design system may carry stock; untested stock nothing has ever\n// rendered is not stock, it is a liability with an export.\nexport * from \"./wizard/types\";\nexport * from \"./wizard/use-wizard\";\nexport * from \"./wizard/wizard-context\";\nexport * from \"./wizard/validation\";\nexport * from \"./wizard/wizard-step\";\nexport * from \"./wizard/wizard-summary\";\nexport * from \"./wizard/stepper-nav\";\n\n// ── guided tours ─────────────────────────────────────────────────────────────\nexport * from \"./tour/tour\";\n\n// ── command palette / global search ──────────────────────────────────────────\nexport * from \"./search/command-palette\";\nexport * from \"./search/search-index\";\nexport * from \"./search/global-search\";\n\n// ── i18n: one label tree, one optional provider ──────────────────────────────\n// `UiKitLabels` names every string the kit renders; `<UiKitProvider labels locale>`\n// hands a translation to every component below it. Precedence: a component's own\n// prop > the provider > the English default. See src/i18n/kit-labels.tsx.\nexport * from \"./i18n/kit-labels\";\nexport * from \"./i18n/defaults\";\n"],"mappings":";AAMA,cAAc;AACd,SAAS,UAAU;AACnB,SAAS,QAAQ,mBAAmB;AAGpC,cAAc;AAEd,SAAS,YAAY,mBAAmB;AAIxC,SAAS,qBAAqB;AAC9B,SAAS,yBAAyB;AAClC,SAAS,uBAAuB;AAEhC,SAAS,kBAAkB,wBAAwB,yBAAyB;AAM5E,SAAS,cAAc,uBAAuB;AAI9C,SAAS,oBAAoB;AAE7B,SAAS,mBAAmB;AAE5B,SAAS,yBAAyB;AAClC,SAAS,oBAAoB,uBAAuB;AACpD,SAAS,mBAAmB;AAG5B,SAAS,aAAa,oBAAoB;AAG1C,SAAS,aAAa,4BAA4B;AAIlD,SAAS,qBAAqB,aAAa,sBAAsB;AAGjE,SAAS,oBAAoB,uBAAuB;AAGpD,SAAS,WAAW,aAAa,qBAAqB;AAGtD,SAAS,oBAAoB;AAI7B,cAAc;AAKd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAAS,oBAAoB;AAE7B,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAId,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,SAAS,eAAe,+BAA+B,oBAAoB;AAG3E,SAAS,cAAc,oCAAoC;AAG3D,cAAc;AAEd,cAAc;AAEd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAAS,uBAAuB;AAIhC,SAAS,YAAY,eAAe,eAAe,kCAAkC;AAUrF,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,SAAS,gBAAgB;AAEzB,cAAc;AACd,cAAc;AAEd,cAAc;AAId,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;AAGd,cAAc;AAGd,SAAS,mBAAmB,cAAc,iCAAiC;AAG3E,SAAS,UAAU,kBAAkB,UAAU,YAAY,8BAA8B,2BAA2B;AAIpH,SAAS,kBAAkB,YAAY,eAAe,kBAAkB,iBAAiB;AAEzF,SAAS,kBAAkB,oBAAoB,kCAAkC;AAGjF,SAAS,WAAW,aAAa,YAAY,iCAAiC;AAE9E,cAAc;AACd,cAAc;AAEd,SAAS,gBAAgB;AAGzB,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAAS,aAAa,mCAAmC;AAEzD,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAEd,SAAS,kBAAkB;AAG3B,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,SAAS,gBAAgB;AAWzB,SAAS,OAAO,SAAS,sBAAsB,6BAA6B;AAgB5E,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAAS,qBAAqB;AAG9B,SAAS,iBAAiB;AAc1B,cAAc;AACd,SAAS,kBAAkB,yBAAyB;AAUpD,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AASd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAgBd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;","names":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
|
-
import { AnchorHTMLAttributes, Ref, ReactElement, ButtonHTMLAttributes, ReactNode, SelectHTMLAttributes,
|
|
2
|
+
import { AnchorHTMLAttributes, Ref, ReactElement, ButtonHTMLAttributes, ReactNode, SelectHTMLAttributes, ComponentPropsWithoutRef, InputHTMLAttributes, TextareaHTMLAttributes } from 'react';
|
|
3
3
|
import { DataTableLabels } from './components/data-table-labels.js';
|
|
4
4
|
import { MiniCalendarLabels, WeekDay } from './components/mini-calendar.js';
|
|
5
5
|
import { CalendarHeatmapLabels } from './components/calendar-heatmap.js';
|
|
@@ -22,7 +22,7 @@ import { PasswordStrengthLabels } from './components/password-strength.js';
|
|
|
22
22
|
import { DangerConfirmLabels } from './components/danger-confirm.js';
|
|
23
23
|
import { SwatchPickerLabels } from './components/swatch-picker.js';
|
|
24
24
|
import { IconPickerLabels } from './components/icon-picker.js';
|
|
25
|
-
import { DialogFrameLabels } from './components/dialog-frame.js';
|
|
25
|
+
import { DialogFrameProps, DialogFrameLabels } from './components/dialog-frame.js';
|
|
26
26
|
import { MeasuredGridLabels } from './components/measured-grid.js';
|
|
27
27
|
import { f as FeedbackAttachmentFieldLabels, q as FeedbackDialogTextLabels } from './feedback-attachment-WFiXJ8We.js';
|
|
28
28
|
import { FeedbackThreadLabels, FeedbackComposerLabels } from './feedback/feedback-thread.js';
|
|
@@ -42,6 +42,10 @@ import { ErrorBoundaryLabels } from './components/error-boundary.js';
|
|
|
42
42
|
import { AuthedImageLabels } from './components/authed-image.js';
|
|
43
43
|
import { ImageGridLabels } from './components/image-grid.js';
|
|
44
44
|
import { LightboxLabels } from './components/lightbox.js';
|
|
45
|
+
import { WriteLockLabels } from './components/write-lock.js';
|
|
46
|
+
import { RoleDefinition, AccountStateLabels } from './components/account-chips.js';
|
|
47
|
+
import { ReauthDialogLabels } from './components/reauth-dialog.js';
|
|
48
|
+
import { ServerWakeLabels } from './components/server-wake.js';
|
|
45
49
|
|
|
46
50
|
type ButtonVariant = "primary" | "secondary" | "ghost" | "danger" | "brand" | "link";
|
|
47
51
|
type ButtonSize = "sm" | "md";
|
|
@@ -145,6 +149,13 @@ interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
|
145
149
|
* DangerConfirm keeps its own.
|
|
146
150
|
*/
|
|
147
151
|
disabledReason?: ReactNode;
|
|
152
|
+
/**
|
|
153
|
+
* This button COMMITS — it saves, creates, deletes. Under a locked
|
|
154
|
+
* {@link WriteLockProvider} it is disabled the `disabledReason` way, with the lock's
|
|
155
|
+
* reason (which wins over a `disabledReason` of its own). No provider, or an
|
|
156
|
+
* unlocked one: no effect. See {@link WriteLockProvider}.
|
|
157
|
+
*/
|
|
158
|
+
commit?: boolean;
|
|
148
159
|
/**
|
|
149
160
|
* Busy — the save is in flight: a spinner, `aria-busy`, and no second submit.
|
|
150
161
|
*
|
|
@@ -219,6 +230,7 @@ interface ButtonLinkProps extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>,
|
|
|
219
230
|
pending?: never;
|
|
220
231
|
pressed?: never;
|
|
221
232
|
disabledReason?: never;
|
|
233
|
+
commit?: never;
|
|
222
234
|
}
|
|
223
235
|
declare function Button(props: ButtonLinkProps): ReactElement;
|
|
224
236
|
declare function Button(props: ButtonProps): ReactElement;
|
|
@@ -427,6 +439,10 @@ interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
|
427
439
|
* reason nobody can see is not one. Wins over `disabled`, as on Button.
|
|
428
440
|
*/
|
|
429
441
|
disabledReason?: ReactNode;
|
|
442
|
+
/** This action COMMITS — {@link Button}'s `commit`: under a locked
|
|
443
|
+
* {@link WriteLockProvider} it takes the `disabledReason` path with the lock's
|
|
444
|
+
* reason. No effect without a lock. */
|
|
445
|
+
commit?: boolean;
|
|
430
446
|
/** The `<button>` element — a prop in React 19, as on {@link Button}. */
|
|
431
447
|
ref?: Ref<HTMLButtonElement>;
|
|
432
448
|
/** Only on the link form — see {@link IconButtonLinkProps}. */
|
|
@@ -470,6 +486,7 @@ interface IconButtonLinkProps extends Omit<AnchorHTMLAttributes<HTMLAnchorElemen
|
|
|
470
486
|
form?: never;
|
|
471
487
|
pressed?: never;
|
|
472
488
|
disabledReason?: never;
|
|
489
|
+
commit?: never;
|
|
473
490
|
disabledStyle?: never;
|
|
474
491
|
pending?: never;
|
|
475
492
|
}
|
|
@@ -791,9 +808,33 @@ interface CardProps extends ComponentPropsWithoutRef<"div"> {
|
|
|
791
808
|
* nor on `inset`, which has no border to make louder (its tone is a fill).
|
|
792
809
|
*/
|
|
793
810
|
toneStrength?: "soft" | "strong";
|
|
811
|
+
/**
|
|
812
|
+
* Wash the card in the tone's quiet `-bg` surface as well as framing it. A toned
|
|
813
|
+
* card is a border and a title colour, at either strength — the wash belongs to
|
|
814
|
+
* `AlertBanner`, the message, not to a card that holds a form — so it stays
|
|
815
|
+
* off by default. Some tiles want both: keksdose's password / delete-account tile
|
|
816
|
+
* was `toneFrameClass(tone)` (border AND wash) before 0.16, and after moving to
|
|
817
|
+
* `toneStrength="strong"` it re-added `bg-[var(--danger-bg)]` by hand. The wash is
|
|
818
|
+
* layered OVER the card's own `--bg-surface` (as AlertBanner's `elevated` does), so
|
|
819
|
+
* the dark theme's translucent tints stay a card, not a hole to the page below.
|
|
820
|
+
*
|
|
821
|
+
* No effect without `tone`, nor on `inset`, whose tone is already the fill.
|
|
822
|
+
*/
|
|
823
|
+
toneFill?: boolean;
|
|
824
|
+
/**
|
|
825
|
+
* The parts' type scale. `"compact"`: CardTitle `text-sm font-medium`,
|
|
826
|
+
* CardDescription `text-xs` and the CardHeader's title-to-description gap
|
|
827
|
+
* `gap-0.5` — the small settings / admin card. keksdose wrote those three classes by
|
|
828
|
+
* hand on ~25 cards. Set here, they reach the parts through context; a class on a
|
|
829
|
+
* part still wins, and a Card nested inside starts again from its own density.
|
|
830
|
+
*
|
|
831
|
+
* Default `"comfortable"`: the parts as they have always been.
|
|
832
|
+
*/
|
|
833
|
+
density?: CardDensity;
|
|
794
834
|
}
|
|
835
|
+
type CardDensity = "comfortable" | "compact";
|
|
795
836
|
type CardTone = "warning" | "danger" | "info" | "success";
|
|
796
|
-
declare function Card({ className, children, flush, variant, tone, toneStrength, padding, ...rest }: CardProps): react.JSX.Element;
|
|
837
|
+
declare function Card({ className, children, flush, variant, tone, toneStrength, toneFill, density, padding, ...rest }: CardProps): react.JSX.Element;
|
|
797
838
|
/** The sub-parts add nothing to a `<div>`'s props — they are the SAME element with a
|
|
798
839
|
* `data-slot` and a padding rhythm — so most names are aliases rather than an empty
|
|
799
840
|
* interface pretending to be more. They exist so a consumer's own wrapper can say
|
|
@@ -1415,6 +1456,23 @@ type FormActionsAlign = "start" | "center" | "end" | "between";
|
|
|
1415
1456
|
* FullBleedDialog's `footer`), which already pads and rules it.
|
|
1416
1457
|
*/
|
|
1417
1458
|
type FormActionsPlacement = "inline" | "sticky" | "dialog";
|
|
1459
|
+
/**
|
|
1460
|
+
* A placement per breakpoint, mobile first — `{ base: "sticky", md: "inline" }` is a
|
|
1461
|
+
* Save row stuck to the bottom of a phone's long form and in the flow under the last
|
|
1462
|
+
* field from 768px up, where the form fits. The breakpoints are Tailwind's (sm 640,
|
|
1463
|
+
* md 768, lg 1024, xl 1280px), as `BulkActionBar`'s `variant` breakpoints are, and
|
|
1464
|
+
* resolved the same way, in JS: the sticky row is positioned by inline style, which a
|
|
1465
|
+
* `md:` class cannot reach. keksdose switched `placement` on its own media query at
|
|
1466
|
+
* every long form for want of this. The breakpoints are the VIEWPORT's, not the
|
|
1467
|
+
* container's: a form in a narrow pane on a wide screen resolves to `md`.
|
|
1468
|
+
*/
|
|
1469
|
+
interface ResponsiveFormActionsPlacement {
|
|
1470
|
+
base: FormActionsPlacement;
|
|
1471
|
+
sm?: FormActionsPlacement;
|
|
1472
|
+
md?: FormActionsPlacement;
|
|
1473
|
+
lg?: FormActionsPlacement;
|
|
1474
|
+
xl?: FormActionsPlacement;
|
|
1475
|
+
}
|
|
1418
1476
|
/**
|
|
1419
1477
|
* What a `sticky` row sticks to — see {@link FormActionsProps.stickyWithin}.
|
|
1420
1478
|
* - `viewport` (default): the page's (or AppShell pane's) bottom edge, lifted onto
|
|
@@ -1428,7 +1486,7 @@ type FormActionsStickyWithin = "viewport" | "container";
|
|
|
1428
1486
|
* analytics, an `aria-describedby`. The props FormActions drives itself (type, click,
|
|
1429
1487
|
* disabled, variant, form, children, the busy state) are not among them.
|
|
1430
1488
|
*/
|
|
1431
|
-
type FormActionsSubmitProps = Omit<ButtonProps, "type" | "onClick" | "disabled" | "disabledReason" | "variant" | "form" | "children" | "aria-busy"> & {
|
|
1489
|
+
type FormActionsSubmitProps = Omit<ButtonProps, "type" | "onClick" | "disabled" | "disabledReason" | "variant" | "form" | "children" | "aria-busy" | "commit"> & {
|
|
1432
1490
|
[key: `data-${string}`]: string | number | boolean | undefined;
|
|
1433
1491
|
};
|
|
1434
1492
|
/** The start-side action of {@link FormActionsProps.destructive}, as data. */
|
|
@@ -1475,6 +1533,18 @@ interface FormActionsProps extends Omit<ComponentPropsWithoutRef<"div">, "childr
|
|
|
1475
1533
|
submitDisabled?: boolean;
|
|
1476
1534
|
/** Why save is disabled — see Button's `disabledReason`. Keeps it focusable. */
|
|
1477
1535
|
submitDisabledReason?: ReactNode;
|
|
1536
|
+
/**
|
|
1537
|
+
* Save is a commit: under a locked {@link WriteLockProvider} it is disabled with the
|
|
1538
|
+
* lock's reason (over `submitDisabledReason`), focusable, the reason in its tooltip —
|
|
1539
|
+
* Button's `commit`. The `{ label, onClick }` form of {@link destructive} is a
|
|
1540
|
+
* commit too and is locked with it; Cancel and `children` are not (closing a form
|
|
1541
|
+
* writes nothing). No provider, or an unlocked one: no effect. Default `false`.
|
|
1542
|
+
*
|
|
1543
|
+
* keksdose wrote `submitDisabled={lock.locked || …}` and
|
|
1544
|
+
* `submitDisabledReason={lock.locked ? lock.reason : undefined}` at each form; this is
|
|
1545
|
+
* that pair, read from the provider.
|
|
1546
|
+
*/
|
|
1547
|
+
commit?: boolean;
|
|
1478
1548
|
/** The save button's variant. Default `brand`; `danger` for a save that destroys
|
|
1479
1549
|
* (kastlan's `destructive` flag on its own FormActions). */
|
|
1480
1550
|
submitVariant?: ButtonVariant;
|
|
@@ -1494,8 +1564,21 @@ interface FormActionsProps extends Omit<ComponentPropsWithoutRef<"div">, "childr
|
|
|
1494
1564
|
start?: ReactNode;
|
|
1495
1565
|
/** Horizontal alignment. Default `end` (`between` with a `destructive` action). */
|
|
1496
1566
|
align?: FormActionsAlign;
|
|
1497
|
-
/** See {@link FormActionsPlacement}
|
|
1498
|
-
|
|
1567
|
+
/** See {@link FormActionsPlacement}, or one per breakpoint — see
|
|
1568
|
+
* {@link ResponsiveFormActionsPlacement}. Default `inline`. */
|
|
1569
|
+
placement?: FormActionsPlacement | ResponsiveFormActionsPlacement;
|
|
1570
|
+
/**
|
|
1571
|
+
* While the row is `sticky`: pull it out over its container's inline padding by this
|
|
1572
|
+
* much (a CSS length, a number in px) and give the same back as padding — so the
|
|
1573
|
+
* rule above it and its surface run edge to edge, while the buttons stay on the
|
|
1574
|
+
* content's line. Without it a sticky row in a padded card or pane is a strip inset
|
|
1575
|
+
* from both sides, with the content scrolling past it in the gutters (keksdose wrote
|
|
1576
|
+
* `@max-md:-mx-3 @max-md:px-3` by hand). Pass the container's padding (`"0.75rem"`,
|
|
1577
|
+
* `12`, `"var(--pane-px)"`). Applied only while the resolved placement is sticky, so
|
|
1578
|
+
* `placement={{ base: "sticky", md: "inline" }}` bleeds on the phone alone. The margin
|
|
1579
|
+
* is `calc(-1 * X)`; jsdom folds that to `calc(-X)`, so match it loosely in tests.
|
|
1580
|
+
*/
|
|
1581
|
+
bleed?: string | number;
|
|
1499
1582
|
/**
|
|
1500
1583
|
* With `placement="sticky"`: what the row sticks to. Default `viewport`.
|
|
1501
1584
|
*
|
|
@@ -1539,7 +1622,187 @@ interface FormActionsProps extends Omit<ComponentPropsWithoutRef<"div">, "childr
|
|
|
1539
1622
|
* The spinner is the kit's {@link Spinner}, drawn inside the button with `label={null}`
|
|
1540
1623
|
* so the button's name stays its text; `aria-busy` is what says it is working.
|
|
1541
1624
|
*/
|
|
1542
|
-
declare function FormActions({ onCancel, onSubmit, submitLabel, cancelLabel, pendingLabel, submitIcon: SubmitIcon, submitProps, pending, submitDisabled, submitDisabledReason, submitVariant, destructive, start: startSlot, align, placement, stickyWithin, form, children, className, style, ...rest }: FormActionsProps): react.JSX.Element;
|
|
1625
|
+
declare function FormActions({ onCancel, onSubmit, submitLabel, cancelLabel, pendingLabel, submitIcon: SubmitIcon, submitProps, pending, submitDisabled, submitDisabledReason, commit, submitVariant, destructive, start: startSlot, align, placement: placementProp, stickyWithin, bleed, form, children, className, style, ...rest }: FormActionsProps): react.JSX.Element;
|
|
1626
|
+
|
|
1627
|
+
/**
|
|
1628
|
+
* Who holds one record, and the owner's every way of changing that — Kurvenschmiede's
|
|
1629
|
+
* `features/sharing/share-dialog.tsx` and keksdose's `features/budgets/budget-share-card.tsx`,
|
|
1630
|
+
* which are the same component twice (Kurvenschmiede's own doc comment says so).
|
|
1631
|
+
*
|
|
1632
|
+
* Presentational: the kit draws the rows, asks before a removal (the kit's
|
|
1633
|
+
* {@link useConfirm}), keeps the field and the busy state, and checks only that an
|
|
1634
|
+
* address is SHAPED like one. Everything that is policy stays with the app — who may
|
|
1635
|
+
* share, whether an address has an account (that is what makes a grant pending), what
|
|
1636
|
+
* a role permits, every request — through the callbacks, which may return a promise.
|
|
1637
|
+
*/
|
|
1638
|
+
interface ShareCardLabels {
|
|
1639
|
+
/** ShareDialog's heading. */
|
|
1640
|
+
dialogTitle: string;
|
|
1641
|
+
/** ShareDialog's close button. */
|
|
1642
|
+
close: string;
|
|
1643
|
+
/** The add field's label. */
|
|
1644
|
+
email: string;
|
|
1645
|
+
/** The add field's label when `addWithoutEmail` lets it stay empty. */
|
|
1646
|
+
emailOptional: string;
|
|
1647
|
+
emailPlaceholder: string;
|
|
1648
|
+
/** Under the field when what was typed is not an address. */
|
|
1649
|
+
invalidEmail: string;
|
|
1650
|
+
/** Accessible name of the role choice beside the field. */
|
|
1651
|
+
role: string;
|
|
1652
|
+
/** Accessible name of one grantee's role choice. */
|
|
1653
|
+
roleOf: (name: string) => string;
|
|
1654
|
+
/** The add button. */
|
|
1655
|
+
add: string;
|
|
1656
|
+
/** Heading over the list. */
|
|
1657
|
+
whoHasAccess: string;
|
|
1658
|
+
/** The list is empty. */
|
|
1659
|
+
nobodyYet: string;
|
|
1660
|
+
/** Chip on a grant whose address has no account yet. */
|
|
1661
|
+
pending: string;
|
|
1662
|
+
/** A pending grant with no address — a link anybody holding it can redeem. */
|
|
1663
|
+
openInvite: string;
|
|
1664
|
+
copyLink: string;
|
|
1665
|
+
/** A candidate that is a team (its sublabel, and the line under a team row). */
|
|
1666
|
+
team: string;
|
|
1667
|
+
/** Under the field while a team is the one named. */
|
|
1668
|
+
teamHint: (name: string) => string;
|
|
1669
|
+
/** The remove button on a grantee. */
|
|
1670
|
+
remove: string;
|
|
1671
|
+
removeConfirm: (name: string) => string;
|
|
1672
|
+
/** The remove button on a pending grant. */
|
|
1673
|
+
revokePending: string;
|
|
1674
|
+
revokePendingConfirm: (name: string) => string;
|
|
1675
|
+
/** A callback rejected and no `formatError` says better. */
|
|
1676
|
+
failed: string;
|
|
1677
|
+
/** Shown while `loading`. */
|
|
1678
|
+
loading: string;
|
|
1679
|
+
}
|
|
1680
|
+
declare const DEFAULT_SHARE_CARD_LABELS: ShareCardLabels;
|
|
1681
|
+
/**
|
|
1682
|
+
* One role of the app's vocabulary: Kurvenschmiede's viewer/editor, keksdose's guest.
|
|
1683
|
+
*
|
|
1684
|
+
* The admin roster's {@link RoleDefinition} (label, tone, icon) plus the key it is
|
|
1685
|
+
* filed under — an ARRAY here rather than the keyed `RoleVocabulary` record,
|
|
1686
|
+
* because the order is the order of the role choice's segments.
|
|
1687
|
+
*/
|
|
1688
|
+
type ShareRole = RoleDefinition & {
|
|
1689
|
+
key: string;
|
|
1690
|
+
/** What the role allows — under the role choice once chosen, and the chip's tooltip. */
|
|
1691
|
+
description?: string;
|
|
1692
|
+
};
|
|
1693
|
+
/** Somebody (or a team) who holds the record now. */
|
|
1694
|
+
interface ShareGrantee {
|
|
1695
|
+
id: string | number;
|
|
1696
|
+
name: string;
|
|
1697
|
+
/** The second line. A team row says {@link ShareCardLabels.team} instead. */
|
|
1698
|
+
email?: string | null;
|
|
1699
|
+
/** A {@link ShareRole.key}. */
|
|
1700
|
+
role: string;
|
|
1701
|
+
/** `team`: the grant reaches everybody in it (Kurvenschmiede). Default `person`. */
|
|
1702
|
+
kind?: "person" | "team";
|
|
1703
|
+
/** Shown, but neither its role nor its access can be changed here (an owner row). */
|
|
1704
|
+
locked?: boolean;
|
|
1705
|
+
/** The app's own line under the row — keksdose's per-guest key delivery. */
|
|
1706
|
+
extra?: ReactNode;
|
|
1707
|
+
}
|
|
1708
|
+
/** A grant waiting for its address to have an account — or, with no address, an
|
|
1709
|
+
* open invite link (keksdose). */
|
|
1710
|
+
interface SharePendingGrant {
|
|
1711
|
+
id: string | number;
|
|
1712
|
+
email?: string | null;
|
|
1713
|
+
/** A {@link ShareRole.key}; left out when the app has only one role. */
|
|
1714
|
+
role?: string;
|
|
1715
|
+
/** The invite link, offered with a copy button. */
|
|
1716
|
+
link?: string;
|
|
1717
|
+
}
|
|
1718
|
+
/** A completion offered while typing: a past grantee, or one of the sharer's teams. */
|
|
1719
|
+
interface ShareCandidate {
|
|
1720
|
+
id: string | number;
|
|
1721
|
+
name: string;
|
|
1722
|
+
/** A person's address: taking the row fills the field with it, and the grant is
|
|
1723
|
+
* then an ordinary address grant. */
|
|
1724
|
+
email?: string | null;
|
|
1725
|
+
/** `team` (or a person with no address): taking the row names THIS candidate, and
|
|
1726
|
+
* `onAdd` receives it instead of an address. */
|
|
1727
|
+
kind?: "person" | "team";
|
|
1728
|
+
icon?: ReactNode;
|
|
1729
|
+
}
|
|
1730
|
+
/** What the add button asks for. Exactly one of `email` / `candidate` is set, except
|
|
1731
|
+
* under `addWithoutEmail`, where both may be null (an open invite). */
|
|
1732
|
+
interface ShareAddRequest {
|
|
1733
|
+
email: string | null;
|
|
1734
|
+
candidate: ShareCandidate | null;
|
|
1735
|
+
/** A {@link ShareRole.key}. */
|
|
1736
|
+
role: string;
|
|
1737
|
+
}
|
|
1738
|
+
type MaybePromise = void | Promise<unknown>;
|
|
1739
|
+
interface SharePanelProps {
|
|
1740
|
+
grantees: ShareGrantee[];
|
|
1741
|
+
/** The role vocabulary, in display order. One role: no choice is offered and each
|
|
1742
|
+
* row shows its chip. */
|
|
1743
|
+
roles: ShareRole[];
|
|
1744
|
+
pending?: SharePendingGrant[];
|
|
1745
|
+
/** Completions for the field. Left out: the field is a plain address field. */
|
|
1746
|
+
candidates?: ShareCandidate[];
|
|
1747
|
+
/** The role a new grant starts with. Default: the first of `roles`. */
|
|
1748
|
+
defaultRole?: string;
|
|
1749
|
+
/** Resolve to clear the field; reject to keep it and show the error. Left out (or
|
|
1750
|
+
* `readOnly`): no add form. */
|
|
1751
|
+
onAdd?: (request: ShareAddRequest) => MaybePromise;
|
|
1752
|
+
/** Left out: roles are shown as chips. */
|
|
1753
|
+
onRoleChange?: (grantee: ShareGrantee, role: string) => MaybePromise;
|
|
1754
|
+
/** Called after the kit's confirm. Left out: no remove button. */
|
|
1755
|
+
onRemove?: (grantee: ShareGrantee) => MaybePromise;
|
|
1756
|
+
/** Called after the kit's confirm. Left out: no withdraw button. */
|
|
1757
|
+
onRevokePending?: (grant: SharePendingGrant) => MaybePromise;
|
|
1758
|
+
/** keksdose: an empty field is a request too — an invite link with no address. */
|
|
1759
|
+
addWithoutEmail?: boolean;
|
|
1760
|
+
/** Under the add field: whatever the app needs said there (Kurvenschmiede's "your
|
|
1761
|
+
* pending grant does not let anybody register"). A function receives the taken
|
|
1762
|
+
* candidate, so it can say something else while a team is named. */
|
|
1763
|
+
caption?: ReactNode | ((candidate: ShareCandidate | null) => ReactNode);
|
|
1764
|
+
/** Above everything — what sharing means here (keksdose's guest explanation). */
|
|
1765
|
+
intro?: ReactNode;
|
|
1766
|
+
/** The list is being fetched: a spinner instead of the rows. */
|
|
1767
|
+
loading?: boolean;
|
|
1768
|
+
/** The app's own error, shown in the error box (wins over a caught rejection). */
|
|
1769
|
+
error?: ReactNode;
|
|
1770
|
+
/** Turns a callback's rejection into words. Default {@link ShareCardLabels.failed}. */
|
|
1771
|
+
formatError?: (error: unknown) => ReactNode;
|
|
1772
|
+
/** Look, do not touch: no form, chips for roles, no remove buttons. Copying an
|
|
1773
|
+
* invite link still works. */
|
|
1774
|
+
readOnly?: boolean;
|
|
1775
|
+
/** Focus the field on mount — a dialog that exists to add somebody. */
|
|
1776
|
+
autoFocus?: boolean;
|
|
1777
|
+
labels?: Partial<ShareCardLabels>;
|
|
1778
|
+
}
|
|
1779
|
+
/**
|
|
1780
|
+
* The body both forms share: the add form, then the list. Exported for an app that
|
|
1781
|
+
* frames it itself (a settings section, a sheet).
|
|
1782
|
+
*/
|
|
1783
|
+
declare function SharePanel({ grantees, roles, pending, candidates, defaultRole, onAdd, onRoleChange, onRemove, onRevokePending, addWithoutEmail, caption, intro, loading, error, formatError, readOnly, autoFocus, labels: labelsProp, }: SharePanelProps): react.JSX.Element;
|
|
1784
|
+
interface ShareCardProps extends SharePanelProps {
|
|
1785
|
+
/** A heading over the card. */
|
|
1786
|
+
title?: ReactNode;
|
|
1787
|
+
/** The Card's variant. Default `outline` — a block inside a section, as keksdose's
|
|
1788
|
+
* card under a budget row is. */
|
|
1789
|
+
variant?: CardProps["variant"];
|
|
1790
|
+
className?: string;
|
|
1791
|
+
}
|
|
1792
|
+
/** {@link SharePanel} in a card — keksdose's inline form, under the row it shares. */
|
|
1793
|
+
declare function ShareCard({ title, variant, className, ...panel }: ShareCardProps): react.JSX.Element;
|
|
1794
|
+
interface ShareDialogProps extends SharePanelProps, Pick<DialogFrameProps, "open" | "onClose" | "size" | "className"> {
|
|
1795
|
+
/** The heading. Default {@link ShareCardLabels.dialogTitle}. */
|
|
1796
|
+
title?: ReactNode;
|
|
1797
|
+
/** Under the heading — what is being shared (Kurvenschmiede passes its name). */
|
|
1798
|
+
description?: ReactNode;
|
|
1799
|
+
}
|
|
1800
|
+
/**
|
|
1801
|
+
* {@link SharePanel} in the kit's {@link DialogFrame} with a Close button —
|
|
1802
|
+
* Kurvenschmiede's form. Sharing commits as it goes, so there is nothing to save or
|
|
1803
|
+
* cancel: Close is the only action.
|
|
1804
|
+
*/
|
|
1805
|
+
declare function ShareDialog({ open, onClose, size, className, title, description, ...panel }: ShareDialogProps): react.JSX.Element;
|
|
1543
1806
|
|
|
1544
1807
|
/**
|
|
1545
1808
|
* EVERY string the kit renders, as one typed tree — and an optional provider that
|
|
@@ -1754,6 +2017,14 @@ interface UiKitLabels {
|
|
|
1754
2017
|
authedImage: AuthedImageLabels;
|
|
1755
2018
|
imageGrid: ImageGridLabels;
|
|
1756
2019
|
lightbox: LightboxLabels;
|
|
2020
|
+
/** 0.18.0: `WriteLockProvider`'s fallback reason, `AccountStateChip`, `SharePanel` /
|
|
2021
|
+
* `ShareCard` / `ShareDialog`, `ReauthDialog`. */
|
|
2022
|
+
writeLock: WriteLockLabels;
|
|
2023
|
+
accountState: AccountStateLabels;
|
|
2024
|
+
shareCard: ShareCardLabels;
|
|
2025
|
+
reauthDialog: ReauthDialogLabels;
|
|
2026
|
+
/** 0.18.0: `ServerWakeNotice` — keksdose's cold-start notice, for every app. */
|
|
2027
|
+
serverWake: ServerWakeLabels;
|
|
1757
2028
|
}
|
|
1758
2029
|
/**
|
|
1759
2030
|
* A label override, as deep as the labels go: an object of labels (a namespace, or a
|
|
@@ -1887,13 +2158,14 @@ declare function useKitFileLabels(prop?: Partial<FileLabels>): FileLabels;
|
|
|
1887
2158
|
* The dot paths of every key `labels` does NOT supply — the ones a translated app is
|
|
1888
2159
|
* still showing in English. Assert on it in the app's own test:
|
|
1889
2160
|
*
|
|
1890
|
-
* expect(missingKitLabels(
|
|
2161
|
+
* expect(missingKitLabels(labels, DEFAULT_UI_KIT_LABELS)).toEqual([]);
|
|
1891
2162
|
*
|
|
1892
2163
|
* `reference` is the complete tree to check against — pass
|
|
1893
2164
|
* {@link DEFAULT_UI_KIT_LABELS} (src/i18n/defaults.ts). It is a parameter rather than an import
|
|
1894
2165
|
* because the defaults live beside their components, and this module is imported BY
|
|
1895
|
-
* those components.
|
|
2166
|
+
* those components. Left out (a test file is not type-checked), it throws saying so
|
|
2167
|
+
* rather than "Cannot convert undefined or null to object" (keksdose, 0.18).
|
|
1896
2168
|
*/
|
|
1897
2169
|
declare function missingKitLabels(labels: UiKitLabelOverrides | undefined, reference: UiKitLabels): string[];
|
|
1898
2170
|
|
|
1899
|
-
export {
|
|
2171
|
+
export { FIELD_BASE as $, type AppShellLabels as A, Button as B, type CalculatorLabels as C, CopyButton as D, type CopyButtonLabels as E, type CopyButtonProps as F, type CurrencyLabels as G, DEFAULT_APP_SHELL_LABELS as H, DEFAULT_CALCULATOR_LABELS as I, DEFAULT_COMBOBOX_LABELS as J, DEFAULT_COMMON_LABELS as K, DEFAULT_COPY_BUTTON_LABELS as L, DEFAULT_CURRENCY_LABELS as M, DEFAULT_DATE_PICKER_LABELS as N, DEFAULT_FILE_LABELS as O, DEFAULT_FILE_PICKER_LABELS as P, DEFAULT_FORM_ACTIONS_LABELS as Q, DEFAULT_MULTI_SELECT_LABELS as R, DEFAULT_PASSWORD_REVEAL_LABELS as S, DEFAULT_PICKER_SHEET_LABELS as T, DEFAULT_SHARE_CARD_LABELS as U, DEFAULT_SWIPEABLE_ROW_LABELS as V, DEFAULT_TABS_LABELS as W, DEFAULT_TOP_BAR_LABELS as X, type DatePickerLabels as Y, EmptyState as Z, type EmptyStateProps as _, type ButtonClassesOptions as a, type SharePendingGrant as a$, FIELD_DISPLAY as a0, FIELD_FLOATING_PAD as a1, FIELD_INVALID as a2, FIELD_TRIGGER as a3, FIELD_WRITABLE_LOOK as a4, FLOATING_INPUT_CLASS as a5, FLOATING_LABEL_CLASS as a6, FLOATING_LABEL_STATIC as a7, FieldChevron as a8, type FieldChevronProps as a9, type IconButtonTone as aA, type IconButtonToneColor as aB, type IconButtonVariant as aC, Input as aD, type InputProps as aE, type KitLinkComponent as aF, type KitLinkProps as aG, Label as aH, type LabelOverride as aI, type LabelProps as aJ, type MultiSelectLabels as aK, PHONE_QUERY as aL, type PasswordRevealLabels as aM, type PickerSheetLabels as aN, type ResponsiveFormActionsPlacement as aO, Select as aP, type SelectProps as aQ, type ShareAddRequest as aR, type ShareCandidate as aS, ShareCard as aT, type ShareCardLabels as aU, type ShareCardProps as aV, ShareDialog as aW, type ShareDialogProps as aX, type ShareGrantee as aY, SharePanel as aZ, type SharePanelProps as a_, FieldHint as aa, type FieldHintProps as ab, FieldLabel as ac, type FieldLabelProps as ad, FileButton as ae, type FileButtonProps as af, type FileLabels as ag, type FilePickerLabels as ah, type FileRejection as ai, type FileRejectionReason as aj, type FileScreenOptions as ak, FloatingField as al, type FloatingFieldProps as am, FormActions as an, type FormActionsAlign as ao, type FormActionsDestructive as ap, type FormActionsLabels as aq, type FormActionsPlacement as ar, type FormActionsProps as as, type FormActionsStickyWithin as at, type FormActionsSubmitProps as au, IconButton as av, type IconButtonGlyphSize as aw, type IconButtonLinkProps as ax, type IconButtonProps as ay, type IconButtonSize as az, type ButtonLinkProps as b, type ShareRole as b0, Spinner as b1, type SpinnerProps as b2, type SwipeableRowLabels as b3, type TabItem as b4, Tabs as b5, type TabsLabels as b6, type TabsProps as b7, Textarea as b8, type TextareaProps as b9, type TopBarLabels as ba, type UiKitLabelOverrides as bb, type UiKitLabels as bc, UiKitProvider as bd, type UiKitProviderProps as be, type UseFilePickerOptions as bf, type UseFilePickerReturn as bg, buttonClasses as bh, formatFileSize as bi, matchesAccept as bj, missingKitLabels as bk, resolvePasswordRevealLabels as bl, useFilePicker as bm, useKitChartTooltipPlacement as bn, useKitFileLabels as bo, useKitLabelOverrides as bp, useKitLabels as bq, useKitLink as br, useKitLocale as bs, useKitWeekStart as bt, type FilePickHandler as bu, formatAccept as bv, judgePick as bw, screenFiles as bx, summariseRejections as by, type ButtonProps as c, type ButtonSize as d, type ButtonTone as e, type ButtonVariant as f, Card as g, CardAction as h, type CardActionProps as i, CardContent as j, type CardContentProps as k, type CardDensity as l, CardDescription as m, type CardDescriptionProps as n, CardFooter as o, type CardFooterProps as p, CardHeader as q, type CardHeaderProps as r, type CardProps as s, CardTitle as t, type CardTitleLevel as u, type CardTitleProps as v, type CardTone as w, type ChartTooltipPlacement as x, type ComboboxLabels as y, type CommonLabels as z };
|