foldkit 0.56.0 → 0.58.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/README.md +21 -11
- package/dist/devtools/overlay-styles.d.ts +1 -1
- package/dist/devtools/overlay-styles.d.ts.map +1 -1
- package/dist/devtools/overlay-styles.js +5 -1
- package/dist/devtools/overlay.d.ts.map +1 -1
- package/dist/devtools/overlay.js +52 -19
- package/dist/file/error.d.ts +10 -0
- package/dist/file/error.d.ts.map +1 -0
- package/dist/file/error.js +4 -0
- package/dist/file/file.d.ts +24 -0
- package/dist/file/file.d.ts.map +1 -0
- package/dist/file/file.js +16 -0
- package/dist/file/index.d.ts +5 -0
- package/dist/file/index.d.ts.map +1 -0
- package/dist/file/index.js +4 -0
- package/dist/file/public.d.ts +2 -0
- package/dist/file/public.d.ts.map +1 -0
- package/dist/file/public.js +1 -0
- package/dist/file/reader.d.ts +56 -0
- package/dist/file/reader.d.ts.map +1 -0
- package/dist/file/reader.js +92 -0
- package/dist/file/select.d.ts +36 -0
- package/dist/file/select.d.ts.map +1 -0
- package/dist/file/select.js +60 -0
- package/dist/html/index.d.ts +34 -3
- package/dist/html/index.d.ts.map +1 -1
- package/dist/html/index.js +40 -1
- package/dist/html/lazy.d.ts +7 -5
- package/dist/html/lazy.d.ts.map +1 -1
- package/dist/html/lazy.js +12 -8
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +2 -4
- package/dist/test/apps/disabledButton.d.ts +11 -3
- package/dist/test/apps/disabledButton.d.ts.map +1 -1
- package/dist/test/apps/fileUpload.d.ts +17 -0
- package/dist/test/apps/fileUpload.d.ts.map +1 -0
- package/dist/test/apps/fileUpload.js +29 -0
- package/dist/test/apps/resumeUpload.d.ts +43 -0
- package/dist/test/apps/resumeUpload.d.ts.map +1 -0
- package/dist/test/apps/resumeUpload.js +85 -0
- package/dist/test/query.d.ts +2 -1
- package/dist/test/query.d.ts.map +1 -1
- package/dist/test/query.js +15 -2
- package/dist/test/scene.d.ts +18 -0
- package/dist/test/scene.d.ts.map +1 -1
- package/dist/test/scene.js +46 -0
- package/dist/ui/combobox/multi.d.ts +31 -10
- package/dist/ui/combobox/multi.d.ts.map +1 -1
- package/dist/ui/combobox/public.d.ts +1 -2
- package/dist/ui/combobox/public.d.ts.map +1 -1
- package/dist/ui/combobox/public.js +1 -2
- package/dist/ui/combobox/shared.d.ts +33 -33
- package/dist/ui/combobox/shared.d.ts.map +1 -1
- package/dist/ui/combobox/shared.js +89 -112
- package/dist/ui/combobox/single.d.ts +31 -10
- package/dist/ui/combobox/single.d.ts.map +1 -1
- package/dist/ui/combobox/single.js +1 -5
- package/dist/ui/dialog/index.d.ts +10 -15
- package/dist/ui/dialog/index.d.ts.map +1 -1
- package/dist/ui/dialog/index.js +68 -73
- package/dist/ui/dialog/public.d.ts +1 -1
- package/dist/ui/dialog/public.d.ts.map +1 -1
- package/dist/ui/dialog/public.js +1 -1
- package/dist/ui/listbox/multi.d.ts +30 -9
- package/dist/ui/listbox/multi.d.ts.map +1 -1
- package/dist/ui/listbox/public.d.ts +1 -2
- package/dist/ui/listbox/public.d.ts.map +1 -1
- package/dist/ui/listbox/public.js +1 -2
- package/dist/ui/listbox/shared.d.ts +35 -36
- package/dist/ui/listbox/shared.d.ts.map +1 -1
- package/dist/ui/listbox/shared.js +106 -104
- package/dist/ui/listbox/single.d.ts +30 -9
- package/dist/ui/listbox/single.d.ts.map +1 -1
- package/dist/ui/listbox/single.js +9 -12
- package/dist/ui/menu/index.d.ts +22 -26
- package/dist/ui/menu/index.d.ts.map +1 -1
- package/dist/ui/menu/index.js +103 -91
- package/dist/ui/menu/public.d.ts +1 -2
- package/dist/ui/menu/public.d.ts.map +1 -1
- package/dist/ui/menu/public.js +1 -2
- package/dist/ui/popover/index.d.ts +21 -22
- package/dist/ui/popover/index.d.ts.map +1 -1
- package/dist/ui/popover/index.js +92 -75
- package/dist/ui/popover/public.d.ts +1 -2
- package/dist/ui/popover/public.d.ts.map +1 -1
- package/dist/ui/popover/public.js +1 -2
- package/dist/ui/transition/index.d.ts +8 -58
- package/dist/ui/transition/index.d.ts.map +1 -1
- package/dist/ui/transition/index.js +21 -111
- package/dist/ui/transition/public.d.ts +1 -1
- package/dist/ui/transition/public.d.ts.map +1 -1
- package/dist/ui/transition/public.js +1 -1
- package/dist/ui/transition/schema.d.ts +43 -0
- package/dist/ui/transition/schema.d.ts.map +1 -0
- package/dist/ui/transition/schema.js +35 -0
- package/dist/ui/transition/update.d.ts +22 -0
- package/dist/ui/transition/update.d.ts.map +1 -0
- package/dist/ui/transition/update.js +68 -0
- package/package.json +5 -1
- package/dist/ui/transition.d.ts +0 -5
- package/dist/ui/transition.d.ts.map +0 -1
- package/dist/ui/transition.js +0 -3
|
@@ -16,7 +16,11 @@ export declare const BaseModel: S.Struct<{
|
|
|
16
16
|
nullable: typeof S.Boolean;
|
|
17
17
|
immediate: typeof S.Boolean;
|
|
18
18
|
selectInputOnFocus: typeof S.Boolean;
|
|
19
|
-
|
|
19
|
+
transition: S.Struct<{
|
|
20
|
+
id: typeof S.String;
|
|
21
|
+
isShowing: typeof S.Boolean;
|
|
22
|
+
transitionState: S.Literal<["Idle", "EnterStart", "EnterAnimating", "LeaveStart", "LeaveAnimating"]>;
|
|
23
|
+
}>;
|
|
20
24
|
maybeActiveItemIndex: S.OptionFromSelf<typeof S.Number>;
|
|
21
25
|
activationTrigger: S.Literal<["Pointer", "Keyboard"]>;
|
|
22
26
|
inputValue: typeof S.String;
|
|
@@ -85,12 +89,10 @@ export declare const CompletedFocusInput: import("../../schema").CallableTaggedS
|
|
|
85
89
|
export declare const CompletedScrollIntoView: import("../../schema").CallableTaggedStruct<"CompletedScrollIntoView", {}>;
|
|
86
90
|
/** Sent when the programmatic item click command completes. */
|
|
87
91
|
export declare const CompletedClickItem: import("../../schema").CallableTaggedStruct<"CompletedClickItem", {}>;
|
|
88
|
-
/**
|
|
89
|
-
export declare const
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
/** Sent internally when the input wrapper moves in the viewport during a leave transition, cancelling the animation. */
|
|
93
|
-
export declare const DetectedInputMovement: import("../../schema").CallableTaggedStruct<"DetectedInputMovement", {}>;
|
|
92
|
+
/** Wraps a Transition submodel message for delegation. */
|
|
93
|
+
export declare const GotTransitionMessage: import("../../schema").CallableTaggedStruct<"GotTransitionMessage", {
|
|
94
|
+
message: S.Union<[import("../../schema").CallableTaggedStruct<"Showed", {}>, import("../../schema").CallableTaggedStruct<"Hidden", {}>, import("../../schema").CallableTaggedStruct<"AdvancedTransitionFrame", {}>, import("../../schema").CallableTaggedStruct<"EndedTransition", {}>]>;
|
|
95
|
+
}>;
|
|
94
96
|
/** Sent when the user types in the input. */
|
|
95
97
|
export declare const UpdatedInputValue: import("../../schema").CallableTaggedStruct<"UpdatedInputValue", {
|
|
96
98
|
value: typeof S.String;
|
|
@@ -114,9 +116,7 @@ export declare const Message: S.Union<[
|
|
|
114
116
|
typeof CompletedFocusInput,
|
|
115
117
|
typeof CompletedScrollIntoView,
|
|
116
118
|
typeof CompletedClickItem,
|
|
117
|
-
typeof
|
|
118
|
-
typeof EndedTransition,
|
|
119
|
-
typeof DetectedInputMovement,
|
|
119
|
+
typeof GotTransitionMessage,
|
|
120
120
|
typeof UpdatedInputValue,
|
|
121
121
|
typeof PressedToggleButton
|
|
122
122
|
]>;
|
|
@@ -135,9 +135,6 @@ export type CompletedTeardownInert = typeof CompletedTeardownInert.Type;
|
|
|
135
135
|
export type CompletedFocusInput = typeof CompletedFocusInput.Type;
|
|
136
136
|
export type CompletedScrollIntoView = typeof CompletedScrollIntoView.Type;
|
|
137
137
|
export type CompletedClickItem = typeof CompletedClickItem.Type;
|
|
138
|
-
export type AdvancedTransitionFrame = typeof AdvancedTransitionFrame.Type;
|
|
139
|
-
export type EndedTransition = typeof EndedTransition.Type;
|
|
140
|
-
export type DetectedInputMovement = typeof DetectedInputMovement.Type;
|
|
141
138
|
export type UpdatedInputValue = typeof UpdatedInputValue.Type;
|
|
142
139
|
export type PressedToggleButton = typeof PressedToggleButton.Type;
|
|
143
140
|
export type Message = typeof Message.Type;
|
|
@@ -151,15 +148,9 @@ export declare const closedBaseModel: <Model extends BaseModel>(model: Model) =>
|
|
|
151
148
|
/** Context passed to the `handleSelectedItem` handler with commands for focus management and modal cleanup. */
|
|
152
149
|
export type SelectedItemContext = Readonly<{
|
|
153
150
|
focusInput: Command.Command<Message>;
|
|
154
|
-
maybeNextFrame: Option.Option<Command.Command<Message>>;
|
|
155
151
|
maybeUnlockScroll: Option.Option<Command.Command<Message>>;
|
|
156
152
|
maybeRestoreInert: Option.Option<Command.Command<Message>>;
|
|
157
153
|
}>;
|
|
158
|
-
/** Creates a combobox update function from variant-specific handlers. Shared logic (open, close, activate, transition) is handled internally; only close, selection, and immediate-activation behavior varies by variant. */
|
|
159
|
-
/** Advances the combobox's enter/leave transition by waiting a double-rAF. */
|
|
160
|
-
export declare const RequestFrame: Command.CommandDefinition<"RequestFrame", {
|
|
161
|
-
readonly _tag: "AdvancedTransitionFrame";
|
|
162
|
-
}>;
|
|
163
154
|
/** Prevents page scrolling while the combobox popup is open in modal mode. */
|
|
164
155
|
export declare const LockScroll: Command.CommandDefinition<"LockScroll", {
|
|
165
156
|
readonly _tag: "CompletedLockScroll";
|
|
@@ -188,16 +179,20 @@ export declare const ScrollIntoView: Command.CommandDefinition<"ScrollIntoView",
|
|
|
188
179
|
export declare const ClickItem: Command.CommandDefinition<"ClickItem", {
|
|
189
180
|
readonly _tag: "CompletedClickItem";
|
|
190
181
|
}>;
|
|
191
|
-
/**
|
|
192
|
-
export declare const WaitForTransitions: Command.CommandDefinition<"WaitForTransitions", {
|
|
193
|
-
readonly _tag: "EndedTransition";
|
|
194
|
-
}>;
|
|
195
|
-
/** Detects whether the combobox input moved or the leave transition ended — whichever comes first. */
|
|
182
|
+
/** Detects whether the combobox input wrapper moved or the leave transition ended — whichever comes first. Both outcomes signal the Transition submodel that leave is complete. */
|
|
196
183
|
export declare const DetectMovementOrTransitionEnd: Command.CommandDefinition<"DetectMovementOrTransitionEnd", {
|
|
197
|
-
readonly _tag: "
|
|
198
|
-
|
|
199
|
-
|
|
184
|
+
readonly _tag: "GotTransitionMessage";
|
|
185
|
+
readonly message: {
|
|
186
|
+
readonly _tag: "Showed";
|
|
187
|
+
} | {
|
|
188
|
+
readonly _tag: "Hidden";
|
|
189
|
+
} | {
|
|
190
|
+
readonly _tag: "AdvancedTransitionFrame";
|
|
191
|
+
} | {
|
|
192
|
+
readonly _tag: "EndedTransition";
|
|
193
|
+
};
|
|
200
194
|
}>;
|
|
195
|
+
/** Creates a combobox update function from variant-specific handlers. Shared logic (open, close, activate, transition) is handled internally; only close, selection, and immediate-activation behavior varies by variant. */
|
|
201
196
|
export declare const makeUpdate: <Model extends BaseModel>(handlers: Readonly<{
|
|
202
197
|
handleClose: (model: Model) => Model;
|
|
203
198
|
handleSelectedItem: (model: Model, item: string, displayText: string, context: SelectedItemContext) => [Model, ReadonlyArray<Command.Command<Message>>];
|
|
@@ -222,10 +217,6 @@ export declare const makeUpdate: <Model extends BaseModel>(handlers: Readonly<{
|
|
|
222
217
|
readonly _tag: "CompletedScrollIntoView";
|
|
223
218
|
} | {
|
|
224
219
|
readonly _tag: "CompletedClickItem";
|
|
225
|
-
} | {
|
|
226
|
-
readonly _tag: "AdvancedTransitionFrame";
|
|
227
|
-
} | {
|
|
228
|
-
readonly _tag: "EndedTransition";
|
|
229
220
|
} | {
|
|
230
221
|
readonly _tag: "Opened";
|
|
231
222
|
readonly maybeActiveItemIndex: Option.Option<number>;
|
|
@@ -252,7 +243,16 @@ export declare const makeUpdate: <Model extends BaseModel>(handlers: Readonly<{
|
|
|
252
243
|
} | {
|
|
253
244
|
readonly _tag: "CompletedFocusInput";
|
|
254
245
|
} | {
|
|
255
|
-
readonly _tag: "
|
|
246
|
+
readonly _tag: "GotTransitionMessage";
|
|
247
|
+
readonly message: {
|
|
248
|
+
readonly _tag: "Showed";
|
|
249
|
+
} | {
|
|
250
|
+
readonly _tag: "Hidden";
|
|
251
|
+
} | {
|
|
252
|
+
readonly _tag: "AdvancedTransitionFrame";
|
|
253
|
+
} | {
|
|
254
|
+
readonly _tag: "EndedTransition";
|
|
255
|
+
};
|
|
256
256
|
} | {
|
|
257
257
|
readonly _tag: "UpdatedInputValue";
|
|
258
258
|
readonly value: string;
|
|
@@ -273,7 +273,7 @@ export type GroupHeading = Readonly<{
|
|
|
273
273
|
/** Configuration for rendering a combobox with `view`. */
|
|
274
274
|
export type BaseViewConfig<Message, Item extends string, Model extends BaseModel> = Readonly<{
|
|
275
275
|
model: Model;
|
|
276
|
-
toParentMessage: (message: Opened | Closed | ClosedByTab | ActivatedItem | DeactivatedItem | SelectedItem | MovedPointerOverItem | RequestedItemClick | UpdatedInputValue | PressedToggleButton
|
|
276
|
+
toParentMessage: (message: Opened | Closed | ClosedByTab | ActivatedItem | DeactivatedItem | SelectedItem | MovedPointerOverItem | RequestedItemClick | UpdatedInputValue | PressedToggleButton) => Message;
|
|
277
277
|
onSelectedItem?: (value: string) => Message;
|
|
278
278
|
items: ReadonlyArray<Item>;
|
|
279
279
|
itemToConfig: (item: Item, context: Readonly<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/ui/combobox/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,MAAM,EAEN,MAAM,EAEN,MAAM,IAAI,CAAC,EAEZ,MAAM,QAAQ,CAAA;AAEf,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AAExC,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,IAAI,EAAQ,MAAM,YAAY,CAAA;AAK5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/ui/combobox/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,11 @@ import * as Task from '../../task';
|
|
|
8
8
|
import { anchorHooks } from '../anchor';
|
|
9
9
|
import { groupContiguous } from '../group';
|
|
10
10
|
import { findFirstEnabledIndex, keyToIndex } from '../keyboard';
|
|
11
|
-
|
|
11
|
+
// NOTE: Transition imports are split across schema + update to avoid a circular
|
|
12
|
+
// dependency: transition → html → runtime → devtools → combobox → transition.
|
|
13
|
+
// The barrel (../transition) imports from html, which starts the cycle.
|
|
14
|
+
import { EndedTransition as TransitionEndedTransition, Hidden as TransitionHidden, Message as TransitionMessage, Model as TransitionModel, Showed as TransitionShowed, init as transitionInit, } from '../transition/schema';
|
|
15
|
+
import { update as transitionUpdate } from '../transition/update';
|
|
12
16
|
export { groupContiguous };
|
|
13
17
|
// MODEL
|
|
14
18
|
/** Schema for the activation trigger — whether the user interacted via mouse or keyboard. */
|
|
@@ -22,7 +26,7 @@ export const BaseModel = S.Struct({
|
|
|
22
26
|
nullable: S.Boolean,
|
|
23
27
|
immediate: S.Boolean,
|
|
24
28
|
selectInputOnFocus: S.Boolean,
|
|
25
|
-
|
|
29
|
+
transition: TransitionModel,
|
|
26
30
|
maybeActiveItemIndex: S.OptionFromSelf(S.Number),
|
|
27
31
|
activationTrigger: ActivationTrigger,
|
|
28
32
|
inputValue: S.String,
|
|
@@ -37,7 +41,7 @@ export const baseInit = (config) => ({
|
|
|
37
41
|
nullable: config.nullable ?? false,
|
|
38
42
|
immediate: config.immediate ?? false,
|
|
39
43
|
selectInputOnFocus: config.selectInputOnFocus ?? false,
|
|
40
|
-
|
|
44
|
+
transition: transitionInit({ id: `${config.id}-items` }),
|
|
41
45
|
maybeActiveItemIndex: Option.none(),
|
|
42
46
|
activationTrigger: 'Keyboard',
|
|
43
47
|
inputValue: '',
|
|
@@ -89,12 +93,10 @@ export const CompletedFocusInput = m('CompletedFocusInput');
|
|
|
89
93
|
export const CompletedScrollIntoView = m('CompletedScrollIntoView');
|
|
90
94
|
/** Sent when the programmatic item click command completes. */
|
|
91
95
|
export const CompletedClickItem = m('CompletedClickItem');
|
|
92
|
-
/**
|
|
93
|
-
export const
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
/** Sent internally when the input wrapper moves in the viewport during a leave transition, cancelling the animation. */
|
|
97
|
-
export const DetectedInputMovement = m('DetectedInputMovement');
|
|
96
|
+
/** Wraps a Transition submodel message for delegation. */
|
|
97
|
+
export const GotTransitionMessage = m('GotTransitionMessage', {
|
|
98
|
+
message: TransitionMessage,
|
|
99
|
+
});
|
|
98
100
|
/** Sent when the user types in the input. */
|
|
99
101
|
export const UpdatedInputValue = m('UpdatedInputValue', {
|
|
100
102
|
value: S.String,
|
|
@@ -102,7 +104,7 @@ export const UpdatedInputValue = m('UpdatedInputValue', {
|
|
|
102
104
|
/** Sent when the optional toggle button is clicked. */
|
|
103
105
|
export const PressedToggleButton = m('PressedToggleButton');
|
|
104
106
|
/** Union of all messages the combobox component can produce. */
|
|
105
|
-
export const Message = S.Union(Opened, Closed, ClosedByTab, ActivatedItem, DeactivatedItem, SelectedItem, MovedPointerOverItem, RequestedItemClick, CompletedLockScroll, CompletedUnlockScroll, CompletedSetupInert, CompletedTeardownInert, CompletedFocusInput, CompletedScrollIntoView, CompletedClickItem,
|
|
107
|
+
export const Message = S.Union(Opened, Closed, ClosedByTab, ActivatedItem, DeactivatedItem, SelectedItem, MovedPointerOverItem, RequestedItemClick, CompletedLockScroll, CompletedUnlockScroll, CompletedSetupInert, CompletedTeardownInert, CompletedFocusInput, CompletedScrollIntoView, CompletedClickItem, GotTransitionMessage, UpdatedInputValue, PressedToggleButton);
|
|
106
108
|
// SELECTORS
|
|
107
109
|
export const inputSelector = (id) => `#${id}-input`;
|
|
108
110
|
export const inputWrapperSelector = (id) => `#${id}-input-wrapper`;
|
|
@@ -114,14 +116,10 @@ const constrainedEvo = makeConstrainedEvo();
|
|
|
114
116
|
/** Resets only shared base fields to their closed state. Does not touch inputValue or selection — those are variant-specific. */
|
|
115
117
|
export const closedBaseModel = (model) => constrainedEvo(model, {
|
|
116
118
|
isOpen: () => false,
|
|
117
|
-
transitionState: () => model.isAnimated ? 'LeaveStart' : 'Idle',
|
|
118
119
|
maybeActiveItemIndex: () => Option.none(),
|
|
119
120
|
activationTrigger: () => 'Keyboard',
|
|
120
121
|
maybeLastPointerPosition: () => Option.none(),
|
|
121
122
|
});
|
|
122
|
-
/** Creates a combobox update function from variant-specific handlers. Shared logic (open, close, activate, transition) is handled internally; only close, selection, and immediate-activation behavior varies by variant. */
|
|
123
|
-
/** Advances the combobox's enter/leave transition by waiting a double-rAF. */
|
|
124
|
-
export const RequestFrame = Command.define('RequestFrame', AdvancedTransitionFrame);
|
|
125
123
|
/** Prevents page scrolling while the combobox popup is open in modal mode. */
|
|
126
124
|
export const LockScroll = Command.define('LockScroll', CompletedLockScroll);
|
|
127
125
|
/** Re-enables page scrolling after the combobox popup closes. */
|
|
@@ -136,14 +134,33 @@ export const FocusInput = Command.define('FocusInput', CompletedFocusInput);
|
|
|
136
134
|
export const ScrollIntoView = Command.define('ScrollIntoView', CompletedScrollIntoView);
|
|
137
135
|
/** Programmatically clicks the active combobox item's DOM element. */
|
|
138
136
|
export const ClickItem = Command.define('ClickItem', CompletedClickItem);
|
|
139
|
-
/**
|
|
140
|
-
export const
|
|
141
|
-
|
|
142
|
-
|
|
137
|
+
/** Detects whether the combobox input wrapper moved or the leave transition ended — whichever comes first. Both outcomes signal the Transition submodel that leave is complete. */
|
|
138
|
+
export const DetectMovementOrTransitionEnd = Command.define('DetectMovementOrTransitionEnd', GotTransitionMessage);
|
|
139
|
+
const delegateToTransition = (model, transitionMessage) => {
|
|
140
|
+
const [nextTransition, transitionCommands, maybeOutMessage] = transitionUpdate(model.transition, transitionMessage);
|
|
141
|
+
const mappedCommands = transitionCommands.map(Command.mapEffect(Effect.map(message => GotTransitionMessage({ message }))));
|
|
142
|
+
const additionalCommands = Option.match(maybeOutMessage, {
|
|
143
|
+
onNone: () => [],
|
|
144
|
+
onSome: M.type().pipe(M.tagsExhaustive({
|
|
145
|
+
StartedLeaveAnimating: () => [
|
|
146
|
+
DetectMovementOrTransitionEnd(Effect.raceFirst(Task.detectElementMovement(inputWrapperSelector(model.id)).pipe(Effect.as(GotTransitionMessage({
|
|
147
|
+
message: TransitionEndedTransition(),
|
|
148
|
+
}))), Task.waitForTransitions(itemsSelector(model.id)).pipe(Effect.as(GotTransitionMessage({
|
|
149
|
+
message: TransitionEndedTransition(),
|
|
150
|
+
}))))),
|
|
151
|
+
],
|
|
152
|
+
TransitionedOut: () => [],
|
|
153
|
+
})),
|
|
154
|
+
});
|
|
155
|
+
return [
|
|
156
|
+
constrainedEvo(model, { transition: () => nextTransition }),
|
|
157
|
+
[...mappedCommands, ...additionalCommands],
|
|
158
|
+
];
|
|
159
|
+
};
|
|
160
|
+
/** Creates a combobox update function from variant-specific handlers. Shared logic (open, close, activate, transition) is handled internally; only close, selection, and immediate-activation behavior varies by variant. */
|
|
143
161
|
export const makeUpdate = (handlers) => {
|
|
144
162
|
const withUpdateReturn = M.withReturnType();
|
|
145
163
|
return (model, message) => {
|
|
146
|
-
const maybeNextFrame = OptionExt.when(model.isAnimated, RequestFrame(Task.nextFrame.pipe(Effect.as(AdvancedTransitionFrame()))));
|
|
147
164
|
const maybeLockScroll = OptionExt.when(model.isModal, LockScroll(Task.lockScroll.pipe(Effect.as(CompletedLockScroll()))));
|
|
148
165
|
const maybeUnlockScroll = OptionExt.when(model.isModal, UnlockScroll(Task.unlockScroll.pipe(Effect.as(CompletedUnlockScroll()))));
|
|
149
166
|
const maybeInertOthers = OptionExt.when(model.isModal, InertOthers(Task.inertOthers(model.id, [
|
|
@@ -152,39 +169,41 @@ export const makeUpdate = (handlers) => {
|
|
|
152
169
|
]).pipe(Effect.as(CompletedSetupInert()))));
|
|
153
170
|
const maybeRestoreInert = OptionExt.when(model.isModal, RestoreInert(Task.restoreInert(model.id).pipe(Effect.as(CompletedTeardownInert()))));
|
|
154
171
|
const focusInput = FocusInput(Task.focus(inputSelector(model.id)).pipe(Effect.ignore, Effect.as(CompletedFocusInput())));
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
const nextModel =
|
|
158
|
-
isOpen: () => true,
|
|
159
|
-
transitionState: () => model.isAnimated ? 'EnterStart' : 'Idle',
|
|
160
|
-
maybeActiveItemIndex: () => maybeActiveItemIndex,
|
|
161
|
-
activationTrigger: () => Option.match(maybeActiveItemIndex, {
|
|
162
|
-
onNone: () => 'Pointer',
|
|
163
|
-
onSome: () => 'Keyboard',
|
|
164
|
-
}),
|
|
165
|
-
maybeLastPointerPosition: () => Option.none(),
|
|
166
|
-
});
|
|
172
|
+
const openCombobox = (baseModel) => {
|
|
173
|
+
if (model.isAnimated) {
|
|
174
|
+
const [nextModel, transitionCommands] = delegateToTransition(baseModel, TransitionShowed());
|
|
167
175
|
return [
|
|
168
|
-
nextModel,
|
|
169
|
-
|
|
176
|
+
constrainedEvo(nextModel, { isOpen: () => true }),
|
|
177
|
+
[
|
|
178
|
+
...Array.getSomes([maybeLockScroll, maybeInertOthers]),
|
|
179
|
+
...transitionCommands,
|
|
180
|
+
],
|
|
170
181
|
];
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
182
|
+
}
|
|
183
|
+
return [
|
|
184
|
+
constrainedEvo(baseModel, { isOpen: () => true }),
|
|
185
|
+
Array.getSomes([maybeLockScroll, maybeInertOthers]),
|
|
186
|
+
];
|
|
187
|
+
};
|
|
188
|
+
const closeCombobox = (baseModel, commands) => {
|
|
189
|
+
const closed = handlers.handleClose(baseModel);
|
|
190
|
+
if (model.isAnimated) {
|
|
191
|
+
const [nextModel, transitionCommands] = delegateToTransition(closed, TransitionHidden());
|
|
192
|
+
return [nextModel, [...commands, ...transitionCommands]];
|
|
193
|
+
}
|
|
194
|
+
return [closed, commands];
|
|
195
|
+
};
|
|
196
|
+
return M.value(message).pipe(withUpdateReturn, M.tagsExhaustive({
|
|
197
|
+
Opened: ({ maybeActiveItemIndex }) => openCombobox(constrainedEvo(model, {
|
|
198
|
+
maybeActiveItemIndex: () => maybeActiveItemIndex,
|
|
199
|
+
activationTrigger: () => Option.match(maybeActiveItemIndex, {
|
|
200
|
+
onNone: () => 'Pointer',
|
|
201
|
+
onSome: () => 'Keyboard',
|
|
202
|
+
}),
|
|
203
|
+
maybeLastPointerPosition: () => Option.none(),
|
|
204
|
+
})),
|
|
205
|
+
Closed: () => closeCombobox(model, [focusInput]),
|
|
206
|
+
ClosedByTab: () => closeCombobox(model, []),
|
|
188
207
|
ActivatedItem: ({ index, activationTrigger, maybeImmediateSelection, }) => {
|
|
189
208
|
const highlightedModel = constrainedEvo(model, {
|
|
190
209
|
maybeActiveItemIndex: () => Option.some(index),
|
|
@@ -225,12 +244,18 @@ export const makeUpdate = (handlers) => {
|
|
|
225
244
|
[],
|
|
226
245
|
]
|
|
227
246
|
: [model, []],
|
|
228
|
-
SelectedItem: ({ item, displayText }) =>
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
247
|
+
SelectedItem: ({ item, displayText }) => {
|
|
248
|
+
const [nextModel, commands] = handlers.handleSelectedItem(model, item, displayText, {
|
|
249
|
+
focusInput,
|
|
250
|
+
maybeUnlockScroll,
|
|
251
|
+
maybeRestoreInert,
|
|
252
|
+
});
|
|
253
|
+
if (model.isOpen && !nextModel.isOpen && model.isAnimated) {
|
|
254
|
+
const [transitionedModel, transitionCommands] = delegateToTransition(nextModel, TransitionHidden());
|
|
255
|
+
return [transitionedModel, [...commands, ...transitionCommands]];
|
|
256
|
+
}
|
|
257
|
+
return [nextModel, commands];
|
|
258
|
+
},
|
|
234
259
|
RequestedItemClick: ({ index }) => [
|
|
235
260
|
model,
|
|
236
261
|
[
|
|
@@ -248,73 +273,25 @@ export const makeUpdate = (handlers) => {
|
|
|
248
273
|
[],
|
|
249
274
|
];
|
|
250
275
|
}
|
|
251
|
-
|
|
252
|
-
isOpen: () => true,
|
|
253
|
-
transitionState: () => model.isAnimated ? 'EnterStart' : 'Idle',
|
|
276
|
+
return openCombobox(constrainedEvo(model, {
|
|
254
277
|
inputValue: () => value,
|
|
255
278
|
maybeActiveItemIndex: () => Option.some(0),
|
|
256
279
|
activationTrigger: () => 'Keyboard',
|
|
257
280
|
maybeLastPointerPosition: () => Option.none(),
|
|
258
|
-
});
|
|
259
|
-
return [
|
|
260
|
-
nextModel,
|
|
261
|
-
Array.getSomes([maybeNextFrame, maybeLockScroll, maybeInertOthers]),
|
|
262
|
-
];
|
|
281
|
+
}));
|
|
263
282
|
},
|
|
264
283
|
PressedToggleButton: () => {
|
|
265
284
|
if (model.isOpen) {
|
|
266
|
-
return [
|
|
267
|
-
handlers.handleClose(model),
|
|
268
|
-
pipe(Array.getSomes([
|
|
269
|
-
maybeNextFrame,
|
|
270
|
-
maybeUnlockScroll,
|
|
271
|
-
maybeRestoreInert,
|
|
272
|
-
]), Array.prepend(focusInput)),
|
|
273
|
-
];
|
|
285
|
+
return closeCombobox(model, [focusInput]);
|
|
274
286
|
}
|
|
275
|
-
const nextModel = constrainedEvo(model, {
|
|
276
|
-
isOpen: () => true,
|
|
277
|
-
transitionState: () => model.isAnimated ? 'EnterStart' : 'Idle',
|
|
287
|
+
const [nextModel, commands] = openCombobox(constrainedEvo(model, {
|
|
278
288
|
maybeActiveItemIndex: () => Option.none(),
|
|
279
289
|
activationTrigger: () => 'Pointer',
|
|
280
290
|
maybeLastPointerPosition: () => Option.none(),
|
|
281
|
-
});
|
|
282
|
-
return [
|
|
283
|
-
nextModel,
|
|
284
|
-
pipe(Array.getSomes([
|
|
285
|
-
maybeNextFrame,
|
|
286
|
-
maybeLockScroll,
|
|
287
|
-
maybeInertOthers,
|
|
288
|
-
]), Array.prepend(focusInput)),
|
|
289
|
-
];
|
|
291
|
+
}));
|
|
292
|
+
return [nextModel, [focusInput, ...commands]];
|
|
290
293
|
},
|
|
291
|
-
|
|
292
|
-
constrainedEvo(model, {
|
|
293
|
-
transitionState: () => 'EnterAnimating',
|
|
294
|
-
}),
|
|
295
|
-
[
|
|
296
|
-
WaitForTransitions(Task.waitForTransitions(itemsSelector(model.id)).pipe(Effect.as(EndedTransition()))),
|
|
297
|
-
],
|
|
298
|
-
]), M.when('LeaveStart', () => [
|
|
299
|
-
constrainedEvo(model, {
|
|
300
|
-
transitionState: () => 'LeaveAnimating',
|
|
301
|
-
}),
|
|
302
|
-
[
|
|
303
|
-
DetectMovementOrTransitionEnd(Effect.raceFirst(Task.detectElementMovement(inputWrapperSelector(model.id)).pipe(Effect.as(DetectedInputMovement())), Task.waitForTransitions(itemsSelector(model.id)).pipe(Effect.as(EndedTransition())))),
|
|
304
|
-
],
|
|
305
|
-
]), M.orElse(() => [model, []])),
|
|
306
|
-
EndedTransition: () => M.value(model.transitionState).pipe(withUpdateReturn, M.whenOr('EnterAnimating', 'LeaveAnimating', () => [
|
|
307
|
-
constrainedEvo(model, {
|
|
308
|
-
transitionState: () => 'Idle',
|
|
309
|
-
}),
|
|
310
|
-
[],
|
|
311
|
-
]), M.orElse(() => [model, []])),
|
|
312
|
-
DetectedInputMovement: () => M.value(model.transitionState).pipe(withUpdateReturn, M.when('LeaveAnimating', () => [
|
|
313
|
-
constrainedEvo(model, {
|
|
314
|
-
transitionState: () => 'Idle',
|
|
315
|
-
}),
|
|
316
|
-
[],
|
|
317
|
-
]), M.orElse(() => [model, []])),
|
|
294
|
+
GotTransitionMessage: ({ message: transitionMessage }) => delegateToTransition(model, transitionMessage),
|
|
318
295
|
CompletedLockScroll: () => [model, []],
|
|
319
296
|
CompletedUnlockScroll: () => [model, []],
|
|
320
297
|
CompletedSetupInert: () => [model, []],
|
|
@@ -328,7 +305,7 @@ export const makeUpdate = (handlers) => {
|
|
|
328
305
|
/** Creates a combobox view function from variant-specific behavior. Shared rendering logic (input, items, transitions, keyboard navigation) is handled internally; only selection display varies by variant. */
|
|
329
306
|
export const makeView = (behavior) => (config) => {
|
|
330
307
|
const { div, input, AriaActiveDescendant, AriaControls, AriaDisabled, AriaExpanded, AriaInvalid, AriaLabelledBy, AriaMultiSelectable, AriaSelected, Attribute, Autocomplete, Class, DataAttribute, Id, Name, OnBlur, OnClick, OnDestroy, OnFocus, OnInput, OnInsert, OnKeyDownPreventDefault, OnPointerLeave, OnPointerMove, Placeholder, Role, Style, Tabindex, Type, Value, keyed, } = html();
|
|
331
|
-
const { model: { id, isOpen, immediate, transitionState, maybeActiveItemIndex }, toParentMessage, onSelectedItem, items, itemToConfig, itemToValue, itemToDisplayText, isItemDisabled, inputClassName, inputAttributes = [], inputPlaceholder, inputWrapperClassName, inputWrapperAttributes = [], itemsClassName, itemsAttributes = [], itemsScrollClassName, itemsScrollAttributes = [], backdropClassName, backdropAttributes = [], className, attributes = [], buttonContent, buttonClassName, buttonAttributes = [], formName, isDisabled, isInvalid, openOnFocus, itemGroupKey, groupToHeading, groupClassName, groupAttributes = [], separatorClassName, separatorAttributes = [], anchor, } = config;
|
|
308
|
+
const { model: { id, isOpen, immediate, transition: { transitionState }, maybeActiveItemIndex, }, toParentMessage, onSelectedItem, items, itemToConfig, itemToValue, itemToDisplayText, isItemDisabled, inputClassName, inputAttributes = [], inputPlaceholder, inputWrapperClassName, inputWrapperAttributes = [], itemsClassName, itemsAttributes = [], itemsScrollClassName, itemsScrollAttributes = [], backdropClassName, backdropAttributes = [], className, attributes = [], buttonContent, buttonClassName, buttonAttributes = [], formName, isDisabled, isInvalid, openOnFocus, itemGroupKey, groupToHeading, groupClassName, groupAttributes = [], separatorClassName, separatorAttributes = [], anchor, } = config;
|
|
332
309
|
const dispatchSelectedItem = (item, index) => onSelectedItem
|
|
333
310
|
? onSelectedItem(itemToValue(item, index))
|
|
334
311
|
: toParentMessage(SelectedItem({
|
|
@@ -10,7 +10,11 @@ export declare const Model: S.extend<S.Struct<{
|
|
|
10
10
|
nullable: typeof S.Boolean;
|
|
11
11
|
immediate: typeof S.Boolean;
|
|
12
12
|
selectInputOnFocus: typeof S.Boolean;
|
|
13
|
-
|
|
13
|
+
transition: S.Struct<{
|
|
14
|
+
id: typeof S.String;
|
|
15
|
+
isShowing: typeof S.Boolean;
|
|
16
|
+
transitionState: S.Literal<["Idle", "EnterStart", "EnterAnimating", "LeaveStart", "LeaveAnimating"]>;
|
|
17
|
+
}>;
|
|
14
18
|
maybeActiveItemIndex: S.OptionFromSelf<typeof S.Number>;
|
|
15
19
|
activationTrigger: S.Literal<["Pointer", "Keyboard"]>;
|
|
16
20
|
inputValue: typeof S.String;
|
|
@@ -36,7 +40,11 @@ export declare const update: (model: {
|
|
|
36
40
|
readonly isOpen: boolean;
|
|
37
41
|
readonly isAnimated: boolean;
|
|
38
42
|
readonly isModal: boolean;
|
|
39
|
-
readonly
|
|
43
|
+
readonly transition: {
|
|
44
|
+
readonly id: string;
|
|
45
|
+
readonly isShowing: boolean;
|
|
46
|
+
readonly transitionState: "Idle" | "EnterStart" | "EnterAnimating" | "LeaveStart" | "LeaveAnimating";
|
|
47
|
+
};
|
|
40
48
|
readonly maybeActiveItemIndex: Option.Option<number>;
|
|
41
49
|
readonly activationTrigger: "Pointer" | "Keyboard";
|
|
42
50
|
readonly maybeLastPointerPosition: Option.Option<{
|
|
@@ -55,7 +63,11 @@ export declare const update: (model: {
|
|
|
55
63
|
readonly isOpen: boolean;
|
|
56
64
|
readonly isAnimated: boolean;
|
|
57
65
|
readonly isModal: boolean;
|
|
58
|
-
readonly
|
|
66
|
+
readonly transition: {
|
|
67
|
+
readonly id: string;
|
|
68
|
+
readonly isShowing: boolean;
|
|
69
|
+
readonly transitionState: "Idle" | "EnterStart" | "EnterAnimating" | "LeaveStart" | "LeaveAnimating";
|
|
70
|
+
};
|
|
59
71
|
readonly maybeActiveItemIndex: Option.Option<number>;
|
|
60
72
|
readonly activationTrigger: "Pointer" | "Keyboard";
|
|
61
73
|
readonly maybeLastPointerPosition: Option.Option<{
|
|
@@ -89,10 +101,6 @@ export declare const update: (model: {
|
|
|
89
101
|
readonly _tag: "CompletedScrollIntoView";
|
|
90
102
|
} | {
|
|
91
103
|
readonly _tag: "CompletedClickItem";
|
|
92
|
-
} | {
|
|
93
|
-
readonly _tag: "AdvancedTransitionFrame";
|
|
94
|
-
} | {
|
|
95
|
-
readonly _tag: "EndedTransition";
|
|
96
104
|
} | {
|
|
97
105
|
readonly _tag: "Opened";
|
|
98
106
|
readonly maybeActiveItemIndex: Option.Option<number>;
|
|
@@ -119,7 +127,16 @@ export declare const update: (model: {
|
|
|
119
127
|
} | {
|
|
120
128
|
readonly _tag: "CompletedFocusInput";
|
|
121
129
|
} | {
|
|
122
|
-
readonly _tag: "
|
|
130
|
+
readonly _tag: "GotTransitionMessage";
|
|
131
|
+
readonly message: {
|
|
132
|
+
readonly _tag: "Showed";
|
|
133
|
+
} | {
|
|
134
|
+
readonly _tag: "Hidden";
|
|
135
|
+
} | {
|
|
136
|
+
readonly _tag: "AdvancedTransitionFrame";
|
|
137
|
+
} | {
|
|
138
|
+
readonly _tag: "EndedTransition";
|
|
139
|
+
};
|
|
123
140
|
} | {
|
|
124
141
|
readonly _tag: "UpdatedInputValue";
|
|
125
142
|
readonly value: string;
|
|
@@ -136,7 +153,11 @@ export declare const view: <Message, Item extends string>(config: Readonly<{
|
|
|
136
153
|
readonly isOpen: boolean;
|
|
137
154
|
readonly isAnimated: boolean;
|
|
138
155
|
readonly isModal: boolean;
|
|
139
|
-
readonly
|
|
156
|
+
readonly transition: {
|
|
157
|
+
readonly id: string;
|
|
158
|
+
readonly isShowing: boolean;
|
|
159
|
+
readonly transitionState: "Idle" | "EnterStart" | "EnterAnimating" | "LeaveStart" | "LeaveAnimating";
|
|
160
|
+
};
|
|
140
161
|
readonly maybeActiveItemIndex: Option.Option<number>;
|
|
141
162
|
readonly activationTrigger: "Pointer" | "Keyboard";
|
|
142
163
|
readonly maybeLastPointerPosition: Option.Option<{
|
|
@@ -151,7 +172,7 @@ export declare const view: <Message, Item extends string>(config: Readonly<{
|
|
|
151
172
|
readonly maybeSelectedItem: Option.Option<string>;
|
|
152
173
|
readonly maybeSelectedDisplayText: Option.Option<string>;
|
|
153
174
|
};
|
|
154
|
-
toParentMessage: (message: import("./shared").Opened | import("./shared").Closed | import("./shared").ClosedByTab | import("./shared").ActivatedItem | import("./shared").DeactivatedItem | import("./shared").SelectedItem | import("./shared").MovedPointerOverItem | import("./shared").RequestedItemClick | import("./shared").UpdatedInputValue | import("./shared").PressedToggleButton
|
|
175
|
+
toParentMessage: (message: import("./shared").Opened | import("./shared").Closed | import("./shared").ClosedByTab | import("./shared").ActivatedItem | import("./shared").DeactivatedItem | import("./shared").SelectedItem | import("./shared").MovedPointerOverItem | import("./shared").RequestedItemClick | import("./shared").UpdatedInputValue | import("./shared").PressedToggleButton) => Message;
|
|
155
176
|
onSelectedItem?: (value: string) => Message;
|
|
156
177
|
items: readonly Item[];
|
|
157
178
|
itemToConfig: (item: Item, context: Readonly<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"single.d.ts","sourceRoot":"","sources":["../../../src/ui/combobox/single.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAE,MAAM,IAAI,CAAC,EAAQ,MAAM,QAAQ,CAAA;AAEzD,OAAO,EAAE,KAAK,IAAI,EAAc,MAAM,YAAY,CAAA;AAElD,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,cAAc,EAKpB,MAAM,UAAU,CAAA;AAIjB,uJAAuJ;AACvJ,eAAO,MAAM,KAAK
|
|
1
|
+
{"version":3,"file":"single.d.ts","sourceRoot":"","sources":["../../../src/ui/combobox/single.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAE,MAAM,IAAI,CAAC,EAAQ,MAAM,QAAQ,CAAA;AAEzD,OAAO,EAAE,KAAK,IAAI,EAAc,MAAM,YAAY,CAAA;AAElD,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,cAAc,EAKpB,MAAM,UAAU,CAAA;AAIjB,uJAAuJ;AACvJ,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;GAOjB,CAAA;AAED,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,8RAA8R;AAC9R,MAAM,MAAM,UAAU,GAAG,cAAc,GACrC,QAAQ,CAAC;IACP,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC7B,CAAC,CAAA;AAEJ,4IAA4I;AAC5I,eAAO,MAAM,IAAI,GAAI,QAAQ,UAAU,KAAG,KAMxC,CAAA;AAIF,uIAAuI;AACvI,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAiDjB,CAAA;AAIF,wEAAwE;AACxE,MAAM,MAAM,UAAU,CAAC,OAAO,EAAE,IAAI,SAAS,MAAM,IAAI,cAAc,CACnE,OAAO,EACP,IAAI,EACJ,KAAK,CACN,CAAA;AAED,0IAA0I;AAC1I,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAOf,CAAA;AAEF;mFACmF;AACnF,eAAO,MAAM,IAAI,GAAI,OAAO,EAAE,IAAI,SAAS,MAAM,EAC/C,cAAc,IAAI,CAChB,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,EACzB,OAAO,GAAG,iBAAiB,GAAG,gBAAgB,CAC/C,KACA,CAAC,CACF,KAAK,EAAE,KAAK,EACZ,eAAe,EAAE,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,iBAAiB,CAAC,KACrE,IAAI,CAoBR,CAAA"}
|
|
@@ -44,11 +44,7 @@ export const update = makeUpdate({
|
|
|
44
44
|
});
|
|
45
45
|
return [
|
|
46
46
|
nextModel,
|
|
47
|
-
pipe(Array.getSomes([
|
|
48
|
-
context.maybeNextFrame,
|
|
49
|
-
context.maybeUnlockScroll,
|
|
50
|
-
context.maybeRestoreInert,
|
|
51
|
-
]), Array.prepend(context.focusInput)),
|
|
47
|
+
pipe(Array.getSomes([context.maybeUnlockScroll, context.maybeRestoreInert]), Array.prepend(context.focusInput)),
|
|
52
48
|
];
|
|
53
49
|
},
|
|
54
50
|
handleImmediateActivation: (model, item, displayText) => evo(model, {
|