@vobs/runtime 1.7.8 → 1.8.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 (127) hide show
  1. package/README.md +1 -1
  2. package/dist/async-boundary.cjs +14 -4
  3. package/dist/async-boundary.cjs.map +1 -1
  4. package/dist/async-boundary.js +17 -7
  5. package/dist/async-boundary.js.map +1 -1
  6. package/dist/bind.cjs +43 -3
  7. package/dist/bind.cjs.map +1 -1
  8. package/dist/bind.js +48 -8
  9. package/dist/bind.js.map +1 -1
  10. package/dist/boundary.cjs +159 -84
  11. package/dist/boundary.cjs.map +1 -1
  12. package/dist/boundary.js +162 -87
  13. package/dist/boundary.js.map +1 -1
  14. package/dist/client-only.cjs +323 -0
  15. package/dist/client-only.cjs.map +1 -0
  16. package/dist/client-only.d.cts +42 -0
  17. package/dist/client-only.d.ts +42 -0
  18. package/dist/client-only.js +299 -0
  19. package/dist/client-only.js.map +1 -0
  20. package/dist/debug.cjs.map +1 -1
  21. package/dist/debug.d.cts +12 -2
  22. package/dist/debug.d.ts +12 -2
  23. package/dist/debug.js.map +1 -1
  24. package/dist/dom-events.cjs +46 -0
  25. package/dist/dom-events.cjs.map +1 -0
  26. package/dist/dom-events.d.cts +23 -0
  27. package/dist/dom-events.d.ts +23 -0
  28. package/dist/dom-events.js +21 -0
  29. package/dist/dom-events.js.map +1 -0
  30. package/dist/dom-props.cjs +154 -0
  31. package/dist/dom-props.cjs.map +1 -0
  32. package/dist/dom-props.d.cts +21 -0
  33. package/dist/dom-props.d.ts +21 -0
  34. package/dist/dom-props.js +128 -0
  35. package/dist/dom-props.js.map +1 -0
  36. package/dist/dynamic.cjs +68 -14
  37. package/dist/dynamic.cjs.map +1 -1
  38. package/dist/dynamic.js +73 -19
  39. package/dist/dynamic.js.map +1 -1
  40. package/dist/error-boundary.cjs +159 -84
  41. package/dist/error-boundary.cjs.map +1 -1
  42. package/dist/error-boundary.js +162 -87
  43. package/dist/error-boundary.js.map +1 -1
  44. package/dist/error.cjs +52 -20
  45. package/dist/error.cjs.map +1 -1
  46. package/dist/error.d.cts +8 -0
  47. package/dist/error.d.ts +8 -0
  48. package/dist/error.js +52 -20
  49. package/dist/error.js.map +1 -1
  50. package/dist/fragment.cjs.map +1 -1
  51. package/dist/fragment.js +1 -1
  52. package/dist/fragment.js.map +1 -1
  53. package/dist/hmr.cjs +137 -1
  54. package/dist/hmr.cjs.map +1 -1
  55. package/dist/hmr.js +135 -1
  56. package/dist/hmr.js.map +1 -1
  57. package/dist/index.cjs +713 -236
  58. package/dist/index.cjs.map +1 -1
  59. package/dist/index.d.cts +5 -2
  60. package/dist/index.d.ts +5 -2
  61. package/dist/index.js +715 -245
  62. package/dist/index.js.map +1 -1
  63. package/dist/ops.cjs +561 -107
  64. package/dist/ops.cjs.map +1 -1
  65. package/dist/ops.d.cts +49 -4
  66. package/dist/ops.d.ts +49 -4
  67. package/dist/ops.js +557 -108
  68. package/dist/ops.js.map +1 -1
  69. package/dist/profiler.cjs +14 -4
  70. package/dist/profiler.cjs.map +1 -1
  71. package/dist/profiler.js +17 -7
  72. package/dist/profiler.js.map +1 -1
  73. package/dist/ref.cjs +160 -5
  74. package/dist/ref.cjs.map +1 -1
  75. package/dist/ref.js +160 -5
  76. package/dist/ref.js.map +1 -1
  77. package/dist/renderer.cjs.map +1 -1
  78. package/dist/renderer.d.cts +2 -0
  79. package/dist/renderer.d.ts +2 -0
  80. package/dist/show.cjs +196 -0
  81. package/dist/show.cjs.map +1 -0
  82. package/dist/show.d.cts +54 -0
  83. package/dist/show.d.ts +54 -0
  84. package/dist/show.js +171 -0
  85. package/dist/show.js.map +1 -0
  86. package/dist/svg.cjs +102 -0
  87. package/dist/svg.cjs.map +1 -0
  88. package/dist/svg.d.cts +21 -0
  89. package/dist/svg.d.ts +21 -0
  90. package/dist/svg.js +76 -0
  91. package/dist/svg.js.map +1 -0
  92. package/package.json +20 -2
  93. package/src/bind.ts +30 -2
  94. package/src/boundaries.test.ts +54 -1
  95. package/src/boundary.ts +24 -8
  96. package/src/clear-remove.test.ts +85 -0
  97. package/src/client-only.test.ts +140 -0
  98. package/src/client-only.ts +65 -0
  99. package/src/component-empty-return.test.ts +123 -0
  100. package/src/debug.ts +12 -1
  101. package/src/dom-events.ts +32 -0
  102. package/src/dom-props-consistency.test.ts +149 -0
  103. package/src/dom-props.test.ts +70 -0
  104. package/src/dom-props.ts +107 -0
  105. package/src/dynamic.ts +91 -14
  106. package/src/error.test.ts +76 -1
  107. package/src/error.ts +87 -22
  108. package/src/event-cleanup-growth.test.ts +128 -0
  109. package/src/events.test.ts +16 -3
  110. package/src/hmr.ts +8 -2
  111. package/src/index.ts +13 -1
  112. package/src/invariants.test.ts +252 -0
  113. package/src/list-fast-path.test.ts +83 -0
  114. package/src/list-reactive-item.test.ts +77 -0
  115. package/src/ops.ts +419 -60
  116. package/src/props.test.ts +61 -1
  117. package/src/ref-cleanup.test.ts +144 -0
  118. package/src/ref.ts +57 -8
  119. package/src/remove-listener-identity.test.ts +97 -0
  120. package/src/renderer.ts +3 -1
  121. package/src/select-hidden-subscription.test.ts +104 -0
  122. package/src/show-classlist.test.ts +205 -0
  123. package/src/show.ts +107 -0
  124. package/src/spread-stable-shape.test.ts +109 -0
  125. package/src/spread.test.ts +86 -0
  126. package/src/svg.test.ts +28 -1
  127. package/src/svg.ts +34 -0
@@ -0,0 +1,46 @@
1
+ var __VOBS_CJS_FILE_URL = require("url").pathToFileURL(__filename).href;
2
+ "use strict";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+
22
+ // packages/runtime/src/dom-events.ts
23
+ var dom_events_exports = {};
24
+ __export(dom_events_exports, {
25
+ EVENT_NAME_ALIASES: () => EVENT_NAME_ALIASES,
26
+ resolveEventName: () => resolveEventName
27
+ });
28
+ module.exports = __toCommonJS(dom_events_exports);
29
+ var EVENT_NAME_ALIASES = {
30
+ // React 风格的 onDoubleClick 对应的 DOM 事件是 dblclick
31
+ doubleclick: "dblclick",
32
+ // 少数人按 addEventListener 的写法写成 onDblClick
33
+ dblclick: "dblclick"
34
+ };
35
+ function resolveEventName(attributeName) {
36
+ if (!attributeName.startsWith("on") || attributeName.length <= 2) return void 0;
37
+ const lowered = attributeName.slice(2).toLowerCase();
38
+ return EVENT_NAME_ALIASES[lowered] ?? lowered;
39
+ }
40
+ __name(resolveEventName, "resolveEventName");
41
+ // Annotate the CommonJS export names for ESM import in node:
42
+ 0 && (module.exports = {
43
+ EVENT_NAME_ALIASES,
44
+ resolveEventName
45
+ });
46
+ //# sourceMappingURL=dom-events.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/dom-events.ts"],"sourcesContent":["/**\n * `on*` 属性名 → 真实 DOM 事件名。\n *\n * 与 `dom-props.ts` 的属性名表同理:这必须是**单一来源**。\n * 此前编译期与运行期各写一份、且不一致:\n * - 编译期(`@vobs/compiler` 的 `dom-events.ts`)有别名表,知道 `onDoubleClick` → `dblclick`;\n * - 运行期的 `{...props}` 展开路径只做 `name.slice(2).toLowerCase()`\n * → `onDoubleClick` 变成 `\"doubleclick\"`,**DOM 里根本叫 dblclick**,\n * 于是回调永不触发,而且不报错。\n * 实测(.artifacts/reports/runtime.supplement.md 缺点 2):派发 `dblclick` 命中 0 次,\n * 隐藏的 `doubleclick` 监听命中 1 次。同一个包在 `dom-props.ts:1-8` 自称\"两边逐字重复、\n * 已收拢成单一来源\",但那只覆盖属性名,没覆盖事件名。\n */\n\n/** JSX 驼峰名与 DOM 事件名不一致的少数情况(小写后的驼峰名 → 真实事件名)。 */\nexport const EVENT_NAME_ALIASES: Readonly<Record<string, string>> = {\n // React 风格的 onDoubleClick 对应的 DOM 事件是 dblclick\n doubleclick: 'dblclick',\n // 少数人按 addEventListener 的写法写成 onDblClick\n dblclick: 'dblclick'\n}\n\n/**\n * 把 `on*` 属性名解析成真实事件名。\n *\n * @returns 名字不以 `on` 开头或只有 `on` 本身时返回 undefined。\n */\nexport function resolveEventName(attributeName: string): string | undefined {\n if (!attributeName.startsWith('on') || attributeName.length <= 2) return undefined\n const lowered = attributeName.slice(2).toLowerCase()\n return EVENT_NAME_ALIASES[lowered] ?? lowered\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAeO,IAAM,qBAAuD;AAAA;AAAA,EAElE,aAAa;AAAA;AAAA,EAEb,UAAU;AACZ;AAOO,SAAS,iBAAiB,eAA2C;AAC1E,MAAI,CAAC,cAAc,WAAW,IAAI,KAAK,cAAc,UAAU,EAAG,QAAO;AACzE,QAAM,UAAU,cAAc,MAAM,CAAC,EAAE,YAAY;AACnD,SAAO,mBAAmB,OAAO,KAAK;AACxC;AAJgB;","names":[]}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * `on*` 属性名 → 真实 DOM 事件名。
3
+ *
4
+ * 与 `dom-props.ts` 的属性名表同理:这必须是**单一来源**。
5
+ * 此前编译期与运行期各写一份、且不一致:
6
+ * - 编译期(`@vobs/compiler` 的 `dom-events.ts`)有别名表,知道 `onDoubleClick` → `dblclick`;
7
+ * - 运行期的 `{...props}` 展开路径只做 `name.slice(2).toLowerCase()`
8
+ * → `onDoubleClick` 变成 `"doubleclick"`,**DOM 里根本叫 dblclick**,
9
+ * 于是回调永不触发,而且不报错。
10
+ * 实测(.artifacts/reports/runtime.supplement.md 缺点 2):派发 `dblclick` 命中 0 次,
11
+ * 隐藏的 `doubleclick` 监听命中 1 次。同一个包在 `dom-props.ts:1-8` 自称"两边逐字重复、
12
+ * 已收拢成单一来源",但那只覆盖属性名,没覆盖事件名。
13
+ */
14
+ /** JSX 驼峰名与 DOM 事件名不一致的少数情况(小写后的驼峰名 → 真实事件名)。 */
15
+ declare const EVENT_NAME_ALIASES: Readonly<Record<string, string>>;
16
+ /**
17
+ * 把 `on*` 属性名解析成真实事件名。
18
+ *
19
+ * @returns 名字不以 `on` 开头或只有 `on` 本身时返回 undefined。
20
+ */
21
+ declare function resolveEventName(attributeName: string): string | undefined;
22
+
23
+ export { EVENT_NAME_ALIASES, resolveEventName };
@@ -0,0 +1,23 @@
1
+ /**
2
+ * `on*` 属性名 → 真实 DOM 事件名。
3
+ *
4
+ * 与 `dom-props.ts` 的属性名表同理:这必须是**单一来源**。
5
+ * 此前编译期与运行期各写一份、且不一致:
6
+ * - 编译期(`@vobs/compiler` 的 `dom-events.ts`)有别名表,知道 `onDoubleClick` → `dblclick`;
7
+ * - 运行期的 `{...props}` 展开路径只做 `name.slice(2).toLowerCase()`
8
+ * → `onDoubleClick` 变成 `"doubleclick"`,**DOM 里根本叫 dblclick**,
9
+ * 于是回调永不触发,而且不报错。
10
+ * 实测(.artifacts/reports/runtime.supplement.md 缺点 2):派发 `dblclick` 命中 0 次,
11
+ * 隐藏的 `doubleclick` 监听命中 1 次。同一个包在 `dom-props.ts:1-8` 自称"两边逐字重复、
12
+ * 已收拢成单一来源",但那只覆盖属性名,没覆盖事件名。
13
+ */
14
+ /** JSX 驼峰名与 DOM 事件名不一致的少数情况(小写后的驼峰名 → 真实事件名)。 */
15
+ declare const EVENT_NAME_ALIASES: Readonly<Record<string, string>>;
16
+ /**
17
+ * 把 `on*` 属性名解析成真实事件名。
18
+ *
19
+ * @returns 名字不以 `on` 开头或只有 `on` 本身时返回 undefined。
20
+ */
21
+ declare function resolveEventName(attributeName: string): string | undefined;
22
+
23
+ export { EVENT_NAME_ALIASES, resolveEventName };
@@ -0,0 +1,21 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // packages/runtime/src/dom-events.ts
5
+ var EVENT_NAME_ALIASES = {
6
+ // React 风格的 onDoubleClick 对应的 DOM 事件是 dblclick
7
+ doubleclick: "dblclick",
8
+ // 少数人按 addEventListener 的写法写成 onDblClick
9
+ dblclick: "dblclick"
10
+ };
11
+ function resolveEventName(attributeName) {
12
+ if (!attributeName.startsWith("on") || attributeName.length <= 2) return void 0;
13
+ const lowered = attributeName.slice(2).toLowerCase();
14
+ return EVENT_NAME_ALIASES[lowered] ?? lowered;
15
+ }
16
+ __name(resolveEventName, "resolveEventName");
17
+ export {
18
+ EVENT_NAME_ALIASES,
19
+ resolveEventName
20
+ };
21
+ //# sourceMappingURL=dom-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/dom-events.ts"],"sourcesContent":["/**\n * `on*` 属性名 → 真实 DOM 事件名。\n *\n * 与 `dom-props.ts` 的属性名表同理:这必须是**单一来源**。\n * 此前编译期与运行期各写一份、且不一致:\n * - 编译期(`@vobs/compiler` 的 `dom-events.ts`)有别名表,知道 `onDoubleClick` → `dblclick`;\n * - 运行期的 `{...props}` 展开路径只做 `name.slice(2).toLowerCase()`\n * → `onDoubleClick` 变成 `\"doubleclick\"`,**DOM 里根本叫 dblclick**,\n * 于是回调永不触发,而且不报错。\n * 实测(.artifacts/reports/runtime.supplement.md 缺点 2):派发 `dblclick` 命中 0 次,\n * 隐藏的 `doubleclick` 监听命中 1 次。同一个包在 `dom-props.ts:1-8` 自称\"两边逐字重复、\n * 已收拢成单一来源\",但那只覆盖属性名,没覆盖事件名。\n */\n\n/** JSX 驼峰名与 DOM 事件名不一致的少数情况(小写后的驼峰名 → 真实事件名)。 */\nexport const EVENT_NAME_ALIASES: Readonly<Record<string, string>> = {\n // React 风格的 onDoubleClick 对应的 DOM 事件是 dblclick\n doubleclick: 'dblclick',\n // 少数人按 addEventListener 的写法写成 onDblClick\n dblclick: 'dblclick'\n}\n\n/**\n * 把 `on*` 属性名解析成真实事件名。\n *\n * @returns 名字不以 `on` 开头或只有 `on` 本身时返回 undefined。\n */\nexport function resolveEventName(attributeName: string): string | undefined {\n if (!attributeName.startsWith('on') || attributeName.length <= 2) return undefined\n const lowered = attributeName.slice(2).toLowerCase()\n return EVENT_NAME_ALIASES[lowered] ?? lowered\n}\n"],"mappings":";;;;AAeO,IAAM,qBAAuD;AAAA;AAAA,EAElE,aAAa;AAAA;AAAA,EAEb,UAAU;AACZ;AAOO,SAAS,iBAAiB,eAA2C;AAC1E,MAAI,CAAC,cAAc,WAAW,IAAI,KAAK,cAAc,UAAU,EAAG,QAAO;AACzE,QAAM,UAAU,cAAc,MAAM,CAAC,EAAE,YAAY;AACnD,SAAO,mBAAmB,OAAO,KAAK;AACxC;AAJgB;","names":[]}
@@ -0,0 +1,154 @@
1
+ var __VOBS_CJS_FILE_URL = require("url").pathToFileURL(__filename).href;
2
+ "use strict";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+
22
+ // packages/runtime/src/dom-props.ts
23
+ var dom_props_exports = {};
24
+ __export(dom_props_exports, {
25
+ domAttributeName: () => domAttributeName,
26
+ isPropertyName: () => isPropertyName,
27
+ isSvgKebabAttribute: () => isSvgKebabAttribute
28
+ });
29
+ module.exports = __toCommonJS(dom_props_exports);
30
+ var PROPERTY_NAMES = /* @__PURE__ */ new Set([
31
+ // 表单状态
32
+ "value",
33
+ "checked",
34
+ "selected",
35
+ "disabled",
36
+ "multiple",
37
+ "readOnly",
38
+ "required",
39
+ "defaultValue",
40
+ "defaultChecked",
41
+ "indeterminate",
42
+ /*
43
+ * `autoFocus` 用**驼峰**(与同表 readOnly/tabIndex/defaultChecked 一致),且必须走
44
+ * **property 通道**:`autofocus` 是**布尔属性**(只看存在与否、与值无关),
45
+ * 所以 `autoFocus={false}` 必须"移除属性"而不是写 `autofocus="false"`
46
+ * (attribute 通道只能把 false 序列化成字符串,属性照样存在 = 仍然聚焦)。
47
+ *
48
+ * ⚠️ 但 `setProperty` 必须把它映射成 **IDL 名 `autofocus`(全小写)** ——
49
+ * `Reflect.set(el, 'autoFocus', …)` 只会挂一个不反射的 expando,**静默无效**。
50
+ * 映射表见 ops.ts 的 `PROPERTY_IDL_NAMES`。实测(jsdom,与真实 DOM 同语义):
51
+ * IDL `autofocus` → 写 true 得 has=true/idl=true;写 false 得 has=false/idl=false ✓
52
+ * JSX `autoFocus` → 属性与 IDL 都不变(只是 expando) ✗
53
+ */
54
+ "autoFocus",
55
+ "hidden",
56
+ "tabIndex",
57
+ "colSpan",
58
+ "rowSpan",
59
+ "open",
60
+ // 只能走 property 的(attribute 路径会静默无效)
61
+ "innerHTML",
62
+ "innerText",
63
+ "textContent",
64
+ // 媒体
65
+ "muted",
66
+ "volume",
67
+ "currentTime",
68
+ "playbackRate"
69
+ ]);
70
+ var ATTRIBUTE_ALIASES = {
71
+ className: "class",
72
+ htmlFor: "for",
73
+ autoComplete: "autocomplete",
74
+ spellCheck: "spellcheck"
75
+ };
76
+ var SVG_KEBAB_ATTRIBUTES = /* @__PURE__ */ new Set([
77
+ // stroke
78
+ "strokeWidth",
79
+ "strokeLinecap",
80
+ "strokeLinejoin",
81
+ "strokeDasharray",
82
+ "strokeDashoffset",
83
+ "strokeMiterlimit",
84
+ "strokeOpacity",
85
+ // fill
86
+ "fillOpacity",
87
+ "fillRule",
88
+ // clip(注意 clipPathUnits 是结构属性,不在这里)
89
+ "clipPath",
90
+ "clipRule",
91
+ // 文本对齐
92
+ "textAnchor",
93
+ "dominantBaseline",
94
+ "alignmentBaseline",
95
+ "baselineShift",
96
+ // 字体
97
+ "fontFamily",
98
+ "fontSize",
99
+ "fontSizeAdjust",
100
+ "fontStretch",
101
+ "fontStyle",
102
+ "fontVariant",
103
+ "fontWeight",
104
+ "letterSpacing",
105
+ "wordSpacing",
106
+ // marker 的表现属性(markerWidth / markerHeight / markerUnits 是结构属性,不在这里)
107
+ "markerStart",
108
+ "markerMid",
109
+ "markerEnd",
110
+ // 颜色
111
+ "colorInterpolation",
112
+ "colorInterpolationFilters",
113
+ "colorProfile",
114
+ "colorRendering",
115
+ "floodColor",
116
+ "floodOpacity",
117
+ "lightingColor",
118
+ "stopColor",
119
+ "stopOpacity",
120
+ "glyphOrientationHorizontal",
121
+ "glyphOrientationVertical",
122
+ // 渲染与合成
123
+ "imageRendering",
124
+ "paintOrder",
125
+ "pointerEvents",
126
+ "shapeRendering",
127
+ "textDecoration",
128
+ "textRendering",
129
+ "transformOrigin",
130
+ "vectorEffect",
131
+ "writingMode"
132
+ ]);
133
+ function isPropertyName(name) {
134
+ return PROPERTY_NAMES.has(name);
135
+ }
136
+ __name(isPropertyName, "isPropertyName");
137
+ function isSvgKebabAttribute(name) {
138
+ return SVG_KEBAB_ATTRIBUTES.has(name);
139
+ }
140
+ __name(isSvgKebabAttribute, "isSvgKebabAttribute");
141
+ function domAttributeName(name) {
142
+ const alias = ATTRIBUTE_ALIASES[name];
143
+ if (alias !== void 0) return alias;
144
+ if (SVG_KEBAB_ATTRIBUTES.has(name)) return name.replace(/[A-Z]/gu, (letter) => `-${letter.toLowerCase()}`);
145
+ return name;
146
+ }
147
+ __name(domAttributeName, "domAttributeName");
148
+ // Annotate the CommonJS export names for ESM import in node:
149
+ 0 && (module.exports = {
150
+ domAttributeName,
151
+ isPropertyName,
152
+ isSvgKebabAttribute
153
+ });
154
+ //# sourceMappingURL=dom-props.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/dom-props.ts"],"sourcesContent":["/**\n * JSX 属性名 → DOM 设置方式的**单一来源**。\n *\n * compiler 在编译期用它决定生成 setProperty/bindProperty 还是 setAttribute/bindAttribute,\n * runtime 在展开 `{...props}` 时用同一套判断。此前两边各写了一份**逐字重复**的实现\n * (compile.ts 与 ops.ts),注释还写着「保持一致」—— 分叉即静默改道,所以收到这里。\n *\n * 这张表只描述「名字」,不占用户包体:compiler 侧是构建期用,runtime 侧是几十个字符串。\n */\n\n/**\n * 走 property 通道的名字(`el[name] = value`)。\n *\n * 判断标准是「当成 attribute 设不管用、或者语义不同」:\n * - `innerHTML` / `textContent` 不是 HTML 属性,setAttribute 完全无效(静默无操作)\n * - `defaultValue` / `defaultChecked` 的 attribute 形式是 value/checked,名字对不上\n * - `indeterminate` / `currentTime` / `volume` 等根本没有对应 attribute\n * 其余常见名字(value/checked/disabled/…)两条通道都能工作,列在这里是为了语义正确\n * (如 `disabled={false}` 必须清除 property)。\n */\nconst PROPERTY_NAMES: ReadonlySet<string> = new Set([\n // 表单状态\n 'value', 'checked', 'selected', 'disabled', 'multiple', 'readOnly', 'required',\n 'defaultValue', 'defaultChecked', 'indeterminate',\n /*\n * `autoFocus` 用**驼峰**(与同表 readOnly/tabIndex/defaultChecked 一致),且必须走\n * **property 通道**:`autofocus` 是**布尔属性**(只看存在与否、与值无关),\n * 所以 `autoFocus={false}` 必须\"移除属性\"而不是写 `autofocus=\"false\"`\n * (attribute 通道只能把 false 序列化成字符串,属性照样存在 = 仍然聚焦)。\n *\n * ⚠️ 但 `setProperty` 必须把它映射成 **IDL 名 `autofocus`(全小写)** ——\n * `Reflect.set(el, 'autoFocus', …)` 只会挂一个不反射的 expando,**静默无效**。\n * 映射表见 ops.ts 的 `PROPERTY_IDL_NAMES`。实测(jsdom,与真实 DOM 同语义):\n * IDL `autofocus` → 写 true 得 has=true/idl=true;写 false 得 has=false/idl=false ✓\n * JSX `autoFocus` → 属性与 IDL 都不变(只是 expando) ✗\n */\n 'autoFocus', 'hidden', 'tabIndex', 'colSpan', 'rowSpan', 'open',\n // 只能走 property 的(attribute 路径会静默无效)\n 'innerHTML', 'innerText', 'textContent',\n // 媒体\n 'muted', 'volume', 'currentTime', 'playbackRate'\n])\n\n/** camelCase JSX 属性名 → HTML attribute 名的别名。 */\nconst ATTRIBUTE_ALIASES: Readonly<Record<string, string>> = {\n className: 'class',\n htmlFor: 'for',\n autoComplete: 'autocomplete',\n spellCheck: 'spellcheck',\n}\n\n/**\n * SVG 里「JSX 写驼峰、真实 DOM 属性是短横线」的那一批。\n *\n * **不能按通用规则把驼峰转短横线** —— SVG 的属性命名是混合的:\n * - 表现属性(就是那些能当 CSS 用的)是短横线:`stroke-width`、`fill-opacity`、`text-anchor`\n * - 结构属性却真是驼峰:`viewBox`、`preserveAspectRatio`、`markerWidth`、`pathLength`\n * 所以只对下面这批做转换;其余同名照旧(`viewBox` 写驼峰本来就是对的)。\n *\n * 写错大小写的后果是完全静默:setAttribute 出一个浏览器不认识的属性,图形照旧没有描边,\n * 没有任何报错。\n */\nconst SVG_KEBAB_ATTRIBUTES: ReadonlySet<string> = new Set([\n // stroke\n 'strokeWidth', 'strokeLinecap', 'strokeLinejoin', 'strokeDasharray', 'strokeDashoffset',\n 'strokeMiterlimit', 'strokeOpacity',\n // fill\n 'fillOpacity', 'fillRule',\n // clip(注意 clipPathUnits 是结构属性,不在这里)\n 'clipPath', 'clipRule',\n // 文本对齐\n 'textAnchor', 'dominantBaseline', 'alignmentBaseline', 'baselineShift',\n // 字体\n 'fontFamily', 'fontSize', 'fontSizeAdjust', 'fontStretch', 'fontStyle', 'fontVariant', 'fontWeight',\n 'letterSpacing', 'wordSpacing',\n // marker 的表现属性(markerWidth / markerHeight / markerUnits 是结构属性,不在这里)\n 'markerStart', 'markerMid', 'markerEnd',\n // 颜色\n 'colorInterpolation', 'colorInterpolationFilters', 'colorProfile', 'colorRendering',\n 'floodColor', 'floodOpacity', 'lightingColor', 'stopColor', 'stopOpacity',\n 'glyphOrientationHorizontal', 'glyphOrientationVertical',\n // 渲染与合成\n 'imageRendering', 'paintOrder', 'pointerEvents', 'shapeRendering',\n 'textDecoration', 'textRendering', 'transformOrigin', 'vectorEffect', 'writingMode'\n])\n\n/** 名字是否应走 property 通道(`el[name] = value`)。 */\nexport function isPropertyName(name: string): boolean {\n return PROPERTY_NAMES.has(name)\n}\n\n/** SVG 驼峰属性名是否应转成短横线形式(`strokeWidth` → `stroke-width`)。 */\nexport function isSvgKebabAttribute(name: string): boolean {\n return SVG_KEBAB_ATTRIBUTES.has(name)\n}\n\n/**\n * camelCase JSX 属性名 → 真正写进 DOM 的 attribute 名。\n *\n * 注意 property 通道**不**经过这里:`colSpan` / `rowSpan` 的 JS 属性名本就是驼峰。\n */\nexport function domAttributeName(name: string): string {\n const alias = ATTRIBUTE_ALIASES[name]\n if (alias !== undefined) return alias\n if (SVG_KEBAB_ATTRIBUTES.has(name)) return name.replace(/[A-Z]/gu, letter => `-${letter.toLowerCase()}`)\n return name\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBA,IAAM,iBAAsC,oBAAI,IAAI;AAAA;AAAA,EAElD;AAAA,EAAS;AAAA,EAAW;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EACpE;AAAA,EAAgB;AAAA,EAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAalC;AAAA,EAAa;AAAA,EAAU;AAAA,EAAY;AAAA,EAAW;AAAA,EAAW;AAAA;AAAA,EAEzD;AAAA,EAAa;AAAA,EAAa;AAAA;AAAA,EAE1B;AAAA,EAAS;AAAA,EAAU;AAAA,EAAe;AACpC,CAAC;AAGD,IAAM,oBAAsD;AAAA,EAC1D,WAAW;AAAA,EACX,SAAS;AAAA,EACT,cAAc;AAAA,EACd,YAAY;AACd;AAaA,IAAM,uBAA4C,oBAAI,IAAI;AAAA;AAAA,EAExD;AAAA,EAAe;AAAA,EAAiB;AAAA,EAAkB;AAAA,EAAmB;AAAA,EACrE;AAAA,EAAoB;AAAA;AAAA,EAEpB;AAAA,EAAe;AAAA;AAAA,EAEf;AAAA,EAAY;AAAA;AAAA,EAEZ;AAAA,EAAc;AAAA,EAAoB;AAAA,EAAqB;AAAA;AAAA,EAEvD;AAAA,EAAc;AAAA,EAAY;AAAA,EAAkB;AAAA,EAAe;AAAA,EAAa;AAAA,EAAe;AAAA,EACvF;AAAA,EAAiB;AAAA;AAAA,EAEjB;AAAA,EAAe;AAAA,EAAa;AAAA;AAAA,EAE5B;AAAA,EAAsB;AAAA,EAA6B;AAAA,EAAgB;AAAA,EACnE;AAAA,EAAc;AAAA,EAAgB;AAAA,EAAiB;AAAA,EAAa;AAAA,EAC5D;AAAA,EAA8B;AAAA;AAAA,EAE9B;AAAA,EAAkB;AAAA,EAAc;AAAA,EAAiB;AAAA,EACjD;AAAA,EAAkB;AAAA,EAAiB;AAAA,EAAmB;AAAA,EAAgB;AACxE,CAAC;AAGM,SAAS,eAAe,MAAuB;AACpD,SAAO,eAAe,IAAI,IAAI;AAChC;AAFgB;AAKT,SAAS,oBAAoB,MAAuB;AACzD,SAAO,qBAAqB,IAAI,IAAI;AACtC;AAFgB;AAST,SAAS,iBAAiB,MAAsB;AACrD,QAAM,QAAQ,kBAAkB,IAAI;AACpC,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,qBAAqB,IAAI,IAAI,EAAG,QAAO,KAAK,QAAQ,WAAW,YAAU,IAAI,OAAO,YAAY,CAAC,EAAE;AACvG,SAAO;AACT;AALgB;","names":[]}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * JSX 属性名 → DOM 设置方式的**单一来源**。
3
+ *
4
+ * compiler 在编译期用它决定生成 setProperty/bindProperty 还是 setAttribute/bindAttribute,
5
+ * runtime 在展开 `{...props}` 时用同一套判断。此前两边各写了一份**逐字重复**的实现
6
+ * (compile.ts 与 ops.ts),注释还写着「保持一致」—— 分叉即静默改道,所以收到这里。
7
+ *
8
+ * 这张表只描述「名字」,不占用户包体:compiler 侧是构建期用,runtime 侧是几十个字符串。
9
+ */
10
+ /** 名字是否应走 property 通道(`el[name] = value`)。 */
11
+ declare function isPropertyName(name: string): boolean;
12
+ /** SVG 驼峰属性名是否应转成短横线形式(`strokeWidth` → `stroke-width`)。 */
13
+ declare function isSvgKebabAttribute(name: string): boolean;
14
+ /**
15
+ * camelCase JSX 属性名 → 真正写进 DOM 的 attribute 名。
16
+ *
17
+ * 注意 property 通道**不**经过这里:`colSpan` / `rowSpan` 的 JS 属性名本就是驼峰。
18
+ */
19
+ declare function domAttributeName(name: string): string;
20
+
21
+ export { domAttributeName, isPropertyName, isSvgKebabAttribute };
@@ -0,0 +1,21 @@
1
+ /**
2
+ * JSX 属性名 → DOM 设置方式的**单一来源**。
3
+ *
4
+ * compiler 在编译期用它决定生成 setProperty/bindProperty 还是 setAttribute/bindAttribute,
5
+ * runtime 在展开 `{...props}` 时用同一套判断。此前两边各写了一份**逐字重复**的实现
6
+ * (compile.ts 与 ops.ts),注释还写着「保持一致」—— 分叉即静默改道,所以收到这里。
7
+ *
8
+ * 这张表只描述「名字」,不占用户包体:compiler 侧是构建期用,runtime 侧是几十个字符串。
9
+ */
10
+ /** 名字是否应走 property 通道(`el[name] = value`)。 */
11
+ declare function isPropertyName(name: string): boolean;
12
+ /** SVG 驼峰属性名是否应转成短横线形式(`strokeWidth` → `stroke-width`)。 */
13
+ declare function isSvgKebabAttribute(name: string): boolean;
14
+ /**
15
+ * camelCase JSX 属性名 → 真正写进 DOM 的 attribute 名。
16
+ *
17
+ * 注意 property 通道**不**经过这里:`colSpan` / `rowSpan` 的 JS 属性名本就是驼峰。
18
+ */
19
+ declare function domAttributeName(name: string): string;
20
+
21
+ export { domAttributeName, isPropertyName, isSvgKebabAttribute };
@@ -0,0 +1,128 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // packages/runtime/src/dom-props.ts
5
+ var PROPERTY_NAMES = /* @__PURE__ */ new Set([
6
+ // 表单状态
7
+ "value",
8
+ "checked",
9
+ "selected",
10
+ "disabled",
11
+ "multiple",
12
+ "readOnly",
13
+ "required",
14
+ "defaultValue",
15
+ "defaultChecked",
16
+ "indeterminate",
17
+ /*
18
+ * `autoFocus` 用**驼峰**(与同表 readOnly/tabIndex/defaultChecked 一致),且必须走
19
+ * **property 通道**:`autofocus` 是**布尔属性**(只看存在与否、与值无关),
20
+ * 所以 `autoFocus={false}` 必须"移除属性"而不是写 `autofocus="false"`
21
+ * (attribute 通道只能把 false 序列化成字符串,属性照样存在 = 仍然聚焦)。
22
+ *
23
+ * ⚠️ 但 `setProperty` 必须把它映射成 **IDL 名 `autofocus`(全小写)** ——
24
+ * `Reflect.set(el, 'autoFocus', …)` 只会挂一个不反射的 expando,**静默无效**。
25
+ * 映射表见 ops.ts 的 `PROPERTY_IDL_NAMES`。实测(jsdom,与真实 DOM 同语义):
26
+ * IDL `autofocus` → 写 true 得 has=true/idl=true;写 false 得 has=false/idl=false ✓
27
+ * JSX `autoFocus` → 属性与 IDL 都不变(只是 expando) ✗
28
+ */
29
+ "autoFocus",
30
+ "hidden",
31
+ "tabIndex",
32
+ "colSpan",
33
+ "rowSpan",
34
+ "open",
35
+ // 只能走 property 的(attribute 路径会静默无效)
36
+ "innerHTML",
37
+ "innerText",
38
+ "textContent",
39
+ // 媒体
40
+ "muted",
41
+ "volume",
42
+ "currentTime",
43
+ "playbackRate"
44
+ ]);
45
+ var ATTRIBUTE_ALIASES = {
46
+ className: "class",
47
+ htmlFor: "for",
48
+ autoComplete: "autocomplete",
49
+ spellCheck: "spellcheck"
50
+ };
51
+ var SVG_KEBAB_ATTRIBUTES = /* @__PURE__ */ new Set([
52
+ // stroke
53
+ "strokeWidth",
54
+ "strokeLinecap",
55
+ "strokeLinejoin",
56
+ "strokeDasharray",
57
+ "strokeDashoffset",
58
+ "strokeMiterlimit",
59
+ "strokeOpacity",
60
+ // fill
61
+ "fillOpacity",
62
+ "fillRule",
63
+ // clip(注意 clipPathUnits 是结构属性,不在这里)
64
+ "clipPath",
65
+ "clipRule",
66
+ // 文本对齐
67
+ "textAnchor",
68
+ "dominantBaseline",
69
+ "alignmentBaseline",
70
+ "baselineShift",
71
+ // 字体
72
+ "fontFamily",
73
+ "fontSize",
74
+ "fontSizeAdjust",
75
+ "fontStretch",
76
+ "fontStyle",
77
+ "fontVariant",
78
+ "fontWeight",
79
+ "letterSpacing",
80
+ "wordSpacing",
81
+ // marker 的表现属性(markerWidth / markerHeight / markerUnits 是结构属性,不在这里)
82
+ "markerStart",
83
+ "markerMid",
84
+ "markerEnd",
85
+ // 颜色
86
+ "colorInterpolation",
87
+ "colorInterpolationFilters",
88
+ "colorProfile",
89
+ "colorRendering",
90
+ "floodColor",
91
+ "floodOpacity",
92
+ "lightingColor",
93
+ "stopColor",
94
+ "stopOpacity",
95
+ "glyphOrientationHorizontal",
96
+ "glyphOrientationVertical",
97
+ // 渲染与合成
98
+ "imageRendering",
99
+ "paintOrder",
100
+ "pointerEvents",
101
+ "shapeRendering",
102
+ "textDecoration",
103
+ "textRendering",
104
+ "transformOrigin",
105
+ "vectorEffect",
106
+ "writingMode"
107
+ ]);
108
+ function isPropertyName(name) {
109
+ return PROPERTY_NAMES.has(name);
110
+ }
111
+ __name(isPropertyName, "isPropertyName");
112
+ function isSvgKebabAttribute(name) {
113
+ return SVG_KEBAB_ATTRIBUTES.has(name);
114
+ }
115
+ __name(isSvgKebabAttribute, "isSvgKebabAttribute");
116
+ function domAttributeName(name) {
117
+ const alias = ATTRIBUTE_ALIASES[name];
118
+ if (alias !== void 0) return alias;
119
+ if (SVG_KEBAB_ATTRIBUTES.has(name)) return name.replace(/[A-Z]/gu, (letter) => `-${letter.toLowerCase()}`);
120
+ return name;
121
+ }
122
+ __name(domAttributeName, "domAttributeName");
123
+ export {
124
+ domAttributeName,
125
+ isPropertyName,
126
+ isSvgKebabAttribute
127
+ };
128
+ //# sourceMappingURL=dom-props.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/dom-props.ts"],"sourcesContent":["/**\n * JSX 属性名 → DOM 设置方式的**单一来源**。\n *\n * compiler 在编译期用它决定生成 setProperty/bindProperty 还是 setAttribute/bindAttribute,\n * runtime 在展开 `{...props}` 时用同一套判断。此前两边各写了一份**逐字重复**的实现\n * (compile.ts 与 ops.ts),注释还写着「保持一致」—— 分叉即静默改道,所以收到这里。\n *\n * 这张表只描述「名字」,不占用户包体:compiler 侧是构建期用,runtime 侧是几十个字符串。\n */\n\n/**\n * 走 property 通道的名字(`el[name] = value`)。\n *\n * 判断标准是「当成 attribute 设不管用、或者语义不同」:\n * - `innerHTML` / `textContent` 不是 HTML 属性,setAttribute 完全无效(静默无操作)\n * - `defaultValue` / `defaultChecked` 的 attribute 形式是 value/checked,名字对不上\n * - `indeterminate` / `currentTime` / `volume` 等根本没有对应 attribute\n * 其余常见名字(value/checked/disabled/…)两条通道都能工作,列在这里是为了语义正确\n * (如 `disabled={false}` 必须清除 property)。\n */\nconst PROPERTY_NAMES: ReadonlySet<string> = new Set([\n // 表单状态\n 'value', 'checked', 'selected', 'disabled', 'multiple', 'readOnly', 'required',\n 'defaultValue', 'defaultChecked', 'indeterminate',\n /*\n * `autoFocus` 用**驼峰**(与同表 readOnly/tabIndex/defaultChecked 一致),且必须走\n * **property 通道**:`autofocus` 是**布尔属性**(只看存在与否、与值无关),\n * 所以 `autoFocus={false}` 必须\"移除属性\"而不是写 `autofocus=\"false\"`\n * (attribute 通道只能把 false 序列化成字符串,属性照样存在 = 仍然聚焦)。\n *\n * ⚠️ 但 `setProperty` 必须把它映射成 **IDL 名 `autofocus`(全小写)** ——\n * `Reflect.set(el, 'autoFocus', …)` 只会挂一个不反射的 expando,**静默无效**。\n * 映射表见 ops.ts 的 `PROPERTY_IDL_NAMES`。实测(jsdom,与真实 DOM 同语义):\n * IDL `autofocus` → 写 true 得 has=true/idl=true;写 false 得 has=false/idl=false ✓\n * JSX `autoFocus` → 属性与 IDL 都不变(只是 expando) ✗\n */\n 'autoFocus', 'hidden', 'tabIndex', 'colSpan', 'rowSpan', 'open',\n // 只能走 property 的(attribute 路径会静默无效)\n 'innerHTML', 'innerText', 'textContent',\n // 媒体\n 'muted', 'volume', 'currentTime', 'playbackRate'\n])\n\n/** camelCase JSX 属性名 → HTML attribute 名的别名。 */\nconst ATTRIBUTE_ALIASES: Readonly<Record<string, string>> = {\n className: 'class',\n htmlFor: 'for',\n autoComplete: 'autocomplete',\n spellCheck: 'spellcheck',\n}\n\n/**\n * SVG 里「JSX 写驼峰、真实 DOM 属性是短横线」的那一批。\n *\n * **不能按通用规则把驼峰转短横线** —— SVG 的属性命名是混合的:\n * - 表现属性(就是那些能当 CSS 用的)是短横线:`stroke-width`、`fill-opacity`、`text-anchor`\n * - 结构属性却真是驼峰:`viewBox`、`preserveAspectRatio`、`markerWidth`、`pathLength`\n * 所以只对下面这批做转换;其余同名照旧(`viewBox` 写驼峰本来就是对的)。\n *\n * 写错大小写的后果是完全静默:setAttribute 出一个浏览器不认识的属性,图形照旧没有描边,\n * 没有任何报错。\n */\nconst SVG_KEBAB_ATTRIBUTES: ReadonlySet<string> = new Set([\n // stroke\n 'strokeWidth', 'strokeLinecap', 'strokeLinejoin', 'strokeDasharray', 'strokeDashoffset',\n 'strokeMiterlimit', 'strokeOpacity',\n // fill\n 'fillOpacity', 'fillRule',\n // clip(注意 clipPathUnits 是结构属性,不在这里)\n 'clipPath', 'clipRule',\n // 文本对齐\n 'textAnchor', 'dominantBaseline', 'alignmentBaseline', 'baselineShift',\n // 字体\n 'fontFamily', 'fontSize', 'fontSizeAdjust', 'fontStretch', 'fontStyle', 'fontVariant', 'fontWeight',\n 'letterSpacing', 'wordSpacing',\n // marker 的表现属性(markerWidth / markerHeight / markerUnits 是结构属性,不在这里)\n 'markerStart', 'markerMid', 'markerEnd',\n // 颜色\n 'colorInterpolation', 'colorInterpolationFilters', 'colorProfile', 'colorRendering',\n 'floodColor', 'floodOpacity', 'lightingColor', 'stopColor', 'stopOpacity',\n 'glyphOrientationHorizontal', 'glyphOrientationVertical',\n // 渲染与合成\n 'imageRendering', 'paintOrder', 'pointerEvents', 'shapeRendering',\n 'textDecoration', 'textRendering', 'transformOrigin', 'vectorEffect', 'writingMode'\n])\n\n/** 名字是否应走 property 通道(`el[name] = value`)。 */\nexport function isPropertyName(name: string): boolean {\n return PROPERTY_NAMES.has(name)\n}\n\n/** SVG 驼峰属性名是否应转成短横线形式(`strokeWidth` → `stroke-width`)。 */\nexport function isSvgKebabAttribute(name: string): boolean {\n return SVG_KEBAB_ATTRIBUTES.has(name)\n}\n\n/**\n * camelCase JSX 属性名 → 真正写进 DOM 的 attribute 名。\n *\n * 注意 property 通道**不**经过这里:`colSpan` / `rowSpan` 的 JS 属性名本就是驼峰。\n */\nexport function domAttributeName(name: string): string {\n const alias = ATTRIBUTE_ALIASES[name]\n if (alias !== undefined) return alias\n if (SVG_KEBAB_ATTRIBUTES.has(name)) return name.replace(/[A-Z]/gu, letter => `-${letter.toLowerCase()}`)\n return name\n}\n"],"mappings":";;;;AAoBA,IAAM,iBAAsC,oBAAI,IAAI;AAAA;AAAA,EAElD;AAAA,EAAS;AAAA,EAAW;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EAAY;AAAA,EACpE;AAAA,EAAgB;AAAA,EAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAalC;AAAA,EAAa;AAAA,EAAU;AAAA,EAAY;AAAA,EAAW;AAAA,EAAW;AAAA;AAAA,EAEzD;AAAA,EAAa;AAAA,EAAa;AAAA;AAAA,EAE1B;AAAA,EAAS;AAAA,EAAU;AAAA,EAAe;AACpC,CAAC;AAGD,IAAM,oBAAsD;AAAA,EAC1D,WAAW;AAAA,EACX,SAAS;AAAA,EACT,cAAc;AAAA,EACd,YAAY;AACd;AAaA,IAAM,uBAA4C,oBAAI,IAAI;AAAA;AAAA,EAExD;AAAA,EAAe;AAAA,EAAiB;AAAA,EAAkB;AAAA,EAAmB;AAAA,EACrE;AAAA,EAAoB;AAAA;AAAA,EAEpB;AAAA,EAAe;AAAA;AAAA,EAEf;AAAA,EAAY;AAAA;AAAA,EAEZ;AAAA,EAAc;AAAA,EAAoB;AAAA,EAAqB;AAAA;AAAA,EAEvD;AAAA,EAAc;AAAA,EAAY;AAAA,EAAkB;AAAA,EAAe;AAAA,EAAa;AAAA,EAAe;AAAA,EACvF;AAAA,EAAiB;AAAA;AAAA,EAEjB;AAAA,EAAe;AAAA,EAAa;AAAA;AAAA,EAE5B;AAAA,EAAsB;AAAA,EAA6B;AAAA,EAAgB;AAAA,EACnE;AAAA,EAAc;AAAA,EAAgB;AAAA,EAAiB;AAAA,EAAa;AAAA,EAC5D;AAAA,EAA8B;AAAA;AAAA,EAE9B;AAAA,EAAkB;AAAA,EAAc;AAAA,EAAiB;AAAA,EACjD;AAAA,EAAkB;AAAA,EAAiB;AAAA,EAAmB;AAAA,EAAgB;AACxE,CAAC;AAGM,SAAS,eAAe,MAAuB;AACpD,SAAO,eAAe,IAAI,IAAI;AAChC;AAFgB;AAKT,SAAS,oBAAoB,MAAuB;AACzD,SAAO,qBAAqB,IAAI,IAAI;AACtC;AAFgB;AAST,SAAS,iBAAiB,MAAsB;AACrD,QAAM,QAAQ,kBAAkB,IAAI;AACpC,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,qBAAqB,IAAI,IAAI,EAAG,QAAO,KAAK,QAAQ,WAAW,YAAU,IAAI,OAAO,YAAY,CAAC,EAAE;AACvG,SAAO;AACT;AALgB;","names":[]}