@fusion.dev/helix-headless 0.4.2 → 0.4.3
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.
- package/custom-elements.json +39 -39
- package/dist/app-header/root/app-header-root.d.ts +8 -28
- package/dist/avatar/group/avatar-group.d.ts +5 -30
- package/dist/breadcrumbs/root/breadcrumbs-root.d.ts +9 -28
- package/dist/chat/root/chat-root.d.ts +9 -28
- package/dist/color-picker/root/color-picker-root.d.ts +10 -28
- package/dist/combobox/root/combobox-root.d.ts +18 -60
- package/dist/copy-button/root/copy-button-root.d.ts +6 -21
- package/dist/data-table/root/data-table-root.d.ts +9 -32
- package/dist/date-input/root/date-input-root.d.ts +5 -21
- package/dist/date-picker/root/date-picker-root.d.ts +10 -35
- package/dist/dialog/root/dialog-root.d.ts +7 -29
- package/dist/donut-chart/root/donut-chart-root.d.ts +5 -25
- package/dist/file-input/root/file-input-root.d.ts +5 -22
- package/dist/heatmap/root/heatmap-root.d.ts +13 -36
- package/dist/image/root/image-root.d.ts +5 -22
- package/dist/input/root/input-root.d.ts +11 -29
- package/dist/kbd/root/kbd-root.d.ts +8 -26
- package/dist/legend/root/legend-root.d.ts +6 -24
- package/dist/listbox/root/listbox-root.d.ts +4 -26
- package/dist/megamenu/root/megamenu-root.d.ts +7 -39
- package/dist/meter/root/meter-root.d.ts +6 -24
- package/dist/number-input/root/number-input-root.d.ts +11 -20
- package/dist/outline/root/outline-root.d.ts +8 -27
- package/dist/pagination/root/pagination-root.d.ts +21 -54
- package/dist/pagination/summary/pagination-summary.d.ts +10 -31
- package/dist/progress/root/progress-root.d.ts +4 -21
- package/dist/rating/root/rating-root.d.ts +8 -31
- package/dist/slider/root/slider-root.d.ts +9 -32
- package/dist/splitter/root/splitter-root.d.ts +17 -85
- package/dist/steps/root/steps-root.d.ts +8 -26
- package/dist/steps/step/step.d.ts +11 -41
- package/dist/toast/item/toast-item.d.ts +6 -30
- package/dist/toggle/group/toggle-group.d.ts +7 -25
- package/dist/tooltip/root/tooltip-root.d.ts +14 -36
- package/dist/tour/root/tour-root.d.ts +6 -29
- package/dist/tree/item/tree-item.d.ts +13 -35
- package/dist/video/root/video-root.d.ts +12 -40
- package/dist/video-playlist/menu/video-playlist-menu.d.ts +3 -25
- package/dist/virtual-list/root/virtual-list-root.d.ts +5 -44
- package/package.json +17 -18
- package/{jsx.d.ts → types/jsx.d.ts} +724 -2537
- package/{vue.d.ts → types/vue.d.ts} +39 -39
- /package/{svelte.d.ts → types/svelte.d.ts} +0 -0
|
@@ -7991,13 +7991,13 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
7991
7991
|
HelixHeadlessAnnouncementVueProps,
|
|
7992
7992
|
HelixHeadlessAnnouncementVueEvents
|
|
7993
7993
|
>;
|
|
7994
|
-
/** Tracks whether the page has scrolled and carries it as the custom state 'scrolled', so the styled tier can lift the bar
|
|
7994
|
+
/** Tracks whether the page has scrolled and carries it as the custom state 'scrolled', so the styled tier can lift the bar without a scroll handler of its own. It is read on connect rather than derived: a fresh load starts at the top, which is what the server rendered, and a reload part-way down corrects on hydration. **A custom state and never 'data-scrolled'.** An attribute the element writes onto its own host is one the server did not send, so a hydrating framework reports a mismatch, intermittently: only when the reader reloads far enough down the page. 'ElementInternals.states' is not in the DOM, so there is nothing for a hydration pass to disagree with, and ':state(scrolled)' selects it. */
|
|
7995
7995
|
"helix-headless-app-header": DefineCustomElement<
|
|
7996
7996
|
HelixHeadlessAppHeader,
|
|
7997
7997
|
HelixHeadlessAppHeaderVueProps,
|
|
7998
7998
|
HelixHeadlessAppHeaderVueEvents
|
|
7999
7999
|
>;
|
|
8000
|
-
/** A part of 'Avatar' rather than a family of its own: it arranges avatars and is about nothing else
|
|
8000
|
+
/** A part of 'Avatar' rather than a family of its own: it arranges avatars and is about nothing else. **The overflow count is the group's, not a slot.** Which avatars are hidden is a fact the group works out from 'max', so a consumer writing the "+3" would be writing a number that has to agree with a list they do not control. **Hidden, not removed.** Past 'max' the extra avatars stay in the DOM and stop being shown, so nothing re-renders when 'max' changes and the accessible name is still built from all of them. */
|
|
8001
8001
|
"helix-headless-avatar-group": DefineCustomElement<
|
|
8002
8002
|
HelixHeadlessAvatarGroup,
|
|
8003
8003
|
HelixHeadlessAvatarGroupVueProps,
|
|
@@ -8033,7 +8033,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
8033
8033
|
HelixHeadlessBreadcrumbVueProps,
|
|
8034
8034
|
HelixHeadlessBreadcrumbVueEvents
|
|
8035
8035
|
>;
|
|
8036
|
-
/** The host is the landmark, so 'aria-label' on it names the trail directly
|
|
8036
|
+
/** The host is the landmark, so 'aria-label' on it names the trail directly. A page may hold more than one navigation, and landmarks are how a screen-reader user chooses between them. 'role="list"' is set explicitly on the '<ol>' even though it is one: 'list-style: none' strips list semantics in Safari, and a breadcrumb trail always removes its markers. Items are slotted rather than wrapped, so they are '<ol>' children in the flat tree and each carries 'role="listitem"' itself. **The trail does not measure itself, and the overflow is markup.** */
|
|
8037
8037
|
"helix-headless-breadcrumbs": DefineCustomElement<
|
|
8038
8038
|
HelixHeadlessBreadcrumbs,
|
|
8039
8039
|
HelixHeadlessBreadcrumbsVueProps,
|
|
@@ -8081,7 +8081,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
8081
8081
|
HelixHeadlessChatMessageVueProps,
|
|
8082
8082
|
HelixHeadlessChatMessageVueEvents
|
|
8083
8083
|
>;
|
|
8084
|
-
/** **It has no opinion about where it sits.** A chat is asked for as a floating button, a page, a palette, a sidebar, a modal and an inline block, and none of those is a variant of a conversation: they are containers
|
|
8084
|
+
/** **It has no opinion about where it sits.** A chat is asked for as a floating button, a page, a palette, a sidebar, a modal and an inline block, and none of those is a variant of a conversation: they are containers, and the containers already exist. Nothing here is positioned, nothing has a backdrop, and nothing owns a trigger. If a form factor needs a mode on this element, the split is wrong. **Scroll ownership is the behavior everything else depends on.** A transcript that grows wants to stay at the bottom, except when the reader has scrolled up to read, where pinning is hostile. The rule: pin while the reader is within 'threshold' of the bottom, and let go the moment they leave it. */
|
|
8085
8085
|
"helix-headless-chat": DefineCustomElement<
|
|
8086
8086
|
HelixHeadlessChat,
|
|
8087
8087
|
HelixHeadlessChatVueProps,
|
|
@@ -8117,13 +8117,13 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
8117
8117
|
HelixHeadlessColorInputVueProps,
|
|
8118
8118
|
HelixHeadlessColorInputVueEvents
|
|
8119
8119
|
>;
|
|
8120
|
-
/** **The picker itself, with no field around it.** Color Input is this element in a panel behind a text field
|
|
8120
|
+
/** **The picker itself, with no field around it.** Color Input is this element in a panel behind a text field; a settings pane or a toolbar wants the picker flat on the page with nothing to open. **The square is two real range inputs.** Saturation and brightness are each an '<input type="range">', laid over the square and made invisible, and the handle is drawn from their values. The keyboard, the announcements and the touch targets are the platform's, and there is no 'role="application"'. **The working model is HSB, and the value is derived from it.** The reverse loses colors: black is 'brightness: 0', whose hue and saturation are both undefined, so dragging to the bottom of the square and back would give gray where there had been red. A value arriving from outside is read into the model once. */
|
|
8121
8121
|
"helix-headless-color-picker": DefineCustomElement<
|
|
8122
8122
|
HelixHeadlessColorPicker,
|
|
8123
8123
|
HelixHeadlessColorPickerVueProps,
|
|
8124
8124
|
HelixHeadlessColorPickerVueEvents
|
|
8125
8125
|
>;
|
|
8126
|
-
/** **The list is 'helix-listbox', and the filtering is its own.** It
|
|
8126
|
+
/** **The list is 'helix-listbox', and the filtering is its own.** It owns narrowing, the empty state, the highlight, 'aria-activedescendant' and scrolling an option into view. What is left for this element is the field, the panel and the traffic between them. **The text and the value are two things.** What a reader types is a filter: it narrows the list and is thrown away. The value is whichever option they then choose, and the field is rewritten to that option's words once they have. The filter is cleared on close, so a reopened control does not start from the last visit's leftovers. **Focus stays in the field, which is the whole of what a combobox is.** The arrows move the list without leaving the text, through the listbox's public 'navigate'. 'role="combobox"' is on the input rather than on a wrapper, because the thing the pattern describes is the text field. **With 'multiple', the chosen options are tags in the field**, one object per answer, each with its own remove control. The panel stays open while more than one can be chosen and the filter clears on each choice, so the next pick starts from the whole list. **'creatable' announces, and does not write.** The options are the consumer's light DOM and nothing here puts an element into it: a component that grew the consumer's markup would be one their framework re-renders over. It offers the row and fires the event; adding the option is the consumer's. */
|
|
8127
8127
|
"helix-headless-combobox": DefineCustomElement<
|
|
8128
8128
|
HelixHeadlessCombobox,
|
|
8129
8129
|
HelixHeadlessComboboxVueProps,
|
|
@@ -8135,31 +8135,31 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
8135
8135
|
HelixHeadlessCommandVueProps,
|
|
8136
8136
|
HelixHeadlessCommandVueEvents
|
|
8137
8137
|
>;
|
|
8138
|
-
/** **The confirmation is the component.** Writing to the clipboard is three lines; what makes this worth an element is that the platform gives a reader no feedback at all
|
|
8138
|
+
/** **The confirmation is the component.** Writing to the clipboard is three lines; what makes this worth an element is that the platform gives a reader no feedback at all, so a press that copies looks identical to one that failed. **Announced after the write, never before.** A clipboard write is a permission the browser may refuse, for real reasons: an insecure origin, a document that is not focused, a gesture that did not qualify. The confirmation and the event both wait for the promise, and a refusal leaves the button exactly as it was. */
|
|
8139
8139
|
"helix-headless-copy-button": DefineCustomElement<
|
|
8140
8140
|
HelixHeadlessCopyButton,
|
|
8141
8141
|
HelixHeadlessCopyButtonVueProps,
|
|
8142
8142
|
HelixHeadlessCopyButtonVueEvents
|
|
8143
8143
|
>;
|
|
8144
|
-
/** **The schema is markup and the data is a property.** Columns are declared as 'helix-table-column' children, because a schema is small
|
|
8144
|
+
/** **The schema is markup and the data is a property.** Columns are declared as 'helix-table-column' children, because a schema is small and something a reader should see in the HTML; rows are handed over as an array, because a table that draws ten thousand elements cannot window them. '''html <helix-data-table .rows=${rows} sort="name:asc" page-size="20"> <helix-table-column field="name" sortable>Name</helix-table-column> <helix-table-column field="size" align="end" sortable .cell=${bytes}>Size</helix-table-column> </helix-data-table> ''' 'helix-table' takes rows as markup and is the right component for a table of twelve things a person wrote out. **Sort and filter apply to the whole set, never the page.** Sorting the drawn window is correct on the first screen and wrong on every other one. **The cell values do not server-render.** The headings do, and the row elements do, but reading a cell needs the columns, and the columns are markup children Lit SSR does not hand this element. So a crawler sees a table of the right shape with nothing in it. That is the cost of the first paragraph: use 'helix-table' where the served HTML has to carry the values. */
|
|
8145
8145
|
"helix-headless-data-table": DefineCustomElement<
|
|
8146
8146
|
HelixHeadlessDataTable,
|
|
8147
8147
|
HelixHeadlessDataTableVueProps,
|
|
8148
8148
|
HelixHeadlessDataTableVueEvents
|
|
8149
8149
|
>;
|
|
8150
|
-
/** **The calendar is 'helix-date-picker', not a second one written here.** It already knows about months, ranges, disabled days, the first day of the week and every keyboard rule a grid owes a reader
|
|
8150
|
+
/** **The calendar is 'helix-date-picker', not a second one written here.** It already knows about months, ranges, disabled days, the first day of the week and every keyboard rule a grid owes a reader. This element is the field, the overlay, and the translation between them. **Typed as well as picked, and the typing is why it is not '<input type="date">'.** The native control gives a free picker and a free locale and takes almost all styling with it. What is kept from it is the part worth keeping: a real text field. */
|
|
8151
8151
|
"helix-headless-date-input": DefineCustomElement<
|
|
8152
8152
|
HelixHeadlessDateInput,
|
|
8153
8153
|
HelixHeadlessDateInputVueProps,
|
|
8154
8154
|
HelixHeadlessDateInputVueEvents
|
|
8155
8155
|
>;
|
|
8156
|
-
/** A grid of days, per the APG date grid: the whole grid is one tab stop, arrows move by day and week, 'PageUp' and 'PageDown'
|
|
8156
|
+
/** A grid of days, per the APG date grid: the whole grid is one tab stop, arrows move by day and week, 'PageUp' and 'PageDown' by month, 'Home' and 'End' to the ends of the week. Only the focused cell is in the tab sequence. **Dates are 'YYYY-MM-DD' strings and every calculation is in UTC.** A local-time 'Date' shifts across a timezone or a daylight-saving boundary. 'month' is what the grid shows, separately from 'value', so paging does not select anything and a consumer can drive the view. Left unset it follows the first selected date, then the current month. 'mode' decides how many dates are held: absent takes one, 'range' takes two and marks everything between them, 'multiple' toggles. All three read and write the same comma-separated 'value'. */
|
|
8157
8157
|
"helix-headless-date-picker": DefineCustomElement<
|
|
8158
8158
|
HelixHeadlessDatePicker,
|
|
8159
8159
|
HelixHeadlessDatePickerVueProps,
|
|
8160
8160
|
HelixHeadlessDatePickerVueEvents
|
|
8161
8161
|
>;
|
|
8162
|
-
/** A real '<dialog>' opened with 'showModal()', not a div with a role and a hand-built trap. The platform gives four things that are each a day's work to reimplement
|
|
8162
|
+
/** A real '<dialog>' opened with 'showModal()', not a div with a role and a hand-built trap. The platform gives four things that are each a day's work to reimplement: the top layer, so the dialog is above everything whatever 'z-index' anyone wrote; a real backdrop; Escape; and inert-behind, so the page underneath is unreachable by pointer, keyboard or virtual cursor. **'open' drives 'showModal()', and every way it can close comes back through 'requestOpen'.** A native dialog closes from three directions: the property, Escape, and a '<form method="dialog">' submit. Left alone, two of them would shut the dialog while the consumer's state still said open, which is the bug that makes a modal impossible to reopen. */
|
|
8163
8163
|
"helix-headless-dialog": DefineCustomElement<
|
|
8164
8164
|
HelixHeadlessDialog,
|
|
8165
8165
|
HelixHeadlessDialogVueProps,
|
|
@@ -8171,7 +8171,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
8171
8171
|
HelixHeadlessDividerVueProps,
|
|
8172
8172
|
HelixHeadlessDividerVueEvents
|
|
8173
8173
|
>;
|
|
8174
|
-
/** The chart with the narrowest honest use, so the component is narrow too. **It reads one column and treats the rows as the parts.** Every other chart here takes a column per series; a ring has one whole to divide,
|
|
8174
|
+
/** The chart with the narrowest honest use, so the component is narrow too. **It reads one column and treats the rows as the parts.** Every other chart here takes a column per series; a ring has one whole to divide, so the first column of numbers is the series and each row is a slice. **It refuses negative values rather than drawing them.** An arc for a negative number either runs backwards over its neighbors or is silently dropped. Those rows are skipped and the total is of what is left. */
|
|
8175
8175
|
"helix-headless-donut-chart": DefineCustomElement<
|
|
8176
8176
|
HelixHeadlessDonutChart,
|
|
8177
8177
|
HelixHeadlessDonutChartVueProps,
|
|
@@ -8201,7 +8201,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
8201
8201
|
HelixHeadlessEmptyVueProps,
|
|
8202
8202
|
HelixHeadlessEmptyVueEvents
|
|
8203
8203
|
>;
|
|
8204
|
-
/** **A real '<input type="file">', kept and made invisible rather than replaced.** It is the only way to open a file picker: the dialog is a privileged action a script cannot start on its own, and it opens for a click on the input or on a '<label>' pointing at it. A component that draws its own button
|
|
8204
|
+
/** **A real '<input type="file">', kept and made invisible rather than replaced.** It is the only way to open a file picker: the dialog is a privileged action a script cannot start on its own, and it opens for a click on the input or on a '<label>' pointing at it. A component that draws its own button calls '.click()' on a hidden input anyway, and then has two things a screen reader can find where there is one control. So the input stays, holding the label, the name, the validity and the focus, and the visible trigger is a '<label for>'. A label is not focusable and does not need to be: the input is, and Enter and Space on it open the picker. */
|
|
8205
8205
|
"helix-headless-file-input": DefineCustomElement<
|
|
8206
8206
|
HelixHeadlessFileInput,
|
|
8207
8207
|
HelixHeadlessFileInputVueProps,
|
|
@@ -8213,7 +8213,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
8213
8213
|
HelixHeadlessFormatDateVueProps,
|
|
8214
8214
|
HelixHeadlessFormatDateVueEvents
|
|
8215
8215
|
>;
|
|
8216
|
-
/** **One family covers both readings
|
|
8216
|
+
/** **One family covers both readings.** 'rows="1"' is a status strip, 'rows="7"' is a contribution graph, and a cell that takes a tone covers both: GitHub's contribution graph is five discrete levels rather than a gradient. **What it cannot be is a bar chart with flat values**, and the data model is what closes that: chart color is per *series* everywhere else here, so ninety differently colored cells would be ninety series. **The data is a real '<table>' named by 'for'**, the convention every chart in this library uses, and it is the accessible representation. Hide it with 'data-hidden-visually' and the reading is still there. A cell takes its tone from its own 'data-tone', or from 'thresholds' and 'tones' bucketing its value. The cell's own wins, so a page that already knows a day was degraded does not encode that as a number to be decoded. **A tone is a name this tier never resolves.** 'tone="success"' writes '--heatmap-tone: var(--heatmap-tone-success)' and stops, so what a name is worth is the answering tier's to say. Reaching for 'var(--helix-color-*)' here is the dependency the tiers exist to prevent. */
|
|
8217
8217
|
"helix-headless-heatmap": DefineCustomElement<
|
|
8218
8218
|
HelixHeadlessHeatmap,
|
|
8219
8219
|
HelixHeadlessHeatmapVueProps,
|
|
@@ -8231,25 +8231,25 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
8231
8231
|
HelixHeadlessIconVueProps,
|
|
8232
8232
|
HelixHeadlessIconVueEvents
|
|
8233
8233
|
>;
|
|
8234
|
-
/** **An element rather than a recipe, because of the part CSS cannot do.** Reserving the box is 'aspect-ratio' and needs nothing from anybody
|
|
8234
|
+
/** **An element rather than a recipe, because of the part CSS cannot do.** Reserving the box is 'aspect-ratio' and needs nothing from anybody. What cannot be written as a rule is *when the picture arrived*: a stylesheet has no way to know, and no way to hear that it never will. So this owns three states and the two events that move between them, and leaves the box to the stylesheet. **The placeholder is a slot with nothing in it by default.** A default of 'Skeleton' would make this tier depend on a component it does not ship. */
|
|
8235
8235
|
"helix-headless-image": DefineCustomElement<
|
|
8236
8236
|
HelixHeadlessImage,
|
|
8237
8237
|
HelixHeadlessImageVueProps,
|
|
8238
8238
|
HelixHeadlessImageVueEvents
|
|
8239
8239
|
>;
|
|
8240
|
-
/** Renders a real '<input>', so the caret, selection, autofill, spellcheck, the password manager
|
|
8240
|
+
/** Renders a real '<input>', so the caret, selection, autofill, spellcheck, the password manager and the on-screen keyboard a phone chooses are all the platform's. It serializes into the server's markup, so the field is usable before any script loads. **The input inside a shadow root submits nothing**, the form being on the other side of the boundary. The host is form-associated instead and reports its own value through 'ElementInternals', which also carries validity and answers a form reset. 'value' and 'defaultValue' are separate the way 'checked' and 'defaultChecked' are: 'value' is what is in the field now, 'defaultValue' is what the markup asked for and where a reset returns to. **Validity is the platform's.** 'type' and 'required' are set on the real input and its 'validity' is copied onto the host. */
|
|
8241
8241
|
"helix-headless-input": DefineCustomElement<
|
|
8242
8242
|
HelixHeadlessInput,
|
|
8243
8243
|
HelixHeadlessInputVueProps,
|
|
8244
8244
|
HelixHeadlessInputVueEvents
|
|
8245
8245
|
>;
|
|
8246
|
-
/** Renders a real '<kbd>', so the passage still means "press this" to anything reading the markup
|
|
8246
|
+
/** Renders a real '<kbd>', so the passage still means "press this" to anything reading the markup. **One key per element, with 'keys' as the stated exception.** A sequence is several of these with the separator written between them as ordinary text, because that separator is prose: "then" in a sequence, "plus" in a chord, and a component inserting one would have to guess which. **'keys' exists because the glyphs were being typed by hand and were wrong.** A literal '⌘K' in a template tells a reader on Windows to press a key their keyboard does not have, and nothing catches it. Given 'mod' this renders '⌘K' on Apple and 'Ctrl+K' everywhere else. **'within' is what binds it, and it is absent by default**, so this draws a key and listens for nothing unless asked. */
|
|
8247
8247
|
"helix-headless-kbd": DefineCustomElement<
|
|
8248
8248
|
HelixHeadlessKbd,
|
|
8249
8249
|
HelixHeadlessKbdVueProps,
|
|
8250
8250
|
HelixHeadlessKbdVueEvents
|
|
8251
8251
|
>;
|
|
8252
|
-
/** A legend is a list, so it is a list: not part of a chart, and shared by whichever of them needs one. It takes its entries from the same table the chart reads, through 'for', so the two cannot disagree
|
|
8252
|
+
/** A legend is a list, so it is a list: not part of a chart, and shared by whichever of them needs one. It takes its entries from the same table the chart reads, through 'for', so the two cannot disagree. 'entries' picks which way to read that table. 'series' is one entry per data column, named by the header row, which is a line or a bar chart. 'categories' is one entry per body row, which is a donut: its slices are the rows and it has no axis to write their names along. **The table is resolved on the client and there is no server pass.** */
|
|
8253
8253
|
"helix-headless-legend": DefineCustomElement<
|
|
8254
8254
|
HelixHeadlessLegend,
|
|
8255
8255
|
HelixHeadlessLegendVueProps,
|
|
@@ -8273,7 +8273,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
8273
8273
|
HelixHeadlessListVueProps,
|
|
8274
8274
|
HelixHeadlessListVueEvents
|
|
8275
8275
|
>;
|
|
8276
|
-
/** **The listbox is the control and the options are its vocabulary.** A Select is this with a trigger in front of it, a Combobox is this with a text input, and a command palette is this again: they differ in what opens the list and what filters it, not in what the list is.
|
|
8276
|
+
/** **The listbox is the control and the options are its vocabulary.** A Select is this with a trigger in front of it, a Combobox is this with a text input, and a command palette is this again: they differ in what opens the list and what filters it, not in what the list is. **'value' is comma separated when 'multiple' is set**, the way 'Checkbox.Group''s is. It stays a string because that is what a form submits and what 'MixinControllerValue' holds. **Chosen and active are two different things.** Chosen is the answer; active is where the keyboard is. Only the second moves with the arrows, and 'aria-activedescendant' names it while focus stays on the list. */
|
|
8277
8277
|
"helix-headless-listbox": DefineCustomElement<
|
|
8278
8278
|
HelixHeadlessListbox,
|
|
8279
8279
|
HelixHeadlessListboxVueProps,
|
|
@@ -8285,7 +8285,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
8285
8285
|
HelixHeadlessLoaderVueProps,
|
|
8286
8286
|
HelixHeadlessLoaderVueEvents
|
|
8287
8287
|
>;
|
|
8288
|
-
/** **A disclosure, not a menu, and that is the whole design.** 'role="menu"' and 'menuitem' are for an application's commands: they take over the arrow keys, announce "menu" to a reader who asked for navigation, and put every link inside a role that is not a link.
|
|
8288
|
+
/** **A disclosure, not a menu, and that is the whole design.** 'role="menu"' and 'menuitem' are for an application's commands: they take over the arrow keys, announce "menu" to a reader who asked for navigation, and put every link inside a role that is not a link. This is a button that shows and hides a region of the consumer's own anchors, which leaves a middle click, a modified click and the status bar working. 'Menu' remains right for a row of commands. **It renders no links.** A router renders its own anchor and cannot render one inside this shadow root, so the panel is a slot and what goes in it is the lists and headings the consumer wrote. **It opens on hover, and a press is always the fallback.** 'open-on' says which, and hover is the resting value because a nav bar is where a reader expects to sweep along a row and see each section. */
|
|
8289
8289
|
"helix-headless-megamenu": DefineCustomElement<
|
|
8290
8290
|
HelixHeadlessMegamenu,
|
|
8291
8291
|
HelixHeadlessMegamenuVueProps,
|
|
@@ -8303,7 +8303,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
8303
8303
|
HelixHeadlessMenuVueProps,
|
|
8304
8304
|
HelixHeadlessMenuVueEvents
|
|
8305
8305
|
>;
|
|
8306
|
-
/** **Not 'Progress', and the difference is the whole component.** A progress bar reports how far along a task is: it starts empty, ends full, and full is always the good end. A meter reports a level in a range that is not going anywhere, and which end is good is a fact about the thing
|
|
8306
|
+
/** **Not 'Progress', and the difference is the whole component.** A progress bar reports how far along a task is: it starts empty, ends full, and full is always the good end. A meter reports a level in a range that is not going anywhere, and which end is good is a fact about the thing measured. So there is no 'indeterminate': a measurement whose value is unknown is not one. **'low', 'high' and 'optimum' are the reason it exists**, following the HTML specification's own rule. The three cut the range into a low band, a middle and a high band, and 'optimum' says which is the one to be in; the band next to it is fair and the one two away is poor. */
|
|
8307
8307
|
"helix-headless-meter": DefineCustomElement<
|
|
8308
8308
|
HelixHeadlessMeter,
|
|
8309
8309
|
HelixHeadlessMeterVueProps,
|
|
@@ -8327,7 +8327,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
8327
8327
|
HelixHeadlessNotificationsVueProps,
|
|
8328
8328
|
HelixHeadlessNotificationsVueEvents
|
|
8329
8329
|
>;
|
|
8330
|
-
/** **A family rather than 'Input''s 'type="number"'
|
|
8330
|
+
/** **A family rather than 'Input''s 'type="number"'.** It renders two buttons, binds four keys 'Input' does not, and owns clamping and stepping, so it is an alternative and not a variant. **The field is 'type="text"' with 'inputmode="decimal"', and that is a measurement.** Asked of a real browser, 'type=number' fails three ways this control cannot live with: ''' typed "12e" into type=number → .value === "" focused, wheeled over it → 5 became 4 selectionStart on type=number → null same keystrokes into type=text → .value === "12e" ''' The first is fatal alone: the element cannot see what the reader typed. The second changes a value because a page scrolled past. The third means the caret cannot be managed at all. 'inputmode' keeps the phone keypad, which is the one thing 'type=number' was giving. Validity is still the platform's, through 'min', 'max' and 'step' mirrored onto the host's own 'setValidity'. **Stepping is separate from typing**, so a reader mid-way through a number is not corrected under their hands. */
|
|
8331
8331
|
"helix-headless-number-input": DefineCustomElement<
|
|
8332
8332
|
HelixHeadlessNumberInput,
|
|
8333
8333
|
HelixHeadlessNumberInputVueProps,
|
|
@@ -8345,13 +8345,13 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
8345
8345
|
HelixHeadlessOptionVueProps,
|
|
8346
8346
|
HelixHeadlessOptionVueEvents
|
|
8347
8347
|
>;
|
|
8348
|
-
/** A table of contents, named for the job. It sits beside 'Navigation', which is the same job at the other scale: one navigates a site, the other
|
|
8348
|
+
/** A table of contents, named for the job. It sits beside 'Navigation', which is the same job at the other scale: one navigates a site, the other a document. **The links are the consumer's own anchors.** A router renders its own '<a>' and cannot render one inside this shadow root, and the hrefs are fragments the page already knows. **What is current is decided by position, not by intersection.** An 'IntersectionObserver' with a band near the top fails in both directions: with headings far apart nothing is in the band and the marker goes out, and with headings close together several are in it at once. */
|
|
8349
8349
|
"helix-headless-outline": DefineCustomElement<
|
|
8350
8350
|
HelixHeadlessOutline,
|
|
8351
8351
|
HelixHeadlessOutlineVueProps,
|
|
8352
8352
|
HelixHeadlessOutlineVueEvents
|
|
8353
8353
|
>;
|
|
8354
|
-
/** The component is the truncation
|
|
8354
|
+
/** **The component is the truncation.** Given a page and a total it works out which numbers to show and where the runs break, so this is data-driven rather than composed: '<helix-pagination page="4" pages="12">' rather than twelve slotted children a consumer keeps in step with their own query. **The width does not change as you page.** The run around the current page is 'siblings' either side, and grows to absorb a gap slot at a boundary, so the control holds the same number of slots from the first page to the last. Anything that lets the count vary moves the buttons under the pointer between one click and the next. **A gap is only drawn where it hides more than one page, and a gap is a control.** It goes to the middle of the run it stands over, which is the binary-search step: any page in a set of any size is a handful of presses. **'href' is what makes these links.** Set it and every page renders an '<a>' with '{page}' filled in, so the output is crawlable, a middle click opens a tab, and the address bar is the state. Left unset they are buttons, which is right for a table paging in place. Either way the click announces 'helix-navigate' first, and 'preventDefault()' stops the navigation as well as the change, which is how a router takes over. **'helix-navigate' and not 'helix-change'.** Moving to page four chooses nothing; it moves the view over a result that has not changed. **The count and the page-size control are their own elements.** 'Pagination.Summary' and 'Pagination.Size' sit beside this one, because a slot can only offer one place: at one end of one row, in one order. */
|
|
8355
8355
|
"helix-headless-pagination": DefineCustomElement<
|
|
8356
8356
|
HelixHeadlessPagination,
|
|
8357
8357
|
HelixHeadlessPaginationVueProps,
|
|
@@ -8363,7 +8363,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
8363
8363
|
HelixHeadlessPaginationSizeVueProps,
|
|
8364
8364
|
HelixHeadlessPaginationSizeVueEvents
|
|
8365
8365
|
>;
|
|
8366
|
-
/** Its own element rather than a part of 'Pagination', so a consumer decides where it goes
|
|
8366
|
+
/** Its own element rather than a part of 'Pagination', so a consumer decides where it goes: above, below, in a table's caption, or on the other side of the page. Inside the run it could only ever be at one end of one row. **It repeats 'page', 'page-size' and 'total', and the cost of that is skew.** Those three come from the consumer's own query, so writing them on two elements is one variable used twice; what it risks is the two disagreeing. **Nothing removes that at this level, and it was measured.** A coordinating root can only reach light-DOM children by writing attributes onto them, which a framework reports as a hydration error, or through context, which is dead on a server: '@lit/context' subscribes from 'connectedCallback', and Lit SSR does not call it. */
|
|
8367
8367
|
"helix-headless-pagination-summary": DefineCustomElement<
|
|
8368
8368
|
HelixHeadlessPaginationSummary,
|
|
8369
8369
|
HelixHeadlessPaginationSummaryVueProps,
|
|
@@ -8381,7 +8381,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
8381
8381
|
HelixHeadlessPopoverVueProps,
|
|
8382
8382
|
HelixHeadlessPopoverVueEvents
|
|
8383
8383
|
>;
|
|
8384
|
-
/** Determinate by default, and 'indeterminate' for a task whose total is not known yet. 'Loader' is still
|
|
8384
|
+
/** Determinate by default, and 'indeterminate' for a task whose total is not known yet. 'Loader' is still right where the wait is short or has no place of its own on the page. A bar that fills at a made-up rate would be a bar that lies, so the indeterminate one does not fill: it runs a segment across the track, which says work is happening and claims no proportion. 'aria-valuenow' is omitted with it, which is the platform's own signal for the same thing. **The fill is a fraction of the track, written as a custom property.** */
|
|
8385
8385
|
"helix-headless-progress": DefineCustomElement<
|
|
8386
8386
|
HelixHeadlessProgress,
|
|
8387
8387
|
HelixHeadlessProgressVueProps,
|
|
@@ -8411,7 +8411,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
8411
8411
|
HelixHeadlessRadioVueProps,
|
|
8412
8412
|
HelixHeadlessRadioVueEvents
|
|
8413
8413
|
>;
|
|
8414
|
-
/** **Half marks decide the shape.** Supporting them means the value is not an integer and the targets are not the marks: five stars at a half step is ten places to press
|
|
8414
|
+
/** **Half marks decide the shape.** Supporting them means the value is not an integer and the targets are not the marks: five stars at a half step is ten places to press. The pointer handling and 'step' are built around that rather than added over it. **A partial mark is the whole mark, clipped**, not a second glyph filled to the middle: the fill is the same marks over the same marks, cut off partway, so any mark works and any fraction does. **Read-only is not this control grayed out.** The commoner use is showing a score nobody is being asked for, which is a reading rather than a disabled input, and it is announced as one. */
|
|
8415
8415
|
"helix-headless-rating": DefineCustomElement<
|
|
8416
8416
|
HelixHeadlessRating,
|
|
8417
8417
|
HelixHeadlessRatingVueProps,
|
|
@@ -8435,7 +8435,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
8435
8435
|
HelixHeadlessSkeletonVueProps,
|
|
8436
8436
|
HelixHeadlessSkeletonVueEvents
|
|
8437
8437
|
>;
|
|
8438
|
-
/** A real '<input type="range">', so the drag, the arrow keys, Home and End, the page keys and the touch target are
|
|
8438
|
+
/** A real '<input type="range">', so the drag, the arrow keys, Home and End, the page keys and the touch target are the platform's. The last is the one nobody notices: a native range has a hit area larger than its thumb, sized by the platform for a finger. **The value is a string, like every other form control's.** A range submits text and 'MixinControllerValue' holds text, so the number is a reading of the value. 'valueAsNumber' is there for arithmetic. **Marks are drawn rather than left to '<datalist>'**, whose ticks cannot be styled and which Firefox does not render for a range at all. A mark is decoration; what a reader can land on is 'step', which the input enforces whether or not anything is drawn. 'markers' is a count rather than a flag, so a slider from zero to a hundred cannot silently ask for a hundred and one. **A range is two of them.** There is no native two-thumb range, so two are stacked on one track and each thumb keeps its own. */
|
|
8439
8439
|
"helix-headless-slider": DefineCustomElement<
|
|
8440
8440
|
HelixHeadlessSlider,
|
|
8441
8441
|
HelixHeadlessSliderVueProps,
|
|
@@ -8459,7 +8459,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
8459
8459
|
HelixHeadlessSpeedDialVueProps,
|
|
8460
8460
|
HelixHeadlessSpeedDialVueEvents
|
|
8461
8461
|
>;
|
|
8462
|
-
/** **One axis, and nesting is how you get two.**
|
|
8462
|
+
/** **One axis, and nesting is how you get two.** A splitter inside a splitter gives back the cross, and gives the three-pane and four-pane arrangements a single divider never had. **Where two of them cross there is a corner, and it moves both.** A splitter slotted into a pane of another, at right angles to it, grows a handle at the crossing: 'move' under the pointer, both arrow axes on the keyboard, and a drag that carries the two positions at once. It appears at 'firstUpdated' rather than in the served markup, being an affordance rather than content, and a splitter with no corner yet is a splitter with two working dividers. **The divider is a real 'role="separator"' with 'aria-valuenow'**, moved by the arrow keys as well as by pointer, with 'Home' and 'End' taking it to its bounds. A drag in progress is a state rather than ':hover', so both dividers a corner moves are lit for as long as it moves them. **It goes where it is put, all the way to either end.** 'min' and 'max' are nothing and everything unless a consumer says otherwise, because a divider that stops short of the edge gives a reader no way to put a pane away. **A pane can be shut, and that is not the same as a divider at the edge.** The geometry is identical and the knowledge is not: only a shut pane knows where to open back to. So 'collapsed' is a second state rather than a reading of the position, and the position it opens to is the one collapsing never overwrote. 'collapsed-size' keeps a sliver showing where a pane has a tab strip worth leaving, and collapse overrides 'min' and 'max', which is what those are for. */
|
|
8463
8463
|
"helix-headless-splitter": DefineCustomElement<
|
|
8464
8464
|
HelixHeadlessSplitter,
|
|
8465
8465
|
HelixHeadlessSplitterVueProps,
|
|
@@ -8477,13 +8477,13 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
8477
8477
|
HelixHeadlessStatVueProps,
|
|
8478
8478
|
HelixHeadlessStatVueEvents
|
|
8479
8479
|
>;
|
|
8480
|
-
/** **'active' names where the reader is. 'complete' stays on each step.**
|
|
8480
|
+
/** **'active' names where the reader is. 'complete' stays on each step.** Only one of them is positional: return to stage one of three and stages one and two are still finished, where "everything before the active one" says only the first is. So this element drives 'current' and never touches 'complete'. **'active' is optional, and a sequence without it still renders.** Left unset, each step's own 'current' stands, which is what lets the whole sequence be right in the server's markup: this element would have to count its slotted children to know which is third, and the server has none to count. */
|
|
8481
8481
|
"helix-headless-steps": DefineCustomElement<
|
|
8482
8482
|
HelixHeadlessSteps,
|
|
8483
8483
|
HelixHeadlessStepsVueProps,
|
|
8484
8484
|
HelixHeadlessStepsVueEvents
|
|
8485
8485
|
>;
|
|
8486
|
-
/** **The name is a button, and only the name.**
|
|
8486
|
+
/** **The name is a button, and only the name.** The marker is 'aria-hidden' decoration, so wrapping it would add hit area and no meaning. It is 'helix-button' rather than a '<button>' this element resets: the hover wash, the focus ring and the disabled treatment are decisions the button carries. **It says nothing about where a reader may go.** Every step is pressable and announces itself with 'helix-select'; refusing the ones ahead is 'disabled', which the consumer sets, because only they know whether a form can be skipped. **The marker is a slot whose fallback is the state.** A finished stage shows a check, the current one a target, one not yet reached an empty ring. Exactly one is rendered, chosen from the step's own two booleans, rather than three with two hidden in CSS: the accessibility tree would otherwise carry marks that are not there. */
|
|
8487
8487
|
"helix-headless-step": DefineCustomElement<
|
|
8488
8488
|
HelixHeadlessStep,
|
|
8489
8489
|
HelixHeadlessStepVueProps,
|
|
@@ -8573,7 +8573,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
8573
8573
|
HelixHeadlessTimelineVueProps,
|
|
8574
8574
|
HelixHeadlessTimelineVueEvents
|
|
8575
8575
|
>;
|
|
8576
|
-
/** An element rather than a slot, because it carries a timeout, a tone, a dismiss control and a lifetime that pauses: behavior, state and API
|
|
8576
|
+
/** An element rather than a slot, because it carries a timeout, a tone, a dismiss control and a lifetime that pauses: behavior, state and API. **The timer is the item's own.** Held by the region, one message arriving would restart another's, so a stack of three would go from three seconds each to nine for the last. **A message is the opposite of the page it is over.** Inverted by default, so a thing arriving in a corner is told apart from the page before it is read, and by a flip of 'color-scheme' rather than by spending a color that means something. */
|
|
8577
8577
|
"helix-headless-toast-item": DefineCustomElement<
|
|
8578
8578
|
HelixHeadlessToastItem,
|
|
8579
8579
|
HelixHeadlessToastItemVueProps,
|
|
@@ -8585,7 +8585,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
8585
8585
|
HelixHeadlessToastVueProps,
|
|
8586
8586
|
HelixHeadlessToastVueEvents
|
|
8587
8587
|
>;
|
|
8588
|
-
/** The indicator is one element that travels, not a background that appears on whichever item is current.
|
|
8588
|
+
/** The indicator is one element that travels, not a background that appears on whichever item is current. A fill that swaps is two things changing at once and reads as a flicker; one that moves is a single object the eye follows, and it says where the selection came from as well as where it went. Its box is measured from the selected item and written onto the indicator as custom properties, labels being different lengths. Measurement is client-side by necessity, so the server renders the indicator hidden and it fades in once it has somewhere to be, which is the harmless direction. */
|
|
8589
8589
|
"helix-headless-toggle-group": DefineCustomElement<
|
|
8590
8590
|
HelixHeadlessToggleGroup,
|
|
8591
8591
|
HelixHeadlessToggleGroupVueProps,
|
|
@@ -8603,13 +8603,13 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
8603
8603
|
HelixHeadlessToolbarVueProps,
|
|
8604
8604
|
HelixHeadlessToolbarVueEvents
|
|
8605
8605
|
>;
|
|
8606
|
-
/** The trigger is slotted and stays the consumer's own element. The bubble is rendered here, in the top layer through the popover API, so it clears any ancestor with 'overflow: hidden' without a 'z-index' anywhere.
|
|
8606
|
+
/** The trigger is slotted and stays the consumer's own element. The bubble is rendered here, in the top layer through the popover API, so it clears any ancestor with 'overflow: hidden' without a 'z-index' anywhere. Position comes from 'FloatingController', which flips to another side when the preferred one does not fit. **Two forms, and they are not equivalent for a screen reader.** Wrapping is the convenience form and is right where the bubble decorates a control that already says what it is: nothing here can describe a slotted trigger, an IDREF being unable to cross a shadow boundary. 'for' is the form that works. The tooltip sits *beside* the trigger in the consumer's own tree and names it by id, so an IDREF between them is legal in the ordinary way: '''html <helix-button id="save" aria-describedby="save-tip">Save</helix-button> <helix-tooltip id="save-tip" for="save" content="Save your work"></helix-tooltip> ''' The reference points at *this host*, not at the bubble in its shadow root: the description is computed from the flat tree, which descends into shadow content on its own. **The consumer writes that 'aria-describedby', and nothing here writes it for them.** Setting it at runtime is a hydration mismatch React will not patch up. 'for' audits itself on first open and warns once where it is missing. It shows on hover and on focus, and hides on leave, on blur, on Escape, and once the trigger has been activated: the hint is spent when the control has been used. */
|
|
8607
8607
|
"helix-headless-tooltip": DefineCustomElement<
|
|
8608
8608
|
HelixHeadlessTooltip,
|
|
8609
8609
|
HelixHeadlessTooltipVueProps,
|
|
8610
8610
|
HelixHeadlessTooltipVueEvents
|
|
8611
8611
|
>;
|
|
8612
|
-
/** The root owns the order and nothing else. Which stop is current, what Next and Back mean, when the run is finished; the stops own where they point, and the consumer owns every word. **The spotlight is a shadow, not a hole.** The scrim is a box the size of the current target with an enormous spread on its 'box-shadow', so the darkness is what the shadow paints
|
|
8612
|
+
/** The root owns the order and nothing else. Which stop is current, what Next and Back mean, when the run is finished; the stops own where they point, and the consumer owns every word. **The spotlight is a shadow, not a hole.** The scrim is a box the size of the current target with an enormous spread on its 'box-shadow', so the darkness is what the shadow paints. A 'clip-path' on a full-screen scrim needs the viewport in the same coordinate space as the cut, which stops being true the moment anything between them is transformed. **It measures, and the target is an element elsewhere on the page whose position nothing can know statically.** Nothing is measured on the server and nothing needs to be: a tour starts when a reader asks for it. */
|
|
8613
8613
|
"helix-headless-tour": DefineCustomElement<
|
|
8614
8614
|
HelixHeadlessTour,
|
|
8615
8615
|
HelixHeadlessTourVueProps,
|
|
@@ -8621,7 +8621,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
8621
8621
|
HelixHeadlessTourStopVueProps,
|
|
8622
8622
|
HelixHeadlessTourStopVueEvents
|
|
8623
8623
|
>;
|
|
8624
|
-
/** **'open', on 'MixinControllerOpen', rather than a bare boolean of its own.** A branch showing its children is the same state a disclosure holds
|
|
8624
|
+
/** **'open', on 'MixinControllerOpen', rather than a bare boolean of its own.** A branch showing its children is the same state a disclosure holds. A hand-written toggle announces nothing, so a consumer could neither know a branch opened nor own the state. 'aria-expanded' is still what the row renders: the property differs, not the semantics. An element rather than a slot, because it owns state: whether it is open, selected, and whether it holds focus. A branch is any item with something slotted into 'children', detected in 'firstUpdated' because the server cannot inspect children. The server renders the node as a leaf and the twisty appears on hydration, which is the harmless direction. **'href' makes the row itself the link.** With the anchor slotted into the name instead, everything outside the words is dead: no Enter, no middle click, no status bar. Given an 'href' the row *is* an '<a>'. */
|
|
8625
8625
|
"helix-headless-tree-item": DefineCustomElement<
|
|
8626
8626
|
HelixHeadlessTreeItem,
|
|
8627
8627
|
HelixHeadlessTreeItemVueProps,
|
|
@@ -8645,7 +8645,7 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
8645
8645
|
HelixHeadlessVideoPlaylistItemVueProps,
|
|
8646
8646
|
HelixHeadlessVideoPlaylistItemVueEvents
|
|
8647
8647
|
>;
|
|
8648
|
-
/** The entries again, reachable without leaving the picture. A playlist beside the player is a list a reader scrolls to; the same list in the control bar is one they open over the video
|
|
8648
|
+
/** The entries again, reachable without leaving the picture. A playlist beside the player is a list a reader scrolls to; the same list in the control bar is one they open over the video. **It is placed by the consumer, not rendered by the playlist**, and that is forced rather than chosen: a shadow root cannot project into a sibling's light DOM, so nothing the playlist renders can land inside the player's control bar. What can is an element the consumer writes there, which is what 'Video''s 'controls' slot is for. */
|
|
8649
8649
|
"helix-headless-video-playlist-menu": DefineCustomElement<
|
|
8650
8650
|
HelixHeadlessVideoPlaylistMenu,
|
|
8651
8651
|
HelixHeadlessVideoPlaylistMenuVueProps,
|
|
@@ -8657,13 +8657,13 @@ export interface WcToolkitVueGlobalComponents {
|
|
|
8657
8657
|
HelixHeadlessVideoPlaylistVueProps,
|
|
8658
8658
|
HelixHeadlessVideoPlaylistVueEvents
|
|
8659
8659
|
>;
|
|
8660
|
-
/** **The picture is a real '<video>'.** Decoding, buffering, captions, Picture in Picture, AirPlay and
|
|
8660
|
+
/** **The picture is a real '<video>'.** Decoding, buffering, captions, Picture in Picture, AirPlay and whatever codecs a device has are the platform's. What is replaced is the control bar, which is the one part that cannot be styled. **Every control is a real control.** The scrubber and the volume are '<input type="range">', so arrow keys, Home and End, the platform's touch target and its screen reader announcement all come for free. **Native controls are the fallback, not the default.** Where a consumer sets 'controls' the browser's bar is used and this one is not drawn, and the keys below are not bound: two handlers on one press is a video that seeks twice. The keys are the ones every player uses: Space and 'k' to play or pause, the arrows to seek and to change volume, 'm' to mute, 'f' for fullscreen. They are bound on this element rather than on the document, because a video is not a palette. **'<source>' and '<track>' are copied into the video, never slotted into it.** A media element runs resource selection over its own child *nodes*, and a slot is one node, so slotted sources reach it as nothing: no text tracks, no current source, 'readyState' zero. A video given sources that way does not merely lack captions, it does not play. They are copied rather than moved, because the consumer's light DOM is theirs, and rebuilt whenever the slot changes. */
|
|
8661
8661
|
"helix-headless-video": DefineCustomElement<
|
|
8662
8662
|
HelixHeadlessVideo,
|
|
8663
8663
|
HelixHeadlessVideoVueProps,
|
|
8664
8664
|
HelixHeadlessVideoVueEvents
|
|
8665
8665
|
>;
|
|
8666
|
-
/** **The set arrives as data, which is what makes this a virtual list rather than a box that hides children.** 'for' names a '<script type="application/json">' holding an array of objects, and a '<template>' child says what one row looks like: elements carrying 'data-field="name"' are filled with that field of the item. Both halves are markup, and that is the
|
|
8666
|
+
/** **The set arrives as data, which is what makes this a virtual list rather than a box that hides children.** 'for' names a '<script type="application/json">' holding an array of objects, and a '<template>' child says what one row looks like: elements carrying 'data-field="name"' are filled with that field of the item. Both halves are markup, and that is the reason for the shape. An 'items' property cannot survive React hydration, which skips every property it would have to apply imperatively, and light-DOM children exist by the time anything could decide not to create them. Text in the document is neither, and it is one node whatever the row count. **The accessible version is not a '<table>'**, the way it is for the charts that share this 'for="<id>"' shape: ten thousand rows in one is the cost this exists to avoid. It is the rendered window plus 'aria-setsize'. */
|
|
8667
8667
|
"helix-headless-virtual-list": DefineCustomElement<
|
|
8668
8668
|
HelixHeadlessVirtualList,
|
|
8669
8669
|
HelixHeadlessVirtualListVueProps,
|
|
File without changes
|