@dbcdk/react-components 0.0.108 → 0.0.110

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 (35) hide show
  1. package/dist/client.cjs +14 -0
  2. package/dist/client.d.ts +2 -0
  3. package/dist/client.js +2 -0
  4. package/dist/components/button/Button.module.css +3 -0
  5. package/dist/components/card/Card.module.css +4 -1
  6. package/dist/components/forms/file-upload/FileUpload.cjs +117 -0
  7. package/dist/components/forms/file-upload/FileUpload.d.ts +15 -0
  8. package/dist/components/forms/file-upload/FileUpload.js +111 -0
  9. package/dist/components/forms/file-upload/FileUpload.module.css +75 -0
  10. package/dist/components/lightbox/Lightbox.cjs +219 -0
  11. package/dist/components/lightbox/Lightbox.d.ts +21 -0
  12. package/dist/components/lightbox/Lightbox.js +213 -0
  13. package/dist/components/lightbox/Lightbox.module.css +161 -0
  14. package/dist/components/menu/Menu.cjs +42 -5
  15. package/dist/components/menu/Menu.d.ts +3 -0
  16. package/dist/components/menu/Menu.js +42 -5
  17. package/dist/components/metric-tile/MetricTile.cjs +9 -2
  18. package/dist/components/metric-tile/MetricTile.d.ts +4 -2
  19. package/dist/components/metric-tile/MetricTile.js +9 -2
  20. package/dist/components/metric-tile/MetricTile.module.css +19 -15
  21. package/dist/components/overlay/tooltip/Tooltip.cjs +30 -8
  22. package/dist/components/overlay/tooltip/Tooltip.d.ts +4 -5
  23. package/dist/components/overlay/tooltip/Tooltip.js +31 -9
  24. package/dist/components/table/Table.cjs +3 -1
  25. package/dist/components/table/Table.d.ts +1 -1
  26. package/dist/components/table/Table.js +3 -1
  27. package/dist/components/table/Table.module.css +29 -4
  28. package/dist/components/table/Table.types.d.ts +1 -0
  29. package/dist/components/table/components/TableRow.cjs +9 -2
  30. package/dist/components/table/components/TableRow.js +9 -2
  31. package/dist/index.css +2 -0
  32. package/dist/styles/styles.css +4 -0
  33. package/dist/styles/themes/dbc/colors.css +27 -0
  34. package/dist/styles.css +4 -0
  35. package/package.json +1 -1
@@ -4,6 +4,21 @@ var jsxRuntime = require('react/jsx-runtime');
4
4
  var react = require('react');
5
5
  var useTooltipTrigger = require('./useTooltipTrigger');
6
6
 
7
+ function mergeRefs(...refs) {
8
+ return (node) => {
9
+ for (const ref of refs) {
10
+ if (!ref) continue;
11
+ if (typeof ref === "function") ref(node);
12
+ else ref.current = node;
13
+ }
14
+ };
15
+ }
16
+ function composeHandlers(childHandler, tooltipHandler) {
17
+ return (event) => {
18
+ childHandler == null ? void 0 : childHandler(event);
19
+ tooltipHandler == null ? void 0 : tooltipHandler(event);
20
+ };
21
+ }
7
22
  function Tooltip({
8
23
  children,
9
24
  content,
@@ -11,10 +26,9 @@ function Tooltip({
11
26
  open,
12
27
  offset = 8,
13
28
  delayOpenMs,
14
- delayCloseMs,
15
- className,
16
- ...rest
29
+ delayCloseMs
17
30
  }) {
31
+ var _a;
18
32
  const { triggerProps } = useTooltipTrigger.useTooltipTrigger({
19
33
  content,
20
34
  placement,
@@ -23,12 +37,20 @@ function Tooltip({
23
37
  delayOpenMs,
24
38
  delayCloseMs
25
39
  });
26
- const rootClass = react.useMemo(
27
- () => ["TooltipContainer", className].filter(Boolean).join(" "),
28
- [className]
29
- );
30
40
  if (!content) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children });
31
- return /* @__PURE__ */ jsxRuntime.jsx("span", { className: rootClass, ...rest, children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "TooltipTrigger", tabIndex: 0, ...triggerProps, children }) });
41
+ const child = children;
42
+ const childProps = child.props;
43
+ const childRef = (_a = childProps.ref) != null ? _a : child.ref;
44
+ return react.cloneElement(child, {
45
+ ...childProps,
46
+ ref: mergeRefs(childRef, triggerProps.ref),
47
+ onPointerEnter: composeHandlers(childProps.onPointerEnter, triggerProps.onPointerEnter),
48
+ onPointerLeave: composeHandlers(childProps.onPointerLeave, triggerProps.onPointerLeave),
49
+ onPointerDown: composeHandlers(childProps.onPointerDown, triggerProps.onPointerDown),
50
+ onFocus: composeHandlers(childProps.onFocus, triggerProps.onFocus),
51
+ onBlur: composeHandlers(childProps.onBlur, triggerProps.onBlur),
52
+ "aria-describedby": [childProps["aria-describedby"], triggerProps["aria-describedby"]].filter(Boolean).join(" ") || void 0
53
+ });
32
54
  }
33
55
 
34
56
  exports.Tooltip = Tooltip;
@@ -1,13 +1,12 @@
1
- import { type ReactNode, type HTMLAttributes, type ReactElement } from 'react';
1
+ import { type ReactElement, type ReactNode } from 'react';
2
2
  import { TooltipPlacement } from './TooltipProvider';
3
- export interface TooltipProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'content'> {
4
- children: ReactNode;
3
+ export interface TooltipProps {
4
+ children: ReactElement;
5
5
  content: ReactNode;
6
6
  placement?: TooltipPlacement;
7
7
  open?: boolean;
8
8
  offset?: number;
9
9
  delayOpenMs?: number;
10
10
  delayCloseMs?: number;
11
- className?: string;
12
11
  }
13
- export declare function Tooltip({ children, content, placement, open, offset, delayOpenMs, delayCloseMs, className, ...rest }: TooltipProps): ReactElement;
12
+ export declare function Tooltip({ children, content, placement, open, offset, delayOpenMs, delayCloseMs, }: TooltipProps): ReactElement;
@@ -1,7 +1,22 @@
1
1
  import { jsx, Fragment } from 'react/jsx-runtime';
2
- import { useMemo } from 'react';
2
+ import { cloneElement } from 'react';
3
3
  import { useTooltipTrigger } from './useTooltipTrigger';
4
4
 
5
+ function mergeRefs(...refs) {
6
+ return (node) => {
7
+ for (const ref of refs) {
8
+ if (!ref) continue;
9
+ if (typeof ref === "function") ref(node);
10
+ else ref.current = node;
11
+ }
12
+ };
13
+ }
14
+ function composeHandlers(childHandler, tooltipHandler) {
15
+ return (event) => {
16
+ childHandler == null ? void 0 : childHandler(event);
17
+ tooltipHandler == null ? void 0 : tooltipHandler(event);
18
+ };
19
+ }
5
20
  function Tooltip({
6
21
  children,
7
22
  content,
@@ -9,10 +24,9 @@ function Tooltip({
9
24
  open,
10
25
  offset = 8,
11
26
  delayOpenMs,
12
- delayCloseMs,
13
- className,
14
- ...rest
27
+ delayCloseMs
15
28
  }) {
29
+ var _a;
16
30
  const { triggerProps } = useTooltipTrigger({
17
31
  content,
18
32
  placement,
@@ -21,12 +35,20 @@ function Tooltip({
21
35
  delayOpenMs,
22
36
  delayCloseMs
23
37
  });
24
- const rootClass = useMemo(
25
- () => ["TooltipContainer", className].filter(Boolean).join(" "),
26
- [className]
27
- );
28
38
  if (!content) return /* @__PURE__ */ jsx(Fragment, { children });
29
- return /* @__PURE__ */ jsx("span", { className: rootClass, ...rest, children: /* @__PURE__ */ jsx("span", { className: "TooltipTrigger", tabIndex: 0, ...triggerProps, children }) });
39
+ const child = children;
40
+ const childProps = child.props;
41
+ const childRef = (_a = childProps.ref) != null ? _a : child.ref;
42
+ return cloneElement(child, {
43
+ ...childProps,
44
+ ref: mergeRefs(childRef, triggerProps.ref),
45
+ onPointerEnter: composeHandlers(childProps.onPointerEnter, triggerProps.onPointerEnter),
46
+ onPointerLeave: composeHandlers(childProps.onPointerLeave, triggerProps.onPointerLeave),
47
+ onPointerDown: composeHandlers(childProps.onPointerDown, triggerProps.onPointerDown),
48
+ onFocus: composeHandlers(childProps.onFocus, triggerProps.onFocus),
49
+ onBlur: composeHandlers(childProps.onBlur, triggerProps.onBlur),
50
+ "aria-describedby": [childProps["aria-describedby"], triggerProps["aria-describedby"]].filter(Boolean).join(" ") || void 0
51
+ });
30
52
  }
31
53
 
32
54
  export { Tooltip };
@@ -49,6 +49,7 @@ function Table({
49
49
  showGoToPage,
50
50
  showPageSize,
51
51
  pageSizeOptions,
52
+ showHeader = true,
52
53
  getRowSeverity,
53
54
  onRowClick,
54
55
  onRowMouseEnter,
@@ -143,6 +144,7 @@ function Table({
143
144
  {
144
145
  className: styles__default.default.tableElement,
145
146
  "aria-rowcount": data.length,
147
+ "data-show-header": showHeader,
146
148
  style: tableWidth != null ? { width: tableWidth } : void 0,
147
149
  children: [
148
150
  /* @__PURE__ */ jsxRuntime.jsxs("colgroup", { children: [
@@ -155,7 +157,7 @@ function Table({
155
157
  column.id
156
158
  ))
157
159
  ] }),
158
- /* @__PURE__ */ jsxRuntime.jsx(
160
+ showHeader && /* @__PURE__ */ jsxRuntime.jsx(
159
161
  TableHeader.TableHeader,
160
162
  {
161
163
  columns: visibleColumns,
@@ -1,4 +1,4 @@
1
1
  import type { JSX } from 'react';
2
2
  import type { TableProps } from './Table.types';
3
- export declare function Table<T extends Record<string, any>>({ data, dataKey, columns, selectedRows, selectionMode, allRowsSelected, sortById, sortDirection, loading, emptyConfig, variant, size, viewMode, striped, fillViewport, fillViewportBottomOffset, containScrolling, stickyHeader, tableWidth, tableRootRef, measuringLayout, toolbar, headerExtras, take, skip, totalItemsCount, paginationPlacement, showFirstLast, showGoToPage, showPageSize, pageSizeOptions, getRowSeverity, onRowClick, onRowMouseEnter, onRowSelect, onSelectAllRows, onSortChange, onPageChange, ...rest }: TableProps<T>): JSX.Element;
3
+ export declare function Table<T extends Record<string, any>>({ data, dataKey, columns, selectedRows, selectionMode, allRowsSelected, sortById, sortDirection, loading, emptyConfig, variant, size, viewMode, striped, fillViewport, fillViewportBottomOffset, containScrolling, stickyHeader, tableWidth, tableRootRef, measuringLayout, toolbar, headerExtras, take, skip, totalItemsCount, paginationPlacement, showFirstLast, showGoToPage, showPageSize, pageSizeOptions, showHeader, getRowSeverity, onRowClick, onRowMouseEnter, onRowSelect, onSelectAllRows, onSortChange, onPageChange, ...rest }: TableProps<T>): JSX.Element;
4
4
  export type { ColumnItem } from './Table.types';
@@ -43,6 +43,7 @@ function Table({
43
43
  showGoToPage,
44
44
  showPageSize,
45
45
  pageSizeOptions,
46
+ showHeader = true,
46
47
  getRowSeverity,
47
48
  onRowClick,
48
49
  onRowMouseEnter,
@@ -137,6 +138,7 @@ function Table({
137
138
  {
138
139
  className: styles.tableElement,
139
140
  "aria-rowcount": data.length,
141
+ "data-show-header": showHeader,
140
142
  style: tableWidth != null ? { width: tableWidth } : void 0,
141
143
  children: [
142
144
  /* @__PURE__ */ jsxs("colgroup", { children: [
@@ -149,7 +151,7 @@ function Table({
149
151
  column.id
150
152
  ))
151
153
  ] }),
152
- /* @__PURE__ */ jsx(
154
+ showHeader && /* @__PURE__ */ jsx(
153
155
  TableHeader,
154
156
  {
155
157
  columns: visibleColumns,
@@ -71,6 +71,10 @@
71
71
  .primary {
72
72
  }
73
73
 
74
+ .embedded .cell {
75
+ border-block-end: none;
76
+ }
77
+
74
78
  .embedded {
75
79
  --table-component-header-bg: transparent;
76
80
  --table-component-header-fg: var(--color-fg-subtle);
@@ -138,7 +142,7 @@
138
142
  min-block-size: 0;
139
143
  }
140
144
 
141
- .body .row:first-child .cell {
145
+ [data-show-header='true'] .body .row:first-child .cell {
142
146
  border-block-start: var(--spacing-xs) solid var(--table-component-row-bg);
143
147
  }
144
148
 
@@ -324,6 +328,17 @@
324
328
  word-break: normal;
325
329
  }
326
330
 
331
+ .allowOverflow {
332
+ overflow: visible;
333
+ }
334
+
335
+ .allowOverflow .cellContent,
336
+ .allowOverflow .cellValueEllipsis,
337
+ .allowOverflow .cellValueNoEllipsis {
338
+ overflow: visible;
339
+ text-overflow: clip;
340
+ }
341
+
327
342
  .thInner {
328
343
  display: flex;
329
344
  align-items: center;
@@ -485,15 +500,25 @@
485
500
  text-overflow: ellipsis;
486
501
  }
487
502
 
488
- .cellContent[data-align='left'] .cellValueEllipsis {
503
+ .cellValueNoEllipsis {
504
+ display: block;
505
+ inline-size: 100%;
506
+ min-width: 0;
507
+ max-inline-size: 100%;
508
+ }
509
+
510
+ .cellContent[data-align='left'] .cellValueEllipsis,
511
+ .cellContent[data-align='left'] .cellValueNoEllipsis {
489
512
  text-align: left;
490
513
  }
491
514
 
492
- .cellContent[data-align='center'] .cellValueEllipsis {
515
+ .cellContent[data-align='center'] .cellValueEllipsis,
516
+ .cellContent[data-align='center'] .cellValueNoEllipsis {
493
517
  text-align: center;
494
518
  }
495
519
 
496
- .cellContent[data-align='right'] .cellValueEllipsis {
520
+ .cellContent[data-align='right'] .cellValueEllipsis,
521
+ .cellContent[data-align='right'] .cellValueNoEllipsis {
497
522
  text-align: right;
498
523
  }
499
524
 
@@ -59,6 +59,7 @@ export type TableProps<T extends Record<string, any>> = Omit<HTMLAttributes<HTML
59
59
  showGoToPage?: boolean;
60
60
  showPageSize?: boolean;
61
61
  pageSizeOptions?: number[];
62
+ showHeader?: boolean;
62
63
  getRowSeverity?: (row: T) => Severity | undefined;
63
64
  onRowClick?: (row: T) => void;
64
65
  onRowMouseEnter?: (row: T) => void;
@@ -116,13 +116,14 @@ function TableRow({
116
116
  columns.map((column) => {
117
117
  var _a2, _b, _c, _d;
118
118
  const allowWrap = table_utils.shouldAllowWrap(column.allowWrap, isSelected, viewMode);
119
- column.allowOverflow;
119
+ const allowOverflow = column.allowOverflow;
120
120
  const cellValue = table_utils.getCellDisplayValue(row, column);
121
121
  return /* @__PURE__ */ jsxRuntime.jsx(
122
122
  "td",
123
123
  {
124
124
  className: table_classes.cx(
125
125
  styles__default.default.cell,
126
+ allowOverflow && styles__default.default.allowOverflow,
126
127
  allowWrap ? styles__default.default.allowWrap : styles__default.default.nowrap,
127
128
  column.divider === "left" && styles__default.default.dividerLeft,
128
129
  column.divider === "right" && styles__default.default.dividerRight
@@ -136,7 +137,13 @@ function TableRow({
136
137
  className: styles__default.default.cellContent,
137
138
  "data-align": (_c = column.align) != null ? _c : "left",
138
139
  "data-vertical-align": (_d = column.verticalAlign) != null ? _d : "top",
139
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: styles__default.default.cellValueEllipsis, children: cellValue })
140
+ children: /* @__PURE__ */ jsxRuntime.jsx(
141
+ "div",
142
+ {
143
+ className: allowOverflow ? styles__default.default.cellValueNoEllipsis : styles__default.default.cellValueEllipsis,
144
+ children: cellValue
145
+ }
146
+ )
140
147
  }
141
148
  )
142
149
  },
@@ -110,13 +110,14 @@ function TableRow({
110
110
  columns.map((column) => {
111
111
  var _a2, _b, _c, _d;
112
112
  const allowWrap = shouldAllowWrap(column.allowWrap, isSelected, viewMode);
113
- column.allowOverflow;
113
+ const allowOverflow = column.allowOverflow;
114
114
  const cellValue = getCellDisplayValue(row, column);
115
115
  return /* @__PURE__ */ jsx(
116
116
  "td",
117
117
  {
118
118
  className: cx(
119
119
  styles.cell,
120
+ allowOverflow && styles.allowOverflow,
120
121
  allowWrap ? styles.allowWrap : styles.nowrap,
121
122
  column.divider === "left" && styles.dividerLeft,
122
123
  column.divider === "right" && styles.dividerRight
@@ -130,7 +131,13 @@ function TableRow({
130
131
  className: styles.cellContent,
131
132
  "data-align": (_c = column.align) != null ? _c : "left",
132
133
  "data-vertical-align": (_d = column.verticalAlign) != null ? _d : "top",
133
- children: /* @__PURE__ */ jsx("div", { className: styles.cellValueEllipsis, children: cellValue })
134
+ children: /* @__PURE__ */ jsx(
135
+ "div",
136
+ {
137
+ className: allowOverflow ? styles.cellValueNoEllipsis : styles.cellValueEllipsis,
138
+ children: cellValue
139
+ }
140
+ )
134
141
  }
135
142
  )
136
143
  },
package/dist/index.css CHANGED
@@ -22,6 +22,7 @@
22
22
  @import './components/filtering/chip-multi-toggle/ChipMultiToggle.module.css';
23
23
  @import './components/forms/checkbox-group/CheckboxGroup.module.css';
24
24
  @import './components/forms/checkbox/Checkbox.module.css';
25
+ @import './components/forms/file-upload/FileUpload.module.css';
25
26
  @import './components/forms/form-select/FormSelect.module.css';
26
27
  @import './components/forms/input-container/InputContainer.module.css';
27
28
  @import './components/forms/input/Input.module.css';
@@ -35,6 +36,7 @@
35
36
  @import './components/icon/Icon.module.css';
36
37
  @import './components/inline-status/InlineStatus.module.css';
37
38
  @import './components/json-viewer/JsonViewer.module.css';
39
+ @import './components/lightbox/Lightbox.module.css';
38
40
  @import './components/media-card/MediaCard.module.css';
39
41
  @import './components/menu/Menu.module.css';
40
42
  @import './components/meta-bar/MetaBar.module.css';
@@ -236,6 +236,10 @@ body.dbc-app {
236
236
  color: var(--color-fg-subtle);
237
237
  }
238
238
 
239
+ .dbc-tabular-nums {
240
+ font-variant-numeric: tabular-nums;
241
+ }
242
+
239
243
  .dbc-sm-text {
240
244
  font-size: var(--font-size-xs);
241
245
  }
@@ -144,6 +144,33 @@ html {
144
144
  --color-status-info-border: color-mix(in srgb, var(--dbc-info-500) 24%, transparent);
145
145
  --color-status-info-fg: var(--dbc-info-700);
146
146
 
147
+ /* Soft status surfaces — for compact chips/badges, not alerts */
148
+ --color-status-success-bg-soft: color-mix(
149
+ in srgb,
150
+ var(--color-status-success) 10%,
151
+ var(--color-bg-surface)
152
+ );
153
+ --color-status-warning-bg-soft: color-mix(
154
+ in srgb,
155
+ var(--color-status-warning) 10%,
156
+ var(--color-bg-surface)
157
+ );
158
+ --color-status-error-bg-soft: color-mix(
159
+ in srgb,
160
+ var(--color-status-error) 8%,
161
+ var(--color-bg-surface)
162
+ );
163
+ --color-status-info-bg-soft: color-mix(
164
+ in srgb,
165
+ var(--color-status-info) 10%,
166
+ var(--color-bg-surface)
167
+ );
168
+
169
+ --color-status-success-fg-soft: var(--color-status-success-fg);
170
+ --color-status-warning-fg-soft: var(--color-status-warning-fg);
171
+ --color-status-error-fg-soft: var(--color-status-error-fg);
172
+ --color-status-info-fg-soft: var(--color-status-info-fg);
173
+
147
174
  /* Chart colors */
148
175
  --color-chart-empty: color-mix(in srgb, var(--color-fg-muted) 15%, rgb(255 255 255 / 0));
149
176
  --color-chart-neutral: color-mix(in srgb, var(--color-fg-muted) 25%, rgb(255 255 255 / 0));
package/dist/styles.css CHANGED
@@ -236,6 +236,10 @@ body.dbc-app {
236
236
  color: var(--color-fg-subtle);
237
237
  }
238
238
 
239
+ .dbc-tabular-nums {
240
+ font-variant-numeric: tabular-nums;
241
+ }
242
+
239
243
  .dbc-sm-text {
240
244
  font-size: var(--font-size-xs);
241
245
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dbcdk/react-components",
3
- "version": "0.0.108",
3
+ "version": "0.0.110",
4
4
  "description": "Reusable React components for DBC projects",
5
5
  "license": "ISC",
6
6
  "author": "",