@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.
- package/dist/components/button/Button.module.css +2 -2
- package/dist/components/card/Card.cjs +4 -7
- package/dist/components/card/Card.js +4 -7
- package/dist/components/card/Card.module.css +4 -9
- package/dist/components/lightbox/Lightbox.cjs +94 -23
- package/dist/components/lightbox/Lightbox.d.ts +14 -1
- package/dist/components/lightbox/Lightbox.js +95 -24
- package/dist/components/lightbox/Lightbox.module.css +56 -3
- package/dist/components/search-box/SearchBox.cjs +9 -4
- package/dist/components/search-box/SearchBox.js +9 -4
- package/dist/components/skeleton-loader/skeleton-loader-item/SkeletonLoaderItem.cjs +1 -1
- package/dist/components/skeleton-loader/skeleton-loader-item/SkeletonLoaderItem.js +1 -1
- package/dist/components/skeleton-loader/skeleton-loader-item/SkeletonLoaderItem.module.css +11 -7
- package/dist/components/table/Table.cjs +9 -4
- package/dist/components/table/Table.d.ts +1 -1
- package/dist/components/table/Table.js +10 -5
- package/dist/components/table/Table.module.css +25 -0
- package/dist/components/table/Table.types.d.ts +13 -0
- package/dist/components/table/TanstackTable.cjs +10 -1
- package/dist/components/table/TanstackTable.js +10 -1
- package/dist/components/table/components/TableBody.cjs +2 -0
- package/dist/components/table/components/TableBody.d.ts +7 -2
- package/dist/components/table/components/TableBody.js +2 -0
- package/dist/components/table/components/TableHeader.cjs +10 -1
- package/dist/components/table/components/TableHeader.d.ts +2 -1
- package/dist/components/table/components/TableHeader.js +10 -1
- package/dist/components/table/components/TableRow.cjs +75 -1
- package/dist/components/table/components/TableRow.d.ts +7 -2
- package/dist/components/table/components/TableRow.js +75 -1
- package/dist/components/table/hooks/useTableRowInteractions.cjs +2 -2
- package/dist/components/table/hooks/useTableRowInteractions.js +2 -2
- package/dist/components/table/table.utils.cjs +2 -0
- package/dist/components/table/table.utils.d.ts +1 -0
- package/dist/components/table/table.utils.js +2 -1
- package/dist/components/table/tanstackTable.utils.cjs +6 -4
- package/dist/components/table/tanstackTable.utils.d.ts +2 -0
- package/dist/components/table/tanstackTable.utils.js +7 -5
- package/package.json +1 -1
- package/dist/components/table/components/TableLoadingBody.cjs +0 -35
- package/dist/components/table/components/TableLoadingBody.d.ts +0 -9
- package/dist/components/table/components/TableLoadingBody.js +0 -29
|
@@ -153,13 +153,13 @@
|
|
|
153
153
|
}
|
|
154
154
|
|
|
155
155
|
.default {
|
|
156
|
-
background-color: var(--
|
|
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(--
|
|
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
|
|
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 =
|
|
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.
|
|
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 {
|
|
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 =
|
|
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.
|
|
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
|
-
.
|
|
162
|
+
.loadingBody {
|
|
163
163
|
display: flex;
|
|
164
|
-
flex
|
|
165
|
-
|
|
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
|
-
"
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: styles__default.default.thumbnailImg, style: { height: thumbnailHeight }, children: item.thumbnail })
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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
|
-
"
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
/* @__PURE__ */ jsx("div", { className: styles.thumbnailImg, style: { height: thumbnailHeight }, children: item.thumbnail })
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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:
|
|
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
|
-
|
|
66
|
+
onSearchRef.current = onSearch;
|
|
67
|
+
}, [onSearch]);
|
|
68
|
+
react.useEffect(() => {
|
|
69
|
+
if (!onSearchRef.current) return;
|
|
66
70
|
if (!debounce) {
|
|
67
71
|
setSearchQuery(draft);
|
|
68
|
-
|
|
72
|
+
onSearchRef.current(draft);
|
|
69
73
|
return;
|
|
70
74
|
}
|
|
71
75
|
const handler = setTimeout(() => {
|
|
76
|
+
var _a2;
|
|
72
77
|
setSearchQuery(draft);
|
|
73
|
-
|
|
78
|
+
(_a2 = onSearchRef.current) == null ? void 0 : _a2.call(onSearchRef, draft);
|
|
74
79
|
}, debounceMs);
|
|
75
80
|
return () => clearTimeout(handler);
|
|
76
|
-
}, [draft,
|
|
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
|
-
|
|
60
|
+
onSearchRef.current = onSearch;
|
|
61
|
+
}, [onSearch]);
|
|
62
|
+
useEffect(() => {
|
|
63
|
+
if (!onSearchRef.current) return;
|
|
60
64
|
if (!debounce) {
|
|
61
65
|
setSearchQuery(draft);
|
|
62
|
-
|
|
66
|
+
onSearchRef.current(draft);
|
|
63
67
|
return;
|
|
64
68
|
}
|
|
65
69
|
const handler = setTimeout(() => {
|
|
70
|
+
var _a2;
|
|
66
71
|
setSearchQuery(draft);
|
|
67
|
-
|
|
72
|
+
(_a2 = onSearchRef.current) == null ? void 0 : _a2.call(onSearchRef, draft);
|
|
68
73
|
}, debounceMs);
|
|
69
74
|
return () => clearTimeout(handler);
|
|
70
|
-
}, [draft,
|
|
75
|
+
}, [draft, debounce, debounceMs]);
|
|
71
76
|
useEffect(() => {
|
|
72
77
|
function handleKeyDown(event) {
|
|
73
78
|
var _a2;
|
|
@@ -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-
|
|
6
|
-
--skeleton-sheen: var(--opac-bg-
|
|
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-
|
|
18
|
-
var(--skeleton-base)
|
|
19
|
-
var(--skeleton-sheen)
|
|
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:
|
|
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-
|
|
31
|
+
--skeleton-base: var(--opac-bg-default-invert);
|
|
28
32
|
--skeleton-sheen: var(--opac-bg-light-invert);
|
|
29
33
|
}
|
|
30
34
|
|