@llui/dom 0.0.1

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.
Files changed (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +15 -0
  3. package/dist/addressed.d.ts +16 -0
  4. package/dist/addressed.d.ts.map +1 -0
  5. package/dist/addressed.js +40 -0
  6. package/dist/addressed.js.map +1 -0
  7. package/dist/binding.d.ts +18 -0
  8. package/dist/binding.d.ts.map +1 -0
  9. package/dist/binding.js +62 -0
  10. package/dist/binding.js.map +1 -0
  11. package/dist/chain-update.d.ts +7 -0
  12. package/dist/chain-update.d.ts.map +1 -0
  13. package/dist/chain-update.js +16 -0
  14. package/dist/chain-update.js.map +1 -0
  15. package/dist/component.d.ts +3 -0
  16. package/dist/component.d.ts.map +1 -0
  17. package/dist/component.js +4 -0
  18. package/dist/component.js.map +1 -0
  19. package/dist/devtools.d.ts +113 -0
  20. package/dist/devtools.d.ts.map +1 -0
  21. package/dist/devtools.js +390 -0
  22. package/dist/devtools.js.map +1 -0
  23. package/dist/el-split.d.ts +3 -0
  24. package/dist/el-split.d.ts.map +1 -0
  25. package/dist/el-split.js +54 -0
  26. package/dist/el-split.js.map +1 -0
  27. package/dist/el-template.d.ts +17 -0
  28. package/dist/el-template.d.ts.map +1 -0
  29. package/dist/el-template.js +64 -0
  30. package/dist/el-template.js.map +1 -0
  31. package/dist/elements.d.ts +80 -0
  32. package/dist/elements.d.ts.map +1 -0
  33. package/dist/elements.js +234 -0
  34. package/dist/elements.js.map +1 -0
  35. package/dist/form.d.ts +30 -0
  36. package/dist/form.d.ts.map +1 -0
  37. package/dist/form.js +12 -0
  38. package/dist/form.js.map +1 -0
  39. package/dist/hmr.d.ts +20 -0
  40. package/dist/hmr.d.ts.map +1 -0
  41. package/dist/hmr.js +98 -0
  42. package/dist/hmr.js.map +1 -0
  43. package/dist/hydrate.d.ts +29 -0
  44. package/dist/hydrate.d.ts.map +1 -0
  45. package/dist/hydrate.js +96 -0
  46. package/dist/hydrate.js.map +1 -0
  47. package/dist/index.d.ts +28 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +34 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/merge-handlers.d.ts +7 -0
  52. package/dist/merge-handlers.d.ts.map +1 -0
  53. package/dist/merge-handlers.js +16 -0
  54. package/dist/merge-handlers.js.map +1 -0
  55. package/dist/mount.d.ts +14 -0
  56. package/dist/mount.d.ts.map +1 -0
  57. package/dist/mount.js +182 -0
  58. package/dist/mount.js.map +1 -0
  59. package/dist/primitives/branch.d.ts +3 -0
  60. package/dist/primitives/branch.d.ts.map +1 -0
  61. package/dist/primitives/branch.js +94 -0
  62. package/dist/primitives/branch.js.map +1 -0
  63. package/dist/primitives/child.d.ts +3 -0
  64. package/dist/primitives/child.d.ts.map +1 -0
  65. package/dist/primitives/child.js +77 -0
  66. package/dist/primitives/child.js.map +1 -0
  67. package/dist/primitives/context.d.ts +45 -0
  68. package/dist/primitives/context.d.ts.map +1 -0
  69. package/dist/primitives/context.js +87 -0
  70. package/dist/primitives/context.js.map +1 -0
  71. package/dist/primitives/each.d.ts +3 -0
  72. package/dist/primitives/each.d.ts.map +1 -0
  73. package/dist/primitives/each.js +515 -0
  74. package/dist/primitives/each.js.map +1 -0
  75. package/dist/primitives/error-boundary.d.ts +6 -0
  76. package/dist/primitives/error-boundary.d.ts.map +1 -0
  77. package/dist/primitives/error-boundary.js +32 -0
  78. package/dist/primitives/error-boundary.js.map +1 -0
  79. package/dist/primitives/foreign.d.ts +3 -0
  80. package/dist/primitives/foreign.d.ts.map +1 -0
  81. package/dist/primitives/foreign.js +80 -0
  82. package/dist/primitives/foreign.js.map +1 -0
  83. package/dist/primitives/memo.d.ts +3 -0
  84. package/dist/primitives/memo.d.ts.map +1 -0
  85. package/dist/primitives/memo.js +30 -0
  86. package/dist/primitives/memo.js.map +1 -0
  87. package/dist/primitives/on-mount.d.ts +2 -0
  88. package/dist/primitives/on-mount.d.ts.map +1 -0
  89. package/dist/primitives/on-mount.js +23 -0
  90. package/dist/primitives/on-mount.js.map +1 -0
  91. package/dist/primitives/portal.d.ts +3 -0
  92. package/dist/primitives/portal.d.ts.map +1 -0
  93. package/dist/primitives/portal.js +31 -0
  94. package/dist/primitives/portal.js.map +1 -0
  95. package/dist/primitives/selector.d.ts +22 -0
  96. package/dist/primitives/selector.d.ts.map +1 -0
  97. package/dist/primitives/selector.js +104 -0
  98. package/dist/primitives/selector.js.map +1 -0
  99. package/dist/primitives/show.d.ts +3 -0
  100. package/dist/primitives/show.d.ts.map +1 -0
  101. package/dist/primitives/show.js +12 -0
  102. package/dist/primitives/show.js.map +1 -0
  103. package/dist/primitives/slice.d.ts +23 -0
  104. package/dist/primitives/slice.d.ts.map +1 -0
  105. package/dist/primitives/slice.js +57 -0
  106. package/dist/primitives/slice.js.map +1 -0
  107. package/dist/primitives/text.d.ts +2 -0
  108. package/dist/primitives/text.d.ts.map +1 -0
  109. package/dist/primitives/text.js +35 -0
  110. package/dist/primitives/text.js.map +1 -0
  111. package/dist/render-context.d.ts +14 -0
  112. package/dist/render-context.d.ts.map +1 -0
  113. package/dist/render-context.js +14 -0
  114. package/dist/render-context.js.map +1 -0
  115. package/dist/runtime.d.ts +4 -0
  116. package/dist/runtime.d.ts.map +1 -0
  117. package/dist/runtime.js +14 -0
  118. package/dist/runtime.js.map +1 -0
  119. package/dist/scope.d.ts +24 -0
  120. package/dist/scope.d.ts.map +1 -0
  121. package/dist/scope.js +102 -0
  122. package/dist/scope.js.map +1 -0
  123. package/dist/slice-handler.d.ts +31 -0
  124. package/dist/slice-handler.d.ts.map +1 -0
  125. package/dist/slice-handler.js +34 -0
  126. package/dist/slice-handler.js.map +1 -0
  127. package/dist/ssr-dom.d.ts +12 -0
  128. package/dist/ssr-dom.d.ts.map +1 -0
  129. package/dist/ssr-dom.js +36 -0
  130. package/dist/ssr-dom.js.map +1 -0
  131. package/dist/ssr.d.ts +11 -0
  132. package/dist/ssr.d.ts.map +1 -0
  133. package/dist/ssr.js +127 -0
  134. package/dist/ssr.js.map +1 -0
  135. package/dist/structural.d.ts +4 -0
  136. package/dist/structural.d.ts.map +1 -0
  137. package/dist/structural.js +2 -0
  138. package/dist/structural.js.map +1 -0
  139. package/dist/types.d.ts +145 -0
  140. package/dist/types.d.ts.map +1 -0
  141. package/dist/types.js +3 -0
  142. package/dist/types.js.map +1 -0
  143. package/dist/update-loop.d.ts +31 -0
  144. package/dist/update-loop.d.ts.map +1 -0
  145. package/dist/update-loop.js +236 -0
  146. package/dist/update-loop.js.map +1 -0
  147. package/dist/view-helpers.d.ts +44 -0
  148. package/dist/view-helpers.d.ts.map +1 -0
  149. package/dist/view-helpers.js +24 -0
  150. package/dist/view-helpers.js.map +1 -0
  151. package/package.json +56 -0
@@ -0,0 +1,236 @@
1
+ import { createScope } from './scope';
2
+ import { applyBinding } from './binding';
3
+ import { setCurrentDirtyMask } from './primitives/memo';
4
+ export const FULL_MASK = 0xffffffff | 0;
5
+ // Addressed effect dispatcher — set by addressed.ts when imported
6
+ let addressedDispatcher = null;
7
+ export function setAddressedDispatcher(fn) {
8
+ addressedDispatcher = fn;
9
+ }
10
+ export function createComponentInstance(def, data) {
11
+ const [initialState, initialEffects] = def.init(data);
12
+ const controller = new AbortController();
13
+ const inst = {
14
+ def,
15
+ state: initialState,
16
+ initialEffects,
17
+ rootScope: createScope(null),
18
+ allBindings: [],
19
+ structuralBlocks: [],
20
+ queue: [],
21
+ microtaskScheduled: false,
22
+ lastDirtyMask: 0,
23
+ lastEffects: [],
24
+ signal: controller.signal,
25
+ abortController: controller,
26
+ send(msg) {
27
+ inst.queue.push(msg);
28
+ if (!inst.microtaskScheduled) {
29
+ inst.microtaskScheduled = true;
30
+ queueMicrotask(() => {
31
+ inst.microtaskScheduled = false;
32
+ processMessages(inst);
33
+ });
34
+ }
35
+ },
36
+ };
37
+ return inst;
38
+ }
39
+ export function flushInstance(inst) {
40
+ if (inst.queue.length === 0)
41
+ return;
42
+ inst.microtaskScheduled = false;
43
+ processMessages(inst);
44
+ }
45
+ /**
46
+ * Dev-only: overwrite instance state and re-run both phases with FULL_MASK
47
+ * so every binding re-evaluates. Bypasses update() — use for devtools
48
+ * snapshot/restore, not in app code.
49
+ */
50
+ export function _forceState(inst, newState) {
51
+ inst.state = newState;
52
+ inst.lastDirtyMask = FULL_MASK;
53
+ const bindings = inst.allBindings;
54
+ const bindingsBeforePhase1 = bindings.length;
55
+ setCurrentDirtyMask(FULL_MASK);
56
+ const snapshot = inst.structuralBlocks.slice();
57
+ for (const block of snapshot) {
58
+ block.reconcile(newState, FULL_MASK);
59
+ }
60
+ let phase2Len = bindingsBeforePhase1;
61
+ if (bindings.length > bindingsBeforePhase1 || (phase2Len > 0 && bindings[0].dead)) {
62
+ let w = 0;
63
+ for (let r = 0; r < bindings.length; r++) {
64
+ if (!bindings[r].dead)
65
+ bindings[w++] = bindings[r];
66
+ }
67
+ bindings.length = w;
68
+ phase2Len = Math.min(w, bindingsBeforePhase1);
69
+ }
70
+ const state = inst.state;
71
+ for (let i = 0, len = phase2Len; i < len; i++) {
72
+ const binding = bindings[i];
73
+ if (binding.dead)
74
+ continue;
75
+ const newValue = binding.accessor(state);
76
+ if (Object.is(newValue, binding.lastValue))
77
+ continue;
78
+ binding.lastValue = newValue;
79
+ applyBinding(binding, newValue);
80
+ }
81
+ }
82
+ function processMessages(inst) {
83
+ let state = inst.state;
84
+ let combinedDirty = 0;
85
+ const allEffects = [];
86
+ // Drain the message queue. Index-based cursor rather than queue.shift()
87
+ // so N messages cost O(N) instead of O(N²) from repeated array shifts.
88
+ const queue = inst.queue;
89
+ const defUpdate = inst.def.update;
90
+ const dirtyFn = inst.def.__dirty;
91
+ for (let qi = 0; qi < queue.length; qi++) {
92
+ const msg = queue[qi];
93
+ const [newState, effects] = defUpdate(state, msg);
94
+ const dirty = dirtyFn ? dirtyFn(state, newState) : FULL_MASK;
95
+ if (typeof dirty === 'number') {
96
+ combinedDirty |= dirty;
97
+ }
98
+ else {
99
+ combinedDirty |= dirty[0] | dirty[1];
100
+ }
101
+ state = newState;
102
+ // Avoid spread — allocates an iterator per call. For typical effect
103
+ // arrays (0-2 elements) this is a minor saving; for bursts it matters.
104
+ for (let ei = 0; ei < effects.length; ei++)
105
+ allEffects.push(effects[ei]);
106
+ }
107
+ queue.length = 0;
108
+ inst.state = state;
109
+ // Dev-only bookkeeping — tests read lastDirtyMask/lastEffects, prod
110
+ // doesn't. Gating here keeps two writes out of the prod hot path.
111
+ if (import.meta.env?.DEV) {
112
+ inst.lastDirtyMask = combinedDirty;
113
+ inst.lastEffects = allEffects;
114
+ }
115
+ // Snapshot binding count before Phase 1 — bindings added during
116
+ // Phase 1 already have correct initial values and skip Phase 2.
117
+ const bindings = inst.allBindings;
118
+ const bindingsBeforePhase1 = bindings.length;
119
+ // Set current dirty mask BEFORE Phase 1 so memo() accessors used in
120
+ // structural primitives (e.g. each.items) can use the bitmask fast path.
121
+ setCurrentDirtyMask(combinedDirty);
122
+ // Phase 1 — structural reconciliation (instance-local blocks).
123
+ // Iterate with a fixed-length snapshot index so newly-added blocks
124
+ // (from nested each/show/branch) are deferred to the next cycle but
125
+ // we don't allocate a slice() on every flush.
126
+ const blocks = inst.structuralBlocks;
127
+ const blocksLen = blocks.length;
128
+ for (let bi = 0; bi < blocksLen; bi++) {
129
+ blocks[bi].reconcile(state, combinedDirty);
130
+ }
131
+ // Compact dead bindings before Phase 2 (Phase 1 may have disposed scopes)
132
+ let phase2Len = bindingsBeforePhase1;
133
+ if (bindings.length > bindingsBeforePhase1 || (phase2Len > 0 && bindings[0].dead)) {
134
+ let w = 0;
135
+ for (let r = 0; r < bindings.length; r++) {
136
+ if (!bindings[r].dead)
137
+ bindings[w++] = bindings[r];
138
+ }
139
+ bindings.length = w;
140
+ phase2Len = Math.min(w, bindingsBeforePhase1);
141
+ }
142
+ // Phase 2 — binding updates (flat array, no tree walk).
143
+ // Only iterate bindings that existed before Phase 1; fresh bindings
144
+ // (created during Phase 1) already have initial values set.
145
+ if (combinedDirty !== 0) {
146
+ const s = inst.state;
147
+ if (import.meta.env?.DEV) {
148
+ // Dev build: wrap accessor calls so errors reveal the binding path.
149
+ for (let i = 0, len = phase2Len; i < len; i++) {
150
+ const binding = bindings[i];
151
+ if (binding.dead || (binding.mask & combinedDirty) === 0)
152
+ continue;
153
+ let newValue;
154
+ try {
155
+ newValue = binding.accessor(s);
156
+ }
157
+ catch (e) {
158
+ throw enhanceBindingError(e, binding, inst.def.name);
159
+ }
160
+ const last = binding.lastValue;
161
+ // `===` is inline and 2-3× faster than Object.is for the common
162
+ // case. The NaN guard (v !== v means NaN) preserves Object.is's
163
+ // NaN-equals-NaN semantics. −0 vs +0 we treat as equal, which
164
+ // matches what users typically want for DOM updates.
165
+ if (newValue === last || (newValue !== newValue && last !== last))
166
+ continue;
167
+ binding.lastValue = newValue;
168
+ applyBinding(binding, newValue);
169
+ }
170
+ }
171
+ else {
172
+ for (let i = 0, len = phase2Len; i < len; i++) {
173
+ const binding = bindings[i];
174
+ if (binding.dead || (binding.mask & combinedDirty) === 0)
175
+ continue;
176
+ const newValue = binding.accessor(s);
177
+ const last = binding.lastValue;
178
+ if (newValue === last || (newValue !== newValue && last !== last))
179
+ continue;
180
+ binding.lastValue = newValue;
181
+ applyBinding(binding, newValue);
182
+ }
183
+ }
184
+ }
185
+ // Dispatch effects after DOM updates
186
+ for (let i = 0; i < allEffects.length; i++) {
187
+ dispatchEffect(inst, allEffects[i]);
188
+ }
189
+ }
190
+ function enhanceBindingError(err, binding, componentName) {
191
+ // For text bindings, binding.node is the Text node — use its parent element.
192
+ const node = binding.node;
193
+ const target = node.nodeType === 1 ? node : (node.parentElement ?? null);
194
+ let nodeDesc = '?';
195
+ if (target) {
196
+ const id = target.id ? `#${target.id}` : '';
197
+ const cls = target.className && typeof target.className === 'string'
198
+ ? `.${target.className.split(' ').filter(Boolean).slice(0, 2).join('.')}`
199
+ : '';
200
+ nodeDesc = `<${target.tagName.toLowerCase()}${id}${cls}>`;
201
+ if (node.nodeType === 3)
202
+ nodeDesc += ' text-child';
203
+ else if (node.nodeType === 8)
204
+ nodeDesc += ' comment-child';
205
+ }
206
+ const keyPart = binding.key ? `.${binding.key}` : '';
207
+ const wrapped = new Error(`[LLui] accessor threw in ${componentName}: ${binding.kind}${keyPart} binding on ${nodeDesc}\n` +
208
+ ` ↳ ${err instanceof Error ? err.message : String(err)}`, err instanceof Error ? { cause: err } : undefined);
209
+ wrapped.stack = (err instanceof Error && err.stack) || wrapped.stack;
210
+ return wrapped;
211
+ }
212
+ function dispatchEffect(inst, effect) {
213
+ const eff = effect;
214
+ // Addressed effects — dispatch to target component
215
+ if (eff.__addressed === true && typeof eff.__targetKey !== 'undefined') {
216
+ addressedDispatcher?.(eff);
217
+ return;
218
+ }
219
+ // Built-in: delay
220
+ if (eff.type === 'delay') {
221
+ const ms = eff.ms;
222
+ const onDone = eff.onDone;
223
+ setTimeout(() => inst.send(onDone), ms);
224
+ return;
225
+ }
226
+ // Built-in: log
227
+ if (eff.type === 'log') {
228
+ console.log(eff.message);
229
+ return;
230
+ }
231
+ // User onEffect handler
232
+ if (inst.def.onEffect) {
233
+ inst.def.onEffect({ effect, send: inst.send, signal: inst.signal });
234
+ }
235
+ }
236
+ //# sourceMappingURL=update-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-loop.js","sourceRoot":"","sources":["../src/update-loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { Send, ShowOptions, BranchOptions, EachOptions } from './types';
2
+ import { type SelectorInstance } from './primitives/selector';
3
+ import { type Context } from './primitives/context';
4
+ /**
5
+ * Typed view helpers bound to a component's `State` / `Msg`. The sole
6
+ * argument to `view`, so every state-bound primitive infers `State` from
7
+ * the component definition — no per-call `show<State>(...)` annotation.
8
+ *
9
+ * ```ts
10
+ * view: ({ send, show, text }) => [
11
+ * ...show({ when: s => s.count > 0, render: () => [...] }),
12
+ * text(s => String(s.count)),
13
+ * ]
14
+ * ```
15
+ *
16
+ * Tip: to view-function over a sub-slice of parent state, import `slice`
17
+ * as a standalone helper:
18
+ *
19
+ * ```ts
20
+ * import { slice } from '@llui/dom'
21
+ * const form = slice(h, s => s.form) // returns View<FormState, Msg>
22
+ * ```
23
+ *
24
+ * The Vite plugin's mask-injection pass recognizes all three call forms
25
+ * equivalently: `h.text(...)` (member expression), `text(...)` (destructured
26
+ * alias), and `text(...)` (bare import from `@llui/dom`). No per-binding
27
+ * gating is lost when calling through `h`.
28
+ */
29
+ export interface View<S, M> {
30
+ send: Send<M>;
31
+ show(opts: ShowOptions<S, M>): Node[];
32
+ branch(opts: BranchOptions<S, M>): Node[];
33
+ each<T>(opts: EachOptions<S, T, M>): Node[];
34
+ text(accessor: ((s: S) => string) | string, mask?: number): Text;
35
+ memo<T>(accessor: (s: S) => T): (s: S) => T;
36
+ selector<V>(field: (s: S) => V): SelectorInstance<V>;
37
+ ctx<T>(c: Context<T>): (s: S) => T;
38
+ }
39
+ /**
40
+ * Create a `View<S, M>` bundle for a component's `view` callback.
41
+ * Delegates straight to the underlying primitives — zero per-call overhead.
42
+ */
43
+ export declare function createView<S, M>(send: Send<M>): View<S, M>;
44
+ //# sourceMappingURL=view-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view-helpers.d.ts","sourceRoot":"","sources":["../src/view-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAM5E,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACpF,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,WAAW,IAAI,CAAC,CAAC,EAAE,CAAC;IACxB,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;IACb,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,CAAA;IACrC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,CAAA;IACzC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,CAAA;IAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAChE,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;IAC3C,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAA;IACpD,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;CACnC;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAY1D"}
@@ -0,0 +1,24 @@
1
+ import { show as _show } from './primitives/show';
2
+ import { branch as _branch } from './primitives/branch';
3
+ import { each as _each } from './primitives/each';
4
+ import { text as _text } from './primitives/text';
5
+ import { memo as _memo } from './primitives/memo';
6
+ import { selector as _selector } from './primitives/selector';
7
+ import { useContext } from './primitives/context';
8
+ /**
9
+ * Create a `View<S, M>` bundle for a component's `view` callback.
10
+ * Delegates straight to the underlying primitives — zero per-call overhead.
11
+ */
12
+ export function createView(send) {
13
+ return {
14
+ send,
15
+ show: (opts) => _show(opts),
16
+ branch: (opts) => _branch(opts),
17
+ each: (opts) => _each(opts),
18
+ text: (accessor, mask) => typeof accessor === 'string' ? _text(accessor) : _text(accessor, mask),
19
+ memo: (accessor) => _memo(accessor),
20
+ selector: (field) => _selector(field),
21
+ ctx: (c) => useContext(c),
22
+ };
23
+ }
24
+ //# sourceMappingURL=view-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view-helpers.js","sourceRoot":"","sources":["../src/view-helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,IAAI,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,IAAI,IAAI,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,IAAI,IAAI,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,IAAI,IAAI,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,QAAQ,IAAI,SAAS,EAAyB,MAAM,uBAAuB,CAAA;AACpF,OAAO,EAAE,UAAU,EAAgB,MAAM,sBAAsB,CAAA;AAsC/D;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAO,IAAa;IAC5C,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAO,IAAI,CAAC;QACjC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAO,IAAI,CAAC;QACrC,IAAI,EAAE,CAAI,IAA0B,EAAE,EAAE,CAAC,KAAK,CAAU,IAAI,CAAC;QAC7D,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CACvB,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAI,QAAQ,EAAE,IAAI,CAAC;QAC3E,IAAI,EAAE,CAAI,QAAqB,EAAE,EAAE,CAAC,KAAK,CAAO,QAAQ,CAAC;QACzD,QAAQ,EAAE,CAAI,KAAkB,EAAE,EAAE,CAAC,SAAS,CAAO,KAAK,CAAC;QAC3D,GAAG,EAAE,CAAI,CAAa,EAAE,EAAE,CAAC,UAAU,CAAO,CAAC,CAAC;KAC/C,CAAA;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@llui/dom",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "sideEffects": false,
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/index.d.ts",
9
+ "import": "./dist/index.js"
10
+ },
11
+ "./devtools": {
12
+ "types": "./dist/devtools.d.ts",
13
+ "import": "./dist/devtools.js"
14
+ },
15
+ "./ssr": {
16
+ "types": "./dist/ssr-dom.d.ts",
17
+ "import": "./dist/ssr-dom.js"
18
+ },
19
+ "./hmr": {
20
+ "types": "./dist/hmr.d.ts",
21
+ "import": "./dist/hmr.js"
22
+ }
23
+ },
24
+ "files": [
25
+ "dist"
26
+ ],
27
+ "scripts": {
28
+ "build": "tsc -p tsconfig.build.json",
29
+ "check": "tsc --noEmit -p tsconfig.check.json",
30
+ "lint": "eslint src",
31
+ "test": "vitest run",
32
+ "test:coverage": "vitest run --coverage"
33
+ },
34
+ "description": "LLui runtime — TEA component model, mount, scope tree, bindings, structural primitives, element helpers",
35
+ "keywords": [
36
+ "llui",
37
+ "tea",
38
+ "elm-architecture",
39
+ "reactive",
40
+ "dom",
41
+ "framework",
42
+ "compile-time",
43
+ "bitmask"
44
+ ],
45
+ "author": "Franco Ponticelli <franco.ponticelli@gmail.com>",
46
+ "license": "MIT",
47
+ "repository": {
48
+ "type": "git",
49
+ "url": "git+https://github.com/fponticelli/llui.git",
50
+ "directory": "packages/dom"
51
+ },
52
+ "bugs": {
53
+ "url": "https://github.com/fponticelli/llui/issues"
54
+ },
55
+ "homepage": "https://github.com/fponticelli/llui/tree/main/packages/dom#readme"
56
+ }