@undevy-org/tablewright 0.4.0 → 0.5.1

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 (27) hide show
  1. package/dist/es/components/data-table/AppliedStateChips.js +15 -6
  2. package/dist/es/components/data-table/ColumnFilterPopover.js +42 -29
  3. package/dist/es/components/data-table/CompoundFilterPopover.js +38 -22
  4. package/dist/es/components/data-table/DrawerShell.js +2 -0
  5. package/dist/es/components/data-table/FilterFormPanel.js +36 -18
  6. package/dist/es/components/data-table/FilterPopoverFooter.js +12 -4
  7. package/dist/es/components/data-table/TableLayout.js +10 -1
  8. package/dist/es/components/layout/Sidebar.js +8 -1
  9. package/dist/es/components/layout/SidebarAccountMenu.js +3 -2
  10. package/dist/es/components/layout/SidebarUser.js +2 -1
  11. package/dist/es/lib/collapsed-nav-link-a11y.js +6 -0
  12. package/dist/es/lib/decorative-avatar-alt.js +6 -0
  13. package/dist/es/lib/scroll-region-tab-index.js +4 -0
  14. package/dist/styles.css +3 -0
  15. package/dist/tablewright.cjs +175 -89
  16. package/dist/tablewright.css +3 -0
  17. package/dist/types/components/data-table/AppliedStateChips.d.ts +13 -1
  18. package/dist/types/components/data-table/ColumnFilterPopover.d.ts +22 -1
  19. package/dist/types/components/data-table/CompoundFilterPopover.d.ts +19 -1
  20. package/dist/types/components/data-table/FilterFormPanel.d.ts +17 -1
  21. package/dist/types/components/data-table/FilterPopoverFooter.d.ts +8 -1
  22. package/dist/types/components/layout/Sidebar.d.ts +1 -0
  23. package/dist/types/index.d.ts +5 -1
  24. package/dist/types/lib/collapsed-nav-link-a11y.d.ts +2 -0
  25. package/dist/types/lib/decorative-avatar-alt.d.ts +2 -0
  26. package/dist/types/lib/scroll-region-tab-index.d.ts +2 -0
  27. package/package.json +7 -2
@@ -428,6 +428,9 @@
428
428
  .h-9 {
429
429
  height: 2.25rem
430
430
  }
431
+ .h-96 {
432
+ height: 24rem
433
+ }
431
434
  .h-\[18px\] {
432
435
  height: 18px
433
436
  }
@@ -1,4 +1,12 @@
1
1
  import type { ActiveFilter, ActiveFilterValue, ColumnFilterConfig, FilterStatsSlice } from "./filter-types.js";
2
+ import { type ColumnFilterPopoverLabels } from "./ColumnFilterPopover.js";
3
+ import { type CompoundFilterPopoverLabels } from "./CompoundFilterPopover.js";
4
+ import type { FilterPopoverFooterLabels } from "./FilterPopoverFooter.js";
5
+ export interface AppliedStateChipsLabels {
6
+ clearAll: string;
7
+ columns: string;
8
+ hiddenCount: (n: number) => string;
9
+ }
2
10
  interface AppliedStateChipsProps {
3
11
  filters: ActiveFilter[];
4
12
  configs: Record<string, ColumnFilterConfig>;
@@ -23,6 +31,10 @@ interface AppliedStateChipsProps {
23
31
  columnFilterStats?: Record<string, FilterStatsSlice>;
24
32
  requestOpenFilterId?: string | null;
25
33
  onRequestOpenHandled?: () => void;
34
+ labels?: Partial<AppliedStateChipsLabels>;
35
+ columnFilterLabels?: Partial<ColumnFilterPopoverLabels>;
36
+ compoundFilterLabels?: Partial<CompoundFilterPopoverLabels>;
37
+ filterPopoverFooterLabels?: Partial<FilterPopoverFooterLabels>;
26
38
  }
27
- export declare function AppliedStateChips({ filters, configs, newestColumnId, onRemoveFilter, onChangeFilter, currentSort, columnLabels, onRemoveSort, hiddenColumnsCount, onResetColumns, onOpenColumnsMenu, customFilterChip, onRemoveCustomFilter, onClearAll, columnFilterStats, requestOpenFilterId, onRequestOpenHandled, }: AppliedStateChipsProps): import("react").JSX.Element | null;
39
+ export declare function AppliedStateChips({ filters, configs, newestColumnId, onRemoveFilter, onChangeFilter, currentSort, columnLabels, onRemoveSort, hiddenColumnsCount, onResetColumns, onOpenColumnsMenu, customFilterChip, onRemoveCustomFilter, onClearAll, columnFilterStats, requestOpenFilterId, onRequestOpenHandled, labels: labelOverrides, columnFilterLabels, compoundFilterLabels, filterPopoverFooterLabels, }: AppliedStateChipsProps): import("react").JSX.Element | null;
28
40
  export {};
@@ -1,4 +1,23 @@
1
+ import { type FilterPopoverFooterLabels } from "./FilterPopoverFooter.js";
1
2
  import type { ActiveFilter, ColumnFilterConfig, ActiveFilterValue, FilterStatsSlice } from "./filter-types.js";
3
+ export interface ColumnFilterPopoverLabels {
4
+ searchPlaceholder: string;
5
+ addValuePlaceholder: string;
6
+ noData: string;
7
+ statsAllPrefix: string;
8
+ statsFilteredPrefix: string;
9
+ statsTextAllPrefix: string;
10
+ statsTextFilteredPrefix: string;
11
+ chipFrom: string;
12
+ chipTo: string;
13
+ chipMin: string;
14
+ chipMax: string;
15
+ contains: string;
16
+ orBadge: string;
17
+ numberInputPlaceholder: string;
18
+ valuesCount: (n: number) => string;
19
+ selectedCount: (n: number) => string;
20
+ }
2
21
  interface ColumnFilterPopoverProps {
3
22
  config: ColumnFilterConfig;
4
23
  filter: ActiveFilter;
@@ -9,6 +28,8 @@ interface ColumnFilterPopoverProps {
9
28
  stats?: FilterStatsSlice;
10
29
  requestOpen?: boolean;
11
30
  onRequestOpenHandled?: () => void;
31
+ labels?: Partial<ColumnFilterPopoverLabels>;
32
+ footerLabels?: Partial<FilterPopoverFooterLabels>;
12
33
  }
13
- export declare function ColumnFilterPopover({ config, filter, onChange, onRemove, initialOpen, chipClassName, stats, requestOpen, onRequestOpenHandled, }: ColumnFilterPopoverProps): import("react").JSX.Element;
34
+ export declare function ColumnFilterPopover({ config, filter, onChange, onRemove, initialOpen, chipClassName, stats, requestOpen, onRequestOpenHandled, labels: labelOverrides, footerLabels, }: ColumnFilterPopoverProps): import("react").JSX.Element;
14
35
  export {};
@@ -1,4 +1,20 @@
1
+ import { type FilterPopoverFooterLabels } from "./FilterPopoverFooter.js";
1
2
  import type { ActiveFilter, ActiveFilterValue, ColumnFilterConfig, FilterStatsSlice } from "./filter-types.js";
3
+ export interface CompoundFilterPopoverLabels {
4
+ searchPlaceholder: string;
5
+ addPlaceholder: string;
6
+ contains: string;
7
+ orBadge: string;
8
+ chipMin: string;
9
+ chipMax: string;
10
+ statsAllPrefix: string;
11
+ statsFilteredPrefix: string;
12
+ numberInputPlaceholder: string;
13
+ resetSectionTitle: (subLabel: string) => string;
14
+ filtersCount: (n: number) => string;
15
+ subValuesCount: (n: number) => string;
16
+ subSelectedCount: (n: number) => string;
17
+ }
2
18
  interface CompoundFilterPopoverProps {
3
19
  config: ColumnFilterConfig;
4
20
  filter: ActiveFilter;
@@ -9,6 +25,8 @@ interface CompoundFilterPopoverProps {
9
25
  columnFilterStats?: Record<string, FilterStatsSlice>;
10
26
  requestOpen?: boolean;
11
27
  onRequestOpenHandled?: () => void;
28
+ labels?: Partial<CompoundFilterPopoverLabels>;
29
+ footerLabels?: Partial<FilterPopoverFooterLabels>;
12
30
  }
13
- export declare function CompoundFilterPopover({ config, filter, onChange, onRemove, initialOpen, chipClassName, columnFilterStats, requestOpen, onRequestOpenHandled, }: CompoundFilterPopoverProps): import("react").JSX.Element;
31
+ export declare function CompoundFilterPopover({ config, filter, onChange, onRemove, initialOpen, chipClassName, columnFilterStats, requestOpen, onRequestOpenHandled, labels: labelOverrides, footerLabels, }: CompoundFilterPopoverProps): import("react").JSX.Element;
14
32
  export {};
@@ -1,5 +1,20 @@
1
1
  import type { ActiveFilter, ColumnFilterConfig } from "./filter-types.js";
2
2
  import { type ManagedFilterChange } from "./managed-filters.js";
3
+ export interface FilterFormPanelLabels {
4
+ closeFiltersAriaLabel: string;
5
+ closeFiltersTitle: string;
6
+ apply: string;
7
+ clear: string;
8
+ anyPlaceholder: string;
9
+ rangeFromPlaceholder: string;
10
+ rangeToPlaceholder: string;
11
+ fieldRangeFromAriaLabel: (fieldLabel: string) => string;
12
+ fieldRangeToAriaLabel: (fieldLabel: string) => string;
13
+ compoundSubRangeFromAriaLabel: (subLabel: string) => string;
14
+ compoundSubRangeToAriaLabel: (subLabel: string) => string;
15
+ compoundSubRangeFromPlaceholder: (subLabel: string) => string;
16
+ compoundSubRangeToPlaceholder: (subLabel: string) => string;
17
+ }
3
18
  export interface FilterFormPanelProps {
4
19
  /** All known filter configs (same shape used by GroupedFilterAdd). */
5
20
  filterConfigs: Record<string, ColumnFilterConfig>;
@@ -30,5 +45,6 @@ export interface FilterFormPanelProps {
30
45
  * is done by leaving the id out of `fields`; this is only for sub-fields.
31
46
  */
32
47
  hiddenSubFilterKeys?: readonly string[];
48
+ labels?: Partial<FilterFormPanelLabels>;
33
49
  }
34
- export declare function FilterFormPanel({ filterConfigs, fields, filters, onApply, onClear, title, className, id, onClose, hiddenSubFilterKeys, }: FilterFormPanelProps): import("react").JSX.Element;
50
+ export declare function FilterFormPanel({ filterConfigs, fields, filters, onApply, onClear, title, className, id, onClose, hiddenSubFilterKeys, labels: labelOverrides, }: FilterFormPanelProps): import("react").JSX.Element;
@@ -1,9 +1,16 @@
1
+ export interface FilterPopoverFooterLabels {
2
+ apply: string;
3
+ clear: string;
4
+ }
1
5
  interface FilterPopoverFooterProps {
2
6
  onApply: () => void;
3
7
  onClear?: () => void;
8
+ labels?: Partial<FilterPopoverFooterLabels>;
9
+ /** @deprecated Use `labels.apply` */
4
10
  applyLabel?: string;
11
+ /** @deprecated Use `labels.clear` */
5
12
  clearLabel?: string;
6
13
  className?: string;
7
14
  }
8
- export declare function FilterPopoverFooter({ onApply, onClear, applyLabel, clearLabel, className, }: FilterPopoverFooterProps): import("react").JSX.Element;
15
+ export declare function FilterPopoverFooter({ onApply, onClear, labels: labelOverrides, applyLabel, clearLabel, className, }: FilterPopoverFooterProps): import("react").JSX.Element;
9
16
  export {};
@@ -8,6 +8,7 @@ export interface SidebarProps {
8
8
  renderLink?: (href: string, props: {
9
9
  className: string;
10
10
  children: React.ReactNode;
11
+ "aria-label"?: string;
11
12
  }) => React.ReactNode;
12
13
  header?: React.ReactNode;
13
14
  footer?: React.ReactNode;
@@ -37,6 +37,7 @@ export type { FilterChipProps } from "./components/data-table/FilterChip.js";
37
37
  export { ViewChip } from "./components/data-table/ViewChip.js";
38
38
  export type { ViewChipProps } from "./components/data-table/ViewChip.js";
39
39
  export { FilterPopoverFooter } from "./components/data-table/FilterPopoverFooter.js";
40
+ export type { FilterPopoverFooterLabels } from "./components/data-table/FilterPopoverFooter.js";
40
41
  export * as FilterToolbar from "./components/data-table/FilterToolbar.js";
41
42
  export { RowActionsMenu } from "./components/data-table/RowActionsMenu.js";
42
43
  export { RowControlCell } from "./components/data-table/RowControlCell.js";
@@ -81,10 +82,13 @@ export type { TwoPanelMenuItem, TwoPanelMenuGroup } from "./components/data-tabl
81
82
  export { FlatColumnToggle } from "./components/data-table/FlatColumnToggle.js";
82
83
  export { GroupedColumnToggle } from "./components/data-table/GroupedColumnToggle.js";
83
84
  export { ColumnFilterPopover } from "./components/data-table/ColumnFilterPopover.js";
85
+ export type { ColumnFilterPopoverLabels } from "./components/data-table/ColumnFilterPopover.js";
84
86
  export { CompoundFilterPopover } from "./components/data-table/CompoundFilterPopover.js";
87
+ export type { CompoundFilterPopoverLabels } from "./components/data-table/CompoundFilterPopover.js";
85
88
  export { AppliedStateChips } from "./components/data-table/AppliedStateChips.js";
89
+ export type { AppliedStateChipsLabels } from "./components/data-table/AppliedStateChips.js";
86
90
  export { FilterFormPanel } from "./components/data-table/FilterFormPanel.js";
87
- export type { FilterFormPanelProps } from "./components/data-table/FilterFormPanel.js";
91
+ export type { FilterFormPanelProps, FilterFormPanelLabels } from "./components/data-table/FilterFormPanel.js";
88
92
  export { FilterFormToggle, useFilterFormOpen } from "./components/data-table/FilterFormToggle.js";
89
93
  export type { FilterFormToggleProps } from "./components/data-table/FilterFormToggle.js";
90
94
  export { applyManagedChanges, clearManagedFilters, hasActiveManagedFilters, } from "./components/data-table/managed-filters.js";
@@ -0,0 +1,2 @@
1
+ /** Accessible name for icon-only nav links when the sidebar rail is collapsed. */
2
+ export declare function collapsedNavLinkAriaLabel(showExpanded: boolean, label: string): string | undefined;
@@ -0,0 +1,2 @@
1
+ /** Avatar alt when the same name is shown as visible text beside the image. */
2
+ export declare function decorativeAvatarAlt(adjacentNameVisible: boolean, name: string): string;
@@ -0,0 +1,2 @@
1
+ /** Makes overflow scroll regions reachable from the keyboard (WCAG 2.1.1). */
2
+ export declare const SCROLL_REGION_TAB_INDEX = 0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@undevy-org/tablewright",
3
- "version": "0.4.0",
3
+ "version": "0.5.1",
4
4
  "description": "React data-table and application-shell components: filters, drawers, row controls, sortable and resizable columns, built on Radix UI and TanStack Table.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -78,6 +78,8 @@
78
78
  "@storybook/addon-themes": "^10.5.8",
79
79
  "@storybook/react-vite": "^10.5.8",
80
80
  "@tanstack/react-table": "^8.21.3",
81
+ "@testing-library/dom": "^10.4.2",
82
+ "@testing-library/react": "^16.3.3",
81
83
  "@types/node": "^24.10.1",
82
84
  "@types/react": "^19.2.7",
83
85
  "@types/react-dom": "^19.2.3",
@@ -88,6 +90,7 @@
88
90
  "eslint-plugin-react-refresh": "^0.4.24",
89
91
  "eslint-plugin-storybook": "^10.5.8",
90
92
  "globals": "^16.5.0",
93
+ "happy-dom": "^20.14.5",
91
94
  "postcss": "^8.5.8",
92
95
  "react": "^19.2.0",
93
96
  "react-dom": "^19.2.0",
@@ -95,7 +98,8 @@
95
98
  "tailwindcss": "^3.4.18",
96
99
  "typescript": "~5.9.3",
97
100
  "typescript-eslint": "^8.48.0",
98
- "vite": "^7.3.1"
101
+ "vite": "^7.3.1",
102
+ "vitest": "^5.0.3"
99
103
  },
100
104
  "scripts": {
101
105
  "build": "node scripts/build.mjs",
@@ -105,6 +109,7 @@
105
109
  "check:render": "node scripts/render-check/run.mjs",
106
110
  "lint": "eslint src .storybook --max-warnings=0",
107
111
  "typecheck": "tsc --project tsconfig.json --noEmit",
112
+ "test": "vitest run",
108
113
  "storybook": "storybook dev -p 6006",
109
114
  "build-storybook": "storybook build",
110
115
  "changeset": "changeset",