marko 6.3.31 → 6.3.33

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 (67) hide show
  1. package/cheatsheet.md +39 -18
  2. package/dist/common/helpers.d.ts +2 -0
  3. package/dist/debug/dom/catch.feat.js +38 -0
  4. package/dist/debug/dom/catch.feat.mjs +37 -0
  5. package/dist/debug/dom/controllable-input.feat.js +7 -0
  6. package/dist/debug/dom/controllable-input.feat.mjs +6 -0
  7. package/dist/debug/dom/controllable-open.feat.js +5 -0
  8. package/dist/debug/dom/controllable-open.feat.mjs +4 -0
  9. package/dist/debug/dom/controllable-select.feat.js +5 -0
  10. package/dist/debug/dom/controllable-select.feat.mjs +4 -0
  11. package/dist/debug/dom/controllable-textarea.feat.js +5 -0
  12. package/dist/debug/dom/controllable-textarea.feat.mjs +4 -0
  13. package/dist/debug/dom/controllable.feat.js +11 -0
  14. package/dist/debug/dom/controllable.feat.mjs +10 -0
  15. package/dist/debug/dom-BJ93mcSe.mjs +2016 -0
  16. package/dist/debug/dom-CiFITSPN.js +2814 -0
  17. package/dist/debug/dom.js +156 -2250
  18. package/dist/debug/dom.mjs +6 -2094
  19. package/dist/debug/html.js +35 -7
  20. package/dist/debug/html.mjs +36 -5
  21. package/dist/dom/catch.feat.d.ts +1 -0
  22. package/dist/dom/catch.feat.js +25 -0
  23. package/dist/dom/catch.feat.mjs +26 -0
  24. package/dist/dom/control-flow.d.ts +3 -3
  25. package/dist/dom/controllable-input.feat.d.ts +1 -0
  26. package/dist/dom/controllable-input.feat.js +3 -0
  27. package/dist/dom/controllable-input.feat.mjs +3 -0
  28. package/dist/dom/controllable-open.feat.d.ts +1 -0
  29. package/dist/dom/controllable-open.feat.js +4 -0
  30. package/dist/dom/controllable-open.feat.mjs +4 -0
  31. package/dist/dom/controllable-select.feat.d.ts +1 -0
  32. package/dist/dom/controllable-select.feat.js +4 -0
  33. package/dist/dom/controllable-select.feat.mjs +4 -0
  34. package/dist/dom/controllable-textarea.feat.d.ts +1 -0
  35. package/dist/dom/controllable-textarea.feat.js +4 -0
  36. package/dist/dom/controllable-textarea.feat.mjs +4 -0
  37. package/dist/dom/controllable.d.ts +3 -8
  38. package/dist/dom/controllable.feat.d.ts +3 -0
  39. package/dist/dom/controllable.feat.js +3 -0
  40. package/dist/dom/controllable.feat.mjs +6 -0
  41. package/dist/dom/queue.d.ts +2 -2
  42. package/dist/dom/resume.d.ts +0 -1
  43. package/dist/dom-CI-06TZb.js +1721 -0
  44. package/dist/dom-Cj4HQ7T_.mjs +1137 -0
  45. package/dist/dom.d.ts +2 -2
  46. package/dist/dom.js +36 -1224
  47. package/dist/dom.mjs +4 -1191
  48. package/dist/html/compat.d.ts +3 -1
  49. package/dist/html/writer.d.ts +3 -0
  50. package/dist/html.d.ts +1 -1
  51. package/dist/html.js +31 -11
  52. package/dist/html.mjs +31 -11
  53. package/dist/translator/index.js +680 -583
  54. package/dist/translator/util/branch-tag.d.ts +5 -0
  55. package/dist/translator/util/constants/structure-kind.d.ts +7 -0
  56. package/dist/translator/util/get-tag-name.d.ts +2 -1
  57. package/dist/translator/util/import-reference.d.ts +3 -0
  58. package/dist/translator/util/runtime.d.ts +2 -0
  59. package/dist/translator/util/sections.d.ts +28 -1
  60. package/dist/translator/util/signals.d.ts +1 -3
  61. package/dist/translator/util/{walks.d.ts → structure.d.ts} +20 -9
  62. package/dist/translator/util/writer.d.ts +0 -8
  63. package/dist/translator/visitors/placeholder.d.ts +4 -3
  64. package/dist/translator/visitors/tag/native-tag.d.ts +9 -6
  65. package/dist/translator/visitors/text.d.ts +3 -7
  66. package/index.d.ts +19 -1
  67. package/package.json +4 -4
package/cheatsheet.md CHANGED
@@ -4,18 +4,20 @@ Marko 6 = HTML superset. NOT JSX, NOT old Marko 4/5. `.marko` files are componen
4
4
 
5
5
  ## Golden rules
6
6
 
7
- 1. Text interpolation: `${expr}` inside tag bodies. A bare line like `Welcome aboard` at the root of the template parses as a TAG named `Welcome` (concise mode) and fails to compile. Wrap it in an element (`<p>Welcome aboard</p>`) or prefix the line with `-- ` to mark it as text (`-- Welcome ${name}` works at the top level). Attributes take raw JS after `=` with NO braces/quotes needed: `<div title=user.name data-n=1 + 1>` (parenthesize if the value contains `>`).
8
- 2. State: `<let/name=initial>` (slash then var name!). Update by plain assignment in an event handler: `count++`, `text = "hi"`. No setState, no hooks.
9
- 3. Derived values: `<const/total=items.length * price>` auto-recomputes. Never use an effect to derive state. Updates batch: mid-handler a reassigned `<let>` reads current but its derived `<const>` reads stale — recompute from the `<let>`.
10
- 4. NEVER mutate state in place. `items.push(x)` will NOT update the UI. Always reassign:
7
+ 1. Text interpolation: `${expr}` inside tag bodies. A bare line at the template root parses as a TAG (concise mode): `Welcome aboard` fails to compile, but `p is a tag` compiles SILENTLY to `<p is a tag></p>` any line starting with a real tag name loses its words to attributes. Wrap text in an element (`<p>Welcome aboard</p>`) or prefix the line with `--` and a space (`-- Welcome ${name}`). Attributes take raw JS after `=` with NO braces/quotes: `<div title=user.name data-n=1 + 1>`.
8
+ 2. A top-level `>` in an attribute value **ENDS THE TAG**: the value truncates there, the rest of the line becomes body text, and it usually still compiles clean. `<button disabled=count>=8 onClick() {…}>More</button>` is `disabled=count` plus the TEXT `=8 onClick() {…}>`, so the handler never binds; spaces don't help (`disabled=a > b` closes too). Parenthesize the value — `disabled=(count >= 8)`, `hidden=(a > b)`, and for a TS type argument `<let/s=(new Set<string>())>`. Do NOT move the type onto the tag variable instead: `<let/s:Set<string>=new Set()>` compiles but fails type-check with TS2322 (the annotation does not flow into the initializer). A `>` nested inside `(…)`/`{…}`/`[…]` is safe (`class={ big: n > 1 }`, `of=list.filter(x => x > 1)`), but an arrow BODY is not nested: `<const/f=(a, b) => a > b>` truncates to `(a, b) => a`. `<` never closes a tag (`disabled=count<=1` is fine).
9
+ 3. State: `<let/name=initial>` (slash then var name!). Update by plain assignment in an event handler: `count++`, `text = "hi"`. No setState, no hooks.
10
+ 4. Derived values: `<const/total=items.length * price>` — auto-recomputes. Never use an effect to derive state. `<let>` is deliberately different: its value is an INITIAL value, so `<let/draft=input.text>` seeds from a reactive value and then de-syncs — that de-sync is the point of an editable copy. So pick by intent: recomputes → `<const>`, seeds then diverges → `<let>`. A `<let>` you never assign is just a frozen `<const>`. Updates batch: mid-handler a reassigned `<let>` reads current but its derived `<const>` reads stale — recompute from the `<let>`.
11
+ 5. NEVER mutate state in place. `items.push(x)` will NOT update the UI. Always reassign:
11
12
  - add: `items = items.concat(x)`
12
13
  - remove: `items = items.toSpliced(i, 1)`
13
14
  - update: `items = items.toSpliced(i, 1, { ...item, done: true })`
14
15
  - object: `user = { ...user, name }`
15
- 5. Events: method shorthand `onClick() { ... }` or `onClick=fn`. Handler gets the DOM event: `onSubmit(e) { e.preventDefault(); save() }`. Don't sync input values through `onInput`/`onChange` listeners — that's what change handlers (next rule) are for, and they make the data's owner explicit.
16
- 6. Native inputs are UNCONTROLLED by default: `value=` only sets the initial value. Adding the matching `*Change` handler is what makes them controlled — `valueChange` on `<input>`/`<textarea>`/`<select>`, `checkedChange` on checkboxes/radios, `openChange` on `<details>`/`<dialog>`. `value:=text` is the shorthand for `value=text valueChange(v) { text = v }`. (`<textarea value:=text/>` — value attribute, not body.)
17
- 7. Transform in the handler when needed — number inputs give STRINGS: `<input type="number" value=n valueChange(v) { n = +v }>`, or `value:parseFloat:=n`.
18
- 8. Radio/checkbox groups: `checkedValue:=picked` on each input (shared var, distinct `value=`) — the match is checked; array var for multi-checkbox. Dropdown: `<select value:=picked>`.
16
+ 6. Events: method shorthand `onClick() { ... }` or `onClick=fn`. Handler gets the DOM event: `onSubmit(e) { e.preventDefault(); save() }`. Don't sync input values through `onInput`/`onChange` — that's what the change handlers below are for.
17
+ 7. Native inputs are UNCONTROLLED by default: `value=` only sets the initial value. Adding the matching `*Change` handler is what makes them controlled — `valueChange` on `<input>`/`<textarea>`/`<select>`, `checkedChange` on checkboxes/radios, `openChange` on `<details>`/`<dialog>`. `value:=text` is the shorthand for `value=text valueChange(v) { text = v }`. (`<textarea value:=text/>` — value attribute, not body.)
18
+ 8. Transform in the handler when needed — number inputs give STRINGS: `<input type="number" value=n valueChange(v) { n = +v }>`, or `value:parseFloat:=n`.
19
+ 9. Radio/checkbox groups: `checkedValue:=picked` on each input (shared var, distinct `value=`) — the match is checked; array var for multi-checkbox. Dropdown: `<select value:=picked>`.
20
+ 10. Module-level values and helpers need `static`: `static const LIMIT = 10`, `static function fmt(n) {…}`. Without it `function fmt(n) {` parses as a TAG — ``Unable to find entry point for custom tag `<function>` ``, an error that never says `static`. Prefer it to `<const>` for anything that never changes: `<const/LIMIT=10>` emits a per-instance signal plus a `$setup` call.
19
21
 
20
22
  ## Canonical component (copy this shape)
21
23
 
@@ -61,7 +63,7 @@ Marko 6 = HTML superset. NOT JSX, NOT old Marko 4/5. `.marko` files are componen
61
63
  <else> C </else>
62
64
 
63
65
  <for|item, index| of=list by="id"> ${item.name} </for> // by keys the loop (no key= attr!)
64
- <for|city| of=cities by=(city) => city> ${city} </for> // primitives: by takes a FUNCTION — by=city would be an undefined variable (the loop param is not in scope in by=)
66
+ <for|city| of=cities by=(city) => city> ${city} </for> // primitives: by takes a FUNCTION — the loop param is not in scope in by=, so by=city is an undefined variable
65
67
  <for|i| from=0 until=5> ${i} </for> // 0..4
66
68
 
67
69
  <show=open> stays mounted, keeps state (form drafts) when hidden </show>
@@ -84,14 +86,29 @@ import { getUser } from "../data.js";
84
86
  </try>
85
87
  ```
86
88
 
87
- `@placeholder`/`@catch` go on `<try>`, never on `<await>`. On the server this streams (placeholder flushes first, content follows). It works in the browser too: hand `<await>` a new promise (e.g. a `<const>` derived from state) and it shows the placeholder again, then the new result. `@catch` can't recover in place usually it redirects (a `<script>` setting `location`) for a full reload, otherwise re-render the `<try>` (bump a key on a wrapping `<for>`).
89
+ `@placeholder`/`@catch` go on `<try>`, never on `<await>`. On the server this streams (placeholder flushes first, content follows). It works in the browser too: hand `<await>` a new promise (e.g. a `<const>` derived from state) and it shows the placeholder again, then the new result. `@catch` can't recover in place: redirect (a `<script>` setting `location`), or re-render the `<try>` by bumping a key on a wrapping `<for>`.
88
90
 
89
91
  Don't fetch while rendering: start data loads early, pass the PROMISE through the template, and `<await>` it where the data is rendered. Fetching inside each component that renders the data serializes the requests (waterfalls). Under @marko/run, load in the route handler — `return next({ user: getUser() })`, no await — and render with `<await|user|=$global.data.user>`.
90
92
 
91
93
  ## Components
92
94
 
93
95
  - File `src/tags/product-card.marko` is auto-discovered as `<product-card>` from any template (no import needed). Attributes arrive as `input`: `${input.title}`.
94
- - Body content passed by the parent renders with `<${input.content}/>`.
96
+ - Body content renders where the child places `<${input.content}/>`, and the child can hand it values — `<${input.content}(x, y)/>` in the child, `<my-tag|count, total|>${count}</my-tag>` in the parent. Placement is the child's: put it inside a `<for>` and the body appears once per item, each with its own values (`<for|...args| to=input.to><${input.content}(...args)/></>`). Those values exist ONLY inside that body.
97
+ - `<return=value>` publishes ONE value into the PARENT's scope, named by a tag variable; from there it is an ordinary value in that template. A native tag variable's value is itself a function returning the element, so `<div/el>` is read as `el()`. So: body parameters when the value belongs to the nested markup, including one set per item where the child loops; a tag variable when the parent needs one value outside the body. A tag var on a child that never returns is `undefined`.
98
+
99
+ ```marko
100
+ /* src/tags/toggle-section.marko */
101
+ <let/open=input.startExpanded ?? false>
102
+ <button onClick() { open = !open }>${input.title}</button>
103
+ <if=open><div><${input.content}/></div></if>
104
+ <return=open>
105
+
106
+ /* parent */
107
+ <toggle-section/aOpen title="A" startExpanded=true>one</toggle-section>
108
+ <toggle-section/bOpen title="B">two</toggle-section>
109
+ <const/openCount=(aOpen ? 1 : 0) + (bOpen ? 1 : 0)> // recomputes on every toggle
110
+ ```
111
+
95
112
  - Named sections use attribute tags:
96
113
 
97
114
  ```marko
@@ -115,9 +132,9 @@ Don't fetch while rendering: start data loads early, pass the PROMISE through th
115
132
 
116
133
  ## Sharing data (`$global`)
117
134
 
118
- - No provider/consumer context API. Prop-drill through `input`, or read request-scoped `$global` from any template with no threading: `${$global.messages.title}`.
135
+ - Read request-scoped `$global` from any template, no threading: `${$global.messages.title}`. Otherwise prop-drill through `input` — there is no provider/consumer context API.
119
136
  - Populate at the render call: `template.render({ $global: { messages } })`. Under @marko/run a middleware's `return next({ messages })` merges into `$global.data`.
120
- - `$global` is NOT serialized by default, so client-reactive reads (`<const>`, `<let>` init, handlers) throw after resume even though SSR looked fine. Allow-list first: `$global.serializedGlobals = { messages: true }` (@marko/run ships only `params`/`url`; add `context.serializedGlobals.data = true`). SSR-only markup needs no opt-in.
137
+ - `$global` is NOT serialized to the client by default. Mark any key the BROWSER itself evaluates — an event handler, a `<script>`, markup the browser (re)creates, a `<const>` that recomputes from state: `$global.serializedGlobals = { messages: true }` at the render call (under @marko/run, `context.serializedGlobals.data = true`; it ships `params`/`url` already). What the server already rendered needs no opt-in.
121
138
 
122
139
  ## Client-side effects (rare — prefer state/const)
123
140
 
@@ -125,7 +142,7 @@ Don't fetch while rendering: start data loads early, pass the PROMISE through th
125
142
  <div/el/>
126
143
  <script>
127
144
  // Browser-only. Runs after mount and re-runs when referenced state changes.
128
- el().focus(); // element refs are getter FUNCTIONS
145
+ el().focus(); // NATIVE element refs are getter FUNCTIONS
129
146
  const id = setInterval(tick, 1000);
130
147
  $signal.onabort = () => clearInterval(id); // cleanup
131
148
  </script>
@@ -173,28 +190,32 @@ export interface Input<T> {
173
190
 
174
191
  | Wrong (React/Vue/Marko5 habit) | Right |
175
192
  | ----------------------------------------------------------- | ------------------------------------------------------------------------------------ |
193
+ | `disabled=n>=8` / `hidden=a > b` (top-level `>` in a value) | `disabled=(n >= 8)` — a bare `>` closes the tag; the rest of the line becomes text |
194
+ | `<let/s=new Set<string>()>` (type argument in a value) | `<let/s=(new Set<string>())>` — a tag-var annotation fails type-check |
176
195
  | `{expr}` in markup, `className`, `key=`, `style={{...}}` | `${expr}`, `class`, `by=` on `<for>`, `style={...}` |
177
196
  | `onClick={() => ...}` / `@click` / `on-click("name")` | `onClick() { ... }` |
178
197
  | `const [x, setX] = useState()` / `state` / `class {}` block | `<let/x=0>` then `x = 1` |
179
198
  | `$ const y = x * 2;` (scriptlets are removed) | `<const/y=x * 2>` |
199
+ | `<let/n=a + b>` when you want it to recompute | `<const/n=a + b>` — `<let>` seeds an initial value, then de-syncs by design |
200
+ | `function fmt(n) {…}` / `const LIMIT = 10` at module level | `static function fmt(n) {…}` / `static const LIMIT = 10` |
180
201
  | `<let x=0>` | `<let/x=0>` |
181
202
  | `<if(cond)>` | `<if=cond>` |
182
203
  | `items.push(x)` | `items = items.concat(x)` |
183
- | `input.renderBody` | `input.content` |
204
+ | `input.renderBody` (renders nothing, no error) | `input.content` |
184
205
  | `<await>` with `@placeholder`/`@catch` | wrap in `<try>` |
185
206
  | `el.focus()` on a ref | `el().focus()` inside `<script>`/handler |
186
207
  | `input.tab[0]` / `input.tab.length` | `[...input.tab ?? []]` first (attr tags are iterables, not arrays) |
187
- | bare text on its own line at template root | wrap in an element (`<p>...`), or prefix the line with `-- ` |
208
+ | bare text on its own line at template root | wrap in an element (`<p>...`), or prefix the line with `--` and a space |
188
209
  | `by=item` using the loop variable | `by="propName"` or `by=(item) => key` — `by=` is evaluated outside the loop |
189
210
  | `onInput(e) { q = e.target.value }` to sync an input | `value:=q` — the change handler owns the value |
190
211
  | fetching inside the component that renders the data | start the promise early (route handler / top of template), pass it down to `<await>` |
191
212
  | `style={ backgroundColor: c }` (camelCase keys) | `style={ "background-color": c }` (kebab-case) |
192
213
  | `this.querySelector` / `this.getRootNode()` in `<script>` | element ref getter: `<div/el>` then `el()` (there is no `this`) |
193
- | `<div/my-el>` / `<input/card-input>` (hyphen in tag var) | valid JS identifier: `<div/myEl>` |
214
+ | `<div/my-el>` / `<input/card-input>` (hyphen in tag var) | valid JS identifier: `<div/myEl>` (the error won't name the hyphen) |
194
215
  | hand-rolled radios `checked=x checkedChange(v){…}` | `checkedValue:=picked` on each radio (shared var, distinct `value=`) |
195
216
  | hand-rolled `IntersectionObserver` to defer a widget's JS | `import W from "<w>" with { load: "visible#sel" }` |
196
217
  | imperative lib wired through `<script>` mount + cleanup | `<lifecycle onMount/onUpdate/onDestroy>` (keeps `this` across all three) |
197
218
  | `createContext`/provider to share data | `input` (prop drilling) or request-scoped `$global` |
198
- | `$global.x` in client-reactive code, not allow-listed | `$global.serializedGlobals = { x: true }` first, or it throws after resume |
219
+ | `$global.x` in client-reactive code, not allow-listed | `$global.serializedGlobals = { x: true }` first otherwise the read is `undefined` |
199
220
  | hand-namespaced global classes (`.my-card-title`) | `<style/styles>` + `class=styles.card` (scoped CSS modules) |
200
221
  | `tsc --noEmit` to type check templates | `mtc` — `tsc` skips `.marko` files and exits 0 |
@@ -13,3 +13,5 @@ export declare function isNotVoid(value: unknown): boolean;
13
13
  export declare function isPromise(value: unknown): value is Promise<unknown>;
14
14
  export declare function normalizeDynamicRenderer<Renderer>(value: any): Renderer | string | undefined;
15
15
  export declare const decodeAccessor: (num: number) => string;
16
+ export declare let branchesEnabled: undefined | 1;
17
+ export declare function withBranches<T>(runtime?: T): T;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ const require_control_flow = require("../dom-CiFITSPN.js");
3
+ //#region src/dom/catch.feat.ts
4
+ const handlePendingTry = (fn, scope, branch) => {
5
+ while (branch) {
6
+ if (branch["#AwaitCounter"]?.i) return (branch[require_control_flow.PendingEffects] ||= []).push(fn, scope);
7
+ branch = branch[require_control_flow.ParentBranch];
8
+ }
9
+ };
10
+ require_control_flow.installCatch((runEffects) => (effects, checkPending = require_control_flow.placeholderShown.has(effects)) => {
11
+ if (checkPending || require_control_flow.caughtError.has(effects)) {
12
+ let i = 0;
13
+ let fn;
14
+ let scope;
15
+ let branch;
16
+ for (; i < effects.length;) {
17
+ fn = effects[i++];
18
+ scope = effects[i++];
19
+ if ((branch = scope["#ClosestBranch"])?.["#Gen"] !== 0 && !(checkPending && handlePendingTry(fn, scope, branch))) fn(scope);
20
+ }
21
+ } else runEffects(effects);
22
+ }, (runRender) => (render) => {
23
+ try {
24
+ let branch = render[require_control_flow.Scope][require_control_flow.ClosestBranch];
25
+ while (branch) {
26
+ if (branch["#PendingRenders"]) {
27
+ render[require_control_flow.Pending] = 1;
28
+ return branch[require_control_flow.PendingRenders].push(render);
29
+ }
30
+ branch = branch[require_control_flow.ParentBranch];
31
+ }
32
+ render[require_control_flow.Pending] = 0;
33
+ runRender(render);
34
+ } catch (error) {
35
+ require_control_flow.renderCatch(render[require_control_flow.Scope], error);
36
+ }
37
+ });
38
+ //#endregion
@@ -0,0 +1,37 @@
1
+ import { Cn as PendingRenders, Jt as caughtError, Sn as PendingEffects, Xt as placeholderShown, Yt as installCatch, gn as ClosestBranch, h as renderCatch, mn as Scope, pn as Pending, xn as ParentBranch } from "../dom-BJ93mcSe.mjs";
2
+ //#region src/dom/catch.feat.ts
3
+ const handlePendingTry = (fn, scope, branch) => {
4
+ while (branch) {
5
+ if (branch["#AwaitCounter"]?.i) return (branch[PendingEffects] ||= []).push(fn, scope);
6
+ branch = branch[ParentBranch];
7
+ }
8
+ };
9
+ installCatch((runEffects) => (effects, checkPending = placeholderShown.has(effects)) => {
10
+ if (checkPending || caughtError.has(effects)) {
11
+ let i = 0;
12
+ let fn;
13
+ let scope;
14
+ let branch;
15
+ for (; i < effects.length;) {
16
+ fn = effects[i++];
17
+ scope = effects[i++];
18
+ if ((branch = scope["#ClosestBranch"])?.["#Gen"] !== 0 && !(checkPending && handlePendingTry(fn, scope, branch))) fn(scope);
19
+ }
20
+ } else runEffects(effects);
21
+ }, (runRender) => (render) => {
22
+ try {
23
+ let branch = render[Scope][ClosestBranch];
24
+ while (branch) {
25
+ if (branch["#PendingRenders"]) {
26
+ render[Pending] = 1;
27
+ return branch[PendingRenders].push(render);
28
+ }
29
+ branch = branch[ParentBranch];
30
+ }
31
+ render[Pending] = 0;
32
+ runRender(render);
33
+ } catch (error) {
34
+ renderCatch(render[Scope], error);
35
+ }
36
+ });
37
+ //#endregion
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ const require_control_flow = require("../dom-CiFITSPN.js");
3
+ //#region src/dom/controllable-input.feat.ts
4
+ require_control_flow.controllableScripts[0] = require_control_flow._attr_input_checked_script;
5
+ require_control_flow.controllableScripts[1] = require_control_flow._attr_input_checkedValue_script;
6
+ require_control_flow.controllableScripts[2] = require_control_flow._attr_input_value_script;
7
+ //#endregion
@@ -0,0 +1,6 @@
1
+ import { R as controllableScripts, S as _attr_input_checkedValue_script, k as _attr_input_value_script, w as _attr_input_checked_script } from "../dom-BJ93mcSe.mjs";
2
+ //#region src/dom/controllable-input.feat.ts
3
+ controllableScripts[0] = _attr_input_checked_script;
4
+ controllableScripts[1] = _attr_input_checkedValue_script;
5
+ controllableScripts[2] = _attr_input_value_script;
6
+ //#endregion
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ const require_control_flow = require("../dom-CiFITSPN.js");
3
+ //#region src/dom/controllable-open.feat.ts
4
+ require_control_flow.controllableScripts[4] = require_control_flow._attr_details_or_dialog_open_script;
5
+ //#endregion
@@ -0,0 +1,4 @@
1
+ import { R as controllableScripts, v as _attr_details_or_dialog_open_script } from "../dom-BJ93mcSe.mjs";
2
+ //#region src/dom/controllable-open.feat.ts
3
+ controllableScripts[4] = _attr_details_or_dialog_open_script;
4
+ //#endregion
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ const require_control_flow = require("../dom-CiFITSPN.js");
3
+ //#region src/dom/controllable-select.feat.ts
4
+ require_control_flow.controllableScripts[3] = require_control_flow._attr_select_value_script;
5
+ //#endregion
@@ -0,0 +1,4 @@
1
+ import { M as _attr_select_value_script, R as controllableScripts } from "../dom-BJ93mcSe.mjs";
2
+ //#region src/dom/controllable-select.feat.ts
3
+ controllableScripts[3] = _attr_select_value_script;
4
+ //#endregion
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ const require_control_flow = require("../dom-CiFITSPN.js");
3
+ //#region src/dom/controllable-textarea.feat.ts
4
+ require_control_flow.controllableScripts[2] = require_control_flow._attr_input_value_script;
5
+ //#endregion
@@ -0,0 +1,4 @@
1
+ import { R as controllableScripts, k as _attr_input_value_script } from "../dom-BJ93mcSe.mjs";
2
+ //#region src/dom/controllable-textarea.feat.ts
3
+ controllableScripts[2] = _attr_input_value_script;
4
+ //#endregion
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ const require_control_flow = require("../dom-CiFITSPN.js");
3
+ require("./controllable-input.feat.js");
4
+ require("./controllable-open.feat.js");
5
+ require("./controllable-select.feat.js");
6
+ //#region src/dom/controllable.feat.ts
7
+ require_control_flow.controllableRenders.INPUT = require_control_flow._controllable_input;
8
+ require_control_flow.controllableRenders.TEXTAREA = require_control_flow._controllable_textarea;
9
+ require_control_flow.controllableRenders.SELECT = require_control_flow._controllable_select;
10
+ require_control_flow.controllableRenders.DETAILS = require_control_flow.controllableRenders.DIALOG = require_control_flow._controllable_open;
11
+ //#endregion
@@ -0,0 +1,10 @@
1
+ import { F as _controllable_select, I as _controllable_textarea, L as controllableRenders, N as _controllable_input, P as _controllable_open } from "../dom-BJ93mcSe.mjs";
2
+ import "./controllable-input.feat.mjs";
3
+ import "./controllable-open.feat.mjs";
4
+ import "./controllable-select.feat.mjs";
5
+ //#region src/dom/controllable.feat.ts
6
+ controllableRenders.INPUT = _controllable_input;
7
+ controllableRenders.TEXTAREA = _controllable_textarea;
8
+ controllableRenders.SELECT = _controllable_select;
9
+ controllableRenders.DETAILS = controllableRenders.DIALOG = _controllable_open;
10
+ //#endregion