@wheelhouse/ui 0.2.3 → 0.2.5

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 (118) hide show
  1. package/dist/blocks/columns/columns-types.d.ts +25 -1
  2. package/dist/blocks/columns/columns-types.d.ts.map +1 -1
  3. package/dist/blocks/columns/columns-types.js +4 -0
  4. package/dist/blocks/columns/columns-utils.d.ts +31 -1
  5. package/dist/blocks/columns/columns-utils.d.ts.map +1 -1
  6. package/dist/blocks/columns/columns-utils.js +86 -1
  7. package/dist/blocks/columns/columns.d.ts +1 -1
  8. package/dist/blocks/columns/columns.d.ts.map +1 -1
  9. package/dist/blocks/columns/columns.js +81 -20
  10. package/dist/blocks/columns/columns.stories.d.ts +1 -0
  11. package/dist/blocks/columns/columns.stories.d.ts.map +1 -1
  12. package/dist/blocks/columns/columns.stories.js +21 -1
  13. package/dist/blocks/columns/index.d.ts +1 -1
  14. package/dist/blocks/columns/index.d.ts.map +1 -1
  15. package/dist/blocks/floating-menu-widget/floating-menu-widget.d.ts +26 -0
  16. package/dist/blocks/floating-menu-widget/floating-menu-widget.d.ts.map +1 -0
  17. package/dist/blocks/floating-menu-widget/floating-menu-widget.js +200 -0
  18. package/dist/blocks/floating-menu-widget/floating-menu-widget.stories.d.ts +15 -0
  19. package/dist/blocks/floating-menu-widget/floating-menu-widget.stories.d.ts.map +1 -0
  20. package/dist/blocks/floating-menu-widget/floating-menu-widget.stories.js +22 -0
  21. package/dist/blocks/floating-menu-widget/index.d.ts +3 -0
  22. package/dist/blocks/floating-menu-widget/index.d.ts.map +1 -0
  23. package/dist/blocks/floating-menu-widget/index.js +1 -0
  24. package/dist/blocks/index.d.ts +1 -0
  25. package/dist/blocks/index.d.ts.map +1 -1
  26. package/dist/blocks/index.js +1 -0
  27. package/dist/components/button/button.d.ts +18 -11
  28. package/dist/components/button/button.d.ts.map +1 -1
  29. package/dist/components/button/button.js +27 -14
  30. package/dist/components/button/button.stories.d.ts +11 -0
  31. package/dist/components/button/button.stories.d.ts.map +1 -1
  32. package/dist/components/button/button.stories.js +84 -0
  33. package/dist/components/data-grid/data-grid-column-filter.d.ts +15 -0
  34. package/dist/components/data-grid/data-grid-column-filter.d.ts.map +1 -0
  35. package/dist/components/data-grid/data-grid-column-filter.js +36 -0
  36. package/dist/components/data-grid/data-grid-column-header.d.ts +15 -0
  37. package/dist/components/data-grid/data-grid-column-header.d.ts.map +1 -0
  38. package/dist/components/data-grid/data-grid-column-header.js +137 -0
  39. package/dist/components/data-grid/data-grid-column-visibility.d.ts +8 -0
  40. package/dist/components/data-grid/data-grid-column-visibility.d.ts.map +1 -0
  41. package/dist/components/data-grid/data-grid-column-visibility.js +13 -0
  42. package/dist/components/data-grid/data-grid-pagination.d.ts +20 -0
  43. package/dist/components/data-grid/data-grid-pagination.d.ts.map +1 -0
  44. package/dist/components/data-grid/data-grid-pagination.js +76 -0
  45. package/dist/components/data-grid/data-grid-scroll-area.d.ts +11 -0
  46. package/dist/components/data-grid/data-grid-scroll-area.d.ts.map +1 -0
  47. package/dist/components/data-grid/data-grid-scroll-area.js +218 -0
  48. package/dist/components/data-grid/data-grid-table-dnd-rows.d.ts +12 -0
  49. package/dist/components/data-grid/data-grid-table-dnd-rows.d.ts.map +1 -0
  50. package/dist/components/data-grid/data-grid-table-dnd-rows.js +91 -0
  51. package/dist/components/data-grid/data-grid-table-dnd.d.ts +8 -0
  52. package/dist/components/data-grid/data-grid-table-dnd.d.ts.map +1 -0
  53. package/dist/components/data-grid/data-grid-table-dnd.js +95 -0
  54. package/dist/components/data-grid/data-grid-table-virtual.d.ts +28 -0
  55. package/dist/components/data-grid/data-grid-table-virtual.d.ts.map +1 -0
  56. package/dist/components/data-grid/data-grid-table-virtual.js +133 -0
  57. package/dist/components/data-grid/data-grid-table.d.ts +98 -0
  58. package/dist/components/data-grid/data-grid-table.d.ts.map +1 -0
  59. package/dist/components/data-grid/data-grid-table.js +560 -0
  60. package/dist/components/data-grid/data-grid.d.ts +94 -0
  61. package/dist/components/data-grid/data-grid.d.ts.map +1 -0
  62. package/dist/components/data-grid/data-grid.js +123 -0
  63. package/dist/components/data-grid/data-grid.stories.d.ts +14 -0
  64. package/dist/components/data-grid/data-grid.stories.d.ts.map +1 -0
  65. package/dist/components/data-grid/data-grid.stories.js +47 -0
  66. package/dist/components/data-grid/index.d.ts +14 -0
  67. package/dist/components/data-grid/index.d.ts.map +1 -0
  68. package/dist/components/data-grid/index.js +10 -0
  69. package/dist/components/filters/filter-date-metric-value.d.ts.map +1 -1
  70. package/dist/components/filters/filter-date-metric-value.js +83 -8
  71. package/dist/components/filters/filter-fields-listing-demo.d.ts +12 -0
  72. package/dist/components/filters/filter-fields-listing-demo.d.ts.map +1 -0
  73. package/dist/components/filters/filter-fields-listing-demo.js +565 -0
  74. package/dist/components/filters/filters-types.d.ts +7 -0
  75. package/dist/components/filters/filters-types.d.ts.map +1 -1
  76. package/dist/components/filters/filters.stories.d.ts.map +1 -1
  77. package/dist/components/filters/filters.stories.js +8 -149
  78. package/dist/components/filters/index.d.ts +1 -0
  79. package/dist/components/filters/index.d.ts.map +1 -1
  80. package/dist/components/filters/index.js +1 -0
  81. package/dist/components/index.d.ts +3 -0
  82. package/dist/components/index.d.ts.map +1 -1
  83. package/dist/components/index.js +3 -0
  84. package/dist/components/popover/index.d.ts +1 -0
  85. package/dist/components/popover/index.d.ts.map +1 -1
  86. package/dist/components/popover/index.js +1 -0
  87. package/dist/components/popover/popover-handle.d.ts +6 -0
  88. package/dist/components/popover/popover-handle.d.ts.map +1 -0
  89. package/dist/components/popover/popover-handle.js +6 -0
  90. package/dist/components/popover/popover.d.ts +41 -7
  91. package/dist/components/popover/popover.d.ts.map +1 -1
  92. package/dist/components/popover/popover.js +50 -3
  93. package/dist/components/progress/progress.js +1 -1
  94. package/dist/components/progress/progress.stories.d.ts +11 -2
  95. package/dist/components/progress/progress.stories.d.ts.map +1 -1
  96. package/dist/components/progress/progress.stories.js +77 -4
  97. package/dist/components/sidebar/index.d.ts +2 -0
  98. package/dist/components/sidebar/index.d.ts.map +1 -0
  99. package/dist/components/sidebar/index.js +1 -0
  100. package/dist/components/sidebar/sidebar.d.ts +64 -0
  101. package/dist/components/sidebar/sidebar.d.ts.map +1 -0
  102. package/dist/components/sidebar/sidebar.js +255 -0
  103. package/dist/components/sidebar/sidebar.stories.d.ts +20 -0
  104. package/dist/components/sidebar/sidebar.stories.d.ts.map +1 -0
  105. package/dist/components/sidebar/sidebar.stories.js +181 -0
  106. package/dist/components/skeleton/index.d.ts +3 -0
  107. package/dist/components/skeleton/index.d.ts.map +1 -0
  108. package/dist/components/skeleton/index.js +1 -0
  109. package/dist/components/skeleton/skeleton.d.ts +7 -0
  110. package/dist/components/skeleton/skeleton.d.ts.map +1 -0
  111. package/dist/components/skeleton/skeleton.js +8 -0
  112. package/dist/components/sortable/sortable.d.ts +4 -2
  113. package/dist/components/sortable/sortable.d.ts.map +1 -1
  114. package/dist/components/sortable/sortable.js +4 -2
  115. package/dist/tsconfig.tsbuildinfo +1 -1
  116. package/llms.txt +1 -1
  117. package/package.json +7 -4
  118. package/src/styles/globals.css +26 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-grid.d.ts","sourceRoot":"","sources":["../../../src/components/data-grid/data-grid.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,SAAS,EAAuB,MAAM,OAAO,CAAC;AAC3E,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,kBAAkB,EAAE,KAAK,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAI1H,OAAO,QAAQ,uBAAuB,CAAC;IAEnC,UAAU,UAAU,CAAC,KAAK,SAAS,OAAO,EAAE,MAAM;QAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,SAAS,CAAC;QACrB,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,SAAS,CAAC;KAC/C;CACJ;AAED,4GAA4G;AAC5G,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,MAAM,CAMzF;AAED,MAAM,MAAM,sBAAsB,GAAG;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI;IACjC,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KAChB,CAAC;CACL,CAAC;AAEF,MAAM,WAAW,oBAAoB,CAAC,KAAK,SAAS,MAAM;IACtD,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,MAAM,qBAAqB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,aAAa,CAAC,EAAE,kBAAkB,CAAC;CACtC,CAAC;AAEF,MAAM,WAAW,aAAa,CAAC,KAAK,SAAS,MAAM;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACrC,cAAc,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IACpC,mBAAmB,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IACzC,oBAAoB,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC1C,YAAY,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAClC,WAAW,CAAC,EAAE;QACV,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QACzB,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,iBAAiB,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;QACzC,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAC3B,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,YAAY,CAAC,EAAE,OAAO,CAAC;KAC1B,CAAC;IACF,eAAe,CAAC,EAAE;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACL;AAOD,iBAAS,WAAW,8BAMnB;AAED,iBAAS,gBAAgB,CAAC,KAAK,SAAS,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;CAAE,2CAiD5H;AAED,iBAAS,QAAQ,CAAC,KAAK,SAAS,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,CAAC,KAAK,CAAC,2CAyD1F;AAED,iBAAS,iBAAiB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAa,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,2CAM/H;AAED,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,123 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { createContext, useContext, useMemo } from 'react';
4
+ import {} from '@tanstack/react-table';
5
+ import { cn } from '../../lib/utils';
6
+ /** Label for headers / column visibility: `meta.headerTitle`, string `columnDef.header`, or `column.id`. */
7
+ export function getColumnHeaderLabel(column) {
8
+ const meta = column.columnDef.meta;
9
+ if (typeof meta?.headerTitle === 'string')
10
+ return meta.headerTitle;
11
+ const defHeader = column.columnDef.header;
12
+ if (typeof defHeader === 'string')
13
+ return defHeader;
14
+ return String(column.id);
15
+ }
16
+ const DataGridContext = createContext(undefined);
17
+ function useDataGrid() {
18
+ const context = useContext(DataGridContext);
19
+ if (!context) {
20
+ throw new Error('useDataGrid must be used within a DataGridProvider');
21
+ }
22
+ return context;
23
+ }
24
+ function DataGridProvider({ children, table, ...props }) {
25
+ const tableState = table.getState();
26
+ const resolvedColumnsResizeMode = props.tableLayout?.columnsResizeMode ?? 'onEnd';
27
+ // Keep resize mode aligned with the DataGrid contract every render so
28
+ // consumer-level useReactTable options cannot flip it back between drags.
29
+ if (props.tableLayout?.columnsResizable) {
30
+ table.options.columnResizeMode = resolvedColumnsResizeMode;
31
+ }
32
+ // Memoize context value so consumers don't re-render during column resize.
33
+ // Column sizing state is intentionally excluded from deps -- CSS variables
34
+ // on the <table> element handle width updates without React re-renders.
35
+ const value = useMemo(() => ({
36
+ props,
37
+ table,
38
+ recordCount: props.recordCount,
39
+ isLoading: props.isLoading || false,
40
+ }),
41
+ // eslint-disable-next-line react-hooks/exhaustive-deps
42
+ [
43
+ table,
44
+ props.recordCount,
45
+ props.isLoading,
46
+ props.loadingMode,
47
+ props.loadingMessage,
48
+ props.fetchingMoreMessage,
49
+ props.allRowsLoadedMessage,
50
+ props.emptyMessage,
51
+ props.onRowClick,
52
+ props.className,
53
+ // eslint-disable-next-line react-hooks/exhaustive-deps
54
+ JSON.stringify(props.tableLayout),
55
+ // eslint-disable-next-line react-hooks/exhaustive-deps
56
+ JSON.stringify(props.tableClassNames),
57
+ tableState.sorting,
58
+ tableState.pagination,
59
+ tableState.columnFilters,
60
+ tableState.rowSelection,
61
+ tableState.expanded,
62
+ tableState.columnVisibility,
63
+ tableState.columnOrder,
64
+ tableState.columnPinning,
65
+ tableState.globalFilter,
66
+ ]);
67
+ return _jsx(DataGridContext.Provider, { value: value, children: children });
68
+ }
69
+ function DataGrid({ children, table, ...props }) {
70
+ const defaultProps = {
71
+ loadingMode: 'skeleton',
72
+ tableLayout: {
73
+ dense: false,
74
+ cellBorder: false,
75
+ rowBorder: true,
76
+ rowRounded: false,
77
+ stripped: false,
78
+ headerSticky: false,
79
+ headerBackground: true,
80
+ headerBorder: true,
81
+ width: 'fixed',
82
+ columnsVisibility: false,
83
+ columnsResizable: false,
84
+ columnsResizeMode: 'onEnd',
85
+ columnsPinnable: false,
86
+ columnsMovable: false,
87
+ columnsDraggable: false,
88
+ rowsDraggable: false,
89
+ rowsPinnable: false,
90
+ },
91
+ tableClassNames: {
92
+ base: '',
93
+ header: '',
94
+ headerRow: '',
95
+ headerSticky: 'sticky top-0 z-15 bg-background/90 backdrop-blur-xs',
96
+ body: '',
97
+ bodyRow: '',
98
+ footer: '',
99
+ edgeCell: '',
100
+ },
101
+ };
102
+ const mergedProps = {
103
+ ...defaultProps,
104
+ ...props,
105
+ tableLayout: {
106
+ ...defaultProps.tableLayout,
107
+ ...(props.tableLayout || {}),
108
+ },
109
+ tableClassNames: {
110
+ ...defaultProps.tableClassNames,
111
+ ...(props.tableClassNames || {}),
112
+ },
113
+ };
114
+ // Ensure table is provided
115
+ if (!table) {
116
+ throw new Error('DataGrid requires a "table" prop');
117
+ }
118
+ return (_jsx(DataGridProvider, { table: table, ...mergedProps, children: children }));
119
+ }
120
+ function DataGridContainer({ children, className, border = true }) {
121
+ return (_jsx("div", { "data-slot": "data-grid", className: cn('w-full overflow-hidden', border && 'rounded-lg border border-border', className), children: children }));
122
+ }
123
+ export { useDataGrid, DataGridProvider, DataGrid, DataGridContainer };
@@ -0,0 +1,14 @@
1
+ import type { StoryObj } from '@storybook/react';
2
+ declare const meta: {
3
+ title: string;
4
+ tags: string[];
5
+ parameters: {
6
+ layout: string;
7
+ };
8
+ };
9
+ export default meta;
10
+ type Story = StoryObj<typeof meta>;
11
+ export declare const Default: Story;
12
+ export declare const Striped: Story;
13
+ export declare const Empty: Story;
14
+ //# sourceMappingURL=data-grid.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-grid.stories.d.ts","sourceRoot":"","sources":["../../../src/components/data-grid/data-grid.stories.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAWvD,QAAA,MAAM,IAAI;;;;;;CAMM,CAAC;AAEjB,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA6CnC,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAEnB,CAAC"}
@@ -0,0 +1,47 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useMemo } from 'react';
4
+ import { createColumnHelper, getCoreRowModel, useReactTable } from '@tanstack/react-table';
5
+ import { DataGrid, DataGridContainer, DataGridScrollArea, DataGridTable } from '.';
6
+ const columnHelper = createColumnHelper();
7
+ const meta = {
8
+ title: 'Components/Data grid',
9
+ tags: ['autodocs'],
10
+ parameters: {
11
+ layout: 'padded',
12
+ },
13
+ };
14
+ export default meta;
15
+ function DataGridStoryHost({ rowCount = 6, ...dataGridProps }) {
16
+ const data = useMemo(() => Array.from({ length: rowCount }, (_, i) => ({
17
+ id: String(i + 1),
18
+ name: `Person ${i + 1}`,
19
+ role: i % 2 === 0 ? 'Admin' : 'Editor',
20
+ })), [rowCount]);
21
+ const columns = useMemo(() => [
22
+ columnHelper.accessor('name', {
23
+ header: 'Name',
24
+ cell: (info) => info.getValue(),
25
+ }),
26
+ columnHelper.accessor('role', {
27
+ header: 'Role',
28
+ meta: { headerTitle: 'Access' },
29
+ cell: (info) => info.getValue(),
30
+ }),
31
+ ], []);
32
+ const table = useReactTable({
33
+ data,
34
+ columns,
35
+ getCoreRowModel: getCoreRowModel(),
36
+ });
37
+ return (_jsx(DataGrid, { ...dataGridProps, table: table, recordCount: dataGridProps.recordCount ?? data.length, children: _jsx(DataGridContainer, { className: "max-w-3xl", children: _jsx(DataGridScrollArea, { className: "h-72", children: _jsx(DataGridTable, {}) }) }) }));
38
+ }
39
+ export const Default = {
40
+ render: () => _jsx(DataGridStoryHost, {}),
41
+ };
42
+ export const Striped = {
43
+ render: () => _jsx(DataGridStoryHost, { tableLayout: { stripped: true, rowBorder: true } }),
44
+ };
45
+ export const Empty = {
46
+ render: () => _jsx(DataGridStoryHost, { rowCount: 0, recordCount: 0, emptyMessage: "No people match this view." }),
47
+ };
@@ -0,0 +1,14 @@
1
+ export { getColumnHeaderLabel, useDataGrid, DataGridProvider, DataGrid, DataGridContainer } from './data-grid';
2
+ export type { DataGridApiFetchParams, DataGridApiResponse, DataGridContextProps, DataGridRequestParams, DataGridProps } from './data-grid';
3
+ export { DataGridColumnFilter, type DataGridColumnFilterProps } from './data-grid-column-filter';
4
+ export { DataGridColumnHeader, type DataGridColumnHeaderProps } from './data-grid-column-header';
5
+ export { DataGridColumnVisibility } from './data-grid-column-visibility';
6
+ export { DataGridPagination, type DataGridPaginationProps } from './data-grid-pagination';
7
+ export { DataGridScrollArea, type DataGridScrollAreaOrientation, type DataGridScrollAreaProps } from './data-grid-scroll-area';
8
+ export { DataGridTable, DataGridTableBase, DataGridTableBody, DataGridTableBodyRow, DataGridTableBodyRowCell, DataGridTableBodyRowExpandded, DataGridTableRenderedRow, DataGridTableBodyRowSkeleton, DataGridTableBodyRowSkeletonCell, DataGridTableEmpty, DataGridTableFoot, DataGridTableFootRow, DataGridTableFootRowCell, DataGridTableHeader, DataGridTableHead, DataGridTableHeadRow, DataGridTableHeadRowCell, DataGridTableHeadRowCellResize, DataGridTableLoader, DataGridTableRowPin, DataGridTableRowSelect, DataGridTableRowSelectAll, DataGridTableRowSpacer, DataGridTableViewport, getDataGridTableResolvedRows, getDataGridTableRowSections, } from './data-grid-table';
9
+ export type { DataGridTablePinnedBoundary } from './data-grid-table';
10
+ export { DataGridTableDnd } from './data-grid-table-dnd';
11
+ export { DataGridTableDndRowHandle, DataGridTableDndRows } from './data-grid-table-dnd-rows';
12
+ export { DataGridTableVirtual } from './data-grid-table-virtual';
13
+ export type { DataGridTableVirtualProps, DataGridTableVirtualScrollElements, DataGridTableVirtualizerOptions } from './data-grid-table-virtual';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/data-grid/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC/G,YAAY,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE3I,OAAO,EAAE,oBAAoB,EAAE,KAAK,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACjG,OAAO,EAAE,oBAAoB,EAAE,KAAK,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACjG,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAE,KAAK,6BAA6B,EAAE,KAAK,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAC/H,OAAO,EACH,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,EACxB,6BAA6B,EAC7B,wBAAwB,EACxB,4BAA4B,EAC5B,gCAAgC,EAChC,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,EACxB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,EACxB,8BAA8B,EAC9B,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EACtB,yBAAyB,EACzB,sBAAsB,EACtB,qBAAqB,EACrB,4BAA4B,EAC5B,2BAA2B,GAC9B,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAErE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAC7F,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,YAAY,EAAE,yBAAyB,EAAE,kCAAkC,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,10 @@
1
+ export { getColumnHeaderLabel, useDataGrid, DataGridProvider, DataGrid, DataGridContainer } from './data-grid';
2
+ export { DataGridColumnFilter } from './data-grid-column-filter';
3
+ export { DataGridColumnHeader } from './data-grid-column-header';
4
+ export { DataGridColumnVisibility } from './data-grid-column-visibility';
5
+ export { DataGridPagination } from './data-grid-pagination';
6
+ export { DataGridScrollArea } from './data-grid-scroll-area';
7
+ export { DataGridTable, DataGridTableBase, DataGridTableBody, DataGridTableBodyRow, DataGridTableBodyRowCell, DataGridTableBodyRowExpandded, DataGridTableRenderedRow, DataGridTableBodyRowSkeleton, DataGridTableBodyRowSkeletonCell, DataGridTableEmpty, DataGridTableFoot, DataGridTableFootRow, DataGridTableFootRowCell, DataGridTableHeader, DataGridTableHead, DataGridTableHeadRow, DataGridTableHeadRowCell, DataGridTableHeadRowCellResize, DataGridTableLoader, DataGridTableRowPin, DataGridTableRowSelect, DataGridTableRowSelectAll, DataGridTableRowSpacer, DataGridTableViewport, getDataGridTableResolvedRows, getDataGridTableRowSections, } from './data-grid-table';
8
+ export { DataGridTableDnd } from './data-grid-table-dnd';
9
+ export { DataGridTableDndRowHandle, DataGridTableDndRows } from './data-grid-table-dnd-rows';
10
+ export { DataGridTableVirtual } from './data-grid-table-virtual';
@@ -1 +1 @@
1
- {"version":3,"file":"filter-date-metric-value.d.ts","sourceRoot":"","sources":["../../../src/components/filters/filter-date-metric-value.tsx"],"names":[],"mappings":"AAeA,OAAO,EAKH,KAAK,sBAAsB,EAG3B,KAAK,iBAAiB,EAEtB,KAAK,sBAAsB,EAC9B,MAAM,gDAAgD,CAAC;AAyBxD,OAAO,KAAK,EAA2B,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAyIpG;;;;GAIG;AACH,wBAAgB,sBAAsB,CAClC,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,sBAAsB,EAChC,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,sBAAsB,GACjC,MAAM,CAER;AAED,MAAM,WAAW,sCAAsC,CAAC,CAAC,GAAG,OAAO;IAC/D,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;IAChC,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC;IAC9B,8EAA8E;IAC9E,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,uHAAuH;AACvH,wBAAgB,iCAAiC,CAAC,CAAC,GAAG,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,sCAAsC,CAAC,CAAC,CAAC,2CAqP3J;AAED,MAAM,WAAW,oCAAoC,CAAC,CAAC,GAAG,OAAO;IAC7D,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC;IAC9B,yGAAyG;IACzG,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACjD;AA+ED,gHAAgH;AAChH,wBAAgB,+BAA+B,CAAC,CAAC,GAAG,OAAO,EAAE,EACzD,KAAK,EACL,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,gBAAgB,GACnB,EAAE,oCAAoC,CAAC,CAAC,CAAC,kDAyNzC"}
1
+ {"version":3,"file":"filter-date-metric-value.d.ts","sourceRoot":"","sources":["../../../src/components/filters/filter-date-metric-value.tsx"],"names":[],"mappings":"AAeA,OAAO,EAKH,KAAK,sBAAsB,EAG3B,KAAK,iBAAiB,EAEtB,KAAK,sBAAsB,EAC9B,MAAM,gDAAgD,CAAC;AAyBxD,OAAO,KAAK,EAA2B,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAyIpG;;;;GAIG;AACH,wBAAgB,sBAAsB,CAClC,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,sBAAsB,EAChC,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,sBAAsB,GACjC,MAAM,CAER;AAED,MAAM,WAAW,sCAAsC,CAAC,CAAC,GAAG,OAAO;IAC/D,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;IAChC,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC;IAC9B,8EAA8E;IAC9E,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,uHAAuH;AACvH,wBAAgB,iCAAiC,CAAC,CAAC,GAAG,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,sCAAsC,CAAC,CAAC,CAAC,2CAqP3J;AAED,MAAM,WAAW,oCAAoC,CAAC,CAAC,GAAG,OAAO;IAC7D,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC;IAC9B,yGAAyG;IACzG,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACjD;AAwJD,gHAAgH;AAChH,wBAAgB,+BAA+B,CAAC,CAAC,GAAG,OAAO,EAAE,EACzD,KAAK,EACL,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,gBAAgB,GACnB,EAAE,oCAAoC,CAAC,CAAC,CAAC,kDA0NzC"}
@@ -183,6 +183,9 @@ const METRIC_EMPTY_AMOUNT = '\u2013';
183
183
  /** Spaces around the en dash so empty segments don’t feel cramped (e.g. `$ – `). */
184
184
  const METRIC_EMPTY_DISPLAY = ` ${METRIC_EMPTY_AMOUNT} `;
185
185
  const metricAmountFormatters = new Map();
186
+ const metricIntegerFormatters = new Map();
187
+ const metricPercentFormatters = new Map();
188
+ const metricPercentSuffixLiteralByLocale = new Map();
186
189
  function formatMetricAmountDigits(value, locale) {
187
190
  let nf = metricAmountFormatters.get(locale);
188
191
  if (!nf) {
@@ -204,11 +207,82 @@ function formatMetricAmountDigits(value, locale) {
204
207
  }
205
208
  return nf.format(value);
206
209
  }
207
- /** Bar label: `sym` + grouped amount, or `sym` + spaced en dash when empty. */
208
- function formatMetricMoney(sym, value, locale) {
210
+ function formatMetricIntegerDigits(value, locale) {
211
+ let nf = metricIntegerFormatters.get(locale);
212
+ if (!nf) {
213
+ try {
214
+ nf = new Intl.NumberFormat(locale, { maximumFractionDigits: 0, useGrouping: true });
215
+ }
216
+ catch {
217
+ nf = new Intl.NumberFormat('en-US', { maximumFractionDigits: 0, useGrouping: true });
218
+ }
219
+ metricIntegerFormatters.set(locale, nf);
220
+ }
221
+ return nf.format(value);
222
+ }
223
+ function dateMetricBarValueFormat(field) {
224
+ return field.dateMetricValueFormat ?? 'currency';
225
+ }
226
+ /** Suffix literals from `Intl` for an empty percent segment (locale-specific spacing, RTL, etc.). */
227
+ function percentBarSuffixLiteral(locale) {
228
+ let s = metricPercentSuffixLiteralByLocale.get(locale);
229
+ if (s !== undefined)
230
+ return s;
231
+ try {
232
+ const nf = new Intl.NumberFormat(locale, { style: 'percent', maximumFractionDigits: 0 });
233
+ s = nf
234
+ .formatToParts(1)
235
+ .filter((p) => p.type === 'literal')
236
+ .map((p) => p.value)
237
+ .join('');
238
+ }
239
+ catch {
240
+ s = '%';
241
+ }
242
+ if (!s)
243
+ s = '%';
244
+ metricPercentSuffixLiteralByLocale.set(locale, s);
245
+ return s;
246
+ }
247
+ /** `value` is percentage points (e.g. 85 → 85%); `Intl` expects a ratio, so divide by 100. */
248
+ function formatMetricPercentFromPercentagePoints(value, locale) {
249
+ let nf = metricPercentFormatters.get(locale);
250
+ if (!nf) {
251
+ try {
252
+ nf = new Intl.NumberFormat(locale, {
253
+ style: 'percent',
254
+ minimumFractionDigits: 0,
255
+ maximumFractionDigits: 20,
256
+ useGrouping: true,
257
+ });
258
+ }
259
+ catch {
260
+ nf = new Intl.NumberFormat('en-US', {
261
+ style: 'percent',
262
+ minimumFractionDigits: 0,
263
+ maximumFractionDigits: 20,
264
+ useGrouping: true,
265
+ });
266
+ }
267
+ metricPercentFormatters.set(locale, nf);
268
+ }
269
+ return nf.format(value / 100);
270
+ }
271
+ /** Bar label for a single threshold: currency, percent, or integer locale formatting. */
272
+ function formatDateMetricBarAmount(value, format, locale, currencySym) {
273
+ if (format === 'currency') {
274
+ if (value == null || Number.isNaN(value))
275
+ return `${currencySym}${METRIC_EMPTY_DISPLAY}`;
276
+ return `${currencySym}${formatMetricAmountDigits(value, locale)}`;
277
+ }
278
+ if (format === 'integer') {
279
+ if (value == null || Number.isNaN(value))
280
+ return METRIC_EMPTY_DISPLAY;
281
+ return formatMetricIntegerDigits(value, locale);
282
+ }
209
283
  if (value == null || Number.isNaN(value))
210
- return `${sym}${METRIC_EMPTY_DISPLAY}`;
211
- return `${sym}${formatMetricAmountDigits(value, locale)}`;
284
+ return `${METRIC_EMPTY_DISPLAY}${percentBarSuffixLiteral(locale)}`;
285
+ return formatMetricPercentFromPercentagePoints(value, locale);
212
286
  }
213
287
  function parseDraftNumber(raw, previous) {
214
288
  if (raw.trim() === '')
@@ -277,6 +351,7 @@ export function FilterDateMetricBarValueSegment({ field, values, onChange, opera
277
351
  const valueAnyOperator = operators.find((o) => o.value === 'value_any');
278
352
  const sym = i18n.defaultCurrency;
279
353
  const numberLocale = i18n.numberFormatLocale;
354
+ const barValueFormat = dateMetricBarValueFormat(field);
280
355
  const inputSizeProp = size === 'lg' ? 'default' : 'sm';
281
356
  const buttonSize = size === 'lg' ? 'lg' : size === 'sm' ? 'sm' : 'default';
282
357
  const valueSegment = (() => {
@@ -290,7 +365,7 @@ export function FilterDateMetricBarValueSegment({ field, values, onChange, opera
290
365
  }
291
366
  if (operator === 'value_greater_than') {
292
367
  const hasMinValue = payload.min != null && !Number.isNaN(payload.min);
293
- const summary = formatMetricMoney(sym, payload.min ?? undefined, numberLocale);
368
+ const summary = formatDateMetricBarAmount(payload.min ?? undefined, barValueFormat, numberLocale, sym);
294
369
  const triggerLabel = `${i18n.operators.greaterThan}: ${summary}`;
295
370
  return (_jsx(MetricValueThresholdPopoverShell, { open: metricPopoverOpen, onOpenChange: handleMetricPopoverOpenChange, buttonSize: buttonSize, triggerLabel: triggerLabel, summary: summary, triggerClassName: cn(METRIC_POPOVER_TRIGGER_NARROW, !hasMinValue ? 'text-muted-foreground' : 'text-foreground'), children: _jsx(Input, { type: "number", size: inputSizeProp, className: "w-full min-w-0 tabular-nums", value: draftMin, onChange: (e) => {
296
371
  const v = e.target.value;
@@ -300,7 +375,7 @@ export function FilterDateMetricBarValueSegment({ field, values, onChange, opera
300
375
  }
301
376
  if (operator === 'value_less_than') {
302
377
  const hasMaxValue = payload.max != null && !Number.isNaN(payload.max);
303
- const summary = formatMetricMoney(sym, payload.max ?? undefined, numberLocale);
378
+ const summary = formatDateMetricBarAmount(payload.max ?? undefined, barValueFormat, numberLocale, sym);
304
379
  const triggerLabel = `${i18n.operators.lessThan}: ${summary}`;
305
380
  return (_jsx(MetricValueThresholdPopoverShell, { open: metricPopoverOpen, onOpenChange: handleMetricPopoverOpenChange, buttonSize: buttonSize, triggerLabel: triggerLabel, summary: summary, triggerClassName: cn(METRIC_POPOVER_TRIGGER_NARROW, !hasMaxValue ? 'text-muted-foreground' : 'text-foreground'), children: _jsx(Input, { type: "number", size: inputSizeProp, className: "w-full min-w-0 tabular-nums", value: draftMax, onChange: (e) => {
306
381
  const v = e.target.value;
@@ -311,8 +386,8 @@ export function FilterDateMetricBarValueSegment({ field, values, onChange, opera
311
386
  if (operator === 'value_between') {
312
387
  const hasMinValue = payload.min != null && !Number.isNaN(payload.min);
313
388
  const hasMaxValue = payload.max != null && !Number.isNaN(payload.max);
314
- const minPart = formatMetricMoney(sym, payload.min ?? undefined, numberLocale);
315
- const maxPart = formatMetricMoney(sym, payload.max ?? undefined, numberLocale);
389
+ const minPart = formatDateMetricBarAmount(payload.min ?? undefined, barValueFormat, numberLocale, sym);
390
+ const maxPart = formatDateMetricBarAmount(payload.max ?? undefined, barValueFormat, numberLocale, sym);
316
391
  const summary = `${minPart} - ${maxPart}`;
317
392
  const triggerLabel = `${i18n.operators.between}: ${summary}`;
318
393
  return (_jsx(MetricValueThresholdPopoverShell, { open: metricPopoverOpen, onOpenChange: handleMetricPopoverOpenChange, buttonSize: buttonSize, triggerLabel: triggerLabel, summary: summary, triggerClassName: cn(METRIC_POPOVER_TRIGGER_WIDE, !hasMinValue && !hasMaxValue ? 'text-muted-foreground' : 'text-foreground'), children: _jsxs("div", { className: "flex w-full flex-col gap-1.5", children: [_jsx(Input, { type: "number", size: inputSizeProp, className: "w-full min-w-0 tabular-nums", value: draftMin, onChange: (e) => {
@@ -0,0 +1,12 @@
1
+ import type { i18n as I18nInstance, TFunction } from 'i18next';
2
+ import type { DateSelectorI18nConfig } from '../../blocks/date-selector/date-selector-types';
3
+ import type { FilterFieldConfig, FilterFieldsConfig } from './filters-types';
4
+ /** Flat fields for minimal `Default` / `WithOneFilter` stories (real listing keys). */
5
+ export declare function buildListingDemoFields(t: TFunction): FilterFieldConfig[];
6
+ /** Grouped listing catalog for `GroupedFieldsAndSearch` (keys and shapes mirror app listing filters). */
7
+ export declare function buildListingGroupedFields(t: TFunction, dateSelectorI18n: DateSelectorI18nConfig, i18n: I18nInstance): FilterFieldsConfig;
8
+ /** Flat listing fields for docs previews (no filter i18n bundle required). */
9
+ export declare function buildListingDemoFieldsForDocs(): FilterFieldConfig[];
10
+ /** Grouped listing catalog for docs previews; pass docs `I18nextProvider` instance and date-selector copy. */
11
+ export declare function buildListingGroupedFieldsForDocs(dateSelectorI18n: DateSelectorI18nConfig, i18n: I18nInstance): FilterFieldsConfig;
12
+ //# sourceMappingURL=filter-fields-listing-demo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-fields-listing-demo.d.ts","sourceRoot":"","sources":["../../../src/components/filters/filter-fields-listing-demo.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,IAAI,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAyB/D,OAAO,KAAK,EAAE,sBAAsB,EAA8C,MAAM,gDAAgD,CAAC;AACzI,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAkB,MAAM,iBAAiB,CAAC;AA0D7F,uFAAuF;AACvF,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,SAAS,GAAG,iBAAiB,EAAE,CA+BxE;AAED,yGAAyG;AACzG,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,IAAI,EAAE,YAAY,GAAG,kBAAkB,CA0dxI;AAED,8EAA8E;AAC9E,wBAAgB,6BAA6B,IAAI,iBAAiB,EAAE,CAEnE;AAED,8GAA8G;AAC9G,wBAAgB,gCAAgC,CAAC,gBAAgB,EAAE,sBAAsB,EAAE,IAAI,EAAE,YAAY,GAAG,kBAAkB,CAEjI"}