@fusion.dev/helix 0.143.0 → 0.144.0

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 (105) hide show
  1. package/custom-elements.json +10028 -511
  2. package/dist/badge/root/badge-root.css.js +35 -0
  3. package/dist/badge/root/badge-root.d.ts +16 -0
  4. package/dist/badge/root/badge-root.js +3 -0
  5. package/dist/blockquote/root/blockquote-root.css.js +5 -5
  6. package/dist/blockquote/root/blockquote-root.d.ts +5 -0
  7. package/dist/button/root/button-root.css.js +38 -1
  8. package/dist/button/root/button-root.d.ts +5 -0
  9. package/dist/button/root/button-root.js +2 -1
  10. package/dist/callout/root/callout-root.css.js +69 -11
  11. package/dist/callout/root/callout-root.d.ts +25 -2
  12. package/dist/callout/root/callout-root.js +4 -0
  13. package/dist/card/root/card-root.css.js +26 -1
  14. package/dist/card/root/card-root.d.ts +11 -0
  15. package/dist/checkbox-group/root/checkbox-group-root.d.ts +2 -0
  16. package/dist/checkbox-group/root/checkbox-group-root.js +2 -0
  17. package/dist/code-block/root/code-block-root.css.js +23 -0
  18. package/dist/code-block/root/code-block-root.d.ts +15 -0
  19. package/dist/code-block/root/code-block-root.js +8 -0
  20. package/dist/color-picker/root/color-picker-root.css.js +64 -0
  21. package/dist/color-picker/root/color-picker-root.d.ts +2 -0
  22. package/dist/copy-button/root/copy-button-root.css.js +5 -0
  23. package/dist/date-input/root/date-input-root.css.js +19 -0
  24. package/dist/date-input/root/date-input-root.d.ts +8 -0
  25. package/dist/date-input/root/date-input-root.js +2 -0
  26. package/dist/date-picker/root/date-picker-root.css.js +68 -0
  27. package/dist/date-picker/root/date-picker-root.d.ts +1 -0
  28. package/dist/dialog/root/dialog-root.css.js +47 -0
  29. package/dist/divider/root/divider-root.css.js +8 -3
  30. package/dist/divider/root/divider-root.d.ts +17 -1
  31. package/dist/divider/root/divider-root.js +4 -0
  32. package/dist/drawer/root/drawer-root.css.js +28 -1
  33. package/dist/element-events.generated.js +8 -5
  34. package/dist/empty/root/empty-root.css.js +9 -9
  35. package/dist/empty/root/empty-root.d.ts +9 -0
  36. package/dist/file-input/root/file-input-root.js +2 -0
  37. package/dist/filter-input/root/filter-input-root.js +2 -0
  38. package/dist/heatmap/root/heatmap-root.css.js +33 -5
  39. package/dist/heatmap/root/heatmap-root.d.ts +4 -1
  40. package/dist/icon/index.d.ts +1 -0
  41. package/dist/icon/index.js +1 -0
  42. package/dist/icon/root/icon-root.d.ts +1 -1
  43. package/dist/icon/root/icon-root.js +1 -1
  44. package/dist/icon/root/index.d.ts +2 -0
  45. package/dist/icon/root/index.js +2 -0
  46. package/dist/icon-button/root/icon-button-root.css.js +37 -0
  47. package/dist/icon-button/root/icon-button-root.d.ts +4 -0
  48. package/dist/icon-button/root/icon-button-root.js +2 -1
  49. package/dist/input/root/input-root.css.js +3 -3
  50. package/dist/input/root/input-root.d.ts +3 -0
  51. package/dist/legend/root/legend-root.css.js +40 -13
  52. package/dist/legend/root/legend-root.d.ts +6 -0
  53. package/dist/legend/root/legend-root.js +1 -1
  54. package/dist/lightbox/root/lightbox-root.css.js +84 -0
  55. package/dist/lightbox/root/lightbox-root.d.ts +1 -0
  56. package/dist/loader/root/loader-root.css.js +10 -0
  57. package/dist/loader/root/loader-root.d.ts +3 -0
  58. package/dist/meter/root/meter-root.css.js +23 -1
  59. package/dist/meter/root/meter-root.d.ts +5 -0
  60. package/dist/notifications/notification/notification.css.js +5 -0
  61. package/dist/number-input/root/number-input-root.css.js +3 -3
  62. package/dist/number-input/root/number-input-root.d.ts +3 -0
  63. package/dist/pin-input/root/pin-input-root.css.js +12 -5
  64. package/dist/pin-input/root/pin-input-root.d.ts +5 -0
  65. package/dist/popover/root/popover-root.css.js +36 -0
  66. package/dist/popover/root/popover-root.d.ts +1 -0
  67. package/dist/progress/root/progress-root.css.js +22 -1
  68. package/dist/progress/root/progress-root.d.ts +5 -0
  69. package/dist/quote/root/quote-root.css.js +1 -1
  70. package/dist/quote/root/quote-root.d.ts +1 -0
  71. package/dist/shared/chart/tooltip.css.js +25 -2
  72. package/dist/shared/field/field-segments.css.d.ts +1 -0
  73. package/dist/shared/field/field-segments.css.js +40 -0
  74. package/dist/skeleton/root/skeleton-root.css.js +56 -5
  75. package/dist/skeleton/root/skeleton-root.d.ts +17 -1
  76. package/dist/skeleton/root/skeleton-root.js +3 -0
  77. package/dist/stat/root/stat-root.css.js +7 -7
  78. package/dist/stat/root/stat-root.d.ts +8 -0
  79. package/dist/switch/root/switch-root.css.js +13 -5
  80. package/dist/switch/root/switch-root.d.ts +25 -1
  81. package/dist/switch/root/switch-root.js +7 -0
  82. package/dist/tag/group/tag-group.css.d.ts +1 -0
  83. package/dist/tag/group/tag-group.css.js +6 -0
  84. package/dist/tag/group/tag-group.d.ts +25 -0
  85. package/dist/tag/group/tag-group.js +16 -0
  86. package/dist/tag/index.d.ts +1 -0
  87. package/dist/tag/index.js +1 -0
  88. package/dist/tag/root/tag-root.css.js +50 -0
  89. package/dist/tag/root/tag-root.d.ts +4 -0
  90. package/dist/textarea/root/textarea-root.css.js +12 -4
  91. package/dist/textarea/root/textarea-root.d.ts +4 -0
  92. package/dist/time-input/root/time-input-root.css.js +19 -0
  93. package/dist/time-input/root/time-input-root.d.ts +8 -0
  94. package/dist/time-input/root/time-input-root.js +2 -0
  95. package/dist/toast/item/toast-item.css.js +16 -0
  96. package/dist/toggle/group/toggle-group.css.js +16 -0
  97. package/dist/tour/root/tour-root.css.js +8 -0
  98. package/dist/tour/stop/tour-stop.css.js +32 -0
  99. package/dist/trend/root/trend-root.css.js +12 -5
  100. package/dist/trend/root/trend-root.d.ts +6 -1
  101. package/lint.json +1 -1
  102. package/package.json +6 -6
  103. package/types/jsx.d.ts +4556 -111
  104. package/types/svelte.d.ts +1 -0
  105. package/types/vue.d.ts +1307 -24
@@ -235,6 +235,70 @@ border-color: var(--helix-color-danger);
235
235
  outline-color: var(--helix-color-danger);
236
236
  }
237
237
 
238
+ [part="fields"] {
239
+ display: grid;
240
+ gap: var(--color-picker-fields-gap, var(--helix-space-xs));
241
+ grid-auto-columns: minmax(0, 1fr);
242
+ grid-auto-flow: column;
243
+ margin-block-start: var(--helix-space-sm);
244
+ padding-inline: var(--color-picker-padding, var(--helix-space-none));
245
+ }
246
+
247
+ :host([alpha]) [part="fields"] {
248
+ grid-auto-flow: row;
249
+ grid-template-columns: repeat(2, minmax(0, 1fr));
250
+ }
251
+
252
+ [part="field"] {
253
+ display: flex;
254
+ flex-direction: column;
255
+ gap: var(--helix-space-2xs);
256
+ min-inline-size: 0;
257
+ }
258
+
259
+ [part="field-label"] {
260
+ color: var(--color-picker-field-label-color, var(--helix-color-foreground-muted));
261
+ font-family: var(--helix-font-sans);
262
+ font-size: var(--helix-text-sm);
263
+ font-weight: var(--helix-weight-medium);
264
+ }
265
+
266
+ [part="field-input"] {
267
+ all: unset;
268
+
269
+ appearance: textfield;
270
+ background-color: var(--helix-color-surface-sunken);
271
+ block-size: var(--helix-size-control);
272
+ border: var(--helix-border-thin) solid var(--helix-color-border);
273
+ border-radius: var(--helix-radii-sm);
274
+ box-sizing: border-box;
275
+ color: var(--helix-color-foreground);
276
+ font-family: var(--helix-font-sans);
277
+ font-size: var(--helix-text-control);
278
+ font-variant-numeric: tabular-nums;
279
+ font-weight: var(--helix-weight-medium);
280
+ inline-size: 100%;
281
+ min-inline-size: 0;
282
+ padding-inline: var(--helix-space-xs);
283
+ transition: border-color var(--helix-duration-fast) var(--helix-easing-standard);
284
+ }
285
+
286
+ [part="field-input"]::-webkit-inner-spin-button,
287
+ [part="field-input"]::-webkit-outer-spin-button {
288
+ appearance: none;
289
+ margin: 0;
290
+ }
291
+
292
+ [part="field-input"]:hover {
293
+ border-color: var(--helix-color-foreground-muted);
294
+ }
295
+
296
+ [part="field-input"]:focus-visible {
297
+ border-color: var(--helix-color-primary);
298
+ outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);
299
+ outline-offset: 0;
300
+ }
301
+
238
302
  [part="actions"] {
239
303
  display: flex;
240
304
  flex: 1 1 auto;
@@ -34,6 +34,8 @@ import '../../slider/index.js';
34
34
  * @aliases Color, ColorArea, Swatch picker
35
35
  * @documentation https://fusion.dev/helix/components/color-picker
36
36
  *
37
+ * @cssproperty --color-picker-field-label-color - The color of the names above the channel number fields, in `channel-fields`.
38
+ * @cssproperty --color-picker-fields-gap - The space between the channel number fields, in `channel-fields`.
37
39
  * @cssproperty --color-picker-grid-radius - The corner radius of the square.
38
40
  * @cssproperty --color-picker-grid-ratio - The aspect ratio of the square.
39
41
  * @cssproperty --color-picker-padding - The inset of the rows under the square and of the picker's bottom edge.
@@ -20,6 +20,11 @@ color: var(--helix-color-success);
20
20
  color: var(--helix-color-success);
21
21
  }
22
22
 
23
+ [part="button"][data-failed],
24
+ :host(:not(:disabled)) [part="button"][data-failed]:hover {
25
+ color: var(--helix-color-danger);
26
+ }
27
+
23
28
  slot > svg {
24
29
  block-size: var(--helix-size-icon-tight);
25
30
  inline-size: var(--helix-size-icon-tight);
@@ -77,6 +77,25 @@ flex-basis: 0;
77
77
  min-inline-size: var(--helix-size-icon-loose);
78
78
  }
79
79
 
80
+ [part="segments"] {
81
+ --_segment-focus-background-color: var(
82
+ --date-input-segment-focus-background-color,
83
+ var(--helix-color-primary)
84
+ );
85
+ --_segment-focus-color: var(
86
+ --date-input-segment-focus-color,
87
+ var(--helix-color-foreground-on-primary)
88
+ );
89
+ --_segment-literal-color: var(
90
+ --date-input-segment-literal-color,
91
+ var(--helix-color-foreground-muted)
92
+ );
93
+ --_segment-placeholder-color: var(
94
+ --date-input-segment-placeholder-color,
95
+ var(--helix-color-foreground-subtle)
96
+ );
97
+ }
98
+
80
99
  @media print {
81
100
  :host {
82
101
  print-color-adjust: exact;
@@ -27,6 +27,14 @@ import '../../tag/index.js';
27
27
  * @cssproperty --date-input-border-width - The width of the panel's border. It
28
28
  * follows `--helix-border-floating`, which is `0`, so the panel stands out by its
29
29
  * shadow unless a theme sets a border.
30
+ * @cssproperty --date-input-segment-focus-background-color - The fill behind the
31
+ * segment with focus, in `segmented`. It follows `--helix-color-primary`.
32
+ * @cssproperty --date-input-segment-focus-color - The text of the segment with
33
+ * focus, in `segmented`.
34
+ * @cssproperty --date-input-segment-literal-color - The text the locale writes
35
+ * between two segments, in `segmented`.
36
+ * @cssproperty --date-input-segment-placeholder-color - The dashes of a segment
37
+ * with nothing in it, in `segmented`. It matches the text field's placeholder.
30
38
  * @cssproperty --date-input-shadow - The shadow under the panel. It follows
31
39
  * `--helix-shadow-floating`. The panel can sit over any content, so it has a
32
40
  * shadow by default.
@@ -10,6 +10,7 @@ import '../../date-picker/index.js';
10
10
  import '../../tag/index.js';
11
11
  import { styles as fieldStyles } from '../../shared/field/field.css.js';
12
12
  import { styles as fieldFrameStyles } from '../../shared/field/field-frame.css.js';
13
+ import { styles as fieldSegmentsStyles } from '../../shared/field/field-segments.css.js';
13
14
  import { styles as fieldStackedStyles } from '../../shared/field/field-stacked.css.js';
14
15
  import { styles as floatingEntranceStyles } from '../../shared/floating/entrance.css.js';
15
16
  import { styles as floatingPanelStyles } from '../../shared/floating/panel.css.js';
@@ -21,6 +22,7 @@ let HelixDateInput = class HelixDateInput extends HelixHeadlessDateInput {
21
22
  fieldStyles,
22
23
  fieldFrameStyles,
23
24
  fieldStackedStyles,
25
+ fieldSegmentsStyles,
24
26
  tagRowStyles,
25
27
  floatingPanelStyles,
26
28
  floatingEntranceStyles,
@@ -68,6 +68,74 @@ outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);
68
68
  outline-offset: var(--helix-size-focus-offset);
69
69
  }
70
70
 
71
+ [part="heading-button"] {
72
+ all: unset;
73
+ box-sizing: border-box;
74
+ border-radius: var(--helix-radii-sm);
75
+ cursor: pointer;
76
+ padding-inline: var(--helix-space-2xs);
77
+ }
78
+
79
+ [part="heading-button"]:hover:not(:disabled) {
80
+ background-color: var(--helix-color-surface-sunken);
81
+ }
82
+
83
+ [part="heading-button"]:focus-visible {
84
+ outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);
85
+ outline-offset: var(--helix-size-focus-offset);
86
+ }
87
+
88
+ [part="periods"] {
89
+ display: grid;
90
+ gap: var(--helix-space-2xs);
91
+ inline-size: calc(var(--_calendar-track) * 7);
92
+ }
93
+
94
+ [part="period-row"] {
95
+ display: grid;
96
+ gap: var(--helix-space-2xs);
97
+ grid-template-columns: repeat(3, 1fr);
98
+ }
99
+
100
+ [part~="period"] {
101
+ align-items: center;
102
+ block-size: var(--date-picker-period-size, calc(var(--_calendar-row) * 1.5));
103
+ border-radius: var(--helix-radii-sm);
104
+ cursor: pointer;
105
+ display: inline-flex;
106
+ font-size: var(--helix-text-sm);
107
+ justify-content: center;
108
+ transition: background-color var(--helix-duration-fast) var(--helix-easing-standard);
109
+ }
110
+
111
+ [part~="period"]:hover:not([aria-disabled]) {
112
+ background-color: var(--helix-color-surface-sunken);
113
+ }
114
+
115
+ [part~="period-current"] {
116
+ box-shadow: inset 0 0 0 var(--helix-border-thin) var(--helix-color-border);
117
+ }
118
+
119
+ [part~="period-selected"] {
120
+ background-color: var(--date-picker-selected-color, var(--helix-color-surface-inverse));
121
+ color: var(--helix-color-foreground-inverse);
122
+ }
123
+
124
+ [part~="period-selected"]:hover:not([aria-disabled]) {
125
+ background-color: var(--date-picker-selected-color, var(--helix-color-surface-inverse));
126
+ }
127
+
128
+ [part~="period-disabled"] {
129
+ color: var(--helix-color-foreground-subtle);
130
+ cursor: default;
131
+ opacity: 0.4;
132
+ }
133
+
134
+ [part~="period"]:focus-visible {
135
+ outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);
136
+ outline-offset: var(--helix-size-focus-offset);
137
+ }
138
+
71
139
  [part="previous"]:disabled,
72
140
  [part="next"]:disabled {
73
141
  cursor: default;
@@ -25,6 +25,7 @@ import type { CSSResultGroup } from 'lit';
25
25
  *
26
26
  * @cssproperty --date-picker-columns - Months per row. Two unless there is only one.
27
27
  * @cssproperty --date-picker-day-size - Width and height of a day.
28
+ * @cssproperty --date-picker-period-size - Height of a month or a year in the months and years views, where `max-view` is set.
28
29
  * @cssproperty --date-picker-range-color - Band behind the days in a range.
29
30
  * @cssproperty --date-picker-row-size - Height of a week row.
30
31
  * @cssproperty --date-picker-selected-color - Fill behind a selected day.
@@ -176,6 +176,53 @@ justify-content: center;
176
176
  margin-inline: auto;
177
177
  }
178
178
 
179
+ [part="dismiss"] {
180
+ all: unset;
181
+
182
+ box-sizing: border-box;
183
+ position: absolute;
184
+ inset-block-start: calc(
185
+ var(--dialog-padding, var(--helix-space-lg)) +
186
+ (var(--helix-text-xl) * var(--helix-leading-tight) - var(--helix-size-control-sm)) /
187
+ 2
188
+ );
189
+ inset-inline-end: var(--helix-space-md);
190
+ block-size: var(--helix-size-control-sm);
191
+ border-radius: var(--helix-radii-sm);
192
+ color: var(--helix-color-foreground-muted);
193
+ cursor: pointer;
194
+ display: inline-flex;
195
+ inline-size: var(--helix-size-control-sm);
196
+ place-content: center;
197
+ place-items: center;
198
+ transition: color var(--helix-duration-fast) var(--helix-easing-standard);
199
+ }
200
+
201
+ [part="dismiss"] svg {
202
+ block-size: var(--helix-size-icon-sm);
203
+ inline-size: var(--helix-size-icon-sm);
204
+ }
205
+
206
+ [part="dismiss"]:hover {
207
+ background-color: color-mix(in oklab, var(--helix-color-foreground) 8%, transparent);
208
+ color: var(--helix-color-foreground);
209
+ }
210
+
211
+ [part="dismiss"]:focus-visible {
212
+ outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);
213
+ outline-offset: var(--helix-size-focus-offset);
214
+ }
215
+
216
+ :host([dismissible]) ::slotted([slot="header"]) {
217
+ padding-inline-end: calc(var(--helix-size-control-sm) + var(--helix-space-xs));
218
+ }
219
+
220
+ @media (prefers-reduced-motion: reduce) {
221
+ [part="dismiss"] {
222
+ transition: none;
223
+ }
224
+ }
225
+
179
226
  @media print {
180
227
  :host {
181
228
  display: none;
@@ -7,8 +7,8 @@ display: flex;
7
7
  }
8
8
 
9
9
  [part="content"] {
10
- color: var(--helix-color-foreground-muted);
11
- margin-inline: var(--helix-space-sm);
10
+ color: var(--divider-content-color, var(--helix-color-foreground-muted));
11
+ margin-inline: var(--divider-content-gap, var(--helix-space-sm));
12
12
  display: inline-flex;
13
13
  flex: 0 0 auto;
14
14
  font-family: var(--helix-font-sans);
@@ -49,7 +49,7 @@ flex-direction: column;
49
49
  }
50
50
 
51
51
  :host([orientation="vertical"]) [part="content"] {
52
- margin-block: var(--helix-space-sm);
52
+ margin-block: var(--divider-content-gap, var(--helix-space-sm));
53
53
  margin-inline: var(--helix-space-none);
54
54
  }
55
55
 
@@ -74,6 +74,11 @@ inline-size: var(--_divider-thickness);
74
74
  min-block-size: 1em;
75
75
  }
76
76
 
77
+ :host([content-placement="start"]) [part="line"]:has(+ [part="content"]:not([data-empty])),
78
+ :host([content-placement="end"]) [part="content"]:not([data-empty]) + [part="line"] {
79
+ flex: 0 0 var(--divider-content-offset, var(--helix-space-lg));
80
+ }
81
+
77
82
  @media print {
78
83
  :host {
79
84
  print-color-adjust: economy;
@@ -8,15 +8,23 @@ import type { CSSResultGroup } from 'lit';
8
8
  * default. A vertical divider stretches to fit its flex parent, so it matches
9
9
  * the height of what it sits beside.
10
10
  *
11
+ * Content set into the line sits at its middle. `content-placement` moves it
12
+ * toward the start or the end, leaving a short length of line before or after
13
+ * it, the way a section label sits in a form.
14
+ *
11
15
  * @since 0.1.0
12
16
  * @status stable
13
17
  * @category layout
14
18
  * @aliases Separator, Rule
15
19
  * @documentation https://fusion.dev/helix/components/divider
16
20
  *
17
- * @csspart line - The line.
21
+ * @csspart content - The content set into the line.
22
+ * @csspart line - The line, or each half of it when content is set into it.
18
23
  *
19
24
  * @cssproperty --divider-color - The color of the line.
25
+ * @cssproperty --divider-content-color - The color of the content set into the line.
26
+ * @cssproperty --divider-content-gap - The space either side of the content set into the line.
27
+ * @cssproperty --divider-content-offset - The length of line before the content under `content-placement="start"`, or after it under `end`.
20
28
  * @cssproperty --divider-length - The length of a vertical line. A horizontal line takes the divider's width.
21
29
  * @cssproperty --divider-padding - The space removed from both ends of the line.
22
30
  * @cssproperty --divider-padding-end - The space removed from the end of the line only.
@@ -24,6 +32,14 @@ import type { CSSResultGroup } from 'lit';
24
32
  * @cssproperty --divider-thickness - The thickness of the line.
25
33
  */
26
34
  export declare class HelixDivider extends HelixHeadlessDivider {
35
+ /**
36
+ * Where content set into the line sits along it.
37
+ *
38
+ * Absent is the middle. `start` and `end` move it toward one end, with a
39
+ * short length of line, `--divider-content-offset`, kept before or after it.
40
+ * A divider with nothing set into it is one line whatever this says.
41
+ */
42
+ contentPlacement?: 'end' | 'start';
27
43
  static styles: CSSResultGroup;
28
44
  }
29
45
  declare global {
@@ -6,10 +6,14 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
6
6
  };
7
7
  import { customElement } from '@fusion.dev/helix-core';
8
8
  import { HelixHeadlessDivider } from '@fusion.dev/helix-headless/divider';
9
+ import { property } from 'lit/decorators.js';
9
10
  import { styles } from './divider-root.css.js';
10
11
  let HelixDivider = class HelixDivider extends HelixHeadlessDivider {
11
12
  static { this.styles = styles; }
12
13
  };
14
+ __decorate([
15
+ property({ attribute: 'content-placement', reflect: true })
16
+ ], HelixDivider.prototype, "contentPlacement", void 0);
13
17
  HelixDivider = __decorate([
14
18
  customElement('helix-divider')
15
19
  ], HelixDivider);
@@ -134,7 +134,23 @@ inset-inline: 0;
134
134
  border: var(--drawer-border-width, var(--helix-border-floating)) solid
135
135
  var(--drawer-border-color, var(--helix-color-border));
136
136
  box-shadow: var(--drawer-shadow, var(--helix-shadow-floating));
137
- transform: translate(0, 0);
137
+
138
+ transform: translate(var(--drawer-swipe-x, 0), var(--drawer-swipe-y, 0));
139
+ }
140
+
141
+ [part="panel"],
142
+ [part="content"] {
143
+ touch-action: pan-y;
144
+ }
145
+
146
+ :host([placement="bottom"]) [part="panel"],
147
+ :host([placement="top"]) [part="panel"] {
148
+ touch-action: pan-x;
149
+ }
150
+
151
+ [part="panel"][data-swiping] {
152
+ transition: none;
153
+ user-select: none;
138
154
  }
139
155
 
140
156
  @starting-style {
@@ -159,6 +175,17 @@ margin: var(--helix-space-none);
159
175
  margin-block-end: var(--helix-space-md);
160
176
  }
161
177
 
178
+ [part="footer"] {
179
+ flex: 0 0 auto;
180
+ }
181
+
182
+ ::slotted([slot="footer"]) {
183
+ display: flex;
184
+ flex-wrap: wrap;
185
+ gap: var(--helix-space-xs);
186
+ margin-block-start: var(--helix-space-md);
187
+ }
188
+
162
189
  [part="content"] {
163
190
  flex: 1 1 auto;
164
191
  min-block-size: 0;
@@ -4,6 +4,7 @@ registerElementEvents({
4
4
  'helix-announcement': ['helix-dismiss'],
5
5
  'helix-app-header': ['helix-scrolled'],
6
6
  'helix-avatar': ['error', 'load'],
7
+ 'helix-callout': ['helix-dismiss'],
7
8
  'helix-canvas': [
8
9
  'helix-before-move',
9
10
  'helix-before-reconnect',
@@ -58,7 +59,7 @@ registerElementEvents({
58
59
  'helix-select',
59
60
  'toggle',
60
61
  ],
61
- 'helix-copy-button': ['helix-copy'],
62
+ 'helix-copy-button': ['helix-copy', 'helix-copy-error'],
62
63
  'helix-data-table': [
63
64
  'helix-activate',
64
65
  'helix-filter',
@@ -84,7 +85,7 @@ registerElementEvents({
84
85
  'helix-drawer': ['close', 'helix-before-close', 'helix-before-open', 'toggle'],
85
86
  'helix-drilldown': ['helix-select'],
86
87
  'helix-drilldown-item': ['helix-select'],
87
- 'helix-file-input': ['change', 'helix-before-change', 'input'],
88
+ 'helix-file-input': ['change', 'helix-before-change', 'helix-reject', 'input'],
88
89
  'helix-filter-chip': ['helix-dismiss'],
89
90
  'helix-filter-input': [
90
91
  'change',
@@ -110,10 +111,11 @@ registerElementEvents({
110
111
  'helix-graph-zoom',
111
112
  ],
112
113
  'helix-heatmap': ['helix-resize'],
113
- 'helix-icon': ['error'],
114
+ 'helix-icon': ['error', 'load'],
114
115
  'helix-image': ['error', 'load'],
115
- 'helix-input': ['change', 'helix-before-change', 'input'],
116
+ 'helix-input': ['change', 'helix-before-change', 'helix-clear', 'input'],
116
117
  'helix-kbd': ['helix-shortcut'],
118
+ 'helix-legend': ['change', 'helix-before-change'],
117
119
  'helix-lightbox': [
118
120
  'close',
119
121
  'helix-activate',
@@ -163,7 +165,7 @@ registerElementEvents({
163
165
  'helix-qr-code': ['error'],
164
166
  'helix-radio': ['helix-select'],
165
167
  'helix-radio-group': ['change', 'helix-before-change', 'helix-select', 'input'],
166
- 'helix-rating': ['change', 'helix-before-change', 'input'],
168
+ 'helix-rating': ['change', 'helix-before-change', 'helix-clear', 'input'],
167
169
  'helix-sandbox': [
168
170
  'helix-before-edit',
169
171
  'helix-before-panel-resize',
@@ -200,6 +202,7 @@ registerElementEvents({
200
202
  'helix-table-column': ['helix-before-resize'],
201
203
  'helix-tabs': ['helix-activate', 'helix-before-activate', 'helix-select'],
202
204
  'helix-tag': ['helix-dismiss'],
205
+ 'helix-tag-group': ['change', 'helix-before-change', 'helix-dismiss'],
203
206
  'helix-textarea': ['change', 'helix-before-change', 'input'],
204
207
  'helix-time-input': [
205
208
  'change',
@@ -3,37 +3,37 @@ export const styles = createSheet(`:host {
3
3
  align-items: center;
4
4
  display: flex;
5
5
  flex-direction: column;
6
- gap: var(--helix-space-sm);
6
+ gap: var(--empty-gap, var(--helix-space-sm));
7
7
  padding: var(--empty-padding, var(--helix-space-2xl));
8
8
  text-align: center;
9
9
  }
10
10
 
11
11
  slot[name="icon"]::slotted(*) {
12
12
 
13
- --icon-size: var(--helix-size-icon-lg);
13
+ --icon-size: var(--empty-icon-size, var(--helix-size-icon-lg));
14
14
 
15
- color: var(--helix-color-foreground-subtle);
15
+ color: var(--empty-icon-color, var(--helix-color-foreground-subtle));
16
16
  }
17
17
 
18
18
  slot[name="heading"]::slotted(*) {
19
- color: var(--helix-color-foreground);
20
- font-size: var(--helix-text-lg);
19
+ color: var(--empty-heading-color, var(--helix-color-foreground));
20
+ font-size: var(--empty-heading-size, var(--helix-text-lg));
21
21
  font-weight: var(--helix-weight-semibold);
22
22
  letter-spacing: var(--helix-tracking-tight);
23
23
  margin: var(--helix-space-none);
24
24
  }
25
25
 
26
26
  slot:not([name]) {
27
- color: var(--helix-color-foreground-muted);
28
- font-size: var(--helix-text-sm);
27
+ color: var(--empty-message-color, var(--helix-color-foreground-muted));
28
+ font-size: var(--empty-message-size, var(--helix-text-sm));
29
29
  }
30
30
 
31
31
  slot:not([name])::slotted(*) {
32
32
  margin: var(--helix-space-none);
33
- max-inline-size: 46ch;
33
+ max-inline-size: var(--empty-message-measure, 46ch);
34
34
  }
35
35
  slot[name="actions"]::slotted(*) {
36
- margin-block-start: var(--helix-space-sm);
36
+ margin-block-start: var(--empty-actions-gap, var(--helix-space-sm));
37
37
  }
38
38
 
39
39
  @media print {
@@ -13,6 +13,15 @@ import type { CSSResultGroup } from 'lit';
13
13
  * @aliases Placeholder, NoResults, Blank
14
14
  * @documentation https://fusion.dev/helix/components/empty
15
15
  *
16
+ * @cssproperty --empty-actions-gap - Space added above the actions.
17
+ * @cssproperty --empty-gap - Space between the icon, the heading, the message and the actions.
18
+ * @cssproperty --empty-heading-color - Color of the heading.
19
+ * @cssproperty --empty-heading-size - Size of the heading.
20
+ * @cssproperty --empty-icon-color - Color of the icon.
21
+ * @cssproperty --empty-icon-size - Size of the icon.
22
+ * @cssproperty --empty-message-color - Color of the message.
23
+ * @cssproperty --empty-message-measure - Widest the message runs before it wraps.
24
+ * @cssproperty --empty-message-size - Size of the message.
16
25
  * @cssproperty --empty-padding - Space around the whole block.
17
26
  */
18
27
  export declare class HelixEmpty extends HelixHeadlessEmpty {
@@ -11,10 +11,12 @@ import { styles as fieldStyles } from '../../shared/field/field.css.js';
11
11
  import { styles as fieldFrameStyles } from '../../shared/field/field-frame.css.js';
12
12
  import { styles as fieldStackedStyles } from '../../shared/field/field-stacked.css.js';
13
13
  import { styles as glyphStyles } from '../../shared/glyph/glyph.css.js';
14
+ import { styles as liveStyles } from '../../shared/live/live.css.js';
14
15
  import { styles } from './file-input-root.css.js';
15
16
  let HelixFileInput = class HelixFileInput extends HelixHeadlessFileInput {
16
17
  static { this.tier = 'helix-'; }
17
18
  static { this.styles = [
19
+ liveStyles,
18
20
  glyphStyles,
19
21
  fieldStyles,
20
22
  fieldFrameStyles,
@@ -13,10 +13,12 @@ import { styles as fieldStackedStyles } from '../../shared/field/field-stacked.c
13
13
  import { styles as floatingEntranceStyles } from '../../shared/floating/entrance.css.js';
14
14
  import { styles as floatingPanelStyles } from '../../shared/floating/panel.css.js';
15
15
  import { styles as glyphStyles } from '../../shared/glyph/glyph.css.js';
16
+ import { styles as liveStyles } from '../../shared/live/live.css.js';
16
17
  import { styles as tagRowStyles } from '../../shared/tags/tags.css.js';
17
18
  import { styles } from './filter-input-root.css.js';
18
19
  let HelixFilterInput = class HelixFilterInput extends HelixHeadlessFilterInput {
19
20
  static { this.styles = [
21
+ liveStyles,
20
22
  glyphStyles,
21
23
  fieldStyles,
22
24
  fieldFrameStyles,
@@ -49,7 +49,7 @@ justify-content: start;
49
49
  position: relative;
50
50
  }
51
51
 
52
- [part="cell"] {
52
+ [part~="cell"] {
53
53
  background-color: var(--heatmap-tone, var(--helix-color-surface-sunken));
54
54
  border-radius: var(--heatmap-cell-radius, calc(var(--helix-radii-sm) * 0.5));
55
55
  inline-size: var(--_heatmap-cell-width);
@@ -74,7 +74,7 @@ font-weight: var(--helix-weight-medium);
74
74
  opacity: 0.72;
75
75
  }
76
76
 
77
- [part="tooltip-cell"] {
77
+ [part~="tooltip-cell"] {
78
78
  align-items: baseline;
79
79
  display: flex;
80
80
  gap: var(--helix-space-sm);
@@ -91,16 +91,44 @@ font-weight: var(--helix-weight-medium);
91
91
  }
92
92
 
93
93
  @media (hover: hover) {
94
- [part="cell"]:hover {
94
+ [part~="cell"]:hover {
95
95
  outline: var(--helix-border-thin) solid var(--helix-color-foreground);
96
96
  outline-offset: var(--helix-border-thin);
97
97
  }
98
98
 
99
- [part="strip"]:not([data-spaced]) [part="cell"]:hover {
99
+ [part="strip"]:not([data-spaced]) [part~="cell"]:hover {
100
100
  outline-offset: calc(var(--helix-border-thin) * -1);
101
101
  }
102
102
  }
103
103
 
104
+ [part~="cell-active"] {
105
+ outline: var(--helix-border-thin) solid var(--helix-color-foreground);
106
+ outline-offset: var(--helix-border-thin);
107
+ }
108
+
109
+ [part="strip"]:not([data-spaced]) [part~="cell-active"] {
110
+ outline-offset: calc(var(--helix-border-thin) * -1);
111
+ }
112
+
113
+ [part="strip"]:focus-visible {
114
+ outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);
115
+ outline-offset: var(--helix-size-focus-offset);
116
+ }
117
+
118
+ [part~="tooltip-cell-current"] {
119
+ font-weight: var(--helix-weight-medium);
120
+ }
121
+
122
+ [part="live"] {
123
+ block-size: 1px;
124
+ clip-path: inset(50%);
125
+ inline-size: 1px;
126
+ margin: var(--helix-space-none);
127
+ overflow: hidden;
128
+ position: absolute;
129
+ white-space: nowrap;
130
+ }
131
+
104
132
  [part="footer"] {
105
133
  align-items: baseline;
106
134
  color: var(--helix-color-foreground-subtle);
@@ -133,7 +161,7 @@ text-align: center;
133
161
  }
134
162
 
135
163
  @media print {
136
- [part="cell"] {
164
+ [part~="cell"] {
137
165
  outline: var(--helix-border-thin) solid var(--helix-color-border);
138
166
  outline-offset: calc(var(--helix-border-thin) * -1);
139
167
  }
@@ -26,9 +26,11 @@ import '../../tooltip/index.js';
26
26
  * @slot summary - Below the strip, in the middle.
27
27
  *
28
28
  * @csspart cell - One reading.
29
+ * @csspart cell-active - The cell the pointer or the keys rest on, ringed as a hovered cell is. Set alongside `cell`.
29
30
  * @csspart footer - The three-slot row under the strip.
31
+ * @csspart live - The readout, a polite live region the sheet hides visually.
30
32
  * @csspart mark - The invisible point the tooltip is anchored to.
31
- * @csspart strip - The grid of cells.
33
+ * @csspart strip - The grid of cells, which takes focus to be read by key.
32
34
  * @csspart tooltip - The bubble, forwarded from `Tooltip`.
33
35
  * @csspart tooltip-anchor - The `Tooltip` element itself.
34
36
  * @csspart tooltip-arrow - The bubble's point, forwarded from `Tooltip`.
@@ -38,6 +40,7 @@ import '../../tooltip/index.js';
38
40
  * @csspart tooltip-arrow-top - The point while the bubble is above the reading, on its bottom edge. Set alongside `tooltip-arrow`.
39
41
  * @csspart tooltip-bottom - The bubble while it is below the reading. Set alongside `tooltip`.
40
42
  * @csspart tooltip-cell - One column's name and value inside the tooltip.
43
+ * @csspart tooltip-cell-current - The cell the series keys rest on, in the charts whose readings hold several series. A strip draws one, so it is never set here.
41
44
  * @csspart tooltip-label - The reading's own name inside the tooltip.
42
45
  * @csspart tooltip-left - The bubble while it is left of the reading. Set alongside `tooltip`.
43
46
  * @csspart tooltip-name - A column's name inside the tooltip.
@@ -1 +1,2 @@
1
+ export { type IconResolver, registerIconLibrary, registerIcons, resolveIcon, } from '@fusion.dev/helix-headless/icon';
1
2
  export * from './root/icon-root.js';