foldkit 0.148.2 → 0.149.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 +15 -24
- package/dist/message/index.d.ts +2 -1
- package/dist/message/index.d.ts.map +1 -1
- package/dist/message/index.js +1 -1
- package/dist/message/public.d.ts +2 -1
- package/dist/message/public.d.ts.map +1 -1
- package/dist/message/public.js +1 -1
- package/dist/runtime/runtime.d.ts +1 -2
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/schema/index.d.ts +53 -8
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +179 -21
- package/dist/subscription/subscription.d.ts +1 -1
- package/dist/subscription/subscription.js +1 -1
- package/dist/test/apps/attributes.d.ts +7 -4
- package/dist/test/apps/attributes.d.ts.map +1 -1
- package/dist/test/apps/attributes.js +6 -6
- package/dist/test/apps/bubbling.d.ts +8 -2
- package/dist/test/apps/bubbling.d.ts.map +1 -1
- package/dist/test/apps/bubbling.js +10 -9
- package/dist/test/apps/colorPicker.d.ts +7 -6
- package/dist/test/apps/colorPicker.d.ts.map +1 -1
- package/dist/test/apps/colorPicker.js +8 -7
- package/dist/test/apps/contextMenu.d.ts +14 -4
- package/dist/test/apps/contextMenu.d.ts.map +1 -1
- package/dist/test/apps/contextMenu.js +8 -9
- package/dist/test/apps/counter.d.ts +52 -24
- package/dist/test/apps/counter.d.ts.map +1 -1
- package/dist/test/apps/counter.js +23 -34
- package/dist/test/apps/crashOnRender.d.ts +44 -28
- package/dist/test/apps/crashOnRender.d.ts.map +1 -1
- package/dist/test/apps/crashOnRender.js +17 -20
- package/dist/test/apps/drafts.d.ts +19 -8
- package/dist/test/apps/drafts.d.ts.map +1 -1
- package/dist/test/apps/drafts.js +10 -11
- package/dist/test/apps/feedSocket.d.ts +13 -13
- package/dist/test/apps/feedSocket.d.ts.map +1 -1
- package/dist/test/apps/feedSocket.js +17 -28
- package/dist/test/apps/fileUpload.d.ts +7 -6
- package/dist/test/apps/fileUpload.d.ts.map +1 -1
- package/dist/test/apps/fileUpload.js +9 -8
- package/dist/test/apps/formChild.d.ts +40 -24
- package/dist/test/apps/formChild.d.ts.map +1 -1
- package/dist/test/apps/formChild.js +31 -32
- package/dist/test/apps/interactions.d.ts +16 -11
- package/dist/test/apps/interactions.d.ts.map +1 -1
- package/dist/test/apps/interactions.js +21 -24
- package/dist/test/apps/keypress.d.ts +11 -11
- package/dist/test/apps/keypress.d.ts.map +1 -1
- package/dist/test/apps/keypress.js +12 -12
- package/dist/test/apps/login.d.ts +43 -23
- package/dist/test/apps/login.d.ts.map +1 -1
- package/dist/test/apps/login.js +17 -25
- package/dist/test/apps/logoutButton.d.ts +12 -6
- package/dist/test/apps/logoutButton.d.ts.map +1 -1
- package/dist/test/apps/logoutButton.js +15 -11
- package/dist/test/apps/mountPanel.d.ts +19 -20
- package/dist/test/apps/mountPanel.d.ts.map +1 -1
- package/dist/test/apps/mountPanel.js +22 -24
- package/dist/test/apps/multiRole.d.ts +6 -3
- package/dist/test/apps/multiRole.d.ts.map +1 -1
- package/dist/test/apps/multiRole.js +8 -7
- package/dist/test/apps/pointer.d.ts +13 -6
- package/dist/test/apps/pointer.d.ts.map +1 -1
- package/dist/test/apps/pointer.js +11 -10
- package/dist/test/apps/resumeUpload.d.ts +11 -14
- package/dist/test/apps/resumeUpload.d.ts.map +1 -1
- package/dist/test/apps/resumeUpload.js +17 -27
- package/dist/test/apps/scorePanel.d.ts +6 -3
- package/dist/test/apps/scorePanel.d.ts.map +1 -1
- package/dist/test/apps/scorePanel.js +8 -7
- package/dist/test/apps/selectiveKeys.d.ts +5 -1
- package/dist/test/apps/selectiveKeys.d.ts.map +1 -1
- package/dist/test/apps/selectiveKeys.js +13 -12
- package/dist/test/apps/uploads.d.ts +52 -30
- package/dist/test/apps/uploads.d.ts.map +1 -1
- package/dist/test/apps/uploads.js +20 -30
- package/dist/update/update.d.ts +4 -7
- package/dist/update/update.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { Schema as S } from 'effect';
|
|
2
|
+
import { defineMessageUnion } from '../../message/index.js';
|
|
3
3
|
// MODEL
|
|
4
4
|
export const Model = S.Struct({
|
|
5
5
|
lastKey: S.String,
|
|
6
6
|
isShifted: S.Boolean,
|
|
7
7
|
});
|
|
8
8
|
// MESSAGE
|
|
9
|
-
export const
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
export const Message = defineMessageUnion({
|
|
10
|
+
PressedKey: { key: S.String },
|
|
11
|
+
PressedShiftKey: { key: S.String },
|
|
12
|
+
});
|
|
12
13
|
// INIT
|
|
13
14
|
export const initialModel = {
|
|
14
15
|
lastKey: '',
|
|
15
16
|
isShifted: false,
|
|
16
17
|
};
|
|
17
18
|
// UPDATE
|
|
18
|
-
export const update = (model, message) =>
|
|
19
|
-
PressedKey: ({ key }) => [
|
|
20
|
-
{ ...model, lastKey: key, isShifted: false },
|
|
21
|
-
[],
|
|
22
|
-
],
|
|
19
|
+
export const update = (model, message) => Message.match(message, {
|
|
20
|
+
PressedKey: ({ key }) => [{ ...model, lastKey: key, isShifted: false }, []],
|
|
23
21
|
PressedShiftKey: ({ key }) => [
|
|
24
22
|
{ ...model, lastKey: key, isShifted: true },
|
|
25
23
|
[],
|
|
26
24
|
],
|
|
27
|
-
})
|
|
25
|
+
});
|
|
28
26
|
// VIEW
|
|
29
27
|
export const view = (model, h) => {
|
|
30
28
|
return h.div([
|
|
31
29
|
h.Id('key-app'),
|
|
32
30
|
h.Role('application'),
|
|
33
31
|
h.AriaLabel('Key press area'),
|
|
34
|
-
h.OnKeyDown((key, modifiers) => modifiers.shiftKey
|
|
32
|
+
h.OnKeyDown((key, modifiers) => modifiers.shiftKey
|
|
33
|
+
? Message.PressedShiftKey({ key })
|
|
34
|
+
: Message.PressedKey({ key })),
|
|
35
35
|
], [
|
|
36
36
|
h.span([h.Class('last-key'), h.AriaLabel('Last key')], [model.lastKey]),
|
|
37
37
|
h.span([h.Class('shifted'), h.AriaLabel('Shift pressed')], [model.isShifted ? 'true' : 'false']),
|
|
@@ -9,35 +9,55 @@ export declare const Model: S.Struct<{
|
|
|
9
9
|
readonly error: S.String;
|
|
10
10
|
}>;
|
|
11
11
|
export type Model = typeof Model.Type;
|
|
12
|
-
export declare const
|
|
13
|
-
|
|
12
|
+
export declare const Message: import("../../schema/index.js").MessageUnion<{
|
|
13
|
+
readonly UpdatedEmail: {
|
|
14
|
+
readonly value: S.String;
|
|
15
|
+
};
|
|
16
|
+
readonly UpdatedPassword: {
|
|
17
|
+
readonly value: S.String;
|
|
18
|
+
};
|
|
19
|
+
readonly SubmittedLogin: {};
|
|
20
|
+
readonly SucceededAuthenticate: {
|
|
21
|
+
readonly username: S.String;
|
|
22
|
+
};
|
|
23
|
+
readonly FailedAuthenticate: {
|
|
24
|
+
readonly error: S.String;
|
|
25
|
+
};
|
|
26
|
+
readonly ClickedLogout: {};
|
|
14
27
|
}>;
|
|
15
|
-
export declare const UpdatedPassword: import("../../schema/index.js").CallableTaggedStruct<"UpdatedPassword", {
|
|
16
|
-
value: S.String;
|
|
17
|
-
}>;
|
|
18
|
-
export declare const SubmittedLogin: import("../../schema/index.js").CallableTaggedStruct<"SubmittedLogin", {}>;
|
|
19
|
-
export declare const SucceededAuthenticate: import("../../schema/index.js").CallableTaggedStruct<"SucceededAuthenticate", {
|
|
20
|
-
username: S.String;
|
|
21
|
-
}>;
|
|
22
|
-
export declare const FailedAuthenticate: import("../../schema/index.js").CallableTaggedStruct<"FailedAuthenticate", {
|
|
23
|
-
error: S.String;
|
|
24
|
-
}>;
|
|
25
|
-
export declare const ClickedLogout: import("../../schema/index.js").CallableTaggedStruct<"ClickedLogout", {}>;
|
|
26
|
-
export declare const Message: S.Union<readonly [import("../../schema/index.js").CallableTaggedStruct<"UpdatedEmail", {
|
|
27
|
-
value: S.String;
|
|
28
|
-
}>, import("../../schema/index.js").CallableTaggedStruct<"UpdatedPassword", {
|
|
29
|
-
value: S.String;
|
|
30
|
-
}>, import("../../schema/index.js").CallableTaggedStruct<"SubmittedLogin", {}>, import("../../schema/index.js").CallableTaggedStruct<"SucceededAuthenticate", {
|
|
31
|
-
username: S.String;
|
|
32
|
-
}>, import("../../schema/index.js").CallableTaggedStruct<"FailedAuthenticate", {
|
|
33
|
-
error: S.String;
|
|
34
|
-
}>, import("../../schema/index.js").CallableTaggedStruct<"ClickedLogout", {}>]>;
|
|
35
28
|
export type Message = typeof Message.Type;
|
|
36
29
|
export declare const Authenticate: Command.CommandDefinitionNoArgs<"Authenticate", Effect.Effect<{
|
|
37
30
|
readonly _tag: "SucceededAuthenticate";
|
|
38
31
|
readonly username: string;
|
|
39
32
|
}, never, never>>;
|
|
40
33
|
export declare const initialModel: Model;
|
|
41
|
-
export declare const update: (model: Model, message: Message) => readonly [
|
|
34
|
+
export declare const update: (model: Model, message: Message) => readonly [{
|
|
35
|
+
readonly email: string;
|
|
36
|
+
readonly password: string;
|
|
37
|
+
readonly status: "Idle" | "Error" | "Submitting" | "LoggedIn";
|
|
38
|
+
readonly username: string;
|
|
39
|
+
readonly error: string;
|
|
40
|
+
}, readonly Readonly<{
|
|
41
|
+
name: string;
|
|
42
|
+
args?: Record<string, unknown>;
|
|
43
|
+
key?: string;
|
|
44
|
+
effect: Effect.Effect<{
|
|
45
|
+
readonly _tag: "UpdatedEmail";
|
|
46
|
+
readonly value: string;
|
|
47
|
+
} | {
|
|
48
|
+
readonly _tag: "UpdatedPassword";
|
|
49
|
+
readonly value: string;
|
|
50
|
+
} | {
|
|
51
|
+
readonly _tag: "SubmittedLogin";
|
|
52
|
+
} | {
|
|
53
|
+
readonly _tag: "SucceededAuthenticate";
|
|
54
|
+
readonly username: string;
|
|
55
|
+
} | {
|
|
56
|
+
readonly _tag: "FailedAuthenticate";
|
|
57
|
+
readonly error: string;
|
|
58
|
+
} | {
|
|
59
|
+
readonly _tag: "ClickedLogout";
|
|
60
|
+
}, never, never>;
|
|
61
|
+
}>[]];
|
|
42
62
|
export declare const view: (model: Model, h: HtmlBuilder<Message>) => Html;
|
|
43
63
|
//# sourceMappingURL=login.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/test/apps/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAc,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAExD,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAA;AACjD,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAK5D,eAAO,MAAM,KAAK;;;;;;EAMhB,CAAA;AAEF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/test/apps/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAc,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAExD,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAA;AACjD,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAK5D,eAAO,MAAM,KAAK;;;;;;EAMhB,CAAA;AAEF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;EAOlB,CAAA;AAEF,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,eAAO,MAAM,YAAY;;;iBAKvB,CAAA;AAIF,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAA;AAID,eAAO,MAAM,MAAM,GAAI,OAAO,KAAK,EAAE,SAAS,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;KAuBlD,CAAA;AAIH,eAAO,MAAM,IAAI,GAAI,OAAO,KAAK,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,KAAG,IA8E5D,CAAA"}
|
package/dist/test/apps/login.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Effect, Match as M, Schema as S } from 'effect';
|
|
2
2
|
import * as Command from '../../command/index.js';
|
|
3
|
-
import {
|
|
3
|
+
import { defineMessageUnion } from '../../message/index.js';
|
|
4
4
|
// MODEL
|
|
5
5
|
export const Model = S.Struct({
|
|
6
6
|
email: S.String,
|
|
@@ -10,26 +10,18 @@ export const Model = S.Struct({
|
|
|
10
10
|
error: S.String,
|
|
11
11
|
});
|
|
12
12
|
// MESSAGE
|
|
13
|
-
export const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
username: S.String,
|
|
13
|
+
export const Message = defineMessageUnion({
|
|
14
|
+
UpdatedEmail: { value: S.String },
|
|
15
|
+
UpdatedPassword: { value: S.String },
|
|
16
|
+
SubmittedLogin: {},
|
|
17
|
+
SucceededAuthenticate: { username: S.String },
|
|
18
|
+
FailedAuthenticate: { error: S.String },
|
|
19
|
+
ClickedLogout: {},
|
|
18
20
|
});
|
|
19
|
-
export const FailedAuthenticate = m('FailedAuthenticate', { error: S.String });
|
|
20
|
-
export const ClickedLogout = m('ClickedLogout');
|
|
21
|
-
export const Message = S.Union([
|
|
22
|
-
UpdatedEmail,
|
|
23
|
-
UpdatedPassword,
|
|
24
|
-
SubmittedLogin,
|
|
25
|
-
SucceededAuthenticate,
|
|
26
|
-
FailedAuthenticate,
|
|
27
|
-
ClickedLogout,
|
|
28
|
-
]);
|
|
29
21
|
// COMMAND
|
|
30
22
|
export const Authenticate = Command.define('Authenticate', {
|
|
31
|
-
messages: [SucceededAuthenticate, FailedAuthenticate],
|
|
32
|
-
execute: Effect.sync(() => SucceededAuthenticate({ username: 'alice' })),
|
|
23
|
+
messages: [Message.SucceededAuthenticate, Message.FailedAuthenticate],
|
|
24
|
+
execute: Effect.sync(() => Message.SucceededAuthenticate({ username: 'alice' })),
|
|
33
25
|
});
|
|
34
26
|
// INIT
|
|
35
27
|
export const initialModel = {
|
|
@@ -40,7 +32,7 @@ export const initialModel = {
|
|
|
40
32
|
error: '',
|
|
41
33
|
};
|
|
42
34
|
// UPDATE
|
|
43
|
-
export const update = (model, message) =>
|
|
35
|
+
export const update = (model, message) => Message.match(message, {
|
|
44
36
|
UpdatedEmail: ({ value }) => [{ ...model, email: value }, []],
|
|
45
37
|
UpdatedPassword: ({ value }) => [{ ...model, password: value }, []],
|
|
46
38
|
SubmittedLogin: () => [
|
|
@@ -59,7 +51,7 @@ export const update = (model, message) => M.value(message).pipe(M.withReturnType
|
|
|
59
51
|
{ ...model, status: 'Idle', username: '', email: '', password: '' },
|
|
60
52
|
[],
|
|
61
53
|
],
|
|
62
|
-
})
|
|
54
|
+
});
|
|
63
55
|
// VIEW
|
|
64
56
|
export const view = (model, h) => {
|
|
65
57
|
return h.div([h.Id('app')], [
|
|
@@ -70,21 +62,21 @@ export const view = (model, h) => {
|
|
|
70
62
|
], [
|
|
71
63
|
h.span([h.Class('greeting'), h.Role('status')], [`Welcome, ${model.username}!`]),
|
|
72
64
|
h.button([
|
|
73
|
-
h.OnClick(ClickedLogout()),
|
|
65
|
+
h.OnClick(Message.ClickedLogout()),
|
|
74
66
|
h.Role('button'),
|
|
75
67
|
h.AriaExpanded(false),
|
|
76
68
|
], ['Log out']),
|
|
77
69
|
])), M.when('Error', () => h.div([], [
|
|
78
70
|
h.p([h.Class('error'), h.Role('alert')], [model.error]),
|
|
79
|
-
h.button([h.OnClick(SubmittedLogin()), h.Class('retry')], ['Retry']),
|
|
80
|
-
])), M.when('Idle', () => h.form([h.OnSubmit(SubmittedLogin()), h.Class('login-form')], [
|
|
71
|
+
h.button([h.OnClick(Message.SubmittedLogin()), h.Class('retry')], ['Retry']),
|
|
72
|
+
])), M.when('Idle', () => h.form([h.OnSubmit(Message.SubmittedLogin()), h.Class('login-form')], [
|
|
81
73
|
h.label([h.For('email'), h.Class('sr-only')], ['Email']),
|
|
82
74
|
h.input([
|
|
83
75
|
h.Id('email'),
|
|
84
76
|
h.Type('email'),
|
|
85
77
|
h.Placeholder('Email'),
|
|
86
78
|
h.Value(model.email),
|
|
87
|
-
h.OnInput(value => UpdatedEmail({ value })),
|
|
79
|
+
h.OnInput(value => Message.UpdatedEmail({ value })),
|
|
88
80
|
]),
|
|
89
81
|
h.label([h.For('password'), h.Class('sr-only')], ['Password']),
|
|
90
82
|
h.input([
|
|
@@ -92,7 +84,7 @@ export const view = (model, h) => {
|
|
|
92
84
|
h.Type('password'),
|
|
93
85
|
h.Placeholder('Password'),
|
|
94
86
|
h.Value(model.password),
|
|
95
|
-
h.OnInput(value => UpdatedPassword({ value })),
|
|
87
|
+
h.OnInput(value => Message.UpdatedPassword({ value })),
|
|
96
88
|
]),
|
|
97
89
|
h.button([h.Type('submit'), h.Class('primary'), h.Disabled(false)], ['Sign in']),
|
|
98
90
|
])), M.exhaustive),
|
|
@@ -4,14 +4,20 @@ export declare const Model: S.Struct<{
|
|
|
4
4
|
readonly label: S.String;
|
|
5
5
|
}>;
|
|
6
6
|
export type Model = typeof Model.Type;
|
|
7
|
-
export declare const
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
export declare const Message: import("../../schema/index.js").MessageUnion<{
|
|
8
|
+
readonly ClickedLogout: {};
|
|
9
|
+
readonly CompletedAction: {};
|
|
10
|
+
}>;
|
|
10
11
|
export type Message = typeof Message.Type;
|
|
11
|
-
export declare const
|
|
12
|
-
|
|
12
|
+
export declare const OutMessage: import("../../schema/index.js").MessageUnion<{
|
|
13
|
+
readonly RequestedLogout: {};
|
|
14
|
+
}>;
|
|
13
15
|
export type OutMessage = typeof OutMessage.Type;
|
|
14
16
|
export declare const initialModel: Model;
|
|
15
|
-
export declare const update: (model: Model, message: Message) => readonly [
|
|
17
|
+
export declare const update: (model: Model, message: Message) => readonly [{
|
|
18
|
+
readonly label: string;
|
|
19
|
+
}, readonly never[], Option.Option<{
|
|
20
|
+
readonly _tag: "RequestedLogout";
|
|
21
|
+
}>];
|
|
16
22
|
export declare const view: (model: Model, h: HtmlBuilder<Message>) => Html;
|
|
17
23
|
//# sourceMappingURL=logoutButton.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logoutButton.d.ts","sourceRoot":"","sources":["../../../src/test/apps/logoutButton.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"logoutButton.d.ts","sourceRoot":"","sources":["../../../src/test/apps/logoutButton.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAE5C,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAK5D,eAAO,MAAM,KAAK;;EAAgC,CAAA;AAClD,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,eAAO,MAAM,OAAO;;;EAGlB,CAAA;AAEF,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,eAAO,MAAM,UAAU;;EAErB,CAAA;AAEF,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAA;AAI/C,eAAO,MAAM,YAAY,EAAE,KAA4B,CAAA;AAIvD,eAAO,MAAM,MAAM,GAAI,OAAO,KAAK,EAAE,SAAS,OAAO;;;;GAMjD,CAAA;AAIJ,eAAO,MAAM,IAAI,GAAI,OAAO,KAAK,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,KAAG,IAU5D,CAAA"}
|
|
@@ -1,22 +1,26 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { Option, Schema as S } from 'effect';
|
|
2
|
+
import { defineMessageUnion } from '../../message/index.js';
|
|
3
3
|
// MODEL
|
|
4
4
|
export const Model = S.Struct({ label: S.String });
|
|
5
5
|
// MESSAGE
|
|
6
|
-
export const
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
export const Message = defineMessageUnion({
|
|
7
|
+
ClickedLogout: {},
|
|
8
|
+
CompletedAction: {},
|
|
9
|
+
});
|
|
9
10
|
// OUT MESSAGE
|
|
10
|
-
export const
|
|
11
|
-
|
|
11
|
+
export const OutMessage = defineMessageUnion({
|
|
12
|
+
RequestedLogout: {},
|
|
13
|
+
});
|
|
12
14
|
// INIT
|
|
13
15
|
export const initialModel = { label: 'Log out' };
|
|
14
16
|
// UPDATE
|
|
15
|
-
export const update = (model, message) =>
|
|
16
|
-
ClickedLogout: () => [model, [], Option.some(RequestedLogout())],
|
|
17
|
+
export const update = (model, message) => Message.match(message, {
|
|
18
|
+
ClickedLogout: () => [model, [], Option.some(OutMessage.RequestedLogout())],
|
|
17
19
|
CompletedAction: () => [model, [], Option.none()],
|
|
18
|
-
})
|
|
20
|
+
});
|
|
19
21
|
// VIEW
|
|
20
22
|
export const view = (model, h) => {
|
|
21
|
-
return h.div([], [
|
|
23
|
+
return h.div([], [
|
|
24
|
+
h.button([h.OnClick(Message.ClickedLogout()), h.Role('button')], [model.label]),
|
|
25
|
+
]);
|
|
22
26
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Schema as S } from 'effect';
|
|
1
|
+
import { Option, Schema as S } from 'effect';
|
|
2
2
|
import type { Html, HtmlBuilder } from '../../html/index.js';
|
|
3
3
|
import * as Mount from '../../mount/index.js';
|
|
4
4
|
export declare const Model: S.Struct<{
|
|
@@ -7,25 +7,20 @@ export declare const Model: S.Struct<{
|
|
|
7
7
|
readonly count: S.Number;
|
|
8
8
|
}>;
|
|
9
9
|
export type Model = typeof Model.Type;
|
|
10
|
-
export declare const
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
export declare const Message: import("../../schema/index.js").MessageUnion<{
|
|
11
|
+
readonly ClickedToggle: {};
|
|
12
|
+
readonly MeasuredPanel: {
|
|
13
|
+
readonly width: S.Number;
|
|
14
|
+
};
|
|
15
|
+
readonly CompletedFocusButton: {};
|
|
16
|
+
readonly FailedMountSidebar: {
|
|
17
|
+
readonly reason: S.String;
|
|
18
|
+
};
|
|
19
|
+
readonly ClickedIncrement: {};
|
|
20
|
+
readonly ScrolledTo: {
|
|
21
|
+
readonly offset: S.Number;
|
|
22
|
+
};
|
|
13
23
|
}>;
|
|
14
|
-
export declare const CompletedFocusButton: import("../../schema/index.js").CallableTaggedStruct<"CompletedFocusButton", {}>;
|
|
15
|
-
export declare const FailedMountSidebar: import("../../schema/index.js").CallableTaggedStruct<"FailedMountSidebar", {
|
|
16
|
-
reason: S.String;
|
|
17
|
-
}>;
|
|
18
|
-
export declare const ClickedIncrement: import("../../schema/index.js").CallableTaggedStruct<"ClickedIncrement", {}>;
|
|
19
|
-
export declare const ScrolledTo: import("../../schema/index.js").CallableTaggedStruct<"ScrolledTo", {
|
|
20
|
-
offset: S.Number;
|
|
21
|
-
}>;
|
|
22
|
-
export declare const Message: S.Union<readonly [import("../../schema/index.js").CallableTaggedStruct<"ClickedToggle", {}>, import("../../schema/index.js").CallableTaggedStruct<"MeasuredPanel", {
|
|
23
|
-
width: S.Number;
|
|
24
|
-
}>, import("../../schema/index.js").CallableTaggedStruct<"CompletedFocusButton", {}>, import("../../schema/index.js").CallableTaggedStruct<"FailedMountSidebar", {
|
|
25
|
-
reason: S.String;
|
|
26
|
-
}>, import("../../schema/index.js").CallableTaggedStruct<"ClickedIncrement", {}>, import("../../schema/index.js").CallableTaggedStruct<"ScrolledTo", {
|
|
27
|
-
offset: S.Number;
|
|
28
|
-
}>]>;
|
|
29
24
|
export type Message = typeof Message.Type;
|
|
30
25
|
export declare const MeasurePanel: Mount.MountDefinitionNoArgs<"MeasurePanel", {
|
|
31
26
|
readonly _tag: "MeasuredPanel";
|
|
@@ -44,7 +39,11 @@ export declare const ScrollList: Mount.MountDefinitionWithArgs<"ScrollList", {
|
|
|
44
39
|
readonly offset: number;
|
|
45
40
|
}>;
|
|
46
41
|
export declare const initialModel: Model;
|
|
47
|
-
export declare const update: (model: Model, message: Message) => readonly [
|
|
42
|
+
export declare const update: (model: Model, message: Message) => readonly [{
|
|
43
|
+
readonly isOpen: boolean;
|
|
44
|
+
readonly measuredWidth: Option.Option<number>;
|
|
45
|
+
readonly count: number;
|
|
46
|
+
}, readonly never[]];
|
|
48
47
|
export declare const view: (model: Model, h: HtmlBuilder<Message>) => Html;
|
|
49
48
|
/** A view that always renders both the toggle button and the panel, exposing
|
|
50
49
|
* two MeasurePanel mounts simultaneously so we can exercise the (name,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mountPanel.d.ts","sourceRoot":"","sources":["../../../src/test/apps/mountPanel.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"mountPanel.d.ts","sourceRoot":"","sources":["../../../src/test/apps/mountPanel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAEpD,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAE5D,OAAO,KAAK,KAAK,MAAM,sBAAsB,CAAA;AAI7C,eAAO,MAAM,KAAK;;;;EAIhB,CAAA;AACF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,eAAO,MAAM,OAAO;;;;;;;;;;;;;EAOlB,CAAA;AAEF,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAWzC,eAAO,MAAM,YAAY;;;;;;EAIqC,CAAA;AAE9D,eAAO,MAAM,WAAW;;EAG+B,CAAA;AAEvD,eAAO,MAAM,UAAU;;;;;EAatB,CAAA;AAID,eAAO,MAAM,YAAY,EAAE,KAI1B,CAAA;AAID,eAAO,MAAM,MAAM,GAAI,OAAO,KAAK,EAAE,SAAS,OAAO;;;;oBAWjD,CAAA;AAIJ,eAAO,MAAM,IAAI,GAAI,OAAO,KAAK,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,KAAG,IAgC5D,CAAA;AAED;;4BAE4B;AAC5B,eAAO,MAAM,YAAY,GAAI,OAAO,KAAK,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,KAAG,IAYpE,CAAA;AAED;;;2DAG2D;AAC3D,eAAO,MAAM,cAAc,GACzB,QAAQ,MAAM,EACd,GAAG,WAAW,CAAC,OAAO,CAAC,KACtB,IAKF,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Effect,
|
|
2
|
-
import {
|
|
1
|
+
import { Effect, Option, Schema as S } from 'effect';
|
|
2
|
+
import { defineMessageUnion } from '../../message/index.js';
|
|
3
3
|
import * as Mount from '../../mount/index.js';
|
|
4
4
|
// MODEL
|
|
5
5
|
export const Model = S.Struct({
|
|
@@ -8,20 +8,14 @@ export const Model = S.Struct({
|
|
|
8
8
|
count: S.Number,
|
|
9
9
|
});
|
|
10
10
|
// MESSAGE
|
|
11
|
-
export const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
MeasuredPanel,
|
|
20
|
-
CompletedFocusButton,
|
|
21
|
-
FailedMountSidebar,
|
|
22
|
-
ClickedIncrement,
|
|
23
|
-
ScrolledTo,
|
|
24
|
-
]);
|
|
11
|
+
export const Message = defineMessageUnion({
|
|
12
|
+
ClickedToggle: {},
|
|
13
|
+
MeasuredPanel: { width: S.Number },
|
|
14
|
+
CompletedFocusButton: {},
|
|
15
|
+
FailedMountSidebar: { reason: S.String },
|
|
16
|
+
ClickedIncrement: {},
|
|
17
|
+
ScrolledTo: { offset: S.Number },
|
|
18
|
+
});
|
|
25
19
|
// MOUNT
|
|
26
20
|
// NOTE: these Mounts are runtime/Scene fixtures, not idiomatic examples of
|
|
27
21
|
// Mount work. Their factory bodies skip the DOM measurement/manipulation that
|
|
@@ -29,13 +23,13 @@ export const Message = S.Union([
|
|
|
29
23
|
// `element.focus()` for focus) and emit synthetic result Messages so tests can
|
|
30
24
|
// pin specific values. See `ui/popover/popover.ts`, `ui/listbox/shared.ts`,
|
|
31
25
|
// etc. for production-shaped Mounts that read or write the element handle.
|
|
32
|
-
export const MeasurePanel = Mount.define('MeasurePanel', MeasuredPanel, FailedMountSidebar)(() => Effect.succeed(MeasuredPanel({ width: 320 })));
|
|
33
|
-
export const FocusButton = Mount.define('FocusButton', CompletedFocusButton)(() => Effect.succeed(CompletedFocusButton()));
|
|
34
|
-
export const ScrollList = Mount.define('ScrollList', { offset: S.Number }, ScrolledTo)(({ offset }) => element => Effect.sync(() => {
|
|
26
|
+
export const MeasurePanel = Mount.define('MeasurePanel', Message.MeasuredPanel, Message.FailedMountSidebar)(() => Effect.succeed(Message.MeasuredPanel({ width: 320 })));
|
|
27
|
+
export const FocusButton = Mount.define('FocusButton', Message.CompletedFocusButton)(() => Effect.succeed(Message.CompletedFocusButton()));
|
|
28
|
+
export const ScrollList = Mount.define('ScrollList', { offset: S.Number }, Message.ScrolledTo)(({ offset }) => element => Effect.sync(() => {
|
|
35
29
|
if (element instanceof HTMLElement) {
|
|
36
30
|
element.scrollTop = offset;
|
|
37
31
|
}
|
|
38
|
-
return ScrolledTo({ offset });
|
|
32
|
+
return Message.ScrolledTo({ offset });
|
|
39
33
|
}));
|
|
40
34
|
// INIT
|
|
41
35
|
export const initialModel = {
|
|
@@ -44,7 +38,7 @@ export const initialModel = {
|
|
|
44
38
|
count: 0,
|
|
45
39
|
};
|
|
46
40
|
// UPDATE
|
|
47
|
-
export const update = (model, message) =>
|
|
41
|
+
export const update = (model, message) => Message.match(message, {
|
|
48
42
|
ClickedToggle: () => [{ ...model, isOpen: !model.isOpen }, []],
|
|
49
43
|
MeasuredPanel: ({ width }) => [
|
|
50
44
|
{ ...model, measuredWidth: Option.some(width) },
|
|
@@ -54,11 +48,15 @@ export const update = (model, message) => M.value(message).pipe(M.withReturnType
|
|
|
54
48
|
FailedMountSidebar: () => [model, []],
|
|
55
49
|
ClickedIncrement: () => [{ ...model, count: model.count + 1 }, []],
|
|
56
50
|
ScrolledTo: () => [model, []],
|
|
57
|
-
})
|
|
51
|
+
});
|
|
58
52
|
// VIEW
|
|
59
53
|
export const view = (model, h) => {
|
|
60
54
|
return h.div([h.Class('panel-test')], [
|
|
61
|
-
h.button([
|
|
55
|
+
h.button([
|
|
56
|
+
h.Key('toggle'),
|
|
57
|
+
h.OnClick(Message.ClickedToggle()),
|
|
58
|
+
h.OnMount(FocusButton()),
|
|
59
|
+
], [model.isOpen ? 'Close' : 'Open']),
|
|
62
60
|
...(model.isOpen
|
|
63
61
|
? [
|
|
64
62
|
h.div([h.Key('panel'), h.OnMount(MeasurePanel())], [
|
|
@@ -80,7 +78,7 @@ export const twoPanelView = (model, h) => {
|
|
|
80
78
|
return h.div([h.Class('two-panels')], [
|
|
81
79
|
h.div([h.Key('panel-a'), h.OnMount(MeasurePanel())], [h.span([], ['A'])]),
|
|
82
80
|
h.div([h.Key('panel-b'), h.OnMount(MeasurePanel())], [h.span([], ['B'])]),
|
|
83
|
-
h.button([h.Key('inc'), h.OnClick(ClickedIncrement())], [`count: ${model.count}`]),
|
|
81
|
+
h.button([h.Key('inc'), h.OnClick(Message.ClickedIncrement())], [`count: ${model.count}`]),
|
|
84
82
|
]);
|
|
85
83
|
};
|
|
86
84
|
/** A view that renders an arg-bearing Mount so Scene tests can exercise
|
|
@@ -4,10 +4,13 @@ export declare const Model: S.Struct<{
|
|
|
4
4
|
readonly clicks: S.Number;
|
|
5
5
|
}>;
|
|
6
6
|
export type Model = typeof Model.Type;
|
|
7
|
-
export declare const
|
|
8
|
-
|
|
7
|
+
export declare const Message: import("../../schema/index.js").MessageUnion<{
|
|
8
|
+
readonly ClickedFallback: {};
|
|
9
|
+
}>;
|
|
9
10
|
export type Message = typeof Message.Type;
|
|
10
11
|
export declare const initialModel: Model;
|
|
11
|
-
export declare const update: (model: Model, message: Message) => readonly [
|
|
12
|
+
export declare const update: (model: Model, message: Message) => readonly [{
|
|
13
|
+
readonly clicks: number;
|
|
14
|
+
}, readonly never[]];
|
|
12
15
|
export declare const view: (model: Model, h: HtmlBuilder<Message>) => Html;
|
|
13
16
|
//# sourceMappingURL=multiRole.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multiRole.d.ts","sourceRoot":"","sources":["../../../src/test/apps/multiRole.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"multiRole.d.ts","sourceRoot":"","sources":["../../../src/test/apps/multiRole.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAEpC,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAK5D,eAAO,MAAM,KAAK;;EAAiC,CAAA;AACnD,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,eAAO,MAAM,OAAO;;EAElB,CAAA;AAEF,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIzC,eAAO,MAAM,YAAY,EAAE,KAAqB,CAAA;AAIhD,eAAO,MAAM,MAAM,GAAI,OAAO,KAAK,EAAE,SAAS,OAAO;;oBAGjD,CAAA;AAIJ,eAAO,MAAM,IAAI,GAAI,OAAO,KAAK,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,KAAG,IAU5D,CAAA"}
|
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { Schema as S } from 'effect';
|
|
2
|
+
import { defineMessageUnion } from '../../message/index.js';
|
|
3
3
|
// MODEL
|
|
4
4
|
export const Model = S.Struct({ clicks: S.Number });
|
|
5
5
|
// MESSAGE
|
|
6
|
-
export const
|
|
7
|
-
|
|
6
|
+
export const Message = defineMessageUnion({
|
|
7
|
+
ClickedFallback: {},
|
|
8
|
+
});
|
|
8
9
|
// INIT
|
|
9
10
|
export const initialModel = { clicks: 0 };
|
|
10
11
|
// UPDATE
|
|
11
|
-
export const update = (model, message) =>
|
|
12
|
+
export const update = (model, message) => Message.match(message, {
|
|
12
13
|
ClickedFallback: () => [{ ...model, clicks: model.clicks + 1 }, []],
|
|
13
|
-
})
|
|
14
|
+
});
|
|
14
15
|
// VIEW
|
|
15
16
|
export const view = (model, h) => {
|
|
16
17
|
return h.div([], [
|
|
17
|
-
h.div([h.Role('doc-subtitle heading'), h.OnClick(ClickedFallback())], [`Fallback element clicks=${model.clicks}`]),
|
|
18
|
+
h.div([h.Role('doc-subtitle heading'), h.OnClick(Message.ClickedFallback())], [`Fallback element clicks=${model.clicks}`]),
|
|
18
19
|
]);
|
|
19
20
|
};
|
|
@@ -6,14 +6,21 @@ export declare const Model: S.Struct<{
|
|
|
6
6
|
readonly lastPointerType: S.String;
|
|
7
7
|
}>;
|
|
8
8
|
export type Model = typeof Model.Type;
|
|
9
|
-
declare const Message:
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
declare const Message: import("../../schema/index.js").MessageUnion<{
|
|
10
|
+
readonly PressedPointerDown: {
|
|
11
|
+
readonly pointerType: S.String;
|
|
12
|
+
};
|
|
13
|
+
readonly ReleasedPointerUp: {
|
|
14
|
+
readonly pointerType: S.String;
|
|
15
|
+
};
|
|
16
|
+
}>;
|
|
14
17
|
type Message = typeof Message.Type;
|
|
15
18
|
export declare const initialModel: Model;
|
|
16
|
-
export declare const update: (model: Model, message: Message) => readonly [
|
|
19
|
+
export declare const update: (model: Model, message: Message) => readonly [{
|
|
20
|
+
readonly pointerDownCount: number;
|
|
21
|
+
readonly pointerUpCount: number;
|
|
22
|
+
readonly lastPointerType: string;
|
|
23
|
+
}, readonly never[]];
|
|
17
24
|
export declare const view: (model: Model, h: HtmlBuilder<Message>) => Html;
|
|
18
25
|
export {};
|
|
19
26
|
//# sourceMappingURL=pointer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pointer.d.ts","sourceRoot":"","sources":["../../../src/test/apps/pointer.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"pointer.d.ts","sourceRoot":"","sources":["../../../src/test/apps/pointer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,MAAM,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAA;AAE5C,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAK5D,eAAO,MAAM,KAAK;;;;EAIhB,CAAA;AACF,MAAM,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,IAAI,CAAA;AAIrC,QAAA,MAAM,OAAO;;;;;;;EAGX,CAAA;AACF,KAAK,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA;AAIlC,eAAO,MAAM,YAAY,EAAE,KAI1B,CAAA;AAID,eAAO,MAAM,MAAM,GAAI,OAAO,KAAK,EAAE,SAAS,OAAO;;;;oBAkBjD,CAAA;AAIJ,eAAO,MAAM,IAAI,GAAI,OAAO,KAAK,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,KAAG,IA4B5D,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { Option, Schema as S } from 'effect';
|
|
2
|
+
import { defineMessageUnion } from '../../message/index.js';
|
|
3
3
|
// MODEL
|
|
4
4
|
export const Model = S.Struct({
|
|
5
5
|
pointerDownCount: S.Number,
|
|
@@ -7,9 +7,10 @@ export const Model = S.Struct({
|
|
|
7
7
|
lastPointerType: S.String,
|
|
8
8
|
});
|
|
9
9
|
// MESSAGE
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
const Message = defineMessageUnion({
|
|
11
|
+
PressedPointerDown: { pointerType: S.String },
|
|
12
|
+
ReleasedPointerUp: { pointerType: S.String },
|
|
13
|
+
});
|
|
13
14
|
// INIT
|
|
14
15
|
export const initialModel = {
|
|
15
16
|
pointerDownCount: 0,
|
|
@@ -17,7 +18,7 @@ export const initialModel = {
|
|
|
17
18
|
lastPointerType: '',
|
|
18
19
|
};
|
|
19
20
|
// UPDATE
|
|
20
|
-
export const update = (model, message) =>
|
|
21
|
+
export const update = (model, message) => Message.match(message, {
|
|
21
22
|
PressedPointerDown: ({ pointerType }) => [
|
|
22
23
|
{
|
|
23
24
|
...model,
|
|
@@ -34,18 +35,18 @@ export const update = (model, message) => M.value(message).pipe(M.withReturnType
|
|
|
34
35
|
},
|
|
35
36
|
[],
|
|
36
37
|
],
|
|
37
|
-
})
|
|
38
|
+
});
|
|
38
39
|
// VIEW
|
|
39
40
|
export const view = (model, h) => {
|
|
40
41
|
return h.div([], [
|
|
41
42
|
h.button([
|
|
42
43
|
h.AriaLabel('pointer target'),
|
|
43
|
-
h.OnPointerDown(pointerType => Option.some(PressedPointerDown({ pointerType }))),
|
|
44
|
-
h.OnPointerUp((_screenX, _screenY, pointerType, _timeStamp) => Option.some(ReleasedPointerUp({ pointerType }))),
|
|
44
|
+
h.OnPointerDown(pointerType => Option.some(Message.PressedPointerDown({ pointerType }))),
|
|
45
|
+
h.OnPointerUp((_screenX, _screenY, pointerType, _timeStamp) => Option.some(Message.ReleasedPointerUp({ pointerType }))),
|
|
45
46
|
], [`down=${model.pointerDownCount} up=${model.pointerUpCount}`]),
|
|
46
47
|
h.div([
|
|
47
48
|
h.AriaLabel('nested target'),
|
|
48
|
-
h.OnPointerDown(pointerType => Option.some(PressedPointerDown({ pointerType }))),
|
|
49
|
+
h.OnPointerDown(pointerType => Option.some(Message.PressedPointerDown({ pointerType }))),
|
|
49
50
|
], [h.span([], [`type=${model.lastPointerType}`])]),
|
|
50
51
|
h.span([h.AriaLabel('no handler')], ['orphan']),
|
|
51
52
|
]);
|