foldkit 0.36.3 → 0.37.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 +4 -5
- package/dist/command/index.d.ts +36 -2
- package/dist/command/index.d.ts.map +1 -1
- package/dist/command/index.js +11 -1
- package/dist/command/public.d.ts +1 -0
- package/dist/command/public.d.ts.map +1 -1
- package/dist/command/public.js +1 -1
- package/dist/devtools/overlay.d.ts.map +1 -1
- package/dist/devtools/overlay.js +16 -15
- package/dist/devtools/store.d.ts +2 -2
- package/dist/devtools/store.d.ts.map +1 -1
- package/dist/devtools/store.js +2 -2
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +10 -4
- package/dist/ui/combobox/multi.d.ts +56 -53
- package/dist/ui/combobox/multi.d.ts.map +1 -1
- package/dist/ui/combobox/shared.d.ts +63 -60
- package/dist/ui/combobox/shared.d.ts.map +1 -1
- package/dist/ui/combobox/shared.js +11 -10
- package/dist/ui/combobox/single.d.ts +56 -53
- package/dist/ui/combobox/single.d.ts.map +1 -1
- package/dist/ui/dialog/index.d.ts +2 -2
- package/dist/ui/dialog/index.d.ts.map +1 -1
- package/dist/ui/dialog/index.js +7 -6
- package/dist/ui/disclosure/index.d.ts +2 -2
- package/dist/ui/disclosure/index.d.ts.map +1 -1
- package/dist/ui/disclosure/index.js +3 -2
- package/dist/ui/listbox/multi.d.ts +65 -62
- package/dist/ui/listbox/multi.d.ts.map +1 -1
- package/dist/ui/listbox/shared.d.ts +71 -68
- package/dist/ui/listbox/shared.d.ts.map +1 -1
- package/dist/ui/listbox/shared.js +14 -13
- package/dist/ui/listbox/single.d.ts +65 -62
- package/dist/ui/listbox/single.d.ts.map +1 -1
- package/dist/ui/menu/index.d.ts +2 -2
- package/dist/ui/menu/index.d.ts.map +1 -1
- package/dist/ui/menu/index.js +17 -16
- package/dist/ui/popover/index.d.ts +2 -2
- package/dist/ui/popover/index.d.ts.map +1 -1
- package/dist/ui/popover/index.js +12 -11
- package/dist/ui/radioGroup/index.d.ts +2 -2
- package/dist/ui/radioGroup/index.d.ts.map +1 -1
- package/dist/ui/radioGroup/index.js +2 -1
- package/dist/ui/tabs/index.d.ts +2 -2
- package/dist/ui/tabs/index.d.ts.map +1 -1
- package/dist/ui/tabs/index.js +3 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -47,8 +47,7 @@ This is a complete Foldkit program. State lives in a single Model. Events become
|
|
|
47
47
|
|
|
48
48
|
```ts
|
|
49
49
|
import { Match as M, Schema as S } from 'effect'
|
|
50
|
-
import { Runtime } from 'foldkit'
|
|
51
|
-
import { Command } from 'foldkit/command'
|
|
50
|
+
import { Command, Runtime } from 'foldkit'
|
|
52
51
|
import { Html, html } from 'foldkit/html'
|
|
53
52
|
import { m } from 'foldkit/message'
|
|
54
53
|
|
|
@@ -71,9 +70,9 @@ type Message = typeof Message.Type
|
|
|
71
70
|
const update = (
|
|
72
71
|
model: Model,
|
|
73
72
|
message: Message,
|
|
74
|
-
): [Model, ReadonlyArray<Command<Message>>] =>
|
|
73
|
+
): [Model, ReadonlyArray<Command.Command<Message>>] =>
|
|
75
74
|
M.value(message).pipe(
|
|
76
|
-
M.withReturnType<[Model, ReadonlyArray<Command<Message>>]>(),
|
|
75
|
+
M.withReturnType<[Model, ReadonlyArray<Command.Command<Message>>]>(),
|
|
77
76
|
M.tagsExhaustive({
|
|
78
77
|
ClickedDecrement: () => [{ count: model.count - 1 }, []],
|
|
79
78
|
ClickedIncrement: () => [{ count: model.count + 1 }, []],
|
|
@@ -135,7 +134,7 @@ Source: [examples/counter/src/main.ts](https://github.com/foldkit/foldkit/blob/m
|
|
|
135
134
|
|
|
136
135
|
Foldkit is a complete system, not a collection of libraries you stitch together.
|
|
137
136
|
|
|
138
|
-
- **Commands** — Side effects are
|
|
137
|
+
- **Commands** — Side effects are named Effects that return Messages and are executed by the runtime. Each Command has a `name` for identification in tracing and testing, and an `effect` that the runtime runs. Use any Effect combinator you want — retry, timeout, race, parallel.
|
|
139
138
|
- **Routing** — Type-safe bidirectional routing. URLs parse into typed routes and routes build back into URLs. No string matching, no mismatches between parsing and building.
|
|
140
139
|
- **Subscriptions** — Declare which streams your app needs as a function of the Model. The runtime diffs and switches them when the Model changes.
|
|
141
140
|
- **Managed Resources** — Model-driven lifecycle for long-lived browser resources like WebSockets, AudioContext, and RTCPeerConnection. Acquire on state change, release on cleanup.
|
package/dist/command/index.d.ts
CHANGED
|
@@ -1,4 +1,38 @@
|
|
|
1
1
|
import { Effect, Schema } from 'effect';
|
|
2
|
-
/**
|
|
3
|
-
export type Command<T, E = never, R = never> =
|
|
2
|
+
/** A named Effect that produces a message. */
|
|
3
|
+
export type Command<T, E = never, R = never> = [T] extends [Schema.Schema.Any] ? {
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly effect: Effect.Effect<Schema.Schema.Type<T>, E, R>;
|
|
6
|
+
} : {
|
|
7
|
+
readonly name: string;
|
|
8
|
+
readonly effect: Effect.Effect<T, E, R>;
|
|
9
|
+
};
|
|
10
|
+
/** Creates a named Command from an Effect. */
|
|
11
|
+
export declare const make: {
|
|
12
|
+
(name: string): <A, E, R>(effect: Effect.Effect<A, E, R>) => Readonly<{
|
|
13
|
+
name: string;
|
|
14
|
+
effect: Effect.Effect<A, E, R>;
|
|
15
|
+
}>;
|
|
16
|
+
<A, E = never, R = never>(name: string, effect: Effect.Effect<A, E, R>): Readonly<{
|
|
17
|
+
name: string;
|
|
18
|
+
effect: Effect.Effect<A, E, R>;
|
|
19
|
+
}>;
|
|
20
|
+
};
|
|
21
|
+
/** Transforms the Effect inside a Command while preserving its name. */
|
|
22
|
+
export declare const mapEffect: {
|
|
23
|
+
<A, E, R, B>(f: (effect: Effect.Effect<A, E, R>) => Effect.Effect<B, E, R>): (command: Readonly<{
|
|
24
|
+
name: string;
|
|
25
|
+
effect: Effect.Effect<A, E, R>;
|
|
26
|
+
}>) => Readonly<{
|
|
27
|
+
name: string;
|
|
28
|
+
effect: Effect.Effect<B, E, R>;
|
|
29
|
+
}>;
|
|
30
|
+
<A, E1, R1, B, E2, R2>(command: Readonly<{
|
|
31
|
+
name: string;
|
|
32
|
+
effect: Effect.Effect<A, E1, R1>;
|
|
33
|
+
}>, f: (effect: Effect.Effect<A, E1, R1>) => Effect.Effect<B, E2, R2>): Readonly<{
|
|
34
|
+
name: string;
|
|
35
|
+
effect: Effect.Effect<B, E2, R2>;
|
|
36
|
+
}>;
|
|
37
|
+
};
|
|
4
38
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/command/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEvC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/command/index.ts"],"names":[],"mappings":"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"}
|
package/dist/command/index.js
CHANGED
|
@@ -1 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
/** Creates a named Command from an Effect. */
|
|
2
|
+
export const make = ((...args) => args.length === 1
|
|
3
|
+
? (effect) => ({ name: args[0], effect })
|
|
4
|
+
: { name: args[0], effect: args[1] });
|
|
5
|
+
/** Transforms the Effect inside a Command while preserving its name. */
|
|
6
|
+
export const mapEffect = ((...args) => args.length === 1
|
|
7
|
+
? (command) => ({
|
|
8
|
+
name: command.name,
|
|
9
|
+
effect: args[0](command.effect),
|
|
10
|
+
})
|
|
11
|
+
: { name: args[0].name, effect: args[1](args[0].effect) });
|
package/dist/command/public.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/command/public.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA"}
|
|
1
|
+
{"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/command/public.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA"}
|
package/dist/command/public.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export {};
|
|
1
|
+
export { make, mapEffect } from './index';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../src/devtools/overlay.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,MAAM,EAIN,MAAM,EAQP,MAAM,QAAQ,CAAA;AAOf,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAMxE,OAAO,EAAE,KAAK,aAAa,EAA+B,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../src/devtools/overlay.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,MAAM,EAIN,MAAM,EAQP,MAAM,QAAQ,CAAA;AAOf,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAMxE,OAAO,EAAE,KAAK,aAAa,EAA+B,MAAM,SAAS,CAAA;AA6yCzE,eAAO,MAAM,aAAa,GACxB,OAAO,aAAa,EACpB,UAAU,gBAAgB,EAC1B,MAAM,YAAY,EAClB,aAAa,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,sCA4ChC,CAAA"}
|
package/dist/devtools/overlay.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { clsx } from 'clsx';
|
|
2
2
|
import { Array as Array_, Effect, HashSet, Match as M, Number as Number_, Option, Predicate, Record, Schema as S, Stream, String as String_, SubscriptionRef, pipe, } from 'effect';
|
|
3
|
+
import * as Command from '../command';
|
|
3
4
|
import { OptionExt } from '../effectExtensions';
|
|
4
5
|
import { createKeyedLazy, html } from '../html';
|
|
5
6
|
import { m } from '../message';
|
|
@@ -13,7 +14,7 @@ import { INIT_INDEX } from './store';
|
|
|
13
14
|
// MODEL
|
|
14
15
|
const DisplayEntry = S.Struct({
|
|
15
16
|
tag: S.String,
|
|
16
|
-
|
|
17
|
+
commandNames: S.Array(S.String),
|
|
17
18
|
timestamp: S.Number,
|
|
18
19
|
isModelChanged: S.Boolean,
|
|
19
20
|
});
|
|
@@ -87,9 +88,9 @@ const TREE_INDENT_PX = 12;
|
|
|
87
88
|
const MAX_PREVIEW_KEYS = 3;
|
|
88
89
|
const formatTimeDelta = (deltaMs) => M.value(deltaMs).pipe(M.when(0, () => '0ms'), M.when(Number_.lessThan(MILLIS_PER_SECOND), ms => `+${Math.round(ms)}ms`), M.orElse(ms => `+${(ms / MILLIS_PER_SECOND).toFixed(1)}s`));
|
|
89
90
|
const MESSAGE_LIST_SELECTOR = '.message-list';
|
|
90
|
-
const toDisplayEntries = ({ entries }) => Array_.map(entries, ({ tag,
|
|
91
|
+
const toDisplayEntries = ({ entries }) => Array_.map(entries, ({ tag, commandNames, timestamp, isModelChanged }) => ({
|
|
91
92
|
tag,
|
|
92
|
-
|
|
93
|
+
commandNames,
|
|
93
94
|
timestamp,
|
|
94
95
|
isModelChanged,
|
|
95
96
|
}));
|
|
@@ -177,7 +178,7 @@ const makeUpdate = (store, shadow, mode) => {
|
|
|
177
178
|
const jumpTo = (index) => Effect.gen(function* () {
|
|
178
179
|
yield* store.jumpTo(index);
|
|
179
180
|
return CompletedJump();
|
|
180
|
-
});
|
|
181
|
+
}).pipe(Command.make('JumpTo'));
|
|
181
182
|
const inspectState = (index) => Effect.gen(function* () {
|
|
182
183
|
const model = yield* store.getModelAtIndex(index);
|
|
183
184
|
const maybeMessage = yield* store.getMessageAtIndex(index);
|
|
@@ -185,32 +186,32 @@ const makeUpdate = (store, shadow, mode) => {
|
|
|
185
186
|
? emptyDiff
|
|
186
187
|
: yield* pipe(store.getModelAtIndex(index - 1), Effect.map(previousModel => computeDiff(previousModel, model)), Effect.catchAll(() => Effect.succeed(emptyDiff)));
|
|
187
188
|
return ReceivedInspectedState({ model, maybeMessage, ...diff });
|
|
188
|
-
});
|
|
189
|
+
}).pipe(Command.make('InspectState'));
|
|
189
190
|
const inspectLatest = Effect.gen(function* () {
|
|
190
191
|
const state = yield* SubscriptionRef.get(store.stateRef);
|
|
191
192
|
const latestIndex = Array_.isEmptyReadonlyArray(state.entries)
|
|
192
193
|
? INIT_INDEX
|
|
193
194
|
: state.startIndex + state.entries.length - 1;
|
|
194
|
-
return yield* inspectState(latestIndex);
|
|
195
|
-
});
|
|
195
|
+
return yield* inspectState(latestIndex).effect;
|
|
196
|
+
}).pipe(Command.make('InspectLatest'));
|
|
196
197
|
const resume = Effect.gen(function* () {
|
|
197
198
|
yield* store.resume;
|
|
198
199
|
return CompletedResume();
|
|
199
|
-
});
|
|
200
|
+
}).pipe(Command.make('Resume'));
|
|
200
201
|
const clear = Effect.gen(function* () {
|
|
201
202
|
yield* store.clear;
|
|
202
203
|
return CompletedClear();
|
|
203
|
-
});
|
|
204
|
+
}).pipe(Command.make('Clear'));
|
|
204
205
|
const toggleScrollLock = (shouldLock) => shouldLock
|
|
205
|
-
? lockScroll.pipe(Effect.as(LockedScroll()))
|
|
206
|
-
: unlockScroll.pipe(Effect.as(UnlockedScroll()));
|
|
206
|
+
? lockScroll.pipe(Effect.as(LockedScroll()), Command.make('LockScroll'))
|
|
207
|
+
: unlockScroll.pipe(Effect.as(UnlockedScroll()), Command.make('UnlockScroll'));
|
|
207
208
|
const scrollToTop = Effect.sync(() => {
|
|
208
209
|
const messageList = shadow.querySelector(MESSAGE_LIST_SELECTOR);
|
|
209
210
|
if (messageList instanceof HTMLElement) {
|
|
210
211
|
messageList.scrollTop = 0;
|
|
211
212
|
}
|
|
212
213
|
return ScrolledToTop();
|
|
213
|
-
});
|
|
214
|
+
}).pipe(Command.make('ScrollToTop'));
|
|
214
215
|
return (model, message) => M.value(message).pipe(M.withReturnType(), M.tags({
|
|
215
216
|
ClickedToggle: () => {
|
|
216
217
|
const nextIsOpen = !model.isOpen;
|
|
@@ -284,7 +285,7 @@ const makeUpdate = (store, shadow, mode) => {
|
|
|
284
285
|
evo(model, {
|
|
285
286
|
inspectorTabs: () => nextTabsModel,
|
|
286
287
|
}),
|
|
287
|
-
tabsCommands.map(Effect.map(innerMessage => GotInspectorTabsMessage({ message: innerMessage }))),
|
|
288
|
+
tabsCommands.map(Command.mapEffect(Effect.map(innerMessage => GotInspectorTabsMessage({ message: innerMessage })))),
|
|
288
289
|
];
|
|
289
290
|
},
|
|
290
291
|
ToggledTreeNode: ({ path }) => [
|
|
@@ -320,14 +321,14 @@ const SubscriptionDeps = S.Struct({
|
|
|
320
321
|
const makeOverlaySubscriptions = (store) => makeSubscriptions(SubscriptionDeps)({
|
|
321
322
|
storeUpdates: {
|
|
322
323
|
modelToDependencies: () => null,
|
|
323
|
-
depsToStream: () => Stream.concat(Stream.make(pipe(SubscriptionRef.get(store.stateRef), Effect.map(state => ReceivedStoreUpdate(toDisplayState(state))))), pipe(store.stateRef.changes, Stream.map(state => Effect.succeed(ReceivedStoreUpdate(toDisplayState(state)))))),
|
|
324
|
+
depsToStream: () => Stream.concat(Stream.make(pipe(SubscriptionRef.get(store.stateRef), Effect.map(state => ReceivedStoreUpdate(toDisplayState(state))), Command.make('LoadStoreState'))), pipe(store.stateRef.changes, Stream.map(state => Effect.succeed(ReceivedStoreUpdate(toDisplayState(state))).pipe(Command.make('ReceiveStoreUpdate'))))),
|
|
324
325
|
},
|
|
325
326
|
mobileBreakpoint: {
|
|
326
327
|
modelToDependencies: () => null,
|
|
327
328
|
depsToStream: () => Stream.async(emit => {
|
|
328
329
|
const mediaQuery = window.matchMedia(MOBILE_BREAKPOINT_QUERY);
|
|
329
330
|
const handler = (event) => {
|
|
330
|
-
emit.single(Effect.succeed(CrossedMobileBreakpoint({ isMobile: event.matches })));
|
|
331
|
+
emit.single(Effect.succeed(CrossedMobileBreakpoint({ isMobile: event.matches })).pipe(Command.make('CrossMobileBreakpoint')));
|
|
331
332
|
};
|
|
332
333
|
mediaQuery.addEventListener('change', handler);
|
|
333
334
|
return Effect.sync(() => mediaQuery.removeEventListener('change', handler));
|
package/dist/devtools/store.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export declare const INIT_INDEX = -1;
|
|
|
3
3
|
export type HistoryEntry = Readonly<{
|
|
4
4
|
tag: string;
|
|
5
5
|
message: unknown;
|
|
6
|
-
|
|
6
|
+
commandNames: ReadonlyArray<string>;
|
|
7
7
|
timestamp: number;
|
|
8
8
|
isModelChanged: boolean;
|
|
9
9
|
}>;
|
|
@@ -25,7 +25,7 @@ export type DevtoolsStore = Readonly<{
|
|
|
25
25
|
recordInit: (model: unknown) => Effect.Effect<void>;
|
|
26
26
|
recordMessage: (message: Readonly<{
|
|
27
27
|
_tag: string;
|
|
28
|
-
}>, modelAfterUpdate: unknown,
|
|
28
|
+
}>, modelAfterUpdate: unknown, commandNames: ReadonlyArray<string>, isModelChanged: boolean) => Effect.Effect<void>;
|
|
29
29
|
getModelAtIndex: (index: number) => Effect.Effect<unknown>;
|
|
30
30
|
getMessageAtIndex: (index: number) => Effect.Effect<Option.Option<unknown>>;
|
|
31
31
|
jumpTo: (index: number) => Effect.Effect<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/devtools/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAQ,MAAM,QAAQ,CAAA;AAE9E,eAAO,MAAM,UAAU,KAAK,CAAA;AAI5B,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IAClC,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,OAAO,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/devtools/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAQ,MAAM,QAAQ,CAAA;AAE9E,eAAO,MAAM,UAAU,KAAK,CAAA;AAI5B,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IAClC,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,OAAO,CAAA;IAChB,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IACnC,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,OAAO,CAAA;CACxB,CAAC,CAAA;AAEF,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAChC,OAAO,EAAE,aAAa,CAAC,YAAY,CAAC,CAAA;IACpC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC3C,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACtC,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,OAAO,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;CACtB,CAAC,CAAA;AAEF,MAAM,MAAM,MAAM,GAAG,QAAQ,CAAC;IAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAA;IACrD,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC/C,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;CACxC,CAAC,CAAA;AAWF,eAAO,MAAM,mBAAmB,GAC9B,QAAQ,MAAM,EACd,mBAAgC,KAC/B,MAAM,CAAC,MAAM,CAAC,aAAa,CA2J1B,CAAA;AAEJ,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC;IACnC,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACnD,aAAa,EAAE,CACb,OAAO,EAAE,QAAQ,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,EACnC,gBAAgB,EAAE,OAAO,EACzB,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,EACnC,cAAc,EAAE,OAAO,KACpB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACxB,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAC1D,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;IAC3E,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC9C,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC1B,QAAQ,EAAE,eAAe,CAAC,eAAe,CAAC,UAAU,CAAC,CAAA;CACtD,CAAC,CAAA"}
|
package/dist/devtools/store.js
CHANGED
|
@@ -39,14 +39,14 @@ export const createDevtoolsStore = (bridge, maxEntries = DEFAULT_MAX_ENTRIES) =>
|
|
|
39
39
|
maybeInitModel: Option.some(model),
|
|
40
40
|
keyframes: HashMap.set(state.keyframes, 0, model),
|
|
41
41
|
}));
|
|
42
|
-
const recordMessage = (message, modelAfterUpdate,
|
|
42
|
+
const recordMessage = (message, modelAfterUpdate, commandNames, isModelChanged) => SubscriptionRef.update(stateRef, state => {
|
|
43
43
|
const absoluteIndex = state.startIndex + state.entries.length;
|
|
44
44
|
const nextState = {
|
|
45
45
|
...state,
|
|
46
46
|
entries: Array.append(state.entries, {
|
|
47
47
|
tag: message._tag,
|
|
48
48
|
message,
|
|
49
|
-
|
|
49
|
+
commandNames,
|
|
50
50
|
timestamp: performance.now(),
|
|
51
51
|
isModelChanged,
|
|
52
52
|
}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/runtime.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,OAAO,EACP,MAAM,EAGN,KAAK,EAEL,MAAM,EAMN,MAAM,EAKP,MAAM,QAAQ,CAAA;AAGf,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAGzC,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAC9B,OAAO,EAAE,GAAG,EAA+B,MAAM,QAAQ,CAAA;AAOzD,OAAO,KAAK,EAAyB,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAChF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/runtime.js
CHANGED
|
@@ -75,7 +75,9 @@ const makeRuntime = ({ Model, flags: resolveFlags, init, update, view, subscript
|
|
|
75
75
|
}))
|
|
76
76
|
: init(flags, Option.getOrUndefined(currentUrl));
|
|
77
77
|
const modelSubscriptionRef = yield* SubscriptionRef.make(initModel);
|
|
78
|
-
yield* Effect.forEach(
|
|
78
|
+
yield* Effect.forEach(
|
|
79
|
+
/* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
|
|
80
|
+
initCommands, command => Effect.forkDaemon(command.effect.pipe(Effect.withSpan(command.name), provideAllResources, Effect.flatMap(enqueueMessage))));
|
|
79
81
|
if (browserConfig) {
|
|
80
82
|
addNavigationEventListeners(messageQueue, browserConfig);
|
|
81
83
|
}
|
|
@@ -101,13 +103,17 @@ const makeRuntime = ({ Model, flags: resolveFlags, init, update, view, subscript
|
|
|
101
103
|
preserveModel(nextModel);
|
|
102
104
|
}
|
|
103
105
|
}
|
|
104
|
-
yield* Effect.forEach(
|
|
106
|
+
yield* Effect.forEach(
|
|
107
|
+
/* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
|
|
108
|
+
commands, command => Effect.forkDaemon(command.effect.pipe(Effect.withSpan(command.name), provideAllResources, Effect.flatMap(enqueueMessage))));
|
|
105
109
|
const maybeDevtoolsStore = yield* Ref.get(maybeDevtoolsStoreRef);
|
|
106
110
|
yield* Option.match(maybeDevtoolsStore, {
|
|
107
111
|
onNone: () => Effect.void,
|
|
108
112
|
onSome: store => store.recordMessage(
|
|
109
113
|
/* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
|
|
110
|
-
message, nextModel,
|
|
114
|
+
message, nextModel, Array.map(
|
|
115
|
+
/* eslint-disable-next-line @typescript-eslint/consistent-type-assertions */
|
|
116
|
+
commands, command => command.name), !modelEquivalence(currentModel, nextModel)),
|
|
111
117
|
});
|
|
112
118
|
});
|
|
113
119
|
const runProcessMessage = (message, messageEffect) => (runtime) => {
|
|
@@ -191,7 +197,7 @@ const makeRuntime = ({ Model, flags: resolveFlags, init, update, view, subscript
|
|
|
191
197
|
if (subscriptions) {
|
|
192
198
|
yield* pipe(subscriptions, Record.toEntries, Effect.forEach(([_key, { schema, modelToDependencies, depsToStream }]) => {
|
|
193
199
|
const modelStream = Stream.concat(Stream.make(initModel), modelSubscriptionRef.changes);
|
|
194
|
-
return Effect.forkDaemon(modelStream.pipe(Stream.map(modelToDependencies), Stream.changesWith(Schema.equivalence(schema)), Stream.flatMap(depsToStream, { switch: true }), Stream.runForEach(command => command.pipe(Effect.flatMap(enqueueMessage))), provideAllResources));
|
|
200
|
+
return Effect.forkDaemon(modelStream.pipe(Stream.map(modelToDependencies), Stream.changesWith(Schema.equivalence(schema)), Stream.flatMap(depsToStream, { switch: true }), Stream.runForEach((command) => command.effect.pipe(Effect.withSpan(command.name), Effect.flatMap(enqueueMessage))), provideAllResources));
|
|
195
201
|
}, {
|
|
196
202
|
concurrency: 'unbounded',
|
|
197
203
|
discard: true,
|
|
@@ -65,61 +65,64 @@ export declare const update: (model: {
|
|
|
65
65
|
}>;
|
|
66
66
|
} & {
|
|
67
67
|
readonly selectedItems: readonly string[];
|
|
68
|
-
}, readonly
|
|
69
|
-
readonly
|
|
70
|
-
readonly
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
} | {
|
|
74
|
-
|
|
75
|
-
} | {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
68
|
+
}, readonly {
|
|
69
|
+
readonly name: string;
|
|
70
|
+
readonly effect: import("effect/Effect").Effect<{
|
|
71
|
+
readonly _tag: "Opened";
|
|
72
|
+
readonly maybeActiveItemIndex: import("effect/Option").Option<number>;
|
|
73
|
+
} | {
|
|
74
|
+
readonly _tag: "Closed";
|
|
75
|
+
} | {
|
|
76
|
+
readonly _tag: "ClosedByTab";
|
|
77
|
+
} | {
|
|
78
|
+
readonly _tag: "ActivatedItem";
|
|
79
|
+
readonly index: number;
|
|
80
|
+
readonly activationTrigger: "Pointer" | "Keyboard";
|
|
81
|
+
readonly maybeImmediateSelection: import("effect/Option").Option<{
|
|
82
|
+
readonly item: string;
|
|
83
|
+
readonly displayText: string;
|
|
84
|
+
}>;
|
|
85
|
+
} | {
|
|
86
|
+
readonly _tag: "DeactivatedItem";
|
|
87
|
+
} | {
|
|
88
|
+
readonly _tag: "SelectedItem";
|
|
80
89
|
readonly item: string;
|
|
81
90
|
readonly displayText: string;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
} | {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
} | {
|
|
114
|
-
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
} | {
|
|
118
|
-
readonly _tag: "UpdatedInputValue";
|
|
119
|
-
readonly value: string;
|
|
120
|
-
} | {
|
|
121
|
-
readonly _tag: "PressedToggleButton";
|
|
122
|
-
}>[]];
|
|
91
|
+
} | {
|
|
92
|
+
readonly _tag: "MovedPointerOverItem";
|
|
93
|
+
readonly index: number;
|
|
94
|
+
readonly screenX: number;
|
|
95
|
+
readonly screenY: number;
|
|
96
|
+
} | {
|
|
97
|
+
readonly _tag: "RequestedItemClick";
|
|
98
|
+
readonly index: number;
|
|
99
|
+
} | {
|
|
100
|
+
readonly _tag: "CompletedScrollLock";
|
|
101
|
+
} | {
|
|
102
|
+
readonly _tag: "CompletedScrollUnlock";
|
|
103
|
+
} | {
|
|
104
|
+
readonly _tag: "CompletedInertSetup";
|
|
105
|
+
} | {
|
|
106
|
+
readonly _tag: "CompletedInertTeardown";
|
|
107
|
+
} | {
|
|
108
|
+
readonly _tag: "CompletedInputFocus";
|
|
109
|
+
} | {
|
|
110
|
+
readonly _tag: "CompletedScrollIntoView";
|
|
111
|
+
} | {
|
|
112
|
+
readonly _tag: "CompletedItemClick";
|
|
113
|
+
} | {
|
|
114
|
+
readonly _tag: "AdvancedTransitionFrame";
|
|
115
|
+
} | {
|
|
116
|
+
readonly _tag: "EndedTransition";
|
|
117
|
+
} | {
|
|
118
|
+
readonly _tag: "DetectedInputMovement";
|
|
119
|
+
} | {
|
|
120
|
+
readonly _tag: "UpdatedInputValue";
|
|
121
|
+
readonly value: string;
|
|
122
|
+
} | {
|
|
123
|
+
readonly _tag: "PressedToggleButton";
|
|
124
|
+
}, never, never>;
|
|
125
|
+
}[]];
|
|
123
126
|
/** Configuration for rendering a multi-select combobox with `view`. */
|
|
124
127
|
export type ViewConfig<Message, Item extends string> = BaseViewConfig<Message, Item, Model>;
|
|
125
128
|
/** Renders a headless multi-select combobox with keyboard navigation, selection tracking, and aria-activedescendant focus management. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi.d.ts","sourceRoot":"","sources":["../../../src/ui/combobox/multi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAE3C,OAAO,EAAE,KAAK,IAAI,EAAc,MAAM,YAAY,CAAA;AAElD,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,cAAc,EAKpB,MAAM,UAAU,CAAA;AAIjB,yIAAyI;AACzI,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;GAEjB,CAAA;AAED,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,8RAA8R;AAC9R,MAAM,MAAM,UAAU,GAAG,cAAc,GACrC,QAAQ,CAAC;IACP,aAAa,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CACtC,CAAC,CAAA;AAEJ,2IAA2I;AAC3I,eAAO,MAAM,IAAI,GAAI,QAAQ,UAAU,KAAG,KAGxC,CAAA;AAcF,yJAAyJ;AACzJ,eAAO,MAAM,MAAM
|
|
1
|
+
{"version":3,"file":"multi.d.ts","sourceRoot":"","sources":["../../../src/ui/combobox/multi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAE3C,OAAO,EAAE,KAAK,IAAI,EAAc,MAAM,YAAY,CAAA;AAElD,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,cAAc,EAKpB,MAAM,UAAU,CAAA;AAIjB,yIAAyI;AACzI,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;GAEjB,CAAA;AAED,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,8RAA8R;AAC9R,MAAM,MAAM,UAAU,GAAG,cAAc,GACrC,QAAQ,CAAC;IACP,aAAa,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CACtC,CAAC,CAAA;AAEJ,2IAA2I;AAC3I,eAAO,MAAM,IAAI,GAAI,QAAQ,UAAU,KAAG,KAGxC,CAAA;AAcF,yJAAyJ;AACzJ,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAwBjB,CAAA;AAIF,uEAAuE;AACvE,MAAM,MAAM,UAAU,CAAC,OAAO,EAAE,IAAI,SAAS,MAAM,IAAI,cAAc,CACnE,OAAO,EACP,IAAI,EACJ,KAAK,CACN,CAAA;AAED,yIAAyI;AACzI,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAIf,CAAA;AAEF;6EAC6E;AAC7E,eAAO,MAAM,IAAI,GAAI,OAAO,EAAE,IAAI,SAAS,MAAM,EAC/C,cAAc,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC,KACnE,CAAC,CACF,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,WAAW,CAAC,KACzD,IAAI,CAgBR,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Option, Schema as S } from 'effect';
|
|
2
|
-
import
|
|
1
|
+
import { Effect, Option, Schema as S } from 'effect';
|
|
2
|
+
import * as Command from '../../command';
|
|
3
3
|
import { type Attribute, type Html } from '../../html';
|
|
4
4
|
import type { AnchorConfig } from '../anchor';
|
|
5
5
|
import { groupContiguous } from '../group';
|
|
@@ -150,71 +150,74 @@ export declare const itemId: (id: string, index: number) => string;
|
|
|
150
150
|
export declare const closedBaseModel: <Model extends BaseModel>(model: Model) => Model;
|
|
151
151
|
/** Context passed to the `handleSelectedItem` handler with commands for focus management and modal cleanup. */
|
|
152
152
|
export type SelectedItemContext = Readonly<{
|
|
153
|
-
focusInput: Command<Message>;
|
|
154
|
-
maybeNextFrame: Option.Option<Command<Message>>;
|
|
155
|
-
maybeUnlockScroll: Option.Option<Command<Message>>;
|
|
156
|
-
maybeRestoreInert: Option.Option<Command<Message>>;
|
|
153
|
+
focusInput: Command.Command<Message>;
|
|
154
|
+
maybeNextFrame: Option.Option<Command.Command<Message>>;
|
|
155
|
+
maybeUnlockScroll: Option.Option<Command.Command<Message>>;
|
|
156
|
+
maybeRestoreInert: Option.Option<Command.Command<Message>>;
|
|
157
157
|
}>;
|
|
158
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
159
|
export declare const makeUpdate: <Model extends BaseModel>(handlers: Readonly<{
|
|
160
160
|
handleClose: (model: Model) => Model;
|
|
161
|
-
handleSelectedItem: (model: Model, item: string, displayText: string, context: SelectedItemContext) => [Model, ReadonlyArray<Command<Message>>];
|
|
161
|
+
handleSelectedItem: (model: Model, item: string, displayText: string, context: SelectedItemContext) => [Model, ReadonlyArray<Command.Command<Message>>];
|
|
162
162
|
handleImmediateActivation: (model: Model, item: string, displayText: string) => Model;
|
|
163
|
-
}>) => (model: Model, message: Message) => [Model, readonly
|
|
164
|
-
readonly
|
|
165
|
-
readonly
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
} | {
|
|
169
|
-
|
|
170
|
-
} | {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
163
|
+
}>) => (model: Model, message: Message) => [Model, readonly {
|
|
164
|
+
readonly name: string;
|
|
165
|
+
readonly effect: Effect.Effect<{
|
|
166
|
+
readonly _tag: "Opened";
|
|
167
|
+
readonly maybeActiveItemIndex: Option.Option<number>;
|
|
168
|
+
} | {
|
|
169
|
+
readonly _tag: "Closed";
|
|
170
|
+
} | {
|
|
171
|
+
readonly _tag: "ClosedByTab";
|
|
172
|
+
} | {
|
|
173
|
+
readonly _tag: "ActivatedItem";
|
|
174
|
+
readonly index: number;
|
|
175
|
+
readonly activationTrigger: "Pointer" | "Keyboard";
|
|
176
|
+
readonly maybeImmediateSelection: Option.Option<{
|
|
177
|
+
readonly item: string;
|
|
178
|
+
readonly displayText: string;
|
|
179
|
+
}>;
|
|
180
|
+
} | {
|
|
181
|
+
readonly _tag: "DeactivatedItem";
|
|
182
|
+
} | {
|
|
183
|
+
readonly _tag: "SelectedItem";
|
|
175
184
|
readonly item: string;
|
|
176
185
|
readonly displayText: string;
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
} | {
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
} | {
|
|
209
|
-
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
} | {
|
|
213
|
-
readonly _tag: "UpdatedInputValue";
|
|
214
|
-
readonly value: string;
|
|
215
|
-
} | {
|
|
216
|
-
readonly _tag: "PressedToggleButton";
|
|
217
|
-
}>[]];
|
|
186
|
+
} | {
|
|
187
|
+
readonly _tag: "MovedPointerOverItem";
|
|
188
|
+
readonly index: number;
|
|
189
|
+
readonly screenX: number;
|
|
190
|
+
readonly screenY: number;
|
|
191
|
+
} | {
|
|
192
|
+
readonly _tag: "RequestedItemClick";
|
|
193
|
+
readonly index: number;
|
|
194
|
+
} | {
|
|
195
|
+
readonly _tag: "CompletedScrollLock";
|
|
196
|
+
} | {
|
|
197
|
+
readonly _tag: "CompletedScrollUnlock";
|
|
198
|
+
} | {
|
|
199
|
+
readonly _tag: "CompletedInertSetup";
|
|
200
|
+
} | {
|
|
201
|
+
readonly _tag: "CompletedInertTeardown";
|
|
202
|
+
} | {
|
|
203
|
+
readonly _tag: "CompletedInputFocus";
|
|
204
|
+
} | {
|
|
205
|
+
readonly _tag: "CompletedScrollIntoView";
|
|
206
|
+
} | {
|
|
207
|
+
readonly _tag: "CompletedItemClick";
|
|
208
|
+
} | {
|
|
209
|
+
readonly _tag: "AdvancedTransitionFrame";
|
|
210
|
+
} | {
|
|
211
|
+
readonly _tag: "EndedTransition";
|
|
212
|
+
} | {
|
|
213
|
+
readonly _tag: "DetectedInputMovement";
|
|
214
|
+
} | {
|
|
215
|
+
readonly _tag: "UpdatedInputValue";
|
|
216
|
+
readonly value: string;
|
|
217
|
+
} | {
|
|
218
|
+
readonly _tag: "PressedToggleButton";
|
|
219
|
+
}, never, never>;
|
|
220
|
+
}[]];
|
|
218
221
|
/** Configuration for an individual combobox item's appearance. */
|
|
219
222
|
export type ItemConfig = Readonly<{
|
|
220
223
|
className?: string;
|