@panneau/lists 5.0.0-alpha.15 → 5.0.0-alpha.17

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 (59) hide show
  1. package/dist/ListView.d.ts +7 -1
  2. package/dist/ListView.d.ts.map +1 -1
  3. package/dist/ListView.js +302 -297
  4. package/dist/ListView.js.map +1 -1
  5. package/dist/actions/ActionButton.d.ts +7 -1
  6. package/dist/actions/ActionButton.d.ts.map +1 -1
  7. package/dist/actions/ActionButton.js +74 -72
  8. package/dist/actions/ActionButton.js.map +1 -1
  9. package/dist/actions/Actions.css +12 -0
  10. package/dist/actions/Actions.module.js +6 -2
  11. package/dist/actions/Actions.module.js.map +1 -1
  12. package/dist/actions/RowActions.d.ts +21 -4
  13. package/dist/actions/RowActions.d.ts.map +1 -1
  14. package/dist/actions/RowActions.js +149 -84
  15. package/dist/actions/RowActions.js.map +1 -1
  16. package/dist/actions/fit.d.ts +25 -0
  17. package/dist/actions/fit.d.ts.map +1 -0
  18. package/dist/actions/fit.js +197 -0
  19. package/dist/actions/fit.js.map +1 -0
  20. package/dist/actions/icons.d.ts +5 -0
  21. package/dist/actions/icons.d.ts.map +1 -1
  22. package/dist/actions/icons.js +15 -1
  23. package/dist/actions/icons.js.map +1 -1
  24. package/dist/displays/Displays.css +19 -1
  25. package/dist/displays/Displays.module.js +8 -2
  26. package/dist/displays/Displays.module.js.map +1 -1
  27. package/dist/displays/displays.d.ts +31 -8
  28. package/dist/displays/displays.d.ts.map +1 -1
  29. package/dist/displays/displays.js +615 -164
  30. package/dist/displays/displays.js.map +1 -1
  31. package/dist/index.d.ts +1 -1
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +2 -2
  34. package/dist/layouts/CalendarLayout.d.ts +4 -4
  35. package/dist/layouts/CalendarLayout.d.ts.map +1 -1
  36. package/dist/layouts/CalendarLayout.js +25 -20
  37. package/dist/layouts/CalendarLayout.js.map +1 -1
  38. package/dist/layouts/CardsLayout.d.ts.map +1 -1
  39. package/dist/layouts/CardsLayout.js +90 -93
  40. package/dist/layouts/CardsLayout.js.map +1 -1
  41. package/dist/layouts/GalleryLayout.css +7 -0
  42. package/dist/layouts/GalleryLayout.d.ts.map +1 -1
  43. package/dist/layouts/GalleryLayout.js +76 -53
  44. package/dist/layouts/GalleryLayout.js.map +1 -1
  45. package/dist/layouts/GalleryLayout.module.js.map +1 -1
  46. package/dist/layouts/TableLayout.d.ts.map +1 -1
  47. package/dist/layouts/TableLayout.js +120 -93
  48. package/dist/layouts/TableLayout.js.map +1 -1
  49. package/dist/layouts/calendarDays.d.ts +14 -0
  50. package/dist/layouts/calendarDays.d.ts.map +1 -0
  51. package/dist/layouts/calendarDays.js +44 -0
  52. package/dist/layouts/calendarDays.js.map +1 -0
  53. package/dist/query.d.ts +3 -2
  54. package/dist/query.d.ts.map +1 -1
  55. package/dist/query.js +15 -4
  56. package/dist/query.js.map +1 -1
  57. package/dist/types.d.ts +9 -1
  58. package/dist/types.d.ts.map +1 -1
  59. package/package.json +7 -7
@@ -1,5 +1,6 @@
1
1
  import { messages } from "../messages.js";
2
2
  import { ItemTitle } from "./ItemTitle.js";
3
+ import { RowActionsFit, fitContent, useRowActionsFit } from "../actions/fit.js";
3
4
  import { cx } from "../cx.js";
4
5
  import TableLayout_module_default from "./TableLayout.module.js";
5
6
  import { c } from "react/compiler-runtime";
@@ -22,7 +23,7 @@ function alignClass(column) {
22
23
  * block that shows the label of each value.
23
24
  */
24
25
  function TableLayout(t0) {
25
- const $ = c(56);
26
+ const $ = c(65);
26
27
  const { items, columns, renderValue, getItemLabel, getItemHref, isCurrent, selectable, isSelected, onToggle, renderActions, sort, onSort, label, pageSelection, renderCell } = t0;
27
28
  const intl = usePanneauIntl();
28
29
  let actions;
@@ -46,20 +47,28 @@ function TableLayout(t0) {
46
47
  }
47
48
  const hasActions = t1;
48
49
  let t2;
49
- if ($[6] !== pageSelection || $[7] !== selectable) {
50
- t2 = selectable ? /* @__PURE__ */ jsx("th", {
51
- className: TableLayout_module_default.check,
52
- children: pageSelection
53
- }) : null;
54
- $[6] = pageSelection;
55
- $[7] = selectable;
50
+ if ($[6] !== columns || $[7] !== items) {
51
+ t2 = fitContent(items, columns);
52
+ $[6] = columns;
53
+ $[7] = items;
56
54
  $[8] = t2;
57
55
  } else t2 = $[8];
56
+ const [fitLevel, measureList] = useRowActionsFit(t2);
58
57
  let t3;
59
- if ($[9] !== columns || $[10] !== onSort || $[11] !== sort) {
60
- let t4;
61
- if ($[13] !== onSort || $[14] !== sort) {
62
- t4 = (column) => {
58
+ if ($[9] !== pageSelection || $[10] !== selectable) {
59
+ t3 = selectable ? /* @__PURE__ */ jsx("th", {
60
+ className: TableLayout_module_default.check,
61
+ children: pageSelection
62
+ }) : null;
63
+ $[9] = pageSelection;
64
+ $[10] = selectable;
65
+ $[11] = t3;
66
+ } else t3 = $[11];
67
+ let t4;
68
+ if ($[12] !== columns || $[13] !== onSort || $[14] !== sort) {
69
+ let t5;
70
+ if ($[16] !== onSort || $[17] !== sort) {
71
+ t5 = (column) => {
63
72
  const direction = getSortDirection(sort, column);
64
73
  return /* @__PURE__ */ jsx("th", {
65
74
  scope: "col",
@@ -80,46 +89,46 @@ function TableLayout(t0) {
80
89
  }) : column.label ?? column.id
81
90
  }, column.id);
82
91
  };
83
- $[13] = onSort;
84
- $[14] = sort;
85
- $[15] = t4;
86
- } else t4 = $[15];
87
- t3 = columns.map(t4);
88
- $[9] = columns;
89
- $[10] = onSort;
90
- $[11] = sort;
91
- $[12] = t3;
92
- } else t3 = $[12];
93
- let t4;
94
- if ($[16] !== hasActions || $[17] !== intl) {
95
- t4 = hasActions ? /* @__PURE__ */ jsx("th", {
92
+ $[16] = onSort;
93
+ $[17] = sort;
94
+ $[18] = t5;
95
+ } else t5 = $[18];
96
+ t4 = columns.map(t5);
97
+ $[12] = columns;
98
+ $[13] = onSort;
99
+ $[14] = sort;
100
+ $[15] = t4;
101
+ } else t4 = $[15];
102
+ let t5;
103
+ if ($[19] !== hasActions || $[20] !== intl) {
104
+ t5 = hasActions ? /* @__PURE__ */ jsx("th", {
96
105
  className: TableLayout_module_default.actionsCell,
97
106
  children: /* @__PURE__ */ jsx("span", {
98
107
  className: TableLayout_module_default.visuallyHidden,
99
108
  children: intl.formatMessage(messages.actions)
100
109
  })
101
110
  }) : null;
102
- $[16] = hasActions;
103
- $[17] = intl;
104
- $[18] = t4;
105
- } else t4 = $[18];
106
- let t5;
107
- if ($[19] !== t2 || $[20] !== t3 || $[21] !== t4) {
108
- t5 = /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
109
- t2,
111
+ $[19] = hasActions;
112
+ $[20] = intl;
113
+ $[21] = t5;
114
+ } else t5 = $[21];
115
+ let t6;
116
+ if ($[22] !== t3 || $[23] !== t4 || $[24] !== t5) {
117
+ t6 = /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
110
118
  t3,
111
- t4
119
+ t4,
120
+ t5
112
121
  ] }) });
113
- $[19] = t2;
114
- $[20] = t3;
115
- $[21] = t4;
116
- $[22] = t5;
117
- } else t5 = $[22];
118
- let t6;
119
- if ($[23] !== actions || $[24] !== columns || $[25] !== getItemHref || $[26] !== getItemLabel || $[27] !== hasActions || $[28] !== intl || $[29] !== isCurrent || $[30] !== isSelected || $[31] !== items || $[32] !== onToggle || $[33] !== renderCell || $[34] !== renderValue || $[35] !== selectable) {
120
- let t7;
121
- if ($[37] !== actions || $[38] !== columns || $[39] !== getItemHref || $[40] !== getItemLabel || $[41] !== hasActions || $[42] !== intl || $[43] !== isCurrent || $[44] !== isSelected || $[45] !== onToggle || $[46] !== renderCell || $[47] !== renderValue || $[48] !== selectable) {
122
- t7 = (item_0, row) => {
122
+ $[22] = t3;
123
+ $[23] = t4;
124
+ $[24] = t5;
125
+ $[25] = t6;
126
+ } else t6 = $[25];
127
+ let t7;
128
+ if ($[26] !== actions || $[27] !== columns || $[28] !== getItemHref || $[29] !== getItemLabel || $[30] !== hasActions || $[31] !== intl || $[32] !== isCurrent || $[33] !== isSelected || $[34] !== items || $[35] !== onToggle || $[36] !== renderCell || $[37] !== renderValue || $[38] !== selectable) {
129
+ let t8;
130
+ if ($[40] !== actions || $[41] !== columns || $[42] !== getItemHref || $[43] !== getItemLabel || $[44] !== hasActions || $[45] !== intl || $[46] !== isCurrent || $[47] !== isSelected || $[48] !== onToggle || $[49] !== renderCell || $[50] !== renderValue || $[51] !== selectable) {
131
+ t8 = (item_0, row) => {
123
132
  const selected = selectable && isSelected(item_0);
124
133
  const href = getItemHref?.(item_0) ?? null;
125
134
  const current = isCurrent?.(item_0) ?? false;
@@ -156,58 +165,76 @@ function TableLayout(t0) {
156
165
  ]
157
166
  }, item_0.id);
158
167
  };
159
- $[37] = actions;
160
- $[38] = columns;
161
- $[39] = getItemHref;
162
- $[40] = getItemLabel;
163
- $[41] = hasActions;
164
- $[42] = intl;
165
- $[43] = isCurrent;
166
- $[44] = isSelected;
167
- $[45] = onToggle;
168
- $[46] = renderCell;
169
- $[47] = renderValue;
170
- $[48] = selectable;
171
- $[49] = t7;
172
- } else t7 = $[49];
173
- t6 = items.map(t7);
174
- $[23] = actions;
175
- $[24] = columns;
176
- $[25] = getItemHref;
177
- $[26] = getItemLabel;
178
- $[27] = hasActions;
179
- $[28] = intl;
180
- $[29] = isCurrent;
181
- $[30] = isSelected;
182
- $[31] = items;
183
- $[32] = onToggle;
184
- $[33] = renderCell;
185
- $[34] = renderValue;
186
- $[35] = selectable;
187
- $[36] = t6;
188
- } else t6 = $[36];
189
- let t7;
190
- if ($[50] !== t6) {
191
- t7 = /* @__PURE__ */ jsx("tbody", { children: t6 });
192
- $[50] = t6;
193
- $[51] = t7;
194
- } else t7 = $[51];
168
+ $[40] = actions;
169
+ $[41] = columns;
170
+ $[42] = getItemHref;
171
+ $[43] = getItemLabel;
172
+ $[44] = hasActions;
173
+ $[45] = intl;
174
+ $[46] = isCurrent;
175
+ $[47] = isSelected;
176
+ $[48] = onToggle;
177
+ $[49] = renderCell;
178
+ $[50] = renderValue;
179
+ $[51] = selectable;
180
+ $[52] = t8;
181
+ } else t8 = $[52];
182
+ t7 = items.map(t8);
183
+ $[26] = actions;
184
+ $[27] = columns;
185
+ $[28] = getItemHref;
186
+ $[29] = getItemLabel;
187
+ $[30] = hasActions;
188
+ $[31] = intl;
189
+ $[32] = isCurrent;
190
+ $[33] = isSelected;
191
+ $[34] = items;
192
+ $[35] = onToggle;
193
+ $[36] = renderCell;
194
+ $[37] = renderValue;
195
+ $[38] = selectable;
196
+ $[39] = t7;
197
+ } else t7 = $[39];
195
198
  let t8;
196
- if ($[52] !== label || $[53] !== t5 || $[54] !== t7) {
197
- t8 = /* @__PURE__ */ jsx("div", {
199
+ if ($[53] !== t7) {
200
+ t8 = /* @__PURE__ */ jsx("tbody", { children: t7 });
201
+ $[53] = t7;
202
+ $[54] = t8;
203
+ } else t8 = $[54];
204
+ let t9;
205
+ if ($[55] !== label || $[56] !== t6 || $[57] !== t8) {
206
+ t9 = /* @__PURE__ */ jsxs("table", {
207
+ className: TableLayout_module_default.table,
208
+ "aria-label": label,
209
+ children: [t6, t8]
210
+ });
211
+ $[55] = label;
212
+ $[56] = t6;
213
+ $[57] = t8;
214
+ $[58] = t9;
215
+ } else t9 = $[58];
216
+ let t10;
217
+ if ($[59] !== measureList || $[60] !== t9) {
218
+ t10 = /* @__PURE__ */ jsx("div", {
198
219
  className: TableLayout_module_default.scroller,
199
- children: /* @__PURE__ */ jsxs("table", {
200
- className: TableLayout_module_default.table,
201
- "aria-label": label,
202
- children: [t5, t7]
203
- })
220
+ ref: measureList,
221
+ children: t9
222
+ });
223
+ $[59] = measureList;
224
+ $[60] = t9;
225
+ $[61] = t10;
226
+ } else t10 = $[61];
227
+ let t11;
228
+ if ($[62] !== fitLevel || $[63] !== t10) {
229
+ t11 = /* @__PURE__ */ jsx(RowActionsFit, {
230
+ value: fitLevel,
231
+ children: t10
204
232
  });
205
- $[52] = label;
206
- $[53] = t5;
207
- $[54] = t7;
208
- $[55] = t8;
209
- } else t8 = $[55];
210
- return t8;
233
+ $[62] = fitLevel;
234
+ $[63] = t10;
235
+ $[64] = t11;
236
+ } else t11 = $[64];
237
+ return t11;
211
238
  }
212
239
  function _temp(node) {
213
240
  return node !== null;
@@ -1 +1 @@
1
- {"version":3,"file":"TableLayout.js","names":["ArrowDown","ArrowUp","ArrowUpDown","Checkbox","Icon","usePanneauIntl","cx","messages","ListColumn","ListLayoutProps","ItemTitle","styles","getSortDirection","sort","column","first","id","alignClass","align","center","end","undefined","TableLayout","t0","$","_c","items","columns","renderValue","getItemLabel","getItemHref","isCurrent","selectable","isSelected","onToggle","renderActions","onSort","label","pageSelection","renderCell","intl","actions","t1","t2","item","map","some","_temp","hasActions","check","t3","t4","direction","width","sortable","sorted","sortIcon","actionsCell","visuallyHidden","formatMessage","t5","t6","t7","item_0","row","selected","href","current","selectItem","column_0","index","content","title","cellLabel","t8","scroller","table","node","styles","_c"],"sources":["../../src/layouts/TableLayout.tsx"],"sourcesContent":["import { ArrowDown, ArrowUp, ArrowUpDown } from 'lucide-react';\n\nimport { Checkbox, Icon, usePanneauIntl } from '@panneau/ui';\n\nimport { cx } from '../cx';\nimport { messages } from '../messages';\nimport type { ListColumn, ListLayoutProps } from '../types';\nimport { ItemTitle } from './ItemTitle';\nimport styles from './TableLayout.module.css';\n\n/** The sort direction of a column, from the first `sort` value. */\nexport function getSortDirection(\n sort: readonly string[],\n column: ListColumn,\n): 'ascending' | 'descending' | null {\n const first = sort[0];\n if (first === column.id) {\n return 'ascending';\n }\n return first === `-${column.id}` ? 'descending' : null;\n}\n\nfunction alignClass(column: ListColumn): string | undefined {\n if (column.align === 'center') {\n return styles.center;\n }\n return column.align === 'end' ? styles.end : undefined;\n}\n\n/**\n * Items as a table, with sortable column headers. On narrow lists (phones), each row turns into a\n * block that shows the label of each value.\n */\nexport function TableLayout({\n items,\n columns,\n renderValue,\n getItemLabel,\n getItemHref,\n isCurrent,\n selectable,\n isSelected,\n onToggle,\n renderActions,\n sort,\n onSort,\n label,\n pageSelection,\n renderCell,\n}: ListLayoutProps) {\n const intl = usePanneauIntl();\n const actions = items.map((item) => renderActions(item));\n const hasActions = actions.some((node) => node !== null);\n return (\n <div className={styles.scroller}>\n <table className={styles.table} aria-label={label}>\n <thead>\n <tr>\n {selectable ? <th className={styles.check}>{pageSelection}</th> : null}\n {columns.map((column) => {\n const direction = getSortDirection(sort, column);\n return (\n <th\n key={column.id}\n scope=\"col\"\n className={alignClass(column)}\n style={\n column.width !== undefined\n ? { width: column.width }\n : undefined\n }\n aria-sort={\n column.sortable === true ? (direction ?? 'none') : undefined\n }\n >\n {column.sortable === true ? (\n <button\n type=\"button\"\n className={cx(\n styles.sort,\n direction !== null && styles.sorted,\n )}\n onClick={() => onSort(column)}\n >\n {column.label ?? column.id}\n <span className={styles.sortIcon}>\n <Icon\n icon={\n direction === 'ascending'\n ? ArrowUp\n : direction === 'descending'\n ? ArrowDown\n : ArrowUpDown\n }\n size=\"sm\"\n />\n </span>\n </button>\n ) : (\n (column.label ?? column.id)\n )}\n </th>\n );\n })}\n {hasActions ? (\n <th className={styles.actionsCell}>\n <span className={styles.visuallyHidden}>\n {intl.formatMessage(messages.actions)}\n </span>\n </th>\n ) : null}\n </tr>\n </thead>\n <tbody>\n {items.map((item, row) => {\n const selected = selectable && isSelected(item);\n const href = getItemHref?.(item) ?? null;\n const current = isCurrent?.(item) ?? false;\n return (\n <tr\n key={item.id}\n data-selected={selected || undefined}\n data-current={current || undefined}\n >\n {selectable ? (\n <td className={styles.check}>\n <Checkbox\n aria-label={intl.formatMessage(messages.selectItem, {\n item: getItemLabel(item),\n })}\n isSelected={selected}\n onChange={() => onToggle(item)}\n />\n </td>\n ) : null}\n {columns.map((column, index) => {\n const content =\n index === 0 ? (\n <ItemTitle href={href} current={current}>\n {renderValue(item, column)}\n </ItemTitle>\n ) : (\n renderValue(item, column)\n );\n return (\n <td\n key={column.id}\n className={cx(\n alignClass(column),\n index === 0 && styles.title,\n )}\n >\n <span className={styles.cellLabel}>\n {column.label ?? column.id}\n </span>\n <span>\n {renderCell !== undefined\n ? renderCell(item, column, content)\n : content}\n </span>\n </td>\n );\n })}\n {hasActions ? (\n <td className={styles.actionsCell}>{actions[row]}</td>\n ) : null}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TableLayout.js","names":["ArrowDown","ArrowUp","ArrowUpDown","Checkbox","Icon","usePanneauIntl","RowActionsFit","fitContent","useRowActionsFit","cx","messages","ListColumn","ListLayoutProps","ItemTitle","styles","getSortDirection","sort","column","first","id","alignClass","align","center","end","undefined","TableLayout","t0","$","_c","items","columns","renderValue","getItemLabel","getItemHref","isCurrent","selectable","isSelected","onToggle","renderActions","onSort","label","pageSelection","renderCell","intl","actions","t1","t2","item","map","some","_temp","hasActions","fitLevel","measureList","t3","check","t4","t5","direction","width","sortable","sorted","sortIcon","actionsCell","visuallyHidden","formatMessage","t6","t7","t8","item_0","row","selected","href","current","selectItem","column_0","index","content","title","cellLabel","t9","table","t10","scroller","t11","node","styles","_c"],"sources":["../../src/layouts/TableLayout.tsx"],"sourcesContent":["import { ArrowDown, ArrowUp, ArrowUpDown } from 'lucide-react';\n\nimport { Checkbox, Icon, usePanneauIntl } from '@panneau/ui';\n\nimport { RowActionsFit, fitContent, useRowActionsFit } from '../actions/fit';\nimport { cx } from '../cx';\nimport { messages } from '../messages';\nimport type { ListColumn, ListLayoutProps } from '../types';\nimport { ItemTitle } from './ItemTitle';\nimport styles from './TableLayout.module.css';\n\n/** The sort direction of a column, from the first `sort` value. */\nexport function getSortDirection(\n sort: readonly string[],\n column: ListColumn,\n): 'ascending' | 'descending' | null {\n const first = sort[0];\n if (first === column.id) {\n return 'ascending';\n }\n return first === `-${column.id}` ? 'descending' : null;\n}\n\nfunction alignClass(column: ListColumn): string | undefined {\n if (column.align === 'center') {\n return styles.center;\n }\n return column.align === 'end' ? styles.end : undefined;\n}\n\n/**\n * Items as a table, with sortable column headers. On narrow lists (phones), each row turns into a\n * block that shows the label of each value.\n */\nexport function TableLayout({\n items,\n columns,\n renderValue,\n getItemLabel,\n getItemHref,\n isCurrent,\n selectable,\n isSelected,\n onToggle,\n renderActions,\n sort,\n onSort,\n label,\n pageSelection,\n renderCell,\n}: ListLayoutProps) {\n const intl = usePanneauIntl();\n const actions = items.map((item) => renderActions(item));\n const hasActions = actions.some((node) => node !== null);\n const [fitLevel, measureList] = useRowActionsFit(fitContent(items, columns));\n return (\n <RowActionsFit value={fitLevel}>\n <div className={styles.scroller} ref={measureList}>\n <table className={styles.table} aria-label={label}>\n <thead>\n <tr>\n {selectable ? <th className={styles.check}>{pageSelection}</th> : null}\n {columns.map((column) => {\n const direction = getSortDirection(sort, column);\n return (\n <th\n key={column.id}\n scope=\"col\"\n className={alignClass(column)}\n style={\n column.width !== undefined\n ? { width: column.width }\n : undefined\n }\n aria-sort={\n column.sortable === true\n ? (direction ?? 'none')\n : undefined\n }\n >\n {column.sortable === true ? (\n <button\n type=\"button\"\n className={cx(\n styles.sort,\n direction !== null && styles.sorted,\n )}\n onClick={() => onSort(column)}\n >\n {column.label ?? column.id}\n <span className={styles.sortIcon}>\n <Icon\n icon={\n direction === 'ascending'\n ? ArrowUp\n : direction === 'descending'\n ? ArrowDown\n : ArrowUpDown\n }\n size=\"sm\"\n />\n </span>\n </button>\n ) : (\n (column.label ?? column.id)\n )}\n </th>\n );\n })}\n {hasActions ? (\n <th className={styles.actionsCell}>\n <span className={styles.visuallyHidden}>\n {intl.formatMessage(messages.actions)}\n </span>\n </th>\n ) : null}\n </tr>\n </thead>\n <tbody>\n {items.map((item, row) => {\n const selected = selectable && isSelected(item);\n const href = getItemHref?.(item) ?? null;\n const current = isCurrent?.(item) ?? false;\n return (\n <tr\n key={item.id}\n data-selected={selected || undefined}\n data-current={current || undefined}\n >\n {selectable ? (\n <td className={styles.check}>\n <Checkbox\n aria-label={intl.formatMessage(\n messages.selectItem,\n {\n item: getItemLabel(item),\n },\n )}\n isSelected={selected}\n onChange={() => onToggle(item)}\n />\n </td>\n ) : null}\n {columns.map((column, index) => {\n const content =\n index === 0 ? (\n <ItemTitle href={href} current={current}>\n {renderValue(item, column)}\n </ItemTitle>\n ) : (\n renderValue(item, column)\n );\n return (\n <td\n key={column.id}\n className={cx(\n alignClass(column),\n index === 0 && styles.title,\n )}\n >\n <span className={styles.cellLabel}>\n {column.label ?? column.id}\n </span>\n <span>\n {renderCell !== undefined\n ? renderCell(item, column, content)\n : content}\n </span>\n </td>\n );\n })}\n {hasActions ? (\n <td className={styles.actionsCell}>{actions[row]}</td>\n ) : null}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </RowActionsFit>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Field } from '@panneau/protocol';
2
+ /** The time zone of a calendar's field: its `settings.timeZone`, or `null`. */
3
+ export declare function getCalendarTimeZone(field: Field | null | undefined): string | null;
4
+ /**
5
+ * The days an item shows on, within the days shown (`2026-10-26` to `2026-12-06`): the day of a
6
+ * `date` or a `datetime`, in the time zone (the browser's without one), or each day a `daterange`
7
+ * covers (decision 0053). A range open at its end shows on its first day; one open at its start, on
8
+ * its last.
9
+ */
10
+ export declare function getItemDays(value: unknown, shown: {
11
+ first: string;
12
+ last: string;
13
+ }, timeZone?: string | null): string[];
14
+ //# sourceMappingURL=calendarDays.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendarDays.d.ts","sourceRoot":"","sources":["../../src/layouts/calendarDays.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAQ/C,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAIlF;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACvB,KAAK,EAAE,OAAO,EACd,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EACtC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GACzB,MAAM,EAAE,CAoBV"}
@@ -0,0 +1,44 @@
1
+ import { getBoundDay, getDateRangeSettings, isDateRangeValue } from "@panneau/fields/daterange";
2
+ //#region src/layouts/calendarDays.ts
3
+ var DAY_MS = 864e5;
4
+ function addDays(day, count) {
5
+ return new Date(Date.parse(`${day}T00:00:00Z`) + count * DAY_MS).toISOString().slice(0, 10);
6
+ }
7
+ /** The time zone of a calendar's field: its `settings.timeZone`, or `null`. */
8
+ function getCalendarTimeZone(field) {
9
+ return field !== null && field !== void 0 ? getDateRangeSettings({
10
+ ...field.settings,
11
+ time: true
12
+ }).timeZone : null;
13
+ }
14
+ /**
15
+ * The days an item shows on, within the days shown (`2026-10-26` to `2026-12-06`): the day of a
16
+ * `date` or a `datetime`, in the time zone (the browser's without one), or each day a `daterange`
17
+ * covers (decision 0053). A range open at its end shows on its first day; one open at its start, on
18
+ * its last.
19
+ */
20
+ function getItemDays(value, shown, timeZone) {
21
+ if (isDateRangeValue(value)) {
22
+ const zone = value.timeZone ?? timeZone ?? void 0;
23
+ const first = getBoundDay(value.start, zone);
24
+ const last = getBoundDay(value.end, zone);
25
+ if (first === null || last === null) {
26
+ const day = first ?? last;
27
+ return day !== null && day >= shown.first && day <= shown.last ? [day] : [];
28
+ }
29
+ const days = [];
30
+ let day = first > shown.first ? first : shown.first;
31
+ const end = last < shown.last ? last : shown.last;
32
+ while (day <= end) {
33
+ days.push(day);
34
+ day = addDays(day, 1);
35
+ }
36
+ return days;
37
+ }
38
+ const day = typeof value === "string" ? getBoundDay(value, timeZone ?? void 0) : null;
39
+ return day !== null ? [day] : [];
40
+ }
41
+ //#endregion
42
+ export { getCalendarTimeZone, getItemDays };
43
+
44
+ //# sourceMappingURL=calendarDays.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendarDays.js","names":["getBoundDay","getDateRangeSettings","isDateRangeValue","Field","DAY_MS","addDays","day","count","Date","parse","toISOString","slice","getCalendarTimeZone","field","undefined","settings","time","timeZone","getItemDays","value","shown","first","last","zone","start","end","days","push"],"sources":["../../src/layouts/calendarDays.ts"],"sourcesContent":["import { getBoundDay, getDateRangeSettings, isDateRangeValue } from '@panneau/fields/daterange';\nimport type { Field } from '@panneau/protocol';\n\nconst DAY_MS = 86_400_000;\n\nfunction addDays(day: string, count: number): string {\n return new Date(Date.parse(`${day}T00:00:00Z`) + count * DAY_MS).toISOString().slice(0, 10);\n}\n\n/** The time zone of a calendar's field: its `settings.timeZone`, or `null`. */\nexport function getCalendarTimeZone(field: Field | null | undefined): string | null {\n return field !== null && field !== undefined\n ? getDateRangeSettings({ ...field.settings, time: true }).timeZone\n : null;\n}\n\n/**\n * The days an item shows on, within the days shown (`2026-10-26` to `2026-12-06`): the day of a\n * `date` or a `datetime`, in the time zone (the browser's without one), or each day a `daterange`\n * covers (decision 0053). A range open at its end shows on its first day; one open at its start, on\n * its last.\n */\nexport function getItemDays(\n value: unknown,\n shown: { first: string; last: string },\n timeZone?: string | null,\n): string[] {\n if (isDateRangeValue(value)) {\n const zone = value.timeZone ?? timeZone ?? undefined;\n const first = getBoundDay(value.start, zone);\n const last = getBoundDay(value.end, zone);\n if (first === null || last === null) {\n const day = first ?? last;\n return day !== null && day >= shown.first && day <= shown.last ? [day] : [];\n }\n const days: string[] = [];\n let day = first > shown.first ? first : shown.first;\n const end = last < shown.last ? last : shown.last;\n while (day <= end) {\n days.push(day);\n day = addDays(day, 1);\n }\n return days;\n }\n const day = typeof value === 'string' ? getBoundDay(value, timeZone ?? undefined) : null;\n return day !== null ? [day] : [];\n}\n"],"mappings":";;AAGA,IAAMI,SAAS;AAEf,SAASC,QAAQC,KAAaC,OAAuB;CACjD,OAAO,IAAIC,KAAKA,KAAKC,MAAM,GAAGH,IAAG,WAAY,IAAIC,QAAQH,MAAM,CAAC,CAACM,YAAY,CAAC,CAACC,MAAM,GAAG,EAAE;AAC9F;;AAGA,SAAgBC,oBAAoBC,OAAgD;CAChF,OAAOA,UAAU,QAAQA,UAAUC,KAAAA,IAC7Bb,qBAAqB;EAAE,GAAGY,MAAME;EAAUC,MAAM;CAAK,CAAC,CAAC,CAACC,WACxD;AACV;;;;;;;AAQA,SAAgBC,YACZC,OACAC,OACAH,UACQ;CACR,IAAIf,iBAAiBiB,KAAK,GAAG;EACzB,MAAMI,OAAOJ,MAAMF,YAAYA,YAAYH,KAAAA;EAC3C,MAAMO,QAAQrB,YAAYmB,MAAMK,OAAOD,IAAI;EAC3C,MAAMD,OAAOtB,YAAYmB,MAAMM,KAAKF,IAAI;EACxC,IAAIF,UAAU,QAAQC,SAAS,MAAM;GACjC,MAAMhB,MAAMe,SAASC;GACrB,OAAOhB,QAAQ,QAAQA,OAAOc,MAAMC,SAASf,OAAOc,MAAME,OAAO,CAAChB,GAAG,IAAI,CAAA;EAC7E;EACA,MAAMoB,OAAiB,CAAA;EACvB,IAAIpB,MAAMe,QAAQD,MAAMC,QAAQA,QAAQD,MAAMC;EAC9C,MAAMI,MAAMH,OAAOF,MAAME,OAAOA,OAAOF,MAAME;EAC7C,OAAOhB,OAAOmB,KAAK;GACfC,KAAKC,KAAKrB,GAAG;GACbA,MAAMD,QAAQC,KAAK,CAAC;EACxB;EACA,OAAOoB;CACX;CACA,MAAMpB,MAAM,OAAOa,UAAU,WAAWnB,YAAYmB,OAAOF,YAAYH,KAAAA,CAAS,IAAI;CACpF,OAAOR,QAAQ,OAAO,CAACA,GAAG,IAAI,CAAA;AAClC"}
package/dist/query.d.ts CHANGED
@@ -14,8 +14,9 @@ export interface LocalQueryResult<T extends ListItem> {
14
14
  }
15
15
  /**
16
16
  * Applies a list query to items in memory, as a backend would: filters (the value, or one of the
17
- * values, matches as a string; a range matches the values within its bounds), search in every text
18
- * value, sort, then the page. For a product that has every item at hand.
17
+ * values, matches as a string; a range matches the values within its bounds, and the date ranges
18
+ * that overlap them), search in every text value, sort (a date range by its start, money by its
19
+ * amount), then the page. For a product that has every item at hand.
19
20
  */
20
21
  export declare function applyListQuery<T extends ListItem>(items: readonly T[], query: ListQuery, options?: LocalQueryOptions): LocalQueryResult<T>;
21
22
  //# sourceMappingURL=query.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGpD,MAAM,WAAW,iBAAiB;IAC9B,wEAAwE;IACxE,OAAO,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAChC,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,QAAQ;IAChD,6BAA6B;IAC7B,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;CACjB;AAOD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,QAAQ,EAC7C,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,KAAK,EAAE,SAAS,EAChB,OAAO,GAAE,iBAAsB,GAChC,gBAAgB,CAAC,CAAC,CAAC,CA6DrB"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGpD,MAAM,WAAW,iBAAiB;IAC9B,wEAAwE;IACxE,OAAO,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAChC,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,QAAQ;IAChD,6BAA6B;IAC7B,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;CACjB;AAwBD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,QAAQ,EAC7C,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,KAAK,EAAE,SAAS,EAChB,OAAO,GAAE,iBAAsB,GAChC,gBAAgB,CAAC,CAAC,CAAC,CA6DrB"}
package/dist/query.js CHANGED
@@ -6,9 +6,20 @@ function valueOf(item, key, options) {
6
6
  return column !== void 0 ? getColumnValue(item, column, options.locale ?? "en") : item[key];
7
7
  }
8
8
  /**
9
+ * What a value sorts by: the start of a date range (its end when it has none), the amount of money,
10
+ * or the value itself (decision 0053).
11
+ */
12
+ function sortValue(value) {
13
+ if (value === null || typeof value !== "object" || Array.isArray(value)) return value;
14
+ if ("start" in value && "end" in value) return value.start ?? value.end;
15
+ if ("currency" in value && "amount" in value && typeof value.amount === "number") return value.amount;
16
+ return value;
17
+ }
18
+ /**
9
19
  * Applies a list query to items in memory, as a backend would: filters (the value, or one of the
10
- * values, matches as a string; a range matches the values within its bounds), search in every text
11
- * value, sort, then the page. For a product that has every item at hand.
20
+ * values, matches as a string; a range matches the values within its bounds, and the date ranges
21
+ * that overlap them), search in every text value, sort (a date range by its start, money by its
22
+ * amount), then the page. For a product that has every item at hand.
12
23
  */
13
24
  function applyListQuery(items, query, options = {}) {
14
25
  const locale = options.locale ?? "en";
@@ -39,8 +50,8 @@ function applyListQuery(items, query, options = {}) {
39
50
  for (const part of sort) {
40
51
  const descending = part.startsWith("-");
41
52
  const key = descending ? part.slice(1) : part;
42
- const left = valueOf(a, key, options);
43
- const right = valueOf(b, key, options);
53
+ const left = sortValue(valueOf(a, key, options));
54
+ const right = sortValue(valueOf(b, key, options));
44
55
  const order = typeof left === "number" && typeof right === "number" ? left - right : compareText(toText(left, locale), toText(right, locale), collator);
45
56
  if (order !== 0) return descending ? -order : order;
46
57
  }
package/dist/query.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"query.js","names":["ListQuery","isFilterRange","matchesFilterRange","ListColumn","ListItem","getColumnValue","toText","LocalQueryOptions","columns","locale","LocalQueryResult","items","T","total","valueOf","item","key","options","column","find","candidate","id","undefined","applyListQuery","query","result","Object","entries","filter","forEach","expected","accepted","Array","isArray","map","String","value","values","some","includes","q","trim","toLocaleLowerCase","sort","length","collator","Intl","Collator","numeric","sensitivity","a","b","part","descending","startsWith","slice","left","right","order","compareText","perPage","page","compare"],"sources":["../src/query.ts"],"sourcesContent":["import type { ListQuery } from '@panneau/protocol';\nimport { isFilterRange, matchesFilterRange } from '@panneau/protocol/runtime';\n\nimport type { ListColumn, ListItem } from './types';\nimport { getColumnValue, toText } from './values';\n\nexport interface LocalQueryOptions {\n /** The columns: values of localized fields are compared in `locale`. */\n columns?: readonly ListColumn[];\n /** Locale of localized values and of the text comparison. Defaults to `en`. */\n locale?: string;\n}\n\nexport interface LocalQueryResult<T extends ListItem> {\n /** The items of the page. */\n items: T[];\n /** How many items match the filters and the search, on every page. */\n total: number;\n}\n\nfunction valueOf(item: ListItem, key: string, options: LocalQueryOptions): unknown {\n const column = options.columns?.find((candidate) => candidate.id === key);\n return column !== undefined ? getColumnValue(item, column, options.locale ?? 'en') : item[key];\n}\n\n/**\n * Applies a list query to items in memory, as a backend would: filters (the value, or one of the\n * values, matches as a string; a range matches the values within its bounds), search in every text\n * value, sort, then the page. For a product that has every item at hand.\n */\nexport function applyListQuery<T extends ListItem>(\n items: readonly T[],\n query: ListQuery,\n options: LocalQueryOptions = {},\n): LocalQueryResult<T> {\n const locale = options.locale ?? 'en';\n let result = [...items];\n Object.entries(query.filter ?? {}).forEach(([key, expected]) => {\n if (isFilterRange(expected)) {\n result = result.filter((item) =>\n matchesFilterRange(valueOf(item, key, options), expected),\n );\n return;\n }\n const accepted = (Array.isArray(expected) ? expected : [expected]).map(String);\n result = result.filter((item) => {\n const value = valueOf(item, key, options);\n const values: unknown[] = Array.isArray(value) ? value : [value];\n return values.some((candidate) => {\n const id =\n candidate !== null && typeof candidate === 'object' && 'id' in candidate\n ? candidate.id\n : candidate;\n return accepted.includes(String(id));\n });\n });\n });\n const q = query.q?.trim().toLocaleLowerCase(locale) ?? '';\n if (q !== '') {\n result = result.filter((item) =>\n Object.entries(item)\n .filter(([key]) => key !== 'id' && key !== 'abilities' && key !== 'version')\n .some(([key]) =>\n toText(valueOf(item, key, options), locale)\n .toLocaleLowerCase(locale)\n .includes(q),\n ),\n );\n }\n const sort = query.sort ?? [];\n if (sort.length > 0) {\n const collator = new Intl.Collator(locale, { numeric: true, sensitivity: 'base' });\n result.sort((a, b) => {\n for (const part of sort) {\n const descending = part.startsWith('-');\n const key = descending ? part.slice(1) : part;\n const left = valueOf(a, key, options);\n const right = valueOf(b, key, options);\n const order =\n typeof left === 'number' && typeof right === 'number'\n ? left - right\n : compareText(toText(left, locale), toText(right, locale), collator);\n if (order !== 0) {\n return descending ? -order : order;\n }\n }\n return 0;\n });\n }\n const total = result.length;\n if (query.perPage !== undefined) {\n const page = query.page ?? 1;\n result = result.slice((page - 1) * query.perPage, page * query.perPage);\n }\n return { items: result, total };\n}\n\n/** Compares texts, empty ones last. */\nfunction compareText(left: string, right: string, collator: Intl.Collator): number {\n if (left === right) {\n return 0;\n }\n if (left === '') {\n return 1;\n }\n if (right === '') {\n return -1;\n }\n return collator.compare(left, right);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"query.js","names":["ListQuery","isFilterRange","matchesFilterRange","ListColumn","ListItem","getColumnValue","toText","LocalQueryOptions","columns","locale","LocalQueryResult","items","T","total","valueOf","item","key","options","column","find","candidate","id","undefined","sortValue","value","Array","isArray","start","end","amount","applyListQuery","query","result","Object","entries","filter","forEach","expected","accepted","map","String","values","some","includes","q","trim","toLocaleLowerCase","sort","length","collator","Intl","Collator","numeric","sensitivity","a","b","part","descending","startsWith","slice","left","right","order","compareText","perPage","page","compare"],"sources":["../src/query.ts"],"sourcesContent":["import type { ListQuery } from '@panneau/protocol';\nimport { isFilterRange, matchesFilterRange } from '@panneau/protocol/runtime';\n\nimport type { ListColumn, ListItem } from './types';\nimport { getColumnValue, toText } from './values';\n\nexport interface LocalQueryOptions {\n /** The columns: values of localized fields are compared in `locale`. */\n columns?: readonly ListColumn[];\n /** Locale of localized values and of the text comparison. Defaults to `en`. */\n locale?: string;\n}\n\nexport interface LocalQueryResult<T extends ListItem> {\n /** The items of the page. */\n items: T[];\n /** How many items match the filters and the search, on every page. */\n total: number;\n}\n\nfunction valueOf(item: ListItem, key: string, options: LocalQueryOptions): unknown {\n const column = options.columns?.find((candidate) => candidate.id === key);\n return column !== undefined ? getColumnValue(item, column, options.locale ?? 'en') : item[key];\n}\n\n/**\n * What a value sorts by: the start of a date range (its end when it has none), the amount of money,\n * or the value itself (decision 0053).\n */\nfunction sortValue(value: unknown): unknown {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n return value;\n }\n if ('start' in value && 'end' in value) {\n return value.start ?? value.end;\n }\n if ('currency' in value && 'amount' in value && typeof value.amount === 'number') {\n return value.amount;\n }\n return value;\n}\n\n/**\n * Applies a list query to items in memory, as a backend would: filters (the value, or one of the\n * values, matches as a string; a range matches the values within its bounds, and the date ranges\n * that overlap them), search in every text value, sort (a date range by its start, money by its\n * amount), then the page. For a product that has every item at hand.\n */\nexport function applyListQuery<T extends ListItem>(\n items: readonly T[],\n query: ListQuery,\n options: LocalQueryOptions = {},\n): LocalQueryResult<T> {\n const locale = options.locale ?? 'en';\n let result = [...items];\n Object.entries(query.filter ?? {}).forEach(([key, expected]) => {\n if (isFilterRange(expected)) {\n result = result.filter((item) =>\n matchesFilterRange(valueOf(item, key, options), expected),\n );\n return;\n }\n const accepted = (Array.isArray(expected) ? expected : [expected]).map(String);\n result = result.filter((item) => {\n const value = valueOf(item, key, options);\n const values: unknown[] = Array.isArray(value) ? value : [value];\n return values.some((candidate) => {\n const id =\n candidate !== null && typeof candidate === 'object' && 'id' in candidate\n ? candidate.id\n : candidate;\n return accepted.includes(String(id));\n });\n });\n });\n const q = query.q?.trim().toLocaleLowerCase(locale) ?? '';\n if (q !== '') {\n result = result.filter((item) =>\n Object.entries(item)\n .filter(([key]) => key !== 'id' && key !== 'abilities' && key !== 'version')\n .some(([key]) =>\n toText(valueOf(item, key, options), locale)\n .toLocaleLowerCase(locale)\n .includes(q),\n ),\n );\n }\n const sort = query.sort ?? [];\n if (sort.length > 0) {\n const collator = new Intl.Collator(locale, { numeric: true, sensitivity: 'base' });\n result.sort((a, b) => {\n for (const part of sort) {\n const descending = part.startsWith('-');\n const key = descending ? part.slice(1) : part;\n const left = sortValue(valueOf(a, key, options));\n const right = sortValue(valueOf(b, key, options));\n const order =\n typeof left === 'number' && typeof right === 'number'\n ? left - right\n : compareText(toText(left, locale), toText(right, locale), collator);\n if (order !== 0) {\n return descending ? -order : order;\n }\n }\n return 0;\n });\n }\n const total = result.length;\n if (query.perPage !== undefined) {\n const page = query.page ?? 1;\n result = result.slice((page - 1) * query.perPage, page * query.perPage);\n }\n return { items: result, total };\n}\n\n/** Compares texts, empty ones last. */\nfunction compareText(left: string, right: string, collator: Intl.Collator): number {\n if (left === right) {\n return 0;\n }\n if (left === '') {\n return 1;\n }\n if (right === '') {\n return -1;\n }\n return collator.compare(left, right);\n}\n"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -110,8 +110,16 @@ export interface FilterControlProps {
110
110
  export type FilterEntry = ComponentType<FilterControlProps>;
111
111
  /** What the `calendar` layout shows: the month of its items, and how to change it (decision 0044). */
112
112
  export interface ListCalendarProps {
113
- /** The `date` or `datetime` field each item is shown on the day of. */
113
+ /**
114
+ * The `date`, `datetime` or `daterange` field each item is shown on the day of, or on each day
115
+ * of its range (decision 0053).
116
+ */
114
117
  field: string;
118
+ /**
119
+ * The time zone of the field's date-times (`settings.timeZone`), whose days the calendar
120
+ * shows. Without it, the browser's.
121
+ */
122
+ timeZone?: string | null | undefined;
115
123
  /** The month shown (`2026-11`). */
116
124
  month: string;
117
125
  onMonthChange: (month: string) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@panneau/lists",
3
- "version": "5.0.0-alpha.15",
3
+ "version": "5.0.0-alpha.17",
4
4
  "description": "Lists of Panneau: columns with displays, table and cards layouts, sorting, filters, search, pagination, selection and actions, driven by the list state of @panneau/core.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -37,14 +37,14 @@
37
37
  "react-intl": "^12.0.0"
38
38
  },
39
39
  "dependencies": {
40
- "@panneau/core": "5.0.0-alpha.15",
41
- "@panneau/fields": "5.0.0-alpha.15",
42
- "@panneau/intl": "5.0.0-alpha.15",
43
- "@panneau/protocol": "5.0.0-alpha.15",
44
- "@panneau/ui": "5.0.0-alpha.15",
40
+ "@panneau/core": "5.0.0-alpha.17",
41
+ "@panneau/fields": "5.0.0-alpha.17",
42
+ "@panneau/intl": "5.0.0-alpha.17",
43
+ "@panneau/protocol": "5.0.0-alpha.17",
44
+ "@panneau/ui": "5.0.0-alpha.17",
45
45
  "lucide-react": "^1.57.0"
46
46
  },
47
47
  "devDependencies": {
48
- "@panneau/data": "5.0.0-alpha.15"
48
+ "@panneau/data": "5.0.0-alpha.17"
49
49
  }
50
50
  }