@dbcdk/react-components 0.0.119 → 0.0.121

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 (41) hide show
  1. package/dist/components/button/Button.module.css +2 -2
  2. package/dist/components/card/Card.cjs +4 -7
  3. package/dist/components/card/Card.js +4 -7
  4. package/dist/components/card/Card.module.css +4 -9
  5. package/dist/components/lightbox/Lightbox.cjs +94 -23
  6. package/dist/components/lightbox/Lightbox.d.ts +14 -1
  7. package/dist/components/lightbox/Lightbox.js +95 -24
  8. package/dist/components/lightbox/Lightbox.module.css +56 -3
  9. package/dist/components/search-box/SearchBox.cjs +9 -4
  10. package/dist/components/search-box/SearchBox.js +9 -4
  11. package/dist/components/skeleton-loader/skeleton-loader-item/SkeletonLoaderItem.cjs +1 -1
  12. package/dist/components/skeleton-loader/skeleton-loader-item/SkeletonLoaderItem.js +1 -1
  13. package/dist/components/skeleton-loader/skeleton-loader-item/SkeletonLoaderItem.module.css +11 -7
  14. package/dist/components/table/Table.cjs +9 -4
  15. package/dist/components/table/Table.d.ts +1 -1
  16. package/dist/components/table/Table.js +10 -5
  17. package/dist/components/table/Table.module.css +25 -0
  18. package/dist/components/table/Table.types.d.ts +13 -0
  19. package/dist/components/table/TanstackTable.cjs +10 -1
  20. package/dist/components/table/TanstackTable.js +10 -1
  21. package/dist/components/table/components/TableBody.cjs +2 -0
  22. package/dist/components/table/components/TableBody.d.ts +7 -2
  23. package/dist/components/table/components/TableBody.js +2 -0
  24. package/dist/components/table/components/TableHeader.cjs +10 -1
  25. package/dist/components/table/components/TableHeader.d.ts +2 -1
  26. package/dist/components/table/components/TableHeader.js +10 -1
  27. package/dist/components/table/components/TableRow.cjs +75 -1
  28. package/dist/components/table/components/TableRow.d.ts +7 -2
  29. package/dist/components/table/components/TableRow.js +75 -1
  30. package/dist/components/table/hooks/useTableRowInteractions.cjs +2 -2
  31. package/dist/components/table/hooks/useTableRowInteractions.js +2 -2
  32. package/dist/components/table/table.utils.cjs +2 -0
  33. package/dist/components/table/table.utils.d.ts +1 -0
  34. package/dist/components/table/table.utils.js +2 -1
  35. package/dist/components/table/tanstackTable.utils.cjs +6 -4
  36. package/dist/components/table/tanstackTable.utils.d.ts +2 -0
  37. package/dist/components/table/tanstackTable.utils.js +7 -5
  38. package/package.json +1 -1
  39. package/dist/components/table/components/TableLoadingBody.cjs +0 -35
  40. package/dist/components/table/components/TableLoadingBody.d.ts +0 -9
  41. package/dist/components/table/components/TableLoadingBody.js +0 -29
@@ -153,13 +153,13 @@
153
153
  }
154
154
 
155
155
  .default {
156
- background-color: var(--color-bg-toolbar);
156
+ background-color: var(--opac-bg-default);
157
157
  color: var(--color-fg-default);
158
158
  border-color: transparent;
159
159
  }
160
160
 
161
161
  .default:hover {
162
- background-color: var(--color-bg-toolbar-hover);
162
+ background-color: var(--opac-bg-dark);
163
163
  border-color: transparent;
164
164
  }
165
165
 
@@ -5,7 +5,7 @@ var styles = require('./Card.module.css');
5
5
  var CardMeta = require('./components/CardMeta');
6
6
  var Headline = require('../headline/Headline');
7
7
  var Hyperlink = require('../hyperlink/Hyperlink');
8
- var SkeletonLoaderItem = require('../skeleton-loader/skeleton-loader-item/SkeletonLoaderItem');
8
+ var SkeletonLoader = require('../skeleton-loader/SkeletonLoader');
9
9
 
10
10
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
11
 
@@ -52,7 +52,7 @@ function CardImpl({
52
52
  children,
53
53
  link,
54
54
  width,
55
- headlineSize = 4,
55
+ headlineSize = 3,
56
56
  truncateTitle = false
57
57
  }) {
58
58
  var _a;
@@ -76,7 +76,7 @@ function CardImpl({
76
76
  Headline.Headline,
77
77
  {
78
78
  severity,
79
- marker: headerMarker,
79
+ marker: Boolean(severity) && headerMarker,
80
80
  icon: headerIcon,
81
81
  addition: headerAddition,
82
82
  subheader,
@@ -89,10 +89,7 @@ function CardImpl({
89
89
  ) : null,
90
90
  headerMeta ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles__default.default.headerMeta, children: headerMeta }) : null
91
91
  ] }) : null,
92
- loading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles__default.default.loadingList, "aria-busy": "true", "aria-live": "polite", children: Array.from({ length: 4 }, (_, index) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles__default.default.loadingRow, children: [
93
- /* @__PURE__ */ jsxRuntime.jsx(SkeletonLoaderItem.SkeletonLoaderItem, {}),
94
- /* @__PURE__ */ jsxRuntime.jsx(SkeletonLoaderItem.SkeletonLoaderItem, { width: "100%" })
95
- ] }, index)) }) : null,
92
+ loading ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles__default.default.loadingBody, "aria-busy": "true", "aria-live": "polite", children: /* @__PURE__ */ jsxRuntime.jsx(SkeletonLoader.SkeletonLoader, { type: "squares", rows: 1, columns: 1 }) }) : null,
96
93
  showSection ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles__default.default.section, children: [
97
94
  showSectionDivider ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles__default.default.sectionDivider }) : null,
98
95
  sectionTitle ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles__default.default.sectionTitle, children: sectionTitle }) : null
@@ -3,7 +3,7 @@ import styles from './Card.module.css';
3
3
  import { CardMetaRow, CardMeta } from './components/CardMeta';
4
4
  import { Headline } from '../headline/Headline';
5
5
  import { Hyperlink } from '../hyperlink/Hyperlink';
6
- import { SkeletonLoaderItem } from '../skeleton-loader/skeleton-loader-item/SkeletonLoaderItem';
6
+ import { SkeletonLoader } from '../skeleton-loader/SkeletonLoader';
7
7
 
8
8
  function getInnerPlacementClass(imgPlacement, s) {
9
9
  switch (imgPlacement) {
@@ -46,7 +46,7 @@ function CardImpl({
46
46
  children,
47
47
  link,
48
48
  width,
49
- headlineSize = 4,
49
+ headlineSize = 3,
50
50
  truncateTitle = false
51
51
  }) {
52
52
  var _a;
@@ -70,7 +70,7 @@ function CardImpl({
70
70
  Headline,
71
71
  {
72
72
  severity,
73
- marker: headerMarker,
73
+ marker: Boolean(severity) && headerMarker,
74
74
  icon: headerIcon,
75
75
  addition: headerAddition,
76
76
  subheader,
@@ -83,10 +83,7 @@ function CardImpl({
83
83
  ) : null,
84
84
  headerMeta ? /* @__PURE__ */ jsx("div", { className: styles.headerMeta, children: headerMeta }) : null
85
85
  ] }) : null,
86
- loading ? /* @__PURE__ */ jsx("div", { className: styles.loadingList, "aria-busy": "true", "aria-live": "polite", children: Array.from({ length: 4 }, (_, index) => /* @__PURE__ */ jsxs("div", { className: styles.loadingRow, children: [
87
- /* @__PURE__ */ jsx(SkeletonLoaderItem, {}),
88
- /* @__PURE__ */ jsx(SkeletonLoaderItem, { width: "100%" })
89
- ] }, index)) }) : null,
86
+ loading ? /* @__PURE__ */ jsx("div", { className: styles.loadingBody, "aria-busy": "true", "aria-live": "polite", children: /* @__PURE__ */ jsx(SkeletonLoader, { type: "squares", rows: 1, columns: 1 }) }) : null,
90
87
  showSection ? /* @__PURE__ */ jsxs("div", { className: styles.section, children: [
91
88
  showSectionDivider ? /* @__PURE__ */ jsx("div", { className: styles.sectionDivider }) : null,
92
89
  sectionTitle ? /* @__PURE__ */ jsx("div", { className: styles.sectionTitle, children: sectionTitle }) : null
@@ -159,16 +159,11 @@
159
159
  }
160
160
 
161
161
  /* Loading */
162
- .loadingList {
162
+ .loadingBody {
163
163
  display: flex;
164
- flex-direction: column;
165
- gap: var(--spacing-md);
166
- }
167
-
168
- .loadingRow {
169
- display: flex;
170
- flex-direction: column;
171
- gap: var(--spacing-sm);
164
+ flex: 1 1 auto;
165
+ min-width: 0;
166
+ min-height: 180px;
172
167
  }
173
168
 
174
169
  /* Responsive */
@@ -5,8 +5,10 @@ var jsxRuntime = require('react/jsx-runtime');
5
5
  var lucideReact = require('lucide-react');
6
6
  var react = require('react');
7
7
  var client = require('../../client');
8
+ var Popover = require('../../components/popover/Popover');
8
9
  var styles = require('./Lightbox.module.css');
9
10
  var Button = require('../button/Button');
11
+ var Menu = require('../menu/Menu');
10
12
 
11
13
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
12
14
 
@@ -30,7 +32,8 @@ function Lightbox({
30
32
  showDownload = true,
31
33
  getDownloadFilename,
32
34
  buttonAddition,
33
- trigger
35
+ trigger,
36
+ getContextMenuItems
34
37
  }) {
35
38
  var _a;
36
39
  const dialogRef = react.useRef(null);
@@ -119,28 +122,38 @@ function Lightbox({
119
122
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
120
123
  trigger ? trigger(openAt) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles__default.default.thumbnails, children: items.map((item, i) => {
121
124
  var _a2;
122
- return /* @__PURE__ */ jsxRuntime.jsxs(
123
- "button",
124
- {
125
- type: "button",
126
- className: styles__default.default.thumbnailBtn,
127
- onClick: () => openAt(i),
128
- "aria-label": (_a2 = item.title) != null ? _a2 : `Billede ${i + 1}`,
129
- children: [
130
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles__default.default.thumbnailImg, style: { height: thumbnailHeight }, children: item.thumbnail }),
131
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles__default.default.thumbnailMeta, children: /* @__PURE__ */ jsxRuntime.jsx(
132
- client.MetaBar,
133
- {
134
- items: [
135
- { label: "H\xF8jde", value: item.height != null ? `${item.height}px` : "-" },
136
- { label: "Bredde", value: item.width != null ? `${item.width}px` : "-" }
137
- ]
138
- }
139
- ) })
140
- ]
141
- },
142
- i
143
- );
125
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles__default.default.thumbnailCard, children: [
126
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles__default.default.thumbnailMedia, children: /* @__PURE__ */ jsxRuntime.jsx(
127
+ "button",
128
+ {
129
+ type: "button",
130
+ className: styles__default.default.thumbnailBtn,
131
+ onClick: () => openAt(i),
132
+ "aria-label": (_a2 = item.title) != null ? _a2 : `Billede ${i + 1}`,
133
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles__default.default.thumbnailImg, style: { height: thumbnailHeight }, children: item.thumbnail })
134
+ }
135
+ ) }),
136
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles__default.default.thumbnailFooter, children: [
137
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles__default.default.thumbnailMeta, children: /* @__PURE__ */ jsxRuntime.jsx(
138
+ client.MetaBar,
139
+ {
140
+ items: [
141
+ { value: item.height != null ? `H:${item.height}px` : "-" },
142
+ { value: item.width != null ? `B:${item.width}px` : "-" }
143
+ ]
144
+ }
145
+ ) }),
146
+ getContextMenuItems ? /* @__PURE__ */ jsxRuntime.jsx(
147
+ ThumbnailContextMenu,
148
+ {
149
+ item,
150
+ index: i,
151
+ open: () => openAt(i),
152
+ getItems: getContextMenuItems
153
+ }
154
+ ) : null
155
+ ] })
156
+ ] }, i);
144
157
  }) }),
145
158
  /* @__PURE__ */ jsxRuntime.jsx(
146
159
  "dialog",
@@ -215,5 +228,63 @@ function Lightbox({
215
228
  )
216
229
  ] });
217
230
  }
231
+ function ThumbnailContextMenu({
232
+ item,
233
+ index,
234
+ open,
235
+ getItems
236
+ }) {
237
+ const menuItems = getItems({ item, index, open });
238
+ if (!menuItems.length) return null;
239
+ return /* @__PURE__ */ jsxRuntime.jsx(
240
+ Popover.Popover,
241
+ {
242
+ matchTriggerWidth: false,
243
+ minWidth: "180px",
244
+ trigger: (toggle, _icon, isOpen) => {
245
+ var _a;
246
+ return /* @__PURE__ */ jsxRuntime.jsx(
247
+ Button.Button,
248
+ {
249
+ type: "button",
250
+ size: "sm",
251
+ variant: "inline",
252
+ className: styles__default.default.thumbnailMenuTrigger,
253
+ "aria-label": `Flere handlinger for ${(_a = item.title) != null ? _a : `billede ${index + 1}`}`,
254
+ "aria-haspopup": "menu",
255
+ "aria-expanded": isOpen ? true : false,
256
+ icon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MoreHorizontal, { size: 16 }),
257
+ onClick: (e) => {
258
+ e.stopPropagation();
259
+ toggle(e);
260
+ }
261
+ }
262
+ );
263
+ },
264
+ children: (close) => /* @__PURE__ */ jsxRuntime.jsx(Menu.Menu, { children: menuItems.map((menuItem, menuItemIndex) => /* @__PURE__ */ jsxRuntime.jsx(
265
+ Menu.Menu.Item,
266
+ {
267
+ active: menuItem.active,
268
+ selected: menuItem.selected,
269
+ disabled: menuItem.disabled,
270
+ variant: menuItem.variant,
271
+ children: /* @__PURE__ */ jsxRuntime.jsx(
272
+ "button",
273
+ {
274
+ type: "button",
275
+ onClick: (e) => {
276
+ e.stopPropagation();
277
+ menuItem.onClick();
278
+ close();
279
+ },
280
+ children: menuItem.label
281
+ }
282
+ )
283
+ },
284
+ menuItemIndex
285
+ )) })
286
+ }
287
+ );
288
+ }
218
289
 
219
290
  exports.Lightbox = Lightbox;
@@ -8,6 +8,14 @@ export type LightboxItem = {
8
8
  width?: number;
9
9
  height?: number;
10
10
  };
11
+ export type LightboxContextMenuItem = {
12
+ label: ReactNode;
13
+ onClick: () => void;
14
+ active?: boolean;
15
+ selected?: boolean;
16
+ disabled?: boolean;
17
+ variant?: 'default' | 'danger';
18
+ };
11
19
  export interface LightboxProps {
12
20
  items: LightboxItem[];
13
21
  title?: string;
@@ -17,5 +25,10 @@ export interface LightboxProps {
17
25
  getDownloadFilename?: (item: LightboxItem, index: number) => string;
18
26
  buttonAddition?: ReactNode;
19
27
  trigger?: (open: (index?: number) => void) => ReactNode;
28
+ getContextMenuItems?: (args: {
29
+ item: LightboxItem;
30
+ index: number;
31
+ open: () => void;
32
+ }) => LightboxContextMenuItem[];
20
33
  }
21
- export declare function Lightbox({ items, title, initialIndex, thumbnailHeight, showDownload, getDownloadFilename, buttonAddition, trigger, }: LightboxProps): ReactElement | null;
34
+ export declare function Lightbox({ items, title, initialIndex, thumbnailHeight, showDownload, getDownloadFilename, buttonAddition, trigger, getContextMenuItems, }: LightboxProps): ReactElement | null;
@@ -1,10 +1,12 @@
1
1
  'use client';
2
2
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
3
- import { Download, X, ChevronLeft, ChevronRight } from 'lucide-react';
3
+ import { Download, X, ChevronLeft, ChevronRight, MoreHorizontal } from 'lucide-react';
4
4
  import { useRef, useState, useEffect, useCallback } from 'react';
5
5
  import { MetaBar } from '../../client';
6
+ import { Popover } from '../../components/popover/Popover';
6
7
  import styles from './Lightbox.module.css';
7
8
  import { Button } from '../button/Button';
9
+ import { Menu } from '../menu/Menu';
8
10
 
9
11
  function extFromMime(mime) {
10
12
  var _a;
@@ -24,7 +26,8 @@ function Lightbox({
24
26
  showDownload = true,
25
27
  getDownloadFilename,
26
28
  buttonAddition,
27
- trigger
29
+ trigger,
30
+ getContextMenuItems
28
31
  }) {
29
32
  var _a;
30
33
  const dialogRef = useRef(null);
@@ -113,28 +116,38 @@ function Lightbox({
113
116
  return /* @__PURE__ */ jsxs(Fragment, { children: [
114
117
  trigger ? trigger(openAt) : /* @__PURE__ */ jsx("div", { className: styles.thumbnails, children: items.map((item, i) => {
115
118
  var _a2;
116
- return /* @__PURE__ */ jsxs(
117
- "button",
118
- {
119
- type: "button",
120
- className: styles.thumbnailBtn,
121
- onClick: () => openAt(i),
122
- "aria-label": (_a2 = item.title) != null ? _a2 : `Billede ${i + 1}`,
123
- children: [
124
- /* @__PURE__ */ jsx("div", { className: styles.thumbnailImg, style: { height: thumbnailHeight }, children: item.thumbnail }),
125
- /* @__PURE__ */ jsx("div", { className: styles.thumbnailMeta, children: /* @__PURE__ */ jsx(
126
- MetaBar,
127
- {
128
- items: [
129
- { label: "H\xF8jde", value: item.height != null ? `${item.height}px` : "-" },
130
- { label: "Bredde", value: item.width != null ? `${item.width}px` : "-" }
131
- ]
132
- }
133
- ) })
134
- ]
135
- },
136
- i
137
- );
119
+ return /* @__PURE__ */ jsxs("div", { className: styles.thumbnailCard, children: [
120
+ /* @__PURE__ */ jsx("div", { className: styles.thumbnailMedia, children: /* @__PURE__ */ jsx(
121
+ "button",
122
+ {
123
+ type: "button",
124
+ className: styles.thumbnailBtn,
125
+ onClick: () => openAt(i),
126
+ "aria-label": (_a2 = item.title) != null ? _a2 : `Billede ${i + 1}`,
127
+ children: /* @__PURE__ */ jsx("div", { className: styles.thumbnailImg, style: { height: thumbnailHeight }, children: item.thumbnail })
128
+ }
129
+ ) }),
130
+ /* @__PURE__ */ jsxs("div", { className: styles.thumbnailFooter, children: [
131
+ /* @__PURE__ */ jsx("div", { className: styles.thumbnailMeta, children: /* @__PURE__ */ jsx(
132
+ MetaBar,
133
+ {
134
+ items: [
135
+ { value: item.height != null ? `H:${item.height}px` : "-" },
136
+ { value: item.width != null ? `B:${item.width}px` : "-" }
137
+ ]
138
+ }
139
+ ) }),
140
+ getContextMenuItems ? /* @__PURE__ */ jsx(
141
+ ThumbnailContextMenu,
142
+ {
143
+ item,
144
+ index: i,
145
+ open: () => openAt(i),
146
+ getItems: getContextMenuItems
147
+ }
148
+ ) : null
149
+ ] })
150
+ ] }, i);
138
151
  }) }),
139
152
  /* @__PURE__ */ jsx(
140
153
  "dialog",
@@ -209,5 +222,63 @@ function Lightbox({
209
222
  )
210
223
  ] });
211
224
  }
225
+ function ThumbnailContextMenu({
226
+ item,
227
+ index,
228
+ open,
229
+ getItems
230
+ }) {
231
+ const menuItems = getItems({ item, index, open });
232
+ if (!menuItems.length) return null;
233
+ return /* @__PURE__ */ jsx(
234
+ Popover,
235
+ {
236
+ matchTriggerWidth: false,
237
+ minWidth: "180px",
238
+ trigger: (toggle, _icon, isOpen) => {
239
+ var _a;
240
+ return /* @__PURE__ */ jsx(
241
+ Button,
242
+ {
243
+ type: "button",
244
+ size: "sm",
245
+ variant: "inline",
246
+ className: styles.thumbnailMenuTrigger,
247
+ "aria-label": `Flere handlinger for ${(_a = item.title) != null ? _a : `billede ${index + 1}`}`,
248
+ "aria-haspopup": "menu",
249
+ "aria-expanded": isOpen ? true : false,
250
+ icon: /* @__PURE__ */ jsx(MoreHorizontal, { size: 16 }),
251
+ onClick: (e) => {
252
+ e.stopPropagation();
253
+ toggle(e);
254
+ }
255
+ }
256
+ );
257
+ },
258
+ children: (close) => /* @__PURE__ */ jsx(Menu, { children: menuItems.map((menuItem, menuItemIndex) => /* @__PURE__ */ jsx(
259
+ Menu.Item,
260
+ {
261
+ active: menuItem.active,
262
+ selected: menuItem.selected,
263
+ disabled: menuItem.disabled,
264
+ variant: menuItem.variant,
265
+ children: /* @__PURE__ */ jsx(
266
+ "button",
267
+ {
268
+ type: "button",
269
+ onClick: (e) => {
270
+ e.stopPropagation();
271
+ menuItem.onClick();
272
+ close();
273
+ },
274
+ children: menuItem.label
275
+ }
276
+ )
277
+ },
278
+ menuItemIndex
279
+ )) })
280
+ }
281
+ );
282
+ }
212
283
 
213
284
  export { Lightbox };
@@ -5,16 +5,32 @@
5
5
  gap: var(--spacing-md);
6
6
  }
7
7
 
8
+ .thumbnailCard {
9
+ display: flex;
10
+ flex-direction: column;
11
+ gap: var(--spacing-xs);
12
+ min-width: 0;
13
+ max-width: 100%;
14
+ }
15
+
16
+ .thumbnailMedia {
17
+ position: relative;
18
+ display: flex;
19
+ min-width: 0;
20
+ max-width: 100%;
21
+ }
22
+
8
23
  .thumbnailBtn {
9
24
  background: none;
10
25
  border: none;
11
26
  padding: 0;
12
27
  cursor: pointer;
13
- display: flex;
14
- flex-direction: column;
15
- gap: var(--spacing-xs);
28
+ display: block;
16
29
  flex: none;
17
30
  text-align: left;
31
+ position: relative;
32
+ min-width: 0;
33
+ max-width: 100%;
18
34
  }
19
35
 
20
36
  .thumbnailImg {
@@ -25,6 +41,8 @@
25
41
  transition:
26
42
  transform var(--transition-fast) var(--ease-standard),
27
43
  box-shadow var(--transition-fast) var(--ease-standard);
44
+ min-width: 0;
45
+ max-width: 100%;
28
46
  }
29
47
 
30
48
  .thumbnailBtn:hover .thumbnailImg {
@@ -34,12 +52,47 @@
34
52
  .thumbnailImg > img {
35
53
  height: 100%;
36
54
  width: auto;
55
+ max-width: 100%;
37
56
  display: block;
38
57
  }
39
58
 
40
59
  .thumbnailMeta {
60
+ flex: 1 1 auto;
41
61
  display: flex;
42
62
  gap: var(--spacing-2xs);
63
+ min-width: 0;
64
+ max-width: 100%;
65
+ }
66
+
67
+ .thumbnailMeta > div {
68
+ min-width: 0;
69
+ max-width: 100%;
70
+ overflow: hidden;
71
+ }
72
+
73
+ .thumbnailMeta > div > span,
74
+ .thumbnailMeta > div > span > span {
75
+ min-width: 0;
76
+ }
77
+
78
+ .thumbnailMeta > div > span:not([aria-hidden='true']) {
79
+ max-width: 100%;
80
+ overflow: hidden;
81
+ white-space: nowrap;
82
+ text-overflow: ellipsis;
83
+ }
84
+
85
+ .thumbnailFooter {
86
+ display: flex;
87
+ align-items: center;
88
+ gap: var(--spacing-xs);
89
+ min-width: 0;
90
+ max-width: 100%;
91
+ }
92
+
93
+ .thumbnailMenuTrigger {
94
+ flex: 0 0 auto;
95
+ min-width: 0;
43
96
  }
44
97
 
45
98
  .dialog {
@@ -49,6 +49,7 @@ const SearchBox = react.forwardRef(function SearchBoxInner({
49
49
  const listboxId = react.useId();
50
50
  const popoverRef = react.useRef(null);
51
51
  const internalInputRef = react.useRef(null);
52
+ const onSearchRef = react.useRef(onSearch);
52
53
  react.useEffect(() => {
53
54
  if (typeof ref === "function") {
54
55
  ref(internalInputRef.current);
@@ -62,18 +63,22 @@ const SearchBox = react.forwardRef(function SearchBoxInner({
62
63
  if (next !== draft) setDraft(next);
63
64
  }, [value]);
64
65
  react.useEffect(() => {
65
- if (!onSearch) return;
66
+ onSearchRef.current = onSearch;
67
+ }, [onSearch]);
68
+ react.useEffect(() => {
69
+ if (!onSearchRef.current) return;
66
70
  if (!debounce) {
67
71
  setSearchQuery(draft);
68
- onSearch(draft);
72
+ onSearchRef.current(draft);
69
73
  return;
70
74
  }
71
75
  const handler = setTimeout(() => {
76
+ var _a2;
72
77
  setSearchQuery(draft);
73
- onSearch(draft);
78
+ (_a2 = onSearchRef.current) == null ? void 0 : _a2.call(onSearchRef, draft);
74
79
  }, debounceMs);
75
80
  return () => clearTimeout(handler);
76
- }, [draft, onSearch, debounce, debounceMs]);
81
+ }, [draft, debounce, debounceMs]);
77
82
  react.useEffect(() => {
78
83
  function handleKeyDown(event) {
79
84
  var _a2;
@@ -43,6 +43,7 @@ const SearchBox = forwardRef(function SearchBoxInner({
43
43
  const listboxId = useId();
44
44
  const popoverRef = useRef(null);
45
45
  const internalInputRef = useRef(null);
46
+ const onSearchRef = useRef(onSearch);
46
47
  useEffect(() => {
47
48
  if (typeof ref === "function") {
48
49
  ref(internalInputRef.current);
@@ -56,18 +57,22 @@ const SearchBox = forwardRef(function SearchBoxInner({
56
57
  if (next !== draft) setDraft(next);
57
58
  }, [value]);
58
59
  useEffect(() => {
59
- if (!onSearch) return;
60
+ onSearchRef.current = onSearch;
61
+ }, [onSearch]);
62
+ useEffect(() => {
63
+ if (!onSearchRef.current) return;
60
64
  if (!debounce) {
61
65
  setSearchQuery(draft);
62
- onSearch(draft);
66
+ onSearchRef.current(draft);
63
67
  return;
64
68
  }
65
69
  const handler = setTimeout(() => {
70
+ var _a2;
66
71
  setSearchQuery(draft);
67
- onSearch(draft);
72
+ (_a2 = onSearchRef.current) == null ? void 0 : _a2.call(onSearchRef, draft);
68
73
  }, debounceMs);
69
74
  return () => clearTimeout(handler);
70
- }, [draft, onSearch, debounce, debounceMs]);
75
+ }, [draft, debounce, debounceMs]);
71
76
  useEffect(() => {
72
77
  function handleKeyDown(event) {
73
78
  var _a2;
@@ -11,7 +11,7 @@ function SkeletonLoaderItem({
11
11
  height = 14,
12
12
  width = "100%",
13
13
  radius = 6,
14
- speedSec = 3,
14
+ speedSec = 4,
15
15
  ariaLabel = "Loading",
16
16
  variant = "default"
17
17
  }) {
@@ -5,7 +5,7 @@ function SkeletonLoaderItem({
5
5
  height = 14,
6
6
  width = "100%",
7
7
  radius = 6,
8
- speedSec = 3,
8
+ speedSec = 4,
9
9
  ariaLabel = "Loading",
10
10
  variant = "default"
11
11
  }) {
@@ -2,8 +2,9 @@
2
2
  --h: var(--skeleton-height, 14px);
3
3
  --r: var(--border-radius-md, 6px);
4
4
  --speed: var(--skeleton-speed, 1.2s);
5
- --skeleton-base: var(--opac-bg-dark);
6
- --skeleton-sheen: var(--opac-bg-default);
5
+ --skeleton-base: var(--opac-bg-default);
6
+ --skeleton-sheen: var(--opac-bg-light);
7
+ --skeleton-sheen-soft: color-mix(in srgb, var(--skeleton-sheen) 60%, var(--skeleton-base));
7
8
  position: relative;
8
9
  display: block;
9
10
  inline-size: var(--width, 100%);
@@ -14,17 +15,20 @@
14
15
  border-radius: var(--r);
15
16
  background: linear-gradient(
16
17
  90deg,
17
- var(--skeleton-sheen) 0%,
18
- var(--skeleton-base) 45%,
19
- var(--skeleton-sheen) 60%,
18
+ var(--skeleton-base) 0%,
19
+ var(--skeleton-base) 34%,
20
+ var(--skeleton-sheen-soft) 45%,
21
+ var(--skeleton-sheen) 50%,
22
+ var(--skeleton-sheen-soft) 55%,
23
+ var(--skeleton-base) 66%,
20
24
  var(--skeleton-base) 100%
21
25
  );
22
- background-size: 200% 100%;
26
+ background-size: 240% 100%;
23
27
  animation: shimmer var(--speed) linear infinite;
24
28
  }
25
29
 
26
30
  .invert {
27
- --skeleton-base: var(--opac-bg-dark-invert);
31
+ --skeleton-base: var(--opac-bg-default-invert);
28
32
  --skeleton-sheen: var(--opac-bg-light-invert);
29
33
  }
30
34