@sectile/core 0.7.0 → 0.8.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/dist/accordion.d.ts +0 -1
- package/dist/adapter-runtime.d.ts +53 -2
- package/dist/adapter-runtime.js +224 -25
- package/dist/adapter-runtime.js.map +1 -1
- package/dist/alert-dialog.d.ts +0 -1
- package/dist/carousel.d.ts +0 -1
- package/dist/cascade-list.d.ts +16 -0
- package/dist/cascade-list.js +33 -0
- package/dist/cascade-list.js.map +1 -0
- package/dist/cascade-select.d.ts +0 -1
- package/dist/cascade-select.js +47 -119
- package/dist/cascade-select.js.map +1 -1
- package/dist/checkbox-group.d.ts +0 -1
- package/dist/checkbox.d.ts +0 -1
- package/dist/collection-window.d.ts +0 -1
- package/dist/color-picker.d.ts +3 -8
- package/dist/color-picker.js +60 -305
- package/dist/color-picker.js.map +1 -1
- package/dist/combobox.d.ts +0 -1
- package/dist/dialog.d.ts +0 -1
- package/dist/disclosure.d.ts +0 -1
- package/dist/drawer.d.ts +0 -1
- package/dist/editable.d.ts +0 -1
- package/dist/editing/color-text.d.ts +7 -0
- package/dist/editing/color-text.js +199 -0
- package/dist/editing/color-text.js.map +1 -0
- package/dist/error-code.d.ts +1 -2
- package/dist/feed.d.ts +0 -1
- package/dist/grid-control.d.ts +3 -0
- package/dist/grid-control.js +2 -0
- package/dist/grid-control.js.map +1 -0
- package/dist/identity.d.ts +10 -0
- package/dist/identity.js +16 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/interaction.d.ts +0 -1
- package/dist/internal/composites/cascade-choice.d.ts +54 -0
- package/dist/internal/composites/cascade-choice.js +154 -0
- package/dist/internal/composites/cascade-choice.js.map +1 -0
- package/dist/internal/composites/combobox.d.ts +0 -1
- package/dist/internal/composites/combobox.js +28 -11
- package/dist/internal/composites/combobox.js.map +1 -1
- package/dist/internal/composites/grid-control.d.ts +0 -1
- package/dist/internal/composites/grid-control.js +18 -23
- package/dist/internal/composites/grid-control.js.map +1 -1
- package/dist/internal/composites/linear-action.d.ts +0 -1
- package/dist/internal/composites/linear-action.js +20 -14
- package/dist/internal/composites/linear-action.js.map +1 -1
- package/dist/internal/composites/linear-choice.d.ts +0 -1
- package/dist/internal/composites/linear-choice.js +15 -8
- package/dist/internal/composites/linear-choice.js.map +1 -1
- package/dist/internal/composites/listbox.d.ts +0 -1
- package/dist/internal/composites/listbox.js +15 -13
- package/dist/internal/composites/listbox.js.map +1 -1
- package/dist/internal/composites/menu.d.ts +0 -1
- package/dist/internal/composites/menu.js +38 -17
- package/dist/internal/composites/menu.js.map +1 -1
- package/dist/internal/composites/popup.d.ts +0 -1
- package/dist/internal/composites/slider.d.ts +0 -1
- package/dist/internal/composites/tree-grid.d.ts +0 -1
- package/dist/internal/composites/tree-grid.js +70 -48
- package/dist/internal/composites/tree-grid.js.map +1 -1
- package/dist/internal/composites/tree-view.d.ts +0 -1
- package/dist/internal/composites/tree-view.js +32 -20
- package/dist/internal/composites/tree-view.js.map +1 -1
- package/dist/internal/editing/text.d.ts +0 -1
- package/dist/internal/editing/text.js +40 -27
- package/dist/internal/editing/text.js.map +1 -1
- package/dist/internal/kernel/bounded-scalar.d.ts +31 -0
- package/dist/internal/kernel/bounded-scalar.js +78 -0
- package/dist/internal/kernel/bounded-scalar.js.map +1 -0
- package/dist/internal/kernel/decimal.d.ts +0 -1
- package/dist/internal/kernel/exact-ratio.d.ts +5 -0
- package/dist/internal/kernel/exact-ratio.js +2 -0
- package/dist/internal/kernel/exact-ratio.js.map +1 -0
- package/dist/internal/kernel/foundation.d.ts +8 -6
- package/dist/internal/kernel/foundation.js +35 -16
- package/dist/internal/kernel/foundation.js.map +1 -1
- package/dist/internal/kernel/indexed-sequence.d.ts +28 -3
- package/dist/internal/kernel/indexed-sequence.js +162 -12
- package/dist/internal/kernel/indexed-sequence.js.map +1 -1
- package/dist/internal/kernel/machine.d.ts +1 -2
- package/dist/internal/kernel/machine.js +5 -2
- package/dist/internal/kernel/machine.js.map +1 -1
- package/dist/internal/runtime/revision.d.ts +0 -1
- package/dist/internal/state/checked.d.ts +0 -1
- package/dist/internal/state/cursor.d.ts +0 -1
- package/dist/internal/state/expansion.d.ts +0 -1
- package/dist/internal/state/open-state.d.ts +0 -1
- package/dist/internal/state/selection.d.ts +0 -1
- package/dist/internal/state/selection.js +99 -27
- package/dist/internal/state/selection.js.map +1 -1
- package/dist/layer-stack.d.ts +0 -1
- package/dist/listbox.d.ts +0 -1
- package/dist/menu-button.d.ts +0 -1
- package/dist/menu.d.ts +0 -1
- package/dist/menubar.d.ts +0 -1
- package/dist/meter-group.d.ts +38 -0
- package/dist/meter-group.js +103 -0
- package/dist/meter-group.js.map +1 -0
- package/dist/meter.d.ts +25 -0
- package/dist/meter.js +89 -0
- package/dist/meter.js.map +1 -0
- package/dist/multi-thumb-slider.d.ts +0 -1
- package/dist/navigation-menu.d.ts +0 -1
- package/dist/number-field.d.ts +0 -1
- package/dist/pagination.d.ts +0 -1
- package/dist/pin-input.d.ts +0 -1
- package/dist/popover.d.ts +0 -1
- package/dist/progress.d.ts +17 -0
- package/dist/progress.js +49 -0
- package/dist/progress.js.map +1 -0
- package/dist/quantity-field.d.ts +0 -1
- package/dist/radio-group.d.ts +0 -1
- package/dist/rating.d.ts +0 -1
- package/dist/reorder.d.ts +0 -1
- package/dist/reorder.js +92 -43
- package/dist/reorder.js.map +1 -1
- package/dist/result.d.ts +2 -1
- package/dist/result.js +14 -0
- package/dist/result.js.map +1 -1
- package/dist/revision.d.ts +1 -1
- package/dist/revision.js +1 -0
- package/dist/revision.js.map +1 -1
- package/dist/select.d.ts +0 -1
- package/dist/selection.d.ts +24 -0
- package/dist/selection.js +20 -0
- package/dist/selection.js.map +1 -0
- package/dist/shared.d.ts +0 -1
- package/dist/slider.d.ts +0 -1
- package/dist/spin-button.d.ts +0 -1
- package/dist/stepper.d.ts +0 -1
- package/dist/structures/anchored-layout.d.ts +33 -0
- package/dist/structures/anchored-layout.js +158 -0
- package/dist/structures/anchored-layout.js.map +1 -0
- package/dist/structures/color.d.ts +80 -0
- package/dist/structures/color.js +206 -0
- package/dist/structures/color.js.map +1 -0
- package/dist/structures/geometry.d.ts +53 -0
- package/dist/structures/geometry.js +165 -0
- package/dist/structures/geometry.js.map +1 -0
- package/dist/structures/grid.d.ts +20 -4
- package/dist/structures/grid.js +91 -50
- package/dist/structures/grid.js.map +1 -1
- package/dist/structures/index-span.d.ts +31 -0
- package/dist/structures/index-span.js +267 -0
- package/dist/structures/index-span.js.map +1 -0
- package/dist/structures/metric-index.d.ts +36 -0
- package/dist/structures/metric-index.js +390 -0
- package/dist/structures/metric-index.js.map +1 -0
- package/dist/structures/range.d.ts +21 -4
- package/dist/structures/range.js +156 -11
- package/dist/structures/range.js.map +1 -1
- package/dist/structures/selection-expression.d.ts +26 -0
- package/dist/structures/selection-expression.js +157 -0
- package/dist/structures/selection-expression.js.map +1 -0
- package/dist/structures/sequence.d.ts +0 -1
- package/dist/structures/sequence.js +69 -7
- package/dist/structures/sequence.js.map +1 -1
- package/dist/structures/tree.d.ts +5 -1
- package/dist/structures/tree.js +33 -5
- package/dist/structures/tree.js.map +1 -1
- package/dist/switch.d.ts +0 -1
- package/dist/tabs.d.ts +0 -1
- package/dist/tags-input.d.ts +0 -1
- package/dist/text.d.ts +0 -1
- package/dist/timer.d.ts +0 -1
- package/dist/toast.d.ts +2 -2
- package/dist/toast.js +3 -1
- package/dist/toast.js.map +1 -1
- package/dist/toggle-button.d.ts +0 -1
- package/dist/toggle-group.d.ts +0 -1
- package/dist/toolbar.d.ts +0 -1
- package/dist/tooltip.d.ts +0 -1
- package/dist/tree-grid.d.ts +0 -1
- package/dist/tree-view.d.ts +0 -1
- package/dist/units.d.ts +0 -1
- package/dist/window-splitter.d.ts +0 -1
- package/package.json +75 -12
- package/dist/accordion.d.ts.map +0 -1
- package/dist/adapter-runtime.d.ts.map +0 -1
- package/dist/alert-dialog.d.ts.map +0 -1
- package/dist/carousel.d.ts.map +0 -1
- package/dist/cascade-select.d.ts.map +0 -1
- package/dist/checkbox-group.d.ts.map +0 -1
- package/dist/checkbox.d.ts.map +0 -1
- package/dist/collection-window.d.ts.map +0 -1
- package/dist/color-picker.d.ts.map +0 -1
- package/dist/combobox.d.ts.map +0 -1
- package/dist/dialog.d.ts.map +0 -1
- package/dist/disclosure.d.ts.map +0 -1
- package/dist/drawer.d.ts.map +0 -1
- package/dist/editable.d.ts.map +0 -1
- package/dist/error-code.d.ts.map +0 -1
- package/dist/feed.d.ts.map +0 -1
- package/dist/form.d.ts +0 -135
- package/dist/form.d.ts.map +0 -1
- package/dist/form.js +0 -627
- package/dist/form.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/interaction.d.ts.map +0 -1
- package/dist/internal/composites/combobox.d.ts.map +0 -1
- package/dist/internal/composites/grid-control.d.ts.map +0 -1
- package/dist/internal/composites/linear-action.d.ts.map +0 -1
- package/dist/internal/composites/linear-choice.d.ts.map +0 -1
- package/dist/internal/composites/listbox.d.ts.map +0 -1
- package/dist/internal/composites/menu.d.ts.map +0 -1
- package/dist/internal/composites/popup.d.ts.map +0 -1
- package/dist/internal/composites/slider.d.ts.map +0 -1
- package/dist/internal/composites/tree-grid.d.ts.map +0 -1
- package/dist/internal/composites/tree-view.d.ts.map +0 -1
- package/dist/internal/editing/text.d.ts.map +0 -1
- package/dist/internal/kernel/decimal.d.ts.map +0 -1
- package/dist/internal/kernel/foundation.d.ts.map +0 -1
- package/dist/internal/kernel/indexed-sequence.d.ts.map +0 -1
- package/dist/internal/kernel/machine.d.ts.map +0 -1
- package/dist/internal/runtime/revision.d.ts.map +0 -1
- package/dist/internal/state/checked.d.ts.map +0 -1
- package/dist/internal/state/cursor.d.ts.map +0 -1
- package/dist/internal/state/expansion.d.ts.map +0 -1
- package/dist/internal/state/open-state.d.ts.map +0 -1
- package/dist/internal/state/selection.d.ts.map +0 -1
- package/dist/layer-stack.d.ts.map +0 -1
- package/dist/listbox.d.ts.map +0 -1
- package/dist/menu-button.d.ts.map +0 -1
- package/dist/menu.d.ts.map +0 -1
- package/dist/menubar.d.ts.map +0 -1
- package/dist/multi-thumb-slider.d.ts.map +0 -1
- package/dist/navigation-menu.d.ts.map +0 -1
- package/dist/number-field.d.ts.map +0 -1
- package/dist/pagination.d.ts.map +0 -1
- package/dist/pin-input.d.ts.map +0 -1
- package/dist/popover.d.ts.map +0 -1
- package/dist/quantity-field.d.ts.map +0 -1
- package/dist/radio-group.d.ts.map +0 -1
- package/dist/rating.d.ts.map +0 -1
- package/dist/reorder.d.ts.map +0 -1
- package/dist/result.d.ts.map +0 -1
- package/dist/revision.d.ts.map +0 -1
- package/dist/select.d.ts.map +0 -1
- package/dist/shared.d.ts.map +0 -1
- package/dist/slider.d.ts.map +0 -1
- package/dist/spin-button.d.ts.map +0 -1
- package/dist/stepper.d.ts.map +0 -1
- package/dist/structures/grid.d.ts.map +0 -1
- package/dist/structures/range.d.ts.map +0 -1
- package/dist/structures/sequence.d.ts.map +0 -1
- package/dist/structures/tree.d.ts.map +0 -1
- package/dist/switch.d.ts.map +0 -1
- package/dist/tabs.d.ts.map +0 -1
- package/dist/tags-input.d.ts.map +0 -1
- package/dist/text.d.ts.map +0 -1
- package/dist/timer.d.ts.map +0 -1
- package/dist/toast.d.ts.map +0 -1
- package/dist/toggle-button.d.ts.map +0 -1
- package/dist/toggle-group.d.ts.map +0 -1
- package/dist/toolbar.d.ts.map +0 -1
- package/dist/tooltip.d.ts.map +0 -1
- package/dist/tree-grid.d.ts.map +0 -1
- package/dist/tree-view.d.ts.map +0 -1
- package/dist/units.d.ts.map +0 -1
- package/dist/window-splitter.d.ts.map +0 -1
|
@@ -3,10 +3,14 @@ class ImmutableSelectionState {
|
|
|
3
3
|
selected;
|
|
4
4
|
anchor;
|
|
5
5
|
#selected;
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
#domain;
|
|
7
|
+
#indexes;
|
|
8
|
+
constructor(selected, indexes, anchor, domain) {
|
|
9
|
+
this.selected = Object.isFrozen(selected) ? selected : freezeArray(selected);
|
|
8
10
|
this.anchor = anchor;
|
|
9
11
|
this.#selected = new Set(this.selected);
|
|
12
|
+
this.#domain = domain;
|
|
13
|
+
this.#indexes = Object.isFrozen(indexes) ? indexes : freezeArray(indexes);
|
|
10
14
|
Object.freeze(this);
|
|
11
15
|
}
|
|
12
16
|
get size() {
|
|
@@ -15,6 +19,9 @@ class ImmutableSelectionState {
|
|
|
15
19
|
has(id) {
|
|
16
20
|
return this.#selected.has(id);
|
|
17
21
|
}
|
|
22
|
+
indexesFor(domain) {
|
|
23
|
+
return this.#domain === domain ? this.#indexes : null;
|
|
24
|
+
}
|
|
18
25
|
}
|
|
19
26
|
export function createSelectionState(domain, mode, input = {}) {
|
|
20
27
|
if (!isSelectionMode(mode)) {
|
|
@@ -26,16 +33,19 @@ export function createSelectionState(domain, mode, input = {}) {
|
|
|
26
33
|
if (mode === 'single' && requested.size > 1) {
|
|
27
34
|
return fail('construction', 'invalid-selection-cardinality', 'Single selection must contain at most one identity.', { selectedCount: requested.size });
|
|
28
35
|
}
|
|
36
|
+
const indexed = [];
|
|
29
37
|
for (const id of requested) {
|
|
30
|
-
|
|
38
|
+
const index = domain.indexOf(id);
|
|
39
|
+
if (index === null) {
|
|
31
40
|
return fail('construction', 'selected-id-outside-domain', 'Every selected identity must exist in the selection domain.', { id });
|
|
32
41
|
}
|
|
42
|
+
indexed.push([index, id]);
|
|
33
43
|
}
|
|
34
44
|
const anchor = input.anchor ?? null;
|
|
35
45
|
if (anchor !== null && !domain.contains(anchor)) {
|
|
36
46
|
return fail('construction', 'selection-anchor-outside-domain', 'Selection anchor must exist in the selection domain.', { anchor });
|
|
37
47
|
}
|
|
38
|
-
return ok(
|
|
48
|
+
return ok(selectionFromIndexed(domain, indexed, anchor));
|
|
39
49
|
}
|
|
40
50
|
export function reconcileSelection(state, domain, mode) {
|
|
41
51
|
if (!isSelectionMode(mode)) {
|
|
@@ -45,59 +55,121 @@ export function reconcileSelection(state, domain, mode) {
|
|
|
45
55
|
if (mode === 'single' && selected.size > 1) {
|
|
46
56
|
return fail('transition-rejection', 'invalid-selection-cardinality', 'A multiple selection snapshot cannot be reconciled in single mode.', { selectedCount: selected.size });
|
|
47
57
|
}
|
|
58
|
+
const indexed = [];
|
|
48
59
|
for (const id of selected) {
|
|
49
|
-
|
|
50
|
-
|
|
60
|
+
const index = domain.indexOf(id);
|
|
61
|
+
if (index !== null)
|
|
62
|
+
indexed.push([index, id]);
|
|
51
63
|
}
|
|
52
64
|
const anchor = state.anchor !== null && domain.contains(state.anchor) ? state.anchor : null;
|
|
53
|
-
const result =
|
|
65
|
+
const result = selectionFromIndexed(domain, indexed, anchor);
|
|
54
66
|
return ok(sameSelection(state, result) ? state : result);
|
|
55
67
|
}
|
|
56
68
|
export function selectOne(state, id, domain) {
|
|
57
|
-
|
|
69
|
+
const index = domain.indexOf(id);
|
|
70
|
+
if (index === null)
|
|
58
71
|
return state;
|
|
59
72
|
if (state.size === 1 && state.has(id) && state.anchor === id)
|
|
60
73
|
return state;
|
|
61
|
-
return new ImmutableSelectionState([id], id);
|
|
74
|
+
return new ImmutableSelectionState([id], [index], id, domain);
|
|
62
75
|
}
|
|
63
76
|
export function toggleMultipleSelection(state, id, domain) {
|
|
64
|
-
|
|
77
|
+
const domainIndex = domain.indexOf(id);
|
|
78
|
+
if (domainIndex === null)
|
|
65
79
|
return state;
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
80
|
+
const canonical = canonicalSelection(state, domain);
|
|
81
|
+
const position = lowerBound(canonical.indexes, domainIndex);
|
|
82
|
+
const selected = [...canonical.selected];
|
|
83
|
+
const indexes = [...canonical.indexes];
|
|
84
|
+
if (indexes[position] === domainIndex) {
|
|
85
|
+
selected.splice(position, 1);
|
|
86
|
+
indexes.splice(position, 1);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
selected.splice(position, 0, id);
|
|
90
|
+
indexes.splice(position, 0, domainIndex);
|
|
91
|
+
}
|
|
92
|
+
return new ImmutableSelectionState(Object.freeze(selected), Object.freeze(indexes), id, domain);
|
|
72
93
|
}
|
|
73
94
|
export function clearSelection(state) {
|
|
74
95
|
return state.size === 0 && state.anchor === null
|
|
75
96
|
? state
|
|
76
|
-
: new ImmutableSelectionState([], null);
|
|
97
|
+
: new ImmutableSelectionState(Object.freeze([]), Object.freeze([]), null, null);
|
|
77
98
|
}
|
|
78
99
|
export function selectInterval(state, anchor, extent, domain, additive) {
|
|
79
100
|
const anchorIndex = domain.indexOf(anchor);
|
|
80
101
|
const extentIndex = domain.indexOf(extent);
|
|
81
102
|
if (anchorIndex === null || extentIndex === null)
|
|
82
103
|
return state;
|
|
83
|
-
const selected = additive ? new Set(state.selected) : new Set();
|
|
84
104
|
const start = Math.min(anchorIndex, extentIndex);
|
|
85
105
|
const end = Math.max(anchorIndex, extentIndex);
|
|
106
|
+
const range = [];
|
|
86
107
|
for (let index = start; index <= end; index += 1) {
|
|
87
108
|
const id = domain.at(index);
|
|
88
109
|
if (id !== null)
|
|
89
|
-
|
|
110
|
+
range.push([index, id]);
|
|
111
|
+
}
|
|
112
|
+
if (!additive)
|
|
113
|
+
return selectionFromIndexed(domain, range, anchor);
|
|
114
|
+
const canonical = canonicalSelection(state, domain);
|
|
115
|
+
const selected = [];
|
|
116
|
+
const indexes = [];
|
|
117
|
+
let existingPosition = 0;
|
|
118
|
+
let rangePosition = 0;
|
|
119
|
+
while (existingPosition < canonical.indexes.length || rangePosition < range.length) {
|
|
120
|
+
const existingIndex = canonical.indexes[existingPosition] ?? Number.POSITIVE_INFINITY;
|
|
121
|
+
const rangeEntry = range[rangePosition];
|
|
122
|
+
const rangeIndex = rangeEntry?.[0] ?? Number.POSITIVE_INFINITY;
|
|
123
|
+
if (existingIndex < rangeIndex) {
|
|
124
|
+
indexes.push(existingIndex);
|
|
125
|
+
selected.push(canonical.selected[existingPosition]);
|
|
126
|
+
existingPosition += 1;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
indexes.push(rangeIndex);
|
|
130
|
+
selected.push(rangeEntry[1]);
|
|
131
|
+
rangePosition += 1;
|
|
132
|
+
if (existingIndex === rangeIndex)
|
|
133
|
+
existingPosition += 1;
|
|
134
|
+
}
|
|
90
135
|
}
|
|
91
|
-
return
|
|
136
|
+
return new ImmutableSelectionState(Object.freeze(selected), Object.freeze(indexes), anchor, domain);
|
|
92
137
|
}
|
|
93
|
-
function
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
138
|
+
function selectionFromIndexed(domain, indexed, anchor) {
|
|
139
|
+
const sorted = [...indexed].sort((left, right) => left[0] - right[0]);
|
|
140
|
+
const indexes = Object.freeze(sorted.map((entry) => entry[0]));
|
|
141
|
+
const selected = Object.freeze(sorted.map((entry) => entry[1]));
|
|
142
|
+
return new ImmutableSelectionState(selected, indexes, anchor, domain);
|
|
143
|
+
}
|
|
144
|
+
function canonicalSelection(state, domain) {
|
|
145
|
+
if (state instanceof ImmutableSelectionState) {
|
|
146
|
+
const indexes = state.indexesFor(domain);
|
|
147
|
+
if (indexes !== null)
|
|
148
|
+
return { selected: state.selected, indexes };
|
|
149
|
+
}
|
|
150
|
+
const indexed = [];
|
|
151
|
+
for (const id of new Set(state.selected)) {
|
|
152
|
+
const index = domain.indexOf(id);
|
|
153
|
+
if (index !== null)
|
|
154
|
+
indexed.push([index, id]);
|
|
155
|
+
}
|
|
156
|
+
indexed.sort((left, right) => left[0] - right[0]);
|
|
157
|
+
return {
|
|
158
|
+
selected: indexed.map((entry) => entry[1]),
|
|
159
|
+
indexes: indexed.map((entry) => entry[0]),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
function lowerBound(values, target) {
|
|
163
|
+
let low = 0;
|
|
164
|
+
let high = values.length;
|
|
165
|
+
while (low < high) {
|
|
166
|
+
const middle = low + Math.floor((high - low) / 2);
|
|
167
|
+
if ((values[middle] ?? Number.POSITIVE_INFINITY) < target)
|
|
168
|
+
low = middle + 1;
|
|
169
|
+
else
|
|
170
|
+
high = middle;
|
|
99
171
|
}
|
|
100
|
-
return
|
|
172
|
+
return low;
|
|
101
173
|
}
|
|
102
174
|
function sameSelection(left, right) {
|
|
103
175
|
if (left.anchor !== right.anchor || left.selected.length !== right.selected.length)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection.js","sourceRoot":"","sources":["../../../src/internal/state/selection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,yBAAyB,CAAC;AAoBhE,MAAM,uBAAuB;IACX,QAAQ,CAAgB;IACxB,MAAM,CAAY;IACzB,SAAS,CAAkB;
|
|
1
|
+
{"version":3,"file":"selection.js","sourceRoot":"","sources":["../../../src/internal/state/selection.ts"],"names":[],"mappings":"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"}
|
package/dist/layer-stack.d.ts
CHANGED
|
@@ -44,4 +44,3 @@ export declare function tryCreateLayerStackState<ID extends StableID = StableID>
|
|
|
44
44
|
export declare function applyLayerStackEvent<ID extends StableID>(state: LayerStackState<ID>, event: LayerStackEvent<ID>): Result<LayerStackUpdate<ID>>;
|
|
45
45
|
export declare function getTopLayer<ID extends StableID>(state: LayerStackState<ID>): Layer<ID> | null;
|
|
46
46
|
export declare function getInteractiveLayerIDs<ID extends StableID>(state: LayerStackState<ID>): readonly ID[];
|
|
47
|
-
//# sourceMappingURL=layer-stack.d.ts.map
|
package/dist/listbox.d.ts
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
1
|
export { DEFAULT_LISTBOX_SELECTION_MODE, applyListboxEvent, createListboxState, findListboxTypeaheadMatch, type ListboxCommand, type ListboxEvent, type ListboxPolicies, type ListboxSelectionMode, type ListboxState, type ListboxStateInput, type ListboxTypeaheadOptions, type ListboxUpdate, } from './internal/composites/listbox.js';
|
|
2
2
|
export { tryCreateListboxState } from './internal/composites/listbox.js';
|
|
3
|
-
//# sourceMappingURL=listbox.d.ts.map
|
package/dist/menu-button.d.ts
CHANGED
|
@@ -2,4 +2,3 @@ export { applyMenuEvent as applyMenuButtonEvent, createMenuState as createMenuBu
|
|
|
2
2
|
export { createMenuModel as createMenuButtonModel, type MenuModel as MenuButtonModel } from './menu.js';
|
|
3
3
|
export { tryCreateMenuModel as tryCreateMenuButtonModel } from './menu.js';
|
|
4
4
|
export { tryCreateMenuState as tryCreateMenuButtonState } from './internal/composites/menu.js';
|
|
5
|
-
//# sourceMappingURL=menu-button.d.ts.map
|
package/dist/menu.d.ts
CHANGED
|
@@ -7,4 +7,3 @@ export declare function createMenuModel<ID extends StableID>(items: readonly Tre
|
|
|
7
7
|
export declare function tryCreateMenuModel<ID extends StableID>(items: readonly TreeNodeInput<ID>[], options?: TreeOptions): Result<MenuModel<ID>>;
|
|
8
8
|
export { applyMenuEvent, createMenuState, type MenuCommand, type MenuEvent, type MenuPolicies, type MenuState, type MenuUpdate } from './internal/composites/menu.js';
|
|
9
9
|
export { tryCreateMenuState } from './internal/composites/menu.js';
|
|
10
|
-
//# sourceMappingURL=menu.d.ts.map
|
package/dist/menubar.d.ts
CHANGED
|
@@ -2,4 +2,3 @@ export { applyMenuEvent as applyMenubarEvent, createMenuState as createMenubarSt
|
|
|
2
2
|
export { createMenuModel as createMenubarModel, type MenuModel as MenubarModel } from './menu.js';
|
|
3
3
|
export { tryCreateMenuModel as tryCreateMenubarModel } from './menu.js';
|
|
4
4
|
export { tryCreateMenuState as tryCreateMenubarState } from './internal/composites/menu.js';
|
|
5
|
-
//# sourceMappingURL=menubar.d.ts.map
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ExactRatio } from './structures/range.js';
|
|
2
|
+
import { type Result, type StableID } from './shared.js';
|
|
3
|
+
import { type MeterZone } from './meter.js';
|
|
4
|
+
export interface MeterGroupItemInput<ID extends StableID = StableID> {
|
|
5
|
+
readonly id: ID;
|
|
6
|
+
readonly value: string;
|
|
7
|
+
}
|
|
8
|
+
export interface MeterGroupInput<ID extends StableID = StableID> {
|
|
9
|
+
readonly max?: string;
|
|
10
|
+
readonly items: readonly MeterGroupItemInput<ID>[];
|
|
11
|
+
readonly low?: string;
|
|
12
|
+
readonly high?: string;
|
|
13
|
+
readonly optimum?: string;
|
|
14
|
+
readonly maxDecimalCodeUnits?: number;
|
|
15
|
+
readonly maxScale?: number;
|
|
16
|
+
readonly maxItems?: number;
|
|
17
|
+
readonly maxIDCodeUnits?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface MeterGroupSegment<ID extends StableID = StableID> {
|
|
20
|
+
readonly id: ID;
|
|
21
|
+
readonly value: string;
|
|
22
|
+
readonly start: string;
|
|
23
|
+
readonly end: string;
|
|
24
|
+
readonly valueRatio: ExactRatio;
|
|
25
|
+
readonly startRatio: ExactRatio;
|
|
26
|
+
readonly endRatio: ExactRatio;
|
|
27
|
+
}
|
|
28
|
+
export interface MeterGroupState<ID extends StableID = StableID> {
|
|
29
|
+
readonly max: string;
|
|
30
|
+
readonly items: readonly MeterGroupItemInput<ID>[];
|
|
31
|
+
readonly segments: readonly MeterGroupSegment<ID>[];
|
|
32
|
+
readonly total: string;
|
|
33
|
+
readonly remaining: string;
|
|
34
|
+
readonly ratio: ExactRatio;
|
|
35
|
+
readonly zone: MeterZone;
|
|
36
|
+
}
|
|
37
|
+
export declare function createMeterGroupState<ID extends StableID>(input: MeterGroupInput<ID>): MeterGroupState<ID>;
|
|
38
|
+
export declare function tryCreateMeterGroupState<ID extends StableID>(input: MeterGroupInput<ID>): Result<MeterGroupState<ID>>;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { unwrap } from './result.js';
|
|
2
|
+
import { DEFAULT_MAX_ID_CODE_UNITS, } from './shared.js';
|
|
3
|
+
import { tryCreateMeterState } from './meter.js';
|
|
4
|
+
import { addDecimal, boundedRatio, compareDecimal, decimalToString, DEFAULT_SCALAR_MAX, parseDecimal, subtractDecimal, tryParseBoundedScalar, } from './internal/kernel/bounded-scalar.js';
|
|
5
|
+
import { fail, freezeArray, ok, validateSafeCeiling, validateUniqueIDs, } from './internal/kernel/foundation.js';
|
|
6
|
+
export function createMeterGroupState(input) {
|
|
7
|
+
return unwrap(tryCreateMeterGroupState(input));
|
|
8
|
+
}
|
|
9
|
+
export function tryCreateMeterGroupState(input) {
|
|
10
|
+
const maxItems = input.maxItems ?? 100_000;
|
|
11
|
+
const itemCeilingError = validateSafeCeiling(maxItems, 'maxItems');
|
|
12
|
+
if (itemCeilingError !== null)
|
|
13
|
+
return { ok: false, error: itemCeilingError };
|
|
14
|
+
const maxIDCodeUnits = input.maxIDCodeUnits ?? DEFAULT_MAX_ID_CODE_UNITS;
|
|
15
|
+
const idCeilingError = validateSafeCeiling(maxIDCodeUnits, 'maxIDCodeUnits', 1);
|
|
16
|
+
if (idCeilingError !== null)
|
|
17
|
+
return { ok: false, error: idCeilingError };
|
|
18
|
+
if (input.items.length > maxItems) {
|
|
19
|
+
return fail('resource-rejection', 'item-ceiling-exceeded', 'MeterGroup exceeds maxItems.', {
|
|
20
|
+
size: input.items.length,
|
|
21
|
+
maxItems,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
const ids = validateUniqueIDs(input.items.map((item) => item.id), maxIDCodeUnits);
|
|
25
|
+
if (!ids.ok)
|
|
26
|
+
return ids;
|
|
27
|
+
const ceilings = {
|
|
28
|
+
...(input.maxDecimalCodeUnits === undefined ? {} : { maxDecimalCodeUnits: input.maxDecimalCodeUnits }),
|
|
29
|
+
...(input.maxScale === undefined ? {} : { maxScale: input.maxScale }),
|
|
30
|
+
};
|
|
31
|
+
const maxInput = input.max ?? DEFAULT_SCALAR_MAX;
|
|
32
|
+
const maximum = tryParseBoundedScalar({ min: maxInput, max: maxInput, value: maxInput }, ceilings);
|
|
33
|
+
if (!maximum.ok)
|
|
34
|
+
return maximum;
|
|
35
|
+
const zero = parseDecimal('0');
|
|
36
|
+
if (zero === null)
|
|
37
|
+
throw new Error('Internal invariant breach: zero decimal failed to parse.');
|
|
38
|
+
if (compareDecimal(maximum.value.value, zero) <= 0) {
|
|
39
|
+
return fail('construction', 'meter-group-maximum-not-positive', 'MeterGroup max must be greater than zero.', {
|
|
40
|
+
max: maximum.value.canonicalValue,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
let total = zero;
|
|
44
|
+
const canonicalItems = [];
|
|
45
|
+
const segments = [];
|
|
46
|
+
for (const item of input.items) {
|
|
47
|
+
const parsed = tryParseBoundedScalar({ min: item.value, max: item.value, value: item.value }, ceilings);
|
|
48
|
+
if (!parsed.ok)
|
|
49
|
+
return parsed;
|
|
50
|
+
const value = parsed.value.value;
|
|
51
|
+
if (compareDecimal(value, zero) < 0) {
|
|
52
|
+
return fail('construction', 'meter-group-value-negative', 'MeterGroup item values must not be negative.', {
|
|
53
|
+
id: item.id,
|
|
54
|
+
value: parsed.value.canonicalValue,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
const start = total;
|
|
58
|
+
total = addDecimal(total, value);
|
|
59
|
+
if (compareDecimal(total, maximum.value.value) > 0) {
|
|
60
|
+
return fail('construction', 'meter-group-total-exceeds-maximum', 'MeterGroup total must not exceed max.', {
|
|
61
|
+
max: maximum.value.canonicalValue,
|
|
62
|
+
total: decimalToString(total),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
const canonicalItem = Object.freeze({ id: item.id, value: parsed.value.canonicalValue });
|
|
66
|
+
canonicalItems.push(canonicalItem);
|
|
67
|
+
segments.push(Object.freeze({
|
|
68
|
+
id: item.id,
|
|
69
|
+
value: canonicalItem.value,
|
|
70
|
+
start: decimalToString(start),
|
|
71
|
+
end: decimalToString(total),
|
|
72
|
+
valueRatio: exactRatio(value, zero, maximum.value.value),
|
|
73
|
+
startRatio: exactRatio(start, zero, maximum.value.value),
|
|
74
|
+
endRatio: exactRatio(total, zero, maximum.value.value),
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
const canonicalTotal = decimalToString(total);
|
|
78
|
+
const aggregate = tryCreateMeterState({
|
|
79
|
+
min: '0',
|
|
80
|
+
max: maximum.value.canonicalValue,
|
|
81
|
+
value: canonicalTotal,
|
|
82
|
+
...(input.low === undefined ? {} : { low: input.low }),
|
|
83
|
+
...(input.high === undefined ? {} : { high: input.high }),
|
|
84
|
+
...(input.optimum === undefined ? {} : { optimum: input.optimum }),
|
|
85
|
+
...ceilings,
|
|
86
|
+
});
|
|
87
|
+
if (!aggregate.ok)
|
|
88
|
+
return aggregate;
|
|
89
|
+
return ok(Object.freeze({
|
|
90
|
+
max: maximum.value.canonicalValue,
|
|
91
|
+
items: freezeArray(canonicalItems),
|
|
92
|
+
segments: freezeArray(segments),
|
|
93
|
+
total: canonicalTotal,
|
|
94
|
+
remaining: decimalToString(subtractDecimal(maximum.value.value, total)),
|
|
95
|
+
ratio: exactRatio(total, zero, maximum.value.value),
|
|
96
|
+
zone: aggregate.value.zone,
|
|
97
|
+
}));
|
|
98
|
+
}
|
|
99
|
+
function exactRatio(value, min, max) {
|
|
100
|
+
const ratio = boundedRatio(value, min, max);
|
|
101
|
+
return Object.freeze({ numerator: ratio.numerator, denominator: ratio.denominator });
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=meter-group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meter-group.js","sourceRoot":"","sources":["../src/meter-group.ts"],"names":[],"mappings":"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"}
|
package/dist/meter.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ExactRatio } from './structures/range.js';
|
|
2
|
+
import type { Result } from './shared.js';
|
|
3
|
+
export type MeterZone = 'optimum' | 'suboptimal' | 'even-less-good';
|
|
4
|
+
export interface MeterInput {
|
|
5
|
+
readonly min?: string;
|
|
6
|
+
readonly max?: string;
|
|
7
|
+
readonly value: string;
|
|
8
|
+
readonly low?: string;
|
|
9
|
+
readonly high?: string;
|
|
10
|
+
readonly optimum?: string;
|
|
11
|
+
readonly maxDecimalCodeUnits?: number;
|
|
12
|
+
readonly maxScale?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface MeterState {
|
|
15
|
+
readonly min: string;
|
|
16
|
+
readonly max: string;
|
|
17
|
+
readonly value: string;
|
|
18
|
+
readonly low: string;
|
|
19
|
+
readonly high: string;
|
|
20
|
+
readonly optimum: string;
|
|
21
|
+
readonly ratio: ExactRatio;
|
|
22
|
+
readonly zone: MeterZone;
|
|
23
|
+
}
|
|
24
|
+
export declare function createMeterState(input: MeterInput): MeterState;
|
|
25
|
+
export declare function tryCreateMeterState(input: MeterInput): Result<MeterState>;
|
package/dist/meter.js
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { unwrap } from './result.js';
|
|
2
|
+
import { boundedRatio, compareDecimal, decimalInClosedRange, decimalToString, DEFAULT_SCALAR_MAX, DEFAULT_SCALAR_MIN, midpointDecimal, tryParseBoundedScalar, } from './internal/kernel/bounded-scalar.js';
|
|
3
|
+
import { fail, ok } from './internal/kernel/foundation.js';
|
|
4
|
+
export function createMeterState(input) {
|
|
5
|
+
return unwrap(tryCreateMeterState(input));
|
|
6
|
+
}
|
|
7
|
+
export function tryCreateMeterState(input) {
|
|
8
|
+
const minInput = input.min ?? DEFAULT_SCALAR_MIN;
|
|
9
|
+
const maxInput = input.max ?? DEFAULT_SCALAR_MAX;
|
|
10
|
+
const ceilings = {
|
|
11
|
+
...(input.maxDecimalCodeUnits === undefined ? {} : { maxDecimalCodeUnits: input.maxDecimalCodeUnits }),
|
|
12
|
+
...(input.maxScale === undefined ? {} : { maxScale: input.maxScale }),
|
|
13
|
+
};
|
|
14
|
+
const base = tryParseBoundedScalar({ min: minInput, max: maxInput, value: input.value }, ceilings);
|
|
15
|
+
if (!base.ok)
|
|
16
|
+
return base;
|
|
17
|
+
if (!decimalInClosedRange(base.value.value, base.value.min, base.value.max)) {
|
|
18
|
+
return fail('construction', 'meter-value-outside-range', 'Meter value must be within min and max.', {
|
|
19
|
+
min: base.value.canonicalMin,
|
|
20
|
+
max: base.value.canonicalMax,
|
|
21
|
+
value: base.value.canonicalValue,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
const low = input.low === undefined
|
|
25
|
+
? base.value.min
|
|
26
|
+
: parseThreshold('low', input.low, minInput, maxInput, ceilings);
|
|
27
|
+
if ('ok' in low && !low.ok)
|
|
28
|
+
return low;
|
|
29
|
+
const high = input.high === undefined
|
|
30
|
+
? base.value.max
|
|
31
|
+
: parseThreshold('high', input.high, minInput, maxInput, ceilings);
|
|
32
|
+
if ('ok' in high && !high.ok)
|
|
33
|
+
return high;
|
|
34
|
+
const optimum = input.optimum === undefined
|
|
35
|
+
? midpointDecimal(base.value.min, base.value.max)
|
|
36
|
+
: parseThreshold('optimum', input.optimum, minInput, maxInput, ceilings);
|
|
37
|
+
if ('ok' in optimum && !optimum.ok)
|
|
38
|
+
return optimum;
|
|
39
|
+
const lowDecimal = decimalValue(low);
|
|
40
|
+
const highDecimal = decimalValue(high);
|
|
41
|
+
const optimumDecimal = decimalValue(optimum);
|
|
42
|
+
if (compareDecimal(lowDecimal, highDecimal) > 0) {
|
|
43
|
+
return fail('construction', 'meter-threshold-order-invalid', 'Meter low must be less than or equal to high.');
|
|
44
|
+
}
|
|
45
|
+
const ratio = boundedRatio(base.value.value, base.value.min, base.value.max);
|
|
46
|
+
return ok(Object.freeze({
|
|
47
|
+
min: base.value.canonicalMin,
|
|
48
|
+
max: base.value.canonicalMax,
|
|
49
|
+
value: base.value.canonicalValue,
|
|
50
|
+
low: decimalToString(lowDecimal),
|
|
51
|
+
high: decimalToString(highDecimal),
|
|
52
|
+
optimum: decimalToString(optimumDecimal),
|
|
53
|
+
ratio: Object.freeze({ numerator: ratio.numerator, denominator: ratio.denominator }),
|
|
54
|
+
zone: classifyMeterZone(base.value.value, lowDecimal, highDecimal, optimumDecimal),
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
57
|
+
function parseThreshold(name, value, min, max, ceilings) {
|
|
58
|
+
const parsed = tryParseBoundedScalar({ min, max, value }, ceilings);
|
|
59
|
+
if (!parsed.ok)
|
|
60
|
+
return parsed;
|
|
61
|
+
if (!decimalInClosedRange(parsed.value.value, parsed.value.min, parsed.value.max)) {
|
|
62
|
+
return fail('construction', 'meter-threshold-outside-range', `Meter ${name} must be within min and max.`, {
|
|
63
|
+
name,
|
|
64
|
+
value: parsed.value.canonicalValue,
|
|
65
|
+
min: parsed.value.canonicalMin,
|
|
66
|
+
max: parsed.value.canonicalMax,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return parsed.value.value;
|
|
70
|
+
}
|
|
71
|
+
function decimalValue(value) {
|
|
72
|
+
return value;
|
|
73
|
+
}
|
|
74
|
+
function classifyMeterZone(value, low, high, optimum) {
|
|
75
|
+
if (compareDecimal(optimum, low) < 0) {
|
|
76
|
+
if (compareDecimal(value, low) <= 0)
|
|
77
|
+
return 'optimum';
|
|
78
|
+
return compareDecimal(value, high) <= 0 ? 'suboptimal' : 'even-less-good';
|
|
79
|
+
}
|
|
80
|
+
if (compareDecimal(optimum, high) > 0) {
|
|
81
|
+
if (compareDecimal(value, high) >= 0)
|
|
82
|
+
return 'optimum';
|
|
83
|
+
return compareDecimal(value, low) >= 0 ? 'suboptimal' : 'even-less-good';
|
|
84
|
+
}
|
|
85
|
+
return compareDecimal(value, low) >= 0 && compareDecimal(value, high) <= 0
|
|
86
|
+
? 'optimum'
|
|
87
|
+
: 'suboptimal';
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=meter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meter.js","sourceRoot":"","sources":["../src/meter.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,4 +33,3 @@ export interface MultiThumbSliderUpdate<ID extends StableID = StableID> {
|
|
|
33
33
|
export declare function createMultiThumbSliderState<ID extends StableID>(thumbs: Sequence<ID>, range: QuantizedRange, ticks: readonly number[], current?: ID | null, policies?: MultiThumbSliderPolicies): MultiThumbSliderState<ID>;
|
|
34
34
|
export declare function tryCreateMultiThumbSliderState<ID extends StableID>(thumbs: Sequence<ID>, range: QuantizedRange, ticks: readonly number[], current?: ID | null, policies?: MultiThumbSliderPolicies): Result<MultiThumbSliderState<ID>>;
|
|
35
35
|
export declare function applyMultiThumbSliderEvent<ID extends StableID>(thumbs: Sequence<ID>, range: QuantizedRange, state: MultiThumbSliderState<ID>, event: MultiThumbSliderEvent<ID>, policies?: MultiThumbSliderPolicies): Result<MultiThumbSliderUpdate<ID>>;
|
|
36
|
-
//# sourceMappingURL=multi-thumb-slider.d.ts.map
|
|
@@ -3,4 +3,3 @@ export { createMenuModel as createNavigationMenuModel, type MenuModel as Navigat
|
|
|
3
3
|
export type { TreeNodeInput as NavigationMenuItemDefinition } from './structures/tree.js';
|
|
4
4
|
export { tryCreateMenuModel as tryCreateNavigationMenuModel } from './menu.js';
|
|
5
5
|
export { tryCreateMenuState as tryCreateNavigationMenuState } from './internal/composites/menu.js';
|
|
6
|
-
//# sourceMappingURL=navigation-menu.d.ts.map
|
package/dist/number-field.d.ts
CHANGED
|
@@ -48,4 +48,3 @@ export declare function tryCreateCalculatorExpression(options?: CalculatorExpres
|
|
|
48
48
|
export declare function createNumberFieldState(value?: string | null, inputState?: TextEditingState): NumberFieldState;
|
|
49
49
|
export declare function tryCreateNumberFieldState(value?: string | null, inputState?: TextEditingState): Result<NumberFieldState>;
|
|
50
50
|
export declare function applyNumberFieldEvent(state: NumberFieldState, event: NumberFieldEvent, policies?: NumberFieldPolicies): Result<NumberFieldUpdate>;
|
|
51
|
-
//# sourceMappingURL=number-field.d.ts.map
|
package/dist/pagination.d.ts
CHANGED
|
@@ -62,4 +62,3 @@ export declare function applyPaginationEvent(model: PaginationModel, state: Pagi
|
|
|
62
62
|
export declare function getPaginationPageCount(model: PaginationModel, state: PaginationState): Result<number>;
|
|
63
63
|
export declare function getPaginationItems(model: PaginationModel, state: PaginationState): Result<readonly PaginationItem[]>;
|
|
64
64
|
export declare function getPaginationItemRange(model: PaginationModel, state: PaginationState): Result<PaginationItemRange>;
|
|
65
|
-
//# sourceMappingURL=pagination.d.ts.map
|
package/dist/pin-input.d.ts
CHANGED
|
@@ -28,4 +28,3 @@ export interface PinInputUpdate {
|
|
|
28
28
|
export declare function createPinInputState(length: number, value?: string | readonly string[]): PinInputState;
|
|
29
29
|
export declare function tryCreatePinInputState(length: number, value?: string | readonly string[]): Result<PinInputState>;
|
|
30
30
|
export declare function applyPinInputEvent(length: number, state: PinInputState, event: PinInputEvent, policies?: PinInputPolicies): Result<PinInputUpdate>;
|
|
31
|
-
//# sourceMappingURL=pin-input.d.ts.map
|
package/dist/popover.d.ts
CHANGED
|
@@ -14,4 +14,3 @@ export interface PopoverUpdate {
|
|
|
14
14
|
export declare const createPopoverState: typeof createPopupState;
|
|
15
15
|
export declare const tryCreatePopoverState: typeof tryCreatePopupState;
|
|
16
16
|
export declare function applyPopoverEvent(state: PopoverState, event: PopoverEvent): Result<PopoverUpdate>;
|
|
17
|
-
//# sourceMappingURL=popover.d.ts.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ExactRatio } from './structures/range.js';
|
|
2
|
+
import type { Result } from './shared.js';
|
|
3
|
+
export type ProgressStatus = 'indeterminate' | 'progressing' | 'complete';
|
|
4
|
+
export interface ProgressInput {
|
|
5
|
+
readonly max?: string;
|
|
6
|
+
readonly value?: string | null;
|
|
7
|
+
readonly maxDecimalCodeUnits?: number;
|
|
8
|
+
readonly maxScale?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface ProgressState {
|
|
11
|
+
readonly max: string;
|
|
12
|
+
readonly value: string | null;
|
|
13
|
+
readonly ratio: ExactRatio | null;
|
|
14
|
+
readonly status: ProgressStatus;
|
|
15
|
+
}
|
|
16
|
+
export declare function createProgressState(input?: ProgressInput): ProgressState;
|
|
17
|
+
export declare function tryCreateProgressState(input?: ProgressInput): Result<ProgressState>;
|