@fusion.dev/helix-headless 0.174.0 → 0.175.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.
- package/custom-elements.json +141 -43
- package/dist/app-header/root/app-header-root.d.ts +2 -1
- package/dist/app-header/root/app-header-root.js +6 -1
- package/dist/button/root/button-root.d.ts +6 -1
- package/dist/button/root/button-root.js +1 -0
- package/dist/command/root/command-root.d.ts +4 -2
- package/dist/command/root/command-root.js +1 -0
- package/dist/date-picker/root/date-picker-root.d.ts +6 -0
- package/dist/date-picker/root/date-picker-root.js +7 -1
- package/dist/dialog/form-method.d.ts +12 -0
- package/dist/dialog/form-method.js +13 -0
- package/dist/dialog/root/dialog-root.d.ts +1 -9
- package/dist/dialog/root/dialog-root.js +2 -11
- package/dist/drawer/root/drawer-root.d.ts +2 -0
- package/dist/drawer/root/drawer-root.js +6 -0
- package/dist/lightbox/item/lightbox-item.d.ts +1 -0
- package/dist/lightbox/root/lightbox-root.d.ts +25 -5
- package/dist/lightbox/root/lightbox-root.js +33 -10
- package/dist/notifications/group/notification-group.js +2 -2
- package/dist/notifications/notification/notification.js +4 -5
- package/dist/notifications/root/notifications-root.d.ts +4 -3
- package/dist/notifications/root/notifications-root.js +1 -1
- package/dist/pagination/root/pagination-root.d.ts +2 -1
- package/dist/pagination/root/pagination-root.js +6 -1
- package/dist/tooltip/root/tooltip-root.d.ts +5 -2
- package/dist/tooltip/root/tooltip-root.js +11 -11
- package/lint.json +1 -1
- package/package.json +5 -5
- package/types/jsx.d.ts +50 -40
- package/types/vue.d.ts +6 -5
package/custom-elements.json
CHANGED
|
@@ -42953,7 +42953,7 @@
|
|
|
42953
42953
|
"declarations": [
|
|
42954
42954
|
{
|
|
42955
42955
|
"kind": "class",
|
|
42956
|
-
"description": "The list is a `Listbox`, which handles filtering, the empty state, the match\nhighlight, `aria-activedescendant`, scrolling an option into view, and moving\nbetween options with the keyboard. The palette adds a dialog and a hotkey\nthat opens it.\n\nThe palette keeps no value. It is not a form control and submits nothing.\nChoosing an option dispatches `helix-select` once. To remember the last\ncommand, store it yourself. An option with `href` is a link to a page, which\nthe browser follows once the palette has closed.\n\nThe hotkey listener is on the document, so the hotkey works from anywhere on\nthe page, including inside another control's text field, whether or not the\npalette is open. `mod` means Command on a Mac and Control elsewhere, so you\nwrite one binding.\n\nWith `inline`, the palette is drawn in the page with no dialog, as a search\nover a list that is always shown.\n\n**Pages.** A command can open a page of commands of its own, as a palette\noffers \"Change theme\" and then the themes. Give the option `opens` with a\nname, and slot the page's commands as `page:` and that name:\n\n```html\n<helix-command>\n <helix-option value=\"theme\" opens=\"theme\">Change theme</helix-option>\n <helix-option value=\"dark\" slot=\"page:theme\">Dark</helix-option>\n <helix-option value=\"light\" slot=\"page:theme\">Light</helix-option>\n</helix-command>\n```\n\nChoosing the opener says `helix-select` with its value, and canceling it\nkeeps the page that is shown. The list then shows the page, named by the\nopener's words, and a screen reader hears those words. Backspace in an empty\nfilter goes back, and a screen reader hears the name of the page it goes\nback to. `page` says which page is shown.\n\nThe filter is cleared when the palette closes, so each opening starts from\nthe full list. Combobox and Select do the same. As typing narrows the list, a\nscreen reader hears how many commands are left, such as \"3 commands\".\n\n**Keyboard.** Focus goes to the filter field as the palette opens,
|
|
42956
|
+
"description": "The list is a `Listbox`, which handles filtering, the empty state, the match\nhighlight, `aria-activedescendant`, scrolling an option into view, and moving\nbetween options with the keyboard. The palette adds a dialog and a hotkey\nthat opens it.\n\nThe palette keeps no value. It is not a form control and submits nothing.\nChoosing an option dispatches `helix-select` once. To remember the last\ncommand, store it yourself. An option with `href` is a link to a page, which\nthe browser follows once the palette has closed.\n\nThe hotkey listener is on the document, so the hotkey works from anywhere on\nthe page, including inside another control's text field, whether or not the\npalette is open. `mod` means Command on a Mac and Control elsewhere, so you\nwrite one binding.\n\nWith `inline`, the palette is drawn in the page with no dialog, as a search\nover a list that is always shown.\n\n**Pages.** A command can open a page of commands of its own, as a palette\noffers \"Change theme\" and then the themes. Give the option `opens` with a\nname, and slot the page's commands as `page:` and that name:\n\n```html\n<helix-command>\n <helix-option value=\"theme\" opens=\"theme\">Change theme</helix-option>\n <helix-option value=\"dark\" slot=\"page:theme\">Dark</helix-option>\n <helix-option value=\"light\" slot=\"page:theme\">Light</helix-option>\n</helix-command>\n```\n\nChoosing the opener says `helix-select` with its value, and canceling it\nkeeps the page that is shown. The list then shows the page, named by the\nopener's words, and a screen reader hears those words. Backspace in an empty\nfilter goes back, and a screen reader hears the name of the page it goes\nback to. `page` says which page is shown.\n\nThe filter is cleared when the palette closes, so each opening starts from\nthe full list. Combobox and Select do the same. As typing narrows the list, a\nscreen reader hears how many commands are left, such as \"3 commands\".\n\n**Keyboard.** Focus goes to the filter field as the palette opens, with no\ncommand highlighted, as in React Aria's Autocomplete, so Enter runs nothing\nuntil you type or press Down. Typing highlights the first command left, and\nthe highlight moves through the commands while you type.\n\n| Key | What it does |\n|---|---|\n| `hotkey`, Command or Control with K by default | Opens the palette from anywhere on the page, or closes it. With `inline`, puts focus in its filter field. |\n| Down, Up | Moves the highlight to the next or the previous command, round from the last to the first. |\n| Page Down, Page Up | Moves the highlight by as many commands as the list shows at once. |\n| Home, End | Move the caret in the filter field. With `home-end=\"list\"`, move the highlight to the first or the last command. |\n| Left, Right | Move the caret in the filter field. |\n| Enter | Runs the highlighted command, or follows it where it is a link, and closes the palette. On a command with `opens`, shows its page. |\n| Command or Control with Enter | Takes the highlighted command's `alternate` destination, where it has one. |\n| Backspace | In an empty filter on a page, goes back to the page before. |\n| Escape | Clears the filter. With the filter empty, closes the palette and puts focus back where it was. |\n| Tab | Stays in the palette, which is modal. With `inline`, moves on through the page. |\n\n**ARIA.** The palette is a modal `dialog` named by `label`, or with\n`inline` no dialog at all. Inside it the filter field is a text field with\n`aria-autocomplete=\"list\"`, `aria-controls` on the list, and\n`aria-activedescendant` on the highlighted command, as the field of React\nAria's `Autocomplete` is. The commands are a `listbox` of `option`s. How many commands typing left, the empty text and\nthe loading text are said in a polite live region.",
|
|
42957
42957
|
"name": "HelixHeadlessCommand",
|
|
42958
42958
|
"cssParts": [
|
|
42959
42959
|
{
|
|
@@ -55485,7 +55485,7 @@
|
|
|
55485
55485
|
"text": "Date"
|
|
55486
55486
|
},
|
|
55487
55487
|
"privacy": "private",
|
|
55488
|
-
"description": "The date the tab stop sits on, which is where the arrows move from.\n\nIt has to be a date the grid actually renders, so the month is compared\nwith its year. Comparing the month alone puts the stop on the same date a\nyear away, which is rendered nowhere, and the grid is left with no tab stop\nat all and no way into it from the keyboard.\n\nEach candidate is tested in turn rather than the first one winning\noutright. Where the last date focused is in some other month, the selected\ndate still holds the stop, then today, as the APG date picker and React\nAria's calendar put it, and only with none of them in view does it fall\nto the first of the month. Measured before today was a candidate: a\ncalendar with no value opened on October 5 with its stop on \"Thursday,\nOctober 1\".",
|
|
55488
|
+
"description": "The date the tab stop sits on, which is where the arrows move from.\n\nIt has to be a date the grid actually renders, so the month is compared\nwith its year. Comparing the month alone puts the stop on the same date a\nyear away, which is rendered nowhere, and the grid is left with no tab stop\nat all and no way into it from the keyboard.\n\nEach candidate is tested in turn rather than the first one winning\noutright. Where the last date focused is in some other month, the selected\ndate still holds the stop, then today, as the APG date picker and React\nAria's calendar put it, and only with none of them in view does it fall\nto the first of the month. Measured before today was a candidate: a\ncalendar with no value opened on October 5 with its stop on \"Thursday,\nOctober 1\".\n\nToday counts only where it can be chosen, and the fallback is the first\nday of the month that can, so a reader tabbing in lands on a date they can\npick. Measured before: with `min=\"2026-03-03\"`, the stop sat on \"Sunday,\nMarch 1, 2026\", unavailable. A month with nothing to choose keeps its\nfirst day, so the grid still has a way in.",
|
|
55489
55489
|
"readonly": true
|
|
55490
55490
|
},
|
|
55491
55491
|
{
|
|
@@ -58816,6 +58816,46 @@
|
|
|
58816
58816
|
}
|
|
58817
58817
|
]
|
|
58818
58818
|
},
|
|
58819
|
+
{
|
|
58820
|
+
"kind": "javascript-module",
|
|
58821
|
+
"path": "src/dialog/form-method.ts",
|
|
58822
|
+
"declarations": [
|
|
58823
|
+
{
|
|
58824
|
+
"kind": "function",
|
|
58825
|
+
"name": "closeOnDialogSubmit",
|
|
58826
|
+
"return": {
|
|
58827
|
+
"type": {
|
|
58828
|
+
"text": "void"
|
|
58829
|
+
}
|
|
58830
|
+
},
|
|
58831
|
+
"parameters": [
|
|
58832
|
+
{
|
|
58833
|
+
"name": "event",
|
|
58834
|
+
"type": {
|
|
58835
|
+
"text": "SubmitEvent"
|
|
58836
|
+
}
|
|
58837
|
+
},
|
|
58838
|
+
{
|
|
58839
|
+
"name": "close",
|
|
58840
|
+
"type": {
|
|
58841
|
+
"text": "(returnValue?: string) => void"
|
|
58842
|
+
}
|
|
58843
|
+
}
|
|
58844
|
+
],
|
|
58845
|
+
"description": "Closes a shadow `<dialog>` on a `<form method=\"dialog\">` submit slotted into\nit, the way the platform closes its own. `Dialog` and `Drawer` share it.\n\n**The platform cannot find the dialog from the form.** A submit with the\n`dialog` method closes the nearest `<dialog>` ancestor, and a slotted form's\nancestors are the light DOM, where there is none. So the submit is read on\nthe host, and the submitter's `value` is the `returnValue`, as it would be.\nA form inside a `<dialog>` of its own, or with any other method, is left to\nthe platform."
|
|
58846
|
+
}
|
|
58847
|
+
],
|
|
58848
|
+
"exports": [
|
|
58849
|
+
{
|
|
58850
|
+
"kind": "js",
|
|
58851
|
+
"name": "closeOnDialogSubmit",
|
|
58852
|
+
"declaration": {
|
|
58853
|
+
"name": "closeOnDialogSubmit",
|
|
58854
|
+
"module": "src/dialog/form-method.ts"
|
|
58855
|
+
}
|
|
58856
|
+
}
|
|
58857
|
+
]
|
|
58858
|
+
},
|
|
58819
58859
|
{
|
|
58820
58860
|
"kind": "javascript-module",
|
|
58821
58861
|
"path": "src/dialog/index.ts",
|
|
@@ -59079,7 +59119,7 @@
|
|
|
59079
59119
|
"name": "handleSubmit",
|
|
59080
59120
|
"privacy": "private",
|
|
59081
59121
|
"readonly": true,
|
|
59082
|
-
"description": "A `<form method=\"dialog\">` slotted into the dialog
|
|
59122
|
+
"description": "A `<form method=\"dialog\">` slotted into the dialog closes it."
|
|
59083
59123
|
},
|
|
59084
59124
|
{
|
|
59085
59125
|
"kind": "field",
|
|
@@ -62236,6 +62276,13 @@
|
|
|
62236
62276
|
},
|
|
62237
62277
|
"description": "Describes the panel by the words at the start of its body, where nothing\nelse describes it, as `Dialog` does. An `aria-describedby` on the host\ncomes first."
|
|
62238
62278
|
},
|
|
62279
|
+
{
|
|
62280
|
+
"kind": "field",
|
|
62281
|
+
"name": "handleSubmit",
|
|
62282
|
+
"privacy": "private",
|
|
62283
|
+
"readonly": true,
|
|
62284
|
+
"description": "A `<form method=\"dialog\">` slotted into the drawer closes it, as in `Dialog`."
|
|
62285
|
+
},
|
|
62239
62286
|
{
|
|
62240
62287
|
"kind": "method",
|
|
62241
62288
|
"name": "renderDismissIcon",
|
|
@@ -88241,7 +88288,7 @@
|
|
|
88241
88288
|
"text": "string"
|
|
88242
88289
|
},
|
|
88243
88290
|
"default": "''",
|
|
88244
|
-
"description": "The item's identifier. The root compares its `active` value against it.",
|
|
88291
|
+
"description": "The item's identifier. The root compares its `active` value against it.\nWithout one, the item is named by its place in the set, counted from 1.",
|
|
88245
88292
|
"attribute": "value"
|
|
88246
88293
|
},
|
|
88247
88294
|
{
|
|
@@ -88626,7 +88673,7 @@
|
|
|
88626
88673
|
"text": "string"
|
|
88627
88674
|
},
|
|
88628
88675
|
"default": "''",
|
|
88629
|
-
"description": "The item's identifier. The root compares its `active` value against it.",
|
|
88676
|
+
"description": "The item's identifier. The root compares its `active` value against it.\nWithout one, the item is named by its place in the set, counted from 1.",
|
|
88630
88677
|
"fieldName": "value"
|
|
88631
88678
|
}
|
|
88632
88679
|
],
|
|
@@ -88693,7 +88740,7 @@
|
|
|
88693
88740
|
"declarations": [
|
|
88694
88741
|
{
|
|
88695
88742
|
"kind": "class",
|
|
88696
|
-
"description": "The frame around content you open, such as a picture, a video frame, or a\nchart. The lightbox draws no content of its own. It provides the frame, the\nkeyboard behavior, and text that states the current position in the set.\n\nThe modal behavior comes from a native `<dialog>` opened with `showModal()`,\nwhich provides the top layer, a backdrop, Escape to close, and `inert` on the\nrest of the document. Every way of closing goes through `requestOpen`, as in\n`Dialog` and `Drawer`.\n\nA lightbox shows one item at a time and has no scrolling track, so `active`\nholds the current item, as in `Tabs`. The arrow keys change the item while\nfocus stays in the dialog.\n\nSet `controls` for the viewer's own previous, next and close controls, named\nby `previous-label`, `next-label` and `dismiss-label`, whose glyphs you can\nreplace in the `previous-icon`, `next-icon` and `dismiss-icon` slots. Without\nit, compose the chrome yourself in the `header` and `footer` slots, with\nbuttons that send `--previous`, `--next` and `--close`.\n\n**Set `max-zoom` to let a reader zoom into the shown item**, such as `3`.\nTwo fingers pinch it, and so does a trackpad pinch or the wheel with Ctrl\nheld, about the point under the pointer. A double click or a double tap\nzooms all the way in about the point pressed and back out, and once zoomed\none pointer drags it about and the wheel moves it. `+` and `-` zoom in and out from the keyboard, and `0` puts it back.\nThe scale and the offset are on the `viewport` part as `--lightbox-zoom`,\n`--lightbox-pan-x` and `--lightbox-pan-y`, written only while zoomed, and a\nswipe moves to the next item only while the item is at its own size. With\n`controls`, the viewer also draws zoom-out and zoom-in controls, for a\npointer with no wheel and no second finger. Once a reader stops zooming,
|
|
88743
|
+
"description": "The frame around content you open, such as a picture, a video frame, or a\nchart. The lightbox draws no content of its own. It provides the frame, the\nkeyboard behavior, and text that states the current position in the set.\n\nThe modal behavior comes from a native `<dialog>` opened with `showModal()`,\nwhich provides the top layer, a backdrop, Escape to close, and `inert` on the\nrest of the document. Every way of closing goes through `requestOpen`, as in\n`Dialog` and `Drawer`.\n\nA lightbox shows one item at a time and has no scrolling track, so `active`\nholds the current item, as in `Tabs`. The arrow keys change the item while\nfocus stays in the dialog. `active` names an item by its `value`, and an\nitem with no `value` by its place, counted from 1, as in `Steps`, so a set\nwritten without values moves and `helix-activate` says `1`, `2` and so on.\n\nSet `controls` for the viewer's own previous, next and close controls, named\nby `previous-label`, `next-label` and `dismiss-label`, whose glyphs you can\nreplace in the `previous-icon`, `next-icon` and `dismiss-icon` slots. Without\nit, compose the chrome yourself in the `header` and `footer` slots, with\nbuttons that send `--previous`, `--next` and `--close`.\n\n**Set `max-zoom` to let a reader zoom into the shown item**, such as `3`.\nTwo fingers pinch it, and so does a trackpad pinch or the wheel with Ctrl\nheld, about the point under the pointer. A double click or a double tap\nzooms all the way in about the point pressed and back out, and once zoomed\none pointer drags it about and the wheel moves it. `+` and `-` zoom in and out from the keyboard, and `0` puts it back.\nThe scale and the offset are on the `viewport` part as `--lightbox-zoom`,\n`--lightbox-pan-x` and `--lightbox-pan-y`, written only while zoomed, and a\nswipe moves to the next item only while the item is at its own size. With\n`controls`, the viewer also draws zoom-out and zoom-in controls, for a\npointer with no wheel and no second finger. Once a reader stops zooming, and\nat once for a key or a zoom control, the live region says the new scale in\nthe words of `zoom-status-label`, such as \"Zoomed to 150%\".\n\nEach item is a slide: a `group` with the role description in\n`slide-role-label`, named by its `label` or by `slide-label`. A touch or a pen\nswiped across the picture shows the next or the previous item, the way the\nline of text runs.\n\nA press on the empty area around the item closes the viewer, as a press on\nthe backdrop does. Under `max-zoom`, a press beside the item zooms on a\ndouble press and closes nothing, and only the space outside the viewport\ncloses the viewer. A press that dragged closes nothing.\n\n**Keyboard.** Opening moves focus to the viewer itself, which a screen\nreader names.\n\n| Key | What it does |\n|---|---|\n| Right, Down | Shows the next item. On a right-to-left page, Left does. While the item is zoomed, the arrows move about it instead. |\n| Left, Up | Shows the previous item. |\n| Home, End | Shows the first or the last item. |\n| `+`, `-`, `0` | Zooms in, zooms out, and puts the item back at its own size, where `max-zoom` allows zooming. |\n| Tab, Shift+Tab | Moves through the controls in the viewer, from the last round to the first and from the first round to the last. |\n| Escape | Closes the viewer. A `helix-before-close` listener can refuse. |\n\nA development build warns when a viewer opens with no `label`.\n\nThe chrome hides when there is no input, through `IdleController`, and comes\nback on a pointer move, a key press, or a focus. It stays while focus is on a\ncontrol in the header or the footer, so a keyboard reader is never left on\na control that has gone. `fullscreen` uses `FullscreenController`, as `Video`\ndoes. While the viewer is open, the page behind it does not scroll.",
|
|
88697
88744
|
"name": "HelixHeadlessLightbox",
|
|
88698
88745
|
"cssProperties": [
|
|
88699
88746
|
{
|
|
@@ -89123,6 +89170,16 @@
|
|
|
89123
89170
|
],
|
|
89124
89171
|
"description": "Writes the zoom on the viewport, and nothing at the item's own size."
|
|
89125
89172
|
},
|
|
89173
|
+
{
|
|
89174
|
+
"kind": "field",
|
|
89175
|
+
"name": "zoomStep",
|
|
89176
|
+
"type": {
|
|
89177
|
+
"text": "boolean"
|
|
89178
|
+
},
|
|
89179
|
+
"privacy": "private",
|
|
89180
|
+
"default": "false",
|
|
89181
|
+
"description": "Whether the zoom is changing by one discrete step, a key or a control, which is said at once."
|
|
89182
|
+
},
|
|
89126
89183
|
{
|
|
89127
89184
|
"kind": "method",
|
|
89128
89185
|
"name": "sayZoom",
|
|
@@ -89132,7 +89189,7 @@
|
|
|
89132
89189
|
"text": "void"
|
|
89133
89190
|
}
|
|
89134
89191
|
},
|
|
89135
|
-
"description": "Says the new scale in the live region
|
|
89192
|
+
"description": "Says the new scale in the live region: a moment after the last change of\na pinch, a drag or the wheel, and at once for a key or a zoom control,\nwhich is one change a reader is waiting to hear. Said only after the\npause, a reader pressing `+` heard nothing until it ended."
|
|
89136
89193
|
},
|
|
89137
89194
|
{
|
|
89138
89195
|
"kind": "method",
|
|
@@ -89389,6 +89446,25 @@
|
|
|
89389
89446
|
},
|
|
89390
89447
|
"description": "Zooms out by as much, as `-` and the zoom-out control do."
|
|
89391
89448
|
},
|
|
89449
|
+
{
|
|
89450
|
+
"kind": "method",
|
|
89451
|
+
"name": "stepZoom",
|
|
89452
|
+
"privacy": "private",
|
|
89453
|
+
"return": {
|
|
89454
|
+
"type": {
|
|
89455
|
+
"text": "void"
|
|
89456
|
+
}
|
|
89457
|
+
},
|
|
89458
|
+
"parameters": [
|
|
89459
|
+
{
|
|
89460
|
+
"name": "change",
|
|
89461
|
+
"type": {
|
|
89462
|
+
"text": "() => void"
|
|
89463
|
+
}
|
|
89464
|
+
}
|
|
89465
|
+
],
|
|
89466
|
+
"description": "Changes the zoom by one discrete step, which `sayZoom` says at once."
|
|
89467
|
+
},
|
|
89392
89468
|
{
|
|
89393
89469
|
"kind": "method",
|
|
89394
89470
|
"name": "toEnd",
|
|
@@ -89421,10 +89497,64 @@
|
|
|
89421
89497
|
{
|
|
89422
89498
|
"kind": "field",
|
|
89423
89499
|
"name": "shown",
|
|
89500
|
+
"type": {
|
|
89501
|
+
"text": "HelixHeadlessLightboxItem | undefined"
|
|
89502
|
+
},
|
|
89424
89503
|
"privacy": "private",
|
|
89425
89504
|
"description": "The item on screen: the one `active` names, or the first where it names none.",
|
|
89426
89505
|
"readonly": true
|
|
89427
89506
|
},
|
|
89507
|
+
{
|
|
89508
|
+
"kind": "method",
|
|
89509
|
+
"name": "named",
|
|
89510
|
+
"privacy": "private",
|
|
89511
|
+
"return": {
|
|
89512
|
+
"type": {
|
|
89513
|
+
"text": "HelixHeadlessLightboxItem | undefined"
|
|
89514
|
+
}
|
|
89515
|
+
},
|
|
89516
|
+
"parameters": [
|
|
89517
|
+
{
|
|
89518
|
+
"name": "items",
|
|
89519
|
+
"type": {
|
|
89520
|
+
"text": "HelixHeadlessLightboxItem[]"
|
|
89521
|
+
}
|
|
89522
|
+
}
|
|
89523
|
+
],
|
|
89524
|
+
"description": "The item `active` names, by `value` or by place, or the first where it names none."
|
|
89525
|
+
},
|
|
89526
|
+
{
|
|
89527
|
+
"kind": "method",
|
|
89528
|
+
"name": "requestActive",
|
|
89529
|
+
"return": {
|
|
89530
|
+
"type": {
|
|
89531
|
+
"text": "boolean"
|
|
89532
|
+
}
|
|
89533
|
+
},
|
|
89534
|
+
"parameters": [
|
|
89535
|
+
{
|
|
89536
|
+
"name": "next",
|
|
89537
|
+
"type": {
|
|
89538
|
+
"text": "string"
|
|
89539
|
+
}
|
|
89540
|
+
},
|
|
89541
|
+
{
|
|
89542
|
+
"name": "cause",
|
|
89543
|
+
"optional": true,
|
|
89544
|
+
"type": {
|
|
89545
|
+
"text": "string"
|
|
89546
|
+
}
|
|
89547
|
+
}
|
|
89548
|
+
],
|
|
89549
|
+
"description": "Requests a new shown item, and returns whether it moved.\n\nWhere `active` names nothing, it is first written with the item on\nscreen, so `helix-activate` names the item you saw as `previous`.",
|
|
89550
|
+
"inheritedFrom": {
|
|
89551
|
+
"name": "MixinControllerActive",
|
|
89552
|
+
"module": "src/mixins/mixin-controller-active/mixin-controller-active.ts"
|
|
89553
|
+
},
|
|
89554
|
+
"type": {
|
|
89555
|
+
"text": "requestActive(next: string, cause?: string) => boolean"
|
|
89556
|
+
}
|
|
89557
|
+
},
|
|
89428
89558
|
{
|
|
89429
89559
|
"kind": "field",
|
|
89430
89560
|
"name": "handleBackdrop",
|
|
@@ -89608,38 +89738,6 @@
|
|
|
89608
89738
|
"module": "src/mixins/mixin-controller-active/mixin-controller-active.ts"
|
|
89609
89739
|
}
|
|
89610
89740
|
},
|
|
89611
|
-
{
|
|
89612
|
-
"kind": "method",
|
|
89613
|
-
"name": "requestActive",
|
|
89614
|
-
"return": {
|
|
89615
|
-
"type": {
|
|
89616
|
-
"text": "boolean"
|
|
89617
|
-
}
|
|
89618
|
-
},
|
|
89619
|
-
"parameters": [
|
|
89620
|
-
{
|
|
89621
|
-
"name": "next",
|
|
89622
|
-
"type": {
|
|
89623
|
-
"text": "string"
|
|
89624
|
-
}
|
|
89625
|
-
},
|
|
89626
|
-
{
|
|
89627
|
-
"name": "cause",
|
|
89628
|
-
"optional": true,
|
|
89629
|
-
"type": {
|
|
89630
|
-
"text": "string"
|
|
89631
|
-
}
|
|
89632
|
-
}
|
|
89633
|
-
],
|
|
89634
|
-
"description": "Requests a new current item, and returns whether the change was applied.\n\nAnnounces before it acts, so `preventDefault()` on the `helix-before-activate` is\na refusal and nothing moves. Unlike a native control, nothing has moved\nby the time this runs, so refusing is simply not writing: there is\nnothing to put back. Nobody refusing means the set updates itself,\nwhether or not a consumer declared `active`, a declared property being a\nseed and a correction. `cause` says why, where the family names its\ncauses, and reaches the event as `detail.cause`.",
|
|
89635
|
-
"inheritedFrom": {
|
|
89636
|
-
"name": "MixinControllerActive",
|
|
89637
|
-
"module": "src/mixins/mixin-controller-active/mixin-controller-active.ts"
|
|
89638
|
-
},
|
|
89639
|
-
"type": {
|
|
89640
|
-
"text": "requestActive(next: string, cause?: string) => boolean"
|
|
89641
|
-
}
|
|
89642
|
-
},
|
|
89643
89741
|
{
|
|
89644
89742
|
"kind": "method",
|
|
89645
89743
|
"name": "announceActivated",
|
|
@@ -116316,7 +116414,7 @@
|
|
|
116316
116414
|
"declarations": [
|
|
116317
116415
|
{
|
|
116318
116416
|
"kind": "class",
|
|
116319
|
-
"description": "Notifications are slotted children. Each one is your own markup, with an\navatar, a link, or a button in it. Feeds usually hold tens of items, so\nwriting them out lets an item hold anything.\n\nThe list does not virtualize. Windowing needs the list to own the data, and\nhere you own it, so N notifications are N elements. For a feed of thousands,\nuse a data table with a custom cell.\n\nRead state is reported to you. Marking read goes from the root to the item\nand from the item to you, so a canceled `helix-read` changes nothing, and if\nyou own `read`, nothing changes until you set it. `unread` is derived from\nthe items and written to an attribute, so a stylesheet and a badge can both\nuse it without counting.\n\n**The feed is one `Tab` stop for its rows.**
|
|
116417
|
+
"description": "Notifications are slotted children. Each one is your own markup, with an\navatar, a link, or a button in it. Feeds usually hold tens of items, so\nwriting them out lets an item hold anything.\n\nThe list does not virtualize. Windowing needs the list to own the data, and\nhere you own it, so N notifications are N elements. For a feed of thousands,\nuse a data table with a custom cell.\n\nRead state is reported to you. Marking read goes from the root to the item\nand from the item to you, so a canceled `helix-read` changes nothing, and if\nyou own `read`, nothing changes until you set it. `unread` is derived from\nthe items and written to an attribute, so a stylesheet and a badge can both\nuse it without counting.\n\n**The feed is one `Tab` stop for its rows.** It is an APG feed: the list is\na `feed`, busy while `loading` is set, and each row is an `article` that\ntakes focus itself and is read by its label. `ArrowDown` and `ArrowUp` move to the next and the\nprevious row, `Home` and `End` to the first and the last, and `PageDown` and\n`PageUp` move a row on or back from anywhere inside one, as in the APG feed\npattern. The controls inside a row stay in the `Tab` order. Set `total` when\nthe feed holds one page of a longer list, and each row says its place in the\nwhole of it.\n\n**Keyboard.**\n\n| Key | What it does |\n|---|---|\n| Down, Up | On a row, moves to the next or the previous row. |\n| Home, End | On a row, moves to the first or the last row. |\n| Page Down, Page Up | From anywhere in a row, moves to the next or the previous row. |\n| Control+End | From anywhere in the feed, moves to the first control after it on the page. |\n| Control+Home | From anywhere in the feed, moves to the nearest control before it on the page. |\n| Tab | Moves through the controls in a row, and on out of the feed. |\n\n**A notification that arrives says so.** Unread rows added above the rows\nthere were are counted in the live region,\n\"1 new notification\", in `arrived-label`. Rows that arrive while `loading`\nis set say nothing, so set it while a page is on its way.\n\n**`load-more` adds a button after the list** that sends `helix-load-more`,\nfor a feed that holds one page of a longer list. Append the next page, set\n`loading` while it is on its way, and take `load-more` off once there is\nnothing more. While the feed is loading the button stays, so focus stays on\nit, and it is `aria-disabled` and sends nothing.\n\n**`load-error` says a page could not be fetched**, such as \"Could not load\nnotifications\": it shows under the rows there are, in the `error` part, in\nplace of the empty and loading lines, and a screen reader hears it. Clear it\nwhen you ask again.",
|
|
116320
116418
|
"name": "HelixHeadlessNotifications",
|
|
116321
116419
|
"cssParts": [
|
|
116322
116420
|
{
|
|
@@ -116336,7 +116434,7 @@
|
|
|
116336
116434
|
"name": "header"
|
|
116337
116435
|
},
|
|
116338
116436
|
{
|
|
116339
|
-
"description": "The list itself.",
|
|
116437
|
+
"description": "The list itself, a `feed` whose rows are its articles.",
|
|
116340
116438
|
"name": "list"
|
|
116341
116439
|
},
|
|
116342
116440
|
{
|
|
@@ -182544,7 +182642,7 @@
|
|
|
182544
182642
|
"declarations": [
|
|
182545
182643
|
{
|
|
182546
182644
|
"kind": "class",
|
|
182547
|
-
"description": "The trigger stays your own element. The bubble renders in the\ntop layer through the popover API, so an ancestor with `overflow: hidden`\ndoes not clip it and no `z-index` is needed. `FloatingController` positions\nit and flips it to another side when the preferred side does not fit.\n\n**Place the tooltip beside its trigger, name the trigger with `for`, and\nname the tooltip in the trigger's `aria-describedby`.** The description is\nthen in your own markup, so it is in the server's HTML and in the\naccessibility tree at rest, in every browser, before anyone points at the\ntrigger or focuses it:\n\n```html\n<helix-headless-button aria-describedby=\"save-tip\" id=\"save\">Save</helix-headless-button>\n<helix-headless-tooltip content=\"Save your work\" for=\"save\" id=\"save-tip\"></helix-headless-tooltip>\n```\n\nWithout the attribute, the tooltip links itself through an element reference\non the control that takes focus, and it never writes into your markup before\nyou act, so hydration stays intact. A trigger that is a Helix component is\ndescribed at once, inside its own shadow root. A plain element in your\nmarkup is described when you first point at it or focus it, so a screen\nreader in reading mode meets it with no description until then. Where the\nbrowser has no element references, nothing links the two, and the tooltip\nwarns once on first open. The tooltip can also wrap its trigger
|
|
182645
|
+
"description": "The trigger stays your own element. The bubble renders in the\ntop layer through the popover API, so an ancestor with `overflow: hidden`\ndoes not clip it and no `z-index` is needed. `FloatingController` positions\nit and flips it to another side when the preferred side does not fit.\n\n**Place the tooltip beside its trigger, name the trigger with `for`, and\nname the tooltip in the trigger's `aria-describedby`.** The description is\nthen in your own markup, so it is in the server's HTML and in the\naccessibility tree at rest, in every browser, before anyone points at the\ntrigger or focuses it:\n\n```html\n<helix-headless-button aria-describedby=\"save-tip\" id=\"save\">Save</helix-headless-button>\n<helix-headless-tooltip content=\"Save your work\" for=\"save\" id=\"save-tip\"></helix-headless-tooltip>\n```\n\nWithout the attribute, the tooltip links itself through an element reference\non the control that takes focus, and it never writes into your markup before\nyou act, so hydration stays intact. A trigger that is a Helix component is\ndescribed at once, inside its own shadow root. A plain element in your\nmarkup is described when you first point at it or focus it, so a screen\nreader in reading mode meets it with no description until then. Where the\nbrowser has no element references, nothing links the two, and the tooltip\nwarns once on first open. The tooltip can also wrap its trigger. A Helix\ncomponent inside is described at once, and a plain element as in the `for`\nform: when you first point at it or focus it, or at rest where it names the\ntooltip's `id` in its own `aria-describedby`, which a reference to the\nelement around it allows. In the\n`for` form the tooltip itself is out of the accessibility tree while its\nbubble is down, so you meet its words once, as the trigger's description.\nA trigger whose name is already the tooltip's words, such as an icon button\nnamed Settings under a tooltip reading Settings, is not described by them\nagain.\n\nThe tooltip shows on hover and on focus. It hides on pointer leave, on blur,\non Escape, and when the trigger is activated. The pointer can move from the\ntrigger onto the bubble and the bubble stays, unless you set\n`hoverable=\"false\"`. `delay` is how long the pointer rests before it shows,\nand `delay-out` how long it stays once the pointer leaves.\n\nOnce one tooltip is showing, moving to another trigger shows its tooltip\nwith no `delay`, and the first one hides. The same holds for `skip-delay`\nmilliseconds after a tooltip hides, 300 unless you set it. `show-on=\"focus\"`\nshows the tooltip on keyboard focus only, for a hint a pointer does not need.",
|
|
182548
182646
|
"name": "HelixHeadlessTooltip",
|
|
182549
182647
|
"cssParts": [
|
|
182550
182648
|
{
|
|
@@ -198176,6 +198274,6 @@
|
|
|
198176
198274
|
],
|
|
198177
198275
|
"helix": {
|
|
198178
198276
|
"package": "@fusion.dev/helix-headless",
|
|
198179
|
-
"version": "0.
|
|
198277
|
+
"version": "0.175.0"
|
|
198180
198278
|
}
|
|
198181
198279
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { HelixElement } from '@fusion.dev/helix-core';
|
|
2
|
-
import { type PropertyValues, type TemplateResult } from 'lit';
|
|
2
|
+
import { type CSSResultGroup, type PropertyValues, type TemplateResult } from 'lit';
|
|
3
3
|
declare const HelixHeadlessAppHeader_base: (new (...args: any[]) => import("@fusion.dev/helix-core").MixinControllerOpenInterface) & typeof HelixElement;
|
|
4
4
|
/**
|
|
5
5
|
* @summary Page-level banner holding brand, navigation, and actions.
|
|
@@ -90,6 +90,7 @@ export declare class HelixHeadlessAppHeader extends HelixHeadlessAppHeader_base
|
|
|
90
90
|
* `registerWords('de', { 'helix-app-header': { menuLabel: 'Menü' } })`.
|
|
91
91
|
*/
|
|
92
92
|
static words: string;
|
|
93
|
+
static styles: CSSResultGroup;
|
|
93
94
|
/**
|
|
94
95
|
* Where the middle region sits in the bar.
|
|
95
96
|
*
|
|
@@ -6,7 +6,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
6
6
|
};
|
|
7
7
|
import { customElement, deepActiveElement, deepContains, elementById, HelixElement, HelixScrolledEvent, hostAria, MixinControllerOpen, words, } from '@fusion.dev/helix-core';
|
|
8
8
|
import { list } from '@fusion.dev/helix-icons';
|
|
9
|
-
import { html, nothing } from 'lit';
|
|
9
|
+
import { css, html, nothing, } from 'lit';
|
|
10
10
|
import { property, state } from 'lit/decorators.js';
|
|
11
11
|
import { unsafeSVG } from 'lit/directives/unsafe-svg.js';
|
|
12
12
|
import { inSectioningContent } from '../sectioning.js';
|
|
@@ -61,6 +61,11 @@ let HelixHeadlessAppHeader = class HelixHeadlessAppHeader extends MixinControlle
|
|
|
61
61
|
};
|
|
62
62
|
}
|
|
63
63
|
static { this.words = 'helix-app-header'; }
|
|
64
|
+
static { this.styles = css `
|
|
65
|
+
:host {
|
|
66
|
+
display: block;
|
|
67
|
+
}
|
|
68
|
+
`; }
|
|
64
69
|
get unfolded() {
|
|
65
70
|
return this.folded && this.open;
|
|
66
71
|
}
|
|
@@ -327,7 +327,12 @@ export declare class HelixHeadlessButton extends HelixFormElement {
|
|
|
327
327
|
protected updated(changed: PropertyValues): void;
|
|
328
328
|
/** @internal A submit button is what its form's implicit submission presses. */
|
|
329
329
|
protected get submitsForm(): boolean;
|
|
330
|
-
/**
|
|
330
|
+
/**
|
|
331
|
+
* @internal Pressed as the form's default button, through the inner control.
|
|
332
|
+
*
|
|
333
|
+
* Only Enter in a field of the form presses it this way, so `helix-press`
|
|
334
|
+
* says `keyboard`, where the script click it makes read as `virtual`.
|
|
335
|
+
*/
|
|
331
336
|
protected activate(): void;
|
|
332
337
|
/** The form whose Enter key this button listens to, as its default button. */
|
|
333
338
|
private watched;
|
|
@@ -47,8 +47,10 @@ declare const HelixHeadlessCommand_base: (new (...args: any[]) => import("@fusio
|
|
|
47
47
|
* the full list. Combobox and Select do the same. As typing narrows the list, a
|
|
48
48
|
* screen reader hears how many commands are left, such as "3 commands".
|
|
49
49
|
*
|
|
50
|
-
* **Keyboard.** Focus goes to the filter field as the palette opens,
|
|
51
|
-
*
|
|
50
|
+
* **Keyboard.** Focus goes to the filter field as the palette opens, with no
|
|
51
|
+
* command highlighted, as in React Aria's Autocomplete, so Enter runs nothing
|
|
52
|
+
* until you type or press Down. Typing highlights the first command left, and
|
|
53
|
+
* the highlight moves through the commands while you type.
|
|
52
54
|
*
|
|
53
55
|
* | Key | What it does |
|
|
54
56
|
* |---|---|
|
|
@@ -348,6 +348,12 @@ export declare class HelixHeadlessDatePicker extends HelixHeadlessDatePicker_bas
|
|
|
348
348
|
* to the first of the month. Measured before today was a candidate: a
|
|
349
349
|
* calendar with no value opened on October 5 with its stop on "Thursday,
|
|
350
350
|
* October 1".
|
|
351
|
+
*
|
|
352
|
+
* Today counts only where it can be chosen, and the fallback is the first
|
|
353
|
+
* day of the month that can, so a reader tabbing in lands on a date they can
|
|
354
|
+
* pick. Measured before: with `min="2026-03-03"`, the stop sat on "Sunday,
|
|
355
|
+
* March 1, 2026", unavailable. A month with nothing to choose keeps its
|
|
356
|
+
* first day, so the grid still has a way in.
|
|
351
357
|
*/
|
|
352
358
|
private get anchor();
|
|
353
359
|
/** Six weeks of dates, so a grid does not change height between months. */
|
|
@@ -199,15 +199,21 @@ let HelixHeadlessDatePicker = class HelixHeadlessDatePicker extends MixinPickerF
|
|
|
199
199
|
}
|
|
200
200
|
get anchor() {
|
|
201
201
|
const shown = this.shown;
|
|
202
|
+
const today = asDate(todayIn(this.timeZone));
|
|
202
203
|
for (const candidate of [
|
|
203
204
|
asDate(this.focused),
|
|
204
205
|
asDate(this.selected[0] ?? ''),
|
|
205
|
-
|
|
206
|
+
today && !this.barred(today) ? today : null,
|
|
206
207
|
]) {
|
|
207
208
|
if (candidate && this.system.same(candidate, shown)) {
|
|
208
209
|
return candidate;
|
|
209
210
|
}
|
|
210
211
|
}
|
|
212
|
+
for (let day = shown; this.system.same(day, shown); day = addDays(day, 1)) {
|
|
213
|
+
if (!this.barred(day)) {
|
|
214
|
+
return day;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
211
217
|
return shown;
|
|
212
218
|
}
|
|
213
219
|
weeksOf(month) {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Closes a shadow `<dialog>` on a `<form method="dialog">` submit slotted into
|
|
3
|
+
* it, the way the platform closes its own. `Dialog` and `Drawer` share it.
|
|
4
|
+
*
|
|
5
|
+
* **The platform cannot find the dialog from the form.** A submit with the
|
|
6
|
+
* `dialog` method closes the nearest `<dialog>` ancestor, and a slotted form's
|
|
7
|
+
* ancestors are the light DOM, where there is none. So the submit is read on
|
|
8
|
+
* the host, and the submitter's `value` is the `returnValue`, as it would be.
|
|
9
|
+
* A form inside a `<dialog>` of its own, or with any other method, is left to
|
|
10
|
+
* the platform.
|
|
11
|
+
*/
|
|
12
|
+
export declare const closeOnDialogSubmit: (event: SubmitEvent, close: (returnValue?: string) => void) => void;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export const closeOnDialogSubmit = (event, close) => {
|
|
2
|
+
const form = event.target;
|
|
3
|
+
if (!(form instanceof HTMLFormElement) || form.closest('dialog')) {
|
|
4
|
+
return;
|
|
5
|
+
}
|
|
6
|
+
const submitter = event.submitter;
|
|
7
|
+
const method = submitter?.hasAttribute('formmethod') ? submitter.formMethod : form.method;
|
|
8
|
+
if (method !== 'dialog') {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
event.preventDefault();
|
|
12
|
+
close(submitter?.hasAttribute('value') ? submitter.value : undefined);
|
|
13
|
+
};
|
|
@@ -201,15 +201,7 @@ export declare class HelixHeadlessDialog extends HelixHeadlessDialog_base {
|
|
|
201
201
|
* saying otherwise would be a lie the next `showModal()` would trip over.
|
|
202
202
|
*/
|
|
203
203
|
private readonly handleClose;
|
|
204
|
-
/**
|
|
205
|
-
* A `<form method="dialog">` slotted into the dialog, closed the way the
|
|
206
|
-
* platform closes its own.
|
|
207
|
-
*
|
|
208
|
-
* **The platform cannot find this dialog from the form.** A submit with the
|
|
209
|
-
* `dialog` method closes the nearest `<dialog>` ancestor, and a slotted form's
|
|
210
|
-
* ancestors are the light DOM, where there is none. So the submit is read
|
|
211
|
-
* here, and the submitter's `value` is the `returnValue`, as it would be.
|
|
212
|
-
*/
|
|
204
|
+
/** A `<form method="dialog">` slotted into the dialog closes it. */
|
|
213
205
|
private readonly handleSubmit;
|
|
214
206
|
/** Whether the `header` slot's heading is what currently names the dialog. */
|
|
215
207
|
private namedByHeader;
|
|
@@ -8,6 +8,7 @@ import { AriaForwardController, auditName, CommandController, customElement, dra
|
|
|
8
8
|
import { html, nothing } from 'lit';
|
|
9
9
|
import { property } from 'lit/decorators.js';
|
|
10
10
|
import { wordsIn } from '../description.js';
|
|
11
|
+
import { closeOnDialogSubmit } from '../form-method.js';
|
|
11
12
|
let HelixHeadlessDialog = class HelixHeadlessDialog extends MixinControllerOpen(HelixElement) {
|
|
12
13
|
constructor() {
|
|
13
14
|
super(...arguments);
|
|
@@ -49,17 +50,7 @@ let HelixHeadlessDialog = class HelixHeadlessDialog extends MixinControllerOpen(
|
|
|
49
50
|
this.relayNativeEvent(event);
|
|
50
51
|
};
|
|
51
52
|
this.handleSubmit = (event) => {
|
|
52
|
-
|
|
53
|
-
if (!(form instanceof HTMLFormElement) || form.closest('dialog')) {
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
const submitter = event.submitter;
|
|
57
|
-
const method = submitter?.hasAttribute('formmethod') ? submitter.formMethod : form.method;
|
|
58
|
-
if (method !== 'dialog') {
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
event.preventDefault();
|
|
62
|
-
this.close(submitter?.hasAttribute('value') ? submitter.value : undefined);
|
|
53
|
+
closeOnDialogSubmit(event, (value) => this.close(value));
|
|
63
54
|
};
|
|
64
55
|
this.namedByHeader = false;
|
|
65
56
|
this.scope = new FocusScopeController(this, {
|
|
@@ -321,6 +321,8 @@ export declare class HelixHeadlessDrawer extends HelixHeadlessDrawer_base {
|
|
|
321
321
|
* comes first.
|
|
322
322
|
*/
|
|
323
323
|
private describeByBody;
|
|
324
|
+
/** A `<form method="dialog">` slotted into the drawer closes it, as in `Dialog`. */
|
|
325
|
+
private readonly handleSubmit;
|
|
324
326
|
connectedCallback(): void;
|
|
325
327
|
disconnectedCallback(): void;
|
|
326
328
|
protected updated(changed: PropertyValues): void;
|
|
@@ -8,6 +8,7 @@ import { AriaForwardController, auditName, CommandController, customElement, dra
|
|
|
8
8
|
import { html, nothing } from 'lit';
|
|
9
9
|
import { property } from 'lit/decorators.js';
|
|
10
10
|
import { wordsIn } from '../../dialog/description.js';
|
|
11
|
+
import { closeOnDialogSubmit } from '../../dialog/form-method.js';
|
|
11
12
|
import { beyondWindow } from '../reveal.js';
|
|
12
13
|
import { startsSwipe } from '../swipe-start.js';
|
|
13
14
|
let HelixHeadlessDrawer = class HelixHeadlessDrawer extends MixinControllerOpen(HelixElement) {
|
|
@@ -111,6 +112,9 @@ let HelixHeadlessDrawer = class HelixHeadlessDrawer extends MixinControllerOpen(
|
|
|
111
112
|
};
|
|
112
113
|
this.namedByHeader = false;
|
|
113
114
|
this.describedByBody = false;
|
|
115
|
+
this.handleSubmit = (event) => {
|
|
116
|
+
closeOnDialogSubmit(event, (value) => this.close(value));
|
|
117
|
+
};
|
|
114
118
|
}
|
|
115
119
|
static { this.words = 'helix-drawer'; }
|
|
116
120
|
get refusesDismissal() {
|
|
@@ -214,10 +218,12 @@ let HelixHeadlessDrawer = class HelixHeadlessDrawer extends MixinControllerOpen(
|
|
|
214
218
|
connectedCallback() {
|
|
215
219
|
super.connectedCallback();
|
|
216
220
|
this.addEventListener('focusin', this.handleFocusIn);
|
|
221
|
+
this.addEventListener('submit', this.handleSubmit);
|
|
217
222
|
}
|
|
218
223
|
disconnectedCallback() {
|
|
219
224
|
super.disconnectedCallback();
|
|
220
225
|
this.removeEventListener('focusin', this.handleFocusIn);
|
|
226
|
+
this.removeEventListener('submit', this.handleSubmit);
|
|
221
227
|
unlockScroll(this);
|
|
222
228
|
}
|
|
223
229
|
updated(changed) {
|
|
@@ -55,6 +55,7 @@ export declare class HelixHeadlessLightboxItem extends HelixElement {
|
|
|
55
55
|
roleLabel: string;
|
|
56
56
|
/**
|
|
57
57
|
* The item's identifier. The root compares its `active` value against it.
|
|
58
|
+
* Without one, the item is named by its place in the set, counted from 1.
|
|
58
59
|
*/
|
|
59
60
|
value: string;
|
|
60
61
|
/** Whether anything is slotted into `description`, which then describes the group. */
|