@sectile/core 0.1.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/LICENSE +21 -0
- package/README.md +16 -0
- package/dist/accordion.d.ts +43 -0
- package/dist/accordion.d.ts.map +1 -0
- package/dist/accordion.js +83 -0
- package/dist/accordion.js.map +1 -0
- package/dist/alert-dialog.d.ts +18 -0
- package/dist/alert-dialog.d.ts.map +1 -0
- package/dist/alert-dialog.js +9 -0
- package/dist/alert-dialog.js.map +1 -0
- package/dist/calendar.d.ts +2 -0
- package/dist/calendar.d.ts.map +1 -0
- package/dist/calendar.js +2 -0
- package/dist/calendar.js.map +1 -0
- package/dist/carousel.d.ts +40 -0
- package/dist/carousel.d.ts.map +1 -0
- package/dist/carousel.js +51 -0
- package/dist/carousel.js.map +1 -0
- package/dist/checkbox-group.d.ts +12 -0
- package/dist/checkbox-group.d.ts.map +1 -0
- package/dist/checkbox-group.js +12 -0
- package/dist/checkbox-group.js.map +1 -0
- package/dist/checkbox.d.ts +2 -0
- package/dist/checkbox.d.ts.map +1 -0
- package/dist/checkbox.js +2 -0
- package/dist/checkbox.js.map +1 -0
- package/dist/combobox.d.ts +16 -0
- package/dist/combobox.d.ts.map +1 -0
- package/dist/combobox.js +42 -0
- package/dist/combobox.js.map +1 -0
- package/dist/date-field.d.ts +58 -0
- package/dist/date-field.d.ts.map +1 -0
- package/dist/date-field.js +233 -0
- package/dist/date-field.js.map +1 -0
- package/dist/date-picker.d.ts +53 -0
- package/dist/date-picker.d.ts.map +1 -0
- package/dist/date-picker.js +157 -0
- package/dist/date-picker.js.map +1 -0
- package/dist/date-range-picker.d.ts +28 -0
- package/dist/date-range-picker.d.ts.map +1 -0
- package/dist/date-range-picker.js +85 -0
- package/dist/date-range-picker.js.map +1 -0
- package/dist/date-time-field.d.ts +53 -0
- package/dist/date-time-field.d.ts.map +1 -0
- package/dist/date-time-field.js +253 -0
- package/dist/date-time-field.js.map +1 -0
- package/dist/date-time-picker.d.ts +54 -0
- package/dist/date-time-picker.d.ts.map +1 -0
- package/dist/date-time-picker.js +151 -0
- package/dist/date-time-picker.js.map +1 -0
- package/dist/date-time-range-picker.d.ts +67 -0
- package/dist/date-time-range-picker.d.ts.map +1 -0
- package/dist/date-time-range-picker.js +226 -0
- package/dist/date-time-range-picker.js.map +1 -0
- package/dist/dialog.d.ts +16 -0
- package/dist/dialog.d.ts.map +1 -0
- package/dist/dialog.js +5 -0
- package/dist/dialog.js.map +1 -0
- package/dist/disclosure.d.ts +2 -0
- package/dist/disclosure.d.ts.map +1 -0
- package/dist/disclosure.js +2 -0
- package/dist/disclosure.js.map +1 -0
- package/dist/feed.d.ts +29 -0
- package/dist/feed.d.ts.map +1 -0
- package/dist/feed.js +26 -0
- package/dist/feed.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/interaction.d.ts +14 -0
- package/dist/interaction.d.ts.map +1 -0
- package/dist/interaction.js +38 -0
- package/dist/interaction.js.map +1 -0
- package/dist/internal/composites/calendar.d.ts +35 -0
- package/dist/internal/composites/calendar.d.ts.map +1 -0
- package/dist/internal/composites/calendar.js +139 -0
- package/dist/internal/composites/calendar.js.map +1 -0
- package/dist/internal/composites/combobox.d.ts +41 -0
- package/dist/internal/composites/combobox.d.ts.map +1 -0
- package/dist/internal/composites/combobox.js +184 -0
- package/dist/internal/composites/combobox.js.map +1 -0
- package/dist/internal/composites/grid-control.d.ts +36 -0
- package/dist/internal/composites/grid-control.d.ts.map +1 -0
- package/dist/internal/composites/grid-control.js +86 -0
- package/dist/internal/composites/grid-control.js.map +1 -0
- package/dist/internal/composites/linear-action.d.ts +35 -0
- package/dist/internal/composites/linear-action.d.ts.map +1 -0
- package/dist/internal/composites/linear-action.js +92 -0
- package/dist/internal/composites/linear-action.js.map +1 -0
- package/dist/internal/composites/linear-choice.d.ts +41 -0
- package/dist/internal/composites/linear-choice.d.ts.map +1 -0
- package/dist/internal/composites/linear-choice.js +139 -0
- package/dist/internal/composites/linear-choice.js.map +1 -0
- package/dist/internal/composites/listbox.d.ts +50 -0
- package/dist/internal/composites/listbox.d.ts.map +1 -0
- package/dist/internal/composites/listbox.js +243 -0
- package/dist/internal/composites/listbox.js.map +1 -0
- package/dist/internal/composites/menu.d.ts +28 -0
- package/dist/internal/composites/menu.d.ts.map +1 -0
- package/dist/internal/composites/menu.js +72 -0
- package/dist/internal/composites/menu.js.map +1 -0
- package/dist/internal/composites/popup.d.ts +20 -0
- package/dist/internal/composites/popup.d.ts.map +1 -0
- package/dist/internal/composites/popup.js +8 -0
- package/dist/internal/composites/popup.js.map +1 -0
- package/dist/internal/composites/slider.d.ts +20 -0
- package/dist/internal/composites/slider.d.ts.map +1 -0
- package/dist/internal/composites/slider.js +69 -0
- package/dist/internal/composites/slider.js.map +1 -0
- package/dist/internal/composites/tree-grid.d.ts +65 -0
- package/dist/internal/composites/tree-grid.d.ts.map +1 -0
- package/dist/internal/composites/tree-grid.js +274 -0
- package/dist/internal/composites/tree-grid.js.map +1 -0
- package/dist/internal/composites/tree-view.d.ts +39 -0
- package/dist/internal/composites/tree-view.d.ts.map +1 -0
- package/dist/internal/composites/tree-view.js +175 -0
- package/dist/internal/composites/tree-view.js.map +1 -0
- package/dist/internal/editing/text.d.ts +64 -0
- package/dist/internal/editing/text.d.ts.map +1 -0
- package/dist/internal/editing/text.js +238 -0
- package/dist/internal/editing/text.js.map +1 -0
- package/dist/internal/kernel/decimal.d.ts +22 -0
- package/dist/internal/kernel/decimal.d.ts.map +1 -0
- package/dist/internal/kernel/decimal.js +137 -0
- package/dist/internal/kernel/decimal.js.map +1 -0
- package/dist/internal/kernel/foundation.d.ts +12 -0
- package/dist/internal/kernel/foundation.d.ts.map +1 -0
- package/dist/internal/kernel/foundation.js +132 -0
- package/dist/internal/kernel/foundation.js.map +1 -0
- package/dist/internal/kernel/indexed-sequence.d.ts +26 -0
- package/dist/internal/kernel/indexed-sequence.d.ts.map +1 -0
- package/dist/internal/kernel/indexed-sequence.js +117 -0
- package/dist/internal/kernel/indexed-sequence.js.map +1 -0
- package/dist/internal/kernel/machine.d.ts +8 -0
- package/dist/internal/kernel/machine.d.ts.map +1 -0
- package/dist/internal/kernel/machine.js +6 -0
- package/dist/internal/kernel/machine.js.map +1 -0
- package/dist/internal/runtime/revision.d.ts +22 -0
- package/dist/internal/runtime/revision.d.ts.map +1 -0
- package/dist/internal/runtime/revision.js +72 -0
- package/dist/internal/runtime/revision.js.map +1 -0
- package/dist/internal/state/checked.d.ts +21 -0
- package/dist/internal/state/checked.d.ts.map +1 -0
- package/dist/internal/state/checked.js +29 -0
- package/dist/internal/state/checked.js.map +1 -0
- package/dist/internal/state/cursor.d.ts +13 -0
- package/dist/internal/state/cursor.d.ts.map +1 -0
- package/dist/internal/state/cursor.js +24 -0
- package/dist/internal/state/cursor.js.map +1 -0
- package/dist/internal/state/expansion.d.ts +8 -0
- package/dist/internal/state/expansion.d.ts.map +1 -0
- package/dist/internal/state/expansion.js +23 -0
- package/dist/internal/state/expansion.js.map +1 -0
- package/dist/internal/state/open-state.d.ts +16 -0
- package/dist/internal/state/open-state.d.ts.map +1 -0
- package/dist/internal/state/open-state.js +25 -0
- package/dist/internal/state/open-state.js.map +1 -0
- package/dist/internal/state/selection.d.ts +23 -0
- package/dist/internal/state/selection.d.ts.map +1 -0
- package/dist/internal/state/selection.js +110 -0
- package/dist/internal/state/selection.js.map +1 -0
- package/dist/listbox.d.ts +2 -0
- package/dist/listbox.d.ts.map +1 -0
- package/dist/listbox.js +2 -0
- package/dist/listbox.js.map +1 -0
- package/dist/menu-button.d.ts +3 -0
- package/dist/menu-button.d.ts.map +1 -0
- package/dist/menu-button.js +3 -0
- package/dist/menu-button.js.map +1 -0
- package/dist/menu.d.ts +8 -0
- package/dist/menu.d.ts.map +1 -0
- package/dist/menu.js +4 -0
- package/dist/menu.js.map +1 -0
- package/dist/menubar.d.ts +3 -0
- package/dist/menubar.d.ts.map +1 -0
- package/dist/menubar.js +3 -0
- package/dist/menubar.js.map +1 -0
- package/dist/multi-thumb-slider.d.ts +35 -0
- package/dist/multi-thumb-slider.d.ts.map +1 -0
- package/dist/multi-thumb-slider.js +68 -0
- package/dist/multi-thumb-slider.js.map +1 -0
- package/dist/number-field.d.ts +49 -0
- package/dist/number-field.d.ts.map +1 -0
- package/dist/number-field.js +454 -0
- package/dist/number-field.js.map +1 -0
- package/dist/pagination.d.ts +63 -0
- package/dist/pagination.d.ts.map +1 -0
- package/dist/pagination.js +190 -0
- package/dist/pagination.js.map +1 -0
- package/dist/pin-input.d.ts +29 -0
- package/dist/pin-input.d.ts.map +1 -0
- package/dist/pin-input.js +49 -0
- package/dist/pin-input.js.map +1 -0
- package/dist/quantity-field.d.ts +58 -0
- package/dist/quantity-field.d.ts.map +1 -0
- package/dist/quantity-field.js +250 -0
- package/dist/quantity-field.js.map +1 -0
- package/dist/radio-group.d.ts +22 -0
- package/dist/radio-group.d.ts.map +1 -0
- package/dist/radio-group.js +16 -0
- package/dist/radio-group.js.map +1 -0
- package/dist/rating.d.ts +17 -0
- package/dist/rating.d.ts.map +1 -0
- package/dist/rating.js +15 -0
- package/dist/rating.js.map +1 -0
- package/dist/result.d.ts +10 -0
- package/dist/result.d.ts.map +1 -0
- package/dist/result.js +19 -0
- package/dist/result.js.map +1 -0
- package/dist/revision.d.ts +2 -0
- package/dist/revision.d.ts.map +1 -0
- package/dist/revision.js +2 -0
- package/dist/revision.js.map +1 -0
- package/dist/select.d.ts +30 -0
- package/dist/select.d.ts.map +1 -0
- package/dist/select.js +28 -0
- package/dist/select.js.map +1 -0
- package/dist/shared.d.ts +42 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +3 -0
- package/dist/shared.js.map +1 -0
- package/dist/slider.d.ts +2 -0
- package/dist/slider.d.ts.map +1 -0
- package/dist/slider.js +2 -0
- package/dist/slider.js.map +1 -0
- package/dist/spin-button.d.ts +29 -0
- package/dist/spin-button.d.ts.map +1 -0
- package/dist/spin-button.js +61 -0
- package/dist/spin-button.js.map +1 -0
- package/dist/stepper.d.ts +17 -0
- package/dist/stepper.d.ts.map +1 -0
- package/dist/stepper.js +12 -0
- package/dist/stepper.js.map +1 -0
- package/dist/structures/grid.d.ts +27 -0
- package/dist/structures/grid.d.ts.map +1 -0
- package/dist/structures/grid.js +197 -0
- package/dist/structures/grid.js.map +1 -0
- package/dist/structures/range.d.ts +39 -0
- package/dist/structures/range.d.ts.map +1 -0
- package/dist/structures/range.js +242 -0
- package/dist/structures/range.js.map +1 -0
- package/dist/structures/sequence.d.ts +17 -0
- package/dist/structures/sequence.d.ts.map +1 -0
- package/dist/structures/sequence.js +24 -0
- package/dist/structures/sequence.js.map +1 -0
- package/dist/structures/tree.d.ts +32 -0
- package/dist/structures/tree.d.ts.map +1 -0
- package/dist/structures/tree.js +234 -0
- package/dist/structures/tree.js.map +1 -0
- package/dist/switch.d.ts +20 -0
- package/dist/switch.d.ts.map +1 -0
- package/dist/switch.js +4 -0
- package/dist/switch.js.map +1 -0
- package/dist/tabs.d.ts +15 -0
- package/dist/tabs.d.ts.map +1 -0
- package/dist/tabs.js +23 -0
- package/dist/tabs.js.map +1 -0
- package/dist/tags-input.d.ts +41 -0
- package/dist/tags-input.d.ts.map +1 -0
- package/dist/tags-input.js +44 -0
- package/dist/tags-input.js.map +1 -0
- package/dist/text.d.ts +2 -0
- package/dist/text.d.ts.map +1 -0
- package/dist/text.js +2 -0
- package/dist/text.js.map +1 -0
- package/dist/time-field.d.ts +46 -0
- package/dist/time-field.d.ts.map +1 -0
- package/dist/time-field.js +148 -0
- package/dist/time-field.js.map +1 -0
- package/dist/toggle-button.d.ts +19 -0
- package/dist/toggle-button.d.ts.map +1 -0
- package/dist/toggle-button.js +16 -0
- package/dist/toggle-button.js.map +1 -0
- package/dist/toolbar.d.ts +2 -0
- package/dist/toolbar.d.ts.map +1 -0
- package/dist/toolbar.js +2 -0
- package/dist/toolbar.js.map +1 -0
- package/dist/tooltip.d.ts +2 -0
- package/dist/tooltip.d.ts.map +1 -0
- package/dist/tooltip.js +2 -0
- package/dist/tooltip.js.map +1 -0
- package/dist/tree-grid.d.ts +10 -0
- package/dist/tree-grid.d.ts.map +1 -0
- package/dist/tree-grid.js +14 -0
- package/dist/tree-grid.js.map +1 -0
- package/dist/tree-view.d.ts +2 -0
- package/dist/tree-view.d.ts.map +1 -0
- package/dist/tree-view.js +2 -0
- package/dist/tree-view.js.map +1 -0
- package/dist/units.d.ts +72 -0
- package/dist/units.d.ts.map +1 -0
- package/dist/units.js +496 -0
- package/dist/units.js.map +1 -0
- package/dist/window-splitter.d.ts +2 -0
- package/dist/window-splitter.d.ts.map +1 -0
- package/dist/window-splitter.js +2 -0
- package/dist/window-splitter.js.map +1 -0
- package/package.json +304 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { fail, ok } from '../kernel/foundation.js';
|
|
2
|
+
import { findEligibleFromEdge } from '../kernel/indexed-sequence.js';
|
|
3
|
+
import { createMachineUpdate } from '../kernel/machine.js';
|
|
4
|
+
import { createCursorState } from '../state/cursor.js';
|
|
5
|
+
export function createLinearActionState(domain, input = {}) {
|
|
6
|
+
const current = input.current ?? null;
|
|
7
|
+
if (current !== null && !domain.contains(current)) {
|
|
8
|
+
return fail('construction', 'linear-action-cursor-outside-domain', 'Linear action cursor must exist in the sequence domain.', { current });
|
|
9
|
+
}
|
|
10
|
+
return ok(linearActionState(current));
|
|
11
|
+
}
|
|
12
|
+
export function applyLinearActionEvent(domain, state, event, policies = {}) {
|
|
13
|
+
const stateError = validateState(domain, state);
|
|
14
|
+
if (stateError !== null)
|
|
15
|
+
return { ok: false, error: stateError };
|
|
16
|
+
if (!isLinearActionEvent(event)) {
|
|
17
|
+
return fail('transition-rejection', 'invalid-linear-action-event', 'Linear action event is not part of the accepted vocabulary.', { event });
|
|
18
|
+
}
|
|
19
|
+
const boundary = policies.boundary ?? 'stop';
|
|
20
|
+
if (boundary !== 'stop' && boundary !== 'wrap') {
|
|
21
|
+
return fail('transition-rejection', 'invalid-linear-action-boundary', 'Linear action boundary must be stop or wrap.', { boundary });
|
|
22
|
+
}
|
|
23
|
+
if (policies.eligible !== undefined && typeof policies.eligible !== 'function') {
|
|
24
|
+
return fail('transition-rejection', 'invalid-eligibility-policy', 'Linear action eligibility policy must be a function.');
|
|
25
|
+
}
|
|
26
|
+
if (typeof event === 'object') {
|
|
27
|
+
if (!domain.contains(event.id) || policies.eligible?.(event.id) === false) {
|
|
28
|
+
return fail('transition-rejection', 'linear-action-target-unavailable', 'Direct linear action events require an eligible identity in the domain.', { id: event.id });
|
|
29
|
+
}
|
|
30
|
+
return event.type === 'focus'
|
|
31
|
+
? focus(event.id)
|
|
32
|
+
: invoke(state, event.id, true);
|
|
33
|
+
}
|
|
34
|
+
if (event === 'invoke') {
|
|
35
|
+
return state.cursor.current === null
|
|
36
|
+
? fail('transition-rejection', 'no-cursor', 'Linear action invocation requires a cursor.')
|
|
37
|
+
: invoke(state, state.cursor.current, false);
|
|
38
|
+
}
|
|
39
|
+
const direction = event === 'next' || event === 'first' ? 1 : -1;
|
|
40
|
+
const eligible = policies.eligible ?? (() => true);
|
|
41
|
+
let target;
|
|
42
|
+
if (event === 'first' || event === 'last' || state.cursor.current === null) {
|
|
43
|
+
const edge = findEligibleFromEdge(domain, direction, {
|
|
44
|
+
eligible,
|
|
45
|
+
...(policies.maxScan === undefined ? {} : { maxScan: policies.maxScan }),
|
|
46
|
+
});
|
|
47
|
+
if (!edge.ok)
|
|
48
|
+
return edge;
|
|
49
|
+
target = edge.value;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
const movement = domain.move(state.cursor.current, direction, boundary, {
|
|
53
|
+
eligible,
|
|
54
|
+
...(policies.maxScan === undefined ? {} : { maxScan: policies.maxScan }),
|
|
55
|
+
});
|
|
56
|
+
if (movement.kind === 'resource-rejected')
|
|
57
|
+
return { ok: false, error: movement.error };
|
|
58
|
+
target = movement.kind === 'found' ? movement.id : null;
|
|
59
|
+
}
|
|
60
|
+
return target === null ? createMachineUpdate(state) : focus(target);
|
|
61
|
+
}
|
|
62
|
+
function focus(id) {
|
|
63
|
+
return createMachineUpdate(linearActionState(id), [{ type: 'focus', id }]);
|
|
64
|
+
}
|
|
65
|
+
function invoke(state, id, direct) {
|
|
66
|
+
const commands = [];
|
|
67
|
+
if (direct && state.cursor.current !== id)
|
|
68
|
+
commands.push({ type: 'focus', id });
|
|
69
|
+
commands.push({ type: 'invoke', id });
|
|
70
|
+
return createMachineUpdate(linearActionState(id), commands);
|
|
71
|
+
}
|
|
72
|
+
function linearActionState(current) {
|
|
73
|
+
return Object.freeze({ cursor: createCursorState(current) });
|
|
74
|
+
}
|
|
75
|
+
function validateState(domain, state) {
|
|
76
|
+
return state.cursor.current === null || domain.contains(state.cursor.current)
|
|
77
|
+
? null
|
|
78
|
+
: {
|
|
79
|
+
class: 'transition-rejection',
|
|
80
|
+
code: 'linear-action-cursor-outside-domain',
|
|
81
|
+
message: 'Linear action cursor must exist in the sequence domain.',
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function isLinearActionEvent(value) {
|
|
85
|
+
if (typeof value === 'string') {
|
|
86
|
+
return ['next', 'previous', 'first', 'last', 'invoke'].includes(value);
|
|
87
|
+
}
|
|
88
|
+
return typeof value === 'object' && value !== null
|
|
89
|
+
&& 'type' in value && 'id' in value && typeof value.id === 'string'
|
|
90
|
+
&& (value.type === 'focus' || value.type === 'invoke');
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=linear-action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear-action.js","sourceRoot":"","sources":["../../../src/internal/composites/linear-action.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { BoundaryPolicy, Result, StableID } from '../../shared.js';
|
|
2
|
+
import type { Sequence } from '../../structures/sequence.js';
|
|
3
|
+
import { type CursorState } from '../state/cursor.js';
|
|
4
|
+
import { type SelectionSnapshotInput, type SelectionState } from '../state/selection.js';
|
|
5
|
+
export type LinearChoiceEvent<ID extends StableID = StableID> = 'next' | 'previous' | 'first' | 'last' | 'select' | 'activate' | {
|
|
6
|
+
readonly type: 'focus';
|
|
7
|
+
readonly id: ID;
|
|
8
|
+
} | {
|
|
9
|
+
readonly type: 'select';
|
|
10
|
+
readonly id: ID;
|
|
11
|
+
} | {
|
|
12
|
+
readonly type: 'activate';
|
|
13
|
+
readonly id: ID;
|
|
14
|
+
};
|
|
15
|
+
export type LinearChoiceCommand<ID extends StableID = StableID> = {
|
|
16
|
+
readonly type: 'focus';
|
|
17
|
+
readonly id: ID;
|
|
18
|
+
} | {
|
|
19
|
+
readonly type: 'activate';
|
|
20
|
+
readonly id: ID;
|
|
21
|
+
};
|
|
22
|
+
export interface LinearChoiceState<ID extends StableID = StableID> {
|
|
23
|
+
readonly cursor: CursorState<ID>;
|
|
24
|
+
readonly selection: SelectionState<ID>;
|
|
25
|
+
}
|
|
26
|
+
export interface LinearChoiceStateInput<ID extends StableID = StableID> extends SelectionSnapshotInput<ID> {
|
|
27
|
+
readonly current?: ID | null;
|
|
28
|
+
}
|
|
29
|
+
export interface LinearChoicePolicies<ID extends StableID = StableID> {
|
|
30
|
+
readonly eligible?: (id: ID) => boolean;
|
|
31
|
+
readonly selectionFollowsFocus?: boolean;
|
|
32
|
+
readonly boundary?: BoundaryPolicy;
|
|
33
|
+
readonly maxScan?: number;
|
|
34
|
+
}
|
|
35
|
+
export interface LinearChoiceUpdate<ID extends StableID = StableID> {
|
|
36
|
+
readonly state: LinearChoiceState<ID>;
|
|
37
|
+
readonly commands: readonly LinearChoiceCommand<ID>[];
|
|
38
|
+
}
|
|
39
|
+
export declare function createLinearChoiceState<ID extends StableID>(domain: Sequence<ID>, input?: LinearChoiceStateInput<ID>): Result<LinearChoiceState<ID>>;
|
|
40
|
+
export declare function applyLinearChoiceEvent<ID extends StableID>(domain: Sequence<ID>, state: LinearChoiceState<ID>, event: LinearChoiceEvent<ID>, policies?: LinearChoicePolicies<ID>): Result<LinearChoiceUpdate<ID>>;
|
|
41
|
+
//# sourceMappingURL=linear-choice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear-choice.d.ts","sourceRoot":"","sources":["../../../src/internal/composites/linear-choice.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAgB,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACtF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAI7D,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,MAAM,iBAAiB,CAAC,EAAE,SAAS,QAAQ,GAAG,QAAQ,IACxD,MAAM,GACN,UAAU,GACV,OAAO,GACP,MAAM,GACN,QAAQ,GACR,UAAU,GACV;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAA;CAAE,GAC3C;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAA;CAAE,GAC5C;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAA;CAAE,CAAC;AAEnD,MAAM,MAAM,mBAAmB,CAAC,EAAE,SAAS,QAAQ,GAAG,QAAQ,IAC1D;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAA;CAAE,GAC3C;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAA;CAAE,CAAC;AAEnD,MAAM,WAAW,iBAAiB,CAAC,EAAE,SAAS,QAAQ,GAAG,QAAQ;IAC/D,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,sBAAsB,CAAC,EAAE,SAAS,QAAQ,GAAG,QAAQ,CACpE,SAAQ,sBAAsB,CAAC,EAAE,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB,CAAC,EAAE,SAAS,QAAQ,GAAG,QAAQ;IAClE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,OAAO,CAAC;IACxC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IACzC,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB,CAAC,EAAE,SAAS,QAAQ,GAAG,QAAQ;IAChE,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,SAAS,mBAAmB,CAAC,EAAE,CAAC,EAAE,CAAC;CACvD;AAED,wBAAgB,uBAAuB,CAAC,EAAE,SAAS,QAAQ,EACzD,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,EACpB,KAAK,GAAE,sBAAsB,CAAC,EAAE,CAAM,GACrC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAa/B;AAED,wBAAgB,sBAAsB,CAAC,EAAE,SAAS,QAAQ,EACxD,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,EACpB,KAAK,EAAE,iBAAiB,CAAC,EAAE,CAAC,EAC5B,KAAK,EAAE,iBAAiB,CAAC,EAAE,CAAC,EAC5B,QAAQ,GAAE,oBAAoB,CAAC,EAAE,CAAM,GACtC,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAwDhC"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { fail, ok } from '../kernel/foundation.js';
|
|
2
|
+
import { findEligibleFromEdge } from '../kernel/indexed-sequence.js';
|
|
3
|
+
import { createMachineUpdate } from '../kernel/machine.js';
|
|
4
|
+
import { createCursorState } from '../state/cursor.js';
|
|
5
|
+
import { createSelectionState, selectOne, } from '../state/selection.js';
|
|
6
|
+
export function createLinearChoiceState(domain, input = {}) {
|
|
7
|
+
const current = input.current ?? null;
|
|
8
|
+
if (current !== null && !domain.contains(current)) {
|
|
9
|
+
return fail('construction', 'linear-choice-cursor-outside-domain', 'Linear choice cursor must exist in the sequence domain.', { current });
|
|
10
|
+
}
|
|
11
|
+
const selection = createSelectionState(domain, 'single', input);
|
|
12
|
+
if (!selection.ok)
|
|
13
|
+
return selection;
|
|
14
|
+
return ok(linearChoiceState(createCursorState(current), selection.value));
|
|
15
|
+
}
|
|
16
|
+
export function applyLinearChoiceEvent(domain, state, event, policies = {}) {
|
|
17
|
+
const stateError = validateLinearChoiceState(domain, state);
|
|
18
|
+
if (stateError !== null)
|
|
19
|
+
return { ok: false, error: stateError };
|
|
20
|
+
if (!isLinearChoiceEvent(event)) {
|
|
21
|
+
return fail('transition-rejection', 'invalid-linear-choice-event', 'Linear choice event is not part of the accepted vocabulary.', { event });
|
|
22
|
+
}
|
|
23
|
+
const boundary = policies.boundary ?? 'stop';
|
|
24
|
+
if (boundary !== 'stop' && boundary !== 'wrap') {
|
|
25
|
+
return fail('transition-rejection', 'invalid-linear-choice-boundary', 'Linear choice boundary must be stop or wrap.', { boundary });
|
|
26
|
+
}
|
|
27
|
+
const follows = policies.selectionFollowsFocus ?? false;
|
|
28
|
+
if (typeof follows !== 'boolean') {
|
|
29
|
+
return fail('transition-rejection', 'invalid-selection-follows-focus', 'selectionFollowsFocus must be boolean.');
|
|
30
|
+
}
|
|
31
|
+
if (policies.eligible !== undefined && typeof policies.eligible !== 'function') {
|
|
32
|
+
return fail('transition-rejection', 'invalid-eligibility-policy', 'Linear choice eligibility policy must be a function.');
|
|
33
|
+
}
|
|
34
|
+
if (typeof event === 'object') {
|
|
35
|
+
if (!isAvailable(domain, event.id, policies))
|
|
36
|
+
return unavailable(event.id);
|
|
37
|
+
if (event.type === 'focus') {
|
|
38
|
+
return focusTarget(domain, state, event.id, follows);
|
|
39
|
+
}
|
|
40
|
+
return chooseTarget(domain, state, event.id, event.type === 'activate');
|
|
41
|
+
}
|
|
42
|
+
if (event === 'next' || event === 'previous' || event === 'first' || event === 'last') {
|
|
43
|
+
return moveLinearChoice(domain, state, event, boundary, follows, policies);
|
|
44
|
+
}
|
|
45
|
+
const current = state.cursor.current;
|
|
46
|
+
if (current === null) {
|
|
47
|
+
return fail('transition-rejection', 'no-cursor', 'Linear choice selection requires a cursor.');
|
|
48
|
+
}
|
|
49
|
+
return chooseTarget(domain, state, current, event === 'activate', false);
|
|
50
|
+
}
|
|
51
|
+
function moveLinearChoice(domain, state, event, boundary, follows, policies) {
|
|
52
|
+
const direction = event === 'next' || event === 'first' ? 1 : -1;
|
|
53
|
+
const eligible = policies.eligible ?? (() => true);
|
|
54
|
+
let target;
|
|
55
|
+
if (event === 'first' || event === 'last' || state.cursor.current === null) {
|
|
56
|
+
const edge = findEligibleFromEdge(domain, direction, {
|
|
57
|
+
eligible,
|
|
58
|
+
...(policies.maxScan === undefined ? {} : { maxScan: policies.maxScan }),
|
|
59
|
+
});
|
|
60
|
+
if (!edge.ok)
|
|
61
|
+
return edge;
|
|
62
|
+
target = edge.value;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
const movement = domain.move(state.cursor.current, direction, boundary, {
|
|
66
|
+
eligible,
|
|
67
|
+
...(policies.maxScan === undefined ? {} : { maxScan: policies.maxScan }),
|
|
68
|
+
});
|
|
69
|
+
if (movement.kind === 'resource-rejected')
|
|
70
|
+
return { ok: false, error: movement.error };
|
|
71
|
+
target = movement.kind === 'found' ? movement.id : null;
|
|
72
|
+
}
|
|
73
|
+
return target === null
|
|
74
|
+
? createMachineUpdate(state)
|
|
75
|
+
: focusTarget(domain, state, target, follows);
|
|
76
|
+
}
|
|
77
|
+
function focusTarget(domain, state, id, follows) {
|
|
78
|
+
const selection = follows ? selectOne(state.selection, id, domain) : state.selection;
|
|
79
|
+
return createMachineUpdate(linearChoiceState(createCursorState(id), selection), [{ type: 'focus', id }]);
|
|
80
|
+
}
|
|
81
|
+
function chooseTarget(domain, state, id, activate, focus = true) {
|
|
82
|
+
const commands = [];
|
|
83
|
+
if (focus && state.cursor.current !== id)
|
|
84
|
+
commands.push({ type: 'focus', id });
|
|
85
|
+
if (activate)
|
|
86
|
+
commands.push({ type: 'activate', id });
|
|
87
|
+
return createMachineUpdate(linearChoiceState(createCursorState(id), selectOne(state.selection, id, domain)), commands);
|
|
88
|
+
}
|
|
89
|
+
function validateLinearChoiceState(domain, state) {
|
|
90
|
+
if (state.cursor.current !== null && !domain.contains(state.cursor.current)) {
|
|
91
|
+
return {
|
|
92
|
+
class: 'transition-rejection',
|
|
93
|
+
code: 'linear-choice-cursor-outside-domain',
|
|
94
|
+
message: 'Linear choice cursor must exist in the sequence domain.',
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
if (state.selection.size > 1 || state.selection.selected.length !== state.selection.size) {
|
|
98
|
+
return {
|
|
99
|
+
class: 'transition-rejection',
|
|
100
|
+
code: 'invalid-linear-choice-selection',
|
|
101
|
+
message: 'Linear choice selection must contain at most one identity.',
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
for (const id of state.selection.selected) {
|
|
105
|
+
if (!domain.contains(id) || !state.selection.has(id)) {
|
|
106
|
+
return {
|
|
107
|
+
class: 'transition-rejection',
|
|
108
|
+
code: 'linear-choice-selection-outside-domain',
|
|
109
|
+
message: 'Linear choice selection must agree with the sequence domain.',
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (state.selection.anchor !== null && !domain.contains(state.selection.anchor)) {
|
|
114
|
+
return {
|
|
115
|
+
class: 'transition-rejection',
|
|
116
|
+
code: 'linear-choice-anchor-outside-domain',
|
|
117
|
+
message: 'Linear choice anchor must exist in the sequence domain.',
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
function linearChoiceState(cursor, selection) {
|
|
123
|
+
return Object.freeze({ cursor, selection });
|
|
124
|
+
}
|
|
125
|
+
function isAvailable(domain, id, policies) {
|
|
126
|
+
return domain.contains(id) && policies.eligible?.(id) !== false;
|
|
127
|
+
}
|
|
128
|
+
function unavailable(id) {
|
|
129
|
+
return fail('transition-rejection', 'linear-choice-target-unavailable', 'Direct linear choice events require an eligible identity in the domain.', { id });
|
|
130
|
+
}
|
|
131
|
+
function isLinearChoiceEvent(value) {
|
|
132
|
+
if (typeof value === 'string') {
|
|
133
|
+
return ['next', 'previous', 'first', 'last', 'select', 'activate'].includes(value);
|
|
134
|
+
}
|
|
135
|
+
return typeof value === 'object' && value !== null
|
|
136
|
+
&& 'type' in value && 'id' in value && typeof value.id === 'string'
|
|
137
|
+
&& (value.type === 'focus' || value.type === 'select' || value.type === 'activate');
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=linear-choice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear-choice.js","sourceRoot":"","sources":["../../../src/internal/composites/linear-choice.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { BoundaryPolicy, Result, StableID } from '../../shared.js';
|
|
2
|
+
import type { Sequence } from '../../structures/sequence.js';
|
|
3
|
+
import { type CursorState } from '../state/cursor.js';
|
|
4
|
+
import { type SelectionMode, type SelectionSnapshotInput, type SelectionState } from '../state/selection.js';
|
|
5
|
+
export type ListboxSelectionMode = SelectionMode;
|
|
6
|
+
export type ListboxEvent<ID extends StableID = StableID> = 'next' | 'previous' | 'first' | 'last' | 'toggle' | 'activate' | 'clear' | {
|
|
7
|
+
readonly type: 'focus';
|
|
8
|
+
readonly id: ID;
|
|
9
|
+
} | {
|
|
10
|
+
readonly type: 'toggle';
|
|
11
|
+
readonly id: ID;
|
|
12
|
+
} | {
|
|
13
|
+
readonly type: 'activate';
|
|
14
|
+
readonly id: ID;
|
|
15
|
+
};
|
|
16
|
+
export type ListboxCommand<ID extends StableID = StableID> = {
|
|
17
|
+
readonly type: 'focus';
|
|
18
|
+
readonly id: ID;
|
|
19
|
+
} | {
|
|
20
|
+
readonly type: 'activate';
|
|
21
|
+
readonly id: ID;
|
|
22
|
+
};
|
|
23
|
+
export interface ListboxState<ID extends StableID = StableID> {
|
|
24
|
+
readonly cursor: CursorState<ID>;
|
|
25
|
+
readonly selection: SelectionState<ID>;
|
|
26
|
+
}
|
|
27
|
+
export interface ListboxStateInput<ID extends StableID = StableID> extends SelectionSnapshotInput<ID> {
|
|
28
|
+
readonly current?: ID | null;
|
|
29
|
+
}
|
|
30
|
+
export interface ListboxPolicies<ID extends StableID = StableID> {
|
|
31
|
+
readonly selectionMode?: SelectionMode;
|
|
32
|
+
readonly eligible?: (id: ID) => boolean;
|
|
33
|
+
readonly selectionFollowsFocus?: boolean;
|
|
34
|
+
readonly boundary?: BoundaryPolicy;
|
|
35
|
+
readonly maxScan?: number;
|
|
36
|
+
}
|
|
37
|
+
export interface ListboxUpdate<ID extends StableID = StableID> {
|
|
38
|
+
readonly state: ListboxState<ID>;
|
|
39
|
+
readonly commands: readonly ListboxCommand<ID>[];
|
|
40
|
+
}
|
|
41
|
+
export declare function createListboxState<ID extends StableID>(domain: Sequence<ID>, input?: ListboxStateInput<ID>, selectionMode?: SelectionMode): Result<ListboxState<ID>>;
|
|
42
|
+
export declare function applyListboxEvent<ID extends StableID>(domain: Sequence<ID>, state: ListboxState<ID>, event: ListboxEvent<ID>, policies?: ListboxPolicies<ID>): Result<ListboxUpdate<ID>>;
|
|
43
|
+
export interface ListboxTypeaheadOptions<ID extends StableID = StableID> {
|
|
44
|
+
readonly textValue: (id: ID) => string;
|
|
45
|
+
readonly eligible?: (id: ID) => boolean;
|
|
46
|
+
readonly normalize?: (text: string) => string;
|
|
47
|
+
readonly maxScan?: number;
|
|
48
|
+
}
|
|
49
|
+
export declare function findListboxTypeaheadMatch<ID extends StableID>(domain: Sequence<ID>, current: ID | null, query: string, options: ListboxTypeaheadOptions<ID>): Result<ID | null>;
|
|
50
|
+
//# sourceMappingURL=listbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listbox.d.ts","sourceRoot":"","sources":["../../../src/internal/composites/listbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { createCursorState } from '../state/cursor.js';
|
|
2
|
+
import { fail, ok } from '../kernel/foundation.js';
|
|
3
|
+
import { findEligibleFromEdge } from '../kernel/indexed-sequence.js';
|
|
4
|
+
import { createMachineUpdate } from '../kernel/machine.js';
|
|
5
|
+
import { clearSelection, createSelectionState, selectOne, toggleMultipleSelection, } from '../state/selection.js';
|
|
6
|
+
export function createListboxState(domain, input = {}, selectionMode = 'multiple') {
|
|
7
|
+
const current = input.current ?? null;
|
|
8
|
+
if (current !== null && !domain.contains(current)) {
|
|
9
|
+
return fail('construction', 'listbox-cursor-outside-domain', 'Listbox cursor must exist in the sequence domain.', { current });
|
|
10
|
+
}
|
|
11
|
+
const selection = createSelectionState(domain, selectionMode, input);
|
|
12
|
+
if (!selection.ok)
|
|
13
|
+
return selection;
|
|
14
|
+
return ok(listboxState(createCursorState(current), selection.value));
|
|
15
|
+
}
|
|
16
|
+
export function applyListboxEvent(domain, state, event, policies = {}) {
|
|
17
|
+
const stateError = validateListboxState(domain, state);
|
|
18
|
+
if (stateError !== null)
|
|
19
|
+
return { ok: false, error: stateError };
|
|
20
|
+
if (!isListboxEvent(event)) {
|
|
21
|
+
return fail('transition-rejection', 'invalid-listbox-event', 'Listbox event must be next, previous, first, last, toggle, activate, or clear.', { event });
|
|
22
|
+
}
|
|
23
|
+
const boundary = policies.boundary ?? 'stop';
|
|
24
|
+
if (boundary !== 'stop' && boundary !== 'wrap') {
|
|
25
|
+
return fail('transition-rejection', 'invalid-listbox-boundary', 'Listbox boundary must be stop or wrap.', { boundary });
|
|
26
|
+
}
|
|
27
|
+
const selectionFollowsFocus = policies.selectionFollowsFocus ?? false;
|
|
28
|
+
if (typeof selectionFollowsFocus !== 'boolean') {
|
|
29
|
+
return fail('transition-rejection', 'invalid-selection-follows-focus', 'selectionFollowsFocus must be boolean.', { selectionFollowsFocus });
|
|
30
|
+
}
|
|
31
|
+
if (policies.eligible !== undefined && typeof policies.eligible !== 'function') {
|
|
32
|
+
return fail('transition-rejection', 'invalid-eligibility-policy', 'Listbox eligibility policy must be a function.');
|
|
33
|
+
}
|
|
34
|
+
const selectionMode = policies.selectionMode ?? 'multiple';
|
|
35
|
+
if (selectionMode !== 'single' && selectionMode !== 'multiple') {
|
|
36
|
+
return fail('transition-rejection', 'invalid-selection-mode', 'Listbox selection mode must be single or multiple.', { selectionMode });
|
|
37
|
+
}
|
|
38
|
+
if (selectionMode === 'single' && state.selection.size > 1) {
|
|
39
|
+
return fail('transition-rejection', 'invalid-selection-cardinality', 'Single-selection listbox state permits at most one selected identity.', { selectedCount: state.selection.size });
|
|
40
|
+
}
|
|
41
|
+
if (typeof event === 'object') {
|
|
42
|
+
if (!domain.contains(event.id) || policies.eligible?.(event.id) === false) {
|
|
43
|
+
return fail('transition-rejection', 'listbox-target-unavailable', 'Direct listbox events require an eligible identity in the domain.', { id: event.id });
|
|
44
|
+
}
|
|
45
|
+
if (event.type === 'focus') {
|
|
46
|
+
const selection = selectionFollowsFocus
|
|
47
|
+
? selectOne(state.selection, event.id, domain)
|
|
48
|
+
: state.selection;
|
|
49
|
+
return createMachineUpdate(listboxState(createCursorState(event.id), selection), [{ type: 'focus', id: event.id }]);
|
|
50
|
+
}
|
|
51
|
+
if (event.type === 'toggle') {
|
|
52
|
+
return createMachineUpdate(listboxState(createCursorState(event.id), selectForMode(state.selection, event.id, domain, selectionMode)), [{ type: 'focus', id: event.id }]);
|
|
53
|
+
}
|
|
54
|
+
return createMachineUpdate(listboxState(createCursorState(event.id), selectOne(state.selection, event.id, domain)), [{ type: 'focus', id: event.id }, { type: 'activate', id: event.id }]);
|
|
55
|
+
}
|
|
56
|
+
switch (event) {
|
|
57
|
+
case 'next':
|
|
58
|
+
return moveListbox(domain, state, 1, boundary, selectionFollowsFocus, policies);
|
|
59
|
+
case 'previous':
|
|
60
|
+
return moveListbox(domain, state, -1, boundary, selectionFollowsFocus, policies);
|
|
61
|
+
case 'first':
|
|
62
|
+
return moveListboxToEdge(domain, state, 1, selectionFollowsFocus, policies);
|
|
63
|
+
case 'last':
|
|
64
|
+
return moveListboxToEdge(domain, state, -1, selectionFollowsFocus, policies);
|
|
65
|
+
case 'toggle': {
|
|
66
|
+
const current = state.cursor.current;
|
|
67
|
+
if (current === null)
|
|
68
|
+
return noCursor();
|
|
69
|
+
return createMachineUpdate(listboxState(state.cursor, selectForMode(state.selection, current, domain, selectionMode)));
|
|
70
|
+
}
|
|
71
|
+
case 'activate': {
|
|
72
|
+
const current = state.cursor.current;
|
|
73
|
+
if (current === null)
|
|
74
|
+
return noCursor();
|
|
75
|
+
return createMachineUpdate(listboxState(state.cursor, selectOne(state.selection, current, domain)), [{ type: 'activate', id: current }]);
|
|
76
|
+
}
|
|
77
|
+
case 'clear': {
|
|
78
|
+
const selection = clearSelection(state.selection);
|
|
79
|
+
return createMachineUpdate(selection === state.selection ? state : listboxState(state.cursor, selection));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export function findListboxTypeaheadMatch(domain, current, query, options) {
|
|
84
|
+
if (typeof query !== 'string' || query.length === 0)
|
|
85
|
+
return ok(null);
|
|
86
|
+
if (typeof options.textValue !== 'function') {
|
|
87
|
+
return fail('transition-rejection', 'invalid-typeahead-text-value', 'Listbox typeahead requires a textValue function.');
|
|
88
|
+
}
|
|
89
|
+
if (options.eligible !== undefined && typeof options.eligible !== 'function') {
|
|
90
|
+
return fail('transition-rejection', 'invalid-eligibility-policy', 'Listbox typeahead eligibility must be a function.');
|
|
91
|
+
}
|
|
92
|
+
if (options.normalize !== undefined && typeof options.normalize !== 'function') {
|
|
93
|
+
return fail('transition-rejection', 'invalid-typeahead-normalizer', 'Listbox typeahead normalize must be a function.');
|
|
94
|
+
}
|
|
95
|
+
if (options.maxScan !== undefined
|
|
96
|
+
&& (!Number.isSafeInteger(options.maxScan) || options.maxScan < 0)) {
|
|
97
|
+
return fail('resource-rejection', 'invalid-scan-ceiling', 'Listbox typeahead maxScan must be a non-negative safe integer.');
|
|
98
|
+
}
|
|
99
|
+
if (current !== null && !domain.contains(current)) {
|
|
100
|
+
return fail('transition-rejection', 'listbox-cursor-outside-domain', 'Listbox typeahead cursor must exist in the sequence domain.', { current });
|
|
101
|
+
}
|
|
102
|
+
const normalize = options.normalize ?? ((text) => text.toLowerCase());
|
|
103
|
+
const needle = normalize(query);
|
|
104
|
+
if (needle.length === 0 || domain.size === 0)
|
|
105
|
+
return ok(null);
|
|
106
|
+
const eligible = options.eligible ?? (() => true);
|
|
107
|
+
const maxScan = options.maxScan ?? Number.MAX_SAFE_INTEGER;
|
|
108
|
+
const start = current === null ? 0 : (domain.indexOf(current) + 1) % domain.size;
|
|
109
|
+
let scanned = 0;
|
|
110
|
+
for (let offset = 0; offset < domain.size; offset += 1) {
|
|
111
|
+
if (scanned === maxScan) {
|
|
112
|
+
return fail('resource-rejection', 'scan-ceiling-reached', 'Listbox typeahead reached maxScan before its result was determined.', { maxScan });
|
|
113
|
+
}
|
|
114
|
+
const id = domain.at((start + offset) % domain.size);
|
|
115
|
+
scanned += 1;
|
|
116
|
+
if (id !== null && eligible(id) && normalize(options.textValue(id)).startsWith(needle)) {
|
|
117
|
+
return ok(id);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return ok(null);
|
|
121
|
+
}
|
|
122
|
+
function moveListbox(domain, state, direction, boundary, selectionFollowsFocus, policies) {
|
|
123
|
+
const eligible = policies.eligible ?? (() => true);
|
|
124
|
+
const current = state.cursor.current;
|
|
125
|
+
let target;
|
|
126
|
+
if (current === null) {
|
|
127
|
+
const initial = findEligibleFromEdge(domain, direction, {
|
|
128
|
+
eligible,
|
|
129
|
+
...(policies.maxScan === undefined ? {} : { maxScan: policies.maxScan }),
|
|
130
|
+
});
|
|
131
|
+
if (!initial.ok)
|
|
132
|
+
return initial;
|
|
133
|
+
target = initial.value;
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
const movement = domain.move(current, direction, boundary, {
|
|
137
|
+
eligible,
|
|
138
|
+
...(policies.maxScan === undefined ? {} : { maxScan: policies.maxScan }),
|
|
139
|
+
});
|
|
140
|
+
if (movement.kind === 'resource-rejected')
|
|
141
|
+
return { ok: false, error: movement.error };
|
|
142
|
+
target = movement.kind === 'found' ? movement.id : null;
|
|
143
|
+
}
|
|
144
|
+
if (target === null)
|
|
145
|
+
return createMachineUpdate(state);
|
|
146
|
+
const cursor = createCursorState(target);
|
|
147
|
+
const selection = selectionFollowsFocus
|
|
148
|
+
? selectOne(state.selection, target, domain)
|
|
149
|
+
: state.selection;
|
|
150
|
+
return createMachineUpdate(listboxState(cursor, selection), [{ type: 'focus', id: target }]);
|
|
151
|
+
}
|
|
152
|
+
function moveListboxToEdge(domain, state, direction, selectionFollowsFocus, policies) {
|
|
153
|
+
const target = findEligibleFromEdge(domain, direction, {
|
|
154
|
+
eligible: policies.eligible ?? (() => true),
|
|
155
|
+
...(policies.maxScan === undefined ? {} : { maxScan: policies.maxScan }),
|
|
156
|
+
});
|
|
157
|
+
if (!target.ok)
|
|
158
|
+
return target;
|
|
159
|
+
if (target.value === null || target.value === state.cursor.current) {
|
|
160
|
+
return createMachineUpdate(state);
|
|
161
|
+
}
|
|
162
|
+
return createMachineUpdate(listboxState(createCursorState(target.value), selectionFollowsFocus ? selectOne(state.selection, target.value, domain) : state.selection), [{ type: 'focus', id: target.value }]);
|
|
163
|
+
}
|
|
164
|
+
function selectForMode(state, id, domain, selectionMode) {
|
|
165
|
+
return selectionMode === 'single'
|
|
166
|
+
? selectOne(state, id, domain)
|
|
167
|
+
: toggleMultipleSelection(state, id, domain);
|
|
168
|
+
}
|
|
169
|
+
function validateListboxState(domain, state) {
|
|
170
|
+
if (state.cursor.current !== null && !domain.contains(state.cursor.current)) {
|
|
171
|
+
return {
|
|
172
|
+
class: 'transition-rejection',
|
|
173
|
+
code: 'listbox-cursor-outside-domain',
|
|
174
|
+
message: 'Listbox cursor must exist in the sequence domain.',
|
|
175
|
+
details: { current: state.cursor.current },
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
const unique = new Set(state.selection.selected);
|
|
179
|
+
if (unique.size !== state.selection.selected.length || state.selection.size !== unique.size) {
|
|
180
|
+
return {
|
|
181
|
+
class: 'transition-rejection',
|
|
182
|
+
code: 'invalid-listbox-selection',
|
|
183
|
+
message: 'Listbox selection must contain unique identities with a matching size.',
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
let previousIndex = -1;
|
|
187
|
+
for (const id of unique) {
|
|
188
|
+
const index = domain.indexOf(id);
|
|
189
|
+
if (index === null) {
|
|
190
|
+
return {
|
|
191
|
+
class: 'transition-rejection',
|
|
192
|
+
code: 'listbox-selection-outside-domain',
|
|
193
|
+
message: 'Listbox selection identities must exist in the sequence domain.',
|
|
194
|
+
details: { id },
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
if (index <= previousIndex || !state.selection.has(id)) {
|
|
198
|
+
return {
|
|
199
|
+
class: 'transition-rejection',
|
|
200
|
+
code: 'invalid-listbox-selection',
|
|
201
|
+
message: 'Listbox selection observations must match canonical sequence order.',
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
previousIndex = index;
|
|
205
|
+
}
|
|
206
|
+
for (const id of domain.ids) {
|
|
207
|
+
if (state.selection.has(id) !== unique.has(id)) {
|
|
208
|
+
return {
|
|
209
|
+
class: 'transition-rejection',
|
|
210
|
+
code: 'invalid-listbox-selection',
|
|
211
|
+
message: 'Listbox selection membership observations must agree.',
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (state.selection.anchor !== null && !domain.contains(state.selection.anchor)) {
|
|
216
|
+
return {
|
|
217
|
+
class: 'transition-rejection',
|
|
218
|
+
code: 'listbox-anchor-outside-domain',
|
|
219
|
+
message: 'Listbox selection anchor must exist in the sequence domain.',
|
|
220
|
+
details: { anchor: state.selection.anchor },
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
function listboxState(cursor, selection) {
|
|
226
|
+
return Object.freeze({ cursor, selection });
|
|
227
|
+
}
|
|
228
|
+
function noCursor() {
|
|
229
|
+
return fail('transition-rejection', 'no-cursor', 'Listbox toggle and activate require a current cursor.');
|
|
230
|
+
}
|
|
231
|
+
function isListboxEvent(value) {
|
|
232
|
+
return typeof value === 'string' ? (value === 'next' ||
|
|
233
|
+
value === 'previous' ||
|
|
234
|
+
value === 'first' ||
|
|
235
|
+
value === 'last' ||
|
|
236
|
+
value === 'toggle' ||
|
|
237
|
+
value === 'activate' ||
|
|
238
|
+
value === 'clear') : typeof value === 'object' && value !== null
|
|
239
|
+
&& 'type' in value && 'id' in value
|
|
240
|
+
&& (value.type === 'focus' || value.type === 'toggle' || value.type === 'activate')
|
|
241
|
+
&& typeof value.id === 'string';
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=listbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listbox.js","sourceRoot":"","sources":["../../../src/internal/composites/listbox.ts"],"names":[],"mappings":"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"}
|