ctrl-fx 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/clipboard.d.ts +7 -0
- package/dist/clipboard.d.ts.map +1 -0
- package/dist/clipboard.js +3 -0
- package/dist/db/effects.d.ts +78 -0
- package/dist/db/effects.d.ts.map +1 -0
- package/dist/db/effects.js +98 -0
- package/dist/db/errors.d.ts +21 -0
- package/dist/db/errors.d.ts.map +1 -0
- package/dist/db/errors.js +13 -0
- package/dist/db/index.d.ts +32 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +19 -0
- package/dist/db/keypath.d.ts +40 -0
- package/dist/db/keypath.d.ts.map +1 -0
- package/dist/db/keypath.js +20 -0
- package/dist/db/setup.d.ts +83 -0
- package/dist/db/setup.d.ts.map +1 -0
- package/dist/db/setup.js +100 -0
- package/dist/db/testdb.d.ts +19 -0
- package/dist/db/testdb.d.ts.map +1 -0
- package/dist/db/testdb.js +34 -0
- package/dist/dom/attrs.d.ts +67 -0
- package/dist/dom/attrs.d.ts.map +1 -0
- package/dist/dom/attrs.js +154 -0
- package/dist/dom/components.d.ts +43 -0
- package/dist/dom/components.d.ts.map +1 -0
- package/dist/dom/components.js +86 -0
- package/dist/dom/elems.d.ts +121 -0
- package/dist/dom/elems.d.ts.map +1 -0
- package/dist/dom/elems.js +52 -0
- package/dist/dom/events.d.ts +232 -0
- package/dist/dom/events.d.ts.map +1 -0
- package/dist/dom/events.js +289 -0
- package/dist/dom/index.d.ts +248 -0
- package/dist/dom/index.d.ts.map +1 -0
- package/dist/dom/index.js +266 -0
- package/dist/dom/nodeid.d.ts +9 -0
- package/dist/dom/nodeid.d.ts.map +1 -0
- package/dist/dom/nodeid.js +27 -0
- package/dist/dom/svg.d.ts +23 -0
- package/dist/dom/svg.d.ts.map +1 -0
- package/dist/dom/svg.js +1 -0
- package/dist/dom/views.d.ts +60 -0
- package/dist/dom/views.d.ts.map +1 -0
- package/dist/dom/views.js +154 -0
- package/dist/effects.d.ts +580 -0
- package/dist/effects.d.ts.map +1 -0
- package/dist/effects.js +1556 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +78 -0
- package/dist/internal/clipboard.d.ts +5 -0
- package/dist/internal/clipboard.d.ts.map +1 -0
- package/dist/internal/clipboard.js +33 -0
- package/dist/internal/cmpmgr.d.ts +46 -0
- package/dist/internal/cmpmgr.d.ts.map +1 -0
- package/dist/internal/cmpmgr.js +561 -0
- package/dist/internal/dbmgr.d.ts +11 -0
- package/dist/internal/dbmgr.d.ts.map +1 -0
- package/dist/internal/dbmgr.js +200 -0
- package/dist/internal/dominterpreter.d.ts +5 -0
- package/dist/internal/dominterpreter.d.ts.map +1 -0
- package/dist/internal/dominterpreter.js +337 -0
- package/dist/internal/eventmgr.d.ts +41 -0
- package/dist/internal/eventmgr.d.ts.map +1 -0
- package/dist/internal/eventmgr.js +696 -0
- package/dist/internal/index.d.ts +19 -0
- package/dist/internal/index.d.ts.map +1 -0
- package/dist/internal/index.js +38 -0
- package/dist/internal/interpreter.d.ts +10 -0
- package/dist/internal/interpreter.d.ts.map +1 -0
- package/dist/internal/interpreter.js +1 -0
- package/dist/internal/locutils.d.ts +4 -0
- package/dist/internal/locutils.d.ts.map +1 -0
- package/dist/internal/locutils.js +22 -0
- package/dist/internal/net.d.ts +4 -0
- package/dist/internal/net.d.ts.map +1 -0
- package/dist/internal/net.js +64 -0
- package/dist/internal/realdom.d.ts +249 -0
- package/dist/internal/realdom.d.ts.map +1 -0
- package/dist/internal/realdom.js +1 -0
- package/dist/internal/styleregistry.d.ts +6 -0
- package/dist/internal/styleregistry.d.ts.map +1 -0
- package/dist/internal/styleregistry.js +18 -0
- package/dist/internal/taskreg.d.ts +9 -0
- package/dist/internal/taskreg.d.ts.map +1 -0
- package/dist/internal/taskreg.js +28 -0
- package/dist/internal/testing.d.ts +12 -0
- package/dist/internal/testing.d.ts.map +1 -0
- package/dist/internal/testing.js +974 -0
- package/dist/internal/testinginterpreter.d.ts +10 -0
- package/dist/internal/testinginterpreter.d.ts.map +1 -0
- package/dist/internal/testinginterpreter.js +646 -0
- package/dist/internal/vdom.d.ts +93 -0
- package/dist/internal/vdom.d.ts.map +1 -0
- package/dist/internal/vdom.js +470 -0
- package/dist/json/index.d.ts +5 -0
- package/dist/json/index.d.ts.map +1 -0
- package/dist/json/index.js +2 -0
- package/dist/json/validation.d.ts +28 -0
- package/dist/json/validation.d.ts.map +1 -0
- package/dist/json/validation.js +8 -0
- package/dist/net/fragment.d.ts +10 -0
- package/dist/net/fragment.d.ts.map +1 -0
- package/dist/net/fragment.js +27 -0
- package/dist/net/index.d.ts +42 -0
- package/dist/net/index.d.ts.map +1 -0
- package/dist/net/index.js +60 -0
- package/dist/net/location.d.ts +21 -0
- package/dist/net/location.d.ts.map +1 -0
- package/dist/net/location.js +41 -0
- package/dist/net/path.d.ts +12 -0
- package/dist/net/path.d.ts.map +1 -0
- package/dist/net/path.js +29 -0
- package/dist/net/queryparam.d.ts +10 -0
- package/dist/net/queryparam.d.ts.map +1 -0
- package/dist/net/queryparam.js +34 -0
- package/dist/router.d.ts +40 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +77 -0
- package/dist/scroll.d.ts +7 -0
- package/dist/scroll.d.ts.map +1 -0
- package/dist/scroll.js +3 -0
- package/dist/testing.d.ts +248 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +159 -0
- package/dist/utils/apply.d.ts +9 -0
- package/dist/utils/apply.d.ts.map +1 -0
- package/dist/utils/apply.js +10 -0
- package/dist/utils/index.d.ts +22 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +138 -0
- package/dist/utils/lens.d.ts +18 -0
- package/dist/utils/lens.d.ts.map +1 -0
- package/dist/utils/lens.js +27 -0
- package/dist/utils/match.d.ts +17 -0
- package/dist/utils/match.d.ts.map +1 -0
- package/dist/utils/match.js +28 -0
- package/dist/utils/result.d.ts +47 -0
- package/dist/utils/result.d.ts.map +1 -0
- package/dist/utils/result.js +97 -0
- package/dist/webcomponent.d.ts +15 -0
- package/dist/webcomponent.d.ts.map +1 -0
- package/dist/webcomponent.js +43 -0
- package/package.json +1 -1
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { type Node } from '.';
|
|
2
|
+
import type { Dimensions } from '..';
|
|
3
|
+
import type { Effect } from '../effects';
|
|
4
|
+
import type { InternalLocation } from '../net/location';
|
|
5
|
+
import type { ContainerListener, EventListenerResult, EventOptions, KeyData } from './events';
|
|
6
|
+
import { type NodeId } from './nodeid';
|
|
7
|
+
/**
|
|
8
|
+
* The return type of a view function: a list of virtual DOM nodes plus optional
|
|
9
|
+
* container-level event listeners. Create one with `nodeGroup(...)` or the `_` shorthand.
|
|
10
|
+
*/
|
|
11
|
+
export type NodeGroup<State, Event> = {
|
|
12
|
+
_type: 'NodeGroup';
|
|
13
|
+
nodes: Node<State, Event>[];
|
|
14
|
+
containerListeners: ContainerListener<State, Event>[];
|
|
15
|
+
/** Runs `effect` whenever the component's container is resized, receiving the new dimensions. */
|
|
16
|
+
onResize(effect: (dimensions: Dimensions) => Effect<State, Event, void>): NodeGroup<State, Event>;
|
|
17
|
+
/** Runs `effect` when the browser back/forward buttons are used. */
|
|
18
|
+
onPopState(effect: (location: InternalLocation) => Effect<State, Event, void>): NodeGroup<State, Event>;
|
|
19
|
+
/** Runs `effect` on any location change, including `pushState` and `replaceState` as well as `popstate`. */
|
|
20
|
+
onLocationChange(effect: (location: InternalLocation) => Effect<State, Event, void>): NodeGroup<State, Event>;
|
|
21
|
+
/** Runs `effect` on document-level keyup events. */
|
|
22
|
+
onKeyUp(effect: (key: KeyData) => Effect<State, Event, EventListenerResult>, options?: EventOptions): NodeGroup<State, Event>;
|
|
23
|
+
/** Runs `effect` on document-level keydown events. */
|
|
24
|
+
onKeyDown(effect: (key: KeyData) => Effect<State, Event, EventListenerResult>, options?: EventOptions): NodeGroup<State, Event>;
|
|
25
|
+
/** Runs `effect` when the page becomes visible or hidden (e.g. user switches tabs). */
|
|
26
|
+
onVisibilityChange(effect: (state: 'visible' | 'hidden') => Effect<State, Event, void>): NodeGroup<State, Event>;
|
|
27
|
+
/** Runs `effect` when the browser comes online. */
|
|
28
|
+
onOnline(effect: Effect<State, Event, void>): NodeGroup<State, Event>;
|
|
29
|
+
/** Runs `effect` when the browser goes offline. */
|
|
30
|
+
onOffline(effect: Effect<State, Event, void>): NodeGroup<State, Event>;
|
|
31
|
+
renderEffects: Effect<State, Event, void>[];
|
|
32
|
+
/** Runs `effects` once immediately after the component mounts. Use this for initial data loading or setup that requires the DOM to exist. */
|
|
33
|
+
onRender(...effects: Effect<State, Event, void>[]): NodeGroup<State, Event>;
|
|
34
|
+
};
|
|
35
|
+
/** Creates a `NodeGroup` from zero or more nodes. This is what view functions return. */
|
|
36
|
+
export declare function nodeGroup<State, Event>(...nodes: Node<State, Event>[]): NodeGroup<State, Event>;
|
|
37
|
+
/** Shorthand alias for `nodeGroup`. Useful for grouping nodes without extra verbosity: `_(div_('a'), div_('b'))`. */
|
|
38
|
+
export declare function _<State, Event>(...nodes: Node<State, Event>[]): NodeGroup<State, Event>;
|
|
39
|
+
/** A memoized subtree node produced by `view` or `fixedView`. */
|
|
40
|
+
export type View<State, Params, Event> = {
|
|
41
|
+
_type: 'View';
|
|
42
|
+
nodeId: NodeId;
|
|
43
|
+
params: Params;
|
|
44
|
+
nodes: (params: Params) => NodeGroup<State, Event>;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Creates a memoized subtree. The `nodes` function is only re-called when `params` changes
|
|
48
|
+
* (by reference). Use this to avoid re-rendering expensive subtrees that don't depend on
|
|
49
|
+
* frequently-changing state.
|
|
50
|
+
* @param id A stable identifier used to track this view across re-renders. Must be unique among siblings.
|
|
51
|
+
*/
|
|
52
|
+
export declare function view<State, Params, Event>(id: NodeId | string, nodes: (params: Params) => NodeGroup<State, Event> | Node<State, Event>): (params: Params) => View<State, Params, Event>;
|
|
53
|
+
/**
|
|
54
|
+
* Creates a memoized subtree that never re-renders after mount. The `nodes` function is
|
|
55
|
+
* called once; subsequent renders reuse the result.
|
|
56
|
+
* @param id A stable identifier used to track this view across re-renders.
|
|
57
|
+
*/
|
|
58
|
+
export declare function fixedView<State, Event>(id: NodeId | string): (nodes: NodeGroup<State, Event> | Node<State, Event>) => View<State, void, Event>;
|
|
59
|
+
export declare function isNodeGroup<State, Event>(value: unknown): value is NodeGroup<State, Event>;
|
|
60
|
+
//# sourceMappingURL=views.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../src/dom/views.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import {} from '.';
|
|
2
|
+
import { nodeId } from './nodeid';
|
|
3
|
+
/** Creates a `NodeGroup` from zero or more nodes. This is what view functions return. */
|
|
4
|
+
export function nodeGroup(...nodes) {
|
|
5
|
+
return {
|
|
6
|
+
_type: 'NodeGroup',
|
|
7
|
+
nodes,
|
|
8
|
+
containerListeners: [],
|
|
9
|
+
onResize(effect) {
|
|
10
|
+
return {
|
|
11
|
+
...this,
|
|
12
|
+
containerListeners: [
|
|
13
|
+
...this.containerListeners,
|
|
14
|
+
{
|
|
15
|
+
_type: 'resize',
|
|
16
|
+
onChange: effect,
|
|
17
|
+
options: {},
|
|
18
|
+
},
|
|
19
|
+
],
|
|
20
|
+
};
|
|
21
|
+
},
|
|
22
|
+
onPopState(effect) {
|
|
23
|
+
return {
|
|
24
|
+
...this,
|
|
25
|
+
containerListeners: [
|
|
26
|
+
...this.containerListeners,
|
|
27
|
+
{
|
|
28
|
+
_type: 'popstate',
|
|
29
|
+
onChange: effect,
|
|
30
|
+
options: {},
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
};
|
|
34
|
+
},
|
|
35
|
+
onLocationChange(effect) {
|
|
36
|
+
return {
|
|
37
|
+
...this,
|
|
38
|
+
containerListeners: [
|
|
39
|
+
...this.containerListeners,
|
|
40
|
+
{
|
|
41
|
+
_type: 'locationchange',
|
|
42
|
+
onChange: effect,
|
|
43
|
+
options: {},
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
onKeyDown(effect) {
|
|
49
|
+
return {
|
|
50
|
+
...this,
|
|
51
|
+
containerListeners: [
|
|
52
|
+
...this.containerListeners,
|
|
53
|
+
{
|
|
54
|
+
_type: 'keydown',
|
|
55
|
+
effect,
|
|
56
|
+
options: {},
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
};
|
|
60
|
+
},
|
|
61
|
+
onKeyUp(effect) {
|
|
62
|
+
return {
|
|
63
|
+
...this,
|
|
64
|
+
containerListeners: [
|
|
65
|
+
...this.containerListeners,
|
|
66
|
+
{ _type: 'keyup', effect, options: {} },
|
|
67
|
+
],
|
|
68
|
+
};
|
|
69
|
+
},
|
|
70
|
+
onVisibilityChange(effect) {
|
|
71
|
+
return {
|
|
72
|
+
...this,
|
|
73
|
+
containerListeners: [
|
|
74
|
+
...this.containerListeners,
|
|
75
|
+
{ _type: 'visibilitychange', onChange: effect, options: {} },
|
|
76
|
+
],
|
|
77
|
+
};
|
|
78
|
+
},
|
|
79
|
+
onOnline(effect) {
|
|
80
|
+
return {
|
|
81
|
+
...this,
|
|
82
|
+
containerListeners: [
|
|
83
|
+
...this.containerListeners,
|
|
84
|
+
{ _type: 'online', effect, options: {} },
|
|
85
|
+
],
|
|
86
|
+
};
|
|
87
|
+
},
|
|
88
|
+
onOffline(effect) {
|
|
89
|
+
return {
|
|
90
|
+
...this,
|
|
91
|
+
containerListeners: [
|
|
92
|
+
...this.containerListeners,
|
|
93
|
+
{ _type: 'offline', effect, options: {} },
|
|
94
|
+
],
|
|
95
|
+
};
|
|
96
|
+
},
|
|
97
|
+
renderEffects: [],
|
|
98
|
+
onRender(...effects) {
|
|
99
|
+
return {
|
|
100
|
+
...this,
|
|
101
|
+
renderEffects: effects,
|
|
102
|
+
};
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/** Shorthand alias for `nodeGroup`. Useful for grouping nodes without extra verbosity: `_(div_('a'), div_('b'))`. */
|
|
107
|
+
export function _(...nodes) {
|
|
108
|
+
return nodeGroup(...nodes);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Creates a memoized subtree. The `nodes` function is only re-called when `params` changes
|
|
112
|
+
* (by reference). Use this to avoid re-rendering expensive subtrees that don't depend on
|
|
113
|
+
* frequently-changing state.
|
|
114
|
+
* @param id A stable identifier used to track this view across re-renders. Must be unique among siblings.
|
|
115
|
+
*/
|
|
116
|
+
export function view(id, nodes) {
|
|
117
|
+
return (params) => ({
|
|
118
|
+
_type: 'View',
|
|
119
|
+
nodeId: typeof id === 'string' ? nodeId(id) : id,
|
|
120
|
+
params,
|
|
121
|
+
nodes: (params) => {
|
|
122
|
+
const nodeOrNodeGroup = nodes(params);
|
|
123
|
+
return isNodeGroup(nodeOrNodeGroup)
|
|
124
|
+
? nodeOrNodeGroup
|
|
125
|
+
: _(nodeOrNodeGroup);
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Creates a memoized subtree that never re-renders after mount. The `nodes` function is
|
|
131
|
+
* called once; subsequent renders reuse the result.
|
|
132
|
+
* @param id A stable identifier used to track this view across re-renders.
|
|
133
|
+
*/
|
|
134
|
+
export function fixedView(id) {
|
|
135
|
+
return nodes => ({
|
|
136
|
+
_type: 'View',
|
|
137
|
+
nodeId: typeof id === 'string' ? nodeId(id) : id,
|
|
138
|
+
params: undefined,
|
|
139
|
+
nodes: () => (isNodeGroup(nodes) ? nodes : _(nodes)),
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
export function isNodeGroup(value) {
|
|
143
|
+
if (value === null || value === undefined) {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
if (typeof value !== 'object') {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
return (Object.prototype.hasOwnProperty.call(value, '_type') &&
|
|
150
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
151
|
+
value['_type'] === 'NodeGroup' &&
|
|
152
|
+
Object.prototype.hasOwnProperty.call(value, 'nodes') &&
|
|
153
|
+
Object.prototype.hasOwnProperty.call(value, 'containerListeners'));
|
|
154
|
+
}
|