@fusion.dev/helix-headless 0.208.0 → 0.209.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/types/svelte.d.ts CHANGED
@@ -167,6 +167,7 @@ declare module 'svelte/elements' {
167
167
  'helix-headless-tab': Helix<'helix-headless-tab'>
168
168
  'helix-headless-tag-group': Helix<'helix-headless-tag-group'>
169
169
  'helix-headless-tag': Helix<'helix-headless-tag'>
170
+ 'helix-headless-terminal': Helix<'helix-headless-terminal'>
170
171
  'helix-headless-textarea': Helix<'helix-headless-textarea'>
171
172
  'helix-headless-time-input': Helix<'helix-headless-time-input'>
172
173
  'helix-headless-time-picker': Helix<'helix-headless-time-picker'>
package/types/vue.d.ts CHANGED
@@ -177,6 +177,7 @@ import type {
177
177
  HelixHeadlessTabs,
178
178
  HelixHeadlessTag,
179
179
  HelixHeadlessTagGroup,
180
+ HelixHeadlessTerminal,
180
181
  HelixHeadlessTextarea,
181
182
  HelixHeadlessTimeInput,
182
183
  HelixHeadlessTimePicker,
@@ -240,6 +241,12 @@ import type {
240
241
  HelixShortcutEvent,
241
242
  HelixSortEvent,
242
243
  HelixSortedEvent,
244
+ HelixTerminalBellEvent,
245
+ HelixTerminalInputEvent,
246
+ HelixTerminalLinkEvent,
247
+ HelixTerminalResizeEvent,
248
+ HelixTerminalRestartEvent,
249
+ HelixTerminalTitleEvent,
243
250
  HelixToggleEvent,
244
251
  HelixTourAskEvent,
245
252
  HelixTourStatusEvent,
@@ -17293,6 +17300,164 @@ export type HelixHeadlessTagVueEvents = {
17293
17300
  "helix-dismiss": HelixHeadlessTagHelixDismissElementEvent;
17294
17301
  };
17295
17302
 
17303
+ /** `HelixHeadlessTerminal` component event */
17304
+ export type HelixHeadlessTerminalElementEvent<E = Event> = TypedEvent<
17305
+ HelixHeadlessTerminal,
17306
+ E
17307
+ >;
17308
+ /** `helix-copy` event type */
17309
+ export type HelixHeadlessTerminalHelixCopyElementEvent =
17310
+ HelixHeadlessTerminalElementEvent<HelixCopyEvent>;
17311
+ /** `helix-terminal-bell` event type */
17312
+ export type HelixHeadlessTerminalHelixTerminalBellElementEvent =
17313
+ HelixHeadlessTerminalElementEvent<HelixTerminalBellEvent>;
17314
+ /** `helix-terminal-input` event type */
17315
+ export type HelixHeadlessTerminalHelixTerminalInputElementEvent =
17316
+ HelixHeadlessTerminalElementEvent<HelixTerminalInputEvent>;
17317
+ /** `helix-terminal-link` event type */
17318
+ export type HelixHeadlessTerminalHelixTerminalLinkElementEvent =
17319
+ HelixHeadlessTerminalElementEvent<HelixTerminalLinkEvent>;
17320
+ /** `helix-terminal-resize` event type */
17321
+ export type HelixHeadlessTerminalHelixTerminalResizeElementEvent =
17322
+ HelixHeadlessTerminalElementEvent<HelixTerminalResizeEvent>;
17323
+ /** `helix-terminal-restart` event type */
17324
+ export type HelixHeadlessTerminalHelixTerminalRestartElementEvent =
17325
+ HelixHeadlessTerminalElementEvent<HelixTerminalRestartEvent>;
17326
+ /** `helix-terminal-title` event type */
17327
+ export type HelixHeadlessTerminalHelixTerminalTitleElementEvent =
17328
+ HelixHeadlessTerminalElementEvent<HelixTerminalTitleEvent>;
17329
+
17330
+ export type HelixHeadlessTerminalVueProps = {
17331
+ /** The clear button's label. */
17332
+ "clear-label"?: (HelixHeadlessTerminal["clearLabel"]) | undefined;
17333
+ /** The clear button's label. */
17334
+ clearLabel?: (HelixHeadlessTerminal["clearLabel"]) | undefined;
17335
+ /** The grid's width in character cells. Set it with `rows` to fix the grid's size; unset, the grid fills the frame. */
17336
+ columns?: (HelixHeadlessTerminal["columns"]) | undefined;
17337
+ /** Which built-in controls the header shows, as a list of `find`, `copy`,
17338
+ `clear`, and `fullscreen`, or `none`. Absent is `find clear`. */
17339
+ controls?: (HelixHeadlessTerminal["controls"]) | undefined;
17340
+ /** The name of the row of controls, read by screen readers. */
17341
+ "controls-label"?: (HelixHeadlessTerminal["controlsLabel"]) | undefined;
17342
+ /** The name of the row of controls, read by screen readers. */
17343
+ controlsLabel?: (HelixHeadlessTerminal["controlsLabel"]) | undefined;
17344
+ /** What screen readers hear after a copy. */
17345
+ "copied-label"?: (HelixHeadlessTerminal["copiedLabel"]) | undefined;
17346
+ /** What screen readers hear after a copy. */
17347
+ copiedLabel?: (HelixHeadlessTerminal["copiedLabel"]) | undefined;
17348
+ /** The copy button's label. */
17349
+ "copy-label"?: (HelixHeadlessTerminal["copyLabel"]) | undefined;
17350
+ /** The copy button's label. */
17351
+ copyLabel?: (HelixHeadlessTerminal["copyLabel"]) | undefined;
17352
+ /** How the process exited, which the page sets when it does. While it is set,
17353
+ the status line says it, the frame sends no input, and Restart is shown.
17354
+ Clear it when a new process starts. */
17355
+ "exit-code"?: (HelixHeadlessTerminal["exitCode"] | `${number}`) | undefined;
17356
+ /** How the process exited, which the page sets when it does. While it is set,
17357
+ the status line says it, the frame sends no input, and Restart is shown.
17358
+ Clear it when a new process starts. */
17359
+ exitCode?: (HelixHeadlessTerminal["exitCode"]) | undefined;
17360
+ /** What the status line says once the process has exited. `{code}` is its
17361
+ exit code, written as the process gave it, and code `0` is a clean exit. */
17362
+ "exited-label"?: (HelixHeadlessTerminal["exitedLabel"]) | undefined;
17363
+ /** What the status line says once the process has exited. `{code}` is its
17364
+ exit code, written as the process gave it, and code `0` is a clean exit. */
17365
+ exitedLabel?: (HelixHeadlessTerminal["exitedLabel"]) | undefined;
17366
+ /** The terminal's name where `label` is empty and the host has no `aria-label`. */
17367
+ "fallback-label"?: (HelixHeadlessTerminal["fallbackLabel"]) | undefined;
17368
+ /** The terminal's name where `label` is empty and the host has no `aria-label`. */
17369
+ fallbackLabel?: (HelixHeadlessTerminal["fallbackLabel"]) | undefined;
17370
+ /** The label of the button that closes the find bar. */
17371
+ "find-close-label"?: (HelixHeadlessTerminal["findCloseLabel"]) | undefined;
17372
+ /** The label of the button that closes the find bar. */
17373
+ findCloseLabel?: (HelixHeadlessTerminal["findCloseLabel"]) | undefined;
17374
+ /** The name of the find bar's row of buttons, read by screen readers. */
17375
+ "find-controls-label"?: (HelixHeadlessTerminal["findControlsLabel"]) | undefined;
17376
+ /** The name of the find bar's row of buttons, read by screen readers. */
17377
+ findControlsLabel?: (HelixHeadlessTerminal["findControlsLabel"]) | undefined;
17378
+ /** The find button's label, and the find field's name and placeholder. */
17379
+ "find-label"?: (HelixHeadlessTerminal["findLabel"]) | undefined;
17380
+ /** The find button's label, and the find field's name and placeholder. */
17381
+ findLabel?: (HelixHeadlessTerminal["findLabel"]) | undefined;
17382
+ /** The next match button's label. */
17383
+ "find-next-label"?: (HelixHeadlessTerminal["findNextLabel"]) | undefined;
17384
+ /** The next match button's label. */
17385
+ findNextLabel?: (HelixHeadlessTerminal["findNextLabel"]) | undefined;
17386
+ /** The previous match button's label. */
17387
+ "find-previous-label"?: (HelixHeadlessTerminal["findPreviousLabel"]) | undefined;
17388
+ /** The previous match button's label. */
17389
+ findPreviousLabel?: (HelixHeadlessTerminal["findPreviousLabel"]) | undefined;
17390
+ /** The fullscreen button's label. */
17391
+ "fullscreen-label"?: (HelixHeadlessTerminal["fullscreenLabel"]) | undefined;
17392
+ /** The fullscreen button's label. */
17393
+ fullscreenLabel?: (HelixHeadlessTerminal["fullscreenLabel"]) | undefined;
17394
+ /** The name of the element the reader types into, which the renderer draws. */
17395
+ "input-label"?: (HelixHeadlessTerminal["inputLabel"]) | undefined;
17396
+ /** The name of the element the reader types into, which the renderer draws. */
17397
+ inputLabel?: (HelixHeadlessTerminal["inputLabel"]) | undefined;
17398
+ /** The terminal's name, in the header and for screen readers, such as the
17399
+ shell or the folder it runs in. Several terminals on a page need names
17400
+ that tell them apart. */
17401
+ label?: (HelixHeadlessTerminal["label"]) | undefined;
17402
+ /** What the find bar says of its matches. `{index}` is the current match,
17403
+ counting from 1, and `{count}` how many there are. */
17404
+ "matches-label"?: (HelixHeadlessTerminal["matchesLabel"]) | undefined;
17405
+ /** What the find bar says of its matches. `{index}` is the current match,
17406
+ counting from 1, and `{count}` how many there are. */
17407
+ matchesLabel?: (HelixHeadlessTerminal["matchesLabel"]) | undefined;
17408
+ /** Draws the output and sends no input, with no cursor, for a transcript or
17409
+ a command an agent ran. The attribute is `readonly`, the platform's
17410
+ spelling. */
17411
+ readonly?: (HelixHeadlessTerminal["readOnly"]) | undefined;
17412
+ /** Draws the output and sends no input, with no cursor, for a transcript or
17413
+ a command an agent ran. The attribute is `readonly`, the platform's
17414
+ spelling. */
17415
+ readOnly?: (HelixHeadlessTerminal["readOnly"]) | undefined;
17416
+ /** The Restart button's label. */
17417
+ "restart-label"?: (HelixHeadlessTerminal["restartLabel"]) | undefined;
17418
+ /** The Restart button's label. */
17419
+ restartLabel?: (HelixHeadlessTerminal["restartLabel"]) | undefined;
17420
+ /** The grid's height in lines. Set it with `columns` to fix the grid's size; unset, the grid fills the frame. */
17421
+ rows?: (HelixHeadlessTerminal["rows"]) | undefined;
17422
+ /** Keeps the grid as lines a screen reader moves through, and says new
17423
+ output as it arrives. Off by default, since it costs time on every
17424
+ write. Connect it to a setting your reader can turn on. */
17425
+ "screen-reader-mode"?: (HelixHeadlessTerminal["screenReaderMode"]) | undefined;
17426
+ /** Keeps the grid as lines a screen reader moves through, and says new
17427
+ output as it arrives. Off by default, since it costs time on every
17428
+ write. Connect it to a setting your reader can turn on. */
17429
+ screenReaderMode?: (HelixHeadlessTerminal["screenReaderMode"]) | undefined;
17430
+ /** What the terminal's input describes to a screen reader. `{key}` is the key that switches Tab. */
17431
+ "tab-hint-label"?: (HelixHeadlessTerminal["tabHintLabel"]) | undefined;
17432
+ /** What the terminal's input describes to a screen reader. `{key}` is the key that switches Tab. */
17433
+ tabHintLabel?: (HelixHeadlessTerminal["tabHintLabel"]) | undefined;
17434
+ /** What the status line says while Tab moves focus. `{key}` is the key that switches it back. */
17435
+ "tab-moves-focus-label"?: (HelixHeadlessTerminal["tabMovesFocusLabel"]) | undefined;
17436
+ /** What the status line says while Tab moves focus. `{key}` is the key that switches it back. */
17437
+ tabMovesFocusLabel?: (HelixHeadlessTerminal["tabMovesFocusLabel"]) | undefined;
17438
+ /** What screen readers hear when Tab goes back to typing in the terminal. */
17439
+ "tab-types-label"?: (HelixHeadlessTerminal["tabTypesLabel"]) | undefined;
17440
+ /** What screen readers hear when Tab goes back to typing in the terminal. */
17441
+ tabTypesLabel?: (HelixHeadlessTerminal["tabTypesLabel"]) | undefined;
17442
+ };
17443
+
17444
+ export type HelixHeadlessTerminalVueEvents = {
17445
+ /** The copy control or its key put the selection on the clipboard. */
17446
+ "helix-copy": HelixHeadlessTerminalHelixCopyElementEvent;
17447
+ /** The program rang the bell. The frame flashes once. */
17448
+ "helix-terminal-bell": HelixHeadlessTerminalHelixTerminalBellElementEvent;
17449
+ /** The reader typed or pasted, with `data` encoded for the program. Write it to the process. Not sent while `readonly`, or once `exit-code` is set. */
17450
+ "helix-terminal-input": HelixHeadlessTerminalHelixTerminalInputElementEvent;
17451
+ /** A link in the output was activated, with its `href`. Cancelable: cancel it to open the link yourself. Left alone, a web address opens in a new tab. */
17452
+ "helix-terminal-link": HelixHeadlessTerminalHelixTerminalLinkElementEvent;
17453
+ /** The grid changed size, with `columns`, `rows`, `width`, and `height`. Resize the process's pseudo-terminal to match. */
17454
+ "helix-terminal-resize": HelixHeadlessTerminalHelixTerminalResizeElementEvent;
17455
+ /** The Restart button was pressed after the process exited. Start a new process and clear `exit-code`. */
17456
+ "helix-terminal-restart": HelixHeadlessTerminalHelixTerminalRestartElementEvent;
17457
+ /** The program set its title, with `title`. The frame keeps its own `label`. */
17458
+ "helix-terminal-title": HelixHeadlessTerminalHelixTerminalTitleElementEvent;
17459
+ };
17460
+
17296
17461
  /** `HelixHeadlessTextarea` component event */
17297
17462
  export type HelixHeadlessTextareaElementEvent<E = Event> = TypedEvent<
17298
17463
  HelixHeadlessTextarea,
@@ -20606,6 +20771,54 @@ export type CustomCssProperties = {
20606
20771
  "--table-template"?: (string) | undefined;
20607
20772
  /** Written by the row on its `expand` cell: how deep the row sits, from 1. Do not set it. */
20608
20773
  "--table-row-level"?: (string) | undefined;
20774
+ /** The ground of the current match of a search. */
20775
+ "--terminal-active-match-background-color"?: (string) | undefined;
20776
+ /** The edge of the current match of a search. */
20777
+ "--terminal-active-match-border-color"?: (string) | undefined;
20778
+ /** ANSI black, which codes `30` and `40` draw. */
20779
+ "--terminal-ansi-black"?: (string) | undefined;
20780
+ /** ANSI blue, which codes `34` and `44` draw. */
20781
+ "--terminal-ansi-blue"?: (string) | undefined;
20782
+ /** ANSI bright black, which codes `90` and `100` draw. */
20783
+ "--terminal-ansi-bright-black"?: (string) | undefined;
20784
+ /** ANSI bright blue, which codes `94` and `104` draw. */
20785
+ "--terminal-ansi-bright-blue"?: (string) | undefined;
20786
+ /** ANSI bright cyan, which codes `96` and `106` draw. */
20787
+ "--terminal-ansi-bright-cyan"?: (string) | undefined;
20788
+ /** ANSI bright green, which codes `92` and `102` draw. */
20789
+ "--terminal-ansi-bright-green"?: (string) | undefined;
20790
+ /** ANSI bright magenta, which codes `95` and `105` draw. */
20791
+ "--terminal-ansi-bright-magenta"?: (string) | undefined;
20792
+ /** ANSI bright red, which codes `91` and `101` draw. */
20793
+ "--terminal-ansi-bright-red"?: (string) | undefined;
20794
+ /** ANSI bright white, which codes `97` and `107` draw. */
20795
+ "--terminal-ansi-bright-white"?: (string) | undefined;
20796
+ /** ANSI bright yellow, which codes `93` and `103` draw. */
20797
+ "--terminal-ansi-bright-yellow"?: (string) | undefined;
20798
+ /** ANSI cyan, which codes `36` and `46` draw. */
20799
+ "--terminal-ansi-cyan"?: (string) | undefined;
20800
+ /** ANSI green, which codes `32` and `42` draw. */
20801
+ "--terminal-ansi-green"?: (string) | undefined;
20802
+ /** ANSI magenta, which codes `35` and `45` draw. */
20803
+ "--terminal-ansi-magenta"?: (string) | undefined;
20804
+ /** ANSI red, which codes `31` and `41` draw. */
20805
+ "--terminal-ansi-red"?: (string) | undefined;
20806
+ /** ANSI white, which codes `37` and `47` draw. */
20807
+ "--terminal-ansi-white"?: (string) | undefined;
20808
+ /** ANSI yellow, which codes `33` and `43` draw. */
20809
+ "--terminal-ansi-yellow"?: (string) | undefined;
20810
+ /** The ground of the grid. */
20811
+ "--terminal-background-color"?: (string) | undefined;
20812
+ /** The text of the grid where the program sets no color. */
20813
+ "--terminal-color"?: (string) | undefined;
20814
+ /** The cursor. */
20815
+ "--terminal-cursor-color"?: (string) | undefined;
20816
+ /** The ground of every match of a search but the current one. */
20817
+ "--terminal-match-background-color"?: (string) | undefined;
20818
+ /** The grid's scrollbar. */
20819
+ "--terminal-scrollbar-thumb-color"?: (string) | undefined;
20820
+ /** The ground of selected text. See-through, so the text keeps its color. */
20821
+ "--terminal-selection-background-color"?: (string) | undefined;
20609
20822
  /** How long this message stays, in milliseconds, for a progress hint. */
20610
20823
  "--toast-duration"?: (string) | undefined;
20611
20824
  /** How far a swipe has moved the message across, in pixels, toward the right. */
@@ -21462,6 +21675,12 @@ export interface WcToolkitVueGlobalComponents {
21462
21675
  HelixHeadlessTagVueProps,
21463
21676
  HelixHeadlessTagVueEvents
21464
21677
  >;
21678
+ /** Wraps a terminal drawn by xterm.js or another emulator. The frame adds a header with the terminal's name and its controls, a find bar, and a status line. 'connectTerminal' in '@fusion.dev/helix-terminal' connects it to the emulator and draws the terminal in the colors the '--terminal-*' properties set, which the styled tier sets from your theme. Helix does not start a process: you connect the stream. Write the program's output with 'write()', send what the reader types to the process from 'helix-terminal-input', and resize the process's pseudo-terminal from 'helix-terminal-resize'. Output written before a renderer is connected is held and written first, so the process can start before the emulator loads. 'write()' resolves once the renderer has parsed the output, which is how a page pauses a process that writes faster than the terminal draws. The controls are a row in the header, and 'controls' names which ones: 'find', 'copy', 'clear', and 'fullscreen'. 'find clear' by default. A control the renderer cannot answer is left out once it is connected. Set 'exit-code' when the process exits: the frame says how it exited, stops sending input, and shows a Restart button that sends 'helix-terminal-restart'. **Keyboard.** Every key goes to the program, Tab, Shift+Tab, and Escape included, except these: - Control+Shift+F, or Command+F on a Mac, opens the find bar. Enter and Shift+Enter move between the matches, and Escape closes the bar and returns focus to the terminal. - Control+Shift+C copies the selection. On a Mac, Command+C does. - Control+M, or Control+Shift+M on a Mac, switches Tab between typing in the terminal and moving focus out of it. The status line says when Tab moves focus, and the terminal's input describes the key to a screen reader. **Screen readers.** A terminal draws its grid as a picture of text, so a screen reader reads nothing in it by default. Set 'screen-reader-mode' to have the renderer keep the grid as lines a screen reader can move through and announce new output as it arrives, which xterm.js calls screen reader mode. It costs time on every write, so it is off by default: connect it to a setting your reader can turn on. */
21679
+ "helix-headless-terminal": DefineCustomElement<
21680
+ HelixHeadlessTerminal,
21681
+ HelixHeadlessTerminalVueProps,
21682
+ HelixHeadlessTerminalVueEvents
21683
+ >;
21465
21684
  /** Renders a '<textarea>', so the caret, selection, spellcheck, resize handle, and phone keyboard come from the platform. It is in the server markup, so the field works before any script loads. It is a separate element from 'Input' because Enter inserts a line break here. In a single-line field, Enter submits the form. 'rows' sets the starting height, and 'auto-grow' makes the field grow with its content. You can use both: 'rows' sets where an empty field begins. 'max-rows' stops the growth at that many lines, and the field scrolls past them. 'clearable' draws a button that empties the field while it holds text, and sends 'helix-clear', as 'Input' does. 'validate' adds your own rule, run on every change once the browser finds nothing wrong, as React Aria's TextField 'validate' does. **Keyboard.** The field's own keys are the platform's, and Enter starts a new line. The clear button under 'clearable' is a tab stop of its own after the field. The inner textarea is named by 'label', or by a host 'aria-label', 'aria-labelledby' or '<label for>', and is described by the hint and the message, with 'aria-invalid' while a message shows. The clear button is named 'clear-label'. */
21466
21685
  "helix-headless-textarea": DefineCustomElement<
21467
21686
  HelixHeadlessTextarea,
@@ -21522,7 +21741,7 @@ export interface WcToolkitVueGlobalComponents {
21522
21741
  HelixHeadlessToggleVueProps,
21523
21742
  HelixHeadlessToggleVueEvents
21524
21743
  >;
21525
- /** A toolbar holds a mix of controls, such as buttons, toggles, and menus. A button group holds one kind, so the two are separate components. The toolbar is one tab stop, and the arrow keys move between its controls, so three toolbars take three presses of Tab to pass. Any element the browser can focus counts as a control, including your own elements. A child that takes no focus, such as a divider, is skipped. A menu is reached at its trigger. A Divider in the toolbar is a separator across the toolbar's axis, as React Aria's is: vertical in a horizontal toolbar and horizontal in a vertical one, without an 'orientation' of its own. Controls inside a plain wrapper, such as a 'Button Group', are each a stop of the toolbar's own, as React Aria's toolbar flattens a group: the arrows walk through the group's buttons and on past it, and the group takes no tab stop of its own. The arrows wrap from the last control to the first. Set 'stop-at-ends' to keep them at the ends, as Radix's 'loop' set to false does. **Keyboard.** Tab enters the toolbar on the control that last had focus, the first control at the start, and the next Tab leaves it. | Key | What it does | |---|---| | Right | Moves to the next control in a horizontal toolbar, from the last back to the first. | | Left | Moves to the control before in a horizontal toolbar, from the first round to the last. | | Down, Up | The same in a vertical toolbar. | | Home, End | Moves to the first or the last control. | Left and Right swap on a right-to-left page, where the first control is on the right. The arrows across the toolbar's axis are left to the control that has focus, so a radio-style toggle group or a select answers them itself. The toolbar is 'role="toolbar"' with 'aria-orientation', named by 'label'. The stop moves through a control's own 'focusable' property where it has one, as Button, Select and Toggle Group do. A control without one has 'tabindex' written on the element that takes focus: a native element itself, or the control inside a custom element's open shadow root, so the host keeps the markup you rendered. Only a custom element whose shadow root is closed takes it on the host. A toggle group of pressed buttons, 'selection-mode="multiple"', is walked through the same way, each toggle a stop on the toolbar's axis, as React Aria's toolbar walks its toggle buttons. Another nested composite, such as a radio-style toggle group, is one stop on the toolbar's axis: the toolbar's arrows move past it, and the arrows across the toolbar move inside it. A composite with a 'focusable' property, as Toggle Group has, gives up its own tab stop while the toolbar's is elsewhere, so Tab stops once in the toolbar. A composite without one keeps its own tab stop. A toolbar inside another toolbar, a Helix one or the page's own 'role="toolbar"', is a 'group' of the outer one, as React Aria's is: the outer toolbar's arrows walk through its controls and on past them, and it takes no keys and no tab stop of its own. A server renders it as a toolbar, having no parent to read, until it upgrades. */
21744
+ /** A toolbar holds a mix of controls, such as buttons, toggles, and menus. A button group holds one kind, so the two are separate components. The toolbar is one tab stop, and the arrow keys move between its controls, so three toolbars take three presses of Tab to pass. Any element the browser can focus counts as a control, including your own elements. A child that takes no focus, such as a divider, is skipped. A menu is reached at its trigger. A Divider in the toolbar is a separator across the toolbar's axis, as React Aria's is: vertical in a horizontal toolbar and horizontal in a vertical one, without an 'orientation' of its own. Controls inside a plain wrapper, such as a 'Button Group', are each a stop of the toolbar's own, as React Aria's toolbar flattens a group: the arrows walk through the group's buttons and on past it, and the group takes no tab stop of its own. The arrows wrap from the last control to the first. Set 'stop-at-ends' to keep them at the ends, as Radix's 'loop' set to false does. **Keyboard.** Tab enters the toolbar on the control that last had focus, the first control at the start, and the next Tab leaves it. | Key | What it does | |---|---| | Right | Moves to the next control in a horizontal toolbar, from the last back to the first. | | Left | Moves to the control before in a horizontal toolbar, from the first round to the last. | | Down, Up | The same in a vertical toolbar. | | Home, End | Moves to the first or the last control. | Left and Right swap on a right-to-left page, where the first control is on the right. The arrows across the toolbar's axis are left to the control that has focus, so a radio-style toggle group or a select answers them itself. The toolbar is 'role="toolbar"' with 'aria-orientation', named by 'label'. The stop moves through a control's own 'focusable' property where it has one, as Button, Select and Toggle Group do. A control without one has 'tabindex' written on the element that takes focus: a native element itself, or the control inside a custom element's open shadow root, so the host keeps the markup you rendered. Only a custom element whose shadow root is closed takes it on the host. A toggle group of pressed buttons, 'selection-mode="multiple"', is walked through the same way, each toggle a stop on the toolbar's axis, as React Aria's toolbar walks its toggle buttons. Another nested composite, such as a radio-style toggle group, is one stop on the toolbar's axis: the toolbar's arrows move past it, and the arrows across the toolbar move inside it. A composite with a 'focusable' property, as Toggle Group has, gives up its own tab stop while the toolbar's is elsewhere, so Tab stops once in the toolbar. A composite without one keeps its own tab stop. A '<slot>' in the toolbar counts as the controls assigned to it, for a toolbar a component draws in its own shadow root with your controls passed into it: they share its tab stop and its arrows with the component's own. A toolbar inside another toolbar, a Helix one or the page's own 'role="toolbar"', is a 'group' of the outer one, as React Aria's is: the outer toolbar's arrows walk through its controls and on past them, and it takes no keys and no tab stop of its own. A server renders it as a toolbar, having no parent to read, until it upgrades. */
21526
21745
  "helix-headless-toolbar": DefineCustomElement<
21527
21746
  HelixHeadlessToolbar,
21528
21747
  HelixHeadlessToolbarVueProps,
package/types/words.d.ts CHANGED
@@ -3885,6 +3885,118 @@ declare module '@fusion.dev/helix-core' {
3885
3885
  */
3886
3886
  emptyLabel: Message
3887
3887
  }
3888
+ 'helix-terminal': {
3889
+ /**
3890
+ * The clear button's label.
3891
+ *
3892
+ * English: `Clear`
3893
+ */
3894
+ clearLabel: Message
3895
+ /**
3896
+ * The name of the row of controls, read by screen readers.
3897
+ *
3898
+ * English: `Terminal controls`
3899
+ */
3900
+ controlsLabel: Message
3901
+ /**
3902
+ * What screen readers hear after a copy.
3903
+ *
3904
+ * English: `Copied`
3905
+ */
3906
+ copiedLabel: Message
3907
+ /**
3908
+ * The copy button's label.
3909
+ *
3910
+ * English: `Copy`
3911
+ */
3912
+ copyLabel: Message
3913
+ /**
3914
+ * What the status line says once the process has exited. `{code}` is its
3915
+ * exit code, written as the process gave it, and code `0` is a clean exit.
3916
+ *
3917
+ * English: `{code, select, 0 {The process exited.} other {The process exited with code {code}.}}`
3918
+ */
3919
+ exitedLabel: Message
3920
+ /**
3921
+ * The terminal's name where `label` is empty and the host has no `aria-label`.
3922
+ *
3923
+ * English: `Terminal`
3924
+ */
3925
+ fallbackLabel: Message
3926
+ /**
3927
+ * The label of the button that closes the find bar.
3928
+ *
3929
+ * English: `Close find`
3930
+ */
3931
+ findCloseLabel: Message
3932
+ /**
3933
+ * The name of the find bar's row of buttons, read by screen readers.
3934
+ *
3935
+ * English: `Find controls`
3936
+ */
3937
+ findControlsLabel: Message
3938
+ /**
3939
+ * The find button's label, and the find field's name and placeholder.
3940
+ *
3941
+ * English: `Find`
3942
+ */
3943
+ findLabel: Message
3944
+ /**
3945
+ * The next match button's label.
3946
+ *
3947
+ * English: `Next match`
3948
+ */
3949
+ findNextLabel: Message
3950
+ /**
3951
+ * The previous match button's label.
3952
+ *
3953
+ * English: `Previous match`
3954
+ */
3955
+ findPreviousLabel: Message
3956
+ /**
3957
+ * The fullscreen button's label.
3958
+ *
3959
+ * English: `Fill the screen`
3960
+ */
3961
+ fullscreenLabel: Message
3962
+ /**
3963
+ * The name of the element the reader types into, which the renderer draws.
3964
+ *
3965
+ * English: `Terminal input`
3966
+ */
3967
+ inputLabel: Message
3968
+ /**
3969
+ * What the find bar says of its matches. `{index}` is the current match,
3970
+ * counting from 1, and `{count}` how many there are.
3971
+ *
3972
+ * English: `{count, plural, =0 {No matches} one {{index} of # match} other {{index} of # matches}}`
3973
+ */
3974
+ matchesLabel: Message
3975
+ /**
3976
+ * The Restart button's label.
3977
+ *
3978
+ * English: `Restart`
3979
+ */
3980
+ restartLabel: Message
3981
+ /**
3982
+ * What the terminal's input describes to a screen reader. `{key}` is the key that switches Tab.
3983
+ *
3984
+ * English: `Press {key} to move focus with Tab.`
3985
+ */
3986
+ tabHintLabel: Message
3987
+ /**
3988
+ * What the status line says while Tab moves focus. `{key}` is the key that switches it back.
3989
+ *
3990
+ * English: `Tab moves focus. Press {key} to type Tab in the terminal.`
3991
+ */
3992
+ tabMovesFocusLabel: Message
3993
+ /**
3994
+ * What screen readers hear when Tab goes back to typing in the terminal.
3995
+ *
3996
+ * English: `Tab types in the terminal.`
3997
+ */
3998
+ tabTypesLabel: Message
3999
+ }
3888
4000
  'helix-textarea': {
3889
4001
  /**
3890
4002
  * The accessible name of the clear button, which shows only an icon.