@fusion.dev/helix 0.148.0 → 0.149.1

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 (54) hide show
  1. package/custom-elements.json +7471 -982
  2. package/dist/chat/root/chat-root.css.js +3 -1
  3. package/dist/chat/root/chat-root.d.ts +3 -0
  4. package/dist/data-table/root/data-table-root.css.js +20 -8
  5. package/dist/data-table/root/data-table-root.d.ts +12 -0
  6. package/dist/element-events.generated.js +32 -4
  7. package/dist/list/item/list-item.css.js +4 -2
  8. package/dist/list/item/list-item.d.ts +4 -0
  9. package/dist/list/root/list-root.css.js +2 -1
  10. package/dist/list/root/list-root.d.ts +6 -0
  11. package/dist/list/root/list-root.js +2 -1
  12. package/dist/listbox/reorder/index.d.ts +1 -0
  13. package/dist/listbox/reorder/index.js +6 -0
  14. package/dist/listbox/reorder/listbox-drag-preview.css.d.ts +1 -0
  15. package/dist/listbox/reorder/listbox-drag-preview.css.js +3 -0
  16. package/dist/listbox/reorder/listbox-reorder.css.d.ts +1 -0
  17. package/dist/listbox/reorder/listbox-reorder.css.js +4 -0
  18. package/dist/listbox/root/listbox-root.d.ts +9 -0
  19. package/dist/notifications/notification/notification.css.js +8 -2
  20. package/dist/notifications/notification/notification.d.ts +13 -5
  21. package/dist/notifications/notification/notification.js +13 -0
  22. package/dist/notifications/root/notifications-root.css.js +3 -1
  23. package/dist/notifications/root/notifications-root.d.ts +17 -2
  24. package/dist/notifications/root/notifications-root.js +13 -1
  25. package/dist/orb/root/orb-root.d.ts +5 -0
  26. package/dist/orb/root/orb-root.js +13 -12
  27. package/dist/sandbox/preview/sandbox-preview.d.ts +5 -0
  28. package/dist/sandbox/preview/sandbox-preview.js +11 -8
  29. package/dist/sandbox/root/sandbox-root.d.ts +8 -3
  30. package/dist/sandbox/root/sandbox-root.js +7 -3
  31. package/dist/sandbox/source/sandbox-source.d.ts +5 -0
  32. package/dist/sandbox/source/sandbox-source.js +4 -1
  33. package/dist/sandbox/status-bar/sandbox-status-bar.d.ts +10 -0
  34. package/dist/sandbox/status-bar/sandbox-status-bar.js +14 -2
  35. package/dist/sandbox/terminal/sandbox-terminal.d.ts +11 -0
  36. package/dist/sandbox/terminal/sandbox-terminal.js +22 -11
  37. package/dist/scroll-area/root/scroll-area-root.css.js +5 -4
  38. package/dist/scroll-area/root/scroll-area-root.d.ts +3 -3
  39. package/dist/table/root/table-root.css.js +3 -1
  40. package/dist/table/root/table-root.d.ts +8 -1
  41. package/dist/table/row/table-row.css.js +9 -1
  42. package/dist/table/row/table-row.d.ts +5 -0
  43. package/dist/tooltip/root/tooltip-root.d.ts +9 -0
  44. package/dist/tree/item/tree-item.css.js +3 -1
  45. package/dist/tree/item/tree-item.d.ts +6 -0
  46. package/dist/tree/root/tree-root.css.js +2 -1
  47. package/dist/tree/root/tree-root.d.ts +8 -1
  48. package/dist/virtual-list/root/virtual-list-root.css.js +6 -1
  49. package/dist/virtual-list/root/virtual-list-root.d.ts +3 -0
  50. package/lint.json +1 -1
  51. package/package.json +10 -9
  52. package/types/jsx.d.ts +4137 -1515
  53. package/types/vue.d.ts +1409 -501
  54. package/types/words.d.ts +2555 -0
@@ -5,7 +5,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
7
  var HelixSandboxPreview_1;
8
- import { customElement, DelayController, HelixConsoleEvent, HelixElement, HelixResizeEvent, } from '@fusion.dev/helix-core';
8
+ import { customElement, DelayController, HelixConsoleEvent, HelixElement, HelixResizeEvent, words, } from '@fusion.dev/helix-core';
9
9
  const SETTLE = 120;
10
10
  import { html } from 'lit';
11
11
  import { property } from 'lit/decorators.js';
@@ -27,26 +27,28 @@ let HelixSandboxPreview = class HelixSandboxPreview extends HelixElement {
27
27
  if (event.source !== this.frame?.contentWindow || event.origin !== 'null') {
28
28
  return;
29
29
  }
30
- if (event.data?.type === 'helix-preview-ready') {
30
+ const data = event.data;
31
+ if (data?.type === 'helix-preview-ready') {
31
32
  this.handleFrameLoad();
32
33
  return;
33
34
  }
34
- if (event.data?.type === 'helix-preview-console') {
35
- this.dispatchEvent(new HelixConsoleEvent({ level: event.data.level, text: event.data.text }));
36
- if (event.data.uncaught) {
35
+ if (data?.type === 'helix-preview-console') {
36
+ this.dispatchEvent(new HelixConsoleEvent({ level: data.level, text: data.text }));
37
+ if (data.uncaught) {
37
38
  this.toggleState('failed', true);
38
39
  }
39
40
  }
40
- if (event.data?.type === 'helix-preview-press') {
41
+ if (data?.type === 'helix-preview-press') {
41
42
  this.dispatchEvent(new PointerEvent('pointerdown', { bubbles: true, composed: true }));
42
43
  }
43
- if (event.data?.type === 'helix-preview-size') {
44
- this.dispatchEvent(new HelixResizeEvent({ size: event.data.size }));
44
+ if (data?.type === 'helix-preview-size') {
45
+ this.dispatchEvent(new HelixResizeEvent({ size: data.size }));
45
46
  }
46
47
  };
47
48
  this.settle = new DelayController(this, { renders: false });
48
49
  }
49
50
  static { HelixSandboxPreview_1 = this; }
51
+ static { this.words = 'helix-sandbox-preview'; }
50
52
  get frame() {
51
53
  return this.renderRoot.querySelector('iframe');
52
54
  }
@@ -123,6 +125,7 @@ __decorate([
123
125
  property()
124
126
  ], HelixSandboxPreview.prototype, "direction", void 0);
125
127
  __decorate([
128
+ words,
126
129
  property()
127
130
  ], HelixSandboxPreview.prototype, "label", void 0);
128
131
  __decorate([
@@ -55,6 +55,11 @@ import type { CSSResultGroup, PropertyValues, TemplateResult } from 'lit';
55
55
  * @cssstate panel-collapsed - While there is a panel and it is no taller than `panel-collapsed-size`.
56
56
  */
57
57
  export declare class HelixSandbox extends HelixElement {
58
+ /**
59
+ * The key this family's words are registered under, its tag:
60
+ * `registerWords('de', { 'helix-sandbox': { panelLabel: 'Bereich anpassen' } })`.
61
+ */
62
+ static words: string;
58
63
  /**
59
64
  * The name of the corner handle that moves both dividers at once, read by
60
65
  * screen readers.
@@ -132,9 +137,9 @@ export declare class HelixSandbox extends HelixElement {
132
137
  panelSize: number;
133
138
  /**
134
139
  * The name of the divider between the panes, read by screen readers.
135
- *
136
- * Empty names the lead pane, "Resize source pane" or "Resize preview pane",
137
- * since the divider's value is that pane's share.
140
+ * `{pane}` is the lead pane, `source` or `preview`, whose share the
141
+ * divider's value is, so each is a whole sentence: "Resize source pane" or
142
+ * "Resize preview pane".
138
143
  */
139
144
  separatorLabel: string;
140
145
  /**
@@ -4,7 +4,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { customElement, HelixBeforePanelResizeEvent, HelixBeforeSplitEvent, HelixElement, HelixPanelResizeEvent, HelixSplitEvent, requestChange, } from '@fusion.dev/helix-core';
7
+ import { customElement, formatWords, HelixBeforePanelResizeEvent, HelixBeforeSplitEvent, HelixElement, HelixPanelResizeEvent, HelixSplitEvent, requestChange, words, } from '@fusion.dev/helix-core';
8
8
  import '../../splitter/index.js';
9
9
  import { html } from 'lit';
10
10
  import { property, state } from 'lit/decorators.js';
@@ -22,7 +22,7 @@ let HelixSandbox = class HelixSandbox extends HelixElement {
22
22
  this.panelCollapsedSize = 0;
23
23
  this.panelLabel = 'Resize panel';
24
24
  this.panelSize = DEFAULT_PANEL;
25
- this.separatorLabel = '';
25
+ this.separatorLabel = '{pane, select, preview {Resize preview pane} other {Resize source pane}}';
26
26
  this.split = DEFAULT_SPLIT;
27
27
  this.hasPanel = false;
28
28
  this.bodyHeight = 0;
@@ -98,6 +98,7 @@ let HelixSandbox = class HelixSandbox extends HelixElement {
98
98
  this.hasPanel = this.querySelector(':scope > [slot="panel"]') !== null;
99
99
  };
100
100
  }
101
+ static { this.words = 'helix-sandbox'; }
101
102
  shareOf(size) {
102
103
  if (this.bodyHeight <= 0) {
103
104
  return 0;
@@ -249,7 +250,7 @@ let HelixSandbox = class HelixSandbox extends HelixElement {
249
250
  const second = first === 'preview' ? 'source' : 'preview';
250
251
  const split = Number.isFinite(this.split) ? this.split : DEFAULT_SPLIT;
251
252
  const home = Number.isFinite(this.defaultSplit) ? this.defaultSplit : DEFAULT_SPLIT;
252
- const label = this.separatorLabel || (first === 'preview' ? 'Resize preview pane' : 'Resize source pane');
253
+ const label = formatWords(this, 'separatorLabel', { pane: first });
253
254
  return html `<slot name="toolbar"></slot>
254
255
  <helix-splitter part="body" ?data-panel=${this.hasPanel} exportparts="separator, corner"
255
256
  orientation="vertical" collapsed-size=${this.panelSliver} corner-label=${this.cornerLabel}
@@ -269,6 +270,7 @@ let HelixSandbox = class HelixSandbox extends HelixElement {
269
270
  static { this.styles = styles; }
270
271
  };
271
272
  __decorate([
273
+ words,
272
274
  property({ attribute: 'corner-label' })
273
275
  ], HelixSandbox.prototype, "cornerLabel", void 0);
274
276
  __decorate([
@@ -287,12 +289,14 @@ __decorate([
287
289
  property({ attribute: 'panel-collapsed-size', type: Number })
288
290
  ], HelixSandbox.prototype, "panelCollapsedSize", void 0);
289
291
  __decorate([
292
+ words,
290
293
  property({ attribute: 'panel-label' })
291
294
  ], HelixSandbox.prototype, "panelLabel", void 0);
292
295
  __decorate([
293
296
  property({ attribute: 'panel-size', type: Number })
294
297
  ], HelixSandbox.prototype, "panelSize", void 0);
295
298
  __decorate([
299
+ words,
296
300
  property({ attribute: 'separator-label' })
297
301
  ], HelixSandbox.prototype, "separatorLabel", void 0);
298
302
  __decorate([
@@ -50,6 +50,11 @@ import { type SandboxTokenizer } from '../tokens.js';
50
50
  * @cssproperty --sandbox-source-tag-color - Color of a `tag` run, under `tokenize`. Defaults to `--helix-color-syntax-tag`.
51
51
  */
52
52
  export declare class HelixSandboxSource extends HelixElement {
53
+ /**
54
+ * The key this part's words are registered under, its tag:
55
+ * `registerWords('de', { 'helix-sandbox-source': { fieldLabel: 'Quelltext' } })`.
56
+ */
57
+ static words: string;
53
58
  /**
54
59
  * The editable region's name, read by screen readers.
55
60
  */
@@ -4,7 +4,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { customElement, HelixBeforeEditEvent, HelixCaretEvent, HelixEditEvent, HelixElement, onUnlessFalse, restoreValue, } from '@fusion.dev/helix-core';
7
+ import { customElement, HelixBeforeEditEvent, HelixCaretEvent, HelixEditEvent, HelixElement, onUnlessFalse, restoreValue, words, } from '@fusion.dev/helix-core';
8
8
  import { html, nothing } from 'lit';
9
9
  import { property } from 'lit/decorators.js';
10
10
  import { drawnRuns } from '../tokens.js';
@@ -54,6 +54,7 @@ let HelixSandboxSource = class HelixSandboxSource extends HelixElement {
54
54
  this.edit(field, field.value);
55
55
  };
56
56
  }
57
+ static { this.words = 'helix-sandbox-source'; }
57
58
  edit(field, next) {
58
59
  const request = new HelixBeforeEditEvent({ value: next });
59
60
  const accepted = this.dispatchEvent(request);
@@ -101,9 +102,11 @@ let HelixSandboxSource = class HelixSandboxSource extends HelixElement {
101
102
  static { this.styles = styles; }
102
103
  };
103
104
  __decorate([
105
+ words,
104
106
  property({ attribute: 'field-label' })
105
107
  ], HelixSandboxSource.prototype, "fieldLabel", void 0);
106
108
  __decorate([
109
+ words,
107
110
  property({ attribute: 'keys-description' })
108
111
  ], HelixSandboxSource.prototype, "keysDescription", void 0);
109
112
  __decorate([
@@ -29,6 +29,11 @@ import type { CSSResultGroup, TemplateResult } from 'lit';
29
29
  * @cssproperty --sandbox-status-bar-color - Color of the bar's text.
30
30
  */
31
31
  export declare class HelixSandboxStatusBar extends HelixElement {
32
+ /**
33
+ * The key this part's words are registered under, its tag:
34
+ * `registerWords('de', { 'helix-sandbox-status-bar': { positionLabel: 'Z. {line}, Sp. {column}' } })`.
35
+ */
36
+ static words: string;
32
37
  /**
33
38
  * One-based column of the cursor.
34
39
  *
@@ -45,6 +50,11 @@ export declare class HelixSandboxStatusBar extends HelixElement {
45
50
  * Absent shows no readout.
46
51
  */
47
52
  line?: number;
53
+ /**
54
+ * How the cursor's place reads. `{line}` and `{column}` are the line and
55
+ * the column, written as an editor writes them, without grouping.
56
+ */
57
+ positionLabel: string;
48
58
  /** How the position reads, or nothing when there is no cursor to report. */
49
59
  private get position();
50
60
  protected render(): TemplateResult;
@@ -4,7 +4,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { customElement, HelixElement } from '@fusion.dev/helix-core';
7
+ import { customElement, formatWords, HelixElement, words } from '@fusion.dev/helix-core';
8
8
  import { html, nothing } from 'lit';
9
9
  import { property } from 'lit/decorators.js';
10
10
  import { styles } from './sandbox-status-bar.css.js';
@@ -15,11 +15,19 @@ const LABELS = {
15
15
  tsx: 'TSX',
16
16
  };
17
17
  let HelixSandboxStatusBar = class HelixSandboxStatusBar extends HelixElement {
18
+ constructor() {
19
+ super(...arguments);
20
+ this.positionLabel = 'Ln {line}, Col {column}';
21
+ }
22
+ static { this.words = 'helix-sandbox-status-bar'; }
18
23
  get position() {
19
24
  if (this.line === undefined || this.column === undefined) {
20
25
  return undefined;
21
26
  }
22
- return `Ln ${this.line}, Col ${this.column}`;
27
+ return formatWords(this, 'positionLabel', {
28
+ column: String(this.column),
29
+ line: String(this.line),
30
+ });
23
31
  }
24
32
  render() {
25
33
  const language = this.language;
@@ -42,6 +50,10 @@ __decorate([
42
50
  __decorate([
43
51
  property({ type: Number })
44
52
  ], HelixSandboxStatusBar.prototype, "line", void 0);
53
+ __decorate([
54
+ words,
55
+ property({ attribute: 'position-label' })
56
+ ], HelixSandboxStatusBar.prototype, "positionLabel", void 0);
45
57
  HelixSandboxStatusBar = __decorate([
46
58
  customElement('helix-sandbox-status-bar')
47
59
  ], HelixSandboxStatusBar);
@@ -43,6 +43,11 @@ import { type ConsoleLevel } from '../levels.js';
43
43
  * @cssproperty --sandbox-terminal-size - Height of the scrolling region.
44
44
  */
45
45
  export declare class HelixSandboxTerminal extends HelixElement {
46
+ /**
47
+ * The key this part's words are registered under, its tag:
48
+ * `registerWords('de', { 'helix-sandbox-terminal': { clearLabel: 'Leeren' } })`.
49
+ */
50
+ static words: string;
46
51
  /**
47
52
  * The clear button's text, under `controls`.
48
53
  */
@@ -81,6 +86,12 @@ export declare class HelixSandboxTerminal extends HelixElement {
81
86
  * that does not parse is no words.
82
87
  */
83
88
  levelWords: Partial<Record<ConsoleLevel, string>>;
89
+ /**
90
+ * What a screen reader is told a repeated line's count is. `{count}` is how
91
+ * many times it was written, two or more, in the locale, and a language
92
+ * writes the forms it has: `{count, plural, few {# razy} other {# razy}}`.
93
+ */
94
+ timesLabel: string;
84
95
  private entries;
85
96
  /**
86
97
  * Whether the reader is at the bottom, and so wants to follow new output.
@@ -4,17 +4,11 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { customElement, HelixBeforeChangeEvent, HelixElement, requestChange, wordsConverter, } from '@fusion.dev/helix-core';
7
+ import { customElement, formatWords, HelixBeforeChangeEvent, HelixElement, requestChange, words, wordsConverter, } from '@fusion.dev/helix-core';
8
8
  import { html, nothing } from 'lit';
9
9
  import { property, state } from 'lit/decorators.js';
10
10
  import { LEVELS, shows } from '../levels.js';
11
11
  import { styles } from './sandbox-terminal.css.js';
12
- const LEVEL_WORDS = {
13
- error: 'Errors',
14
- info: 'Info and above',
15
- log: 'All levels',
16
- warn: 'Warnings and errors',
17
- };
18
12
  const LIMIT = 200;
19
13
  const stop = (event) => event.stopPropagation();
20
14
  let HelixSandboxTerminal = class HelixSandboxTerminal extends HelixElement {
@@ -25,7 +19,13 @@ let HelixSandboxTerminal = class HelixSandboxTerminal extends HelixElement {
25
19
  this.emptyLabel = 'Nothing written to the console yet.';
26
20
  this.label = 'Console output';
27
21
  this.levelLabel = 'Levels shown';
28
- this.levelWords = {};
22
+ this.levelWords = {
23
+ error: 'Errors',
24
+ info: 'Info and above',
25
+ log: 'All levels',
26
+ warn: 'Warnings and errors',
27
+ };
28
+ this.timesLabel = '{count} times';
29
29
  this.entries = [];
30
30
  this.following = true;
31
31
  this.handleLevel = (event) => {
@@ -46,6 +46,7 @@ let HelixSandboxTerminal = class HelixSandboxTerminal extends HelixElement {
46
46
  }
47
47
  };
48
48
  }
49
+ static { this.words = 'helix-sandbox-terminal'; }
49
50
  get log() {
50
51
  return this.renderRoot.querySelector('[part="log"]');
51
52
  }
@@ -77,13 +78,14 @@ let HelixSandboxTerminal = class HelixSandboxTerminal extends HelixElement {
77
78
  if (!this.controls) {
78
79
  return nothing;
79
80
  }
81
+ const clear = this.clearLabel;
80
82
  return html `<div part="controls">
81
83
  <select part="filter" aria-label=${this.levelLabel} @change=${this.handleLevel} @input=${stop}>
82
84
  ${LEVELS.map((one) => html `<option value=${one} ?selected=${(this.level ?? 'log') === one}>
83
- ${this.levelWords?.[one] ?? LEVEL_WORDS[one]}
85
+ ${this.levelWords[one]}
84
86
  </option>`)}
85
87
  </select>
86
- <button part="clear" type="button" @click=${() => this.clear()}>${this.clearLabel}</button>
88
+ <button part="clear" type="button" @click=${() => this.clear()}>${clear}</button>
87
89
  </div>`;
88
90
  }
89
91
  render() {
@@ -97,7 +99,7 @@ let HelixSandboxTerminal = class HelixSandboxTerminal extends HelixElement {
97
99
  >
98
100
  <span part="message">${entry.text}</span>
99
101
  ${entry.count > 1
100
- ? html `<span part="count" aria-label="${entry.count} times"
102
+ ? html `<span part="count" aria-label=${formatWords(this, 'timesLabel', { count: entry.count })}
101
103
  >${entry.count}</span
102
104
  >`
103
105
  : nothing}
@@ -107,26 +109,35 @@ let HelixSandboxTerminal = class HelixSandboxTerminal extends HelixElement {
107
109
  static { this.styles = styles; }
108
110
  };
109
111
  __decorate([
112
+ words,
110
113
  property({ attribute: 'clear-label' })
111
114
  ], HelixSandboxTerminal.prototype, "clearLabel", void 0);
112
115
  __decorate([
113
116
  property({ reflect: true, type: Boolean })
114
117
  ], HelixSandboxTerminal.prototype, "controls", void 0);
115
118
  __decorate([
119
+ words,
116
120
  property({ attribute: 'empty-label' })
117
121
  ], HelixSandboxTerminal.prototype, "emptyLabel", void 0);
118
122
  __decorate([
123
+ words,
119
124
  property()
120
125
  ], HelixSandboxTerminal.prototype, "label", void 0);
121
126
  __decorate([
122
127
  property()
123
128
  ], HelixSandboxTerminal.prototype, "level", void 0);
124
129
  __decorate([
130
+ words,
125
131
  property({ attribute: 'level-label' })
126
132
  ], HelixSandboxTerminal.prototype, "levelLabel", void 0);
127
133
  __decorate([
134
+ words,
128
135
  property({ attribute: 'level-words', converter: wordsConverter })
129
136
  ], HelixSandboxTerminal.prototype, "levelWords", void 0);
137
+ __decorate([
138
+ words,
139
+ property({ attribute: 'times-label' })
140
+ ], HelixSandboxTerminal.prototype, "timesLabel", void 0);
130
141
  __decorate([
131
142
  state()
132
143
  ], HelixSandboxTerminal.prototype, "entries", void 0);
@@ -1,16 +1,17 @@
1
1
  import { createSheet } from '@fusion.dev/helix-core';
2
- export const styles = createSheet(`:host {display: block;position: relative;}[part="viewport"] {block-size: 100%;overflow: auto;overscroll-behavior: contain;}[part="viewport"]:focus-visible {outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);outline-offset: calc(var(--helix-size-focus-offset) * -1);}[part="viewport"] {scrollbar-color: var(--scroll-area-thumb-color, var(--helix-color-border))
3
- var(--scroll-area-track-color, transparent);scrollbar-width: var(--scroll-area-scrollbar, thin);}:host([scrollbars]) [part="viewport"] {scrollbar-width: none;}[part~="scrollbar"] {--_scroll-area-thumb: max(
2
+ export const styles = createSheet(`:host {display: block;position: relative;}[part="viewport"] {block-size: 100%;overflow: auto;overscroll-behavior: contain;}[part="viewport"]:focus-visible {outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);outline-offset: calc(var(--helix-size-focus-offset) * -1);}[part="viewport"] {scrollbar-color: var(--scroll-area-thumb-color, var(--helix-scrollbar-thumb-color))
3
+ var(--scroll-area-track-color, var(--helix-scrollbar-track-color));scrollbar-width: var(--scroll-area-scrollbar, thin);}[part="viewport"]:hover {scrollbar-color: var(--scroll-area-thumb-hover-color, var(--helix-scrollbar-thumb-hover-color))
4
+ var(--scroll-area-track-color, var(--helix-scrollbar-track-color));}:host([scrollbars]) [part="viewport"] {scrollbar-width: none;}[part~="scrollbar"] {--_scroll-area-thumb: max(
4
5
  var(--scroll-area-thumb-min-size, var(--helix-space-lg)),
5
6
  var(--scroll-area-thumb-fraction, 1) *
6
7
  100%
7
- );background-color: var(--scroll-area-track-color, transparent);opacity: 0;position: absolute;touch-action: none;transition: opacity var(--helix-duration-fast) var(--helix-easing-standard);user-select: none;z-index: calc(var(--helix-layer-raised) + 1);}[part~="scrollbar-visible"] {opacity: 1;}[part~="scrollbar-vertical"] {inline-size: var(--scroll-area-scrollbar-size, var(--helix-space-sm));inset-block: 0;inset-inline-end: 0;}[part~="scrollbar-horizontal"] {block-size: var(--scroll-area-scrollbar-size, var(--helix-space-sm));inset-block-end: 0;inset-inline: 0;}:host(:state(scrollbar-horizontal)) [part~="scrollbar-vertical"] {inset-block-end: var(--scroll-area-scrollbar-size, var(--helix-space-sm));}:host(:state(scrollbar-vertical)) [part~="scrollbar-horizontal"] {inset-inline-end: var(--scroll-area-scrollbar-size, var(--helix-space-sm));}[part~="thumb"] {background-color: var(--scroll-area-thumb-color, var(--helix-color-border));border-radius: var(--helix-radii-full);position: absolute;}[part~="thumb"]:hover {background-color: var(--scroll-area-thumb-hover-color, var(--helix-color-foreground-subtle));}[part~="thumb-vertical"] {block-size: var(--_scroll-area-thumb);inset-block-start: calc(
8
+ );background-color: var(--scroll-area-track-color, var(--helix-scrollbar-track-color));opacity: 0;position: absolute;touch-action: none;transition: opacity var(--helix-duration-fast) var(--helix-easing-standard);user-select: none;z-index: calc(var(--helix-layer-raised) + 1);}[part~="scrollbar-visible"] {opacity: 1;}[part~="scrollbar-vertical"] {inline-size: var(--scroll-area-scrollbar-size, var(--helix-space-sm));inset-block: 0;inset-inline-end: 0;}[part~="scrollbar-horizontal"] {block-size: var(--scroll-area-scrollbar-size, var(--helix-space-sm));inset-block-end: 0;inset-inline: 0;}:host(:state(scrollbar-horizontal)) [part~="scrollbar-vertical"] {inset-block-end: var(--scroll-area-scrollbar-size, var(--helix-space-sm));}:host(:state(scrollbar-vertical)) [part~="scrollbar-horizontal"] {inset-inline-end: var(--scroll-area-scrollbar-size, var(--helix-space-sm));}[part~="thumb"] {background-color: var(--scroll-area-thumb-color, var(--helix-scrollbar-thumb-color));border-radius: var(--helix-radii-full);position: absolute;}[part~="thumb"]:hover {background-color: var(--scroll-area-thumb-hover-color, var(--helix-scrollbar-thumb-hover-color));}[part~="thumb-vertical"] {block-size: var(--_scroll-area-thumb);inset-block-start: calc(
8
9
  var(--scroll-area-scroll-fraction, 0) *
9
10
  (100% - var(--_scroll-area-thumb))
10
11
  );inset-inline: var(--helix-border-thick);}[part~="thumb-horizontal"] {inline-size: var(--_scroll-area-thumb);inset-block: var(--helix-border-thick);inset-inline-start: calc(
11
12
  var(--scroll-area-scroll-fraction, 0) *
12
13
  (100% - var(--_scroll-area-thumb))
13
- );}[part="corner"] {background-color: var(--scroll-area-track-color, transparent);block-size: var(--scroll-area-scrollbar-size, var(--helix-space-sm));inline-size: var(--scroll-area-scrollbar-size, var(--helix-space-sm));inset-block-end: 0;inset-inline-end: 0;position: absolute;}:host::before,
14
+ );}[part="corner"] {background-color: var(--scroll-area-track-color, var(--helix-scrollbar-track-color));block-size: var(--scroll-area-scrollbar-size, var(--helix-space-sm));inline-size: var(--scroll-area-scrollbar-size, var(--helix-space-sm));inset-block-end: 0;inset-inline-end: 0;position: absolute;}:host::before,
14
15
  :host::after {content: "";opacity: 0;pointer-events: none;position: absolute;transition: opacity var(--helix-duration-fast) var(--helix-easing-standard);z-index: var(--helix-layer-raised);}:host::before {background: linear-gradient(
15
16
  to bottom,
16
17
  var(--scroll-area-fade-color, var(--helix-color-background)),
@@ -25,10 +25,10 @@ import type { CSSResultGroup } from 'lit';
25
25
  * @cssproperty --scroll-area-fade-inline-start - The depth of the fade at the inline start, or `0` to remove it.
26
26
  * @cssproperty --scroll-area-scrollbar - The scrollbar width, as a `scrollbar-width` keyword.
27
27
  * @cssproperty --scroll-area-scrollbar-size - The thickness of each scrollbar drawn under `scrollbars`, and the size of the corner.
28
- * @cssproperty --scroll-area-thumb-color - The color of the scrollbar's thumb.
29
- * @cssproperty --scroll-area-thumb-hover-color - The color of a thumb drawn under `scrollbars` while the pointer is over it.
28
+ * @cssproperty --scroll-area-thumb-color - The color of the scrollbar's thumb. Defaults to `--helix-scrollbar-thumb-color`.
29
+ * @cssproperty --scroll-area-thumb-hover-color - The color of the browser's thumb while the pointer is over the scroll area, and of a thumb drawn under `scrollbars` while the pointer is over it. Defaults to `--helix-scrollbar-thumb-hover-color`.
30
30
  * @cssproperty --scroll-area-thumb-min-size - The shortest a thumb drawn under `scrollbars` gets, however long the content.
31
- * @cssproperty --scroll-area-track-color - The color of the scrollbar's track.
31
+ * @cssproperty --scroll-area-track-color - The color of the scrollbar's track. Defaults to `--helix-scrollbar-track-color`.
32
32
  */
33
33
  export declare class HelixScrollArea extends HelixHeadlessScrollArea {
34
34
  static styles: CSSResultGroup;
@@ -1,2 +1,4 @@
1
1
  import { createSheet } from '@fusion.dev/helix-core';
2
- export const styles = createSheet(`:host {display: block;overflow-x: auto;}[part="table"] {display: grid;grid-template-columns: var(--table-columns, var(--table-template, minmax(0, 1fr)));inline-size: 100%;}[part="head"] {display: contents;}::slotted([slot="heading"]) {color: var(--table-title-color, var(--helix-color-foreground));display: block;font-family: var(--helix-font-sans);font-size: var(--table-title-text, var(--helix-text-md));font-weight: var(--helix-weight-semibold);margin-block: var(--helix-space-none) var(--table-title-gap, var(--helix-space-sm));}[part="select-all"] {align-items: center;border-block-end: var(--helix-border-thin) solid var(--helix-color-border);box-sizing: border-box;display: flex;min-block-size: var(--helix-size-control-loose);padding-inline: var(--helix-space-none) var(--helix-space-md);}[part="select-all"]:focus-visible {outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);outline-offset: calc(var(--helix-size-focus-offset) * -1);}:host([loading]) [part="table"] {opacity: 0.5;}@media print {:host {print-color-adjust: economy;}}`);
2
+ export const styles = createSheet(`:host {display: block;overflow-x: auto;}[part="table"] {display: grid;grid-template-columns: var(--table-columns, var(--table-template, minmax(0, 1fr)));inline-size: 100%;}[part="head"] {display: contents;}::slotted([slot="heading"]) {color: var(--table-title-color, var(--helix-color-foreground));display: block;font-family: var(--helix-font-sans);font-size: var(--table-title-text, var(--helix-text-md));font-weight: var(--helix-weight-semibold);margin-block: var(--helix-space-none) var(--table-title-gap, var(--helix-space-sm));}[part="select-all"] {align-items: center;border-block-end: var(--helix-border-thin) solid var(--helix-color-border);box-sizing: border-box;display: flex;min-block-size: var(--helix-size-control-loose);padding-inline: var(--helix-space-none) var(--helix-space-md);}[part="grip-head"] {border-block-end: var(--helix-border-thin) solid var(--helix-color-border);box-sizing: border-box;min-block-size: var(--helix-size-control-loose);}[part="grip-head"]:focus-visible,
3
+ [part="select-all"]:focus-visible {outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);outline-offset: calc(var(--helix-size-focus-offset) * -1);}:host([loading]) [part="table"] {opacity: 0.5;}[part="drag-preview"] {background-color: var(--table-drag-preview-background-color, var(--helix-color-surface-raised));border: var(--table-drag-preview-border-width, var(--helix-border-floating)) solid
4
+ var(--table-drag-preview-border-color, var(--helix-color-border));border-radius: var(--table-drag-preview-radius, var(--helix-radii-sm));box-shadow: var(--table-drag-preview-shadow, var(--helix-shadow-floating));opacity: var(--table-drag-preview-opacity, 0.9);}@media print {:host {print-color-adjust: economy;}}`);
@@ -16,10 +16,17 @@ import '../../checkbox/index.js';
16
16
  * @slot - The table's rows.
17
17
  * @slot heading - Words that name the table, shown above it in the weight of a heading.
18
18
  *
19
- * @csspart live - A live region that repeats the empty and loading text, so screen readers announce it when it changes. Visually hidden in the styled tier.
19
+ * @csspart drag-preview - A copy of the row a pointer drags by its grip, which follows the pointer in the top layer until the row is let go, in a `reorderable` table. Hidden from assistive technology.
20
+ * @csspart live - A live region that repeats the empty and loading text, and says each step of a move, so screen readers announce it when it changes. Visually hidden in the styled tier.
20
21
  * @csspart table - The grid.
21
22
  *
22
23
  * @cssproperty --table-columns - Track list for the columns. It overrides the track list worked out from the columns.
24
+ * @cssproperty --table-drag-preview-background-color - The fill behind the copy of a row a pointer drags.
25
+ * @cssproperty --table-drag-preview-border-color - The color of the edge around the copy of a row a pointer drags.
26
+ * @cssproperty --table-drag-preview-border-width - The width of the edge around the copy of a row a pointer drags. None by default, where the shadow lifts it.
27
+ * @cssproperty --table-drag-preview-opacity - The opacity of the copy of a row a pointer drags.
28
+ * @cssproperty --table-drag-preview-radius - The corner radius of the copy of a row a pointer drags.
29
+ * @cssproperty --table-drag-preview-shadow - The shadow that raises the copy of a row a pointer drags over the page.
23
30
  * @cssproperty --table-title-color - The color of the words in the `heading` slot.
24
31
  * @cssproperty --table-title-gap - The space between the `heading` slot and the grid.
25
32
  * @cssproperty --table-title-text - The font size of the words in the `heading` slot.
@@ -7,4 +7,12 @@ var(--helix-color-background)
7
7
  );}:host(:state(link)) ::slotted(*) {cursor: pointer;}:host(:state(link):hover) ::slotted(*) {background-color: var(
8
8
  --table-row-hover-background-color,
9
9
  color-mix(in oklab, var(--helix-color-foreground) 5%, transparent)
10
- );}[part~="select"]:focus-visible {outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);outline-offset: calc(var(--helix-size-focus-offset) * -1);}`);
10
+ );}[part~="select"]:focus-visible {outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);outline-offset: calc(var(--helix-size-focus-offset) * -1);}[part~="grip"] {align-items: center;border-block-end: var(--helix-border-thin) solid var(--helix-color-border);box-sizing: border-box;display: flex;min-block-size: var(--helix-size-control);padding-inline: var(--helix-space-2xs) var(--helix-space-sm);}[part~="grip"]:focus-visible {outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);outline-offset: calc(var(--helix-size-focus-offset) * -1);}[part="grip-button"] {all: unset;align-items: center;border-radius: var(--helix-radii-sm);box-sizing: border-box;color: var(--table-grip-color, var(--helix-color-foreground-muted));cursor: grab;display: inline-flex;touch-action: none;}[part="grip-button"]:active {cursor: grabbing;}[part="grip-button"]:focus-visible {outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);outline-offset: var(--helix-size-focus-offset);}[part="grip-button"][aria-disabled="true"] {cursor: default;opacity: var(--table-grip-disabled-opacity, 0.4);}[part="grip-mark"] {block-size: 1em;inline-size: 1em;}:host(:state(dragging)) [part~="grip"],
11
+ :host(:state(dragging)) [part~="select"],
12
+ :host(:state(dragging)) ::slotted(*) {opacity: var(--table-dragging-opacity, 0.5);}:host(:state(drop-before)) [part~="grip"],
13
+ :host(:state(drop-before)) [part~="select"],
14
+ :host(:state(drop-before)) ::slotted(*) {box-shadow: inset 0 var(--table-drop-indicator-size, var(--helix-border-thick)) 0 0
15
+ var(--table-drop-indicator-color, var(--helix-color-primary));}:host(:state(drop-after)) [part~="grip"],
16
+ :host(:state(drop-after)) [part~="select"],
17
+ :host(:state(drop-after)) ::slotted(*) {box-shadow: inset 0 calc(var(--table-drop-indicator-size, var(--helix-border-thick)) * -1) 0 0
18
+ var(--table-drop-indicator-color, var(--helix-color-primary));}`);
@@ -16,6 +16,11 @@ import '../../checkbox/index.js';
16
16
  *
17
17
  * @slot - The row's cells.
18
18
  *
19
+ * @cssproperty --table-dragging-opacity - The opacity of a row being moved, in a `reorderable` table.
20
+ * @cssproperty --table-drop-indicator-color - The color of the line where a moved row would land.
21
+ * @cssproperty --table-drop-indicator-size - The thickness of the line where a moved row would land.
22
+ * @cssproperty --table-grip-color - The color of a row's grip, in a `reorderable` table.
23
+ * @cssproperty --table-grip-disabled-opacity - The opacity of a row's grip while a sort decides the order.
19
24
  * @cssproperty --table-row-hover-background-color - The wash across the cells of a row with `href` under the pointer.
20
25
  */
21
26
  export declare class HelixTableRow extends HelixHeadlessTableRow {
@@ -4,6 +4,15 @@ import type { CSSResultGroup } from 'lit';
4
4
  * @summary A short text that appears next to an element on hover and focus.
5
5
  *
6
6
  * @description
7
+ * Place the tooltip beside its trigger, name the trigger with `for`, and name
8
+ * the tooltip in the trigger's `aria-describedby`, so the trigger is described
9
+ * in the server's markup and at rest:
10
+ *
11
+ * ```html
12
+ * <helix-button aria-describedby="save-tip" id="save">Save</helix-button>
13
+ * <helix-tooltip content="Save your work" for="save" id="save-tip"></helix-tooltip>
14
+ * ```
15
+ *
7
16
  * The bubble is in the top layer, so it needs no `z-index` and no container
8
17
  * clips it.
9
18
  *
@@ -20,6 +20,8 @@ slot[name="end"]::slotted(*) {flex: 0 0 auto;}slot[name="end"] {align-items: cen
20
20
  grid-template-rows var(--helix-duration-fast) var(--helix-easing-standard),
21
21
  display var(--helix-duration-fast) allow-discrete;}[part="group"] > slot {display: block;min-block-size: 0;overflow: hidden;}[part="group"][hidden] {display: none;grid-template-rows: 0fr;}@starting-style {[part="group"]:not([hidden]) {grid-template-rows: 0fr;}}[part="toggle"] {align-self: center;margin-inline-start: var(--tree-chevron-gap, var(--helix-space-none));order: var(--tree-chevron-order, 0);}slot[name="chevron"]::slotted(*) {align-self: center;block-size: var(--_tree-chevron);color: var(--helix-color-foreground-subtle);flex: 0 0 auto;inline-size: var(--_tree-chevron);margin-inline-start: var(--tree-chevron-gap, var(--helix-space-none));order: var(--tree-chevron-order, 0);transform: rotate(-90deg);transition: transform var(--helix-duration-fast) var(--helix-easing-standard);}:host(:dir(rtl)) slot[name="chevron"]::slotted(*) {transform: rotate(90deg);}:host(:state(open)) slot[name="chevron"]::slotted(*) {transform: rotate(0deg);}[part~="checkbox"] {align-self: center;background-color: var(--tree-checkbox-background-color, var(--helix-color-background));block-size: var(--tree-checkbox-size, var(--_tree-chevron));border: var(--helix-border-thin) solid
22
22
  var(--tree-checkbox-border-color, var(--helix-color-border));border-radius: var(--helix-radii-sm);color: var(--tree-checkbox-mark-color, var(--helix-color-foreground));display: grid;flex: 0 0 auto;inline-size: var(--tree-checkbox-size, var(--_tree-chevron));place-items: center;}[part~="checkbox-checked"],
23
- [part~="checkbox-mixed"] {border-color: var(--tree-checkbox-border-color, var(--helix-color-foreground));}[part~="checkbox"] svg {block-size: 80%;inline-size: 80%;}:host([disabled]) [part="row"] {cursor: not-allowed;opacity: var(--tree-row-disabled-opacity, 0.5);}:host([disabled]) [part="row"]:hover {background-color: transparent;color: var(--tree-row-color, var(--helix-color-foreground-muted));}:host(:state(loading)) [part="toggle"],
23
+ [part~="checkbox-mixed"] {border-color: var(--tree-checkbox-border-color, var(--helix-color-foreground));}[part~="checkbox"] svg {block-size: 80%;inline-size: 80%;}[part="grip"] {align-items: center;color: var(--tree-grip-color, var(--helix-color-foreground-subtle));cursor: grab;display: inline-flex;flex: 0 0 auto;order: 3;touch-action: none;}[part="grip"]:active {cursor: grabbing;}[part="grip-mark"] {block-size: var(--_tree-chevron);inline-size: var(--_tree-chevron);}:host(:state(dragging)) [part="item"] {opacity: var(--tree-dragging-opacity, 0.5);}:host(:state(drop-before)) [part="item"],
24
+ :host(:state(drop-after)) [part="item"] {position: relative;}:host(:state(drop-before)) [part="item"]::before,
25
+ :host(:state(drop-after)) [part="item"]::after {background-color: var(--tree-drop-indicator-color, var(--helix-color-primary));block-size: var(--tree-drop-indicator-size, var(--helix-border-thick));content: "";inset-inline: 0;pointer-events: none;position: absolute;z-index: 1;}:host(:state(drop-before)) [part="item"]::before {inset-block-start: 0;}:host(:state(drop-after)) [part="item"]::after {inset-block-end: 0;}:host([disabled]) [part="row"] {cursor: not-allowed;opacity: var(--tree-row-disabled-opacity, 0.5);}:host([disabled]) [part="row"]:hover {background-color: transparent;color: var(--tree-row-color, var(--helix-color-foreground-muted));}:host(:state(loading)) [part="toggle"],
24
26
  :host(:state(loading)) slot[name="chevron"]::slotted(*) {animation: tree-loading var(--helix-duration-slow) var(--helix-easing-standard) infinite alternate;}@keyframes tree-loading {to {opacity: 0.3;}}@media (prefers-reduced-motion: reduce) {:host(:state(loading)) [part="toggle"],
25
27
  :host(:state(loading)) slot[name="chevron"]::slotted(*) {animation: none;}}`);
@@ -25,6 +25,8 @@ import type { CSSResultGroup } from 'lit';
25
25
  * @csspart checkbox - The check mark's box, in a tree with `selection-mode="multiple"`.
26
26
  * @csspart checkbox-checked - The check mark's box while the item is checked.
27
27
  * @csspart checkbox-mixed - The check mark's box while some of a branch's items are checked.
28
+ * @csspart grip - The handle a pointer drags to move the item, in a `reorderable` tree.
29
+ * @csspart grip-mark - The icon on the grip.
28
30
  * @csspart group - The container for nested items.
29
31
  * @csspart item - The node, and the focus target.
30
32
  * @csspart label - The label text.
@@ -37,7 +39,11 @@ import type { CSSResultGroup } from 'lit';
37
39
  * branch.
38
40
  * @cssproperty --tree-checkbox-size - Size of the check mark's box. Follows the chevron's size.
39
41
  * @cssproperty --tree-chevron-size - Size of the chevron, and the gutter a leaf reserves.
42
+ * @cssproperty --tree-dragging-opacity - The opacity of an item being moved, in a `reorderable` tree.
43
+ * @cssproperty --tree-drop-indicator-color - The color of the line where a moved item would land.
44
+ * @cssproperty --tree-drop-indicator-size - The thickness of the line where a moved item would land.
40
45
  * @cssproperty --tree-gap - Space between rows.
46
+ * @cssproperty --tree-grip-color - The color of the grip, in a `reorderable` tree.
41
47
  * @cssproperty --tree-indent - Indent added per level.
42
48
  * @cssproperty --tree-row-checked-background-color - Fill of a checked row, in a tree with `selection-mode="multiple"`. Unset, the box alone marks it.
43
49
  * @cssproperty --tree-row-checked-color - Text color of a checked row, in a tree with `selection-mode="multiple"`.
@@ -1,2 +1,3 @@
1
1
  import { createSheet } from '@fusion.dev/helix-core';
2
- export const styles = createSheet(`:host {display: block;}[part="tree"] {display: flex;flex-direction: column;}:host {--tree-chevron-order: 0;}:host([chevron-placement="end"]) {--tree-chevron-order: 2;--tree-chevron-gap: var(--helix-space-none);--_tree-reserve: var(--helix-space-none);}:host([nesting="subordinate"]) {--_tree-nested-text: var(--helix-text-xs);}:host([nesting="heading"]) {--_tree-heading-ink: var(--helix-color-foreground-subtle);--_tree-heading-text: var(--helix-text-xs);--_tree-heading-tracking: var(--helix-tracking-wide);}:host([loading]) [part="tree"] {opacity: 0.5;}@media print {:host {print-color-adjust: economy;}}`);
2
+ export const styles = createSheet(`:host {display: block;}[part="tree"] {display: flex;flex-direction: column;}:host {--tree-chevron-order: 0;}:host([chevron-placement="end"]) {--tree-chevron-order: 2;--tree-chevron-gap: var(--helix-space-none);--_tree-reserve: var(--helix-space-none);}:host([nesting="subordinate"]) {--_tree-nested-text: var(--helix-text-xs);}:host([nesting="heading"]) {--_tree-heading-ink: var(--helix-color-foreground-subtle);--_tree-heading-text: var(--helix-text-xs);--_tree-heading-tracking: var(--helix-tracking-wide);}:host([loading]) [part="tree"] {opacity: 0.5;}[part="drag-preview"] {background-color: var(--tree-drag-preview-background-color, var(--helix-color-surface-raised));border: var(--tree-drag-preview-border-width, var(--helix-border-floating)) solid
3
+ var(--tree-drag-preview-border-color, var(--helix-color-border));border-radius: var(--tree-drag-preview-radius, var(--helix-radii-sm));box-shadow: var(--tree-drag-preview-shadow, var(--helix-shadow-floating));opacity: var(--tree-drag-preview-opacity, 0.9);}@media print {:host {print-color-adjust: economy;}}`);
@@ -17,12 +17,19 @@ import type { CSSResultGroup } from 'lit';
17
17
  *
18
18
  * @event {HelixSelectEvent} helix-select - Fired when an item is chosen. The item sends it, and you can listen for it on the tree. Cancelable: canceling it changes nothing.
19
19
  *
20
- * @csspart live - A copy of the empty and loading messages, in a live region that announces them when they change. Visually hidden in the styled tier.
20
+ * @csspart drag-preview - A copy of the row a pointer drags by its grip, which follows the pointer in the top layer until the item is let go, in a `reorderable` tree. Hidden from assistive technology.
21
+ * @csspart live - A copy of the empty and loading messages, and each step of a move in a `reorderable` tree, in a live region that announces them when they change. Visually hidden in the styled tier.
21
22
  * @csspart tree - The tree container.
22
23
  *
23
24
  * @cssproperty --tree-chevron-gap - The space before the chevron. Set from `chevron-placement`.
24
25
  * @cssproperty --tree-chevron-order - The chevron's order in the row. Set from `chevron-placement` and read by each item.
25
26
  * @cssproperty --tree-chevron-size - Size of the chevron, and the gutter a leaf reserves.
27
+ * @cssproperty --tree-drag-preview-background-color - The fill behind the copy of an item a pointer drags.
28
+ * @cssproperty --tree-drag-preview-border-color - The color of the edge around the copy of an item a pointer drags.
29
+ * @cssproperty --tree-drag-preview-border-width - The width of the edge around the copy of an item a pointer drags. None by default, where the shadow lifts it.
30
+ * @cssproperty --tree-drag-preview-opacity - The opacity of the copy of an item a pointer drags.
31
+ * @cssproperty --tree-drag-preview-radius - The corner radius of the copy of an item a pointer drags.
32
+ * @cssproperty --tree-drag-preview-shadow - The shadow that raises the copy of an item a pointer drags over the page.
26
33
  * @cssproperty --tree-gap - Space between rows.
27
34
  * @cssproperty --tree-indent - Indent added per level.
28
35
  * @cssproperty --tree-row-size - Minimum height of a row, so rows with and without an icon match.
@@ -1,5 +1,10 @@
1
1
  import { createSheet } from '@fusion.dev/helix-core';
2
- export const styles = createSheet(`:host {display: block;}[part="viewport"] {block-size: var(--virtual-list-block-size, 20em);margin-inline: calc(var(--helix-size-focus-reach) * -1);overflow-y: auto;overscroll-behavior: contain;padding-inline: var(--helix-size-focus-reach);scrollbar-color: var(--helix-color-border) transparent;scrollbar-width: thin;}::slotted([data-index]:focus-visible) {outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);outline-offset: calc(var(--helix-size-focus-offset) * -1);}::slotted([aria-selected="true"]) {background-color: var(
2
+ export const styles = createSheet(`:host {display: block;}[part="viewport"] {block-size: var(--virtual-list-block-size, 20em);margin-inline: calc(var(--helix-size-focus-reach) * -1);overflow-y: auto;overscroll-behavior: contain;padding-inline: var(--helix-size-focus-reach);scrollbar-color: var(--virtual-list-scrollbar-thumb-color, var(--helix-scrollbar-thumb-color))
3
+ var(--virtual-list-scrollbar-track-color, var(--helix-scrollbar-track-color));scrollbar-width: thin;}[part="viewport"]:hover {scrollbar-color: var(
4
+ --virtual-list-scrollbar-thumb-hover-color,
5
+ var(--helix-scrollbar-thumb-hover-color)
6
+ )
7
+ var(--virtual-list-scrollbar-track-color, var(--helix-scrollbar-track-color));}::slotted([data-index]:focus-visible) {outline: var(--helix-size-focus-ring) solid var(--helix-color-focus-ring);outline-offset: calc(var(--helix-size-focus-offset) * -1);}::slotted([aria-selected="true"]) {background-color: var(
3
8
  --virtual-list-selected-background-color,
4
9
  var(--helix-color-primary-subtle)
5
10
  );}[part="loading"] {color: var(--virtual-list-loading-color, var(--helix-color-foreground-muted));font-size: var(--helix-text-sm);padding: var(--virtual-list-loading-padding, var(--helix-space-sm));text-align: center;}[part="after"],
@@ -24,6 +24,9 @@ import type { CSSResultGroup } from 'lit';
24
24
  * @cssproperty --virtual-list-block-size - How tall the scrolling box is.
25
25
  * @cssproperty --virtual-list-loading-color - The color of the text in the row drawn while `loading` is set.
26
26
  * @cssproperty --virtual-list-loading-padding - The space around the text in the row drawn while `loading` is set.
27
+ * @cssproperty --virtual-list-scrollbar-thumb-color - The thumb of the list's scrollbar. Defaults to `--helix-scrollbar-thumb-color`.
28
+ * @cssproperty --virtual-list-scrollbar-thumb-hover-color - The thumb while the pointer is over the list. Defaults to `--helix-scrollbar-thumb-hover-color`.
29
+ * @cssproperty --virtual-list-scrollbar-track-color - The track of the list's scrollbar. Defaults to `--helix-scrollbar-track-color`.
27
30
  * @cssproperty --virtual-list-selected-background-color - The fill behind a chosen row, in a list with `selection-mode`.
28
31
  */
29
32
  export declare class HelixVirtualList extends HelixHeadlessVirtualList {