rip-lang 3.13.107 → 3.13.109
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/CHANGELOG.md +6 -0
- package/README.md +2 -2
- package/docs/RIP-LANG.md +9 -9
- package/docs/dist/rip.js +207 -26
- package/docs/dist/rip.min.js +133 -133
- package/docs/dist/rip.min.js.br +0 -0
- package/package.json +4 -1
- package/src/components.js +102 -5
- package/src/lexer.js +10 -10
- package/src/sourcemap-utils.js +33 -3
- package/src/typecheck.js +141 -34
- package/src/types.js +28 -13
- package/src/ui.rip +59 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,12 @@ All notable changes to Rip will be documented in this file.
|
|
|
7
7
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
8
8
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
9
9
|
|
|
10
|
+
## [Unreleased]
|
|
11
|
+
|
|
12
|
+
### Breaking — Merge Assign Operator
|
|
13
|
+
|
|
14
|
+
- **`*>` replaces `*` for merge assignment** — The merge-assign form is now `*>target = value` (including `*>@ = props`). The old `*target = value` form is removed.
|
|
15
|
+
|
|
10
16
|
## [3.13.16] - 2026-02-25
|
|
11
17
|
|
|
12
18
|
### Breaking — Merge `@rip-lang/api` into `@rip-lang/server`
|
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
</p>
|
|
10
10
|
|
|
11
11
|
<p align="center">
|
|
12
|
-
<a href="CHANGELOG.md"><img src="https://img.shields.io/badge/version-3.13.
|
|
12
|
+
<a href="CHANGELOG.md"><img src="https://img.shields.io/badge/version-3.13.109-blue.svg" alt="Version"></a>
|
|
13
13
|
<a href="#zero-dependencies"><img src="https://img.shields.io/badge/dependencies-ZERO-brightgreen.svg" alt="Dependencies"></a>
|
|
14
14
|
<a href="#"><img src="https://img.shields.io/badge/tests-1%2C436%2F1%2C436-brightgreen.svg" alt="Tests"></a>
|
|
15
15
|
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-green.svg" alt="License"></a>
|
|
@@ -229,7 +229,7 @@ All use `globalThis` with `??=` — override any by redeclaring locally.
|
|
|
229
229
|
| `not in` | `x not in arr` | Negated membership test |
|
|
230
230
|
| `not of` | `k not of obj` | Negated key existence |
|
|
231
231
|
| `.=` (method assign) | `x .= trim()` | `x = x.trim()` — compound method assignment |
|
|
232
|
-
|
|
|
232
|
+
| `*>` (merge assign) | `*>obj = {a: 1}` | `Object.assign(obj, {a: 1})` |
|
|
233
233
|
| `or return` | `x = get() or return err` | Guard clause (Ruby-style) |
|
|
234
234
|
| `?? throw` | `x = get() ?? throw err` | Nullish guard |
|
|
235
235
|
|
package/docs/RIP-LANG.md
CHANGED
|
@@ -326,7 +326,7 @@ Multiple lines
|
|
|
326
326
|
| `<` `<=` | Chained comparison | `1 < x < 10` | `(1 < x) && (x < 10)` |
|
|
327
327
|
| `\|>` | Pipe | `x \|> fn` or `x \|> fn(y)` | `fn(x)` or `fn(x, y)` |
|
|
328
328
|
| `.=` | Method assign | `x .= trim()` | `x = x.trim()` |
|
|
329
|
-
|
|
|
329
|
+
| `*>` | Merge assign | `*>obj = {a: 1}` | `Object.assign(obj, {a: 1})` |
|
|
330
330
|
| `not in` | Not in | `x not in arr` | Negated membership test |
|
|
331
331
|
| `not of` | Not of | `k not of obj` | Negated key existence |
|
|
332
332
|
| `<=>` | Two-way bind | `value <=> name` | Bidirectional reactive binding (render blocks) |
|
|
@@ -535,37 +535,37 @@ str.=trim() # compact (no spaces)
|
|
|
535
535
|
str .=trim() # mixed
|
|
536
536
|
```
|
|
537
537
|
|
|
538
|
-
## Merge Assignment (
|
|
538
|
+
## Merge Assignment (`*>`)
|
|
539
539
|
|
|
540
540
|
A Rip original. Merge properties into an existing object without repeating
|
|
541
541
|
its name:
|
|
542
542
|
|
|
543
543
|
```coffee
|
|
544
|
-
# Without
|
|
544
|
+
# Without *> — repeat the object name or use verbose Object.assign
|
|
545
545
|
Object.assign config,
|
|
546
546
|
host: "localhost"
|
|
547
547
|
port: 3000
|
|
548
548
|
debug: true
|
|
549
549
|
|
|
550
|
-
# With
|
|
551
|
-
|
|
550
|
+
# With *> — clean and direct
|
|
551
|
+
*>config =
|
|
552
552
|
host: "localhost"
|
|
553
553
|
port: 3000
|
|
554
554
|
debug: true
|
|
555
555
|
|
|
556
556
|
# Single line
|
|
557
|
-
|
|
557
|
+
*>opts = {method: "POST", body: data}
|
|
558
558
|
|
|
559
559
|
# Dotted paths
|
|
560
|
-
|
|
560
|
+
*>el.style =
|
|
561
561
|
color: "red"
|
|
562
562
|
fontSize: "14px"
|
|
563
563
|
|
|
564
564
|
# Merge user overrides into defaults
|
|
565
|
-
|
|
565
|
+
*>defaults = userConfig
|
|
566
566
|
```
|
|
567
567
|
|
|
568
|
-
|
|
568
|
+
`*>target = value` compiles to `Object.assign(target, value)`. The `*>` reads
|
|
569
569
|
as "spread these into" — the same concept as `...` spread but as an
|
|
570
570
|
assignment. This is unique to Rip.
|
|
571
571
|
|
package/docs/dist/rip.js
CHANGED
|
@@ -314,12 +314,13 @@
|
|
|
314
314
|
j++;
|
|
315
315
|
continue;
|
|
316
316
|
}
|
|
317
|
-
|
|
317
|
+
let isProperty = t[0] === "PROPERTY" || t[0] === "IDENTIFIER" || depth === 1 && /^[a-zA-Z_$]/.test(t[1]) && tokens[j + 1]?.[0] === "TYPE_ANNOTATION";
|
|
318
|
+
if (depth === 1 && isProperty) {
|
|
318
319
|
let propName = t[1];
|
|
319
320
|
let optional = false;
|
|
320
321
|
let readonly = false;
|
|
321
322
|
j++;
|
|
322
|
-
if (propName === "readonly" && (tokens[j]
|
|
323
|
+
if (propName === "readonly" && tokens[j] && (tokens[j][0] === "PROPERTY" || tokens[j][0] === "IDENTIFIER" || /^[a-zA-Z_$]/.test(tokens[j][1]) && tokens[j + 1]?.[0] === "TYPE_ANNOTATION")) {
|
|
323
324
|
readonly = true;
|
|
324
325
|
propName = tokens[j][1];
|
|
325
326
|
if (tokens[j].data?.predicate)
|
|
@@ -452,15 +453,29 @@
|
|
|
452
453
|
}
|
|
453
454
|
let emitBlock = (prefix, body, suffix) => {
|
|
454
455
|
if (body.startsWith("{ ") && body.endsWith(" }")) {
|
|
455
|
-
let
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
456
|
+
let depth = 0, firstTopClose = -1;
|
|
457
|
+
for (let c = 0;c < body.length; c++) {
|
|
458
|
+
if (body[c] === "{")
|
|
459
|
+
depth++;
|
|
460
|
+
else if (body[c] === "}") {
|
|
461
|
+
depth--;
|
|
462
|
+
if (depth === 0) {
|
|
463
|
+
firstTopClose = c;
|
|
464
|
+
break;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
if (firstTopClose === body.length - 1) {
|
|
469
|
+
let props = body.slice(2, -2).split("; ").filter((p) => p.trim());
|
|
470
|
+
if (props.length > 0) {
|
|
471
|
+
lines.push(`${indent()}${prefix}{`);
|
|
472
|
+
indentLevel++;
|
|
473
|
+
for (let prop of props)
|
|
474
|
+
lines.push(`${indent()}${prop};`);
|
|
475
|
+
indentLevel--;
|
|
476
|
+
lines.push(`${indent()}}${suffix}`);
|
|
477
|
+
return;
|
|
478
|
+
}
|
|
464
479
|
}
|
|
465
480
|
}
|
|
466
481
|
lines.push(`${indent()}${prefix}${body}${suffix}`);
|
|
@@ -1020,7 +1035,7 @@
|
|
|
1020
1035
|
let preamble = [];
|
|
1021
1036
|
if (usesSignal) {
|
|
1022
1037
|
preamble.push("interface Signal<T> { value: T; read(): T; lock(): Signal<T>; free(): Signal<T>; kill(): T; }");
|
|
1023
|
-
preamble.push("declare function __state<T>(value: T): Signal<T>;");
|
|
1038
|
+
preamble.push("declare function __state<T>(value: T | Signal<T>): Signal<T>;");
|
|
1024
1039
|
}
|
|
1025
1040
|
if (usesComputed) {
|
|
1026
1041
|
preamble.push("interface Computed<T> { readonly value: T; read(): T; lock(): Computed<T>; free(): Computed<T>; kill(): T; }");
|
|
@@ -1145,6 +1160,9 @@
|
|
|
1145
1160
|
if (!hasDefault)
|
|
1146
1161
|
hasRequired = true;
|
|
1147
1162
|
publicProps.push(` ${propName}${opt}: ${typeStr};`);
|
|
1163
|
+
if (mHead === "state") {
|
|
1164
|
+
publicProps.push(` __bind_${propName}__?: Signal<${typeStr}>;`);
|
|
1165
|
+
}
|
|
1148
1166
|
}
|
|
1149
1167
|
lines.push(`${exp}declare class ${name} {`);
|
|
1150
1168
|
if (publicProps.length > 0) {
|
|
@@ -1461,7 +1479,7 @@
|
|
|
1461
1479
|
var UNARY_MATH = new Set(["!", "~"]);
|
|
1462
1480
|
var IDENTIFIER_RE = /^(?!\d)((?:(?!\s)[$\w\x7f-\uffff])+(?:!(?!\?)|[?](?![.?![(]))?)([^\n\S]*:(?![=:>]))?/;
|
|
1463
1481
|
var NUMBER_RE = /^0b[01](?:_?[01])*n?|^0o[0-7](?:_?[0-7])*n?|^0x[\da-f](?:_?[\da-f])*n?|^\d+(?:_\d+)*n|^(?:\d+(?:_\d+)*)?\.?\d+(?:_\d+)*(?:e[+-]?\d+(?:_\d+)*)?/i;
|
|
1464
|
-
var OPERATOR_RE = /^(
|
|
1482
|
+
var OPERATOR_RE = /^(?:<=>|::|\*>|[-=]>|~>|~=|:>|:=|=!|===|!==|!\?|\?\!|\?\?|=~|\|>|[-+*\/%<>&|^!?=]=|>>>=?|([-+:])\1|([&|<>*\/%])\2=?|\?\.?|\.{2,3})/;
|
|
1465
1483
|
var WHITESPACE_RE = /^[^\n\S]+/;
|
|
1466
1484
|
var NEWLINE_RE = /^(?:\n[^\n\S]*)+/;
|
|
1467
1485
|
var COMMENT_RE = /^(\s*)###([^#][\s\S]*?)(?:###([^\n\S]*)|###$)|^((?:\s*#(?!##[^#]).*)+)/;
|
|
@@ -2241,9 +2259,10 @@
|
|
|
2241
2259
|
this.emit("PROPERTY", "prototype");
|
|
2242
2260
|
this.emit(".", ".");
|
|
2243
2261
|
return 2;
|
|
2244
|
-
} else if (val === "::")
|
|
2262
|
+
} else if (val === "::") {
|
|
2245
2263
|
tag = "TYPE_ANNOTATION";
|
|
2246
|
-
|
|
2264
|
+
this.inTypeAnnotation = true;
|
|
2265
|
+
} else if (val === "~=")
|
|
2247
2266
|
tag = "COMPUTED_ASSIGN";
|
|
2248
2267
|
else if (val === ":=")
|
|
2249
2268
|
tag = "REACTIVE_ASSIGN";
|
|
@@ -2257,8 +2276,8 @@
|
|
|
2257
2276
|
} else if (val === "=!") {
|
|
2258
2277
|
tag = "READONLY_ASSIGN";
|
|
2259
2278
|
this.inTypeAnnotation = false;
|
|
2260
|
-
} else if (val === "
|
|
2261
|
-
let rest = this.chunk.slice(
|
|
2279
|
+
} else if (val === "*>" && (!prev || prev[0] === "TERMINATOR" || prev[0] === "INDENT" || prev[0] === "OUTDENT") && (/^[a-zA-Z_$]/.test(this.chunk[2] || "") || this.chunk[2] === "@")) {
|
|
2280
|
+
let rest = this.chunk.slice(2);
|
|
2262
2281
|
let mAt = /^@(\s*)=(?!=)/.exec(rest);
|
|
2263
2282
|
if (mAt) {
|
|
2264
2283
|
let space = mAt[1];
|
|
@@ -2268,7 +2287,7 @@
|
|
|
2268
2287
|
t.spaced = true;
|
|
2269
2288
|
this.emit("@", "@");
|
|
2270
2289
|
this.emit(",", ",");
|
|
2271
|
-
return
|
|
2290
|
+
return 2 + 1 + space.length + 1;
|
|
2272
2291
|
}
|
|
2273
2292
|
let m = /^((?:(?!\s)[$\w\x7f-\uffff])+(?:\.[a-zA-Z_$][\w]*)*)(\s*)=(?!=)/.exec(rest);
|
|
2274
2293
|
if (m) {
|
|
@@ -2294,7 +2313,7 @@
|
|
|
2294
2313
|
this.emit(",", ",");
|
|
2295
2314
|
let comma = this.prev();
|
|
2296
2315
|
comma.mergeClose = true;
|
|
2297
|
-
return
|
|
2316
|
+
return 2 + target.length + space.length + 1;
|
|
2298
2317
|
}
|
|
2299
2318
|
} else if (val === "*" && prev?.[0] === "EXPORT")
|
|
2300
2319
|
tag = "EXPORT_ALL";
|
|
@@ -4357,6 +4376,7 @@ Expecting ${expected.join(", ")}, got '${this.tokenNames[symbol] || symbol}'`;
|
|
|
4357
4376
|
const ts = expandType(type);
|
|
4358
4377
|
const opt = required ? "" : "?";
|
|
4359
4378
|
propEntries.push(`${name}${opt}: ${ts || "any"}`);
|
|
4379
|
+
propEntries.push(`__bind_${name}__?: Signal<${ts || "any"}>`);
|
|
4360
4380
|
}
|
|
4361
4381
|
for (const { name, type, isPublic } of readonlyVars) {
|
|
4362
4382
|
if (!isPublic)
|
|
@@ -4451,6 +4471,7 @@ Expecting ${expected.join(", ")}, got '${this.tokenNames[symbol] || symbol}'`;
|
|
|
4451
4471
|
}
|
|
4452
4472
|
if (renderBlock) {
|
|
4453
4473
|
const constructions = [];
|
|
4474
|
+
let constructionIdx = 0;
|
|
4454
4475
|
const extractProps = (args) => {
|
|
4455
4476
|
const props = [];
|
|
4456
4477
|
for (const arg of args) {
|
|
@@ -4467,10 +4488,62 @@ Expecting ${expected.join(", ")}, got '${this.tokenNames[symbol] || symbol}'`;
|
|
|
4467
4488
|
}
|
|
4468
4489
|
if (obj) {
|
|
4469
4490
|
for (let j = 1;j < obj.length; j++) {
|
|
4470
|
-
const
|
|
4471
|
-
|
|
4491
|
+
const pair = obj[j];
|
|
4492
|
+
const [key, value] = pair;
|
|
4493
|
+
if (typeof key === "string" && !key.startsWith("@")) {
|
|
4494
|
+
const srcLine = pair.loc?.r ?? obj.loc?.r;
|
|
4495
|
+
if (key.startsWith("__bind_") && key.endsWith("__")) {
|
|
4496
|
+
const member = typeof value === "string" && this.reactiveMembers?.has(value) ? `this.${value}` : this.generateInComponent(value, "value");
|
|
4497
|
+
props.push({ code: `${key}: ${member}`, srcLine });
|
|
4498
|
+
} else {
|
|
4499
|
+
const val = this.generateInComponent(value, "value");
|
|
4500
|
+
props.push({ code: `${key}: ${val}`, srcLine });
|
|
4501
|
+
}
|
|
4502
|
+
}
|
|
4503
|
+
}
|
|
4504
|
+
}
|
|
4505
|
+
}
|
|
4506
|
+
return props;
|
|
4507
|
+
};
|
|
4508
|
+
const extractIntrinsicProps = (args) => {
|
|
4509
|
+
const props = [];
|
|
4510
|
+
for (const arg of args) {
|
|
4511
|
+
let obj = null;
|
|
4512
|
+
if (this.is(arg, "object")) {
|
|
4513
|
+
obj = arg;
|
|
4514
|
+
} else if (Array.isArray(arg) && (arg[0] === "->" || arg[0] === "=>") && this.is(arg[2], "block")) {
|
|
4515
|
+
for (let k = 1;k < arg[2].length; k++) {
|
|
4516
|
+
if (this.is(arg[2][k], "object")) {
|
|
4517
|
+
obj = arg[2][k];
|
|
4518
|
+
break;
|
|
4519
|
+
}
|
|
4520
|
+
}
|
|
4521
|
+
}
|
|
4522
|
+
if (obj) {
|
|
4523
|
+
for (let j = 1;j < obj.length; j++) {
|
|
4524
|
+
const pair = obj[j];
|
|
4525
|
+
if (!Array.isArray(pair) || pair.length < 2)
|
|
4526
|
+
continue;
|
|
4527
|
+
const [key, value] = pair;
|
|
4528
|
+
const srcLine = pair.loc?.r ?? obj.loc?.r;
|
|
4529
|
+
if (Array.isArray(key) && key[0] === "." && key[1] === "this") {
|
|
4530
|
+
let memberName = typeof key[2] === "string" ? key[2] : key[2]?.valueOf?.();
|
|
4531
|
+
if (!memberName)
|
|
4532
|
+
continue;
|
|
4533
|
+
const eventKey = "@" + memberName.split(".")[0];
|
|
4472
4534
|
const val = this.generateInComponent(value, "value");
|
|
4473
|
-
props.push(
|
|
4535
|
+
props.push({ code: `'${eventKey}': ${val}`, srcLine });
|
|
4536
|
+
} else if (typeof key === "string") {
|
|
4537
|
+
if (key === "key")
|
|
4538
|
+
continue;
|
|
4539
|
+
if (key.startsWith("__bind_") && key.endsWith("__")) {
|
|
4540
|
+
const propName = key.slice(7, -2);
|
|
4541
|
+
const val = this.generateInComponent(value, "value");
|
|
4542
|
+
props.push({ code: `${propName}: ${val}`, srcLine });
|
|
4543
|
+
} else {
|
|
4544
|
+
const val = this.generateInComponent(value, "value");
|
|
4545
|
+
props.push({ code: `${key}: ${val}`, srcLine });
|
|
4546
|
+
}
|
|
4474
4547
|
}
|
|
4475
4548
|
}
|
|
4476
4549
|
}
|
|
@@ -4483,7 +4556,53 @@ Expecting ${expected.join(", ")}, got '${this.tokenNames[symbol] || symbol}'`;
|
|
|
4483
4556
|
const head2 = node[0]?.valueOf?.() ?? node[0];
|
|
4484
4557
|
if (typeof head2 === "string" && /^[A-Z]/.test(head2)) {
|
|
4485
4558
|
const props = extractProps(node.slice(1));
|
|
4486
|
-
|
|
4559
|
+
const varName = `_${constructionIdx++}`;
|
|
4560
|
+
const propsType = `ConstructorParameters<typeof ${head2}>[0] & {}`;
|
|
4561
|
+
if (props.length === 0) {
|
|
4562
|
+
const tagLine = node.loc?.r;
|
|
4563
|
+
constructions.push(` const ${varName}: ${propsType} = {};` + (tagLine != null ? ` // @rip-src:${tagLine}` : ""));
|
|
4564
|
+
} else if (props.length === 1) {
|
|
4565
|
+
const srcLine = node.loc?.r ?? props[0].srcLine;
|
|
4566
|
+
constructions.push(` const ${varName}: ${propsType} = {${props[0].code}};` + (srcLine != null ? ` // @rip-src:${srcLine}` : ""));
|
|
4567
|
+
} else {
|
|
4568
|
+
const tagLine = node.loc?.r;
|
|
4569
|
+
const distinctLines = new Set(props.map((p) => p.srcLine).filter((l) => l != null));
|
|
4570
|
+
if (distinctLines.size <= 1) {
|
|
4571
|
+
const srcLine = props[0].srcLine ?? tagLine;
|
|
4572
|
+
constructions.push(` const ${varName}: ${propsType} = {${props.map((p) => p.code).join(", ")}};` + (srcLine != null ? ` // @rip-src:${srcLine}` : ""));
|
|
4573
|
+
} else {
|
|
4574
|
+
constructions.push(` const ${varName}: ${propsType} = {` + (tagLine != null ? ` // @rip-src:${tagLine}` : ""));
|
|
4575
|
+
for (const p of props) {
|
|
4576
|
+
constructions.push(` ${p.code},` + (p.srcLine != null ? ` // @rip-src:${p.srcLine}` : ""));
|
|
4577
|
+
}
|
|
4578
|
+
constructions.push(` };`);
|
|
4579
|
+
}
|
|
4580
|
+
}
|
|
4581
|
+
} else if (typeof head2 === "string" && head2 !== "object" && head2 !== "switch" && TEMPLATE_TAGS.has(head2.split(/[.#]/)[0])) {
|
|
4582
|
+
const tagName = head2.split(/[.#]/)[0];
|
|
4583
|
+
const iProps = extractIntrinsicProps(node.slice(1));
|
|
4584
|
+
const tagLine = node.loc?.r;
|
|
4585
|
+
const srcMarker = tagLine != null ? ` // @rip-src:${tagLine}` : "";
|
|
4586
|
+
if (iProps.length === 0) {
|
|
4587
|
+
constructions.push(` __ripEl('${tagName}');${srcMarker}`);
|
|
4588
|
+
} else if (iProps.length === 1) {
|
|
4589
|
+
const srcLine = iProps[0].srcLine ?? tagLine;
|
|
4590
|
+
const marker = srcLine != null ? ` // @rip-src:${srcLine}` : "";
|
|
4591
|
+
constructions.push(` __ripEl('${tagName}', {${iProps[0].code}});${marker}`);
|
|
4592
|
+
} else {
|
|
4593
|
+
const distinctLines = new Set(iProps.map((p) => p.srcLine).filter((l) => l != null));
|
|
4594
|
+
if (distinctLines.size <= 1) {
|
|
4595
|
+
const srcLine = iProps[0].srcLine ?? tagLine;
|
|
4596
|
+
const marker = srcLine != null ? ` // @rip-src:${srcLine}` : "";
|
|
4597
|
+
constructions.push(` __ripEl('${tagName}', {${iProps.map((p) => p.code).join(", ")}});${marker}`);
|
|
4598
|
+
} else {
|
|
4599
|
+
constructions.push(` __ripEl('${tagName}', {${srcMarker}`);
|
|
4600
|
+
for (const p of iProps) {
|
|
4601
|
+
constructions.push(` ${p.code},` + (p.srcLine != null ? ` // @rip-src:${p.srcLine}` : ""));
|
|
4602
|
+
}
|
|
4603
|
+
constructions.push(` });`);
|
|
4604
|
+
}
|
|
4605
|
+
}
|
|
4487
4606
|
}
|
|
4488
4607
|
for (let i = 1;i < node.length; i++)
|
|
4489
4608
|
walkRender(node[i]);
|
|
@@ -9353,8 +9472,8 @@ globalThis.zip ??= (...a) => a[0].map((_, i) => a.map(b => b[i]));
|
|
|
9353
9472
|
return new CodeGenerator({}).getComponentRuntime();
|
|
9354
9473
|
}
|
|
9355
9474
|
// src/browser.js
|
|
9356
|
-
var VERSION = "3.13.
|
|
9357
|
-
var BUILD_DATE = "2026-03-
|
|
9475
|
+
var VERSION = "3.13.109";
|
|
9476
|
+
var BUILD_DATE = "2026-03-14@08:22:53GMT";
|
|
9358
9477
|
if (typeof globalThis !== "undefined") {
|
|
9359
9478
|
if (!globalThis.__rip)
|
|
9360
9479
|
new Function(getReactiveRuntime())();
|
|
@@ -9655,6 +9774,8 @@ ${indented}`);
|
|
|
9655
9774
|
var __batch;
|
|
9656
9775
|
var __effect;
|
|
9657
9776
|
var __state;
|
|
9777
|
+
var _ariaBindDialog;
|
|
9778
|
+
var _ariaBindPopover;
|
|
9658
9779
|
var _ariaListNav;
|
|
9659
9780
|
var _ariaLockScroll;
|
|
9660
9781
|
var _ariaModalStack;
|
|
@@ -10828,6 +10949,66 @@ ${indented}`);
|
|
|
10828
10949
|
return window.removeEventListener("scroll", onScroll, true);
|
|
10829
10950
|
};
|
|
10830
10951
|
};
|
|
10952
|
+
_ariaBindPopover = function(open, popover, setOpen, source = null) {
|
|
10953
|
+
let desired, el, get, onToggle, opts, shown, src;
|
|
10954
|
+
get = function(x) {
|
|
10955
|
+
return typeof x === "function" ? x() : x;
|
|
10956
|
+
};
|
|
10957
|
+
el = get(popover);
|
|
10958
|
+
if (!el)
|
|
10959
|
+
return;
|
|
10960
|
+
if (!Object.hasOwn(HTMLElement.prototype, "togglePopover"))
|
|
10961
|
+
return;
|
|
10962
|
+
onToggle = function(e) {
|
|
10963
|
+
return setOpen?.(e.newState === "open");
|
|
10964
|
+
};
|
|
10965
|
+
el.addEventListener("toggle", onToggle);
|
|
10966
|
+
shown = el.matches(":popover-open");
|
|
10967
|
+
desired = !!open;
|
|
10968
|
+
if (shown !== desired) {
|
|
10969
|
+
src = get(source);
|
|
10970
|
+
opts = src && desired ? { force: desired, source: src } : { force: desired };
|
|
10971
|
+
try {
|
|
10972
|
+
el.togglePopover(opts);
|
|
10973
|
+
} catch {}
|
|
10974
|
+
}
|
|
10975
|
+
return function() {
|
|
10976
|
+
return el.removeEventListener("toggle", onToggle);
|
|
10977
|
+
};
|
|
10978
|
+
};
|
|
10979
|
+
_ariaBindDialog = function(open, dialog, setOpen, dismissable = true) {
|
|
10980
|
+
let el, get, onCancel, onClose;
|
|
10981
|
+
get = function(x) {
|
|
10982
|
+
return typeof x === "function" ? x() : x;
|
|
10983
|
+
};
|
|
10984
|
+
el = get(dialog);
|
|
10985
|
+
if (!el?.showModal)
|
|
10986
|
+
return;
|
|
10987
|
+
onCancel = function(e) {
|
|
10988
|
+
if (!dismissable) {
|
|
10989
|
+
e.preventDefault();
|
|
10990
|
+
return;
|
|
10991
|
+
}
|
|
10992
|
+
return setOpen?.(false);
|
|
10993
|
+
};
|
|
10994
|
+
onClose = function() {
|
|
10995
|
+
return setOpen?.(false);
|
|
10996
|
+
};
|
|
10997
|
+
el.addEventListener("cancel", onCancel);
|
|
10998
|
+
el.addEventListener("close", onClose);
|
|
10999
|
+
if (open && !el.open) {
|
|
11000
|
+
try {
|
|
11001
|
+
el.showModal();
|
|
11002
|
+
} catch {}
|
|
11003
|
+
}
|
|
11004
|
+
if (!open && el.open) {
|
|
11005
|
+
el.close();
|
|
11006
|
+
}
|
|
11007
|
+
return function() {
|
|
11008
|
+
el.removeEventListener("cancel", onCancel);
|
|
11009
|
+
return el.removeEventListener("close", onClose);
|
|
11010
|
+
};
|
|
11011
|
+
};
|
|
10831
11012
|
_ariaRovingNav = function(e, h, orientation = "vertical") {
|
|
10832
11013
|
let horz, vert;
|
|
10833
11014
|
if (e.isComposing)
|
|
@@ -10938,7 +11119,7 @@ ${indented}`);
|
|
|
10938
11119
|
return window.scrollTo(0, scrollY);
|
|
10939
11120
|
}
|
|
10940
11121
|
};
|
|
10941
|
-
globalThis.__aria ??= { listNav: _ariaListNav, rovingNav: _ariaRovingNav, popupDismiss: _ariaPopupDismiss, positionBelow: _ariaPositionBelow, trapFocus: _ariaTrapFocus, wireAria: _ariaWireAria, lockScroll: _ariaLockScroll, unlockScroll: _ariaUnlockScroll };
|
|
11122
|
+
globalThis.__aria ??= { listNav: _ariaListNav, rovingNav: _ariaRovingNav, popupDismiss: _ariaPopupDismiss, bindPopover: _ariaBindPopover, bindDialog: _ariaBindDialog, positionBelow: _ariaPositionBelow, trapFocus: _ariaTrapFocus, wireAria: _ariaWireAria, lockScroll: _ariaLockScroll, unlockScroll: _ariaUnlockScroll };
|
|
10942
11123
|
globalThis.ARIA ??= globalThis.__aria;
|
|
10943
11124
|
|
|
10944
11125
|
// docs/dist/_entry.js
|