@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/api.json +1 -1
- package/custom-elements.json +1 -1
- package/dist/carousel/root/carousel-root.js +9 -5
- package/dist/chat/root/chat-root.js +6 -3
- package/dist/data-table/root/data-table-root.js +8 -7
- package/dist/element-events.generated.js +9 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/outline/root/outline-root.js +12 -7
- package/dist/terminal/index.d.ts +3 -0
- package/dist/terminal/index.js +1 -0
- package/dist/terminal/keys.d.ts +14 -0
- package/dist/terminal/keys.js +20 -0
- package/dist/terminal/root/terminal-root.d.ts +489 -0
- package/dist/terminal/root/terminal-root.js +710 -0
- package/dist/toolbar/root/toolbar-root.d.ts +14 -0
- package/dist/toolbar/root/toolbar-root.js +6 -3
- package/examples.json +1 -1
- package/lint.json +1 -1
- package/package.json +5 -5
- package/types/jsx.d.ts +899 -0
- package/types/svelte.d.ts +1 -0
- package/types/vue.d.ts +220 -1
- package/types/words.d.ts +112 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
|
-
import { ChildrenController, capturePointer, customElement, formatWords, HelixActivateEvent, HelixElement, HelixSelectEvent, hostAria, inlineStep, isRtl, MIRROR_RULE, motionPaused, numberConverter, onMotionChange, reducedMotion, requestChange, SCROLLER_RULE, timeConverter, words, } from '@fusion.dev/helix-core';
|
|
2
|
+
import { assignSlot, ChildrenController, capturePointer, customElement, formatWords, HelixActivateEvent, HelixElement, HelixSelectEvent, hostAria, inlineStep, isRtl, MIRROR_RULE, motionPaused, numberConverter, onMotionChange, reducedMotion, requestChange, SCROLLER_RULE, timeConverter, words, } from '@fusion.dev/helix-core';
|
|
3
3
|
import { caretLeft, caretRight, play, stop } from '@fusion.dev/helix-icons';
|
|
4
4
|
import { html, nothing } from 'lit';
|
|
5
5
|
import { property, state } from 'lit/decorators.js';
|
|
@@ -464,16 +464,20 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
|
|
|
464
464
|
return;
|
|
465
465
|
}
|
|
466
466
|
for (const name of ICON_SLOTS) {
|
|
467
|
-
this.renderRoot
|
|
468
|
-
|
|
469
|
-
|
|
467
|
+
const slot = this.renderRoot?.querySelector?.(`slot[name="${name}"]`);
|
|
468
|
+
if (slot) {
|
|
469
|
+
assignSlot(slot, ...this.iconsFor(name));
|
|
470
|
+
}
|
|
470
471
|
}
|
|
471
472
|
const panes = this.renderRoot?.querySelectorAll?.('[part="slide"] slot');
|
|
472
473
|
if (!panes) {
|
|
473
474
|
return;
|
|
474
475
|
}
|
|
475
476
|
this.slides.forEach((slide, index) => {
|
|
476
|
-
panes[index]
|
|
477
|
+
const pane = panes[index];
|
|
478
|
+
if (pane) {
|
|
479
|
+
assignSlot(pane, slide);
|
|
480
|
+
}
|
|
477
481
|
});
|
|
478
482
|
}
|
|
479
483
|
runEnd() {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
var HelixHeadlessChat_1;
|
|
2
2
|
import { __decorate } from "tslib";
|
|
3
|
-
import { ChildrenController, customElement, deepActiveElement, drawIcon, focusableElements, formatWords, HelixBeforePinEvent, HelixElement, HelixHistoryEvent, HelixPinEvent, hostAria, MixinCollection, numberConverter, onUnlessFalse, reportRuntime, requestChange, SCROLLER_RULE, UpgradeController, VIRTUAL_RULE, VirtualizeController, whenHydrated, words, wordsConverter, } from '@fusion.dev/helix-core';
|
|
3
|
+
import { assignSlot, ChildrenController, customElement, deepActiveElement, drawIcon, focusableElements, formatWords, HelixBeforePinEvent, HelixElement, HelixHistoryEvent, HelixPinEvent, hostAria, MixinCollection, numberConverter, onUnlessFalse, reportRuntime, requestChange, SCROLLER_RULE, UpgradeController, VIRTUAL_RULE, VirtualizeController, whenHydrated, words, wordsConverter, } from '@fusion.dev/helix-core';
|
|
4
4
|
import { arrowDown } from '@fusion.dev/helix-icons';
|
|
5
5
|
import { nothing } from 'lit';
|
|
6
6
|
import { property, state } from 'lit/decorators.js';
|
|
@@ -291,9 +291,12 @@ let HelixHeadlessChat = class HelixHeadlessChat extends MixinCollection(HelixEle
|
|
|
291
291
|
}
|
|
292
292
|
return;
|
|
293
293
|
}
|
|
294
|
-
log
|
|
294
|
+
assignSlot(log, ...(this.fed ? [] : this.messages));
|
|
295
295
|
for (const name of REGIONS) {
|
|
296
|
-
root?.querySelector?.(`slot[name="${name}"]`)
|
|
296
|
+
const slot = root?.querySelector?.(`slot[name="${name}"]`);
|
|
297
|
+
if (slot) {
|
|
298
|
+
assignSlot(slot, ...this.given(name));
|
|
299
|
+
}
|
|
297
300
|
}
|
|
298
301
|
}
|
|
299
302
|
given(name) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
var HelixHeadlessDataTable_1;
|
|
2
2
|
import { __decorate } from "tslib";
|
|
3
|
-
import { anchorAt, arranged, auditChildren, auditServed, commaList, countLabel, customElement, cycle, deepActiveElement, deepContains, everyState, format, formatWords, gridMove, HelixActivateEvent, HelixElement, HelixExpandEvent, HelixFilterEvent, HelixFilteredEvent, HelixLoadMoreEvent, HelixNavigateEvent, HelixReorderEvent, HelixReorderedEvent, HelixSelectEvent, HelixSelectedEvent, HelixSortEvent, HelixSortedEvent, handedLocale, hostAria, inlineStep, inRowOrder, MIRROR_RULE, MixinCollection, markRegion, numberConverter, onAndroid, ordered, pageRows, parse, placeKey, ReorderController, rangeAdd, reportRuntime, requestChange, requestReorder, SCROLLER_RULE, scrollingAncestor, scrollRoom, selectsAll, Typeahead, toggleEvery, treeArrow, typesCharacter, VIRTUAL_RULE, VirtualizeController, valueAt, whenHydrated, window_, words, wordsLocale, writtenList, } from '@fusion.dev/helix-core';
|
|
3
|
+
import { anchorAt, arranged, assignSlot, auditChildren, auditServed, commaList, countLabel, customElement, cycle, deepActiveElement, deepContains, everyState, format, formatWords, gridMove, HelixActivateEvent, HelixElement, HelixExpandEvent, HelixFilterEvent, HelixFilteredEvent, HelixLoadMoreEvent, HelixNavigateEvent, HelixReorderEvent, HelixReorderedEvent, HelixSelectEvent, HelixSelectedEvent, HelixSortEvent, HelixSortedEvent, handedLocale, hostAria, inlineStep, inRowOrder, MIRROR_RULE, MixinCollection, markRegion, numberConverter, onAndroid, ordered, pageRows, parse, placeKey, ReorderController, rangeAdd, reportRuntime, requestChange, requestReorder, SCROLLER_RULE, scrollingAncestor, scrollRoom, selectsAll, Typeahead, toggleEvery, treeArrow, typesCharacter, VIRTUAL_RULE, VirtualizeController, valueAt, whenHydrated, window_, words, wordsLocale, writtenList, } from '@fusion.dev/helix-core';
|
|
4
4
|
import { caretDown, caretRight, dotsSixVertical } from '@fusion.dev/helix-icons';
|
|
5
5
|
import { nothing } from 'lit';
|
|
6
6
|
import { property, state } from 'lit/decorators.js';
|
|
@@ -924,10 +924,11 @@ let HelixHeadlessDataTable = class HelixHeadlessDataTable extends MixinCollectio
|
|
|
924
924
|
return;
|
|
925
925
|
}
|
|
926
926
|
const columns = this.orderedColumns;
|
|
927
|
-
head
|
|
928
|
-
root
|
|
929
|
-
|
|
930
|
-
|
|
927
|
+
assignSlot(head, ...columns);
|
|
928
|
+
const served = root.querySelector('[part="table"] > slot:not([name])');
|
|
929
|
+
if (served) {
|
|
930
|
+
assignSlot(served, ...(this.serving ? this.servedRows : []));
|
|
931
|
+
}
|
|
931
932
|
const rest = [...this.children].filter((child) => !columns.includes(child));
|
|
932
933
|
for (const [name, wanted] of [
|
|
933
934
|
['toolbar', true],
|
|
@@ -937,8 +938,8 @@ let HelixHeadlessDataTable = class HelixHeadlessDataTable extends MixinCollectio
|
|
|
937
938
|
['loading', true],
|
|
938
939
|
]) {
|
|
939
940
|
const slot = root.querySelector(`slot[name="${name}"]`);
|
|
940
|
-
if (slot
|
|
941
|
-
slot
|
|
941
|
+
if (slot && wanted) {
|
|
942
|
+
assignSlot(slot, ...rest.filter((child) => child.getAttribute('slot') === name));
|
|
942
943
|
}
|
|
943
944
|
}
|
|
944
945
|
}
|
|
@@ -339,6 +339,15 @@ registerElementEvents({
|
|
|
339
339
|
'helix-headless-tabs': ['helix-activate', 'helix-before-activate', 'helix-select'],
|
|
340
340
|
'helix-headless-tag': ['helix-dismiss'],
|
|
341
341
|
'helix-headless-tag-group': ['change', 'helix-before-change', 'helix-dismiss'],
|
|
342
|
+
'helix-headless-terminal': [
|
|
343
|
+
'helix-copy',
|
|
344
|
+
'helix-terminal-bell',
|
|
345
|
+
'helix-terminal-input',
|
|
346
|
+
'helix-terminal-link',
|
|
347
|
+
'helix-terminal-resize',
|
|
348
|
+
'helix-terminal-restart',
|
|
349
|
+
'helix-terminal-title',
|
|
350
|
+
],
|
|
342
351
|
'helix-headless-textarea': ['change', 'helix-before-change', 'helix-clear', 'input'],
|
|
343
352
|
'helix-headless-time-input': [
|
|
344
353
|
'change',
|
package/dist/index.d.ts
CHANGED
|
@@ -103,6 +103,7 @@ export * from './switch/index.js';
|
|
|
103
103
|
export * from './table/index.js';
|
|
104
104
|
export * from './tabs/index.js';
|
|
105
105
|
export * from './tag/index.js';
|
|
106
|
+
export * from './terminal/index.js';
|
|
106
107
|
export * from './textarea/index.js';
|
|
107
108
|
export * from './time-input/index.js';
|
|
108
109
|
export * from './time-picker/index.js';
|
package/dist/index.js
CHANGED
|
@@ -94,6 +94,7 @@ export * from './switch/index.js';
|
|
|
94
94
|
export * from './table/index.js';
|
|
95
95
|
export * from './tabs/index.js';
|
|
96
96
|
export * from './tag/index.js';
|
|
97
|
+
export * from './terminal/index.js';
|
|
97
98
|
export * from './textarea/index.js';
|
|
98
99
|
export * from './time-input/index.js';
|
|
99
100
|
export * from './time-picker/index.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
|
-
import { customElement, elementById, HelixActivateEvent, HelixElement, IndicatorController, numberConverter, plainClick, reflectElements, scrollingAncestor, scrollWithin, words, } from '@fusion.dev/helix-core';
|
|
2
|
+
import { assignSlot, customElement, elementById, HelixActivateEvent, HelixElement, IndicatorController, numberConverter, plainClick, reflectElements, scrollingAncestor, scrollWithin, words, } from '@fusion.dev/helix-core';
|
|
3
3
|
import { html, nothing } from 'lit';
|
|
4
4
|
import { property } from 'lit/decorators.js';
|
|
5
5
|
import { levelOf, nest } from '../levels.js';
|
|
@@ -296,22 +296,27 @@ let HelixHeadlessOutline = class HelixHeadlessOutline extends HelixElement {
|
|
|
296
296
|
}
|
|
297
297
|
const root = this.renderRoot;
|
|
298
298
|
const heading = root?.querySelector?.('slot[name="heading"]');
|
|
299
|
-
heading
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
299
|
+
if (heading) {
|
|
300
|
+
assignSlot(heading, ...this.knownChildren.filter((child) => child.slot === 'heading'));
|
|
301
|
+
}
|
|
302
|
+
const indicator = root?.querySelector?.('slot[name="indicator"]');
|
|
303
|
+
if (indicator) {
|
|
304
|
+
assignSlot(indicator, ...this.knownChildren.filter((child) => child.slot === 'indicator'));
|
|
305
|
+
}
|
|
303
306
|
const run = this.run;
|
|
304
307
|
if (run) {
|
|
305
308
|
for (const slot of root?.querySelectorAll?.('slot[data-link]') ?? []) {
|
|
306
309
|
const link = run[Number(slot.dataset.link)];
|
|
307
310
|
if (link) {
|
|
308
|
-
slot
|
|
311
|
+
assignSlot(slot, link);
|
|
309
312
|
}
|
|
310
313
|
}
|
|
311
314
|
return;
|
|
312
315
|
}
|
|
313
316
|
const plain = root?.querySelector?.('nav > slot:not([role])');
|
|
314
|
-
|
|
317
|
+
if (plain) {
|
|
318
|
+
assignSlot(plain, ...[...this.childNodes].filter((node) => node instanceof Element ? !OWN_SLOTS.has(node.slot) : node instanceof Text));
|
|
319
|
+
}
|
|
315
320
|
}
|
|
316
321
|
updated(changed) {
|
|
317
322
|
super.updated(changed);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { HelixHeadlessTerminal } from './root/terminal-root.js';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type ChordPress } from '@fusion.dev/helix-core';
|
|
2
|
+
/** What a terminal frame does with a key press before the program sees it. */
|
|
3
|
+
export type TerminalShortcut = 'copy' | 'find' | 'tab-focus';
|
|
4
|
+
/** The chord for a shortcut on this keyboard, or `undefined` where the frame takes none. */
|
|
5
|
+
export declare const chordOf: (shortcut: TerminalShortcut, apple: boolean) => string | undefined;
|
|
6
|
+
/** Which shortcut a press is, or `null` for a press the program should have. */
|
|
7
|
+
export declare const shortcutOf: (press: ChordPress, apple: boolean) => TerminalShortcut | null;
|
|
8
|
+
/**
|
|
9
|
+
* A chord as a reader says it, such as "Control+Shift+M": the key names
|
|
10
|
+
* `aria-keyshortcuts` uses, which a screen reader reads aloud whole.
|
|
11
|
+
*/
|
|
12
|
+
export declare const spokenChord: (shortcut: TerminalShortcut, apple: boolean) => string;
|
|
13
|
+
/** Whether a press is a bare Tab or Shift+Tab, which moves focus while Tab is set to. */
|
|
14
|
+
export declare const isTab: (press: ChordPress) => boolean;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ariaChord, matchesChord } from '@fusion.dev/helix-core';
|
|
2
|
+
const CHORDS = {
|
|
3
|
+
apple: { copy: undefined, find: 'cmd+f', 'tab-focus': 'ctrl+shift+m' },
|
|
4
|
+
other: { copy: 'ctrl+shift+c', find: 'ctrl+shift+f', 'tab-focus': 'ctrl+m' },
|
|
5
|
+
};
|
|
6
|
+
export const chordOf = (shortcut, apple) => CHORDS[apple ? 'apple' : 'other'][shortcut];
|
|
7
|
+
export const shortcutOf = (press, apple) => {
|
|
8
|
+
for (const shortcut of ['copy', 'find', 'tab-focus']) {
|
|
9
|
+
const chord = chordOf(shortcut, apple);
|
|
10
|
+
if (chord !== undefined && matchesChord(press, chord, apple)) {
|
|
11
|
+
return shortcut;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return null;
|
|
15
|
+
};
|
|
16
|
+
export const spokenChord = (shortcut, apple) => {
|
|
17
|
+
const chord = chordOf(shortcut, apple);
|
|
18
|
+
return chord === undefined ? '' : ariaChord(chord, apple).replace('Meta', 'Command');
|
|
19
|
+
};
|
|
20
|
+
export const isTab = (press) => press.key === 'Tab' && !press.altKey && !press.ctrlKey && !press.metaKey;
|