@eifi1/ui-kit 0.16.0 → 0.17.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.
Files changed (89) hide show
  1. package/README.md +7 -7
  2. package/dist/chart.d.ts +1 -1
  3. package/dist/components/amount-input.d.ts +9 -1
  4. package/dist/components/amount-input.js.map +1 -1
  5. package/dist/components/button-group.d.ts +1 -1
  6. package/dist/components/calculator.d.ts +1 -1
  7. package/dist/components/copy-button.d.ts +1 -1
  8. package/dist/components/data-table-cells.d.ts +1 -1
  9. package/dist/components/data-table-filter-popover.d.ts +1 -1
  10. package/dist/components/data-table-filters.d.ts +1 -1
  11. package/dist/components/data-table.d.ts +1 -1
  12. package/dist/components/data-table.js +91 -3
  13. package/dist/components/data-table.js.map +1 -1
  14. package/dist/components/facing-pair.d.ts +1 -1
  15. package/dist/components/file-button.d.ts +1 -1
  16. package/dist/components/file-button.js +7 -4
  17. package/dist/components/file-button.js.map +1 -1
  18. package/dist/components/file-dropzone.d.ts +1 -1
  19. package/dist/components/form-actions.d.ts +1 -1
  20. package/dist/components/form-actions.js +32 -1
  21. package/dist/components/form-actions.js.map +1 -1
  22. package/dist/components/line-items.d.ts +30 -6
  23. package/dist/components/line-items.js +77 -33
  24. package/dist/components/line-items.js.map +1 -1
  25. package/dist/components/list.d.ts +13 -1
  26. package/dist/components/list.js.map +1 -1
  27. package/dist/components/money-field.d.ts +1 -1
  28. package/dist/components/number-field.d.ts +1 -1
  29. package/dist/components/number-input.d.ts +1 -1
  30. package/dist/components/numpad-sheet.d.ts +1 -1
  31. package/dist/components/progress-bar.d.ts +11 -1
  32. package/dist/components/progress-bar.js +14 -4
  33. package/dist/components/progress-bar.js.map +1 -1
  34. package/dist/components/series-chart.d.ts +1 -1
  35. package/dist/components/settings-fields.d.ts +1 -1
  36. package/dist/components/signed-amount.d.ts +12 -3
  37. package/dist/components/signed-amount.js +6 -4
  38. package/dist/components/signed-amount.js.map +1 -1
  39. package/dist/components/text-link.d.ts +1 -1
  40. package/dist/components/time-input.d.ts +1 -1
  41. package/dist/components/ui.d.ts +1 -1
  42. package/dist/components/ui.js +25 -3
  43. package/dist/components/ui.js.map +1 -1
  44. package/dist/components/use-table-state.d.ts +1 -1
  45. package/dist/{data-table-CfVXtCeG.d.ts → data-table-CpkWUJBY.d.ts} +41 -1
  46. package/dist/data-table.d.ts +1 -1
  47. package/dist/hooks/use-file-drop.d.ts +1 -1
  48. package/dist/i18n/defaults.d.ts +1 -1
  49. package/dist/i18n/kit-labels.d.ts +1 -1
  50. package/dist/i18n/locales/de-CH-informal.d.ts +1 -1
  51. package/dist/i18n/locales/de-CH.d.ts +1 -1
  52. package/dist/i18n/locales/de-informal.d.ts +1 -1
  53. package/dist/i18n/locales/de.d.ts +1 -1
  54. package/dist/i18n/locales/en.d.ts +71 -0
  55. package/dist/i18n/locales/en.js +95 -0
  56. package/dist/i18n/locales/en.js.map +1 -0
  57. package/dist/i18n/locales/es.d.ts +1 -1
  58. package/dist/i18n/locales/fr.d.ts +1 -1
  59. package/dist/i18n/locales/hu.d.ts +1 -1
  60. package/dist/i18n/locales/it.d.ts +1 -1
  61. package/dist/i18n/locales/zh.d.ts +1 -1
  62. package/dist/index.d.ts +4 -4
  63. package/dist/{kit-labels-DE--LmCk.d.ts → kit-labels-C4uB_zmg.d.ts} +57 -5
  64. package/dist/rhf/fields.d.ts +1 -1
  65. package/dist/rhf/form.d.ts +1 -1
  66. package/dist/rhf/line-items.js.map +1 -1
  67. package/dist/rhf.d.ts +1 -1
  68. package/dist/search/global-search.d.ts +22 -4
  69. package/dist/search/global-search.js +31 -3
  70. package/dist/search/global-search.js.map +1 -1
  71. package/dist/search.d.ts +1 -1
  72. package/dist/shell/app-shell.d.ts +1 -1
  73. package/dist/shell/top-bar-brand.d.ts +1 -1
  74. package/dist/shell.d.ts +1 -1
  75. package/dist/wizard/stepper-nav.d.ts +1 -1
  76. package/dist/wizard.d.ts +1 -1
  77. package/package.json +1 -1
  78. package/src/components/amount-input.tsx +8 -0
  79. package/src/components/data-table.tsx +165 -3
  80. package/src/components/file-button.tsx +12 -4
  81. package/src/components/form-actions.tsx +73 -3
  82. package/src/components/line-items.tsx +116 -40
  83. package/src/components/list.tsx +13 -1
  84. package/src/components/progress-bar.tsx +20 -4
  85. package/src/components/signed-amount.tsx +16 -5
  86. package/src/components/ui.tsx +57 -3
  87. package/src/i18n/locales/en.ts +116 -0
  88. package/src/rhf/line-items.tsx +2 -1
  89. package/src/search/global-search.tsx +57 -6
@@ -1,5 +1,5 @@
1
1
  import 'react';
2
2
  import './data-table-sort.js';
3
- export { z as DEFAULT_PERSIST_PREFIX, T as TableUrlState, g as TableUrlStateProps, h as TableUrlSync, U as UseTableUrlStateOptions, i as UseTableUrlStateReturn, r as readTableUrlState, A as useTableState, w as useTableUrlState } from '../data-table-CfVXtCeG.js';
3
+ export { z as DEFAULT_PERSIST_PREFIX, T as TableUrlState, g as TableUrlStateProps, h as TableUrlSync, U as UseTableUrlStateOptions, i as UseTableUrlStateReturn, r as readTableUrlState, A as useTableState, w as useTableUrlState } from '../data-table-CpkWUJBY.js';
4
4
  import './swipeable-row.js';
5
5
  import './data-table-labels.js';
@@ -303,6 +303,26 @@ interface DataTableColumn<T> {
303
303
  * width a resize pins stay the table's, and the class list goes before
304
304
  * `headClassName` for the same reason as in {@link cellProps}. */
305
305
  headProps?: DataTableHeadProps;
306
+ /**
307
+ * This column's cell in the table's totals row — a `<tfoot>` on a wide screen, a
308
+ * labelled summary card under the list on a phone. kastlan's trial balance is why
309
+ * it exists: it hand-built a debit/credit/balance strip in a `div` UNDER the table,
310
+ * which lined up with no column, dropped out of the table's semantics, and stayed
311
+ * put when the user hid or resized the columns it was summing.
312
+ *
313
+ * `rows` is every row that passes the current filters (in the current sort order),
314
+ * NOT just the page on screen: a total that changes when the user pages is not a
315
+ * total, and the trial balance has to balance on page 1 as much as on page 7. The
316
+ * page is the second argument for the rare "subtotal of this page" footer.
317
+ *
318
+ * Under `serverPagination` the table only ever holds one page, so both arguments are
319
+ * that page — a server-side table computes its totals on the server and returns
320
+ * them here (`footer: () => fmt(response.totalDebit)`), ignoring the arguments.
321
+ *
322
+ * The cell takes the column's `className` (so a `text-end` amount column totals
323
+ * end-aligned), its resized width, and drops out with the column when it is hidden.
324
+ */
325
+ footer?: (rows: T[], page: T[]) => ReactNode;
306
326
  }
307
327
  /** A `data-*` attribute, typed so `{ "data-private": "" }` needs no cast. */
308
328
  type DataAttributes = {
@@ -613,6 +633,26 @@ interface DataTableProps<T> {
613
633
  * pages set a search box in a `div` above the card, outside the frame it filters).
614
634
  */
615
635
  toolbar?: ReactNode;
636
+ /**
637
+ * The totals row's name — "Total", "Summe", "Totals as of 30 June". It is the row's
638
+ * header: rendered as a `<th scope="row">` in the first visible column that has no
639
+ * `footer` of its own (falling back to the first visible column if every one has a
640
+ * value), so a screen reader reads "Total, Debit, 12 400.00" for the cell beside it.
641
+ * On a phone it heads the summary card, which is also named by it.
642
+ *
643
+ * There is no built-in default word: a new kit label key is a silent English string
644
+ * in every translated app (see `missingDataTableLabels`), and the caller has the
645
+ * word in its own catalogue already. Without it the row is unlabelled on screen —
646
+ * pass one.
647
+ */
648
+ footerLabel?: ReactNode;
649
+ /**
650
+ * Show the totals row. Default: shown when any column declares a `footer`. Set
651
+ * false to drop it without touching the column definitions (a "show totals"
652
+ * switch). The row is also left out while there are no rows to total — a row of
653
+ * zeroes under "No results" says nothing the empty state has not.
654
+ */
655
+ footer?: boolean;
616
656
  }
617
657
  /** One entry of {@link DataTableProps.rowActions}. */
618
658
  interface DataTableRowAction<T> {
@@ -657,6 +697,6 @@ interface MobileSwipeActions {
657
697
  right?: SwipeAction[];
658
698
  }
659
699
 
660
- declare function DataTable<T>({ rows, columns: columnsProp, rowKey, defaultPageSize, onRowClick, rowHref, expandedRow, isExpanded, rowClassName, rowAttributes, paginated, empty, storageKey, urlSync, fillHeight, maxBodyHeight, serverPagination, filters: filtersProp, onFiltersChange, sorts: sortsProp, onSortsChange, selection, labels: labelsProp, locale: localeProp, storageKeyPrefix, mobileExpandAsDialog, mobileGroupBy, mobileGroupLabel, mobileCard, mobileSwipeActions, leadingRow, density, sortCycle, chrome, columnSettings: columnSettingsProp, resizable: resizableProp, multiSort: multiSortProp, frame, className, rowActions, toolbar, }: DataTableProps<T>): react.JSX.Element;
700
+ declare function DataTable<T>({ rows, columns: columnsProp, rowKey, defaultPageSize, onRowClick, rowHref, expandedRow, isExpanded, rowClassName, rowAttributes, paginated, empty, storageKey, urlSync, fillHeight, maxBodyHeight, serverPagination, filters: filtersProp, onFiltersChange, sorts: sortsProp, onSortsChange, selection, labels: labelsProp, locale: localeProp, storageKeyPrefix, mobileExpandAsDialog, mobileGroupBy, mobileGroupLabel, mobileCard, mobileSwipeActions, leadingRow, density, sortCycle, chrome, columnSettings: columnSettingsProp, resizable: resizableProp, multiSort: multiSortProp, frame, className, rowActions, toolbar, footerLabel, footer: footerProp, }: DataTableProps<T>): react.JSX.Element;
661
701
 
662
702
  export { useTableState as A, type ColumnFilter as C, DataTable as D, type FilterState as F, type MobileSwipeActions as M, type ServerPagination as S, type TableUrlState as T, type UseTableUrlStateOptions as U, type DataTableChrome as a, type DataTableColumn as b, type DataTableDensity as c, type DataTableProps as d, type DataTableRowAction as e, type FilterValue as f, type TableUrlStateProps as g, type TableUrlSync as h, type UseTableUrlStateReturn as i, dateFilter as j, decodeFilterValue as k, decodeFilterValueOfType as l, defaultFilterState as m, encodeFilterValue as n, filterHref as o, isFilterActive as p, numberFilter as q, readTableUrlState as r, resolveFilter as s, rowMatches as t, selectFilter as u, textFilter as v, useTableUrlState as w, type DataTableCellProps as x, type DataTableHeadProps as y, DEFAULT_PERSIST_PREFIX as z };
@@ -1,6 +1,6 @@
1
1
  export { DEFAULT_DATA_TABLE_LABELS, DataTableLabels, missingDataTableLabels, resolveDataTableLabels } from './components/data-table-labels.js';
2
2
  export { SortCycle, SortDir, SortState, SortStepOptions, decodeSorts, encodeSorts, nextSorts, normalizeSorts } from './components/data-table-sort.js';
3
- export { C as ColumnFilter, D as DataTable, a as DataTableChrome, b as DataTableColumn, c as DataTableDensity, d as DataTableProps, e as DataTableRowAction, F as FilterState, f as FilterValue, M as MobileSwipeActions, S as ServerPagination, T as TableUrlState, g as TableUrlStateProps, h as TableUrlSync, U as UseTableUrlStateOptions, i as UseTableUrlStateReturn, j as dateFilter, k as decodeFilterValue, l as decodeFilterValueOfType, m as defaultFilterState, n as encodeFilterValue, o as filterHref, p as isFilterActive, q as numberFilter, r as readTableUrlState, s as resolveFilter, t as rowMatches, u as selectFilter, v as textFilter, w as useTableUrlState } from './data-table-CfVXtCeG.js';
3
+ export { C as ColumnFilter, D as DataTable, a as DataTableChrome, b as DataTableColumn, c as DataTableDensity, d as DataTableProps, e as DataTableRowAction, F as FilterState, f as FilterValue, M as MobileSwipeActions, S as ServerPagination, T as TableUrlState, g as TableUrlStateProps, h as TableUrlSync, U as UseTableUrlStateOptions, i as UseTableUrlStateReturn, j as dateFilter, k as decodeFilterValue, l as decodeFilterValueOfType, m as defaultFilterState, n as encodeFilterValue, o as filterHref, p as isFilterActive, q as numberFilter, r as readTableUrlState, s as resolveFilter, t as rowMatches, u as selectFilter, v as textFilter, w as useTableUrlState } from './data-table-CpkWUJBY.js';
4
4
  export { PAGE_SIZE_OPTIONS, Pagination } from './components/data-table-pagination.js';
5
5
  export { FilterPopover } from './components/data-table-filter-popover.js';
6
6
  export { BooleanColumnOptions, BooleanMark, BooleanMarkProps, booleanColumn } from './components/data-table-cells.js';
@@ -1,5 +1,5 @@
1
1
  import { DragEvent, ReactElement } from 'react';
2
- import { b0 as UseFilePickerOptions } from '../kit-labels-DE--LmCk.js';
2
+ import { b2 as UseFilePickerOptions } from '../kit-labels-C4uB_zmg.js';
3
3
  import '../components/data-table-labels.js';
4
4
  import '../components/mini-calendar.js';
5
5
  import '../components/calendar-heatmap.js';
@@ -1,4 +1,4 @@
1
- import { aZ as UiKitLabels } from '../kit-labels-DE--LmCk.js';
1
+ import { a$ as UiKitLabels } from '../kit-labels-C4uB_zmg.js';
2
2
  import 'react';
3
3
  import '../components/data-table-labels.js';
4
4
  import '../components/mini-calendar.js';
@@ -5,7 +5,7 @@ import '../components/calendar-heatmap.js';
5
5
  import '../components/popover.js';
6
6
  import '../components/chip.js';
7
7
  import '../components/field-sync.js';
8
- export { A as AppShellLabels, C as CalculatorLabels, w as ChartTooltipPlacement, x as ComboboxLabels, y as CommonLabels, F as CurrencyLabels, G as DEFAULT_APP_SHELL_LABELS, H as DEFAULT_CALCULATOR_LABELS, I as DEFAULT_COMBOBOX_LABELS, J as DEFAULT_COMMON_LABELS, L as DEFAULT_CURRENCY_LABELS, M as DEFAULT_DATE_PICKER_LABELS, N as DEFAULT_FILE_LABELS, Q as DEFAULT_MULTI_SELECT_LABELS, S as DEFAULT_PICKER_SHEET_LABELS, T as DEFAULT_SWIPEABLE_ROW_LABELS, V as DEFAULT_TOP_BAR_LABELS, W as DatePickerLabels, ae as FileLabels, aD as KitLinkComponent, aE as KitLinkProps, aG as LabelOverride, aI as MultiSelectLabels, aL as PickerSheetLabels, aQ as SwipeableRowLabels, aX as TopBarLabels, aY as UiKitLabelOverrides, aZ as UiKitLabels, a_ as UiKitProvider, a$ as UiKitProviderProps, b3 as formatFileSize, b5 as missingKitLabels, b8 as useKitChartTooltipPlacement, b9 as useKitFileLabels, ba as useKitLabelOverrides, bb as useKitLabels, bc as useKitLink, bd as useKitLocale, be as useKitWeekStart } from '../kit-labels-DE--LmCk.js';
8
+ export { A as AppShellLabels, C as CalculatorLabels, x as ChartTooltipPlacement, y as ComboboxLabels, z as CommonLabels, G as CurrencyLabels, H as DEFAULT_APP_SHELL_LABELS, I as DEFAULT_CALCULATOR_LABELS, J as DEFAULT_COMBOBOX_LABELS, K as DEFAULT_COMMON_LABELS, M as DEFAULT_CURRENCY_LABELS, N as DEFAULT_DATE_PICKER_LABELS, O as DEFAULT_FILE_LABELS, R as DEFAULT_MULTI_SELECT_LABELS, T as DEFAULT_PICKER_SHEET_LABELS, U as DEFAULT_SWIPEABLE_ROW_LABELS, W as DEFAULT_TOP_BAR_LABELS, X as DatePickerLabels, af as FileLabels, aE as KitLinkComponent, aF as KitLinkProps, aH as LabelOverride, aJ as MultiSelectLabels, aM as PickerSheetLabels, aS as SwipeableRowLabels, aZ as TopBarLabels, a_ as UiKitLabelOverrides, a$ as UiKitLabels, b0 as UiKitProvider, b1 as UiKitProviderProps, b5 as formatFileSize, b7 as missingKitLabels, ba as useKitChartTooltipPlacement, bb as useKitFileLabels, bc as useKitLabelOverrides, bd as useKitLabels, be as useKitLink, bf as useKitLocale, bg as useKitWeekStart } from '../kit-labels-C4uB_zmg.js';
9
9
  import '../wizard/types.js';
10
10
  import '../tour/tour.js';
11
11
  import '../search/command-palette.js';
@@ -1,4 +1,4 @@
1
- import { aZ as UiKitLabels } from '../../kit-labels-DE--LmCk.js';
1
+ import { a$ as UiKitLabels } from '../../kit-labels-C4uB_zmg.js';
2
2
  import 'react';
3
3
  import '../../components/data-table-labels.js';
4
4
  import '../../components/mini-calendar.js';
@@ -1,4 +1,4 @@
1
- import { aZ as UiKitLabels } from '../../kit-labels-DE--LmCk.js';
1
+ import { a$ as UiKitLabels } from '../../kit-labels-C4uB_zmg.js';
2
2
  import 'react';
3
3
  import '../../components/data-table-labels.js';
4
4
  import '../../components/mini-calendar.js';
@@ -1,4 +1,4 @@
1
- import { aZ as UiKitLabels } from '../../kit-labels-DE--LmCk.js';
1
+ import { a$ as UiKitLabels } from '../../kit-labels-C4uB_zmg.js';
2
2
  import 'react';
3
3
  import '../../components/data-table-labels.js';
4
4
  import '../../components/mini-calendar.js';
@@ -1,4 +1,4 @@
1
- import { aZ as UiKitLabels } from '../../kit-labels-DE--LmCk.js';
1
+ import { a$ as UiKitLabels } from '../../kit-labels-C4uB_zmg.js';
2
2
  import 'react';
3
3
  import '../../components/data-table-labels.js';
4
4
  import '../../components/mini-calendar.js';
@@ -0,0 +1,71 @@
1
+ import { a$ as UiKitLabels } from '../../kit-labels-C4uB_zmg.js';
2
+ import 'react';
3
+ import '../../components/data-table-labels.js';
4
+ import '../../components/mini-calendar.js';
5
+ import '../../components/calendar-heatmap.js';
6
+ import '../../components/popover.js';
7
+ import '../../components/chip.js';
8
+ import 'lucide-react';
9
+ import '../../components/field-sync.js';
10
+ import '../../components/tooltip.js';
11
+ import '../../hooks/use-anchored-rect.js';
12
+ import '../../lib/clipping.js';
13
+ import '../../wizard/types.js';
14
+ import '../../tour/tour.js';
15
+ import '../../search/command-palette.js';
16
+ import '../../search/global-search.js';
17
+ import '../../search/search-index.js';
18
+ import '../../components/month-picker.js';
19
+ import '../../components/page-contents.js';
20
+ import '../../components/series-chart-labels.js';
21
+ import '../../components/pie-chart-labels.js';
22
+ import '../../components/sparkline.js';
23
+ import '../../components/stat-tile.js';
24
+ import '../../components/signature-pad.js';
25
+ import '../../components/password-strength.js';
26
+ import '../../components/danger-confirm.js';
27
+ import '../../components/swatch-picker.js';
28
+ import '../../components/tile-radio.js';
29
+ import '../../components/icon-picker.js';
30
+ import '../../components/dialog-frame.js';
31
+ import '../../components/modal.js';
32
+ import '../../hooks/use-search-param-state.js';
33
+ import '../../components/measured-grid.js';
34
+ import '../../feedback-attachment-WFiXJ8We.js';
35
+ import '../../feedback/feedback-thread.js';
36
+ import '../../feedback/feedback-inbox.js';
37
+ import '../../components/account-settings-labels.js';
38
+ import '../../components/confirm-dialog.js';
39
+ import '../../components/floating-panel.js';
40
+ import '../../components/bulk-action-bar.js';
41
+ import '../../components/list.js';
42
+ import '../../components/signed-amount.js';
43
+ import '../../components/breadcrumbs.js';
44
+ import '../../components/toast.js';
45
+ import '../../components/description-list.js';
46
+ import '../../components/line-items.js';
47
+ import '../../components/progress-bar.js';
48
+ import '../../components/error-boundary.js';
49
+ import '../../components/authed-image.js';
50
+ import '../../hooks/use-authed-src.js';
51
+ import '../../components/image-grid.js';
52
+ import '../../components/lightbox.js';
53
+
54
+ /**
55
+ * The kit's English words with every count and file size formatted for
56
+ * `numberLocale` — `uiKitLabelsEn("en-CH")` reads "12’345 rows", where the defaults
57
+ * print "12345". For `<UiKitProvider labels={uiKitLabelsEn("en-CH")}>`.
58
+ *
59
+ * A factory and not a constant on purpose: {@link DEFAULT_UI_KIT_LABELS} prints counts
60
+ * raw and has since 0.1, so an app that passes nothing must keep seeing exactly that.
61
+ * Formatting is something an app asks for, by calling this.
62
+ *
63
+ * Derived rather than copied: every word is the default's own, spread in, and only the
64
+ * labels that print a number are restated — with the same wording and the same
65
+ * singular/plural split — so a key added to the defaults is here the moment it lands.
66
+ * Row and line numbers (`lineItems.row`, `measuredGrid.cell`) are positions, not
67
+ * counts, and stay as the defaults print them, as in the other catalogues.
68
+ */
69
+ declare function uiKitLabelsEn(numberLocale?: string): UiKitLabels;
70
+
71
+ export { uiKitLabelsEn };
@@ -0,0 +1,95 @@
1
+ "use client";
2
+ import { DEFAULT_UI_KIT_LABELS } from "../defaults.js";
3
+ import { formatFileSize } from "../kit-labels.js";
4
+ function uiKitLabelsEn(numberLocale = "en-US") {
5
+ const num = new Intl.NumberFormat(numberLocale);
6
+ const n = (value) => num.format(value);
7
+ const d = DEFAULT_UI_KIT_LABELS;
8
+ return {
9
+ ...d,
10
+ feedbackAttachment: {
11
+ ...d.feedbackAttachment,
12
+ attachmentLimit: (max) => `Up to ${n(max)} ${max === 1 ? "attachment" : "attachments"} \u2014 remove one to add another.`
13
+ },
14
+ measuredGrid: {
15
+ ...d.measuredGrid,
16
+ points: (count) => count === 1 ? "1 point" : `${n(count)} points`,
17
+ problems: (count) => count === 1 ? "1 cell is not a number" : `${n(count)} cells are not numbers`
18
+ },
19
+ dataTable: {
20
+ ...d.dataTable,
21
+ filterResults: (shown, total) => `${n(shown)} of ${n(total)} rows`,
22
+ pageChanged: (page, totalPages) => `Page ${n(page)} of ${n(totalPages)}`,
23
+ pageRange: (from, to, total) => `${n(from)}\u2013${n(to)} / ${n(total)}`,
24
+ rowCount: (total) => n(total),
25
+ columnsCount: (visible, total) => `Columns (${n(visible)}/${n(total)})`
26
+ },
27
+ calendarHeatmap: {
28
+ ...d.calendarHeatmap,
29
+ truncated: (count) => `Showing the most recent days; ${n(count)} earlier ${count === 1 ? "day is" : "days are"} not shown.`
30
+ },
31
+ combobox: {
32
+ ...d.combobox,
33
+ selectedCount: (count) => `${n(count)} selected`,
34
+ resultCount: (count) => count === 1 ? "1 result" : `${n(count)} results`,
35
+ minChars: (count) => count === 1 ? "Type at least 1 character" : `Type at least ${n(count)} characters`
36
+ },
37
+ multiSelect: {
38
+ ...d.multiSelect,
39
+ selectedCount: (count) => n(count)
40
+ },
41
+ chipInput: {
42
+ ...d.chipInput,
43
+ atLimit: (max) => `Limit of ${n(max)} reached`
44
+ },
45
+ iconPicker: {
46
+ ...d.iconPicker,
47
+ resultCount: (count) => count === 1 ? "1 icon" : `${n(count)} icons`
48
+ },
49
+ bulkActionBar: {
50
+ ...d.bulkActionBar,
51
+ selected: (count) => `${n(count)} selected`
52
+ },
53
+ file: {
54
+ // The kit's own `Intl` unit formatting, pinned to this locale ("3.4 MB").
55
+ size: (bytes) => formatFileSize(bytes, numberLocale)
56
+ },
57
+ filePicker: {
58
+ ...d.filePicker,
59
+ rejectedCount: (name, maxFiles) => `\u201C${name}\u201D was not added: at most ${n(maxFiles)} ${maxFiles === 1 ? "file" : "files"}`,
60
+ rejectedMany: (count) => `${n(count)} files were not added`,
61
+ rejectedPick: (count) => count === 1 ? "The file was not added" : `None of the ${n(count)} files were added`,
62
+ selected: (count, firstName) => count === 1 ? `\u201C${firstName}\u201D selected` : `${n(count)} files selected`
63
+ },
64
+ wizard: {
65
+ ...d.wizard,
66
+ step: (current, total) => `Step ${n(current)} of ${n(total)}`
67
+ },
68
+ tour: {
69
+ ...d.tour,
70
+ step: (current, total) => `${n(current)} / ${n(total)}`
71
+ },
72
+ passwordStrength: {
73
+ ...d.passwordStrength,
74
+ ruleLength: (minLength) => `At least ${n(minLength)} characters`,
75
+ tooLong: (maxBytes) => `At most ${n(maxBytes)} characters (accents and emoji count for more than one).`
76
+ },
77
+ floatingPanel: {
78
+ ...d.floatingPanel,
79
+ badge: (count) => `${n(count)} new`
80
+ },
81
+ imageGrid: {
82
+ ...d.imageGrid,
83
+ item: (index, count) => `Image ${n(index)} of ${n(count)}`
84
+ },
85
+ lightbox: {
86
+ ...d.lightbox,
87
+ counter: (index, count) => `${n(index)} / ${n(count)}`,
88
+ position: (index, count) => `Image ${n(index)} of ${n(count)}`
89
+ }
90
+ };
91
+ }
92
+ export {
93
+ uiKitLabelsEn
94
+ };
95
+ //# sourceMappingURL=en.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/i18n/locales/en.ts"],"sourcesContent":["import { DEFAULT_UI_KIT_LABELS } from \"../defaults\";\nimport { formatFileSize } from \"../kit-labels\";\nimport type { UiKitLabels } from \"../kit-labels\";\n\n/**\n * The kit's English words with every count and file size formatted for\n * `numberLocale` — `uiKitLabelsEn(\"en-CH\")` reads \"12’345 rows\", where the defaults\n * print \"12345\". For `<UiKitProvider labels={uiKitLabelsEn(\"en-CH\")}>`.\n *\n * A factory and not a constant on purpose: {@link DEFAULT_UI_KIT_LABELS} prints counts\n * raw and has since 0.1, so an app that passes nothing must keep seeing exactly that.\n * Formatting is something an app asks for, by calling this.\n *\n * Derived rather than copied: every word is the default's own, spread in, and only the\n * labels that print a number are restated — with the same wording and the same\n * singular/plural split — so a key added to the defaults is here the moment it lands.\n * Row and line numbers (`lineItems.row`, `measuredGrid.cell`) are positions, not\n * counts, and stay as the defaults print them, as in the other catalogues.\n */\nexport function uiKitLabelsEn(numberLocale = \"en-US\"): UiKitLabels {\n const num = new Intl.NumberFormat(numberLocale);\n const n = (value: number) => num.format(value);\n const d = DEFAULT_UI_KIT_LABELS;\n\n return {\n ...d,\n feedbackAttachment: {\n ...d.feedbackAttachment,\n attachmentLimit: (max) =>\n `Up to ${n(max)} ${max === 1 ? \"attachment\" : \"attachments\"} — remove one to add another.`,\n },\n measuredGrid: {\n ...d.measuredGrid,\n points: (count) => (count === 1 ? \"1 point\" : `${n(count)} points`),\n problems: (count) =>\n count === 1 ? \"1 cell is not a number\" : `${n(count)} cells are not numbers`,\n },\n dataTable: {\n ...d.dataTable,\n filterResults: (shown, total) => `${n(shown)} of ${n(total)} rows`,\n pageChanged: (page, totalPages) => `Page ${n(page)} of ${n(totalPages)}`,\n pageRange: (from, to, total) => `${n(from)}–${n(to)} / ${n(total)}`,\n rowCount: (total) => n(total),\n columnsCount: (visible, total) => `Columns (${n(visible)}/${n(total)})`,\n },\n calendarHeatmap: {\n ...d.calendarHeatmap,\n truncated: (count) =>\n `Showing the most recent days; ${n(count)} earlier ${count === 1 ? \"day is\" : \"days are\"} not shown.`,\n },\n combobox: {\n ...d.combobox,\n selectedCount: (count) => `${n(count)} selected`,\n resultCount: (count) => (count === 1 ? \"1 result\" : `${n(count)} results`),\n minChars: (count) =>\n count === 1 ? \"Type at least 1 character\" : `Type at least ${n(count)} characters`,\n },\n multiSelect: {\n ...d.multiSelect,\n selectedCount: (count) => n(count),\n },\n chipInput: {\n ...d.chipInput,\n atLimit: (max) => `Limit of ${n(max)} reached`,\n },\n iconPicker: {\n ...d.iconPicker,\n resultCount: (count) => (count === 1 ? \"1 icon\" : `${n(count)} icons`),\n },\n bulkActionBar: {\n ...d.bulkActionBar,\n selected: (count) => `${n(count)} selected`,\n },\n file: {\n // The kit's own `Intl` unit formatting, pinned to this locale (\"3.4 MB\").\n size: (bytes) => formatFileSize(bytes, numberLocale),\n },\n filePicker: {\n ...d.filePicker,\n rejectedCount: (name, maxFiles) =>\n `“${name}” was not added: at most ${n(maxFiles)} ${maxFiles === 1 ? \"file\" : \"files\"}`,\n rejectedMany: (count) => `${n(count)} files were not added`,\n rejectedPick: (count) =>\n count === 1 ? \"The file was not added\" : `None of the ${n(count)} files were added`,\n selected: (count, firstName) =>\n count === 1 ? `“${firstName}” selected` : `${n(count)} files selected`,\n },\n wizard: {\n ...d.wizard,\n step: (current, total) => `Step ${n(current)} of ${n(total)}`,\n },\n tour: {\n ...d.tour,\n step: (current, total) => `${n(current)} / ${n(total)}`,\n },\n passwordStrength: {\n ...d.passwordStrength,\n ruleLength: (minLength) => `At least ${n(minLength)} characters`,\n tooLong: (maxBytes) =>\n `At most ${n(maxBytes)} characters (accents and emoji count for more than one).`,\n },\n floatingPanel: {\n ...d.floatingPanel,\n badge: (count) => `${n(count)} new`,\n },\n imageGrid: {\n ...d.imageGrid,\n item: (index, count) => `Image ${n(index)} of ${n(count)}`,\n },\n lightbox: {\n ...d.lightbox,\n counter: (index, count) => `${n(index)} / ${n(count)}`,\n position: (index, count) => `Image ${n(index)} of ${n(count)}`,\n },\n };\n}\n"],"mappings":";AAAA,SAAS,6BAA6B;AACtC,SAAS,sBAAsB;AAkBxB,SAAS,cAAc,eAAe,SAAsB;AACjE,QAAM,MAAM,IAAI,KAAK,aAAa,YAAY;AAC9C,QAAM,IAAI,CAAC,UAAkB,IAAI,OAAO,KAAK;AAC7C,QAAM,IAAI;AAEV,SAAO;AAAA,IACL,GAAG;AAAA,IACH,oBAAoB;AAAA,MAClB,GAAG,EAAE;AAAA,MACL,iBAAiB,CAAC,QAChB,SAAS,EAAE,GAAG,CAAC,IAAI,QAAQ,IAAI,eAAe,aAAa;AAAA,IAC/D;AAAA,IACA,cAAc;AAAA,MACZ,GAAG,EAAE;AAAA,MACL,QAAQ,CAAC,UAAW,UAAU,IAAI,YAAY,GAAG,EAAE,KAAK,CAAC;AAAA,MACzD,UAAU,CAAC,UACT,UAAU,IAAI,2BAA2B,GAAG,EAAE,KAAK,CAAC;AAAA,IACxD;AAAA,IACA,WAAW;AAAA,MACT,GAAG,EAAE;AAAA,MACL,eAAe,CAAC,OAAO,UAAU,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC;AAAA,MAC3D,aAAa,CAAC,MAAM,eAAe,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;AAAA,MACtE,WAAW,CAAC,MAAM,IAAI,UAAU,GAAG,EAAE,IAAI,CAAC,SAAI,EAAE,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,MACjE,UAAU,CAAC,UAAU,EAAE,KAAK;AAAA,MAC5B,cAAc,CAAC,SAAS,UAAU,YAAY,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;AAAA,IACtE;AAAA,IACA,iBAAiB;AAAA,MACf,GAAG,EAAE;AAAA,MACL,WAAW,CAAC,UACV,iCAAiC,EAAE,KAAK,CAAC,YAAY,UAAU,IAAI,WAAW,UAAU;AAAA,IAC5F;AAAA,IACA,UAAU;AAAA,MACR,GAAG,EAAE;AAAA,MACL,eAAe,CAAC,UAAU,GAAG,EAAE,KAAK,CAAC;AAAA,MACrC,aAAa,CAAC,UAAW,UAAU,IAAI,aAAa,GAAG,EAAE,KAAK,CAAC;AAAA,MAC/D,UAAU,CAAC,UACT,UAAU,IAAI,8BAA8B,iBAAiB,EAAE,KAAK,CAAC;AAAA,IACzE;AAAA,IACA,aAAa;AAAA,MACX,GAAG,EAAE;AAAA,MACL,eAAe,CAAC,UAAU,EAAE,KAAK;AAAA,IACnC;AAAA,IACA,WAAW;AAAA,MACT,GAAG,EAAE;AAAA,MACL,SAAS,CAAC,QAAQ,YAAY,EAAE,GAAG,CAAC;AAAA,IACtC;AAAA,IACA,YAAY;AAAA,MACV,GAAG,EAAE;AAAA,MACL,aAAa,CAAC,UAAW,UAAU,IAAI,WAAW,GAAG,EAAE,KAAK,CAAC;AAAA,IAC/D;AAAA,IACA,eAAe;AAAA,MACb,GAAG,EAAE;AAAA,MACL,UAAU,CAAC,UAAU,GAAG,EAAE,KAAK,CAAC;AAAA,IAClC;AAAA,IACA,MAAM;AAAA;AAAA,MAEJ,MAAM,CAAC,UAAU,eAAe,OAAO,YAAY;AAAA,IACrD;AAAA,IACA,YAAY;AAAA,MACV,GAAG,EAAE;AAAA,MACL,eAAe,CAAC,MAAM,aACpB,SAAI,IAAI,iCAA4B,EAAE,QAAQ,CAAC,IAAI,aAAa,IAAI,SAAS,OAAO;AAAA,MACtF,cAAc,CAAC,UAAU,GAAG,EAAE,KAAK,CAAC;AAAA,MACpC,cAAc,CAAC,UACb,UAAU,IAAI,2BAA2B,eAAe,EAAE,KAAK,CAAC;AAAA,MAClE,UAAU,CAAC,OAAO,cAChB,UAAU,IAAI,SAAI,SAAS,oBAAe,GAAG,EAAE,KAAK,CAAC;AAAA,IACzD;AAAA,IACA,QAAQ;AAAA,MACN,GAAG,EAAE;AAAA,MACL,MAAM,CAAC,SAAS,UAAU,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC;AAAA,IAC7D;AAAA,IACA,MAAM;AAAA,MACJ,GAAG,EAAE;AAAA,MACL,MAAM,CAAC,SAAS,UAAU,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,IACvD;AAAA,IACA,kBAAkB;AAAA,MAChB,GAAG,EAAE;AAAA,MACL,YAAY,CAAC,cAAc,YAAY,EAAE,SAAS,CAAC;AAAA,MACnD,SAAS,CAAC,aACR,WAAW,EAAE,QAAQ,CAAC;AAAA,IAC1B;AAAA,IACA,eAAe;AAAA,MACb,GAAG,EAAE;AAAA,MACL,OAAO,CAAC,UAAU,GAAG,EAAE,KAAK,CAAC;AAAA,IAC/B;AAAA,IACA,WAAW;AAAA,MACT,GAAG,EAAE;AAAA,MACL,MAAM,CAAC,OAAO,UAAU,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC;AAAA,IAC1D;AAAA,IACA,UAAU;AAAA,MACR,GAAG,EAAE;AAAA,MACL,SAAS,CAAC,OAAO,UAAU,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,MACpD,UAAU,CAAC,OAAO,UAAU,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC;AAAA,IAC9D;AAAA,EACF;AACF;","names":[]}
@@ -1,4 +1,4 @@
1
- import { aZ as UiKitLabels } from '../../kit-labels-DE--LmCk.js';
1
+ import { a$ as UiKitLabels } from '../../kit-labels-C4uB_zmg.js';
2
2
  import 'react';
3
3
  import '../../components/data-table-labels.js';
4
4
  import '../../components/mini-calendar.js';
@@ -1,4 +1,4 @@
1
- import { aZ as UiKitLabels } from '../../kit-labels-DE--LmCk.js';
1
+ import { a$ as UiKitLabels } from '../../kit-labels-C4uB_zmg.js';
2
2
  import 'react';
3
3
  import '../../components/data-table-labels.js';
4
4
  import '../../components/mini-calendar.js';
@@ -1,4 +1,4 @@
1
- import { aZ as UiKitLabels } from '../../kit-labels-DE--LmCk.js';
1
+ import { a$ as UiKitLabels } from '../../kit-labels-C4uB_zmg.js';
2
2
  import 'react';
3
3
  import '../../components/data-table-labels.js';
4
4
  import '../../components/mini-calendar.js';
@@ -1,4 +1,4 @@
1
- import { aZ as UiKitLabels } from '../../kit-labels-DE--LmCk.js';
1
+ import { a$ as UiKitLabels } from '../../kit-labels-C4uB_zmg.js';
2
2
  import 'react';
3
3
  import '../../components/data-table-labels.js';
4
4
  import '../../components/mini-calendar.js';
@@ -1,4 +1,4 @@
1
- import { aZ as UiKitLabels } from '../../kit-labels-DE--LmCk.js';
1
+ import { a$ as UiKitLabels } from '../../kit-labels-C4uB_zmg.js';
2
2
  import 'react';
3
3
  import '../../components/data-table-labels.js';
4
4
  import '../../components/mini-calendar.js';
package/dist/index.d.ts CHANGED
@@ -25,7 +25,7 @@ export { AnchorRole, ChartRampReport, ContrastCheck, ContrastReport, DeriveOptio
25
25
  export { ALTERNATIVE_PRESETS, DEFAULT_PRESET, DERIVED_PRESETS, IMPRINT_PRESET, PALETTES, PalettePreset, TokenSet, applyTokenSet, presetById } from './theme/palette-presets.js';
26
26
  export { ThemeMode, ThemePreference, ThemeState, ThemeStore, applyPersistedTheme, createThemeStore } from './theme/theme-store.js';
27
27
  export { PaletteStore, applyPersistedPalette, createPaletteStore } from './theme/palette-store.js';
28
- export { A as AppShellLabels, B as Button, a as ButtonClassesOptions, b as ButtonLinkProps, c as ButtonProps, d as ButtonSize, e as ButtonTone, f as ButtonVariant, C as CalculatorLabels, g as Card, h as CardAction, i as CardActionProps, j as CardContent, k as CardContentProps, l as CardDescription, m as CardDescriptionProps, n as CardFooter, o as CardFooterProps, p as CardHeader, q as CardHeaderProps, r as CardProps, s as CardTitle, t as CardTitleLevel, u as CardTitleProps, v as CardTone, w as ChartTooltipPlacement, x as ComboboxLabels, y as CommonLabels, z as CopyButton, D as CopyButtonLabels, E as CopyButtonProps, F as CurrencyLabels, G as DEFAULT_APP_SHELL_LABELS, H as DEFAULT_CALCULATOR_LABELS, I as DEFAULT_COMBOBOX_LABELS, J as DEFAULT_COMMON_LABELS, K as DEFAULT_COPY_BUTTON_LABELS, L as DEFAULT_CURRENCY_LABELS, M as DEFAULT_DATE_PICKER_LABELS, N as DEFAULT_FILE_LABELS, O as DEFAULT_FILE_PICKER_LABELS, P as DEFAULT_FORM_ACTIONS_LABELS, Q as DEFAULT_MULTI_SELECT_LABELS, R as DEFAULT_PASSWORD_REVEAL_LABELS, S as DEFAULT_PICKER_SHEET_LABELS, T as DEFAULT_SWIPEABLE_ROW_LABELS, U as DEFAULT_TABS_LABELS, V as DEFAULT_TOP_BAR_LABELS, W as DatePickerLabels, X as EmptyState, Y as EmptyStateProps, Z as FIELD_BASE, _ as FIELD_DISPLAY, $ as FIELD_FLOATING_PAD, a0 as FIELD_INVALID, a1 as FIELD_TRIGGER, a2 as FIELD_WRITABLE_LOOK, a3 as FLOATING_INPUT_CLASS, a4 as FLOATING_LABEL_CLASS, a5 as FLOATING_LABEL_STATIC, a6 as FieldChevron, a7 as FieldChevronProps, a8 as FieldHint, a9 as FieldHintProps, aa as FieldLabel, ab as FieldLabelProps, ac as FileButton, ad as FileButtonProps, ae as FileLabels, af as FilePickerLabels, ag as FileRejection, ah as FileRejectionReason, ai as FileScreenOptions, aj as FloatingField, ak as FloatingFieldProps, al as FormActions, am as FormActionsAlign, an as FormActionsDestructive, ao as FormActionsLabels, ap as FormActionsPlacement, aq as FormActionsProps, ar as FormActionsStickyWithin, as as FormActionsSubmitProps, at as IconButton, au as IconButtonGlyphSize, av as IconButtonLinkProps, aw as IconButtonProps, ax as IconButtonSize, ay as IconButtonTone, az as IconButtonToneColor, aA as IconButtonVariant, aB as Input, aC as InputProps, aD as KitLinkComponent, aE as KitLinkProps, aF as Label, aG as LabelOverride, aH as LabelProps, aI as MultiSelectLabels, aJ as PHONE_QUERY, aK as PasswordRevealLabels, aL as PickerSheetLabels, aM as Select, aN as SelectProps, aO as Spinner, aP as SpinnerProps, aQ as SwipeableRowLabels, aR as TabItem, aS as Tabs, aT as TabsLabels, aU as TabsProps, aV as Textarea, aW as TextareaProps, aX as TopBarLabels, aY as UiKitLabelOverrides, aZ as UiKitLabels, a_ as UiKitProvider, a$ as UiKitProviderProps, b0 as UseFilePickerOptions, b1 as UseFilePickerReturn, b2 as buttonClasses, b3 as formatFileSize, b4 as matchesAccept, b5 as missingKitLabels, b6 as resolvePasswordRevealLabels, b7 as useFilePicker, b8 as useKitChartTooltipPlacement, b9 as useKitFileLabels, ba as useKitLabelOverrides, bb as useKitLabels, bc as useKitLink, bd as useKitLocale, be as useKitWeekStart } from './kit-labels-DE--LmCk.js';
28
+ export { A as AppShellLabels, B as Button, a as ButtonClassesOptions, b as ButtonLinkProps, c as ButtonProps, d as ButtonSize, e as ButtonTone, f as ButtonVariant, C as CalculatorLabels, g as Card, h as CardAction, i as CardActionProps, j as CardContent, k as CardContentProps, l as CardDensity, m as CardDescription, n as CardDescriptionProps, o as CardFooter, p as CardFooterProps, q as CardHeader, r as CardHeaderProps, s as CardProps, t as CardTitle, u as CardTitleLevel, v as CardTitleProps, w as CardTone, x as ChartTooltipPlacement, y as ComboboxLabels, z as CommonLabels, D as CopyButton, E as CopyButtonLabels, F as CopyButtonProps, G as CurrencyLabels, H as DEFAULT_APP_SHELL_LABELS, I as DEFAULT_CALCULATOR_LABELS, J as DEFAULT_COMBOBOX_LABELS, K as DEFAULT_COMMON_LABELS, L as DEFAULT_COPY_BUTTON_LABELS, M as DEFAULT_CURRENCY_LABELS, N as DEFAULT_DATE_PICKER_LABELS, O as DEFAULT_FILE_LABELS, P as DEFAULT_FILE_PICKER_LABELS, Q as DEFAULT_FORM_ACTIONS_LABELS, R as DEFAULT_MULTI_SELECT_LABELS, S as DEFAULT_PASSWORD_REVEAL_LABELS, T as DEFAULT_PICKER_SHEET_LABELS, U as DEFAULT_SWIPEABLE_ROW_LABELS, V as DEFAULT_TABS_LABELS, W as DEFAULT_TOP_BAR_LABELS, X as DatePickerLabels, Y as EmptyState, Z as EmptyStateProps, _ as FIELD_BASE, $ as FIELD_DISPLAY, a0 as FIELD_FLOATING_PAD, a1 as FIELD_INVALID, a2 as FIELD_TRIGGER, a3 as FIELD_WRITABLE_LOOK, a4 as FLOATING_INPUT_CLASS, a5 as FLOATING_LABEL_CLASS, a6 as FLOATING_LABEL_STATIC, a7 as FieldChevron, a8 as FieldChevronProps, a9 as FieldHint, aa as FieldHintProps, ab as FieldLabel, ac as FieldLabelProps, ad as FileButton, ae as FileButtonProps, af as FileLabels, ag as FilePickerLabels, ah as FileRejection, ai as FileRejectionReason, aj as FileScreenOptions, ak as FloatingField, al as FloatingFieldProps, am as FormActions, an as FormActionsAlign, ao as FormActionsDestructive, ap as FormActionsLabels, aq as FormActionsPlacement, ar as FormActionsProps, as as FormActionsStickyWithin, at as FormActionsSubmitProps, au as IconButton, av as IconButtonGlyphSize, aw as IconButtonLinkProps, ax as IconButtonProps, ay as IconButtonSize, az as IconButtonTone, aA as IconButtonToneColor, aB as IconButtonVariant, aC as Input, aD as InputProps, aE as KitLinkComponent, aF as KitLinkProps, aG as Label, aH as LabelOverride, aI as LabelProps, aJ as MultiSelectLabels, aK as PHONE_QUERY, aL as PasswordRevealLabels, aM as PickerSheetLabels, aN as ResponsiveFormActionsPlacement, aO as Select, aP as SelectProps, aQ as Spinner, aR as SpinnerProps, aS as SwipeableRowLabels, aT as TabItem, aU as Tabs, aV as TabsLabels, aW as TabsProps, aX as Textarea, aY as TextareaProps, aZ as TopBarLabels, a_ as UiKitLabelOverrides, a$ as UiKitLabels, b0 as UiKitProvider, b1 as UiKitProviderProps, b2 as UseFilePickerOptions, b3 as UseFilePickerReturn, b4 as buttonClasses, b5 as formatFileSize, b6 as matchesAccept, b7 as missingKitLabels, b8 as resolvePasswordRevealLabels, b9 as useFilePicker, ba as useKitChartTooltipPlacement, bb as useKitFileLabels, bc as useKitLabelOverrides, bd as useKitLabels, be as useKitLink, bf as useKitLocale, bg as useKitWeekStart } from './kit-labels-C4uB_zmg.js';
29
29
  export { Field, FieldControlProps, FieldLabelVisibility, FieldProps, FieldRenderMeta } from './components/field.js';
30
30
  export { SearchField, SearchFieldProps } from './components/search-field.js';
31
31
  export { DropdownPanel, DropdownPanelProps, DropdownSearchHeader, DropdownSearchHeaderProps, useDropdown, useDropdownSearch } from './components/dropdown.js';
@@ -97,7 +97,7 @@ export { DatePicker, DatePickerProps, DateRangeCommit, DateRangeDraftSummary, Da
97
97
  export { TreeItemState, TreeNode, TreeRow, TreeRowProps, TreeView, TreeViewProps } from './components/tree-view.js';
98
98
  export { ChartConfig, ChartContainer, ChartLegend, ChartLegendContent, ChartSeriesConfig, ChartTooltip, ChartTooltipContent, useChart } from './components/chart.js';
99
99
  export { DEFAULT_DESCRIPTION_LIST_LABELS, DescriptionItem, DescriptionItemProps, DescriptionList, DescriptionListColumns, DescriptionListDensity, DescriptionListLabels, DescriptionListLayout, DescriptionListProps } from './components/description-list.js';
100
- export { DEFAULT_LINE_ITEMS_LABELS, LineItemCellContext, LineItems, LineItemsColumn, LineItemsFieldLabels, LineItemsLabels, LineItemsProps, LineItemsSummary, LineItemsSummaryTone } from './components/line-items.js';
100
+ export { DEFAULT_LINE_ITEMS_LABELS, LineItemCellContext, LineItems, LineItemsColumn, LineItemsFieldLabels, LineItemsLabels, LineItemsProps, LineItemsRemoveAlign, LineItemsRemovePlacement, LineItemsSummary, LineItemsSummaryTone } from './components/line-items.js';
101
101
  export { DEFAULT_PROGRESS_BAR_LABELS, ProgressBar, ProgressBarLabels, ProgressBarProps, ProgressBarSegment, ProgressBarSize, ProgressBarTone } from './components/progress-bar.js';
102
102
  export { Skeleton, SkeletonProps, SkeletonShape } from './components/skeleton.js';
103
103
  export { LoadingState, LoadingStateLabelVisibility, LoadingStateProps, LoadingStateSize } from './components/loading-state.js';
@@ -120,7 +120,7 @@ export { TextLink, TextLinkCurrent, TextLinkProps, TextLinkRenderProps, TextLink
120
120
  export { DEFAULT_TOAST_LABELS, TOAST_ACTION_DURATION, ToastAction, ToastId, ToastLabels, ToastOptions, ToastPosition, ToastPromiseOptions, ToastRedoOptions, ToastSwipeDirection, ToastUndoOptions, Toaster, ToasterOffset, ToasterProps, toast } from './components/toast.js';
121
121
  export { DEFAULT_DATA_TABLE_LABELS, DataTableLabels, missingDataTableLabels, resolveDataTableLabels } from './components/data-table-labels.js';
122
122
  export { SortCycle, SortDir, SortState, SortStepOptions, decodeSorts, encodeSorts, nextSorts, normalizeSorts } from './components/data-table-sort.js';
123
- export { C as ColumnFilter, D as DataTable, x as DataTableCellProps, a as DataTableChrome, b as DataTableColumn, c as DataTableDensity, y as DataTableHeadProps, d as DataTableProps, e as DataTableRowAction, F as FilterState, f as FilterValue, M as MobileSwipeActions, S as ServerPagination, T as TableUrlState, g as TableUrlStateProps, h as TableUrlSync, U as UseTableUrlStateOptions, i as UseTableUrlStateReturn, j as dateFilter, k as decodeFilterValue, l as decodeFilterValueOfType, m as defaultFilterState, n as encodeFilterValue, o as filterHref, p as isFilterActive, q as numberFilter, r as readTableUrlState, s as resolveFilter, t as rowMatches, u as selectFilter, v as textFilter, w as useTableUrlState } from './data-table-CfVXtCeG.js';
123
+ export { C as ColumnFilter, D as DataTable, x as DataTableCellProps, a as DataTableChrome, b as DataTableColumn, c as DataTableDensity, y as DataTableHeadProps, d as DataTableProps, e as DataTableRowAction, F as FilterState, f as FilterValue, M as MobileSwipeActions, S as ServerPagination, T as TableUrlState, g as TableUrlStateProps, h as TableUrlSync, U as UseTableUrlStateOptions, i as UseTableUrlStateReturn, j as dateFilter, k as decodeFilterValue, l as decodeFilterValueOfType, m as defaultFilterState, n as encodeFilterValue, o as filterHref, p as isFilterActive, q as numberFilter, r as readTableUrlState, s as resolveFilter, t as rowMatches, u as selectFilter, v as textFilter, w as useTableUrlState } from './data-table-CpkWUJBY.js';
124
124
  export { PAGE_SIZE_OPTIONS, Pagination } from './components/data-table-pagination.js';
125
125
  export { FilterPopover } from './components/data-table-filter-popover.js';
126
126
  export { BooleanColumnOptions, BooleanMark, BooleanMarkProps, booleanColumn } from './components/data-table-cells.js';
@@ -145,7 +145,7 @@ export { StepperNav } from './wizard/stepper-nav.js';
145
145
  export { DEFAULT_TOUR_LABELS, TourLabels, TourPlacement, TourProvider, TourStep, useTour, useTourOptional } from './tour/tour.js';
146
146
  export { CommandItem, CommandPalette, CommandPaletteDensity, CommandPaletteLabels, DEFAULT_COMMAND_PALETTE_LABELS, useCommandKey } from './search/command-palette.js';
147
147
  export { SEARCH_TIER_POINTS, SearchEntry, SearchHit, SearchIndex, SearchIndexOptions, SearchMatchField, createSearchIndex, matchEntries, normalizeSearchText } from './search/search-index.js';
148
- export { DEFAULT_GLOBAL_SEARCH_LABELS, GlobalSearch, GlobalSearchLabels, GlobalSearchProps, GlobalSearchSource, GlobalSearchSuggestion, GlobalSearchTriggerProps } from './search/global-search.js';
148
+ export { DEFAULT_GLOBAL_SEARCH_LABELS, GlobalSearch, GlobalSearchLabels, GlobalSearchProps, GlobalSearchSource, GlobalSearchSourceGroup, GlobalSearchSuggestion, GlobalSearchTriggerProps } from './search/global-search.js';
149
149
  export { DEFAULT_UI_KIT_LABELS } from './i18n/defaults.js';
150
150
  export { AccountSettingsLabels, DEFAULT_ACCOUNT_SETTINGS_LABELS, PasskeysSettingLabels, PasswordSettingLabels, ProfileSettingLabels, TwoFactorSettingLabels } from './components/account-settings-labels.js';
151
151
  export { CLIPS_ATTRIBUTE } from './lib/clipping.js';
@@ -791,9 +791,33 @@ interface CardProps extends ComponentPropsWithoutRef<"div"> {
791
791
  * nor on `inset`, which has no border to make louder (its tone is a fill).
792
792
  */
793
793
  toneStrength?: "soft" | "strong";
794
+ /**
795
+ * Wash the card in the tone's quiet `-bg` surface as well as framing it. A toned
796
+ * card is a border and a title colour, at either strength — the wash belongs to
797
+ * `AlertBanner`, the message, not to a card that holds a form — so it stays
798
+ * off by default. Some tiles want both: keksdose's password / delete-account tile
799
+ * was `toneFrameClass(tone)` (border AND wash) before 0.16, and after moving to
800
+ * `toneStrength="strong"` it re-added `bg-[var(--danger-bg)]` by hand. The wash is
801
+ * layered OVER the card's own `--bg-surface` (as AlertBanner's `elevated` does), so
802
+ * the dark theme's translucent tints stay a card, not a hole to the page below.
803
+ *
804
+ * No effect without `tone`, nor on `inset`, whose tone is already the fill.
805
+ */
806
+ toneFill?: boolean;
807
+ /**
808
+ * The parts' type scale. `"compact"`: CardTitle `text-sm font-medium`,
809
+ * CardDescription `text-xs` and the CardHeader's title-to-description gap
810
+ * `gap-0.5` — the small settings / admin card. keksdose wrote those three classes by
811
+ * hand on ~25 cards. Set here, they reach the parts through context; a class on a
812
+ * part still wins, and a Card nested inside starts again from its own density.
813
+ *
814
+ * Default `"comfortable"`: the parts as they have always been.
815
+ */
816
+ density?: CardDensity;
794
817
  }
818
+ type CardDensity = "comfortable" | "compact";
795
819
  type CardTone = "warning" | "danger" | "info" | "success";
796
- declare function Card({ className, children, flush, variant, tone, toneStrength, padding, ...rest }: CardProps): react.JSX.Element;
820
+ declare function Card({ className, children, flush, variant, tone, toneStrength, toneFill, density, padding, ...rest }: CardProps): react.JSX.Element;
797
821
  /** The sub-parts add nothing to a `<div>`'s props — they are the SAME element with a
798
822
  * `data-slot` and a padding rhythm — so most names are aliases rather than an empty
799
823
  * interface pretending to be more. They exist so a consumer's own wrapper can say
@@ -1415,6 +1439,22 @@ type FormActionsAlign = "start" | "center" | "end" | "between";
1415
1439
  * FullBleedDialog's `footer`), which already pads and rules it.
1416
1440
  */
1417
1441
  type FormActionsPlacement = "inline" | "sticky" | "dialog";
1442
+ /**
1443
+ * A placement per breakpoint, mobile first — `{ base: "sticky", md: "inline" }` is a
1444
+ * Save row stuck to the bottom of a phone's long form and in the flow under the last
1445
+ * field from 768px up, where the form fits. The breakpoints are Tailwind's (sm 640,
1446
+ * md 768, lg 1024, xl 1280px), as `BulkActionBar`'s `variant` breakpoints are, and
1447
+ * resolved the same way, in JS: the sticky row is positioned by inline style, which a
1448
+ * `md:` class cannot reach. keksdose switched `placement` on its own media query at
1449
+ * every long form for want of this.
1450
+ */
1451
+ interface ResponsiveFormActionsPlacement {
1452
+ base: FormActionsPlacement;
1453
+ sm?: FormActionsPlacement;
1454
+ md?: FormActionsPlacement;
1455
+ lg?: FormActionsPlacement;
1456
+ xl?: FormActionsPlacement;
1457
+ }
1418
1458
  /**
1419
1459
  * What a `sticky` row sticks to — see {@link FormActionsProps.stickyWithin}.
1420
1460
  * - `viewport` (default): the page's (or AppShell pane's) bottom edge, lifted onto
@@ -1494,8 +1534,20 @@ interface FormActionsProps extends Omit<ComponentPropsWithoutRef<"div">, "childr
1494
1534
  start?: ReactNode;
1495
1535
  /** Horizontal alignment. Default `end` (`between` with a `destructive` action). */
1496
1536
  align?: FormActionsAlign;
1497
- /** See {@link FormActionsPlacement}. Default `inline`. */
1498
- placement?: FormActionsPlacement;
1537
+ /** See {@link FormActionsPlacement}, or one per breakpoint — see
1538
+ * {@link ResponsiveFormActionsPlacement}. Default `inline`. */
1539
+ placement?: FormActionsPlacement | ResponsiveFormActionsPlacement;
1540
+ /**
1541
+ * While the row is `sticky`: pull it out over its container's inline padding by this
1542
+ * much (a CSS length, a number in px) and give the same back as padding — so the
1543
+ * rule above it and its surface run edge to edge, while the buttons stay on the
1544
+ * content's line. Without it a sticky row in a padded card or pane is a strip inset
1545
+ * from both sides, with the content scrolling past it in the gutters (keksdose wrote
1546
+ * `@max-md:-mx-3 @max-md:px-3` by hand). Pass the container's padding (`"0.75rem"`,
1547
+ * `12`, `"var(--pane-px)"`). Applied only while the resolved placement is sticky, so
1548
+ * `placement={{ base: "sticky", md: "inline" }}` bleeds on the phone alone.
1549
+ */
1550
+ bleed?: string | number;
1499
1551
  /**
1500
1552
  * With `placement="sticky"`: what the row sticks to. Default `viewport`.
1501
1553
  *
@@ -1539,7 +1591,7 @@ interface FormActionsProps extends Omit<ComponentPropsWithoutRef<"div">, "childr
1539
1591
  * The spinner is the kit's {@link Spinner}, drawn inside the button with `label={null}`
1540
1592
  * so the button's name stays its text; `aria-busy` is what says it is working.
1541
1593
  */
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;
1594
+ declare function FormActions({ onCancel, onSubmit, submitLabel, cancelLabel, pendingLabel, submitIcon: SubmitIcon, submitProps, pending, submitDisabled, submitDisabledReason, submitVariant, destructive, start: startSlot, align, placement: placementProp, stickyWithin, bleed, form, children, className, style, ...rest }: FormActionsProps): react.JSX.Element;
1543
1595
 
1544
1596
  /**
1545
1597
  * EVERY string the kit renders, as one typed tree — and an optional provider that
@@ -1896,4 +1948,4 @@ declare function useKitFileLabels(prop?: Partial<FileLabels>): FileLabels;
1896
1948
  */
1897
1949
  declare function missingKitLabels(labels: UiKitLabelOverrides | undefined, reference: UiKitLabels): string[];
1898
1950
 
1899
- export { FIELD_FLOATING_PAD as $, type AppShellLabels as A, Button as B, type CalculatorLabels as C, type CopyButtonLabels as D, type CopyButtonProps as E, type CurrencyLabels as F, DEFAULT_APP_SHELL_LABELS as G, DEFAULT_CALCULATOR_LABELS as H, DEFAULT_COMBOBOX_LABELS as I, DEFAULT_COMMON_LABELS as J, DEFAULT_COPY_BUTTON_LABELS as K, DEFAULT_CURRENCY_LABELS as L, DEFAULT_DATE_PICKER_LABELS as M, DEFAULT_FILE_LABELS as N, DEFAULT_FILE_PICKER_LABELS as O, DEFAULT_FORM_ACTIONS_LABELS as P, DEFAULT_MULTI_SELECT_LABELS as Q, DEFAULT_PASSWORD_REVEAL_LABELS as R, DEFAULT_PICKER_SHEET_LABELS as S, DEFAULT_SWIPEABLE_ROW_LABELS as T, DEFAULT_TABS_LABELS as U, DEFAULT_TOP_BAR_LABELS as V, type DatePickerLabels as W, EmptyState as X, type EmptyStateProps as Y, FIELD_BASE as Z, FIELD_DISPLAY as _, type ButtonClassesOptions as a, type UiKitProviderProps as a$, FIELD_INVALID as a0, FIELD_TRIGGER as a1, FIELD_WRITABLE_LOOK as a2, FLOATING_INPUT_CLASS as a3, FLOATING_LABEL_CLASS as a4, FLOATING_LABEL_STATIC as a5, FieldChevron as a6, type FieldChevronProps as a7, FieldHint as a8, type FieldHintProps as a9, type IconButtonVariant as aA, Input as aB, type InputProps as aC, type KitLinkComponent as aD, type KitLinkProps as aE, Label as aF, type LabelOverride as aG, type LabelProps as aH, type MultiSelectLabels as aI, PHONE_QUERY as aJ, type PasswordRevealLabels as aK, type PickerSheetLabels as aL, Select as aM, type SelectProps as aN, Spinner as aO, type SpinnerProps as aP, type SwipeableRowLabels as aQ, type TabItem as aR, Tabs as aS, type TabsLabels as aT, type TabsProps as aU, Textarea as aV, type TextareaProps as aW, type TopBarLabels as aX, type UiKitLabelOverrides as aY, type UiKitLabels as aZ, UiKitProvider as a_, FieldLabel as aa, type FieldLabelProps as ab, FileButton as ac, type FileButtonProps as ad, type FileLabels as ae, type FilePickerLabels as af, type FileRejection as ag, type FileRejectionReason as ah, type FileScreenOptions as ai, FloatingField as aj, type FloatingFieldProps as ak, FormActions as al, type FormActionsAlign as am, type FormActionsDestructive as an, type FormActionsLabels as ao, type FormActionsPlacement as ap, type FormActionsProps as aq, type FormActionsStickyWithin as ar, type FormActionsSubmitProps as as, IconButton as at, type IconButtonGlyphSize as au, type IconButtonLinkProps as av, type IconButtonProps as aw, type IconButtonSize as ax, type IconButtonTone as ay, type IconButtonToneColor as az, type ButtonLinkProps as b, type UseFilePickerOptions as b0, type UseFilePickerReturn as b1, buttonClasses as b2, formatFileSize as b3, matchesAccept as b4, missingKitLabels as b5, resolvePasswordRevealLabels as b6, useFilePicker as b7, useKitChartTooltipPlacement as b8, useKitFileLabels as b9, useKitLabelOverrides as ba, useKitLabels as bb, useKitLink as bc, useKitLocale as bd, useKitWeekStart as be, type FilePickHandler as bf, formatAccept as bg, judgePick as bh, screenFiles as bi, summariseRejections as bj, 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, CardDescription as l, type CardDescriptionProps as m, CardFooter as n, type CardFooterProps as o, CardHeader as p, type CardHeaderProps as q, type CardProps as r, CardTitle as s, type CardTitleLevel as t, type CardTitleProps as u, type CardTone as v, type ChartTooltipPlacement as w, type ComboboxLabels as x, type CommonLabels as y, CopyButton as z };
1951
+ export { FIELD_DISPLAY 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_SWIPEABLE_ROW_LABELS as U, DEFAULT_TABS_LABELS as V, DEFAULT_TOP_BAR_LABELS as W, type DatePickerLabels as X, EmptyState as Y, type EmptyStateProps as Z, FIELD_BASE as _, type ButtonClassesOptions as a, type UiKitLabels as a$, FIELD_FLOATING_PAD as a0, FIELD_INVALID as a1, FIELD_TRIGGER as a2, FIELD_WRITABLE_LOOK as a3, FLOATING_INPUT_CLASS as a4, FLOATING_LABEL_CLASS as a5, FLOATING_LABEL_STATIC as a6, FieldChevron as a7, type FieldChevronProps as a8, FieldHint as a9, type IconButtonToneColor as aA, type IconButtonVariant as aB, Input as aC, type InputProps as aD, type KitLinkComponent as aE, type KitLinkProps as aF, Label as aG, type LabelOverride as aH, type LabelProps as aI, type MultiSelectLabels as aJ, PHONE_QUERY as aK, type PasswordRevealLabels as aL, type PickerSheetLabels as aM, type ResponsiveFormActionsPlacement as aN, Select as aO, type SelectProps as aP, Spinner as aQ, type SpinnerProps as aR, type SwipeableRowLabels as aS, type TabItem as aT, Tabs as aU, type TabsLabels as aV, type TabsProps as aW, Textarea as aX, type TextareaProps as aY, type TopBarLabels as aZ, type UiKitLabelOverrides as a_, type FieldHintProps as aa, FieldLabel as ab, type FieldLabelProps as ac, FileButton as ad, type FileButtonProps as ae, type FileLabels as af, type FilePickerLabels as ag, type FileRejection as ah, type FileRejectionReason as ai, type FileScreenOptions as aj, FloatingField as ak, type FloatingFieldProps as al, FormActions as am, type FormActionsAlign as an, type FormActionsDestructive as ao, type FormActionsLabels as ap, type FormActionsPlacement as aq, type FormActionsProps as ar, type FormActionsStickyWithin as as, type FormActionsSubmitProps as at, IconButton as au, type IconButtonGlyphSize as av, type IconButtonLinkProps as aw, type IconButtonProps as ax, type IconButtonSize as ay, type IconButtonTone as az, type ButtonLinkProps as b, UiKitProvider as b0, type UiKitProviderProps as b1, type UseFilePickerOptions as b2, type UseFilePickerReturn as b3, buttonClasses as b4, formatFileSize as b5, matchesAccept as b6, missingKitLabels as b7, resolvePasswordRevealLabels as b8, useFilePicker as b9, useKitChartTooltipPlacement as ba, useKitFileLabels as bb, useKitLabelOverrides as bc, useKitLabels as bd, useKitLink as be, useKitLocale as bf, useKitWeekStart as bg, type FilePickHandler as bh, formatAccept as bi, judgePick as bj, screenFiles as bk, summariseRejections as bl, 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 };
@@ -1,7 +1,7 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode, ReactElement } from 'react';
3
3
  import { FieldValues, FieldPath, ControllerProps, ControllerRenderProps, ControllerFieldState } from 'react-hook-form';
4
- import { aN as SelectProps, aC as InputProps, aW as TextareaProps } from '../kit-labels-DE--LmCk.js';
4
+ import { aP as SelectProps, aD as InputProps, aY as TextareaProps } from '../kit-labels-C4uB_zmg.js';
5
5
  import { NumberFieldProps } from '../components/number-field.js';
6
6
  import { DatePickerProps } from '../components/date-picker.js';
7
7
  import { CheckboxProps } from '../components/checkbox.js';
@@ -2,7 +2,7 @@ import * as react from 'react';
2
2
  import { ReactElement, ComponentProps } from 'react';
3
3
  import * as react_hook_form from 'react-hook-form';
4
4
  import { FieldValues, FieldPath, ControllerProps } from 'react-hook-form';
5
- import { aH as LabelProps } from '../kit-labels-DE--LmCk.js';
5
+ import { aI as LabelProps } from '../kit-labels-C4uB_zmg.js';
6
6
  import '../components/data-table-labels.js';
7
7
  import '../components/mini-calendar.js';
8
8
  import '../components/calendar-heatmap.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/rhf/line-items.tsx"],"sourcesContent":["/**\n * {@link LineItems} over react-hook-form's `useFieldArray`. `@eifi1/ui-kit/rhf`.\n *\n * ```tsx\n * <RhfLineItems\n * name=\"components\"\n * newItem={() => ({ type: \"net_rent\", amount: null, validFrom: \"\" })}\n * minItems={1}\n * columns={[\n * { key: \"type\", header: \"Type\", render: ({ name, label }) => (\n * <RhfSelect name={`${name}.type`} options={TYPES} aria-label={label} />\n * ) },\n * { key: \"amount\", header: \"Amount\", width: \"8rem\", align: \"end\", render: ({ name, label }) => (\n * <RhfMoneyField name={`${name}.amount`} ariaLabel={label} />\n * ) },\n * ]}\n * totals={{ amount: formatMoney(total) }}\n * />\n * ```\n *\n * The rows are the array's `fields` (keyed by their `id`, as react-hook-form asks),\n * Add appends `newItem()`, remove is `remove(index)`, and an error on the array\n * itself — the `rules` here, or a resolver's `lines: \"At least two lines\"` — is the\n * list's `error`. Each cell's `render` gets `name`, the row's path\n * (`\"components.2\"`), to bind its field to.\n *\n * `summary`, `fieldLabels` and `narrowColumns` pass through to {@link LineItems}. With\n * `fieldLabels=\"floating\"` a cell's `fieldLabel` is the column's name; the bound\n * fields' own `label` is a `FormLabel` ABOVE the control, so for the floating\n * one render the kit field through `RhfField`:\n * `render={({ field, invalid }) => <Input label={fieldLabel} aria-label={label} {...field} invalid={invalid} />}`.\n */\nimport type { ReactNode } from \"react\";\nimport {\n useFieldArray,\n useFormState,\n type FieldArray,\n type FieldArrayPath,\n type FieldArrayWithId,\n type FieldValues,\n type UseFieldArrayProps,\n} from \"react-hook-form\";\nimport {\n LineItems,\n type LineItemCellContext,\n type LineItemsColumn,\n type LineItemsProps,\n} from \"../components/line-items\";\n\n/** A cell's context, with the row's path in the form. */\nexport interface RhfLineItemCellContext<TItem, TArrayName extends string>\n extends LineItemCellContext<TItem> {\n /** The row's path: `${name}.${index}` — bind the cell's field to\n * `` `${name}.amount` ``. */\n name: `${TArrayName}.${number}`;\n}\n\nexport interface RhfLineItemsColumn<TItem, TArrayName extends string>\n extends Omit<LineItemsColumn<TItem>, \"render\"> {\n render: (ctx: RhfLineItemCellContext<TItem, TArrayName>) => ReactNode;\n}\n\nexport interface RhfLineItemsProps<\n TFieldValues extends FieldValues = FieldValues,\n TArrayName extends FieldArrayPath<TFieldValues> = FieldArrayPath<TFieldValues>,\n TTransformed = TFieldValues,\n> extends Omit<\n LineItemsProps<FieldArrayWithId<TFieldValues, TArrayName, \"id\">>,\n \"items\" | \"columns\" | \"onAdd\" | \"onRemove\" | \"getKey\"\n > {\n name: TArrayName;\n /** `form.control`. Optional under `<Form {...form}>`. */\n control?: UseFieldArrayProps<TFieldValues, TArrayName, \"id\", TTransformed>[\"control\"];\n /** `useFieldArray`'s `rules` (`minLength`, `validate` …); its message is the list's\n * error. */\n rules?: UseFieldArrayProps<TFieldValues, TArrayName, \"id\", TTransformed>[\"rules\"];\n columns: readonly RhfLineItemsColumn<FieldArrayWithId<TFieldValues, TArrayName, \"id\">, TArrayName>[];\n /** A new row's values. Omitted: no add button. */\n newItem?: () => FieldArray<TFieldValues, TArrayName>;\n /** `false`: no remove buttons. Default `true`. */\n removable?: boolean;\n}\n\n/** The message of an error at `path` in react-hook-form's errors tree: the array's\n * own (`root`, from `rules`) or one a resolver put on the array. */\nfunction arrayError(errors: unknown, path: string): string | undefined {\n let node: unknown = errors;\n for (const key of path.split(\".\")) {\n if (node === null || typeof node !== \"object\") return undefined;\n node = (node as Record<string, unknown>)[key];\n }\n if (node === null || typeof node !== \"object\") return undefined;\n const { root, message } = node as { root?: { message?: unknown }; message?: unknown };\n const text = root?.message ?? message;\n return typeof text === \"string\" && text !== \"\" ? text : undefined;\n}\n\n/** {@link LineItems} bound to a field array. See the module note. */\nexport function RhfLineItems<\n TFieldValues extends FieldValues = FieldValues,\n TArrayName extends FieldArrayPath<TFieldValues> = FieldArrayPath<TFieldValues>,\n TTransformed = TFieldValues,\n>({\n name,\n control,\n rules,\n columns,\n newItem,\n removable = true,\n error,\n ...rest\n}: RhfLineItemsProps<TFieldValues, TArrayName, TTransformed>) {\n const { fields, append, remove } = useFieldArray<TFieldValues, TArrayName, \"id\", TTransformed>({\n control,\n name,\n rules,\n });\n const { errors } = useFormState({ control, name: name as never });\n const bound: LineItemsColumn<FieldArrayWithId<TFieldValues, TArrayName, \"id\">>[] = columns.map(\n ({ render, ...column }) => ({\n ...column,\n render: (ctx) => render({ ...ctx, name: `${name}.${ctx.index}` as `${TArrayName}.${number}` }),\n }),\n );\n return (\n <LineItems\n {...rest}\n items={fields}\n columns={bound}\n getKey={(field) => field.id}\n onAdd={newItem ? () => append(newItem()) : undefined}\n onRemove={removable ? (index) => remove(index) : undefined}\n error={error ?? arrayError(errors, name)}\n />\n );\n}\n"],"mappings":";AA6HI;AA5FJ;AAAA,EACE;AAAA,EACA;AAAA,OAMK;AACP;AAAA,EACE;AAAA,OAIK;AAsCP,SAAS,WAAW,QAAiB,MAAkC;AACrE,MAAI,OAAgB;AACpB,aAAW,OAAO,KAAK,MAAM,GAAG,GAAG;AACjC,QAAI,SAAS,QAAQ,OAAO,SAAS,SAAU,QAAO;AACtD,WAAQ,KAAiC,GAAG;AAAA,EAC9C;AACA,MAAI,SAAS,QAAQ,OAAO,SAAS,SAAU,QAAO;AACtD,QAAM,EAAE,MAAM,QAAQ,IAAI;AAC1B,QAAM,OAAO,MAAM,WAAW;AAC9B,SAAO,OAAO,SAAS,YAAY,SAAS,KAAK,OAAO;AAC1D;AAGO,SAAS,aAId;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,GAAG;AACL,GAA8D;AAC5D,QAAM,EAAE,QAAQ,QAAQ,OAAO,IAAI,cAA4D;AAAA,IAC7F;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,EAAE,OAAO,IAAI,aAAa,EAAE,SAAS,KAAoB,CAAC;AAChE,QAAM,QAA6E,QAAQ;AAAA,IACzF,CAAC,EAAE,QAAQ,GAAG,OAAO,OAAO;AAAA,MAC1B,GAAG;AAAA,MACH,QAAQ,CAAC,QAAQ,OAAO,EAAE,GAAG,KAAK,MAAM,GAAG,IAAI,IAAI,IAAI,KAAK,GAAgC,CAAC;AAAA,IAC/F;AAAA,EACF;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,OAAO;AAAA,MACP,SAAS;AAAA,MACT,QAAQ,CAAC,UAAU,MAAM;AAAA,MACzB,OAAO,UAAU,MAAM,OAAO,QAAQ,CAAC,IAAI;AAAA,MAC3C,UAAU,YAAY,CAAC,UAAU,OAAO,KAAK,IAAI;AAAA,MACjD,OAAO,SAAS,WAAW,QAAQ,IAAI;AAAA;AAAA,EACzC;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/rhf/line-items.tsx"],"sourcesContent":["/**\n * {@link LineItems} over react-hook-form's `useFieldArray`. `@eifi1/ui-kit/rhf`.\n *\n * ```tsx\n * <RhfLineItems\n * name=\"components\"\n * newItem={() => ({ type: \"net_rent\", amount: null, validFrom: \"\" })}\n * minItems={1}\n * columns={[\n * { key: \"type\", header: \"Type\", render: ({ name, label }) => (\n * <RhfSelect name={`${name}.type`} options={TYPES} aria-label={label} />\n * ) },\n * { key: \"amount\", header: \"Amount\", width: \"8rem\", align: \"end\", render: ({ name, label }) => (\n * <RhfMoneyField name={`${name}.amount`} ariaLabel={label} />\n * ) },\n * ]}\n * totals={{ amount: formatMoney(total) }}\n * />\n * ```\n *\n * The rows are the array's `fields` (keyed by their `id`, as react-hook-form asks),\n * Add appends `newItem()`, remove is `remove(index)`, and an error on the array\n * itself — the `rules` here, or a resolver's `lines: \"At least two lines\"` — is the\n * list's `error`. Each cell's `render` gets `name`, the row's path\n * (`\"components.2\"`), to bind its field to.\n *\n * `summary`, `fieldLabels`, `narrowColumns`, `removePlacement` and `removeAlign` pass\n * through to {@link LineItems}. With\n * `fieldLabels=\"floating\"` a cell's `fieldLabel` is the column's name; the bound\n * fields' own `label` is a `FormLabel` ABOVE the control, so for the floating\n * one render the kit field through `RhfField`:\n * `render={({ field, invalid }) => <Input label={fieldLabel} aria-label={label} {...field} invalid={invalid} />}`.\n */\nimport type { ReactNode } from \"react\";\nimport {\n useFieldArray,\n useFormState,\n type FieldArray,\n type FieldArrayPath,\n type FieldArrayWithId,\n type FieldValues,\n type UseFieldArrayProps,\n} from \"react-hook-form\";\nimport {\n LineItems,\n type LineItemCellContext,\n type LineItemsColumn,\n type LineItemsProps,\n} from \"../components/line-items\";\n\n/** A cell's context, with the row's path in the form. */\nexport interface RhfLineItemCellContext<TItem, TArrayName extends string>\n extends LineItemCellContext<TItem> {\n /** The row's path: `${name}.${index}` — bind the cell's field to\n * `` `${name}.amount` ``. */\n name: `${TArrayName}.${number}`;\n}\n\nexport interface RhfLineItemsColumn<TItem, TArrayName extends string>\n extends Omit<LineItemsColumn<TItem>, \"render\"> {\n render: (ctx: RhfLineItemCellContext<TItem, TArrayName>) => ReactNode;\n}\n\nexport interface RhfLineItemsProps<\n TFieldValues extends FieldValues = FieldValues,\n TArrayName extends FieldArrayPath<TFieldValues> = FieldArrayPath<TFieldValues>,\n TTransformed = TFieldValues,\n> extends Omit<\n LineItemsProps<FieldArrayWithId<TFieldValues, TArrayName, \"id\">>,\n \"items\" | \"columns\" | \"onAdd\" | \"onRemove\" | \"getKey\"\n > {\n name: TArrayName;\n /** `form.control`. Optional under `<Form {...form}>`. */\n control?: UseFieldArrayProps<TFieldValues, TArrayName, \"id\", TTransformed>[\"control\"];\n /** `useFieldArray`'s `rules` (`minLength`, `validate` …); its message is the list's\n * error. */\n rules?: UseFieldArrayProps<TFieldValues, TArrayName, \"id\", TTransformed>[\"rules\"];\n columns: readonly RhfLineItemsColumn<FieldArrayWithId<TFieldValues, TArrayName, \"id\">, TArrayName>[];\n /** A new row's values. Omitted: no add button. */\n newItem?: () => FieldArray<TFieldValues, TArrayName>;\n /** `false`: no remove buttons. Default `true`. */\n removable?: boolean;\n}\n\n/** The message of an error at `path` in react-hook-form's errors tree: the array's\n * own (`root`, from `rules`) or one a resolver put on the array. */\nfunction arrayError(errors: unknown, path: string): string | undefined {\n let node: unknown = errors;\n for (const key of path.split(\".\")) {\n if (node === null || typeof node !== \"object\") return undefined;\n node = (node as Record<string, unknown>)[key];\n }\n if (node === null || typeof node !== \"object\") return undefined;\n const { root, message } = node as { root?: { message?: unknown }; message?: unknown };\n const text = root?.message ?? message;\n return typeof text === \"string\" && text !== \"\" ? text : undefined;\n}\n\n/** {@link LineItems} bound to a field array. See the module note. */\nexport function RhfLineItems<\n TFieldValues extends FieldValues = FieldValues,\n TArrayName extends FieldArrayPath<TFieldValues> = FieldArrayPath<TFieldValues>,\n TTransformed = TFieldValues,\n>({\n name,\n control,\n rules,\n columns,\n newItem,\n removable = true,\n error,\n ...rest\n}: RhfLineItemsProps<TFieldValues, TArrayName, TTransformed>) {\n const { fields, append, remove } = useFieldArray<TFieldValues, TArrayName, \"id\", TTransformed>({\n control,\n name,\n rules,\n });\n const { errors } = useFormState({ control, name: name as never });\n const bound: LineItemsColumn<FieldArrayWithId<TFieldValues, TArrayName, \"id\">>[] = columns.map(\n ({ render, ...column }) => ({\n ...column,\n render: (ctx) => render({ ...ctx, name: `${name}.${ctx.index}` as `${TArrayName}.${number}` }),\n }),\n );\n return (\n <LineItems\n {...rest}\n items={fields}\n columns={bound}\n getKey={(field) => field.id}\n onAdd={newItem ? () => append(newItem()) : undefined}\n onRemove={removable ? (index) => remove(index) : undefined}\n error={error ?? arrayError(errors, name)}\n />\n );\n}\n"],"mappings":";AA8HI;AA5FJ;AAAA,EACE;AAAA,EACA;AAAA,OAMK;AACP;AAAA,EACE;AAAA,OAIK;AAsCP,SAAS,WAAW,QAAiB,MAAkC;AACrE,MAAI,OAAgB;AACpB,aAAW,OAAO,KAAK,MAAM,GAAG,GAAG;AACjC,QAAI,SAAS,QAAQ,OAAO,SAAS,SAAU,QAAO;AACtD,WAAQ,KAAiC,GAAG;AAAA,EAC9C;AACA,MAAI,SAAS,QAAQ,OAAO,SAAS,SAAU,QAAO;AACtD,QAAM,EAAE,MAAM,QAAQ,IAAI;AAC1B,QAAM,OAAO,MAAM,WAAW;AAC9B,SAAO,OAAO,SAAS,YAAY,SAAS,KAAK,OAAO;AAC1D;AAGO,SAAS,aAId;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,GAAG;AACL,GAA8D;AAC5D,QAAM,EAAE,QAAQ,QAAQ,OAAO,IAAI,cAA4D;AAAA,IAC7F;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,EAAE,OAAO,IAAI,aAAa,EAAE,SAAS,KAAoB,CAAC;AAChE,QAAM,QAA6E,QAAQ;AAAA,IACzF,CAAC,EAAE,QAAQ,GAAG,OAAO,OAAO;AAAA,MAC1B,GAAG;AAAA,MACH,QAAQ,CAAC,QAAQ,OAAO,EAAE,GAAG,KAAK,MAAM,GAAG,IAAI,IAAI,IAAI,KAAK,GAAgC,CAAC;AAAA,IAC/F;AAAA,EACF;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,OAAO;AAAA,MACP,SAAS;AAAA,MACT,QAAQ,CAAC,UAAU,MAAM;AAAA,MACzB,OAAO,UAAU,MAAM,OAAO,QAAQ,CAAC,IAAI;AAAA,MAC3C,UAAU,YAAY,CAAC,UAAU,OAAO,KAAK,IAAI;AAAA,MACjD,OAAO,SAAS,WAAW,QAAQ,IAAI;AAAA;AAAA,EACzC;AAEJ;","names":[]}
package/dist/rhf.d.ts CHANGED
@@ -4,7 +4,7 @@ export { RhfCheckbox, RhfCheckboxProps, RhfCombobox, RhfComboboxProps, RhfDateFi
4
4
  export { RhfLineItemCellContext, RhfLineItems, RhfLineItemsColumn, RhfLineItemsProps } from './rhf/line-items.js';
5
5
  import 'react';
6
6
  import 'react-hook-form';
7
- import './kit-labels-DE--LmCk.js';
7
+ import './kit-labels-C4uB_zmg.js';
8
8
  import './components/data-table-labels.js';
9
9
  import './components/mini-calendar.js';
10
10
  import './components/calendar-heatmap.js';