@fusion.dev/helix-headless 0.30.2 → 0.31.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 (86) hide show
  1. package/custom-elements.json +2127 -144
  2. package/dist/accordion/item/accordion-item.d.ts +2 -0
  3. package/dist/app-header/root/app-header-root.d.ts +2 -0
  4. package/dist/area-chart/root/area-chart-root.d.ts +1 -0
  5. package/dist/bar-chart/root/bar-chart-root.d.ts +2 -0
  6. package/dist/bar-chart/root/bar-chart-root.js +4 -1
  7. package/dist/carousel/root/carousel-root.d.ts +1 -0
  8. package/dist/carousel/root/carousel-root.js +8 -5
  9. package/dist/chat/root/chat-root.d.ts +12 -0
  10. package/dist/chat/root/chat-root.js +4 -0
  11. package/dist/checkbox/root/checkbox-root.d.ts +6 -0
  12. package/dist/checkbox/root/checkbox-root.js +4 -1
  13. package/dist/checkbox-group/root/checkbox-group-root.d.ts +2 -0
  14. package/dist/color-input/root/color-input-root.d.ts +3 -0
  15. package/dist/combobox/root/combobox-root.d.ts +3 -0
  16. package/dist/command/root/command-root.d.ts +2 -0
  17. package/dist/data-table/root/data-table-root.d.ts +16 -0
  18. package/dist/data-table/root/data-table-root.js +13 -5
  19. package/dist/date-input/root/date-input-root.d.ts +10 -0
  20. package/dist/date-input/root/date-input-root.js +6 -2
  21. package/dist/date-picker/root/date-picker-root.d.ts +7 -0
  22. package/dist/date-picker/root/date-picker-root.js +12 -6
  23. package/dist/dialog/root/dialog-root.d.ts +2 -0
  24. package/dist/donut-chart/root/donut-chart-root.d.ts +2 -0
  25. package/dist/donut-chart/root/donut-chart-root.js +3 -2
  26. package/dist/drawer/root/drawer-root.d.ts +2 -0
  27. package/dist/file-input/root/file-input-root.d.ts +2 -0
  28. package/dist/filter-input/menu/filter-menu.d.ts +16 -0
  29. package/dist/filter-input/menu/filter-menu.js +30 -4
  30. package/dist/filter-input/root/filter-input-root.d.ts +3 -0
  31. package/dist/heatmap/root/heatmap-root.d.ts +1 -0
  32. package/dist/input/root/input-root.d.ts +3 -0
  33. package/dist/input/root/input-root.js +1 -1
  34. package/dist/line-chart/root/line-chart-root.d.ts +1 -0
  35. package/dist/listbox/root/listbox-root.d.ts +2 -0
  36. package/dist/megamenu/root/megamenu-root.d.ts +2 -0
  37. package/dist/menu/root/menu-root.d.ts +5 -0
  38. package/dist/menu/root/menu-root.js +1 -0
  39. package/dist/meter/root/meter-root.d.ts +12 -4
  40. package/dist/meter/root/meter-root.js +10 -6
  41. package/dist/notifications/group/notification-group.d.ts +2 -0
  42. package/dist/notifications/notification/notification.d.ts +4 -0
  43. package/dist/notifications/root/notifications-root.d.ts +2 -0
  44. package/dist/number-input/root/number-input-root.d.ts +2 -0
  45. package/dist/object-inspector/root/object-inspector-root.d.ts +1 -0
  46. package/dist/object-inspector/root/object-inspector-root.js +5 -4
  47. package/dist/option/root/option-root.d.ts +4 -0
  48. package/dist/option/root/option-root.js +4 -1
  49. package/dist/pagination/root/pagination-root.d.ts +5 -0
  50. package/dist/pagination/root/pagination-root.js +2 -2
  51. package/dist/pagination/size/pagination-size.d.ts +27 -3
  52. package/dist/pagination/size/pagination-size.js +16 -2
  53. package/dist/pin-input/root/pin-input-root.d.ts +2 -0
  54. package/dist/popover/root/popover-root.d.ts +2 -0
  55. package/dist/radio/group/radio-group.d.ts +2 -0
  56. package/dist/radio/root/radio-root.d.ts +2 -0
  57. package/dist/rating/root/rating-root.d.ts +2 -0
  58. package/dist/scatter-chart/root/scatter-chart-root.d.ts +2 -0
  59. package/dist/scatter-chart/root/scatter-chart-root.js +1 -1
  60. package/dist/scroll-area/root/scroll-area-root.d.ts +6 -0
  61. package/dist/scroll-area/root/scroll-area-root.js +4 -3
  62. package/dist/select/root/select-root.d.ts +3 -0
  63. package/dist/slider/root/slider-root.d.ts +2 -0
  64. package/dist/speed-dial/root/speed-dial-root.d.ts +2 -0
  65. package/dist/switch/root/switch-root.d.ts +3 -0
  66. package/dist/table/column/table-column.d.ts +3 -0
  67. package/dist/table/column/table-column.js +2 -6
  68. package/dist/tabs/panel/tab-panel.d.ts +2 -0
  69. package/dist/tabs/tab/tab.d.ts +2 -0
  70. package/dist/textarea/root/textarea-root.d.ts +2 -0
  71. package/dist/time-input/root/time-input-root.d.ts +6 -0
  72. package/dist/time-input/root/time-input-root.js +2 -0
  73. package/dist/time-picker/root/time-picker-root.d.ts +20 -5
  74. package/dist/time-picker/root/time-picker-root.js +30 -11
  75. package/dist/toggle/group/toggle-group.d.ts +2 -0
  76. package/dist/toggle/root/toggle-root.d.ts +2 -0
  77. package/dist/tooltip/root/tooltip-root.d.ts +2 -0
  78. package/dist/tour/stop/tour-stop.js +4 -0
  79. package/dist/tree/item/tree-item.d.ts +3 -0
  80. package/dist/video/root/video-root.d.ts +1 -0
  81. package/dist/video/root/video-root.js +1 -1
  82. package/dist/video-playlist/item/video-playlist-item.d.ts +1 -0
  83. package/dist/video-playlist/item/video-playlist-item.js +1 -1
  84. package/package.json +5 -5
  85. package/types/jsx.d.ts +1932 -22
  86. package/types/vue.d.ts +4 -2
@@ -31,6 +31,8 @@ declare const HelixHeadlessAccordionItem_base: (new (...args: any[]) => import("
31
31
  * @csspart content - The revealed region.
32
32
  * @csspart content-inner - The clipping box inside the animated region.
33
33
  * @csspart trigger - The clickable summary row.
34
+ *
35
+ * @cssstate open - While the item is open.
34
36
  */
35
37
  export declare class HelixHeadlessAccordionItem extends HelixHeadlessAccordionItem_base {
36
38
  /**
@@ -36,6 +36,8 @@ import { type PropertyValues, type TemplateResult } from 'lit';
36
36
  * @csspart end - The trailing region.
37
37
  * @csspart row - The centered row inside the banner.
38
38
  * @csspart start - The leading region.
39
+ *
40
+ * @cssstate scrolled - While the page is scrolled down from the top, which is when the bar lifts off it.
39
41
  */
40
42
  export declare class HelixHeadlessAppHeader extends HelixElement {
41
43
  /**
@@ -74,6 +74,7 @@ declare const HelixHeadlessAreaChart_base: typeof HelixElement & (new (...args:
74
74
  * @csspart svg - The drawing surface the bands sit on.
75
75
  * @csspart tooltip - The bubble, forwarded from `Tooltip`.
76
76
  * @csspart tooltip-anchor - The `Tooltip` element itself.
77
+ * @csspart tooltip-arrow - The bubble's point, forwarded from `Tooltip`.
77
78
  * @csspart tooltip-cell - One column's name and value inside the tooltip.
78
79
  * @csspart tooltip-label - The reading's own name inside the tooltip.
79
80
  * @csspart tooltip-name - A column's name inside the tooltip.
@@ -41,6 +41,7 @@ declare const HelixHeadlessBarChart_base: typeof HelixElement & (new (...args: a
41
41
  * @csspart baseline - The rule the columns stand on.
42
42
  * @csspart gridline - One rule across the plot, under `gridlines`.
43
43
  * @csspart group - One category's columns, together.
44
+ * @csspart group-active - The group the tooltip is about, beside `group`.
44
45
  * @csspart label - One category's name.
45
46
  * @csspart labels - The row of category names.
46
47
  * @csspart line - A series drawn as a line rather than as columns, under `lines`.
@@ -50,6 +51,7 @@ declare const HelixHeadlessBarChart_base: typeof HelixElement & (new (...args: a
50
51
  * @csspart tick - One number on an axis.
51
52
  * @csspart tooltip - The bubble, forwarded from `Tooltip`.
52
53
  * @csspart tooltip-anchor - The `Tooltip` element itself.
54
+ * @csspart tooltip-arrow - The bubble's point, forwarded from `Tooltip`.
53
55
  * @csspart tooltip-cell - One column's name and value inside the tooltip.
54
56
  * @csspart tooltip-label - The reading's own name inside the tooltip.
55
57
  * @csspart tooltip-name - A column's name inside the tooltip.
@@ -129,7 +129,10 @@ let HelixHeadlessBarChart = class HelixHeadlessBarChart extends MixinChartSource
129
129
  ? svg `<line part="baseline" x1=${floor} x2=${floor} y1="0" y2="100" />`
130
130
  : svg `<line part="baseline" x1="0" x2="100" y1=${floor} y2=${floor} />`}
131
131
  ${this.renderBand(categories.length, sideways)}
132
- ${categories.map((_, index) => svg `<g data-active=${this.pointer.at === index ? '' : nothing} part="group">
132
+ ${categories.map((_, index) => svg `<g
133
+ data-active=${this.pointer.at === index ? '' : nothing}
134
+ part="group${this.pointer.at === index ? ' group-active' : ''}"
135
+ >
133
136
  ${columns.map(({ one, tone }, depth) => bar(one.points[index]?.value ?? 0, index, depth, tone, against(one)))}
134
137
  </g>`)}
135
138
  ${series.map((one) => lined.has(one.name.trim().toLowerCase())
@@ -31,6 +31,7 @@ import { type PropertyValues, type TemplateResult } from 'lit';
31
31
  *
32
32
  * @csspart controls - The row of controls.
33
33
  * @csspart indicator - One of them, and a way to reach that slide.
34
+ * @csspart indicator-current - The one for the slide showing, beside `indicator`.
34
35
  * @csspart indicators - The row of controls saying where the reader is.
35
36
  * @csspart next - The control that moves to the next slide.
36
37
  * @csspart next-mark - The glyph on the next control.
@@ -28,7 +28,7 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
28
28
  event.preventDefault();
29
29
  this.goTo(this.index + step);
30
30
  this.updateComplete.then(() => {
31
- this.renderRoot.querySelector('[part="indicator"][data-current]')?.focus();
31
+ this.renderRoot.querySelector('[part~="indicator-current"]')?.focus();
32
32
  });
33
33
  };
34
34
  this.settling = false;
@@ -301,16 +301,19 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
301
301
  ${this.slides.length > 1
302
302
  ? html `<div part="indicators" role="group" aria-label=${`${this.label} slides`}>
303
303
  ${''}
304
- ${Array.from({ length: this.positions }).map((_place, at) => html `<button
305
- part="indicator"
304
+ ${Array.from({ length: this.positions }).map((_place, at) => {
305
+ const current = at === (this.showing ?? this.index);
306
+ return html `<button
307
+ part="indicator${current ? ' indicator-current' : ''}"
306
308
  type="button"
307
309
  aria-label=${`Slide ${at + 1}`}
308
310
  aria-current=${at === this.index ? 'true' : nothing}
309
311
  tabindex=${at === this.index ? '0' : '-1'}
310
- ?data-current=${at === (this.showing ?? this.index)}
312
+ ?data-current=${current}
311
313
  @keydown=${this.handleIndicatorKeydown}
312
314
  @click=${() => this.goTo(at)}
313
- ></button>`)}
315
+ ></button>`;
316
+ })}
314
317
  </div>`
315
318
  : nothing}`;
316
319
  }
@@ -86,6 +86,18 @@ declare const HelixHeadlessChat_base: (new (...args: any[]) => import("@fusion.d
86
86
  * @csspart live - Where each settled turn is said, for a reader who cannot see it arrive.
87
87
  * @csspart loading - Shown while the history is still on its way.
88
88
  * @csspart log - The transcript, which is the thing that scrolls.
89
+ * @csspart message - A turn fed as data: the message drawn for it, forwarded whole.
90
+ * @csspart message-actions - The controls offered on a fed turn, beside its time.
91
+ * @csspart message-avatar - A fed turn's leading slot's box.
92
+ * @csspart message-body - What a fed turn said, and the line under it.
93
+ * @csspart message-content - A fed turn's text.
94
+ * @csspart message-indicator - A fed turn's default wait.
95
+ * @csspart message-mark - The status glyph beside a fed turn's failure.
96
+ * @csspart message-meta - The line under a fed turn: its time, its state, and its controls.
97
+ * @csspart message-retry - The control offered on a fed turn that failed.
98
+ * @csspart message-sources - What a fed turn was drawn from.
99
+ * @csspart message-state - What has happened to a fed turn, where that is worth saying.
100
+ * @csspart message-time - When a fed turn was said.
89
101
  * @csspart resume - The affordance offered while the reader is away from the bottom.
90
102
  * @csspart status - The status region, which is not part of the log.
91
103
  * @csspart turn - One turn fed as data, around the message drawn for it.
@@ -391,6 +391,10 @@ let HelixHeadlessChat = class HelixHeadlessChat extends MixinCollection(HelixEle
391
391
  return html `<div part="before" role="presentation" style="block-size: ${before}px; flex: none"></div>
392
392
  ${repeat(this.turns.slice(first, last), (turn, offset) => turn.key ?? first + offset, (turn, offset) => html `<div part="turn" data-index=${first + offset}>
393
393
  <${message}
394
+ exportparts="actions: message-actions, avatar: message-avatar, body: message-body,
395
+ content: message-content, indicator: message-indicator, mark: message-mark, message,
396
+ meta: message-meta, retry: message-retry, sources: message-sources,
397
+ state: message-state, time: message-time"
394
398
  author=${turn.author ?? nothing}
395
399
  at=${turn.at ?? nothing}
396
400
  state=${turn.state ?? nothing}
@@ -42,6 +42,12 @@ declare const HelixHeadlessCheckbox_base: (new (...args: any[]) => import("@fusi
42
42
  * @csspart hint - Help under the control, while nothing is wrong.
43
43
  * @csspart label - The label beside it.
44
44
  * @csspart mark - The tick, or the dash when the box is indeterminate.
45
+ * @csspart mark-checked - The mark while the box is checked, beside `mark`.
46
+ * @csspart mark-indeterminate - The mark while the box is indeterminate, beside `mark`.
47
+ *
48
+ * @cssstate checked - While the box is checked.
49
+ * @cssstate has-label - While the label slot holds something to read, which is what draws a label at all.
50
+ * @cssstate invalid - While there is feedback to show: the platform's verdict, or the consumer's `feedback`.
45
51
  */
46
52
  export declare class HelixHeadlessCheckbox extends HelixHeadlessCheckbox_base {
47
53
  protected readonly aria: AriaForwardController;
@@ -69,7 +69,10 @@ let HelixHeadlessCheckbox = class HelixHeadlessCheckbox extends MixinControllerC
69
69
  @change=${this.handleChange}
70
70
  @input=${this.stopInner}
71
71
  />
72
- <span part="mark" aria-hidden="true"></span>
72
+ <span
73
+ part="mark${this.checked ? ' mark-checked' : ''}${this.indeterminate ? ' mark-indeterminate' : ''}"
74
+ aria-hidden="true"
75
+ ></span>
73
76
  </span>
74
77
  <span part="label"><slot @slotchange=${this.handleLabelChange}>${this.label}</slot></span>
75
78
  </label>
@@ -41,6 +41,8 @@ declare const HelixHeadlessCheckboxGroup_base: (new (...args: any[]) => import("
41
41
  * @csspart hint - Help under the set.
42
42
  * @csspart items - The list itself, which is what `orientation` lays out.
43
43
  * @csspart label - The group's name, over the set.
44
+ *
45
+ * @cssstate invalid - While there is feedback to show: the platform's verdict, or the consumer's `feedback`.
44
46
  */
45
47
  export declare class HelixHeadlessCheckboxGroup extends HelixHeadlessCheckboxGroup_base {
46
48
  /**
@@ -89,6 +89,9 @@ declare const HelixHeadlessColorInput_base: (new (...args: any[]) => import("@fu
89
89
  * @csspart trigger - The control that opens the panel.
90
90
  *
91
91
  * @cssproperty --color-input-swatch - The chosen color, to paint over the transparency check.
92
+ *
93
+ * @cssstate invalid - While there is feedback to show: the platform's verdict, or the consumer's `feedback`.
94
+ * @cssstate open - While the picker is open.
92
95
  */
93
96
  export declare class HelixHeadlessColorInput extends HelixHeadlessColorInput_base {
94
97
  protected readonly aria: AriaForwardController;
@@ -78,6 +78,9 @@ declare const HelixHeadlessCombobox_base: (new (...args: any[]) => import("@fusi
78
78
  * @csspart tag-dismiss-mark - The glyph on the dismiss control, where none is slotted.
79
79
  * @csspart tag-prefix - The category before the label.
80
80
  * @csspart tags - The row of chosen options, when `multiple` is set.
81
+ *
82
+ * @cssstate invalid - While there is feedback to show: the platform's verdict, or the consumer's `feedback`.
83
+ * @cssstate open - While the list is open.
81
84
  */
82
85
  export declare class HelixHeadlessCombobox extends HelixHeadlessCombobox_base {
83
86
  protected readonly aria: AriaForwardController;
@@ -57,6 +57,8 @@ declare const HelixHeadlessCommand_base: (new (...args: any[]) => import("@fusio
57
57
  * @csspart listbox-loading - Shown while the options are still on their way.
58
58
  * @csspart listbox-search - The region holding the field that narrows the list.
59
59
  * @csspart listbox-search-field - The field itself.
60
+ *
61
+ * @cssstate open - While the palette is open.
60
62
  */
61
63
  export declare class HelixHeadlessCommand extends HelixHeadlessCommand_base {
62
64
  /**
@@ -71,6 +71,7 @@ declare const HelixHeadlessDataTable_base: (new (...args: any[]) => import("@fus
71
71
  * @csspart after - The room the rows below the window would have taken. Windowed only.
72
72
  * @csspart before - The room the rows above the window would have taken. Windowed only.
73
73
  * @csspart cell - One cell.
74
+ * @csspart cell-selected - A cell of a selected row, beside `cell`.
74
75
  * @csspart checkbox - A row's checkbox, or the one in the heading that selects them all.
75
76
  * @csspart checkbox-box - The frame the checkbox's input is painted as.
76
77
  * @csspart checkbox-control - The checkbox's input.
@@ -79,14 +80,29 @@ declare const HelixHeadlessDataTable_base: (new (...args: any[]) => import("@fus
79
80
  * @csspart checkbox-hint - Forwarded from the checkbox, and never drawn here.
80
81
  * @csspart checkbox-label - Forwarded from the checkbox; the label is spoken, not shown.
81
82
  * @csspart checkbox-mark - The tick, or the dash while some rows are selected.
83
+ * @csspart checkbox-mark-checked - The mark while its box is checked, beside `checkbox-mark`.
84
+ * @csspart checkbox-mark-indeterminate - The dash while only some rows are selected, beside `checkbox-mark`.
82
85
  * @csspart empty - Shown when no rows match.
83
86
  * @csspart footer - The region below the grid.
84
87
  * @csspart head - The row the column headings sit in. `display: contents`, so it takes no space.
85
88
  * @csspart loading - Shown while the rows are still on their way.
86
89
  * @csspart pagination - The pagination, where this draws one.
90
+ * @csspart pagination-first - The pagination's control that jumps to the first page, under `ends`.
91
+ * @csspart pagination-gap - The pagination's control standing over pages not shown.
92
+ * @csspart pagination-item - One slot in the pagination's run, holding a page or a gap.
93
+ * @csspart pagination-last - The pagination's control that jumps to the last page, under `ends`.
94
+ * @csspart pagination-list - The pagination's run of pages.
95
+ * @csspart pagination-live - The region that says the page changed. Clipped, not hidden.
96
+ * @csspart pagination-mark - The glyph on a first, previous, next or last control.
97
+ * @csspart pagination-next - The pagination's control that moves forward one page.
98
+ * @csspart pagination-page - The pagination's control for one page.
99
+ * @csspart pagination-page-current - The page you are on, beside `pagination-page`.
100
+ * @csspart pagination-previous - The pagination's control that moves back one page.
101
+ * @csspart pagination-status - The pagination's reading of where you are, in `compact`.
87
102
  * @csspart row - One row of data.
88
103
  * @csspart select - The cell holding a row's checkbox.
89
104
  * @csspart select-all - The heading holding the checkbox that selects every row.
105
+ * @csspart select-selected - The checkbox cell of a selected row, beside `select`.
90
106
  * @csspart table - The grid.
91
107
  * @csspart toolbar - The region above the grid.
92
108
  *
@@ -537,9 +537,9 @@ let HelixHeadlessDataTable = class HelixHeadlessDataTable extends MixinCollectio
537
537
  : undefined;
538
538
  }
539
539
  }
540
- renderCell(column, row) {
540
+ renderCell(column, row, picked) {
541
541
  return html `<span
542
- part="cell"
542
+ part="cell${picked ? ' cell-selected' : ''}"
543
543
  role="gridcell"
544
544
  style=${column.align ? `text-align: ${column.align}` : nothing}
545
545
  >${column.read(row)}</span
@@ -550,7 +550,8 @@ let HelixHeadlessDataTable = class HelixHeadlessDataTable extends MixinCollectio
550
550
  return html `<${checkbox}
551
551
  part="checkbox"
552
552
  exportparts="box: checkbox-box, control: checkbox-control, feedback: checkbox-feedback,
553
- field: checkbox-field, hint: checkbox-hint, label: checkbox-label, mark: checkbox-mark"
553
+ field: checkbox-field, hint: checkbox-hint, label: checkbox-label, mark: checkbox-mark,
554
+ mark-checked: checkbox-mark-checked, mark-indeterminate: checkbox-mark-indeterminate"
554
555
  aria-label=${name}
555
556
  .checked=${checked}
556
557
  .indeterminate=${indeterminate}
@@ -574,8 +575,10 @@ let HelixHeadlessDataTable = class HelixHeadlessDataTable extends MixinCollectio
574
575
  data-index=${this.windowed ? start + index : nothing}
575
576
  >
576
577
  ${chosen
577
- ? html `<span part="select" role="gridcell">${this.renderCheckbox(`Select ${named ? String(named.order(row) ?? key) : key}`, picked, false, (event) => this.toggleRow(key, event))}</span>`
578
- : nothing}${columns.map((column) => this.renderCell(column, row))}
578
+ ? html `<span part="select${picked ? ' select-selected' : ''}" role="gridcell"
579
+ >${this.renderCheckbox(`Select ${named ? String(named.order(row) ?? key) : key}`, picked, false, (event) => this.toggleRow(key, event))}</span
580
+ >`
581
+ : nothing}${columns.map((column) => this.renderCell(column, row, picked))}
579
582
  </div>`;
580
583
  })}`;
581
584
  }
@@ -633,6 +636,11 @@ let HelixHeadlessDataTable = class HelixHeadlessDataTable extends MixinCollectio
633
636
  ${this.paginated
634
637
  ? html `<${pagination}
635
638
  part="pagination"
639
+ exportparts="first: pagination-first, gap: pagination-gap, item: pagination-item,
640
+ last: pagination-last, list: pagination-list, live: pagination-live,
641
+ mark: pagination-mark, next: pagination-next, page: pagination-page,
642
+ page-current: pagination-page-current, previous: pagination-previous,
643
+ status: pagination-status"
636
644
  page=${this.page}
637
645
  page-size=${this.pageSize || 1}
638
646
  total=${matched}
@@ -45,7 +45,14 @@ declare const HelixHeadlessDateInput_base: (new (...args: any[]) => import("@fus
45
45
  * @csspart label - The question, over the field.
46
46
  * @csspart picker - The date picker inside it.
47
47
  * @csspart picker-cell - One column of a row, which is what a range paints.
48
+ * @csspart picker-cell-range-end - The cell of a range's last day, beside `picker-cell`.
49
+ * @csspart picker-cell-range-middle - A cell between a range's ends, beside `picker-cell`.
50
+ * @csspart picker-cell-range-start - The cell of a range's first day, beside `picker-cell`.
48
51
  * @csspart picker-day - The shape inside a cell, which is what a single date paints.
52
+ * @csspart picker-day-disabled - A day that cannot be chosen, beside `picker-day`.
53
+ * @csspart picker-day-outside - A day from a neighboring month, beside `picker-day`.
54
+ * @csspart picker-day-selected - The chosen day, or either end of a chosen range, beside `picker-day`.
55
+ * @csspart picker-day-today - Today, beside `picker-day`.
49
56
  * @csspart picker-grid - The grid of days.
50
57
  * @csspart picker-header - The month name and its controls.
51
58
  * @csspart picker-heading - The month and year being shown.
@@ -62,6 +69,9 @@ declare const HelixHeadlessDateInput_base: (new (...args: any[]) => import("@fus
62
69
  * @csspart tags - The row the dates sit in.
63
70
  * @csspart trigger - The control that opens the calendar.
64
71
  * @csspart trigger-icon - The mark on the button that opens the calendar.
72
+ *
73
+ * @cssstate invalid - While there is feedback to show: the platform's verdict, or the consumer's `feedback`.
74
+ * @cssstate open - While the calendar is open.
65
75
  */
66
76
  export declare class HelixHeadlessDateInput extends HelixHeadlessDateInput_base {
67
77
  protected readonly aria: AriaForwardController;
@@ -143,8 +143,12 @@ let HelixHeadlessDateInput = class HelixHeadlessDateInput extends MixinPickerEdi
143
143
  renderPicker() {
144
144
  return html `<${this.tag('date-picker')}
145
145
  part="picker"
146
- exportparts="cell: picker-cell, day: picker-day, grid: picker-grid, header: picker-header,
147
- heading: picker-heading, month: picker-month, months: picker-months, next: picker-next,
146
+ exportparts="cell: picker-cell, cell-range-end: picker-cell-range-end,
147
+ cell-range-middle: picker-cell-range-middle, cell-range-start: picker-cell-range-start,
148
+ day: picker-day, day-disabled: picker-day-disabled, day-outside: picker-day-outside,
149
+ day-selected: picker-day-selected, day-today: picker-day-today, grid: picker-grid,
150
+ header: picker-header, heading: picker-heading, month: picker-month, months: picker-months,
151
+ next: picker-next,
148
152
  next-mark: picker-next-mark, previous: picker-previous, previous-mark: picker-previous-mark,
149
153
  week: picker-week, weekday: picker-weekday"
150
154
  ?invalid=${this.resolvedFeedback !== ''}
@@ -35,7 +35,14 @@ declare const HelixHeadlessDatePicker_base: (new (...args: any[]) => import("@fu
35
35
  * @event {Event} input - Announced once the value has moved.
36
36
  *
37
37
  * @csspart cell - One column of a row, which is what a range paints.
38
+ * @csspart cell-range-end - The cell of a range's last day, beside `cell`.
39
+ * @csspart cell-range-middle - A cell between a range's ends, beside `cell`.
40
+ * @csspart cell-range-start - The cell of a range's first day, beside `cell`.
38
41
  * @csspart day - The shape inside a cell, which is what a single date paints.
42
+ * @csspart day-disabled - A day that cannot be chosen, beside `day`.
43
+ * @csspart day-outside - A day from a neighboring month, filling the grid out, beside `day`.
44
+ * @csspart day-selected - The chosen day, or either end of a chosen range, beside `day`.
45
+ * @csspart day-today - Today, beside `day`.
39
46
  * @csspart grid - The grid of days.
40
47
  * @csspart header - The month name and its controls.
41
48
  * @csspart heading - The month and year being shown.
@@ -200,7 +200,7 @@ let HelixHeadlessDatePicker = class HelixHeadlessDatePicker extends MixinControl
200
200
  this.focused = toIso(date);
201
201
  this.show(date);
202
202
  this.updateComplete.then(() => {
203
- this.renderRoot.querySelector('[part="cell"][tabindex="0"]')?.focus();
203
+ this.renderRoot.querySelector('[part~="cell"][tabindex="0"]')?.focus();
204
204
  });
205
205
  }
206
206
  select(date) {
@@ -355,21 +355,27 @@ let HelixHeadlessDatePicker = class HelixHeadlessDatePicker extends MixinControl
355
355
  const disabled = this.barred(date);
356
356
  const selected = this.isSelected(iso);
357
357
  const outside = !sameMonth(date, month);
358
+ const start = !outside && range !== null && iso === range[0];
359
+ const end = !outside && range !== null && iso === range[1];
360
+ const middle = !outside && range !== null && iso > range[0] && iso < range[1];
358
361
  return html `<span
359
- part="cell"
362
+ part="cell${start ? ' cell-range-start' : ''}${middle ? ' cell-range-middle' : ''}${end ? ' cell-range-end' : ''}"
360
363
  role="gridcell"
361
364
  aria-disabled=${disabled ? 'true' : nothing}
362
365
  aria-label=${full.format(date)}
363
366
  aria-current=${iso === today ? 'date' : nothing}
364
367
  aria-selected=${!outside && selected ? 'true' : nothing}
365
368
  data-outside=${outside ? '' : nothing}
366
- data-range-end=${!outside && range && iso === range[1] ? '' : nothing}
367
- data-range-middle=${!outside && range && iso > range[0] && iso < range[1] ? '' : nothing}
368
- data-range-start=${!outside && range && iso === range[0] ? '' : nothing}
369
+ data-range-end=${end ? '' : nothing}
370
+ data-range-middle=${middle ? '' : nothing}
371
+ data-range-start=${start ? '' : nothing}
369
372
  data-today=${iso === today ? '' : nothing}
370
373
  tabindex=${!outside && iso === anchor ? '0' : '-1'}
371
374
  @click=${outside ? nothing : () => this.select(date)}
372
- ><span part="day">${date.getUTCDate()}</span></span
375
+ ><span
376
+ part="day${!outside && selected && !middle ? ' day-selected' : ''}${iso === today ? ' day-today' : ''}${outside ? ' day-outside' : ''}${disabled ? ' day-disabled' : ''}"
377
+ >${date.getUTCDate()}</span
378
+ ></span
373
379
  >`;
374
380
  })}
375
381
  </div>`)}
@@ -34,6 +34,8 @@ declare const HelixHeadlessDialog_base: (new (...args: any[]) => import("@fusion
34
34
  * @event {Event} toggle - Says the state moved, carrying `newState` and `oldState`.
35
35
  *
36
36
  * @csspart dialog - The native dialog element.
37
+ *
38
+ * @cssstate open - While the dialog is open.
37
39
  */
38
40
  export declare class HelixHeadlessDialog extends HelixHeadlessDialog_base {
39
41
  /**
@@ -28,9 +28,11 @@ declare const HelixHeadlessDonutChart_base: typeof HelixElement & (new (...args:
28
28
  * @csspart mark - The invisible point the tooltip is anchored to.
29
29
  * @csspart plot - The drawing.
30
30
  * @csspart segment - One slice.
31
+ * @csspart segment-active - The slice under the pointer, beside `segment`.
31
32
  * @csspart segment-edge - One slice as a closed shape, for a boundary to trace.
32
33
  * @csspart tooltip - The bubble, forwarded from `Tooltip`.
33
34
  * @csspart tooltip-anchor - The `Tooltip` element itself.
35
+ * @csspart tooltip-arrow - The bubble's point, forwarded from `Tooltip`.
34
36
  * @csspart tooltip-cell - One column's name and value inside the tooltip.
35
37
  * @csspart tooltip-label - The slice's own name inside the tooltip.
36
38
  * @csspart tooltip-name - A column's name inside the tooltip.
@@ -86,15 +86,16 @@ let HelixHeadlessDonutChart = class HelixHeadlessDonutChart extends MixinChartSo
86
86
  renderSegment(share, index) {
87
87
  const circumference = 2 * Math.PI * this.radius;
88
88
  const length = share.fraction * circumference * this.span;
89
+ const active = this.pointer.at === index;
89
90
  return svg `<circle
90
91
  cx=${CENTER}
91
92
  cy=${CENTER}
92
- data-active=${this.pointer.at === index ? '' : nothing}
93
+ data-active=${active ? '' : nothing}
93
94
  data-series=${seriesIndex(index)}
94
95
  fill="none"
95
96
  style="--chart-series: var(--chart-series-${seriesIndex(index)})"
96
97
  @pointerenter=${() => this.pointer.set(index)}
97
- part="segment"
98
+ part="segment${active ? ' segment-active' : ''}"
98
99
  r=${this.radius}
99
100
  stroke-dasharray="${length} ${GAP}"
100
101
  stroke-dashoffset=${-share.start * circumference * this.span}
@@ -45,6 +45,8 @@ declare const HelixHeadlessDrawer_base: (new (...args: any[]) => import("@fusion
45
45
  * @csspart content - The scrolling content region.
46
46
  * @csspart header - The header region.
47
47
  * @csspart panel - The sliding panel.
48
+ *
49
+ * @cssstate open - While the drawer is open.
48
50
  */
49
51
  export declare class HelixHeadlessDrawer extends HelixHeadlessDrawer_base {
50
52
  protected readonly commands: CommandController;
@@ -51,6 +51,8 @@ declare const HelixHeadlessFileInput_base: (new (...args: any[]) => import("@fus
51
51
  * @csspart size-dismiss-mark - The glyph on the dismiss control, where none is slotted.
52
52
  * @csspart size-prefix - The category before the label.
53
53
  * @csspart trigger - The label that opens the picker.
54
+ *
55
+ * @cssstate invalid - While there is feedback to show: the platform's verdict, or the consumer's `feedback`.
54
56
  */
55
57
  export declare class HelixHeadlessFileInput extends HelixHeadlessFileInput_base {
56
58
  protected readonly aria: AriaForwardController;
@@ -59,6 +59,22 @@ import '../../menu/index.js';
59
59
  * @slot trigger - The control that opens the menu. A `Button` is the usual one.
60
60
  *
61
61
  * @event {HelixFacetEvent} helix-facet - Fired when a field's values change. Cancelable: refusing it takes the decision and nothing moves.
62
+ *
63
+ * @csspart divider - The rule between a field's comparisons and its values.
64
+ * @csspart divider-content - What is set into the rule.
65
+ * @csspart divider-line - The rule itself.
66
+ * @csspart entry - One row: a field, its comparison, an operator or a value.
67
+ * @csspart entry-item - The row itself.
68
+ * @csspart entry-mark - The trailing mark: a tick on a chosen value, a caret on a field.
69
+ * @csspart entry-start - The leading column.
70
+ * @csspart menu - The menu the fields are offered in.
71
+ * @csspart menu-back - The control that returns from a field's page.
72
+ * @csspart menu-back-mark - The glyph on the back control.
73
+ * @csspart menu-empty - Shown when there are no fields to offer.
74
+ * @csspart menu-header - The bar above a field's page, holding the way back and its name.
75
+ * @csspart menu-loading - Shown while the fields are still on their way.
76
+ * @csspart menu-surface - The floating panel the menu is drawn on.
77
+ * @csspart menu-title - The name of the field whose page is showing.
62
78
  */
63
79
  export declare class HelixHeadlessFilterMenu extends HelixElement {
64
80
  /**
@@ -115,19 +115,38 @@ let HelixHeadlessFilterMenu = class HelixHeadlessFilterMenu extends HelixElement
115
115
  const divider = this.tag('divider');
116
116
  const menu = this.tag('menu');
117
117
  const item = this.tag('menu-item');
118
- return html `<${menu} label=${this.label} @helix-select=${this.handleSelect}>
118
+ return html `<${menu}
119
+ part="menu"
120
+ exportparts="back: menu-back, back-mark: menu-back-mark, empty: menu-empty, header: menu-header,
121
+ loading: menu-loading, surface: menu-surface, title: menu-title"
122
+ label=${this.label}
123
+ @helix-select=${this.handleSelect}
124
+ >
119
125
  <slot name="trigger" slot="trigger"></slot>
120
126
  ${this.fields.map((field) => {
121
127
  const { label, name, operators, values } = field.vocabulary;
122
128
  const ticked = this.picked.get(name) ?? new Set();
123
129
  const using = this.operatorFor(field);
124
130
  const offered = using?.arity === 'none' ? [] : values;
125
- return html `<${item} data-facet="field" data-field=${name}>
131
+ return html `<${item}
132
+ part="entry"
133
+ exportparts="item: entry-item, mark: entry-mark, start: entry-start"
134
+ data-facet="field"
135
+ data-field=${name}
136
+ >
126
137
  ${label}
127
138
  ${operators.length > 1
128
- ? html `<${item} slot="submenu" data-facet="comparison" data-field=${name}>
139
+ ? html `<${item}
140
+ part="entry"
141
+ exportparts="item: entry-item, mark: entry-mark, start: entry-start"
142
+ slot="submenu"
143
+ data-facet="comparison"
144
+ data-field=${name}
145
+ >
129
146
  ${using?.label ?? ''}
130
147
  ${operators.map((operator) => html `<${item}
148
+ part="entry"
149
+ exportparts="item: entry-item, mark: entry-mark, start: entry-start"
131
150
  slot="submenu"
132
151
  checkable
133
152
  exclusive
@@ -139,9 +158,16 @@ let HelixHeadlessFilterMenu = class HelixHeadlessFilterMenu extends HelixElement
139
158
  </${item}>`
140
159
  : nothing}
141
160
  ${operators.length > 1 && offered.length > 0
142
- ? html `<${divider} slot="submenu" announced></${divider}>`
161
+ ? html `<${divider}
162
+ part="divider"
163
+ exportparts="content: divider-content, line: divider-line"
164
+ slot="submenu"
165
+ announced
166
+ ></${divider}>`
143
167
  : nothing}
144
168
  ${offered.map((option) => html `<${item}
169
+ part="entry"
170
+ exportparts="item: entry-item, mark: entry-mark, start: entry-start"
145
171
  slot="submenu"
146
172
  checkable
147
173
  ?exclusive=${using?.arity === 'one'}
@@ -113,6 +113,9 @@ declare const HelixHeadlessFilterInput_base: (new (...args: any[]) => import("@f
113
113
  * @csspart rest - How many tokens did not fit. A `<button>` with `expandable`, a `<span>` without it.
114
114
  * @csspart surface - The floating panel the suggestions sit in.
115
115
  * @csspart tags - The row the tokens sit in.
116
+ *
117
+ * @cssstate invalid - While there is feedback to show: the platform's verdict, or the consumer's `feedback`.
118
+ * @cssstate open - While the suggestions are open.
116
119
  */
117
120
  export declare class HelixHeadlessFilterInput extends HelixHeadlessFilterInput_base {
118
121
  protected readonly aria: AriaForwardController;
@@ -49,6 +49,7 @@ declare const HelixHeadlessHeatmap_base: typeof HelixElement & (new (...args: an
49
49
  * @csspart summary - The middle slot's box.
50
50
  * @csspart tooltip - The bubble, forwarded from `Tooltip`.
51
51
  * @csspart tooltip-anchor - The `Tooltip` element itself.
52
+ * @csspart tooltip-arrow - The bubble's point, forwarded from `Tooltip`.
52
53
  * @csspart tooltip-cell - One column's name and value inside the tooltip.
53
54
  * @csspart tooltip-label - The reading's own name inside the tooltip.
54
55
  * @csspart tooltip-name - A column's name inside the tooltip.
@@ -44,6 +44,9 @@ declare const HelixHeadlessInput_base: (new (...args: any[]) => import("@fusion.
44
44
  * @csspart hint - Help under the field, while nothing is wrong.
45
45
  * @csspart label - The question, over the field.
46
46
  * @csspart reveal - The button that shows and hides a password.
47
+ * @csspart reveal-pressed - The reveal button while the password shows, beside `reveal`.
48
+ *
49
+ * @cssstate invalid - While there is feedback to show: the platform's verdict, or the consumer's `feedback`.
47
50
  */
48
51
  export declare class HelixHeadlessInput extends HelixHeadlessInput_base {
49
52
  protected readonly aria: AriaForwardController;
@@ -159,7 +159,7 @@ let HelixHeadlessInput = class HelixHeadlessInput extends MixinControllerValue(M
159
159
  : nothing}
160
160
  ${this.reveal && this.type === 'password'
161
161
  ? html `<button
162
- part="reveal"
162
+ part="reveal${this.revealed ? ' reveal-pressed' : ''}"
163
163
  type="button"
164
164
  aria-label=${this.revealLabel}
165
165
  aria-pressed=${this.revealed ? 'true' : 'false'}
@@ -55,6 +55,7 @@ declare const HelixHeadlessLineChart_base: typeof HelixElement & (new (...args:
55
55
  * @csspart terminus - The mark on one series' last reading.
56
56
  * @csspart tooltip - The bubble, forwarded from `Tooltip`.
57
57
  * @csspart tooltip-anchor - The `Tooltip` element itself.
58
+ * @csspart tooltip-arrow - The bubble's point, forwarded from `Tooltip`.
58
59
  * @csspart tooltip-cell - One column's name and value inside the tooltip.
59
60
  * @csspart tooltip-label - The reading's own name inside the tooltip.
60
61
  * @csspart tooltip-name - A column's name inside the tooltip.
@@ -44,6 +44,8 @@ declare const HelixHeadlessListbox_base: (new (...args: any[]) => import("@fusio
44
44
  * @csspart loading - Shown while the options are still on their way.
45
45
  * @csspart search - The region holding the field that narrows the list.
46
46
  * @csspart search-field - The field itself.
47
+ *
48
+ * @cssstate invalid - While there is feedback to show: the platform's verdict, or the consumer's `feedback`.
47
49
  */
48
50
  export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
49
51
  protected readonly aria: AriaForwardController;
@@ -37,6 +37,8 @@ declare const HelixHeadlessMegamenu_base: (new (...args: any[]) => import("@fusi
37
37
  * @csspart trigger - The default trigger, where none was slotted.
38
38
  *
39
39
  * @cssproperty --megamenu-top - Where the panel starts, measured from the bar above it.
40
+ *
41
+ * @cssstate open - While the panel is open, which is when the trigger reads as current.
40
42
  */
41
43
  export declare class HelixHeadlessMegamenu extends HelixHeadlessMegamenu_base {
42
44
  /**
@@ -43,6 +43,11 @@ declare const HelixHeadlessMenu_base: (new (...args: any[]) => import("@fusion.d
43
43
  * @csspart loading - Shown while the items are still on their way.
44
44
  * @csspart surface - The floating panel the menu is drawn on.
45
45
  * @csspart title - The name of the submenu that is showing.
46
+ *
47
+ * @cssstate drilled - While a submenu's page is showing rather than the menu's own, so what is not a row can leave with the page it was on.
48
+ * @cssstate mark - While a row on the page showing can be ticked or leads to a page, so the trailing column is held open for every row.
49
+ * @cssstate open - While the menu is open.
50
+ * @cssstate start - While a row on the page showing has something in its leading column, so that column is held open for every row.
46
51
  */
47
52
  export declare class HelixHeadlessMenu extends HelixHeadlessMenu_base {
48
53
  /**