@dbcdk/react-components 0.0.19 → 0.0.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 (46) hide show
  1. package/dist/components/button/Button.module.css +21 -10
  2. package/dist/components/chip/Chip.d.ts +3 -2
  3. package/dist/components/chip/Chip.js +2 -1
  4. package/dist/components/chip/Chip.module.css +107 -67
  5. package/dist/components/code-block/CodeBlock.js +28 -19
  6. package/dist/components/code-block/CodeBlock.module.css +69 -67
  7. package/dist/components/filter-field/FilterField.d.ts +2 -1
  8. package/dist/components/filter-field/FilterField.js +4 -9
  9. package/dist/components/filter-field/FilterField.module.css +203 -152
  10. package/dist/components/filtering/chip-multi-toggle/ChipMultiToggle.d.ts +2 -3
  11. package/dist/components/filtering/chip-multi-toggle/ChipMultiToggle.js +3 -5
  12. package/dist/components/filtering/chip-multi-toggle/ChipMultiToggle.module.css +13 -13
  13. package/dist/components/forms/input/Input.d.ts +1 -1
  14. package/dist/components/forms/input/Input.js +3 -9
  15. package/dist/components/forms/input/Input.module.css +106 -17
  16. package/dist/components/hyperlink/Hyperlink.module.css +14 -3
  17. package/dist/components/interval-select/IntervalSelect.js +2 -2
  18. package/dist/components/overlay/modal/Modal.d.ts +2 -1
  19. package/dist/components/overlay/modal/Modal.js +6 -6
  20. package/dist/components/overlay/modal/Modal.module.css +52 -19
  21. package/dist/components/popover/Popover.module.css +4 -1
  22. package/dist/components/segmented-progress-bar/SegmentedProgressBar.d.ts +4 -2
  23. package/dist/components/segmented-progress-bar/SegmentedProgressBar.js +17 -19
  24. package/dist/components/segmented-progress-bar/SegmentedProgressBar.module.css +128 -20
  25. package/dist/components/sidebar/Sidebar.d.ts +2 -1
  26. package/dist/components/sidebar/Sidebar.js +2 -2
  27. package/dist/components/sidebar/components/sidebar-container/SidebarContainer.d.ts +2 -3
  28. package/dist/components/sidebar/components/sidebar-container/SidebarContainer.js +2 -4
  29. package/dist/components/sidebar/components/sidebar-container/SidebarContainer.module.css +2 -1
  30. package/dist/components/table/Table.d.ts +6 -6
  31. package/dist/components/table/Table.js +153 -78
  32. package/dist/components/table/Table.module.css +335 -171
  33. package/dist/components/table/TanstackTable.d.ts +1 -1
  34. package/dist/components/table/TanstackTable.js +14 -12
  35. package/dist/components/table/table.utils.d.ts +1 -1
  36. package/dist/components/table/table.utils.js +2 -3
  37. package/dist/components/table/tanstackTable.utils.d.ts +9 -10
  38. package/dist/components/table/tanstackTable.utils.js +50 -30
  39. package/dist/hooks/useViewportFill.d.ts +6 -5
  40. package/dist/hooks/useViewportFill.js +43 -41
  41. package/dist/src/styles/styles.css +9 -3
  42. package/dist/styles/styles.css +9 -3
  43. package/dist/styles/themes/dbc/base.css +0 -3
  44. package/dist/styles/themes/dbc/dark.css +44 -12
  45. package/dist/styles/themes/dbc/light.css +33 -7
  46. package/package.json +1 -1
@@ -1,12 +1,8 @@
1
- /* ==========================================================================
2
- * BASE BUTTON
3
- * ======================================================================= */
4
-
5
1
  .button {
6
2
  display: inline-flex;
7
3
  align-items: center;
8
4
  justify-content: center;
9
- gap: var(--space-inline-sm);
5
+ gap: var(--spacing-xxs);
10
6
 
11
7
  font-family: var(--font-family);
12
8
  font-size: var(--font-size-sm);
@@ -155,14 +151,21 @@
155
151
  }
156
152
 
157
153
  .default {
158
- background-color: var(--color-bg-surface);
154
+ background-color: var(--color-bg-toolbar);
159
155
  color: var(--color-fg-default);
160
- border-color: var(--color-border-subtle);
156
+ border-color: transparent;
161
157
  }
162
158
 
163
159
  .default:hover {
164
- background-color: var(--color-bg-hover-subtle);
165
- border-color: var(--color-border-default);
160
+ background-color: var(--color-bg-toolbar-hover);
161
+ border-color: transparent;
162
+ }
163
+
164
+ .default:focus-visible {
165
+ outline: none;
166
+ box-shadow:
167
+ inset 0 0 0 1px var(--color-border-selected),
168
+ var(--focus-ring);
166
169
  }
167
170
 
168
171
  .outlined {
@@ -217,7 +220,7 @@
217
220
  }
218
221
 
219
222
  .button.inline:hover {
220
- background-color: var(--color-bg-contextual);
223
+ background-color: var(--opac-bg-light);
221
224
  }
222
225
 
223
226
  .active {
@@ -226,6 +229,14 @@
226
229
  border-color: var(--color-border-selected);
227
230
  }
228
231
 
232
+ .inline.active {
233
+ color: var(--button-bg-primary);
234
+ }
235
+
229
236
  .active:hover {
230
237
  background-color: var(--button-bg-primary-hover);
231
238
  }
239
+
240
+ .inline.active:hover {
241
+ color: var(--button-bg-primary-hover);
242
+ }
@@ -9,7 +9,8 @@ interface ChipProps {
9
9
  fullWidth?: boolean;
10
10
  onClose?: () => void;
11
11
  size?: 'sm' | 'md' | 'lg';
12
- type?: 'default' | 'rounded' | 'outlined';
12
+ type?: 'default' | 'rounded' | 'outlined' | 'subtle';
13
+ selected?: boolean;
13
14
  }
14
- export declare function Chip({ children, severity, loading, disableIcon, fullWidth, size, customIcon, type, onClose, }: ChipProps): JSX.Element;
15
+ export declare function Chip({ children, severity, loading, disableIcon, fullWidth, size, customIcon, type, selected, onClose, }: ChipProps): JSX.Element;
15
16
  export {};
@@ -5,7 +5,7 @@ import { useState, useRef, useEffect } from 'react';
5
5
  import styles from './Chip.module.css';
6
6
  import { Icon } from '../icon/Icon';
7
7
  import { SkeletonLoaderItem } from '../skeleton-loader/skeleton-loader-item/SkeletonLoaderItem';
8
- export function Chip({ children, severity = 'neutral', loading, disableIcon = true, fullWidth = false, size = 'md', customIcon, type = 'rounded', onClose, }) {
8
+ export function Chip({ children, severity = 'neutral', loading, disableIcon = true, fullWidth = false, size = 'md', customIcon, type = 'rounded', selected = false, onClose, }) {
9
9
  const [chipWidth, setChipWidth] = useState(undefined);
10
10
  const chipRef = useRef(null);
11
11
  useEffect(() => {
@@ -26,5 +26,6 @@ export function Chip({ children, severity = 'neutral', loading, disableIcon = tr
26
26
  styles[type],
27
27
  hasLeading ? styles.hasLeading : '',
28
28
  hasClose ? styles.hasClose : '',
29
+ selected ? styles.selected : '',
29
30
  ].join(' '), children: [hasLeading ? (_jsxs("span", { className: styles.leading, children: [severity && !disableIcon && _jsx(Icon, { severity: severity }), customIcon] })) : null, _jsx("span", { className: styles.label, children: children }), hasClose && (_jsx("button", { type: "button", onClick: onClose, className: styles.close, "aria-label": "Luk", children: _jsx(X, {}) }))] }));
30
31
  }
@@ -1,23 +1,16 @@
1
1
  .container {
2
- /* local layout tokens */
3
- --chip-gap: var(--spacing-xxs);
4
- --chip-pad-y: var(--spacing-xxs);
5
- --chip-pad-x: var(--spacing-md);
6
-
7
- /* when no icon, compensate by half the gap on each side */
8
- --chip-pad-x-noicon: calc(var(--chip-pad-x) + (var(--chip-gap) / 2));
9
-
10
2
  display: inline-flex;
11
3
  align-items: center;
12
- gap: var(--chip-gap);
4
+ gap: var(--spacing-xs);
13
5
  white-space: nowrap;
14
6
 
15
7
  color: var(--chip-fg-default, var(--color-fg-default));
16
- border: var(--border-width-thin) solid transparent;
17
- border-radius: var(--border-radius-default);
8
+ background: transparent;
9
+ border: 1px solid transparent;
10
+ border-radius: var(--border-radius-rounded);
18
11
 
19
- padding-block: var(--chip-pad-y);
20
- padding-inline: var(--chip-pad-x-noicon);
12
+ padding-inline: var(--spacing-sm);
13
+ padding-block: var(--spacing-2xs);
21
14
 
22
15
  font-family: var(--font-family);
23
16
  font-size: var(--font-size-sm);
@@ -27,32 +20,69 @@
27
20
  background-color var(--transition-fast) var(--ease-standard),
28
21
  color var(--transition-fast) var(--ease-standard),
29
22
  border-color var(--transition-fast) var(--ease-standard),
30
- box-shadow var(--transition-fast) var(--ease-standard);
23
+ box-shadow var(--transition-fast) var(--ease-standard),
24
+ transform var(--transition-fast) var(--ease-standard);
31
25
  }
32
26
 
33
- /* Keep your preferred pill look */
34
- .rounded {
35
- border-radius: var(--border-radius-rounded);
27
+ .container:focus-visible {
28
+ outline: none;
36
29
  }
37
30
 
38
- .outlined {
31
+ .rounded {
39
32
  border-radius: var(--border-radius-rounded);
40
- border: var(--border-width-thin) solid var(--color-border-default);
41
- background-color: transparent;
42
33
  }
43
34
 
44
35
  .default {
45
36
  border-radius: var(--border-radius-default);
46
37
  }
47
38
 
48
- /* ---- Leading icon logic ---- */
49
- .hasLeading {
50
- /* symmetric tighter padding when icon exists */
51
- padding-left: var(--spacing-xs);
52
- padding-right: var(--spacing-xs);
39
+ /* Types */
40
+
41
+ .outlined {
42
+ background-color: var(--color-bg-surface);
43
+ border: 1px solid var(--color-border-subtle);
44
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.03);
45
+ color: var(--color-fg-muted);
46
+ }
47
+
48
+ .outlined:hover {
49
+ background-color: var(--color-bg-surface);
50
+ border-color: var(--color-border-default);
51
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
52
+ color: var(--color-fg-default);
53
53
  }
54
54
 
55
- /* Leading slot */
55
+ .outlined:focus-visible {
56
+ outline: none;
57
+ border-color: var(--color-border-selected);
58
+ box-shadow:
59
+ 0 1px 2px rgba(0, 0, 0, 0.03),
60
+ inset 0 0 0 1px var(--color-border-selected);
61
+ color: var(--color-fg-default);
62
+ }
63
+
64
+ .subtle {
65
+ background-color: var(--color-bg-toolbar);
66
+ border: 1px solid transparent;
67
+ box-shadow: inset 0 0 0 1px transparent;
68
+ color: var(--color-fg-muted);
69
+ }
70
+
71
+ .subtle:hover {
72
+ background-color: var(--color-bg-toolbar-hover);
73
+ border-color: transparent;
74
+ color: var(--color-fg-default);
75
+ }
76
+
77
+ .subtle:focus-visible {
78
+ outline: none;
79
+ border-color: var(--color-border-selected);
80
+ box-shadow: inset 0 0 0 1px var(--color-border-selected);
81
+ color: var(--color-fg-default);
82
+ }
83
+
84
+ /* Content */
85
+
56
86
  .leading {
57
87
  display: inline-flex;
58
88
  align-items: center;
@@ -66,7 +96,6 @@
66
96
  min-width: 0;
67
97
  }
68
98
 
69
- /* ---- Icon sizing ---- */
70
99
  .leading svg,
71
100
  .close svg {
72
101
  inline-size: var(--icon-size-sm);
@@ -74,38 +103,11 @@
74
103
  color: currentColor;
75
104
  }
76
105
 
77
- .sm .leading svg,
78
- .sm .close svg {
79
- inline-size: 14px;
80
- block-size: 14px;
81
- }
82
-
83
- .lg .leading svg,
84
- .lg .close svg {
85
- inline-size: var(--icon-size-md);
86
- block-size: var(--icon-size-md);
87
- }
106
+ /* Sizes */
88
107
 
89
- /* ---- Sizes ---- */
90
108
  .sm {
91
- --chip-pad-y: var(--spacing-2xs);
92
- --chip-pad-x: var(--spacing-xs);
93
- /* keep same gap unless you explicitly want tighter; if you do, change only here */
94
- /* --chip-gap: var(--spacing-2xs); */
95
-
96
109
  height: var(--component-size-xs);
97
110
  font-size: var(--font-size-xs);
98
-
99
- /* recompute derived value */
100
- --chip-pad-x-noicon: calc(var(--chip-pad-x) + (var(--chip-gap) / 2));
101
-
102
- padding-block: var(--chip-pad-y);
103
- padding-inline: var(--chip-pad-x-noicon);
104
- }
105
-
106
- .sm.hasLeading {
107
- padding-left: var(--spacing-xxs);
108
- padding-right: var(--spacing-xxs);
109
111
  }
110
112
 
111
113
  .md {
@@ -113,55 +115,87 @@
113
115
  }
114
116
 
115
117
  .lg {
116
- --chip-pad-y: var(--spacing-xs);
117
-
118
118
  height: var(--component-size-md);
119
- padding-block: var(--chip-pad-y);
119
+ padding-block: var(--spacing-xs);
120
120
  }
121
121
 
122
- /* ---- Variants / severities ---- */
122
+ /* Status variants */
123
+
123
124
  .neutral {
124
- background-color: var(--color-bg-contextual);
125
+ background-color: var(--color-bg-toolbar);
126
+ color: var(--color-fg-default);
125
127
  border-color: transparent;
128
+ box-shadow: inset 0 0 0 1px var(--color-border-subtle);
126
129
  }
127
130
 
128
131
  .success {
129
132
  background-color: var(--color-status-success-bg);
130
133
  color: var(--color-status-success-fg);
131
- border-color: var(--color-status-success-border);
134
+ border-color: transparent;
135
+ box-shadow: inset 0 0 0 1px var(--color-status-success-border);
132
136
  }
133
137
 
134
138
  .warning {
135
139
  background-color: var(--color-status-warning-bg);
136
140
  color: var(--color-status-warning-fg);
137
- border-color: var(--color-status-warning-border);
141
+ border-color: transparent;
142
+ box-shadow: inset 0 0 0 1px var(--color-status-warning-border);
138
143
  }
139
144
 
140
145
  .error {
141
146
  background-color: var(--color-status-error-bg);
142
147
  color: var(--color-status-error-fg);
143
- border-color: var(--color-status-error-border);
148
+ border-color: transparent;
149
+ box-shadow: inset 0 0 0 1px var(--color-status-error-border);
144
150
  }
145
151
 
146
152
  .info {
147
153
  background-color: var(--color-status-info-bg);
148
154
  color: var(--color-status-info-fg);
149
- border-color: var(--color-status-info-border);
155
+ border-color: transparent;
156
+ box-shadow: inset 0 0 0 1px var(--color-status-info-border);
150
157
  }
151
158
 
152
159
  .brand {
153
160
  background-color: var(--color-brand);
154
161
  color: var(--color-fg-on-brand);
155
162
  border-color: transparent;
163
+ box-shadow: inset 0 0 0 1px transparent;
156
164
  }
157
165
 
158
- /* Full width */
166
+ /* Selected */
167
+
168
+ .selected {
169
+ background: var(--color-bg-selected);
170
+ color: var(--color-brand);
171
+ border-color: var(--color-border-selected);
172
+ box-shadow: inset 0 0 0 1px var(--color-border-selected);
173
+ }
174
+
175
+ .selected:hover {
176
+ background-color: var(--color-bg-selected);
177
+ border-color: var(--color-border-selected);
178
+ box-shadow: inset 0 0 0 1px var(--color-border-selected);
179
+ color: var(--color-brand);
180
+ }
181
+
182
+ .selected:focus-visible {
183
+ outline: none;
184
+ background-color: var(--color-bg-selected);
185
+ border-color: var(--color-border-selected);
186
+ box-shadow: inset 0 0 0 1px var(--color-border-selected);
187
+ color: var(--color-brand);
188
+ }
189
+
190
+ /* Layout */
191
+
159
192
  .fullWidth {
160
193
  inline-size: 100%;
161
194
  justify-content: center;
162
195
  }
163
196
 
164
197
  /* Close button */
198
+
165
199
  .close {
166
200
  all: unset;
167
201
  display: inline-flex;
@@ -173,8 +207,13 @@
173
207
  inline-size: var(--icon-size-md);
174
208
  block-size: var(--icon-size-md);
175
209
  border-radius: var(--border-radius-round);
210
+ border: 1px solid transparent;
211
+ box-sizing: border-box;
176
212
 
177
- transition: background-color var(--transition-fast) var(--ease-standard);
213
+ transition:
214
+ background-color var(--transition-fast) var(--ease-standard),
215
+ border-color var(--transition-fast) var(--ease-standard),
216
+ box-shadow var(--transition-fast) var(--ease-standard);
178
217
  }
179
218
 
180
219
  .close:hover {
@@ -182,6 +221,7 @@
182
221
  }
183
222
 
184
223
  .close:focus-visible {
185
- box-shadow: var(--focus-ring);
186
224
  outline: none;
225
+ border-color: var(--color-border-selected);
226
+ box-shadow: inset 0 0 0 1px var(--color-border-selected);
187
227
  }
@@ -1,5 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { TextWrap } from 'lucide-react';
3
+ import { useMemo, useState } from 'react';
2
4
  import styles from './CodeBlock.module.css';
5
+ import { Button } from '../button/Button';
3
6
  import { CopyButton } from '../copy-button/CopyButton';
4
7
  const looksLikeStackFrame = (line) => {
5
8
  const t = line.trim();
@@ -16,24 +19,30 @@ export function CodeBlock({ code, children, copyButton, copyText, size = 'md', s
16
19
  var _a;
17
20
  const text = typeof code === 'string' ? code : undefined;
18
21
  const copy = (_a = copyText !== null && copyText !== void 0 ? copyText : text) !== null && _a !== void 0 ? _a : '';
19
- // If children are provided, render them as-is (no line processing).
20
22
  const hasChildren = children !== undefined && children !== null;
21
- // Smart rendering only when we have plain text + no children.
22
- const lines = smart && !hasChildren && typeof text === 'string' ? text.split('\n') : null;
23
- return (_jsxs("pre", { className: [styles.container, styles[size], wrap ? styles.wrap : styles.noWrap].join(' '), tabIndex: 0, children: [copyButton && (_jsx("span", { className: styles.copyButton, children: _jsx(CopyButton, { shape: "round", variant: "inline", text: copy }) })), _jsx("code", { className: styles.code, children: hasChildren
24
- ? children
25
- : lines
26
- ? lines.map((line, i) => {
27
- const isFirst = i === 0;
28
- const isFrame = looksLikeStackFrame(line);
29
- const cls = [
30
- styles.line,
31
- isFirst ? styles.lineFirst : '',
32
- isFrame ? styles.lineFrame : '',
33
- ]
34
- .filter(Boolean)
35
- .join(' ');
36
- return (_jsxs("span", { className: cls, children: [line, '\n'] }, i));
37
- })
38
- : text })] }));
23
+ const [isWrapped, setIsWrapped] = useState(wrap);
24
+ const lines = useMemo(() => (smart && !hasChildren && typeof text === 'string' ? text.split('\n') : null), [smart, hasChildren, text]);
25
+ return (_jsxs("div", { className: [
26
+ styles.wrapper,
27
+ styles[size],
28
+ isWrapped ? styles.wrap : styles.noWrap,
29
+ copyButton ? styles.hasActions : '',
30
+ ]
31
+ .filter(Boolean)
32
+ .join(' '), children: [copyButton && (_jsxs("span", { className: styles.actions, "aria-hidden": false, children: [_jsx(Button, { type: "button", variant: "inline", size: "sm", shape: "round", onClick: () => setIsWrapped(v => !v), "aria-pressed": isWrapped, active: isWrapped, title: isWrapped ? 'Ombryd ikke tekst' : 'Ombryd tekst', children: _jsx(TextWrap, { size: 16 }) }), _jsx(CopyButton, { size: "sm", shape: "round", variant: "inline", text: copy })] })), _jsx("pre", { className: styles.container, tabIndex: 0, children: _jsx("code", { className: styles.code, children: hasChildren
33
+ ? children
34
+ : lines
35
+ ? lines.map((line, i) => {
36
+ const isFirst = i === 0;
37
+ const isFrame = looksLikeStackFrame(line);
38
+ const cls = [
39
+ styles.line,
40
+ isFirst ? styles.lineFirst : '',
41
+ isFrame ? styles.lineFrame : '',
42
+ ]
43
+ .filter(Boolean)
44
+ .join(' ');
45
+ return (_jsxs("span", { className: cls, children: [line, '\n'] }, i));
46
+ })
47
+ : text }) })] }));
39
48
  }
@@ -1,79 +1,80 @@
1
+ .wrapper {
2
+ position: relative;
3
+ --code-actions-h: var(--component-size-sm);
4
+ --code-actions-inset: var(--spacing-xs);
5
+ }
6
+
7
+ /* <pre> */
1
8
  .container {
2
9
  position: relative;
3
10
  margin-block: 0;
4
-
5
- background: var(--color-bg-contextual-subtle);
6
- border: var(--border-width-thin) solid var(--color-border-default);
11
+ background: var(--color-bg-surface-strong);
12
+ border: var(--border-width-thin) solid var(--color-border-subtle);
7
13
  border-radius: var(--border-radius-lg);
8
14
  box-shadow: var(--shadow-xs);
9
-
10
15
  padding: var(--spacing-sm);
11
- padding-inline-end: calc(var(--spacing-sm) + 40px);
12
-
13
16
  font-family: var(--font-family-mono);
14
- line-height: var(--line-height-relaxed);
15
-
16
- overflow-x: auto;
17
- overflow-y: hidden;
18
-
19
- /* Nice: avoids layout shift if/when scrollbars appear (supported in modern browsers) */
17
+ line-height: 1.35;
18
+ overflow: auto;
20
19
  scrollbar-gutter: stable;
21
- }
22
20
 
23
- .container:focus-within {
24
- border-color: var(--color-border-selected);
25
- box-shadow: var(--shadow-xs), var(--focus-ring);
21
+ display: flex;
22
+ align-items: center;
26
23
  }
27
24
 
28
- .container.sm {
25
+ /* Sizes */
26
+ .sm .container {
29
27
  padding: var(--spacing-xs);
30
- padding-inline-end: calc(var(--spacing-xs) + 40px);
31
28
  }
32
29
 
33
- .container.sm .code {
30
+ .sm .code {
34
31
  font-size: var(--font-size-xs);
35
32
  }
36
33
 
37
- .container.md .code {
34
+ .md .code {
38
35
  font-size: var(--font-size-sm);
39
36
  }
40
37
 
41
- .container.lg .code {
38
+ .lg .code {
42
39
  font-size: var(--font-size-base);
43
40
  }
44
41
 
45
- .code {
46
- display: block;
47
- margin: 0;
48
- font-family: var(--font-family-mono);
49
- color: var(--color-fg-default);
50
- white-space: pre-wrap;
51
- overflow-wrap: anywhere;
52
- word-break: normal; /* <- not break-all */
42
+ .hasActions .container {
43
+ min-block-size: calc(var(--code-actions-h) + var(--spacing-sm) + var(--spacing-sm));
53
44
  }
54
45
 
55
- /* Copy button stays overlayed; does not affect layout */
56
- .copyButton {
57
- position: absolute;
58
- top: var(--spacing-xs);
59
- right: var(--spacing-xs);
60
- z-index: 2;
46
+ .sm.hasActions .container {
47
+ min-block-size: calc(var(--code-actions-h) + var(--spacing-xs) + var(--spacing-xs));
48
+ }
61
49
 
62
- opacity: 0;
63
- pointer-events: none;
64
- transition: opacity var(--transition-fast) var(--ease-standard);
50
+ .md.hasActions .container {
51
+ min-block-size: calc(var(--code-actions-h) + var(--spacing-sm) + var(--spacing-sm));
65
52
  }
66
53
 
67
- .container:hover .copyButton,
68
- .container:focus-within .copyButton {
69
- opacity: 1;
70
- pointer-events: auto;
54
+ .lg.hasActions .container {
55
+ min-block-size: calc(var(--code-actions-h) + var(--spacing-sm) + var(--spacing-sm));
71
56
  }
72
57
 
73
- /* --- New: wrap control --- */
58
+ /* Focus ring */
59
+ .wrapper:focus-within .container {
60
+ border-color: var(--color-border-selected);
61
+ box-shadow: var(--shadow-xs), var(--focus-ring);
62
+ }
63
+
64
+ /* <code> */
65
+ .code {
66
+ display: block;
67
+ margin: 0;
68
+ font-family: var(--font-family-mono);
69
+ color: var(--color-fg-default);
70
+ flex: 1 1 auto;
71
+ min-width: 0;
72
+ }
73
+
74
+ /* Wrapping modes */
74
75
  .wrap .code {
75
76
  white-space: pre-wrap;
76
- overflow-wrap: anywhere;
77
+ overflow-wrap: break-word;
77
78
  word-break: normal;
78
79
  }
79
80
 
@@ -83,9 +84,31 @@
83
84
  word-break: normal;
84
85
  }
85
86
 
86
- /* --- New: per-line styling (for smart mode) --- */
87
+ .actions {
88
+ position: absolute;
89
+ top: var(--code-actions-inset);
90
+ right: var(--code-actions-inset);
91
+ z-index: 3;
92
+ display: inline-flex;
93
+ gap: var(--spacing-xs);
94
+ align-items: center;
95
+ padding: var(--spacing-2xs);
96
+ border-radius: var(--border-radius-lg);
97
+ background: color-mix(in oklab, var(--color-bg-surface) 70%, transparent);
98
+ backdrop-filter: blur(6px);
99
+ opacity: 0;
100
+ pointer-events: none;
101
+ transition: opacity var(--transition-fast) var(--ease-standard);
102
+ }
103
+
104
+ .wrapper:hover .actions,
105
+ .wrapper:focus-within .actions {
106
+ opacity: 1;
107
+ pointer-events: auto;
108
+ }
109
+
87
110
  .line {
88
- display: inline; /* keep selection/copy behavior natural */
111
+ display: inline;
89
112
  }
90
113
 
91
114
  .lineFirst {
@@ -94,27 +117,6 @@
94
117
  color: var(--color-fg-default);
95
118
  }
96
119
 
97
- /* Common stack frames are “noise”; deemphasize without hiding */
98
120
  .lineFrame {
99
121
  color: var(--color-fg-subtle);
100
122
  }
101
-
102
- /* Optional: make the container a bit denser for logs */
103
- .container {
104
- /* keep your existing properties ... */
105
-
106
- /* Easy win: stacktraces feel less tall */
107
- line-height: 1.35; /* instead of relaxed */
108
- }
109
-
110
- /* Optional: differentiate the code area slightly from surrounding UI */
111
- .container {
112
- background: var(--color-bg-surface-strong); /* a touch more neutral than contextual */
113
- border-color: var(--color-border-subtle);
114
- }
115
-
116
- /* Keep focus ring behavior */
117
- .container:focus-within {
118
- border-color: var(--color-border-selected);
119
- box-shadow: var(--shadow-xs), var(--focus-ring);
120
- }
@@ -20,13 +20,14 @@ export interface FilterFieldProps extends Omit<React.InputHTMLAttributes<HTMLInp
20
20
  options?: MultiselectOption[];
21
21
  single?: boolean;
22
22
  size?: 'sm' | 'md' | 'lg';
23
+ variant?: 'surface' | 'outlined' | 'subtle';
23
24
  label?: string;
24
25
  placeholder?: string;
25
26
  disabled?: boolean;
26
27
  width?: string;
27
28
  }
28
29
  export declare const NUMBER_OPERATORS: Operator[];
29
- export declare function FilterField({ field, control, operator, value, onChange, operators, options, single, size, label, placeholder, disabled, 'data-cy': dataCy, width, ...inputProps }: FilterFieldProps & {
30
+ export declare function FilterField({ field, control, operator, value, onChange, operators, options, single, size, variant, label, placeholder, disabled, 'data-cy': dataCy, width, ...inputProps }: FilterFieldProps & {
30
31
  'data-cy'?: string;
31
32
  }): React.ReactElement;
32
33
  export {};