@panneau/lists 5.0.0-alpha.2 → 5.0.0-alpha.21

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 (165) hide show
  1. package/README.md +17 -15
  2. package/dist/ItemDetails.css +50 -0
  3. package/dist/ItemDetails.d.ts +27 -0
  4. package/dist/ItemDetails.d.ts.map +1 -0
  5. package/dist/ItemDetails.js +134 -0
  6. package/dist/ItemDetails.js.map +1 -0
  7. package/dist/ItemDetails.module.js +20 -0
  8. package/dist/ItemDetails.module.js.map +1 -0
  9. package/dist/List.d.ts +3 -3
  10. package/dist/List.d.ts.map +1 -1
  11. package/dist/List.js +31 -10
  12. package/dist/List.js.map +1 -1
  13. package/dist/ListSkeleton.d.ts +19 -0
  14. package/dist/ListSkeleton.d.ts.map +1 -0
  15. package/dist/ListSkeleton.js +115 -0
  16. package/dist/ListSkeleton.js.map +1 -0
  17. package/dist/ListView.d.ts +73 -8
  18. package/dist/ListView.d.ts.map +1 -1
  19. package/dist/ListView.js +616 -218
  20. package/dist/ListView.js.map +1 -1
  21. package/dist/actions/ActionButton.d.ts +8 -2
  22. package/dist/actions/ActionButton.d.ts.map +1 -1
  23. package/dist/actions/ActionButton.js +98 -26
  24. package/dist/actions/ActionButton.js.map +1 -1
  25. package/dist/actions/Actions.css +16 -38
  26. package/dist/actions/Actions.module.js +6 -6
  27. package/dist/actions/Actions.module.js.map +1 -1
  28. package/dist/actions/ConfirmDialog.d.ts +20 -4
  29. package/dist/actions/ConfirmDialog.d.ts.map +1 -1
  30. package/dist/actions/ConfirmDialog.js +110 -92
  31. package/dist/actions/ConfirmDialog.js.map +1 -1
  32. package/dist/actions/RowActions.d.ts +25 -9
  33. package/dist/actions/RowActions.d.ts.map +1 -1
  34. package/dist/actions/RowActions.js +151 -80
  35. package/dist/actions/RowActions.js.map +1 -1
  36. package/dist/actions/actions.d.ts +5 -4
  37. package/dist/actions/actions.d.ts.map +1 -1
  38. package/dist/actions/actions.js +7 -14
  39. package/dist/actions/actions.js.map +1 -1
  40. package/dist/actions/fit.d.ts +25 -0
  41. package/dist/actions/fit.d.ts.map +1 -0
  42. package/dist/actions/fit.js +197 -0
  43. package/dist/actions/fit.js.map +1 -0
  44. package/dist/actions/icons.d.ts +5 -0
  45. package/dist/actions/icons.d.ts.map +1 -1
  46. package/dist/actions/icons.js +15 -1
  47. package/dist/actions/icons.js.map +1 -1
  48. package/dist/columns.d.ts +10 -0
  49. package/dist/columns.d.ts.map +1 -0
  50. package/dist/columns.js +25 -0
  51. package/dist/columns.js.map +1 -0
  52. package/dist/cx.js.map +1 -1
  53. package/dist/displays/Displays.css +48 -0
  54. package/dist/displays/Displays.module.js +18 -2
  55. package/dist/displays/Displays.module.js.map +1 -1
  56. package/dist/displays/displays.d.ts +62 -6
  57. package/dist/displays/displays.d.ts.map +1 -1
  58. package/dist/displays/displays.js +1151 -89
  59. package/dist/displays/displays.js.map +1 -1
  60. package/dist/filters/Filters.css +25 -11
  61. package/dist/filters/Filters.d.ts +1 -1
  62. package/dist/filters/Filters.js.map +1 -1
  63. package/dist/filters/Filters.module.js +5 -1
  64. package/dist/filters/Filters.module.js.map +1 -1
  65. package/dist/filters/controls.d.ts +1 -1
  66. package/dist/filters/controls.d.ts.map +1 -1
  67. package/dist/filters/controls.js +57 -35
  68. package/dist/filters/controls.js.map +1 -1
  69. package/dist/filters/format.d.ts +1 -1
  70. package/dist/filters/format.js.map +1 -1
  71. package/dist/images.d.ts +7 -0
  72. package/dist/images.d.ts.map +1 -0
  73. package/dist/images.js +39 -0
  74. package/dist/images.js.map +1 -0
  75. package/dist/index.d.ts +22 -18
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +7 -3
  78. package/dist/inline/Inline.css +58 -0
  79. package/dist/inline/Inline.module.js +20 -0
  80. package/dist/inline/Inline.module.js.map +1 -0
  81. package/dist/inline/InlineCell.d.ts +29 -0
  82. package/dist/inline/InlineCell.d.ts.map +1 -0
  83. package/dist/inline/InlineCell.js +490 -0
  84. package/dist/inline/InlineCell.js.map +1 -0
  85. package/dist/inline/editable.d.ts +12 -0
  86. package/dist/inline/editable.d.ts.map +1 -0
  87. package/dist/inline/editable.js +29 -0
  88. package/dist/inline/editable.js.map +1 -0
  89. package/dist/layouts/CalendarLayout.css +153 -0
  90. package/dist/layouts/CalendarLayout.d.ts +9 -0
  91. package/dist/layouts/CalendarLayout.d.ts.map +1 -0
  92. package/dist/layouts/CalendarLayout.js +303 -0
  93. package/dist/layouts/CalendarLayout.js.map +1 -0
  94. package/dist/layouts/CalendarLayout.module.js +28 -0
  95. package/dist/layouts/CalendarLayout.module.js.map +1 -0
  96. package/dist/layouts/CardsLayout.css +5 -0
  97. package/dist/layouts/CardsLayout.d.ts +2 -2
  98. package/dist/layouts/CardsLayout.d.ts.map +1 -1
  99. package/dist/layouts/CardsLayout.js +92 -91
  100. package/dist/layouts/CardsLayout.js.map +1 -1
  101. package/dist/layouts/CardsLayout.module.js.map +1 -1
  102. package/dist/layouts/GalleryLayout.css +87 -0
  103. package/dist/layouts/GalleryLayout.d.ts +8 -0
  104. package/dist/layouts/GalleryLayout.d.ts.map +1 -0
  105. package/dist/layouts/GalleryLayout.js +152 -0
  106. package/dist/layouts/GalleryLayout.js.map +1 -0
  107. package/dist/layouts/GalleryLayout.module.js +26 -0
  108. package/dist/layouts/GalleryLayout.module.js.map +1 -0
  109. package/dist/layouts/ItemTitle.d.ts +3 -1
  110. package/dist/layouts/ItemTitle.d.ts.map +1 -1
  111. package/dist/layouts/ItemTitle.js +12 -8
  112. package/dist/layouts/ItemTitle.js.map +1 -1
  113. package/dist/layouts/TableLayout.css +56 -0
  114. package/dist/layouts/TableLayout.d.ts +5 -4
  115. package/dist/layouts/TableLayout.d.ts.map +1 -1
  116. package/dist/layouts/TableLayout.js +171 -101
  117. package/dist/layouts/TableLayout.js.map +1 -1
  118. package/dist/layouts/TableLayout.module.js +8 -4
  119. package/dist/layouts/TableLayout.module.js.map +1 -1
  120. package/dist/layouts/builtIn.d.ts +2 -2
  121. package/dist/layouts/builtIn.d.ts.map +1 -1
  122. package/dist/layouts/builtIn.js +6 -2
  123. package/dist/layouts/builtIn.js.map +1 -1
  124. package/dist/layouts/calendarDays.d.ts +14 -0
  125. package/dist/layouts/calendarDays.d.ts.map +1 -0
  126. package/dist/layouts/calendarDays.js +44 -0
  127. package/dist/layouts/calendarDays.js.map +1 -0
  128. package/dist/plugin.d.ts +1 -1
  129. package/dist/plugin.js.map +1 -1
  130. package/dist/query.d.ts +4 -3
  131. package/dist/query.d.ts.map +1 -1
  132. package/dist/query.js +15 -4
  133. package/dist/query.js.map +1 -1
  134. package/dist/selection.d.ts +1 -1
  135. package/dist/selection.js.map +1 -1
  136. package/dist/toolbar/ColumnMenu.d.ts +17 -0
  137. package/dist/toolbar/ColumnMenu.d.ts.map +1 -0
  138. package/dist/toolbar/ColumnMenu.js +193 -0
  139. package/dist/toolbar/ColumnMenu.js.map +1 -0
  140. package/dist/toolbar/LayoutSwitch.d.ts.map +1 -1
  141. package/dist/toolbar/LayoutSwitch.js +73 -55
  142. package/dist/toolbar/LayoutSwitch.js.map +1 -1
  143. package/dist/toolbar/Pagination.d.ts +33 -0
  144. package/dist/toolbar/Pagination.d.ts.map +1 -1
  145. package/dist/toolbar/Pagination.js +282 -42
  146. package/dist/toolbar/Pagination.js.map +1 -1
  147. package/dist/toolbar/SearchField.js.map +1 -1
  148. package/dist/toolbar/SortSelect.d.ts +1 -1
  149. package/dist/toolbar/SortSelect.js.map +1 -1
  150. package/dist/toolbar/Toolbar.css +36 -0
  151. package/dist/toolbar/Toolbar.module.js +12 -2
  152. package/dist/toolbar/Toolbar.module.js.map +1 -1
  153. package/dist/types.d.ts +69 -1
  154. package/dist/types.d.ts.map +1 -1
  155. package/dist/useDraft.js.map +1 -1
  156. package/dist/useListState.js.map +1 -1
  157. package/dist/useRenderValue.d.ts +10 -0
  158. package/dist/useRenderValue.d.ts.map +1 -0
  159. package/dist/useRenderValue.js +84 -0
  160. package/dist/useRenderValue.js.map +1 -0
  161. package/dist/values.d.ts +4 -1
  162. package/dist/values.d.ts.map +1 -1
  163. package/dist/values.js +6 -2
  164. package/dist/values.js.map +1 -1
  165. package/package.json +9 -9
@@ -27,6 +27,12 @@
27
27
  background-color: var(--panneau-color-surface-sunken);
28
28
  }
29
29
 
30
+ /* The title stays readable in a narrow list, such as next to an item's details: the table
31
+ * scrolls instead. */
32
+ .panneau-table-layout-table td.panneau-table-layout-title {
33
+ min-width: 12rem;
34
+ }
35
+
30
36
  .panneau-table-layout-table tbody tr:last-child td {
31
37
  border-bottom: 0;
32
38
  }
@@ -35,6 +41,46 @@
35
41
  background-color: var(--panneau-color-accent-subtle);
36
42
  }
37
43
 
44
+ /* The item shown next to the list: a bar on its first cell. */
45
+ .panneau-table-layout-table tbody tr[data-current] td:first-child {
46
+ box-shadow: inset 3px 0 0 var(--panneau-color-accent);
47
+ }
48
+
49
+ .panneau-table-layout-table tbody tr[data-current] {
50
+ background-color: var(--panneau-color-hover);
51
+ }
52
+
53
+ /* The thumbnail of an item, before its title (decision 0061). */
54
+ .panneau-table-layout-with-thumbnail {
55
+ display: flex;
56
+ align-items: center;
57
+ gap: var(--panneau-space-3);
58
+ }
59
+
60
+ .panneau-table-layout-with-thumbnail > :last-child {
61
+ min-width: 0;
62
+ }
63
+
64
+ .panneau-table-layout-thumbnail {
65
+ display: flex;
66
+ flex: none;
67
+ align-items: center;
68
+ justify-content: center;
69
+ width: 2.5rem;
70
+ height: 2.5rem;
71
+ overflow: hidden;
72
+ color: var(--panneau-color-text-muted);
73
+ background-color: var(--panneau-color-surface-sunken);
74
+ border-radius: var(--panneau-radius-sm);
75
+ }
76
+
77
+ .panneau-table-layout-thumbnail img {
78
+ display: block;
79
+ width: 100%;
80
+ height: 100%;
81
+ object-fit: cover;
82
+ }
83
+
38
84
  .panneau-table-layout-center {
39
85
  text-align: center !important;
40
86
  }
@@ -53,6 +99,11 @@
53
99
  white-space: nowrap;
54
100
  }
55
101
 
102
+ /* As narrow as the actions of the row on one line: they only wrap in a narrow list. */
103
+ .panneau-table-layout-table .panneau-table-layout-actions-cell > * {
104
+ flex-wrap: nowrap;
105
+ }
106
+
56
107
  .panneau-table-layout-sort {
57
108
  display: inline-flex;
58
109
  align-items: center;
@@ -146,6 +197,10 @@
146
197
  width: auto;
147
198
  }
148
199
 
200
+ .panneau-table-layout-table td.panneau-table-layout-actions-cell > * {
201
+ flex-wrap: wrap;
202
+ }
203
+
149
204
  .panneau-table-layout-table td.panneau-table-layout-check {
150
205
  position: absolute;
151
206
  top: var(--panneau-space-2);
@@ -161,6 +216,7 @@
161
216
 
162
217
  .panneau-table-layout-table td.panneau-table-layout-title {
163
218
  display: block;
219
+ min-width: 0;
164
220
  padding-inline-end: var(--panneau-space-10);
165
221
  font-weight: var(--panneau-font-weight-medium);
166
222
  }
@@ -1,9 +1,10 @@
1
- import type { ListColumn, ListLayoutProps } from '../types';
1
+ import type { ListColumn, ListLayoutProps } from '../types.js';
2
2
  /** The sort direction of a column, from the first `sort` value. */
3
3
  export declare function getSortDirection(sort: readonly string[], column: ListColumn): 'ascending' | 'descending' | null;
4
4
  /**
5
- * Items as a table, with sortable column headers. On narrow lists (phones), each row turns into a
6
- * block that shows the label of each value.
5
+ * Items as a table, with sortable column headers. With the image of items (`getItemImage`), each
6
+ * title starts with a thumbnail. On narrow lists (phones), each row turns into a block that shows
7
+ * the label of each value.
7
8
  */
8
- export declare function TableLayout({ items, columns, renderValue, getItemLabel, getItemHref, selectable, isSelected, onToggle, renderActions, sort, onSort, label, pageSelection, }: ListLayoutProps): import("react").JSX.Element;
9
+ export declare function TableLayout({ items, columns, renderValue, getItemLabel, getItemHref, getItemImage, isCurrent, selectable, isSelected, onToggle, renderActions, sort, onSort, label, pageSelection, renderCell, }: ListLayoutProps): import("react").JSX.Element;
9
10
  //# sourceMappingURL=TableLayout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TableLayout.d.ts","sourceRoot":"","sources":["../../src/layouts/TableLayout.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAI5D,mEAAmE;AACnE,wBAAgB,gBAAgB,CAC5B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,MAAM,EAAE,UAAU,GACnB,WAAW,GAAG,YAAY,GAAG,IAAI,CAMnC;AASD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EACxB,KAAK,EACL,OAAO,EACP,WAAW,EACX,YAAY,EACZ,WAAW,EACX,UAAU,EACV,UAAU,EACV,QAAQ,EACR,aAAa,EACb,IAAI,EACJ,MAAM,EACN,KAAK,EACL,aAAa,GAChB,EAAE,eAAe,+BAiHjB"}
1
+ {"version":3,"file":"TableLayout.d.ts","sourceRoot":"","sources":["../../src/layouts/TableLayout.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAI5D,mEAAmE;AACnE,wBAAgB,gBAAgB,CAC5B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,MAAM,EAAE,UAAU,GACnB,WAAW,GAAG,YAAY,GAAG,IAAI,CAMnC;AAyBD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EACxB,KAAK,EACL,OAAO,EACP,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,SAAS,EACT,UAAU,EACV,UAAU,EACV,QAAQ,EACR,aAAa,EACb,IAAI,EACJ,MAAM,EACN,KAAK,EACL,aAAa,EACb,UAAU,GACb,EAAE,eAAe,+BA8IjB"}
@@ -1,11 +1,12 @@
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";
6
7
  import { Checkbox, Icon, usePanneauIntl } from "@panneau/ui";
7
8
  import { jsx, jsxs } from "react/jsx-runtime";
8
- import { ArrowDown, ArrowUp, ArrowUpDown } from "lucide-react";
9
+ import { ArrowDown, ArrowUp, ArrowUpDown, ImageOff } from "lucide-react";
9
10
  //#region src/layouts/TableLayout.tsx
10
11
  /** The sort direction of a column, from the first `sort` value. */
11
12
  function getSortDirection(sort, column) {
@@ -18,12 +19,39 @@ function alignClass(column) {
18
19
  return column.align === "end" ? TableLayout_module_default.end : void 0;
19
20
  }
20
21
  /**
21
- * Items as a table, with sortable column headers. On narrow lists (phones), each row turns into a
22
- * block that shows the label of each value.
22
+ * The thumbnail of an item, before its title (decision 0061): a square of its image, loaded when it
23
+ * comes into view, or a placeholder. It has no text: the title is next to it.
24
+ */
25
+ function Thumbnail(t0) {
26
+ const $ = c(2);
27
+ const { url } = t0;
28
+ let t1;
29
+ if ($[0] !== url) {
30
+ t1 = /* @__PURE__ */ jsx("span", {
31
+ className: TableLayout_module_default.thumbnail,
32
+ children: url !== null ? /* @__PURE__ */ jsx("img", {
33
+ src: url,
34
+ alt: "",
35
+ loading: "lazy",
36
+ decoding: "async"
37
+ }) : /* @__PURE__ */ jsx(Icon, {
38
+ icon: ImageOff,
39
+ size: "sm"
40
+ })
41
+ });
42
+ $[0] = url;
43
+ $[1] = t1;
44
+ } else t1 = $[1];
45
+ return t1;
46
+ }
47
+ /**
48
+ * Items as a table, with sortable column headers. With the image of items (`getItemImage`), each
49
+ * title starts with a thumbnail. On narrow lists (phones), each row turns into a block that shows
50
+ * the label of each value.
23
51
  */
24
52
  function TableLayout(t0) {
25
- const $ = c(52);
26
- const { items, columns, renderValue, getItemLabel, getItemHref, selectable, isSelected, onToggle, renderActions, sort, onSort, label, pageSelection } = t0;
53
+ const $ = c(67);
54
+ const { items, columns, renderValue, getItemLabel, getItemHref, getItemImage, isCurrent, selectable, isSelected, onToggle, renderActions, sort, onSort, label, pageSelection, renderCell } = t0;
27
55
  const intl = usePanneauIntl();
28
56
  let actions;
29
57
  let t1;
@@ -46,20 +74,28 @@ function TableLayout(t0) {
46
74
  }
47
75
  const hasActions = t1;
48
76
  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;
77
+ if ($[6] !== columns || $[7] !== items) {
78
+ t2 = fitContent(items, columns);
79
+ $[6] = columns;
80
+ $[7] = items;
56
81
  $[8] = t2;
57
82
  } else t2 = $[8];
83
+ const [fitLevel, measureList] = useRowActionsFit(t2);
58
84
  let t3;
59
- if ($[9] !== columns || $[10] !== onSort || $[11] !== sort) {
60
- let t4;
61
- if ($[13] !== onSort || $[14] !== sort) {
62
- t4 = (column) => {
85
+ if ($[9] !== pageSelection || $[10] !== selectable) {
86
+ t3 = selectable ? /* @__PURE__ */ jsx("th", {
87
+ className: TableLayout_module_default.check,
88
+ children: pageSelection
89
+ }) : null;
90
+ $[9] = pageSelection;
91
+ $[10] = selectable;
92
+ $[11] = t3;
93
+ } else t3 = $[11];
94
+ let t4;
95
+ if ($[12] !== columns || $[13] !== onSort || $[14] !== sort) {
96
+ let t5;
97
+ if ($[16] !== onSort || $[17] !== sort) {
98
+ t5 = (column) => {
63
99
  const direction = getSortDirection(sort, column);
64
100
  return /* @__PURE__ */ jsx("th", {
65
101
  scope: "col",
@@ -80,50 +116,52 @@ function TableLayout(t0) {
80
116
  }) : column.label ?? column.id
81
117
  }, column.id);
82
118
  };
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", {
119
+ $[16] = onSort;
120
+ $[17] = sort;
121
+ $[18] = t5;
122
+ } else t5 = $[18];
123
+ t4 = columns.map(t5);
124
+ $[12] = columns;
125
+ $[13] = onSort;
126
+ $[14] = sort;
127
+ $[15] = t4;
128
+ } else t4 = $[15];
129
+ let t5;
130
+ if ($[19] !== hasActions || $[20] !== intl) {
131
+ t5 = hasActions ? /* @__PURE__ */ jsx("th", {
96
132
  className: TableLayout_module_default.actionsCell,
97
133
  children: /* @__PURE__ */ jsx("span", {
98
134
  className: TableLayout_module_default.visuallyHidden,
99
135
  children: intl.formatMessage(messages.actions)
100
136
  })
101
137
  }) : 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,
138
+ $[19] = hasActions;
139
+ $[20] = intl;
140
+ $[21] = t5;
141
+ } else t5 = $[21];
142
+ let t6;
143
+ if ($[22] !== t3 || $[23] !== t4 || $[24] !== t5) {
144
+ t6 = /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
110
145
  t3,
111
- t4
146
+ t4,
147
+ t5
112
148
  ] }) });
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] !== isSelected || $[30] !== items || $[31] !== onToggle || $[32] !== renderValue || $[33] !== selectable) {
120
- let t7;
121
- if ($[35] !== actions || $[36] !== columns || $[37] !== getItemHref || $[38] !== getItemLabel || $[39] !== hasActions || $[40] !== intl || $[41] !== isSelected || $[42] !== onToggle || $[43] !== renderValue || $[44] !== selectable) {
122
- t7 = (item_0, row) => {
149
+ $[22] = t3;
150
+ $[23] = t4;
151
+ $[24] = t5;
152
+ $[25] = t6;
153
+ } else t6 = $[25];
154
+ let t7;
155
+ if ($[26] !== actions || $[27] !== columns || $[28] !== getItemHref || $[29] !== getItemImage || $[30] !== getItemLabel || $[31] !== hasActions || $[32] !== intl || $[33] !== isCurrent || $[34] !== isSelected || $[35] !== items || $[36] !== onToggle || $[37] !== renderCell || $[38] !== renderValue || $[39] !== selectable) {
156
+ let t8;
157
+ if ($[41] !== actions || $[42] !== columns || $[43] !== getItemHref || $[44] !== getItemImage || $[45] !== getItemLabel || $[46] !== hasActions || $[47] !== intl || $[48] !== isCurrent || $[49] !== isSelected || $[50] !== onToggle || $[51] !== renderCell || $[52] !== renderValue || $[53] !== selectable) {
158
+ t8 = (item_0, row) => {
123
159
  const selected = selectable && isSelected(item_0);
124
160
  const href = getItemHref?.(item_0) ?? null;
161
+ const current = isCurrent?.(item_0) ?? false;
125
162
  return /* @__PURE__ */ jsxs("tr", {
126
163
  "data-selected": selected || void 0,
164
+ "data-current": current || void 0,
127
165
  children: [
128
166
  selectable ? /* @__PURE__ */ jsx("td", {
129
167
  className: TableLayout_module_default.check,
@@ -133,16 +171,24 @@ function TableLayout(t0) {
133
171
  onChange: () => onToggle(item_0)
134
172
  })
135
173
  }) : null,
136
- columns.map((column_0, index) => /* @__PURE__ */ jsxs("td", {
137
- className: cx(alignClass(column_0), index === 0 && TableLayout_module_default.title),
138
- children: [/* @__PURE__ */ jsx("span", {
139
- className: TableLayout_module_default.cellLabel,
140
- children: column_0.label ?? column_0.id
141
- }), /* @__PURE__ */ jsx("span", { children: index === 0 ? /* @__PURE__ */ jsx(ItemTitle, {
174
+ columns.map((column_0, index) => {
175
+ const content = index === 0 ? /* @__PURE__ */ jsx(ItemTitle, {
142
176
  href,
177
+ current,
143
178
  children: renderValue(item_0, column_0)
144
- }) : renderValue(item_0, column_0) })]
145
- }, column_0.id)),
179
+ }) : renderValue(item_0, column_0);
180
+ const cell = /* @__PURE__ */ jsx("span", { children: renderCell !== void 0 ? renderCell(item_0, column_0, content) : content });
181
+ return /* @__PURE__ */ jsxs("td", {
182
+ className: cx(alignClass(column_0), index === 0 && TableLayout_module_default.title),
183
+ children: [/* @__PURE__ */ jsx("span", {
184
+ className: TableLayout_module_default.cellLabel,
185
+ children: column_0.label ?? column_0.id
186
+ }), index === 0 && getItemImage !== void 0 ? /* @__PURE__ */ jsxs("span", {
187
+ className: TableLayout_module_default.withThumbnail,
188
+ children: [/* @__PURE__ */ jsx(Thumbnail, { url: getItemImage(item_0) }), cell]
189
+ }) : cell]
190
+ }, column_0.id);
191
+ }),
146
192
  hasActions ? /* @__PURE__ */ jsx("td", {
147
193
  className: TableLayout_module_default.actionsCell,
148
194
  children: actions[row]
@@ -150,54 +196,78 @@ function TableLayout(t0) {
150
196
  ]
151
197
  }, item_0.id);
152
198
  };
153
- $[35] = actions;
154
- $[36] = columns;
155
- $[37] = getItemHref;
156
- $[38] = getItemLabel;
157
- $[39] = hasActions;
158
- $[40] = intl;
159
- $[41] = isSelected;
160
- $[42] = onToggle;
161
- $[43] = renderValue;
162
- $[44] = selectable;
163
- $[45] = t7;
164
- } else t7 = $[45];
165
- t6 = items.map(t7);
166
- $[23] = actions;
167
- $[24] = columns;
168
- $[25] = getItemHref;
169
- $[26] = getItemLabel;
170
- $[27] = hasActions;
171
- $[28] = intl;
172
- $[29] = isSelected;
173
- $[30] = items;
174
- $[31] = onToggle;
175
- $[32] = renderValue;
176
- $[33] = selectable;
177
- $[34] = t6;
178
- } else t6 = $[34];
179
- let t7;
180
- if ($[46] !== t6) {
181
- t7 = /* @__PURE__ */ jsx("tbody", { children: t6 });
182
- $[46] = t6;
183
- $[47] = t7;
184
- } else t7 = $[47];
199
+ $[41] = actions;
200
+ $[42] = columns;
201
+ $[43] = getItemHref;
202
+ $[44] = getItemImage;
203
+ $[45] = getItemLabel;
204
+ $[46] = hasActions;
205
+ $[47] = intl;
206
+ $[48] = isCurrent;
207
+ $[49] = isSelected;
208
+ $[50] = onToggle;
209
+ $[51] = renderCell;
210
+ $[52] = renderValue;
211
+ $[53] = selectable;
212
+ $[54] = t8;
213
+ } else t8 = $[54];
214
+ t7 = items.map(t8);
215
+ $[26] = actions;
216
+ $[27] = columns;
217
+ $[28] = getItemHref;
218
+ $[29] = getItemImage;
219
+ $[30] = getItemLabel;
220
+ $[31] = hasActions;
221
+ $[32] = intl;
222
+ $[33] = isCurrent;
223
+ $[34] = isSelected;
224
+ $[35] = items;
225
+ $[36] = onToggle;
226
+ $[37] = renderCell;
227
+ $[38] = renderValue;
228
+ $[39] = selectable;
229
+ $[40] = t7;
230
+ } else t7 = $[40];
185
231
  let t8;
186
- if ($[48] !== label || $[49] !== t5 || $[50] !== t7) {
187
- t8 = /* @__PURE__ */ jsx("div", {
232
+ if ($[55] !== t7) {
233
+ t8 = /* @__PURE__ */ jsx("tbody", { children: t7 });
234
+ $[55] = t7;
235
+ $[56] = t8;
236
+ } else t8 = $[56];
237
+ let t9;
238
+ if ($[57] !== label || $[58] !== t6 || $[59] !== t8) {
239
+ t9 = /* @__PURE__ */ jsxs("table", {
240
+ className: TableLayout_module_default.table,
241
+ "aria-label": label,
242
+ children: [t6, t8]
243
+ });
244
+ $[57] = label;
245
+ $[58] = t6;
246
+ $[59] = t8;
247
+ $[60] = t9;
248
+ } else t9 = $[60];
249
+ let t10;
250
+ if ($[61] !== measureList || $[62] !== t9) {
251
+ t10 = /* @__PURE__ */ jsx("div", {
188
252
  className: TableLayout_module_default.scroller,
189
- children: /* @__PURE__ */ jsxs("table", {
190
- className: TableLayout_module_default.table,
191
- "aria-label": label,
192
- children: [t5, t7]
193
- })
253
+ ref: measureList,
254
+ children: t9
255
+ });
256
+ $[61] = measureList;
257
+ $[62] = t9;
258
+ $[63] = t10;
259
+ } else t10 = $[63];
260
+ let t11;
261
+ if ($[64] !== fitLevel || $[65] !== t10) {
262
+ t11 = /* @__PURE__ */ jsx(RowActionsFit, {
263
+ value: fitLevel,
264
+ children: t10
194
265
  });
195
- $[48] = label;
196
- $[49] = t5;
197
- $[50] = t7;
198
- $[51] = t8;
199
- } else t8 = $[51];
200
- return t8;
266
+ $[64] = fitLevel;
267
+ $[65] = t10;
268
+ $[66] = t11;
269
+ } else t11 = $[66];
270
+ return t11;
201
271
  }
202
272
  function _temp(node) {
203
273
  return node !== null;
@@ -1 +1 @@
1
- {"version":3,"file":"TableLayout.js","names":["pageSelection","item","selected","column","href","label","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 selectable,\n isSelected,\n onToggle,\n renderActions,\n sort,\n onSort,\n label,\n pageSelection,\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 return (\n <tr key={item.id} data-selected={selected || undefined}>\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 <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 {index === 0 ? (\n <ItemTitle href={href}>\n {renderValue(item, column)}\n </ItemTitle>\n ) : (\n renderValue(item, column)\n )}\n </span>\n </td>\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","ImageOff","Checkbox","Icon","usePanneauIntl","RowActionsFit","fitContent","useRowActionsFit","cx","messages","ListColumn","ListLayoutProps","ItemTitle","styles","getSortDirection","sort","column","first","id","alignClass","align","center","end","undefined","Thumbnail","t0","$","_c","url","t1","thumbnail","TableLayout","items","columns","renderValue","getItemLabel","getItemHref","getItemImage","isCurrent","selectable","isSelected","onToggle","renderActions","onSort","label","pageSelection","renderCell","intl","actions","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","cell","title","cellLabel","withThumbnail","t9","table","t10","scroller","t11","node","styles","_c"],"sources":["../../src/layouts/TableLayout.tsx"],"sourcesContent":["import { ArrowDown, ArrowUp, ArrowUpDown, ImageOff } 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 * The thumbnail of an item, before its title (decision 0061): a square of its image, loaded when it\n * comes into view, or a placeholder. It has no text: the title is next to it.\n */\nfunction Thumbnail({ url }: { url: string | null }) {\n return (\n <span className={styles.thumbnail}>\n {url !== null ? (\n <img src={url} alt=\"\" loading=\"lazy\" decoding=\"async\" />\n ) : (\n <Icon icon={ImageOff} size=\"sm\" />\n )}\n </span>\n );\n}\n\n/**\n * Items as a table, with sortable column headers. With the image of items (`getItemImage`), each\n * title starts with a thumbnail. On narrow lists (phones), each row turns into a block that shows\n * the label of each value.\n */\nexport function TableLayout({\n items,\n columns,\n renderValue,\n getItemLabel,\n getItemHref,\n getItemImage,\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 const cell = (\n <span>\n {renderCell !== undefined\n ? renderCell(item, column, content)\n : content}\n </span>\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 {index === 0 && getItemImage !== undefined ? (\n <span className={styles.withThumbnail}>\n <Thumbnail url={getItemImage(item)} />\n {cell}\n </span>\n ) : (\n cell\n )}\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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"}
@@ -2,6 +2,9 @@ import "./TableLayout.css";
2
2
  //#region src/layouts/TableLayout.module.css
3
3
  var scroller = "panneau-table-layout-scroller";
4
4
  var table = "panneau-table-layout-table";
5
+ var title = "panneau-table-layout-title";
6
+ var withThumbnail = "panneau-table-layout-with-thumbnail";
7
+ var thumbnail = "panneau-table-layout-thumbnail";
5
8
  var center = "panneau-table-layout-center";
6
9
  var end = "panneau-table-layout-end";
7
10
  var check = "panneau-table-layout-check";
@@ -11,10 +14,12 @@ var sortIcon = "panneau-table-layout-sort-icon";
11
14
  var sorted = "panneau-table-layout-sorted";
12
15
  var cellLabel = "panneau-table-layout-cell-label";
13
16
  var visuallyHidden = "panneau-table-layout-visually-hidden";
14
- var title = "panneau-table-layout-title";
15
17
  var TableLayout_module_default = {
16
18
  scroller,
17
19
  table,
20
+ title,
21
+ withThumbnail,
22
+ thumbnail,
18
23
  center,
19
24
  end,
20
25
  check,
@@ -23,10 +28,9 @@ var TableLayout_module_default = {
23
28
  sortIcon,
24
29
  sorted,
25
30
  cellLabel,
26
- visuallyHidden,
27
- title
31
+ visuallyHidden
28
32
  };
29
33
  //#endregion
30
- export { actionsCell, cellLabel, center, check, TableLayout_module_default as default, end, scroller, sort, sortIcon, sorted, table, title, visuallyHidden };
34
+ export { actionsCell, cellLabel, center, check, TableLayout_module_default as default, end, scroller, sort, sortIcon, sorted, table, thumbnail, title, visuallyHidden, withThumbnail };
31
35
 
32
36
  //# sourceMappingURL=TableLayout.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TableLayout.module.js","names":[],"sources":["../../src/layouts/TableLayout.module.css"],"sourcesContent":[".scroller {\n overflow-x: auto;\n border: var(--panneau-border-width) solid var(--panneau-color-border);\n border-radius: var(--panneau-radius-lg);\n background-color: var(--panneau-color-surface);\n}\n\n.table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--panneau-font-size-md);\n}\n\n.table th,\n.table td {\n padding: var(--panneau-row-padding-y) var(--panneau-space-3);\n text-align: start;\n vertical-align: middle;\n border-bottom: var(--panneau-border-width) solid var(--panneau-color-border);\n}\n\n.table th {\n font-size: var(--panneau-font-size-sm);\n font-weight: var(--panneau-font-weight-medium);\n color: var(--panneau-color-text-muted);\n white-space: nowrap;\n background-color: var(--panneau-color-surface-sunken);\n}\n\n.table tbody tr:last-child td {\n border-bottom: 0;\n}\n\n.table tbody tr[data-selected] {\n background-color: var(--panneau-color-accent-subtle);\n}\n\n.center {\n text-align: center !important;\n}\n\n.end {\n text-align: end !important;\n}\n\n.check {\n width: 1px;\n}\n\n.actionsCell {\n width: 1px;\n text-align: end !important;\n white-space: nowrap;\n}\n\n.sort {\n display: inline-flex;\n align-items: center;\n gap: var(--panneau-space-1);\n margin: calc(-1 * var(--panneau-space-1)) calc(-1 * var(--panneau-space-2));\n padding: var(--panneau-space-1) var(--panneau-space-2);\n font: inherit;\n color: inherit;\n background: none;\n border: 0;\n border-radius: var(--panneau-radius-sm);\n cursor: pointer;\n}\n\n.sort:hover {\n color: var(--panneau-color-text);\n background-color: var(--panneau-color-hover);\n}\n\n.sort:focus-visible {\n outline: var(--panneau-focus-width) solid var(--panneau-color-focus);\n outline-offset: 1px;\n}\n\n.sortIcon {\n opacity: 0.5;\n}\n\n.sorted .sortIcon {\n opacity: 1;\n}\n\n.cellLabel {\n display: none;\n}\n\n.visuallyHidden {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n\n/* Narrow lists (phones): each row is a block, with the label of each value next to it. */\n@container panneau-list (max-width: 40rem) {\n .scroller {\n overflow: visible;\n background: none;\n border: 0;\n }\n\n /* The labels of the cells replace the headers, and the list's sort select their buttons. */\n .table thead {\n display: none;\n }\n\n .table,\n .table tbody,\n .table tr,\n .table td {\n display: block;\n }\n\n .table tbody {\n display: grid;\n gap: var(--panneau-space-2);\n }\n\n .table tr {\n position: relative;\n padding: var(--panneau-space-2) 0;\n background-color: var(--panneau-color-surface);\n border: var(--panneau-border-width) solid var(--panneau-color-border);\n border-radius: var(--panneau-radius-lg);\n }\n\n .table td {\n display: grid;\n grid-template-columns: minmax(5rem, 35%) 1fr;\n gap: var(--panneau-space-2);\n padding: var(--panneau-space-1) var(--panneau-space-3);\n text-align: start !important;\n border: 0;\n }\n\n .table td.check,\n .table td.actionsCell {\n display: flex;\n width: auto;\n }\n\n .table td.check {\n position: absolute;\n top: var(--panneau-space-2);\n inset-inline-end: var(--panneau-space-2);\n padding: 0;\n }\n\n .table td.actionsCell {\n justify-content: flex-start;\n flex-wrap: wrap;\n padding-top: var(--panneau-space-2);\n }\n\n .table td.title {\n display: block;\n padding-inline-end: var(--panneau-space-10);\n font-weight: var(--panneau-font-weight-medium);\n }\n\n .table td.title .cellLabel {\n display: none;\n }\n\n .cellLabel {\n display: block;\n font-size: var(--panneau-font-size-sm);\n color: var(--panneau-color-text-muted);\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"TableLayout.module.js","names":[],"sources":["../../src/layouts/TableLayout.module.css"],"sourcesContent":[".scroller {\n overflow-x: auto;\n border: var(--panneau-border-width) solid var(--panneau-color-border);\n border-radius: var(--panneau-radius-lg);\n background-color: var(--panneau-color-surface);\n}\n\n.table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--panneau-font-size-md);\n}\n\n.table th,\n.table td {\n padding: var(--panneau-row-padding-y) var(--panneau-space-3);\n text-align: start;\n vertical-align: middle;\n border-bottom: var(--panneau-border-width) solid var(--panneau-color-border);\n}\n\n.table th {\n font-size: var(--panneau-font-size-sm);\n font-weight: var(--panneau-font-weight-medium);\n color: var(--panneau-color-text-muted);\n white-space: nowrap;\n background-color: var(--panneau-color-surface-sunken);\n}\n\n/* The title stays readable in a narrow list, such as next to an item's details: the table\n * scrolls instead. */\n.table td.title {\n min-width: 12rem;\n}\n\n.table tbody tr:last-child td {\n border-bottom: 0;\n}\n\n.table tbody tr[data-selected] {\n background-color: var(--panneau-color-accent-subtle);\n}\n\n/* The item shown next to the list: a bar on its first cell. */\n.table tbody tr[data-current] td:first-child {\n box-shadow: inset 3px 0 0 var(--panneau-color-accent);\n}\n\n.table tbody tr[data-current] {\n background-color: var(--panneau-color-hover);\n}\n\n/* The thumbnail of an item, before its title (decision 0061). */\n.withThumbnail {\n display: flex;\n align-items: center;\n gap: var(--panneau-space-3);\n}\n\n.withThumbnail > :last-child {\n min-width: 0;\n}\n\n.thumbnail {\n display: flex;\n flex: none;\n align-items: center;\n justify-content: center;\n width: 2.5rem;\n height: 2.5rem;\n overflow: hidden;\n color: var(--panneau-color-text-muted);\n background-color: var(--panneau-color-surface-sunken);\n border-radius: var(--panneau-radius-sm);\n}\n\n.thumbnail img {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.center {\n text-align: center !important;\n}\n\n.end {\n text-align: end !important;\n}\n\n.check {\n width: 1px;\n}\n\n.actionsCell {\n width: 1px;\n text-align: end !important;\n white-space: nowrap;\n}\n\n/* As narrow as the actions of the row on one line: they only wrap in a narrow list. */\n.table .actionsCell > * {\n flex-wrap: nowrap;\n}\n\n.sort {\n display: inline-flex;\n align-items: center;\n gap: var(--panneau-space-1);\n margin: calc(-1 * var(--panneau-space-1)) calc(-1 * var(--panneau-space-2));\n padding: var(--panneau-space-1) var(--panneau-space-2);\n font: inherit;\n color: inherit;\n background: none;\n border: 0;\n border-radius: var(--panneau-radius-sm);\n cursor: pointer;\n}\n\n.sort:hover {\n color: var(--panneau-color-text);\n background-color: var(--panneau-color-hover);\n}\n\n.sort:focus-visible {\n outline: var(--panneau-focus-width) solid var(--panneau-color-focus);\n outline-offset: 1px;\n}\n\n.sortIcon {\n opacity: 0.5;\n}\n\n.sorted .sortIcon {\n opacity: 1;\n}\n\n.cellLabel {\n display: none;\n}\n\n.visuallyHidden {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n\n/* Narrow lists (phones): each row is a block, with the label of each value next to it. */\n@container panneau-list (max-width: 40rem) {\n .scroller {\n overflow: visible;\n background: none;\n border: 0;\n }\n\n /* The labels of the cells replace the headers, and the list's sort select their buttons. */\n .table thead {\n display: none;\n }\n\n .table,\n .table tbody,\n .table tr,\n .table td {\n display: block;\n }\n\n .table tbody {\n display: grid;\n gap: var(--panneau-space-2);\n }\n\n .table tr {\n position: relative;\n padding: var(--panneau-space-2) 0;\n background-color: var(--panneau-color-surface);\n border: var(--panneau-border-width) solid var(--panneau-color-border);\n border-radius: var(--panneau-radius-lg);\n }\n\n .table td {\n display: grid;\n grid-template-columns: minmax(5rem, 35%) 1fr;\n gap: var(--panneau-space-2);\n padding: var(--panneau-space-1) var(--panneau-space-3);\n text-align: start !important;\n border: 0;\n }\n\n .table td.check,\n .table td.actionsCell {\n display: flex;\n width: auto;\n }\n\n .table td.actionsCell > * {\n flex-wrap: wrap;\n }\n\n .table td.check {\n position: absolute;\n top: var(--panneau-space-2);\n inset-inline-end: var(--panneau-space-2);\n padding: 0;\n }\n\n .table td.actionsCell {\n justify-content: flex-start;\n flex-wrap: wrap;\n padding-top: var(--panneau-space-2);\n }\n\n .table td.title {\n display: block;\n min-width: 0;\n padding-inline-end: var(--panneau-space-10);\n font-weight: var(--panneau-font-weight-medium);\n }\n\n .table td.title .cellLabel {\n display: none;\n }\n\n .cellLabel {\n display: block;\n font-size: var(--panneau-font-size-sm);\n color: var(--panneau-color-text-muted);\n }\n}\n"],"mappings":""}
@@ -1,5 +1,5 @@
1
- import type { ListLayoutEntry } from '../types';
2
- /** The built-in list layouts, by id. `gallery` and `calendar` come later. */
1
+ import type { ListLayoutEntry } from '../types.js';
2
+ /** The built-in list layouts, by id (decision 0044). */
3
3
  export declare const builtInLayouts: Readonly<Record<string, ListLayoutEntry>> & {
4
4
  table: ListLayoutEntry;
5
5
  };
@@ -1 +1 @@
1
- {"version":3,"file":"builtIn.d.ts","sourceRoot":"","sources":["../../src/layouts/builtIn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAIhD,6EAA6E;AAC7E,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,GAAG;IACrE,KAAK,EAAE,eAAe,CAAC;CAI1B,CAAC"}
1
+ {"version":3,"file":"builtIn.d.ts","sourceRoot":"","sources":["../../src/layouts/builtIn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAMhD,wDAAwD;AACxD,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,GAAG;IACrE,KAAK,EAAE,eAAe,CAAC;CAM1B,CAAC"}
@@ -1,10 +1,14 @@
1
+ import { CalendarLayout } from "./CalendarLayout.js";
1
2
  import { CardsLayout } from "./CardsLayout.js";
3
+ import { GalleryLayout } from "./GalleryLayout.js";
2
4
  import { TableLayout } from "./TableLayout.js";
3
5
  //#region src/layouts/builtIn.ts
4
- /** The built-in list layouts, by id. `gallery` and `calendar` come later. */
6
+ /** The built-in list layouts, by id (decision 0044). */
5
7
  var builtInLayouts = {
6
8
  table: TableLayout,
7
- cards: CardsLayout
9
+ cards: CardsLayout,
10
+ gallery: GalleryLayout,
11
+ calendar: CalendarLayout
8
12
  };
9
13
  //#endregion
10
14
  export { builtInLayouts };
@@ -1 +1 @@
1
- {"version":3,"file":"builtIn.js","names":[],"sources":["../../src/layouts/builtIn.ts"],"sourcesContent":["import type { ListLayoutEntry } from '../types';\nimport { CardsLayout } from './CardsLayout';\nimport { TableLayout } from './TableLayout';\n\n/** The built-in list layouts, by id. `gallery` and `calendar` come later. */\nexport const builtInLayouts: Readonly<Record<string, ListLayoutEntry>> & {\n table: ListLayoutEntry;\n} = {\n table: TableLayout,\n cards: CardsLayout,\n};\n"],"mappings":";;;;AAKA,IAAa,iBAET;CACA,OAAO;CACP,OAAO;AACX"}
1
+ {"version":3,"file":"builtIn.js","names":["ListLayoutEntry","CalendarLayout","CardsLayout","GalleryLayout","TableLayout","builtInLayouts","Readonly","Record","table","cards","gallery","calendar"],"sources":["../../src/layouts/builtIn.ts"],"sourcesContent":["import type { ListLayoutEntry } from '../types';\nimport { CalendarLayout } from './CalendarLayout';\nimport { CardsLayout } from './CardsLayout';\nimport { GalleryLayout } from './GalleryLayout';\nimport { TableLayout } from './TableLayout';\n\n/** The built-in list layouts, by id (decision 0044). */\nexport const builtInLayouts: Readonly<Record<string, ListLayoutEntry>> & {\n table: ListLayoutEntry;\n} = {\n table: TableLayout,\n cards: CardsLayout,\n gallery: GalleryLayout,\n calendar: CalendarLayout,\n};\n"],"mappings":";;;;;;AAOA,IAAaK,iBAET;CACAG,OAAOJ;CACPK,OAAOP;CACPQ,SAASP;CACTQ,UAAUV;AACd"}
@@ -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