sibujs 2.1.0 → 2.2.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/browser.cjs +324 -273
- package/dist/browser.js +4 -4
- package/dist/build.cjs +358 -328
- package/dist/build.js +10 -10
- package/dist/cdn.global.js +8 -8
- package/dist/{chunk-ZAQSMOED.js → chunk-2JQUV4Y3.js} +4 -4
- package/dist/{chunk-GWWURC5M.js → chunk-2KM2724A.js} +2 -2
- package/dist/{chunk-NASX6ST2.js → chunk-4YTVESDX.js} +1 -1
- package/dist/chunk-5WD7BYTZ.js +152 -0
- package/dist/{chunk-RDTDJCAB.js → chunk-6QZO7MMG.js} +48 -16
- package/dist/{chunk-DRUZZAK4.js → chunk-DF3GTP4Q.js} +7 -2
- package/dist/{chunk-AMK2TYNW.js → chunk-J63GPPCJ.js} +9 -9
- package/dist/{chunk-O6EFQ3KT.js → chunk-KH4OE6WY.js} +5 -5
- package/dist/{chunk-V6C4FADE.js → chunk-KZA7ANXP.js} +3 -3
- package/dist/chunk-L4DAT4WU.js +400 -0
- package/dist/{chunk-WANSMF2L.js → chunk-L52H775O.js} +4 -4
- package/dist/{chunk-45YP72ZQ.js → chunk-NEWH4O5U.js} +1 -1
- package/dist/{chunk-ON5MMR2J.js → chunk-RJIRT46U.js} +4 -4
- package/dist/{chunk-P2HSJDDN.js → chunk-STFTTMO2.js} +2 -2
- package/dist/{chunk-WIPZPFBQ.js → chunk-UKMXT5T6.js} +1 -1
- package/dist/{chunk-KGYT6UO6.js → chunk-V65KTDZW.js} +3 -3
- package/dist/{chunk-CWBVQML6.js → chunk-VSNLICTS.js} +1 -1
- package/dist/{chunk-3DZP6OIT.js → chunk-XDKP4T7G.js} +2 -2
- package/dist/{chunk-TH2ILCYW.js → chunk-XVYB3J6C.js} +27 -33
- package/dist/{chunk-OJ3P4ECI.js → chunk-YMOIAHWA.js} +1 -1
- package/dist/data.cjs +332 -298
- package/dist/data.js +6 -6
- package/dist/devtools.cjs +353 -296
- package/dist/devtools.d.cts +1 -1
- package/dist/devtools.d.ts +1 -1
- package/dist/devtools.js +4 -4
- package/dist/ecosystem.cjs +332 -298
- package/dist/ecosystem.js +7 -7
- package/dist/extras.cjs +372 -328
- package/dist/extras.d.cts +1 -1
- package/dist/extras.d.ts +1 -1
- package/dist/extras.js +19 -19
- package/dist/index.cjs +358 -328
- package/dist/index.d.cts +13 -22
- package/dist/index.d.ts +13 -22
- package/dist/index.js +10 -10
- package/dist/{introspect-DnIpHQQz.d.ts → introspect-BZWKvQUZ.d.ts} +2 -3
- package/dist/{introspect-2TOlQ7oa.d.cts → introspect-DsJlDD2T.d.cts} +2 -3
- package/dist/motion.cjs +147 -123
- package/dist/motion.js +3 -3
- package/dist/patterns.cjs +332 -298
- package/dist/patterns.js +5 -5
- package/dist/performance.cjs +315 -268
- package/dist/performance.js +4 -4
- package/dist/plugins.cjs +332 -266
- package/dist/plugins.js +6 -6
- package/dist/ssr.cjs +340 -270
- package/dist/ssr.js +7 -7
- package/dist/testing.cjs +167 -146
- package/dist/testing.js +2 -2
- package/dist/ui.cjs +324 -294
- package/dist/ui.js +6 -6
- package/dist/widgets.cjs +332 -298
- package/dist/widgets.js +6 -6
- package/package.json +1 -1
- package/dist/chunk-QO3WC6FS.js +0 -384
- package/dist/chunk-WZA53FXU.js +0 -149
package/dist/ssr.js
CHANGED
|
@@ -22,8 +22,8 @@ import {
|
|
|
22
22
|
wasm,
|
|
23
23
|
worker,
|
|
24
24
|
workerFn
|
|
25
|
-
} from "./chunk-
|
|
26
|
-
import "./chunk-
|
|
25
|
+
} from "./chunk-V65KTDZW.js";
|
|
26
|
+
import "./chunk-VSNLICTS.js";
|
|
27
27
|
import {
|
|
28
28
|
collectStream,
|
|
29
29
|
deserializeState,
|
|
@@ -43,14 +43,14 @@ import {
|
|
|
43
43
|
suspenseSwapScript,
|
|
44
44
|
trustHTML
|
|
45
45
|
} from "./chunk-JYD2PWXH.js";
|
|
46
|
-
import "./chunk-
|
|
47
|
-
import "./chunk-
|
|
46
|
+
import "./chunk-STFTTMO2.js";
|
|
47
|
+
import "./chunk-UKMXT5T6.js";
|
|
48
48
|
import "./chunk-2UPRY23K.js";
|
|
49
49
|
import "./chunk-UCS6AMJ7.js";
|
|
50
|
-
import "./chunk-
|
|
50
|
+
import "./chunk-5WD7BYTZ.js";
|
|
51
51
|
import "./chunk-2RA7SHDA.js";
|
|
52
|
-
import "./chunk-
|
|
53
|
-
import "./chunk-
|
|
52
|
+
import "./chunk-6QZO7MMG.js";
|
|
53
|
+
import "./chunk-L4DAT4WU.js";
|
|
54
54
|
import "./chunk-LMLD24FC.js";
|
|
55
55
|
export {
|
|
56
56
|
Head,
|
package/dist/testing.cjs
CHANGED
|
@@ -1549,69 +1549,88 @@ function testComponent(component, options = {}) {
|
|
|
1549
1549
|
|
|
1550
1550
|
// src/reactivity/track.ts
|
|
1551
1551
|
var _isDev3 = isDev();
|
|
1552
|
-
var
|
|
1553
|
-
var
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1552
|
+
var POOL_MAX = 4096;
|
|
1553
|
+
var nodePool = [];
|
|
1554
|
+
function freeNode(node) {
|
|
1555
|
+
node.sig = null;
|
|
1556
|
+
node.sub = null;
|
|
1557
|
+
node.sigPrev = null;
|
|
1558
|
+
node.sigNext = null;
|
|
1559
|
+
node.subPrev = null;
|
|
1560
|
+
node.subNext = null;
|
|
1561
|
+
node.prevActive = null;
|
|
1562
|
+
if (nodePool.length < POOL_MAX) nodePool.push(node);
|
|
1563
|
+
}
|
|
1564
|
+
function unlinkSignal(node) {
|
|
1565
|
+
const sig = node.sig;
|
|
1566
|
+
if (!sig) return;
|
|
1567
|
+
const prev = node.sigPrev;
|
|
1568
|
+
const next = node.sigNext;
|
|
1569
|
+
if (prev) prev.sigNext = next;
|
|
1570
|
+
else sig.subsHead = next;
|
|
1571
|
+
if (next) next.sigPrev = prev;
|
|
1572
|
+
else sig.subsTail = prev;
|
|
1573
|
+
sig.__sc = (sig.__sc ?? 1) - 1;
|
|
1574
|
+
if (sig.__activeNode === node) sig.__activeNode = node.prevActive;
|
|
1575
|
+
if (sig.__sc === 0) {
|
|
1576
|
+
sig.subsHead = null;
|
|
1577
|
+
sig.subsTail = null;
|
|
1578
|
+
}
|
|
1579
|
+
}
|
|
1580
|
+
function unlinkSub(node) {
|
|
1581
|
+
const sub = node.sub;
|
|
1582
|
+
if (!sub) return;
|
|
1583
|
+
const prev = node.subPrev;
|
|
1584
|
+
const next = node.subNext;
|
|
1585
|
+
if (prev) prev.subNext = next;
|
|
1586
|
+
else sub.depsHead = next;
|
|
1587
|
+
if (next) next.subPrev = prev;
|
|
1588
|
+
else sub.depsTail = prev;
|
|
1589
|
+
}
|
|
1557
1590
|
var currentSubscriber = null;
|
|
1558
|
-
var
|
|
1559
|
-
function
|
|
1560
|
-
const
|
|
1561
|
-
if (size === 0) {
|
|
1562
|
-
signal.__f = void 0;
|
|
1563
|
-
delete signal[SUBS];
|
|
1564
|
-
} else if (size === 1) {
|
|
1565
|
-
signal.__f = subs.values().next().value;
|
|
1566
|
-
} else {
|
|
1567
|
-
signal.__f = void 0;
|
|
1568
|
-
}
|
|
1569
|
-
}
|
|
1570
|
-
function track(effectFn, subscriber) {
|
|
1571
|
-
if (!subscriber) subscriber = effectFn;
|
|
1572
|
-
cleanup(subscriber);
|
|
1573
|
-
++stackTop;
|
|
1574
|
-
if (stackTop >= stackCapacity) {
|
|
1575
|
-
stackCapacity *= 2;
|
|
1576
|
-
subscriberStack.length = stackCapacity;
|
|
1577
|
-
}
|
|
1578
|
-
subscriberStack[stackTop] = subscriber;
|
|
1591
|
+
var subscriberEpochCounter = 0;
|
|
1592
|
+
function retrack(effectFn, subscriber) {
|
|
1593
|
+
const prev = currentSubscriber;
|
|
1579
1594
|
currentSubscriber = subscriber;
|
|
1595
|
+
const sub = subscriber;
|
|
1596
|
+
const epoch = ++subscriberEpochCounter;
|
|
1597
|
+
sub._epoch = epoch;
|
|
1598
|
+
sub._structDirty = false;
|
|
1599
|
+
for (let n = sub.depsHead ?? null; n !== null; n = n.subNext) {
|
|
1600
|
+
const sig = n.sig;
|
|
1601
|
+
n.prevActive = sig.__activeNode ?? null;
|
|
1602
|
+
sig.__activeNode = n;
|
|
1603
|
+
}
|
|
1580
1604
|
try {
|
|
1581
1605
|
effectFn();
|
|
1582
1606
|
} finally {
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1607
|
+
currentSubscriber = prev;
|
|
1608
|
+
let node = sub.depsHead ?? null;
|
|
1609
|
+
while (node !== null) {
|
|
1610
|
+
const next = node.subNext;
|
|
1611
|
+
const sig = node.sig;
|
|
1612
|
+
sig.__activeNode = node.prevActive;
|
|
1613
|
+
node.prevActive = null;
|
|
1614
|
+
if (node.epoch !== epoch) {
|
|
1615
|
+
unlinkSub(node);
|
|
1616
|
+
unlinkSignal(node);
|
|
1617
|
+
freeNode(node);
|
|
1618
|
+
}
|
|
1619
|
+
node = next;
|
|
1588
1620
|
}
|
|
1589
1621
|
}
|
|
1590
|
-
return () => cleanup(subscriber);
|
|
1591
1622
|
}
|
|
1592
1623
|
function cleanup(subscriber) {
|
|
1593
1624
|
const sub = subscriber;
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
sub._depEpoch = void 0;
|
|
1603
|
-
return;
|
|
1604
|
-
}
|
|
1605
|
-
const deps = sub._deps;
|
|
1606
|
-
if (!deps || deps.size === 0) return;
|
|
1607
|
-
for (const signal of deps.keys()) {
|
|
1608
|
-
const sig = signal;
|
|
1609
|
-
const subs = sig[SUBS];
|
|
1610
|
-
if (subs?.delete(subscriber)) {
|
|
1611
|
-
syncFastPath(sig, subs);
|
|
1612
|
-
}
|
|
1625
|
+
let node = sub.depsHead ?? null;
|
|
1626
|
+
sub.depsHead = null;
|
|
1627
|
+
sub.depsTail = null;
|
|
1628
|
+
while (node) {
|
|
1629
|
+
const next = node.subNext;
|
|
1630
|
+
unlinkSignal(node);
|
|
1631
|
+
freeNode(node);
|
|
1632
|
+
node = next;
|
|
1613
1633
|
}
|
|
1614
|
-
deps.clear();
|
|
1615
1634
|
}
|
|
1616
1635
|
|
|
1617
1636
|
// src/core/ssr-context.ts
|
|
@@ -1641,120 +1660,122 @@ function isSSR() {
|
|
|
1641
1660
|
|
|
1642
1661
|
// src/core/signals/effect.ts
|
|
1643
1662
|
var _g = globalThis;
|
|
1663
|
+
var MAX_RERUNS = 100;
|
|
1664
|
+
function flushUserCleanups(ctx) {
|
|
1665
|
+
const list = ctx.userCleanups;
|
|
1666
|
+
if (list.length === 0) return;
|
|
1667
|
+
ctx.userCleanups = [];
|
|
1668
|
+
for (let i = list.length - 1; i >= 0; i--) {
|
|
1669
|
+
try {
|
|
1670
|
+
list[i]();
|
|
1671
|
+
} catch (err) {
|
|
1672
|
+
if (typeof console !== "undefined") console.warn("[SibuJS effect] onCleanup threw:", err);
|
|
1673
|
+
}
|
|
1674
|
+
}
|
|
1675
|
+
}
|
|
1676
|
+
function drainReruns(ctx) {
|
|
1677
|
+
let reruns = 1;
|
|
1678
|
+
do {
|
|
1679
|
+
ctx.rerunPending = false;
|
|
1680
|
+
if (ctx.userCleanups.length > 0) flushUserCleanups(ctx);
|
|
1681
|
+
retrack(ctx.bodyFn, ctx.subscriber);
|
|
1682
|
+
} while (ctx.rerunPending && ++reruns <= MAX_RERUNS);
|
|
1683
|
+
if (ctx.rerunPending) {
|
|
1684
|
+
ctx.rerunPending = false;
|
|
1685
|
+
if (_g.__SIBU_DEV_WARN__ !== false && typeof console !== "undefined") {
|
|
1686
|
+
console.error(
|
|
1687
|
+
`[SibuJS] effect re-requested itself ${MAX_RERUNS}+ times \u2014 likely a write-reads-self cycle. Breaking to prevent infinite loop.`
|
|
1688
|
+
);
|
|
1689
|
+
}
|
|
1690
|
+
}
|
|
1691
|
+
}
|
|
1692
|
+
function disposeEffect(ctx) {
|
|
1693
|
+
if (ctx.disposed) return;
|
|
1694
|
+
ctx.disposed = true;
|
|
1695
|
+
const h = _g.__SIBU_DEVTOOLS_GLOBAL_HOOK__;
|
|
1696
|
+
if (h) {
|
|
1697
|
+
try {
|
|
1698
|
+
h.emit("effect:destroy", { effectFn: ctx.fn });
|
|
1699
|
+
} catch {
|
|
1700
|
+
}
|
|
1701
|
+
}
|
|
1702
|
+
try {
|
|
1703
|
+
if (ctx.userCleanups.length > 0) flushUserCleanups(ctx);
|
|
1704
|
+
} catch (err) {
|
|
1705
|
+
if (typeof console !== "undefined") {
|
|
1706
|
+
console.warn("[SibuJS effect] onCleanup threw during dispose:", err);
|
|
1707
|
+
}
|
|
1708
|
+
}
|
|
1709
|
+
try {
|
|
1710
|
+
cleanup(ctx.subscriber);
|
|
1711
|
+
} catch (err) {
|
|
1712
|
+
if (typeof console !== "undefined") {
|
|
1713
|
+
console.warn("[SibuJS effect] dispose threw:", err);
|
|
1714
|
+
}
|
|
1715
|
+
}
|
|
1716
|
+
}
|
|
1644
1717
|
function effect(effectFn, options) {
|
|
1645
1718
|
devAssert(typeof effectFn === "function", "effect: argument must be a function.");
|
|
1646
1719
|
if (isSSR()) return () => {
|
|
1647
1720
|
};
|
|
1648
|
-
const
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
userCleanups
|
|
1721
|
+
const ctx = {
|
|
1722
|
+
fn: effectFn,
|
|
1723
|
+
onError: options?.onError,
|
|
1724
|
+
userCleanups: [],
|
|
1725
|
+
running: false,
|
|
1726
|
+
rerunPending: false,
|
|
1727
|
+
disposed: false,
|
|
1728
|
+
onCleanup: null,
|
|
1729
|
+
subscriber: null,
|
|
1730
|
+
bodyFn: null
|
|
1652
1731
|
};
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
const list = userCleanups;
|
|
1656
|
-
userCleanups = [];
|
|
1657
|
-
for (let i = list.length - 1; i >= 0; i--) {
|
|
1658
|
-
try {
|
|
1659
|
-
list[i]();
|
|
1660
|
-
} catch (err) {
|
|
1661
|
-
if (typeof console !== "undefined") {
|
|
1662
|
-
console.warn("[SibuJS effect] onCleanup threw:", err);
|
|
1663
|
-
}
|
|
1664
|
-
}
|
|
1665
|
-
}
|
|
1732
|
+
ctx.onCleanup = (fn) => {
|
|
1733
|
+
ctx.userCleanups.push(fn);
|
|
1666
1734
|
};
|
|
1667
|
-
const
|
|
1668
|
-
|
|
1735
|
+
const onErrorCaptured = ctx.onError;
|
|
1736
|
+
ctx.bodyFn = onErrorCaptured ? () => {
|
|
1669
1737
|
try {
|
|
1670
|
-
|
|
1738
|
+
ctx.fn(ctx.onCleanup);
|
|
1671
1739
|
} catch (err) {
|
|
1672
|
-
|
|
1740
|
+
onErrorCaptured(err);
|
|
1673
1741
|
}
|
|
1674
|
-
} :
|
|
1675
|
-
|
|
1742
|
+
} : () => {
|
|
1743
|
+
ctx.fn(ctx.onCleanup);
|
|
1676
1744
|
};
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
const subscriber = () => {
|
|
1681
|
-
if (running) {
|
|
1682
|
-
rerunPending = true;
|
|
1745
|
+
const sub = (() => {
|
|
1746
|
+
if (ctx.running) {
|
|
1747
|
+
ctx.rerunPending = true;
|
|
1683
1748
|
return;
|
|
1684
1749
|
}
|
|
1685
|
-
running = true;
|
|
1750
|
+
ctx.running = true;
|
|
1686
1751
|
try {
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
cleanupHandle();
|
|
1692
|
-
cleanupHandle = track(wrappedFn, subscriber);
|
|
1693
|
-
if (++reruns > MAX_RERUNS) {
|
|
1694
|
-
if (_g.__SIBU_DEV_WARN__ !== false && typeof console !== "undefined") {
|
|
1695
|
-
console.error(
|
|
1696
|
-
`[SibuJS] effect re-requested itself ${MAX_RERUNS}+ times \u2014 likely a write-reads-self cycle. Breaking to prevent infinite loop.`
|
|
1697
|
-
);
|
|
1698
|
-
}
|
|
1699
|
-
rerunPending = false;
|
|
1700
|
-
break;
|
|
1701
|
-
}
|
|
1702
|
-
} while (rerunPending);
|
|
1752
|
+
ctx.rerunPending = false;
|
|
1753
|
+
if (ctx.userCleanups.length > 0) flushUserCleanups(ctx);
|
|
1754
|
+
retrack(ctx.bodyFn, sub);
|
|
1755
|
+
if (ctx.rerunPending) drainReruns(ctx);
|
|
1703
1756
|
} finally {
|
|
1704
|
-
running = false;
|
|
1705
|
-
rerunPending = false;
|
|
1757
|
+
ctx.running = false;
|
|
1758
|
+
ctx.rerunPending = false;
|
|
1706
1759
|
}
|
|
1707
|
-
};
|
|
1708
|
-
|
|
1760
|
+
});
|
|
1761
|
+
sub.depsHead = null;
|
|
1762
|
+
sub.depsTail = null;
|
|
1763
|
+
sub._epoch = 0;
|
|
1764
|
+
sub._structDirty = false;
|
|
1765
|
+
sub._runEpoch = 0;
|
|
1766
|
+
sub._runs = 0;
|
|
1767
|
+
ctx.subscriber = sub;
|
|
1768
|
+
ctx.running = true;
|
|
1709
1769
|
try {
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
rerunPending = false;
|
|
1713
|
-
runUserCleanups();
|
|
1714
|
-
cleanupHandle();
|
|
1715
|
-
cleanupHandle = track(wrappedFn, subscriber);
|
|
1716
|
-
if (++reruns > MAX_RERUNS) {
|
|
1717
|
-
if (_g.__SIBU_DEV_WARN__ !== false && typeof console !== "undefined") {
|
|
1718
|
-
console.error(
|
|
1719
|
-
`[SibuJS] effect re-requested itself ${MAX_RERUNS}+ times on initial run \u2014 likely a write-reads-self cycle. Breaking to prevent infinite loop.`
|
|
1720
|
-
);
|
|
1721
|
-
}
|
|
1722
|
-
rerunPending = false;
|
|
1723
|
-
break;
|
|
1724
|
-
}
|
|
1725
|
-
} while (rerunPending);
|
|
1770
|
+
retrack(ctx.bodyFn, ctx.subscriber);
|
|
1771
|
+
if (ctx.rerunPending) drainReruns(ctx);
|
|
1726
1772
|
} finally {
|
|
1727
|
-
running = false;
|
|
1728
|
-
rerunPending = false;
|
|
1773
|
+
ctx.running = false;
|
|
1774
|
+
ctx.rerunPending = false;
|
|
1729
1775
|
}
|
|
1730
1776
|
const hook = _g.__SIBU_DEVTOOLS_GLOBAL_HOOK__;
|
|
1731
1777
|
if (hook) hook.emit("effect:create", { effectFn });
|
|
1732
|
-
|
|
1733
|
-
return () => {
|
|
1734
|
-
if (disposed) return;
|
|
1735
|
-
disposed = true;
|
|
1736
|
-
const h = _g.__SIBU_DEVTOOLS_GLOBAL_HOOK__;
|
|
1737
|
-
if (h) {
|
|
1738
|
-
try {
|
|
1739
|
-
h.emit("effect:destroy", { effectFn });
|
|
1740
|
-
} catch {
|
|
1741
|
-
}
|
|
1742
|
-
}
|
|
1743
|
-
try {
|
|
1744
|
-
runUserCleanups();
|
|
1745
|
-
} catch (err) {
|
|
1746
|
-
if (typeof console !== "undefined") {
|
|
1747
|
-
console.warn("[SibuJS effect] onCleanup threw during dispose:", err);
|
|
1748
|
-
}
|
|
1749
|
-
}
|
|
1750
|
-
try {
|
|
1751
|
-
cleanupHandle();
|
|
1752
|
-
} catch (err) {
|
|
1753
|
-
if (typeof console !== "undefined") {
|
|
1754
|
-
console.warn("[SibuJS effect] dispose threw:", err);
|
|
1755
|
-
}
|
|
1756
|
-
}
|
|
1757
|
-
};
|
|
1778
|
+
return () => disposeEffect(ctx);
|
|
1758
1779
|
}
|
|
1759
1780
|
|
|
1760
1781
|
// src/testing/queries.ts
|
package/dist/testing.js
CHANGED
|
@@ -3,9 +3,9 @@ import {
|
|
|
3
3
|
} from "./chunk-2UPRY23K.js";
|
|
4
4
|
import {
|
|
5
5
|
effect
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-5WD7BYTZ.js";
|
|
7
7
|
import "./chunk-2RA7SHDA.js";
|
|
8
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-L4DAT4WU.js";
|
|
9
9
|
import "./chunk-LMLD24FC.js";
|
|
10
10
|
|
|
11
11
|
// src/testing/a11y.ts
|