@tachui/core 0.7.1-alpha → 0.8.1-alpha
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/README.md +20 -2
- package/dist/bundles/assets.d.ts +19 -0
- package/dist/bundles/assets.d.ts.map +1 -0
- package/dist/bundles/common.d.ts +1 -1
- package/dist/bundles/common.d.ts.map +1 -1
- package/dist/bundles/context.d.ts +22 -0
- package/dist/bundles/context.d.ts.map +1 -0
- package/dist/bundles/minimal.d.ts +8 -18
- package/dist/bundles/minimal.d.ts.map +1 -1
- package/dist/bundles/production-minimal.d.ts +2 -16
- package/dist/bundles/production-minimal.d.ts.map +1 -1
- package/dist/common.js +405 -828
- package/dist/compiler/advanced-parser.d.ts.map +1 -1
- package/dist/compiler/codegen.d.ts.map +1 -1
- package/dist/compiler/index.js +6 -1387
- package/dist/compiler/parser.d.ts +1 -1
- package/dist/compiler/parser.d.ts.map +1 -1
- package/dist/compiler/plugin.d.ts.map +1 -1
- package/dist/compiler/types.d.ts +28 -0
- package/dist/compiler/types.d.ts.map +1 -1
- package/dist/component-XAzF1xqs.js +487 -0
- package/dist/component-base-x2XmHFjy.js +255 -0
- package/dist/components/index.d.ts +4 -38
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +7 -4167
- package/dist/components/wrapper.d.ts +5 -152
- package/dist/components/wrapper.d.ts.map +1 -1
- package/dist/concatenated-component-ByPl3_FF.js +2933 -0
- package/dist/constants/index.d.ts +1 -1
- package/dist/constants/layout.d.ts +47 -4
- package/dist/constants/layout.d.ts.map +1 -1
- package/dist/constants/layout.js +84 -0
- package/dist/css-classes/index.js +176 -0
- package/dist/{dom-bridge-Cx-s6Ihx.js → dom-bridge-CAa1N2zX.js} +28 -28
- package/dist/{effect-CytAc9em.js → effect-B9Knft0b.js} +3 -3
- package/dist/essential.js +397 -826
- package/dist/index-DEBd8cq7.js +1144 -0
- package/dist/index-DIvMCJQO.js +268 -0
- package/dist/index-vdsiw6gQ.js +777 -0
- package/dist/index.d.ts +9 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +397 -826
- package/dist/minimal-prod.js +101 -155
- package/dist/minimal.js +118 -170
- package/dist/modifiers/background.d.ts +41 -11
- package/dist/modifiers/background.d.ts.map +1 -1
- package/dist/modifiers/base.d.ts +6 -33
- package/dist/modifiers/base.d.ts.map +1 -1
- package/dist/modifiers/base.js +487 -0
- package/dist/modifiers/builder.d.ts +103 -195
- package/dist/modifiers/builder.d.ts.map +1 -1
- package/dist/modifiers/builder.js +9 -0
- package/dist/modifiers/core.d.ts +9 -401
- package/dist/modifiers/core.d.ts.map +1 -1
- package/dist/modifiers/{utils.d.ts → factories.d.ts} +18 -5
- package/dist/modifiers/factories.d.ts.map +1 -0
- package/dist/modifiers/index.d.ts +8 -52
- package/dist/modifiers/index.d.ts.map +1 -1
- package/dist/modifiers/index.js +38 -0
- package/dist/modifiers/presets.d.ts +368 -0
- package/dist/modifiers/presets.d.ts.map +1 -0
- package/dist/modifiers/registry.js +10 -0
- package/dist/modifiers/types.d.ts +39 -211
- package/dist/modifiers/types.d.ts.map +1 -1
- package/dist/modifiers/types.js +4 -0
- package/dist/observed-object-Cos-FtjP.js +269 -0
- package/dist/performance-optimizer-stub-CtfXUwl4.js +38 -0
- package/dist/plugin-BCAdZXKq.js +1680 -0
- package/dist/plugins/index.d.ts +5 -6
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +147 -297
- package/dist/plugins/simplified-index.d.ts +5 -6
- package/dist/plugins/simplified-index.d.ts.map +1 -1
- package/dist/production-minimal-BY_gMc-l.js +2532 -0
- package/dist/reactive/index.js +96 -95
- package/dist/reactive/types.js +4 -0
- package/dist/runtime/concatenation-aria.d.ts +24 -0
- package/dist/runtime/concatenation-aria.d.ts.map +1 -0
- package/dist/runtime/concatenation-aria.js +53 -0
- package/dist/runtime/concatenation-full.d.ts +30 -0
- package/dist/runtime/concatenation-full.d.ts.map +1 -0
- package/dist/runtime/concatenation-full.js +77 -0
- package/dist/runtime/concatenation-minimal.d.ts +25 -0
- package/dist/runtime/concatenation-minimal.d.ts.map +1 -0
- package/dist/runtime/concatenation-minimal.js +40 -0
- package/dist/runtime/dom-bridge.js +5 -5
- package/dist/runtime/element-override.d.ts.map +1 -1
- package/dist/runtime/index.d.ts +0 -7
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/renderer.d.ts.map +1 -1
- package/dist/runtime/renderer.js +7 -8
- package/dist/runtime/semantic-role-manager.d.ts.map +1 -1
- package/dist/runtime/types.js +1 -0
- package/dist/{scheduler-7SvC3a21.js → scheduler-BKeqwrYE.js} +130 -130
- package/dist/validation/build-time-stub.d.ts +33 -0
- package/dist/validation/build-time-stub.d.ts.map +1 -0
- package/dist/validation/debug-tools-stub.d.ts +67 -0
- package/dist/validation/debug-tools-stub.d.ts.map +1 -0
- package/dist/validation/index.d.ts +23 -78
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/index.js +609 -6470
- package/dist/validation/lifecycle-validation.d.ts.map +1 -1
- package/dist/validation/performance-optimizer-stub.d.ts +50 -0
- package/dist/validation/performance-optimizer-stub.d.ts.map +1 -0
- package/dist/validation/plugin-registration.d.ts +5 -1
- package/dist/validation/plugin-registration.d.ts.map +1 -1
- package/dist/validation/production-bypass-core.d.ts +69 -0
- package/dist/validation/production-bypass-core.d.ts.map +1 -0
- package/package.json +61 -5
- package/dist/ScrollView-h-6wYMAm.js +0 -515
- package/dist/Spacer-BbteDQ9I.js +0 -5337
- package/dist/binding-CmdpowkI.js +0 -2276
- package/dist/components/BasicInput.d.ts +0 -116
- package/dist/components/BasicInput.d.ts.map +0 -1
- package/dist/components/Button.d.ts +0 -252
- package/dist/components/Button.d.ts.map +0 -1
- package/dist/components/Divider.d.ts +0 -141
- package/dist/components/Divider.d.ts.map +0 -1
- package/dist/components/EnhancedLink.d.ts +0 -365
- package/dist/components/EnhancedLink.d.ts.map +0 -1
- package/dist/components/Form.d.ts +0 -141
- package/dist/components/Form.d.ts.map +0 -1
- package/dist/components/Grid.d.ts +0 -698
- package/dist/components/Grid.d.ts.map +0 -1
- package/dist/components/GridResponsive.d.ts +0 -214
- package/dist/components/GridResponsive.d.ts.map +0 -1
- package/dist/components/Image.d.ts +0 -162
- package/dist/components/Image.d.ts.map +0 -1
- package/dist/components/List.d.ts +0 -287
- package/dist/components/List.d.ts.map +0 -1
- package/dist/components/Menu.d.ts +0 -159
- package/dist/components/Menu.d.ts.map +0 -1
- package/dist/components/Picker.d.ts +0 -153
- package/dist/components/Picker.d.ts.map +0 -1
- package/dist/components/ScrollView.d.ts +0 -222
- package/dist/components/ScrollView.d.ts.map +0 -1
- package/dist/components/Section.d.ts +0 -153
- package/dist/components/Section.d.ts.map +0 -1
- package/dist/components/Show.d.ts +0 -64
- package/dist/components/Show.d.ts.map +0 -1
- package/dist/components/Spacer.d.ts +0 -35
- package/dist/components/Spacer.d.ts.map +0 -1
- package/dist/components/Text.d.ts +0 -242
- package/dist/components/Text.d.ts.map +0 -1
- package/dist/components/Toggle.d.ts +0 -207
- package/dist/components/Toggle.d.ts.map +0 -1
- package/dist/concatenated-component-DPcl2TEO.js +0 -6779
- package/dist/context--zQFIImS.js +0 -283
- package/dist/debug/index.d.ts +0 -61
- package/dist/debug/index.d.ts.map +0 -1
- package/dist/debug.js +0 -178
- package/dist/developer-experience/enhanced-errors.d.ts +0 -128
- package/dist/developer-experience/enhanced-errors.d.ts.map +0 -1
- package/dist/developer-experience/enhanced-types.d.ts +0 -281
- package/dist/developer-experience/enhanced-types.d.ts.map +0 -1
- package/dist/developer-experience/index.d.ts +0 -44
- package/dist/developer-experience/index.d.ts.map +0 -1
- package/dist/index-Nfi2SBQh.js +0 -3268
- package/dist/modifiers/attributes.d.ts +0 -203
- package/dist/modifiers/attributes.d.ts.map +0 -1
- package/dist/modifiers/backdrop.d.ts +0 -59
- package/dist/modifiers/backdrop.d.ts.map +0 -1
- package/dist/modifiers/border.d.ts +0 -217
- package/dist/modifiers/border.d.ts.map +0 -1
- package/dist/modifiers/effects.d.ts +0 -159
- package/dist/modifiers/effects.d.ts.map +0 -1
- package/dist/modifiers/elements.d.ts +0 -240
- package/dist/modifiers/elements.d.ts.map +0 -1
- package/dist/modifiers/filters.d.ts +0 -275
- package/dist/modifiers/filters.d.ts.map +0 -1
- package/dist/modifiers/flexbox.d.ts +0 -82
- package/dist/modifiers/flexbox.d.ts.map +0 -1
- package/dist/modifiers/font.d.ts +0 -71
- package/dist/modifiers/font.d.ts.map +0 -1
- package/dist/modifiers/grid.d.ts +0 -92
- package/dist/modifiers/grid.d.ts.map +0 -1
- package/dist/modifiers/margin.d.ts +0 -128
- package/dist/modifiers/margin.d.ts.map +0 -1
- package/dist/modifiers/padding.d.ts +0 -204
- package/dist/modifiers/padding.d.ts.map +0 -1
- package/dist/modifiers/responsive/advanced-utilities.d.ts +0 -118
- package/dist/modifiers/responsive/advanced-utilities.d.ts.map +0 -1
- package/dist/modifiers/responsive/breakpoints.d.ts +0 -81
- package/dist/modifiers/responsive/breakpoints.d.ts.map +0 -1
- package/dist/modifiers/responsive/css-generator.d.ts +0 -100
- package/dist/modifiers/responsive/css-generator.d.ts.map +0 -1
- package/dist/modifiers/responsive/dev-tools.d.ts +0 -107
- package/dist/modifiers/responsive/dev-tools.d.ts.map +0 -1
- package/dist/modifiers/responsive/index.d.ts +0 -29
- package/dist/modifiers/responsive/index.d.ts.map +0 -1
- package/dist/modifiers/responsive/layout-patterns.d.ts +0 -230
- package/dist/modifiers/responsive/layout-patterns.d.ts.map +0 -1
- package/dist/modifiers/responsive/performance.d.ts +0 -130
- package/dist/modifiers/responsive/performance.d.ts.map +0 -1
- package/dist/modifiers/responsive/responsive-builder.d.ts +0 -133
- package/dist/modifiers/responsive/responsive-builder.d.ts.map +0 -1
- package/dist/modifiers/responsive/responsive-modifier.d.ts +0 -123
- package/dist/modifiers/responsive/responsive-modifier.d.ts.map +0 -1
- package/dist/modifiers/responsive/types.d.ts +0 -183
- package/dist/modifiers/responsive/types.d.ts.map +0 -1
- package/dist/modifiers/responsive/utilities.d.ts +0 -149
- package/dist/modifiers/responsive/utilities.d.ts.map +0 -1
- package/dist/modifiers/scroll.d.ts +0 -143
- package/dist/modifiers/scroll.d.ts.map +0 -1
- package/dist/modifiers/shadows.d.ts +0 -114
- package/dist/modifiers/shadows.d.ts.map +0 -1
- package/dist/modifiers/size.d.ts +0 -113
- package/dist/modifiers/size.d.ts.map +0 -1
- package/dist/modifiers/text.d.ts +0 -147
- package/dist/modifiers/text.d.ts.map +0 -1
- package/dist/modifiers/transformations.d.ts +0 -329
- package/dist/modifiers/transformations.d.ts.map +0 -1
- package/dist/modifiers/transitions.d.ts +0 -98
- package/dist/modifiers/transitions.d.ts.map +0 -1
- package/dist/modifiers/typography.d.ts +0 -192
- package/dist/modifiers/typography.d.ts.map +0 -1
- package/dist/modifiers/utility.d.ts +0 -69
- package/dist/modifiers/utility.d.ts.map +0 -1
- package/dist/modifiers/utils.d.ts.map +0 -1
- package/dist/plugins/simplified-error-handler.d.ts +0 -83
- package/dist/plugins/simplified-error-handler.d.ts.map +0 -1
- package/dist/runtime/dev-tools.d.ts +0 -240
- package/dist/runtime/dev-tools.d.ts.map +0 -1
- package/dist/runtime/development-warnings.d.ts +0 -42
- package/dist/runtime/development-warnings.d.ts.map +0 -1
- package/dist/runtime/error-boundary.d.ts +0 -302
- package/dist/runtime/error-boundary.d.ts.map +0 -1
- package/dist/runtime/error-recovery.d.ts +0 -267
- package/dist/runtime/error-recovery.d.ts.map +0 -1
- package/dist/runtime/error-reporting.d.ts +0 -287
- package/dist/runtime/error-reporting.d.ts.map +0 -1
- package/dist/runtime/error-utils.d.ts +0 -204
- package/dist/runtime/error-utils.d.ts.map +0 -1
- package/dist/runtime/performance.d.ts +0 -217
- package/dist/runtime/performance.d.ts.map +0 -1
- package/dist/sui-compat.d.ts +0 -110
- package/dist/sui-compat.d.ts.map +0 -1
- package/dist/validation/advanced-debugging.d.ts +0 -319
- package/dist/validation/advanced-debugging.d.ts.map +0 -1
- package/dist/validation/build-time/detection.d.ts +0 -32
- package/dist/validation/build-time/detection.d.ts.map +0 -1
- package/dist/validation/build-time/index.d.ts +0 -84
- package/dist/validation/build-time/index.d.ts.map +0 -1
- package/dist/validation/build-time/plugins.d.ts +0 -75
- package/dist/validation/build-time/plugins.d.ts.map +0 -1
- package/dist/validation/build-time/rules.d.ts +0 -73
- package/dist/validation/build-time/rules.d.ts.map +0 -1
- package/dist/validation/build-time/transformer.d.ts +0 -23
- package/dist/validation/build-time/transformer.d.ts.map +0 -1
- package/dist/validation/build-time/types.d.ts +0 -212
- package/dist/validation/build-time/types.d.ts.map +0 -1
- package/dist/validation/comprehensive.d.ts +0 -160
- package/dist/validation/comprehensive.d.ts.map +0 -1
- package/dist/validation/debug-tools.d.ts +0 -251
- package/dist/validation/debug-tools.d.ts.map +0 -1
- package/dist/validation/developer-experience.d.ts +0 -243
- package/dist/validation/developer-experience.d.ts.map +0 -1
- package/dist/validation/documentation-integration.d.ts +0 -269
- package/dist/validation/documentation-integration.d.ts.map +0 -1
- package/dist/validation/enhanced-runtime.d.ts +0 -279
- package/dist/validation/enhanced-runtime.d.ts.map +0 -1
- package/dist/validation/error-reporting.d.ts +0 -186
- package/dist/validation/error-reporting.d.ts.map +0 -1
- package/dist/validation/ide-integration.d.ts +0 -328
- package/dist/validation/ide-integration.d.ts.map +0 -1
- package/dist/validation/performance-optimizer.d.ts +0 -218
- package/dist/validation/performance-optimizer.d.ts.map +0 -1
- package/dist/validation/production-bypass.d.ts +0 -175
- package/dist/validation/production-bypass.d.ts.map +0 -1
- package/dist/validation/simple.d.ts +0 -111
- package/dist/validation/simple.d.ts.map +0 -1
- package/dist/viewport/adapters/web-adapter.d.ts +0 -227
- package/dist/viewport/adapters/web-adapter.d.ts.map +0 -1
- package/dist/viewport/components.d.ts +0 -131
- package/dist/viewport/components.d.ts.map +0 -1
- package/dist/viewport/environment.d.ts +0 -75
- package/dist/viewport/environment.d.ts.map +0 -1
- package/dist/viewport/index.d.ts +0 -138
- package/dist/viewport/index.d.ts.map +0 -1
- package/dist/viewport/index.js +0 -2085
- package/dist/viewport/platform-detection.d.ts +0 -59
- package/dist/viewport/platform-detection.d.ts.map +0 -1
- package/dist/viewport/types.d.ts +0 -301
- package/dist/viewport/types.d.ts.map +0 -1
- package/dist/viewport/viewport-manager.d.ts +0 -118
- package/dist/viewport/viewport-manager.d.ts.map +0 -1
|
@@ -0,0 +1,2933 @@
|
|
|
1
|
+
import { BaseModifier as O, AnimationModifier as m, AppearanceModifier as d, LifecycleModifier as w, InteractionModifier as l, LayoutModifier as g, ResizableModifier as Q } from "./modifiers/base.js";
|
|
2
|
+
import { ModifierPriority as ee } from "./modifiers/types.js";
|
|
3
|
+
import { J as S, i as E, k as q } from "./scheduler-BKeqwrYE.js";
|
|
4
|
+
import { c as y } from "./effect-B9Knft0b.js";
|
|
5
|
+
const te = {
|
|
6
|
+
center: "center",
|
|
7
|
+
top: "top",
|
|
8
|
+
bottom: "bottom",
|
|
9
|
+
leading: "left",
|
|
10
|
+
trailing: "right"
|
|
11
|
+
};
|
|
12
|
+
function F(i) {
|
|
13
|
+
return typeof i == "string" ? i : i.resolve();
|
|
14
|
+
}
|
|
15
|
+
function C(i, e) {
|
|
16
|
+
return i.map((t, r) => {
|
|
17
|
+
const n = F(t);
|
|
18
|
+
return e && e[r] !== void 0 ? `${n} ${e[r]}%` : n;
|
|
19
|
+
}).join(", ");
|
|
20
|
+
}
|
|
21
|
+
function M(i) {
|
|
22
|
+
return Array.isArray(i) ? `${i[0]}% ${i[1]}%` : te[i] || i;
|
|
23
|
+
}
|
|
24
|
+
function ie(i, e, t) {
|
|
25
|
+
if (t !== void 0)
|
|
26
|
+
return `${t}deg`;
|
|
27
|
+
const r = `${i}-${e}`;
|
|
28
|
+
return {
|
|
29
|
+
"top-bottom": "to bottom",
|
|
30
|
+
"bottom-top": "to top",
|
|
31
|
+
"leading-trailing": "to right",
|
|
32
|
+
"trailing-leading": "to left",
|
|
33
|
+
"topLeading-bottomTrailing": "to bottom right",
|
|
34
|
+
"topTrailing-bottomLeading": "to bottom left",
|
|
35
|
+
"bottomLeading-topTrailing": "to top right",
|
|
36
|
+
"bottomTrailing-topLeading": "to top left"
|
|
37
|
+
}[r] || "to bottom";
|
|
38
|
+
}
|
|
39
|
+
function re(i) {
|
|
40
|
+
const e = ie(i.startPoint, i.endPoint, i.angle), t = C(i.colors, i.stops);
|
|
41
|
+
return `linear-gradient(${e}, ${t})`;
|
|
42
|
+
}
|
|
43
|
+
function se(i) {
|
|
44
|
+
const e = i.shape || "circle", t = M(i.center), r = C(i.colors, i.stops);
|
|
45
|
+
let n;
|
|
46
|
+
return e === "circle" ? n = `${i.endRadius}px` : n = `${i.endRadius}px ${i.endRadius}px`, `radial-gradient(${e} ${n} at ${t}, ${r})`;
|
|
47
|
+
}
|
|
48
|
+
function ne(i) {
|
|
49
|
+
const e = M(i.center), t = `from ${i.startAngle}deg`, r = C(i.colors, i.stops);
|
|
50
|
+
return `conic-gradient(${t} at ${e}, ${r})`;
|
|
51
|
+
}
|
|
52
|
+
function oe(i) {
|
|
53
|
+
const e = M(i.center), t = `from ${i.startAngle}deg`, r = C(i.colors, i.stops);
|
|
54
|
+
return `conic-gradient(${t} at ${e}, ${r})`;
|
|
55
|
+
}
|
|
56
|
+
function ae(i) {
|
|
57
|
+
const e = i.colors.map((t, r) => {
|
|
58
|
+
const n = F(t), s = i.colorStops[r] || `${r * 10}px`;
|
|
59
|
+
return `${n} ${s}`;
|
|
60
|
+
}).join(", ");
|
|
61
|
+
return `repeating-linear-gradient(${i.direction}, ${e})`;
|
|
62
|
+
}
|
|
63
|
+
function ce(i) {
|
|
64
|
+
const e = i.shape || "circle", t = M(i.center), r = i.colors.map((n, s) => {
|
|
65
|
+
const o = F(n), c = i.colorStops[s] || `${s * 10}px`;
|
|
66
|
+
return `${o} ${c}`;
|
|
67
|
+
}).join(", ");
|
|
68
|
+
return `repeating-radial-gradient(${e} at ${t}, ${r})`;
|
|
69
|
+
}
|
|
70
|
+
function de(i) {
|
|
71
|
+
const e = M(i.center), t = C(i.colors, i.stops);
|
|
72
|
+
return `radial-gradient(ellipse ${i.radiusX}px ${i.radiusY}px at ${e}, ${t})`;
|
|
73
|
+
}
|
|
74
|
+
function ue(i) {
|
|
75
|
+
switch (i.type) {
|
|
76
|
+
case "linear":
|
|
77
|
+
return re(i.options);
|
|
78
|
+
case "radial":
|
|
79
|
+
return se(i.options);
|
|
80
|
+
case "angular":
|
|
81
|
+
return ne(i.options);
|
|
82
|
+
case "conic":
|
|
83
|
+
return oe(i.options);
|
|
84
|
+
case "repeating-linear":
|
|
85
|
+
return ae(i.options);
|
|
86
|
+
case "repeating-radial":
|
|
87
|
+
return ce(i.options);
|
|
88
|
+
case "elliptical":
|
|
89
|
+
return de(i.options);
|
|
90
|
+
default:
|
|
91
|
+
throw new Error(`Unknown gradient type: ${i.type}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
var le = Object.defineProperty, pe = (i, e, t) => e in i ? le(i, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : i[e] = t, R = (i, e, t) => pe(i, typeof e != "symbol" ? e + "" : e, t);
|
|
95
|
+
class G extends O {
|
|
96
|
+
constructor(e) {
|
|
97
|
+
super(e), R(this, "type", "background"), R(this, "priority", ee.APPEARANCE), R(this, "cleanupFunctions", []);
|
|
98
|
+
}
|
|
99
|
+
apply(e, t) {
|
|
100
|
+
if (!t.element) return;
|
|
101
|
+
this.cleanupFunctions.forEach((n) => n()), this.cleanupFunctions = [];
|
|
102
|
+
const r = this.properties.background;
|
|
103
|
+
if (this.isStateGradient(r) && t.element instanceof HTMLElement)
|
|
104
|
+
this.setupStateGradient(
|
|
105
|
+
t.element,
|
|
106
|
+
r
|
|
107
|
+
);
|
|
108
|
+
else if (this.isStateGradient(r)) {
|
|
109
|
+
const n = this.computeBackgroundStyles(this.properties);
|
|
110
|
+
this.applyStyles(t.element, n);
|
|
111
|
+
} else {
|
|
112
|
+
const n = this.computeBackgroundStyles(this.properties);
|
|
113
|
+
this.applyStyles(t.element, n);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
isStateGradient(e) {
|
|
117
|
+
return e && typeof e == "object" && "default" in e && !("type" in e) && !("resolve" in e);
|
|
118
|
+
}
|
|
119
|
+
setupStateGradient(e, t) {
|
|
120
|
+
const r = this.resolveBackground(t.default);
|
|
121
|
+
if (e.style.background = r, t.animation) {
|
|
122
|
+
const {
|
|
123
|
+
duration: n = 200,
|
|
124
|
+
easing: s = "ease-out",
|
|
125
|
+
delay: o = 0
|
|
126
|
+
} = t.animation;
|
|
127
|
+
e.style.cssText += `transition: background ${n}ms ${s} ${o}ms`;
|
|
128
|
+
}
|
|
129
|
+
t.hover && this.addHoverListeners(e, t), t.active && this.addActiveListeners(e, t), t.focus && this.addFocusListeners(e, t), t.disabled && this.addDisabledObserver(e, t);
|
|
130
|
+
}
|
|
131
|
+
addHoverListeners(e, t) {
|
|
132
|
+
const r = () => {
|
|
133
|
+
this.isDisabled(e) || (e.style.background = this.resolveBackground(t.hover));
|
|
134
|
+
}, n = () => {
|
|
135
|
+
const s = this.getHighestPriorityState(e, t);
|
|
136
|
+
e.style.background = this.resolveBackground(s);
|
|
137
|
+
};
|
|
138
|
+
e.addEventListener("mouseenter", r), e.addEventListener("mouseleave", n), this.cleanupFunctions.push(() => {
|
|
139
|
+
e.removeEventListener("mouseenter", r), e.removeEventListener("mouseleave", n);
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
addActiveListeners(e, t) {
|
|
143
|
+
const r = () => {
|
|
144
|
+
this.isDisabled(e) || (e.style.background = this.resolveBackground(t.active));
|
|
145
|
+
}, n = () => {
|
|
146
|
+
const s = this.getMouseInteractionState(e, t);
|
|
147
|
+
e.style.background = this.resolveBackground(s);
|
|
148
|
+
};
|
|
149
|
+
e.addEventListener("mousedown", r), e.addEventListener("mouseup", n), this.cleanupFunctions.push(() => {
|
|
150
|
+
e.removeEventListener("mousedown", r), e.removeEventListener("mouseup", n);
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
addFocusListeners(e, t) {
|
|
154
|
+
const r = () => {
|
|
155
|
+
this.isDisabled(e) || (e.style.background = this.resolveBackground(t.focus));
|
|
156
|
+
}, n = () => {
|
|
157
|
+
if (!this.isDisabled(e)) {
|
|
158
|
+
const s = this.getHighestPriorityState(e, t);
|
|
159
|
+
e.style.background = this.resolveBackground(s);
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
e.addEventListener("focus", r), e.addEventListener("blur", n), this.cleanupFunctions.push(() => {
|
|
163
|
+
e.removeEventListener("focus", r), e.removeEventListener("blur", n);
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
addDisabledObserver(e, t) {
|
|
167
|
+
const r = new MutationObserver(() => {
|
|
168
|
+
if (this.isDisabled(e))
|
|
169
|
+
e.style.background = this.resolveBackground(
|
|
170
|
+
t.disabled
|
|
171
|
+
);
|
|
172
|
+
else {
|
|
173
|
+
const n = this.getHighestPriorityState(e, t);
|
|
174
|
+
e.style.background = this.resolveBackground(n);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
r.observe(e, {
|
|
178
|
+
attributes: !0,
|
|
179
|
+
attributeFilter: ["disabled"]
|
|
180
|
+
}), this.cleanupFunctions.push(() => {
|
|
181
|
+
r.disconnect();
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
getMouseInteractionState(e, t) {
|
|
185
|
+
const r = this.isDisabled(e), n = e.matches(":focus"), s = e.matches(":hover");
|
|
186
|
+
return r && t.disabled ? t.disabled : s && t.hover ? t.hover : n && t.focus ? t.focus : t.default;
|
|
187
|
+
}
|
|
188
|
+
getHighestPriorityState(e, t) {
|
|
189
|
+
const r = this.isDisabled(e), n = e.matches(":focus"), s = e.matches(":hover");
|
|
190
|
+
return r && t.disabled ? t.disabled : n && t.focus ? t.focus : s && t.hover ? t.hover : t.default;
|
|
191
|
+
}
|
|
192
|
+
isDisabled(e) {
|
|
193
|
+
const t = e.hasAttribute("disabled");
|
|
194
|
+
return t === !1 ? !1 : t || e.matches && e.matches(":disabled");
|
|
195
|
+
}
|
|
196
|
+
resolveBackground(e) {
|
|
197
|
+
return e == null ? "transparent" : typeof e == "object" && e !== null && "type" in e && "options" in e ? ue(e) : typeof e == "object" && e !== null && "resolve" in e ? e.resolve() : String(e);
|
|
198
|
+
}
|
|
199
|
+
computeBackgroundStyles(e) {
|
|
200
|
+
const t = {};
|
|
201
|
+
if (e.background !== void 0)
|
|
202
|
+
if (this.isStateGradient(e.background)) {
|
|
203
|
+
const r = e.background;
|
|
204
|
+
t.background = this.resolveBackground(r.default);
|
|
205
|
+
} else
|
|
206
|
+
t.background = this.resolveBackground(
|
|
207
|
+
e.background
|
|
208
|
+
);
|
|
209
|
+
return t;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
var he = Object.defineProperty, fe = (i, e, t) => e in i ? he(i, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : i[e] = t, W = (i, e, t) => fe(i, typeof e != "symbol" ? e + "" : e, t);
|
|
213
|
+
class L extends O {
|
|
214
|
+
// Very low priority so raw CSS doesn't override specific modifiers
|
|
215
|
+
constructor(e) {
|
|
216
|
+
const t = {};
|
|
217
|
+
for (const [r, n] of Object.entries(e))
|
|
218
|
+
typeof n == "function" && "peek" in n ? t[r] = n.peek() : t[r] = n;
|
|
219
|
+
super(t), W(this, "type", "css"), W(this, "priority", 5);
|
|
220
|
+
}
|
|
221
|
+
apply(e, t) {
|
|
222
|
+
if (!t.element) return;
|
|
223
|
+
const r = this.computeCSSStyles(this.properties);
|
|
224
|
+
this.applyStyles(t.element, r);
|
|
225
|
+
}
|
|
226
|
+
computeCSSStyles(e) {
|
|
227
|
+
const t = {};
|
|
228
|
+
for (const [r, n] of Object.entries(e))
|
|
229
|
+
if (n !== void 0) {
|
|
230
|
+
const s = this.toCSSProperty(r);
|
|
231
|
+
t[s] = this.toCSSValue(n);
|
|
232
|
+
}
|
|
233
|
+
return t;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
function me(i) {
|
|
237
|
+
return new L(i);
|
|
238
|
+
}
|
|
239
|
+
function ge(i, e) {
|
|
240
|
+
return new L({ [i]: e });
|
|
241
|
+
}
|
|
242
|
+
function ye(i, e) {
|
|
243
|
+
const t = i.startsWith("--") ? i : `--${i}`;
|
|
244
|
+
return new L({ [t]: e });
|
|
245
|
+
}
|
|
246
|
+
function be(i, e, t) {
|
|
247
|
+
const r = i.charAt(0).toUpperCase() + i.slice(1), n = `-${i.toLowerCase()}-${e}`, s = r + e.charAt(0).toUpperCase() + e.slice(1);
|
|
248
|
+
return new L({
|
|
249
|
+
[n]: t,
|
|
250
|
+
[s]: t
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
var ve = Object.defineProperty, we = (i, e, t) => e in i ? ve(i, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : i[e] = t, V = (i, e, t) => we(i, typeof e != "symbol" ? e + "" : e, t);
|
|
254
|
+
class $ {
|
|
255
|
+
/**
|
|
256
|
+
* Apply basic sanitization to HTML content
|
|
257
|
+
* Removes dangerous patterns and restricts to allowed elements/attributes
|
|
258
|
+
*/
|
|
259
|
+
static sanitize(e, t = {}) {
|
|
260
|
+
if (!e || typeof e != "string")
|
|
261
|
+
return "";
|
|
262
|
+
let r = e;
|
|
263
|
+
for (const n of this.DANGEROUS_PATTERNS)
|
|
264
|
+
r = r.replace(n, "");
|
|
265
|
+
if (t.validateDOM !== !1 && (r = this.validateDOMStructure(r, t)), t.customPatterns)
|
|
266
|
+
for (const n of t.customPatterns)
|
|
267
|
+
r = r.replace(n, "");
|
|
268
|
+
return r.trim();
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Validate DOM structure and attributes using DOMParser
|
|
272
|
+
*/
|
|
273
|
+
static validateDOMStructure(e, t) {
|
|
274
|
+
try {
|
|
275
|
+
const s = new DOMParser().parseFromString(`<div>${e}</div>`, "text/html").body.firstChild;
|
|
276
|
+
return s ? (this.cleanElement(s, t), s.innerHTML) : "";
|
|
277
|
+
} catch (r) {
|
|
278
|
+
return console.warn("BasicSanitizer: DOM validation failed, using pattern-based sanitization only", r), e;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Recursively clean element and its children
|
|
283
|
+
*/
|
|
284
|
+
static cleanElement(e, t) {
|
|
285
|
+
const r = e.tagName.toLowerCase();
|
|
286
|
+
if (!(t.allowedTags || this.ALLOWED_TAGS).includes(r)) {
|
|
287
|
+
const u = e.textContent || "";
|
|
288
|
+
if (u.trim() && e.parentNode) {
|
|
289
|
+
const h = e.ownerDocument.createTextNode(u);
|
|
290
|
+
e.parentNode.insertBefore(h, e);
|
|
291
|
+
}
|
|
292
|
+
e.remove();
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
const s = this.getAllowedAttributesForTag(r, t), o = [];
|
|
296
|
+
for (let u = 0; u < e.attributes.length; u++) {
|
|
297
|
+
const h = e.attributes[u];
|
|
298
|
+
s.includes(h.name) && this.isAttributeValueSafe(h.name, h.value) || o.push(h.name);
|
|
299
|
+
}
|
|
300
|
+
o.forEach((u) => e.removeAttribute(u)), Array.from(e.children).forEach((u) => this.cleanElement(u, t));
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Get allowed attributes for a specific tag
|
|
304
|
+
*/
|
|
305
|
+
static getAllowedAttributesForTag(e, t) {
|
|
306
|
+
const r = t.allowedAttributes || this.ALLOWED_ATTRIBUTES, n = r["*"] || [], s = r[e] || [];
|
|
307
|
+
return [...n, ...s];
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Check if attribute value is safe
|
|
311
|
+
*/
|
|
312
|
+
static isAttributeValueSafe(e, t) {
|
|
313
|
+
return ["href", "src", "action"].includes(e) ? this.isUrlSafe(t) : !/javascript:/i.test(t);
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Validate URL safety
|
|
317
|
+
*/
|
|
318
|
+
static isUrlSafe(e) {
|
|
319
|
+
if (!e || e.startsWith("/") || e.startsWith("./") || e.startsWith("#"))
|
|
320
|
+
return !0;
|
|
321
|
+
try {
|
|
322
|
+
const t = new URL(e);
|
|
323
|
+
return ["http:", "https:", "mailto:", "tel:", "ftp:"].includes(t.protocol);
|
|
324
|
+
} catch {
|
|
325
|
+
return !1;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
V($, "DANGEROUS_PATTERNS", [
|
|
330
|
+
// Script tags (including nested/malformed ones)
|
|
331
|
+
/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
|
|
332
|
+
/<[^>]*<script[^>]*>/gi,
|
|
333
|
+
// Nested script tags
|
|
334
|
+
/script>/gi,
|
|
335
|
+
// Catch any remaining script closings
|
|
336
|
+
// Event handlers (onclick, onload, etc.)
|
|
337
|
+
/\s*on\w+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]*)/gi,
|
|
338
|
+
// JavaScript URLs
|
|
339
|
+
/(?:href|src)\s*=\s*["']?javascript:[^"'\s>]*/gi,
|
|
340
|
+
// Data URLs with scripts (basic detection)
|
|
341
|
+
/(?:href|src)\s*=\s*["']?data:[^"'\s>]*(?:script|javascript)[^"'\s>]*/gi,
|
|
342
|
+
// Dangerous elements
|
|
343
|
+
/<(?:iframe|object|embed|form|input|meta|link)\b[^>]*>/gi,
|
|
344
|
+
// Style tags with JavaScript
|
|
345
|
+
/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi,
|
|
346
|
+
// Import statements in CSS
|
|
347
|
+
/@import\s+[^;]+;?/gi,
|
|
348
|
+
// Expression() in CSS (IE specific, but good to block)
|
|
349
|
+
/expression\s*\([^)]*\)/gi,
|
|
350
|
+
// Additional dangerous patterns
|
|
351
|
+
/alert\s*\([^)]*\)/gi,
|
|
352
|
+
// Alert calls
|
|
353
|
+
/javascript:/gi,
|
|
354
|
+
// Any javascript: protocol
|
|
355
|
+
/vbscript:/gi
|
|
356
|
+
// VBScript protocol
|
|
357
|
+
]);
|
|
358
|
+
V($, "ALLOWED_TAGS", [
|
|
359
|
+
"p",
|
|
360
|
+
"br",
|
|
361
|
+
"strong",
|
|
362
|
+
"em",
|
|
363
|
+
"u",
|
|
364
|
+
"i",
|
|
365
|
+
"b",
|
|
366
|
+
"s",
|
|
367
|
+
"sup",
|
|
368
|
+
"sub",
|
|
369
|
+
"h1",
|
|
370
|
+
"h2",
|
|
371
|
+
"h3",
|
|
372
|
+
"h4",
|
|
373
|
+
"h5",
|
|
374
|
+
"h6",
|
|
375
|
+
"ul",
|
|
376
|
+
"ol",
|
|
377
|
+
"li",
|
|
378
|
+
"dl",
|
|
379
|
+
"dt",
|
|
380
|
+
"dd",
|
|
381
|
+
"blockquote",
|
|
382
|
+
"pre",
|
|
383
|
+
"code",
|
|
384
|
+
"kbd",
|
|
385
|
+
"samp",
|
|
386
|
+
"a",
|
|
387
|
+
"img",
|
|
388
|
+
"table",
|
|
389
|
+
"thead",
|
|
390
|
+
"tbody",
|
|
391
|
+
"tr",
|
|
392
|
+
"td",
|
|
393
|
+
"th",
|
|
394
|
+
"div",
|
|
395
|
+
"span",
|
|
396
|
+
"section",
|
|
397
|
+
"article",
|
|
398
|
+
"aside",
|
|
399
|
+
"header",
|
|
400
|
+
"footer",
|
|
401
|
+
"hr"
|
|
402
|
+
]);
|
|
403
|
+
V($, "ALLOWED_ATTRIBUTES", {
|
|
404
|
+
"*": ["class", "id", "title", "lang", "dir"],
|
|
405
|
+
a: ["href", "target", "rel"],
|
|
406
|
+
img: ["src", "alt", "width", "height"],
|
|
407
|
+
table: ["cellpadding", "cellspacing", "border"],
|
|
408
|
+
td: ["colspan", "rowspan"],
|
|
409
|
+
th: ["colspan", "rowspan", "scope"]
|
|
410
|
+
});
|
|
411
|
+
var Se = Object.defineProperty, Ee = (i, e, t) => e in i ? Se(i, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : i[e] = t, Te = (i, e, t) => Ee(i, e + "", t);
|
|
412
|
+
class Y {
|
|
413
|
+
/**
|
|
414
|
+
* Validate HTML content in development mode
|
|
415
|
+
*/
|
|
416
|
+
static validate(e, t = {}) {
|
|
417
|
+
if (t.suppressWarnings)
|
|
418
|
+
return { isValid: !0, warnings: [] };
|
|
419
|
+
const r = [];
|
|
420
|
+
for (const { pattern: n, message: s } of this.SUSPICIOUS_PATTERNS)
|
|
421
|
+
n.test(e) && r.push(s);
|
|
422
|
+
return this.looksLikeUserInput(e) && r.push("Content appears to contain user input - ensure it's properly sanitized"), {
|
|
423
|
+
isValid: r.length === 0,
|
|
424
|
+
warnings: r
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
static looksLikeUserInput(e) {
|
|
428
|
+
return [
|
|
429
|
+
/<script/i,
|
|
430
|
+
// HTML-encoded script tags
|
|
431
|
+
/&#/,
|
|
432
|
+
// HTML entities that might be user input
|
|
433
|
+
/%3Cscript/i,
|
|
434
|
+
// URL-encoded script tags
|
|
435
|
+
/\{\{.*\}\}/,
|
|
436
|
+
// Template syntax
|
|
437
|
+
/\$\{.*\}/
|
|
438
|
+
// ES6 template literals
|
|
439
|
+
].some((r) => r.test(e));
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
Te(Y, "SUSPICIOUS_PATTERNS", [
|
|
443
|
+
{ pattern: /<script/i, message: "Script tags detected" },
|
|
444
|
+
{ pattern: /javascript:/i, message: "JavaScript URLs detected" },
|
|
445
|
+
{ pattern: /on\w+\s*=/i, message: "Event handlers detected" },
|
|
446
|
+
{ pattern: /<iframe/i, message: "Iframe elements detected" },
|
|
447
|
+
{ pattern: /<object/i, message: "Object elements detected" },
|
|
448
|
+
{ pattern: /<embed/i, message: "Embed elements detected" },
|
|
449
|
+
{ pattern: /<form/i, message: "Form elements detected" },
|
|
450
|
+
{ pattern: /data:.*script/i, message: "Data URLs with scripts detected" },
|
|
451
|
+
{ pattern: /@import/i, message: "CSS import statements detected" },
|
|
452
|
+
{ pattern: /expression\s*\(/i, message: "CSS expressions detected" }
|
|
453
|
+
]);
|
|
454
|
+
var _e = Object.defineProperty, Ae = (i, e, t) => e in i ? _e(i, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : i[e] = t, z = (i, e, t) => Ae(i, typeof e != "symbol" ? e + "" : e, t);
|
|
455
|
+
class Ce extends O {
|
|
456
|
+
// After layout, before styling
|
|
457
|
+
constructor(e = {}) {
|
|
458
|
+
super(e), z(this, "type", "asHTML"), z(this, "priority", 25);
|
|
459
|
+
}
|
|
460
|
+
apply(e, t) {
|
|
461
|
+
if (!t.element || !t.componentInstance) return;
|
|
462
|
+
const r = t.componentInstance;
|
|
463
|
+
if (!this.isTextComponent(r))
|
|
464
|
+
throw new Error(
|
|
465
|
+
`AsHTML modifier can only be applied to Text components. Found: ${r.type || "unknown"} component. Use Text('<your-html>').modifier.asHTML() instead.`
|
|
466
|
+
);
|
|
467
|
+
const n = this.getTextComponentContent(r);
|
|
468
|
+
if (!n) {
|
|
469
|
+
process.env.NODE_ENV === "development" && console.warn("asHTML: No content found in Text component");
|
|
470
|
+
return;
|
|
471
|
+
}
|
|
472
|
+
const s = this.sanitizeHTML(n);
|
|
473
|
+
for (; t.element.firstChild; )
|
|
474
|
+
t.element.removeChild(t.element.firstChild);
|
|
475
|
+
t.element.innerHTML = s, t.element.__tachui_asHTML = !0, process.env.NODE_ENV === "development" && this.validateContent(n);
|
|
476
|
+
}
|
|
477
|
+
isTextComponent(e) {
|
|
478
|
+
return e.type === "Text" || e.constructor?.name === "TextComponent" || e.__tachui_component_type === "Text" || e.props && e.props.__componentType === "Text" || // Check componentMetadata for enhanced Text components
|
|
479
|
+
e.componentMetadata && e.componentMetadata.type === "Text" || e.componentMetadata && e.componentMetadata.originalType === "Text";
|
|
480
|
+
}
|
|
481
|
+
getTextComponentContent(e) {
|
|
482
|
+
if (typeof e.content == "string")
|
|
483
|
+
return e.content;
|
|
484
|
+
if (e.props && typeof e.props.content == "string")
|
|
485
|
+
return e.props.content;
|
|
486
|
+
if (e.children && Array.isArray(e.children) && e.children.length > 0) {
|
|
487
|
+
const t = e.children[0];
|
|
488
|
+
if (t && t.type === "text" && typeof t.text == "string")
|
|
489
|
+
return t.text;
|
|
490
|
+
}
|
|
491
|
+
if (typeof e.text == "string")
|
|
492
|
+
return e.text;
|
|
493
|
+
if (e.props) {
|
|
494
|
+
if (typeof e.props.text == "string")
|
|
495
|
+
return e.props.text;
|
|
496
|
+
if (typeof e.props.children == "string")
|
|
497
|
+
return e.props.children;
|
|
498
|
+
}
|
|
499
|
+
return typeof e == "string" ? e : "";
|
|
500
|
+
}
|
|
501
|
+
sanitizeHTML(e) {
|
|
502
|
+
return !e || typeof e != "string" ? "" : this.properties.skipSanitizer ? e : this.properties.customSanitizer ? this.properties.customSanitizer(e) : $.sanitize(e, this.properties);
|
|
503
|
+
}
|
|
504
|
+
validateContent(e) {
|
|
505
|
+
if (this.properties.__suppressWarnings) return;
|
|
506
|
+
const t = Y.validate(e, {
|
|
507
|
+
suppressWarnings: this.properties.__suppressWarnings
|
|
508
|
+
});
|
|
509
|
+
!t.isValid && t.warnings.length > 0 && (console.group("🔒 AsHTML Security Warnings"), console.warn("Potentially dangerous content detected in asHTML:"), t.warnings.forEach((r) => {
|
|
510
|
+
console.warn(` • ${r}`);
|
|
511
|
+
}), console.warn("Consider using a more comprehensive sanitization solution like DOMPurify"), console.warn("To suppress these warnings, use { __suppressWarnings: true }"), console.groupEnd()), this.properties.skipSanitizer && console.warn("🚨 AsHTML: Sanitization is DISABLED. Ensure content is safe!");
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
function Me(i = {}) {
|
|
515
|
+
return new Ce(i);
|
|
516
|
+
}
|
|
517
|
+
const x = {
|
|
518
|
+
/**
|
|
519
|
+
* Set foreground (text) color
|
|
520
|
+
*/
|
|
521
|
+
foregroundColor(i) {
|
|
522
|
+
return new d({ foregroundColor: i });
|
|
523
|
+
},
|
|
524
|
+
/**
|
|
525
|
+
* Set frame dimensions with support for infinity
|
|
526
|
+
*/
|
|
527
|
+
frame(i, e, t) {
|
|
528
|
+
return new g({
|
|
529
|
+
frame: {
|
|
530
|
+
width: i,
|
|
531
|
+
height: e,
|
|
532
|
+
...t
|
|
533
|
+
}
|
|
534
|
+
});
|
|
535
|
+
},
|
|
536
|
+
/**
|
|
537
|
+
* Set padding on all sides
|
|
538
|
+
*/
|
|
539
|
+
padding(i) {
|
|
540
|
+
return new g({ padding: i });
|
|
541
|
+
},
|
|
542
|
+
/**
|
|
543
|
+
* Set margin on all sides
|
|
544
|
+
*/
|
|
545
|
+
margin(i) {
|
|
546
|
+
return new g({ margin: i });
|
|
547
|
+
},
|
|
548
|
+
/**
|
|
549
|
+
* Set content alignment
|
|
550
|
+
*/
|
|
551
|
+
alignment(i) {
|
|
552
|
+
return new g({ alignment: i });
|
|
553
|
+
},
|
|
554
|
+
/**
|
|
555
|
+
* Set layout priority for ZStack container sizing and flexible layout
|
|
556
|
+
* Higher priority views determine container size in ZStack
|
|
557
|
+
*/
|
|
558
|
+
layoutPriority(i) {
|
|
559
|
+
return new g({ layoutPriority: i });
|
|
560
|
+
}
|
|
561
|
+
}, f = {
|
|
562
|
+
/**
|
|
563
|
+
* Set foreground (text) color
|
|
564
|
+
*/
|
|
565
|
+
foregroundColor(i) {
|
|
566
|
+
return new d({ foregroundColor: i });
|
|
567
|
+
},
|
|
568
|
+
/**
|
|
569
|
+
* Set background color
|
|
570
|
+
*/
|
|
571
|
+
backgroundColor(i) {
|
|
572
|
+
return new d({ backgroundColor: i });
|
|
573
|
+
},
|
|
574
|
+
/**
|
|
575
|
+
* Set background (supports gradients)
|
|
576
|
+
*/
|
|
577
|
+
background(i) {
|
|
578
|
+
return new G({ background: i });
|
|
579
|
+
},
|
|
580
|
+
/**
|
|
581
|
+
* Set font properties
|
|
582
|
+
*/
|
|
583
|
+
font(i) {
|
|
584
|
+
return new d({ font: i });
|
|
585
|
+
},
|
|
586
|
+
/**
|
|
587
|
+
* Set font size
|
|
588
|
+
*/
|
|
589
|
+
fontSize(i) {
|
|
590
|
+
return new d({ font: { size: i } });
|
|
591
|
+
},
|
|
592
|
+
/**
|
|
593
|
+
* Set font weight
|
|
594
|
+
*/
|
|
595
|
+
fontWeight(i) {
|
|
596
|
+
return new d({ font: { weight: i } });
|
|
597
|
+
},
|
|
598
|
+
/**
|
|
599
|
+
* Set font family
|
|
600
|
+
*/
|
|
601
|
+
fontFamily(i) {
|
|
602
|
+
return new d({ font: { family: i } });
|
|
603
|
+
},
|
|
604
|
+
/**
|
|
605
|
+
* Set opacity
|
|
606
|
+
*/
|
|
607
|
+
opacity(i) {
|
|
608
|
+
return new d({ opacity: i });
|
|
609
|
+
},
|
|
610
|
+
/**
|
|
611
|
+
* Set corner radius (enhanced)
|
|
612
|
+
*/
|
|
613
|
+
cornerRadius(i) {
|
|
614
|
+
return new d({ cornerRadius: i });
|
|
615
|
+
},
|
|
616
|
+
/**
|
|
617
|
+
* Set border
|
|
618
|
+
*/
|
|
619
|
+
border(i, e = "#000000", t = "solid") {
|
|
620
|
+
return new d({
|
|
621
|
+
border: { width: i, color: e, style: t }
|
|
622
|
+
});
|
|
623
|
+
},
|
|
624
|
+
/**
|
|
625
|
+
* Set detailed border properties
|
|
626
|
+
*/
|
|
627
|
+
borderDetailed(i) {
|
|
628
|
+
return new d({ border: i });
|
|
629
|
+
}
|
|
630
|
+
// Shadow functionality moved to @tachui/effects package
|
|
631
|
+
}, A = {
|
|
632
|
+
/**
|
|
633
|
+
* Add tap handler
|
|
634
|
+
*/
|
|
635
|
+
onTap(i) {
|
|
636
|
+
return new l({ onTap: i });
|
|
637
|
+
},
|
|
638
|
+
/**
|
|
639
|
+
* Add hover handler
|
|
640
|
+
*/
|
|
641
|
+
onHover(i) {
|
|
642
|
+
return new l({ onHover: i });
|
|
643
|
+
},
|
|
644
|
+
/**
|
|
645
|
+
* Add focus handler
|
|
646
|
+
*/
|
|
647
|
+
onFocus(i) {
|
|
648
|
+
return new l({ onFocus: i });
|
|
649
|
+
},
|
|
650
|
+
/**
|
|
651
|
+
* Set disabled state
|
|
652
|
+
*/
|
|
653
|
+
disabled(i = !0) {
|
|
654
|
+
return new l({ disabled: i });
|
|
655
|
+
},
|
|
656
|
+
/**
|
|
657
|
+
* Set accessibility label
|
|
658
|
+
*/
|
|
659
|
+
accessibilityLabel(i) {
|
|
660
|
+
return new l({ accessibilityLabel: i });
|
|
661
|
+
},
|
|
662
|
+
/**
|
|
663
|
+
* Set accessibility hint
|
|
664
|
+
*/
|
|
665
|
+
accessibilityHint(i) {
|
|
666
|
+
return new l({ accessibilityHint: i });
|
|
667
|
+
}
|
|
668
|
+
}, D = {
|
|
669
|
+
/**
|
|
670
|
+
* Add transition
|
|
671
|
+
*/
|
|
672
|
+
transition(i = "all", e = 300, t = "ease", r = 0) {
|
|
673
|
+
return new m({
|
|
674
|
+
transition: { property: i, duration: e, easing: t, delay: r }
|
|
675
|
+
});
|
|
676
|
+
},
|
|
677
|
+
/**
|
|
678
|
+
* Add detailed transition
|
|
679
|
+
*/
|
|
680
|
+
transitionDetailed(i) {
|
|
681
|
+
return new m({ transition: i });
|
|
682
|
+
},
|
|
683
|
+
/**
|
|
684
|
+
* Add animation
|
|
685
|
+
*/
|
|
686
|
+
animation(i) {
|
|
687
|
+
return new m({ animation: i });
|
|
688
|
+
},
|
|
689
|
+
/**
|
|
690
|
+
* Add fade in animation
|
|
691
|
+
*/
|
|
692
|
+
fadeIn(i = 300) {
|
|
693
|
+
return new m({
|
|
694
|
+
animation: {
|
|
695
|
+
keyframes: {
|
|
696
|
+
"0%": { opacity: "0" },
|
|
697
|
+
"100%": { opacity: "1" }
|
|
698
|
+
},
|
|
699
|
+
duration: i,
|
|
700
|
+
easing: "ease-out"
|
|
701
|
+
}
|
|
702
|
+
});
|
|
703
|
+
},
|
|
704
|
+
/**
|
|
705
|
+
* Add fade out animation
|
|
706
|
+
*/
|
|
707
|
+
fadeOut(i = 300) {
|
|
708
|
+
return new m({
|
|
709
|
+
animation: {
|
|
710
|
+
keyframes: {
|
|
711
|
+
"0%": { opacity: "1" },
|
|
712
|
+
"100%": { opacity: "0" }
|
|
713
|
+
},
|
|
714
|
+
duration: i,
|
|
715
|
+
easing: "ease-in"
|
|
716
|
+
}
|
|
717
|
+
});
|
|
718
|
+
},
|
|
719
|
+
/**
|
|
720
|
+
* Add slide in animation
|
|
721
|
+
*/
|
|
722
|
+
slideIn(i = "up", e = 300, t = 20) {
|
|
723
|
+
const r = {
|
|
724
|
+
up: [`translateY(${t}px)`, "translateY(0)"],
|
|
725
|
+
down: [`translateY(-${t}px)`, "translateY(0)"],
|
|
726
|
+
left: [`translateX(${t}px)`, "translateX(0)"],
|
|
727
|
+
right: [`translateX(-${t}px)`, "translateX(0)"]
|
|
728
|
+
}, [n, s] = r[i];
|
|
729
|
+
return new m({
|
|
730
|
+
animation: {
|
|
731
|
+
keyframes: {
|
|
732
|
+
"0%": { transform: n, opacity: "0" },
|
|
733
|
+
"100%": { transform: s, opacity: "1" }
|
|
734
|
+
},
|
|
735
|
+
duration: e,
|
|
736
|
+
easing: "ease-out"
|
|
737
|
+
}
|
|
738
|
+
});
|
|
739
|
+
},
|
|
740
|
+
/**
|
|
741
|
+
* Add scale animation
|
|
742
|
+
*/
|
|
743
|
+
scaleAnimation(i = 0.8, e = 1, t = 300) {
|
|
744
|
+
return new m({
|
|
745
|
+
animation: {
|
|
746
|
+
keyframes: {
|
|
747
|
+
"0%": { transform: `scale(${i})`, opacity: "0" },
|
|
748
|
+
"100%": { transform: `scale(${e})`, opacity: "1" }
|
|
749
|
+
},
|
|
750
|
+
duration: t,
|
|
751
|
+
easing: "ease-out"
|
|
752
|
+
}
|
|
753
|
+
});
|
|
754
|
+
}
|
|
755
|
+
}, xe = {
|
|
756
|
+
/**
|
|
757
|
+
* Execute handler when component appears in viewport
|
|
758
|
+
*/
|
|
759
|
+
onAppear(i) {
|
|
760
|
+
return new w({ onAppear: i });
|
|
761
|
+
},
|
|
762
|
+
/**
|
|
763
|
+
* Execute handler when component disappears from viewport
|
|
764
|
+
*/
|
|
765
|
+
onDisappear(i) {
|
|
766
|
+
return new w({ onDisappear: i });
|
|
767
|
+
},
|
|
768
|
+
/**
|
|
769
|
+
* Execute async task with automatic cancellation on component unmount
|
|
770
|
+
*/
|
|
771
|
+
task(i, e) {
|
|
772
|
+
return new w({
|
|
773
|
+
task: {
|
|
774
|
+
operation: i,
|
|
775
|
+
id: e?.id,
|
|
776
|
+
priority: e?.priority || "default"
|
|
777
|
+
}
|
|
778
|
+
});
|
|
779
|
+
},
|
|
780
|
+
/**
|
|
781
|
+
* Add pull-to-refresh functionality
|
|
782
|
+
*/
|
|
783
|
+
refreshable(i, e) {
|
|
784
|
+
return new w({
|
|
785
|
+
refreshable: {
|
|
786
|
+
onRefresh: i,
|
|
787
|
+
isRefreshing: e
|
|
788
|
+
}
|
|
789
|
+
});
|
|
790
|
+
}
|
|
791
|
+
}, Le = {
|
|
792
|
+
/**
|
|
793
|
+
* Card-like appearance
|
|
794
|
+
*/
|
|
795
|
+
card(i = 16) {
|
|
796
|
+
return [
|
|
797
|
+
f.backgroundColor("#ffffff"),
|
|
798
|
+
f.cornerRadius(8),
|
|
799
|
+
// shadow moved to @tachui/effects package
|
|
800
|
+
x.padding(i)
|
|
801
|
+
];
|
|
802
|
+
},
|
|
803
|
+
/**
|
|
804
|
+
* Button-like appearance
|
|
805
|
+
*/
|
|
806
|
+
button(i = "#007AFF", e = "#ffffff") {
|
|
807
|
+
return [
|
|
808
|
+
f.backgroundColor(i),
|
|
809
|
+
f.foregroundColor(e),
|
|
810
|
+
f.cornerRadius(6),
|
|
811
|
+
x.padding(12),
|
|
812
|
+
// Simplified to single value for now
|
|
813
|
+
A.onHover((t) => {
|
|
814
|
+
}),
|
|
815
|
+
D.transition("all", 150)
|
|
816
|
+
];
|
|
817
|
+
},
|
|
818
|
+
/**
|
|
819
|
+
* Input field appearance
|
|
820
|
+
*/
|
|
821
|
+
input() {
|
|
822
|
+
return [
|
|
823
|
+
f.border(1, "#d1d5db"),
|
|
824
|
+
f.cornerRadius(4),
|
|
825
|
+
x.padding(8),
|
|
826
|
+
D.transition("border-color", 150),
|
|
827
|
+
A.onFocus((i) => {
|
|
828
|
+
})
|
|
829
|
+
];
|
|
830
|
+
},
|
|
831
|
+
/**
|
|
832
|
+
* Typography presets
|
|
833
|
+
*/
|
|
834
|
+
typography: {
|
|
835
|
+
title: () => [
|
|
836
|
+
f.fontSize(24),
|
|
837
|
+
f.fontWeight("bold")
|
|
838
|
+
],
|
|
839
|
+
heading: () => [
|
|
840
|
+
f.fontSize(20),
|
|
841
|
+
f.fontWeight("600")
|
|
842
|
+
],
|
|
843
|
+
body: () => [
|
|
844
|
+
f.fontSize(16),
|
|
845
|
+
f.fontWeight("normal")
|
|
846
|
+
],
|
|
847
|
+
caption: () => [
|
|
848
|
+
f.fontSize(12),
|
|
849
|
+
f.fontWeight("normal"),
|
|
850
|
+
f.opacity(0.7)
|
|
851
|
+
]
|
|
852
|
+
}
|
|
853
|
+
}, Ci = {
|
|
854
|
+
...x,
|
|
855
|
+
...f,
|
|
856
|
+
...A,
|
|
857
|
+
...D,
|
|
858
|
+
...xe,
|
|
859
|
+
presets: Le
|
|
860
|
+
};
|
|
861
|
+
var $e = Object.defineProperty, Pe = (i, e, t) => e in i ? $e(i, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : i[e] = t, Ie = (i, e, t) => Pe(i, e + "", t);
|
|
862
|
+
const a = (i) => ({
|
|
863
|
+
type: i,
|
|
864
|
+
priority: 50,
|
|
865
|
+
properties: {},
|
|
866
|
+
apply: () => {
|
|
867
|
+
}
|
|
868
|
+
}), Re = (...i) => a("borderBottom"), Ne = (...i) => a("borderLeft"), ke = (...i) => a("borderRight"), Be = (...i) => a("borderTop"), De = (...i) => a("alignItems"), He = (...i) => a("flexDirection"), Oe = (...i) => a("flexGrow"), Fe = (...i) => a("flexShrink"), Ve = (...i) => a("flexWrap"), We = (...i) => a("gap"), ze = (...i) => a("justifyContent"), N = (...i) => p("margin", ...i), je = (...i) => p("marginBottom", ...i), Ue = (...i) => p("marginHorizontal", ...i), qe = (...i) => p("marginLeft", ...i), Ge = (...i) => p("marginRight", ...i), Ye = (...i) => p("marginTop", ...i), Xe = (...i) => p("marginVertical", ...i), j = (...i) => p("padding", ...i), Je = (...i) => p("paddingBottom", ...i), Ke = (...i) => p("paddingHorizontal", ...i), Ze = (...i) => p("paddingLeading", ...i), Qe = (...i) => p("paddingLeft", ...i), et = (...i) => p("paddingRight", ...i), tt = (...i) => p("paddingTop", ...i), it = (...i) => p("paddingTrailing", ...i), rt = (...i) => p("paddingVertical", ...i), st = (...i) => p("height", ...i), nt = (...i) => p("maxHeight", ...i), ot = (...i) => p("maxWidth", ...i), at = (...i) => p("minHeight", ...i), ct = (...i) => p("minWidth", ...i), dt = (...i) => p("size", ...i), ut = (...i) => p("width", ...i), lt = (...i) => a("letterSpacing"), pt = (...i) => a("lineHeight"), ht = (...i) => a("overflow"), ft = (...i) => a("textAlign"), mt = (...i) => a("textDecoration"), gt = (...i) => a("textOverflow"), U = (i) => ({
|
|
869
|
+
type: "typography",
|
|
870
|
+
priority: 50,
|
|
871
|
+
properties: { transform: i },
|
|
872
|
+
apply: () => {
|
|
873
|
+
}
|
|
874
|
+
}), yt = (...i) => a("typography"), bt = (...i) => a("whiteSpace"), vt = (i) => ({
|
|
875
|
+
type: "backgroundClip",
|
|
876
|
+
priority: 50,
|
|
877
|
+
properties: {
|
|
878
|
+
backgroundImage: i,
|
|
879
|
+
backgroundClip: "text",
|
|
880
|
+
webkitBackgroundClip: "text",
|
|
881
|
+
color: "transparent",
|
|
882
|
+
webkitTextFillColor: "transparent"
|
|
883
|
+
},
|
|
884
|
+
apply: () => {
|
|
885
|
+
}
|
|
886
|
+
}), wt = (...i) => a("lineClamp"), St = (...i) => a("wordBreak"), Et = (...i) => a("overflowWrap"), Tt = (...i) => a("hyphens"), _t = (...i) => a("cursor"), At = (...i) => a("display"), Ct = (...i) => a("overflowX"), Mt = (...i) => a("overflowY"), xt = (...i) => a("outline"), Lt = (...i) => a("outlineOffset");
|
|
887
|
+
function p(i, ...e) {
|
|
888
|
+
const t = Qt.get(i);
|
|
889
|
+
if (t)
|
|
890
|
+
try {
|
|
891
|
+
return t.apply(null, e);
|
|
892
|
+
} catch (r) {
|
|
893
|
+
console.warn(`Error creating modifier '${i}':`, r);
|
|
894
|
+
}
|
|
895
|
+
return console.warn(`Modifier '${i}' not found in registry, using stub`), a(i);
|
|
896
|
+
}
|
|
897
|
+
const $t = (i = "all", e = 300, t = "ease", r = 0) => {
|
|
898
|
+
let n;
|
|
899
|
+
return i === "none" ? n = "none" : n = `${i} ${e}ms ${t} ${r}ms`, {
|
|
900
|
+
type: "transition",
|
|
901
|
+
priority: 60,
|
|
902
|
+
properties: { transition: n },
|
|
903
|
+
apply: () => {
|
|
904
|
+
}
|
|
905
|
+
};
|
|
906
|
+
}, Pt = (...i) => a("fadeTransition"), It = (...i) => a("transformTransition"), Rt = (...i) => a("colorTransition"), Nt = (...i) => a("layoutTransition"), kt = (...i) => a("buttonTransition"), Bt = (...i) => a("cardTransition"), Dt = (...i) => a("modalTransition"), Ht = (...i) => a("smoothTransition"), Ot = (...i) => a("quickTransition"), Ft = (...i) => a("slowTransition"), Vt = (...i) => a("scrollModifier"), Wt = (...i) => a("scrollBehavior"), zt = (...i) => a("overscrollBehavior"), jt = (...i) => a("overscrollBehaviorX"), Ut = (...i) => a("overscrollBehaviorY"), qt = (...i) => a("scrollMargin"), Gt = (...i) => a("scrollPadding"), Yt = (...i) => a("scrollSnap");
|
|
907
|
+
class Xt {
|
|
908
|
+
constructor(e) {
|
|
909
|
+
this.component = e, Ie(this, "modifiers", []);
|
|
910
|
+
}
|
|
911
|
+
frame(e, t) {
|
|
912
|
+
let r;
|
|
913
|
+
return typeof e == "object" ? r = e : (r = {}, e !== void 0 && (r.width = e), t !== void 0 && (r.height = t)), this.modifiers.push(new g({ frame: r })), this;
|
|
914
|
+
}
|
|
915
|
+
margin(e) {
|
|
916
|
+
if (typeof e == "number" || typeof e == "string")
|
|
917
|
+
this.modifiers.push(N(e));
|
|
918
|
+
else {
|
|
919
|
+
const t = e;
|
|
920
|
+
t.vertical !== void 0 || t.horizontal !== void 0 ? this.modifiers.push(
|
|
921
|
+
N({
|
|
922
|
+
vertical: t.vertical,
|
|
923
|
+
horizontal: t.horizontal
|
|
924
|
+
})
|
|
925
|
+
) : (t.top !== void 0 || t.right !== void 0 || t.bottom !== void 0 || t.left !== void 0) && this.modifiers.push(
|
|
926
|
+
N({
|
|
927
|
+
top: t.top,
|
|
928
|
+
right: t.right,
|
|
929
|
+
bottom: t.bottom,
|
|
930
|
+
left: t.left
|
|
931
|
+
})
|
|
932
|
+
);
|
|
933
|
+
}
|
|
934
|
+
return this;
|
|
935
|
+
}
|
|
936
|
+
layoutPriority(e) {
|
|
937
|
+
return this.modifiers.push(new g({ layoutPriority: e })), this;
|
|
938
|
+
}
|
|
939
|
+
// New multi-property modifiers
|
|
940
|
+
size(e) {
|
|
941
|
+
return this.modifiers.push(dt(e)), this;
|
|
942
|
+
}
|
|
943
|
+
width(e) {
|
|
944
|
+
return this.modifiers.push(ut(e)), this;
|
|
945
|
+
}
|
|
946
|
+
height(e) {
|
|
947
|
+
return this.modifiers.push(st(e)), this;
|
|
948
|
+
}
|
|
949
|
+
maxWidth(e) {
|
|
950
|
+
return this.modifiers.push(ot(e)), this;
|
|
951
|
+
}
|
|
952
|
+
minWidth(e) {
|
|
953
|
+
return this.modifiers.push(ct(e)), this;
|
|
954
|
+
}
|
|
955
|
+
maxHeight(e) {
|
|
956
|
+
return this.modifiers.push(nt(e)), this;
|
|
957
|
+
}
|
|
958
|
+
minHeight(e) {
|
|
959
|
+
return this.modifiers.push(at(e)), this;
|
|
960
|
+
}
|
|
961
|
+
marginTop(e) {
|
|
962
|
+
return this.modifiers.push(Ye(e)), this;
|
|
963
|
+
}
|
|
964
|
+
marginBottom(e) {
|
|
965
|
+
return this.modifiers.push(je(e)), this;
|
|
966
|
+
}
|
|
967
|
+
marginHorizontal(e) {
|
|
968
|
+
return this.modifiers.push(Ue(e)), this;
|
|
969
|
+
}
|
|
970
|
+
marginVertical(e) {
|
|
971
|
+
return this.modifiers.push(Xe(e)), this;
|
|
972
|
+
}
|
|
973
|
+
marginLeft(e) {
|
|
974
|
+
return this.modifiers.push(qe(e)), this;
|
|
975
|
+
}
|
|
976
|
+
marginRight(e) {
|
|
977
|
+
return this.modifiers.push(Ge(e)), this;
|
|
978
|
+
}
|
|
979
|
+
padding(e) {
|
|
980
|
+
return typeof e == "number" ? this.modifiers.push(j(e)) : this.modifiers.push(j(e)), this;
|
|
981
|
+
}
|
|
982
|
+
paddingTop(e) {
|
|
983
|
+
return this.modifiers.push(tt(e)), this;
|
|
984
|
+
}
|
|
985
|
+
paddingBottom(e) {
|
|
986
|
+
return this.modifiers.push(Je(e)), this;
|
|
987
|
+
}
|
|
988
|
+
paddingLeft(e) {
|
|
989
|
+
return this.modifiers.push(Qe(e)), this;
|
|
990
|
+
}
|
|
991
|
+
paddingRight(e) {
|
|
992
|
+
return this.modifiers.push(et(e)), this;
|
|
993
|
+
}
|
|
994
|
+
paddingLeading(e) {
|
|
995
|
+
return this.modifiers.push(Ze(e)), this;
|
|
996
|
+
}
|
|
997
|
+
paddingTrailing(e) {
|
|
998
|
+
return this.modifiers.push(it(e)), this;
|
|
999
|
+
}
|
|
1000
|
+
paddingHorizontal(e) {
|
|
1001
|
+
return this.modifiers.push(Ke(e)), this;
|
|
1002
|
+
}
|
|
1003
|
+
paddingVertical(e) {
|
|
1004
|
+
return this.modifiers.push(rt(e)), this;
|
|
1005
|
+
}
|
|
1006
|
+
// Typography modifiers
|
|
1007
|
+
typography(e) {
|
|
1008
|
+
return this.modifiers.push(yt(e)), this;
|
|
1009
|
+
}
|
|
1010
|
+
textAlign(e) {
|
|
1011
|
+
return this.modifiers.push(ft(e)), this;
|
|
1012
|
+
}
|
|
1013
|
+
textTransform(e) {
|
|
1014
|
+
return this.modifiers.push(U(e)), this;
|
|
1015
|
+
}
|
|
1016
|
+
gradientText(e) {
|
|
1017
|
+
return this.modifiers.push(vt(e)), this;
|
|
1018
|
+
}
|
|
1019
|
+
// Text Modifiers
|
|
1020
|
+
lineClamp(e) {
|
|
1021
|
+
return this.modifiers.push(wt(e)), this;
|
|
1022
|
+
}
|
|
1023
|
+
wordBreak(e) {
|
|
1024
|
+
return this.modifiers.push(St(e)), this;
|
|
1025
|
+
}
|
|
1026
|
+
overflowWrap(e) {
|
|
1027
|
+
return this.modifiers.push(Et(e)), this;
|
|
1028
|
+
}
|
|
1029
|
+
hyphens(e) {
|
|
1030
|
+
return this.modifiers.push(Tt(e)), this;
|
|
1031
|
+
}
|
|
1032
|
+
// position() and zIndex() methods have been migrated to @tachui/modifiers/layout
|
|
1033
|
+
// for enhanced SwiftUI-compatible functionality
|
|
1034
|
+
// Backdrop filter modifiers - moved to @tachui/effects but keeping stubs for compatibility
|
|
1035
|
+
backdropFilter() {
|
|
1036
|
+
throw process.env.NODE_ENV === "development" && console.warn(
|
|
1037
|
+
"backdropFilter has been moved to @tachui/effects. Install @tachui/effects and use .apply(backdropFilter(...)) instead."
|
|
1038
|
+
), new Error(
|
|
1039
|
+
"backdropFilter is no longer available in @tachui/core. Please install @tachui/effects."
|
|
1040
|
+
);
|
|
1041
|
+
}
|
|
1042
|
+
glassmorphism() {
|
|
1043
|
+
throw process.env.NODE_ENV === "development" && console.warn(
|
|
1044
|
+
"glassmorphism has been moved to @tachui/effects. Install @tachui/effects and use .apply(glassmorphism(...)) instead."
|
|
1045
|
+
), new Error(
|
|
1046
|
+
"glassmorphism is no longer available in @tachui/core. Please install @tachui/effects."
|
|
1047
|
+
);
|
|
1048
|
+
}
|
|
1049
|
+
letterSpacing(e) {
|
|
1050
|
+
return this.modifiers.push(lt(e)), this;
|
|
1051
|
+
}
|
|
1052
|
+
lineHeight(e) {
|
|
1053
|
+
return this.modifiers.push(pt(e)), this;
|
|
1054
|
+
}
|
|
1055
|
+
textOverflow(e) {
|
|
1056
|
+
return this.modifiers.push(gt(e)), this;
|
|
1057
|
+
}
|
|
1058
|
+
whiteSpace(e) {
|
|
1059
|
+
return this.modifiers.push(bt(e)), this;
|
|
1060
|
+
}
|
|
1061
|
+
overflow(e) {
|
|
1062
|
+
return this.modifiers.push(ht(e)), this;
|
|
1063
|
+
}
|
|
1064
|
+
// Border modifiers
|
|
1065
|
+
borderTop(e, t, r) {
|
|
1066
|
+
return this.modifiers.push(Be(e, t, r)), this;
|
|
1067
|
+
}
|
|
1068
|
+
borderRight(e, t, r) {
|
|
1069
|
+
return this.modifiers.push(ke(e, t, r)), this;
|
|
1070
|
+
}
|
|
1071
|
+
borderBottom(e, t, r) {
|
|
1072
|
+
return this.modifiers.push(Re(e, t, r)), this;
|
|
1073
|
+
}
|
|
1074
|
+
borderLeft(e, t, r) {
|
|
1075
|
+
return this.modifiers.push(Ne(e, t, r)), this;
|
|
1076
|
+
}
|
|
1077
|
+
// Flexbox modifiers
|
|
1078
|
+
flexGrow(e) {
|
|
1079
|
+
return this.modifiers.push(Oe(e)), this;
|
|
1080
|
+
}
|
|
1081
|
+
flexShrink(e) {
|
|
1082
|
+
return this.modifiers.push(Fe(e)), this;
|
|
1083
|
+
}
|
|
1084
|
+
justifyContent(e) {
|
|
1085
|
+
return this.modifiers.push(ze(e)), this;
|
|
1086
|
+
}
|
|
1087
|
+
alignItems(e) {
|
|
1088
|
+
return this.modifiers.push(De(e)), this;
|
|
1089
|
+
}
|
|
1090
|
+
gap(e) {
|
|
1091
|
+
return this.modifiers.push(We(e)), this;
|
|
1092
|
+
}
|
|
1093
|
+
flexDirection(e) {
|
|
1094
|
+
return this.modifiers.push(He(e)), this;
|
|
1095
|
+
}
|
|
1096
|
+
flexWrap(e) {
|
|
1097
|
+
return this.modifiers.push(Ve(e)), this;
|
|
1098
|
+
}
|
|
1099
|
+
// Utility modifiers
|
|
1100
|
+
cursor(e) {
|
|
1101
|
+
return this.modifiers.push(_t(e)), this;
|
|
1102
|
+
}
|
|
1103
|
+
overflowY(e) {
|
|
1104
|
+
return this.modifiers.push(Mt(e)), this;
|
|
1105
|
+
}
|
|
1106
|
+
overflowX(e) {
|
|
1107
|
+
return this.modifiers.push(Ct(e)), this;
|
|
1108
|
+
}
|
|
1109
|
+
outline(e) {
|
|
1110
|
+
return this.modifiers.push(xt(e)), this;
|
|
1111
|
+
}
|
|
1112
|
+
outlineOffset(e) {
|
|
1113
|
+
return this.modifiers.push(Lt(e)), this;
|
|
1114
|
+
}
|
|
1115
|
+
display(e) {
|
|
1116
|
+
return this.modifiers.push(At(e)), this;
|
|
1117
|
+
}
|
|
1118
|
+
// Raw CSS modifiers - using imported functions from ./css
|
|
1119
|
+
css(e) {
|
|
1120
|
+
return this.modifiers.push(me(e)), this;
|
|
1121
|
+
}
|
|
1122
|
+
cssProperty(e, t) {
|
|
1123
|
+
return this.modifiers.push(ge(e, t)), this;
|
|
1124
|
+
}
|
|
1125
|
+
cssVariable(e, t) {
|
|
1126
|
+
return this.modifiers.push(ye(e, t)), this;
|
|
1127
|
+
}
|
|
1128
|
+
cssVendor(e, t, r) {
|
|
1129
|
+
return this.modifiers.push(be(e, t, r)), this;
|
|
1130
|
+
}
|
|
1131
|
+
textCase(e) {
|
|
1132
|
+
return this.modifiers.push(U(e)), this;
|
|
1133
|
+
}
|
|
1134
|
+
aspectRatio(e, t = "fit") {
|
|
1135
|
+
throw new Error(
|
|
1136
|
+
'Layout modifiers have been moved to @tachui/modifiers. Please import { aspectRatio } from "@tachui/modifiers" and use it directly instead of chaining it on components.'
|
|
1137
|
+
);
|
|
1138
|
+
}
|
|
1139
|
+
textDecoration(e) {
|
|
1140
|
+
return this.modifiers.push(mt(e)), this;
|
|
1141
|
+
}
|
|
1142
|
+
// Phase 1 SwiftUI modifiers
|
|
1143
|
+
// Note: clipped() has been moved to @tachui/modifiers
|
|
1144
|
+
// Phase 2 SwiftUI modifiers
|
|
1145
|
+
// Note: clipShape() and overlay() have been moved to @tachui/modifiers
|
|
1146
|
+
// Phase 3 SwiftUI modifiers - Critical Transform Modifiers
|
|
1147
|
+
absolutePosition(e, t) {
|
|
1148
|
+
return this.modifiers.push(
|
|
1149
|
+
new g({
|
|
1150
|
+
position: {
|
|
1151
|
+
x: e,
|
|
1152
|
+
y: t
|
|
1153
|
+
}
|
|
1154
|
+
})
|
|
1155
|
+
), this;
|
|
1156
|
+
}
|
|
1157
|
+
// Appearance modifiers
|
|
1158
|
+
foregroundColor(e) {
|
|
1159
|
+
return this.modifiers.push(new d({ foregroundColor: e })), this;
|
|
1160
|
+
}
|
|
1161
|
+
backgroundColor(e) {
|
|
1162
|
+
return this.modifiers.push(new d({ backgroundColor: e })), this;
|
|
1163
|
+
}
|
|
1164
|
+
background(e) {
|
|
1165
|
+
return this.modifiers.push(new G({ background: e })), this;
|
|
1166
|
+
}
|
|
1167
|
+
font(e) {
|
|
1168
|
+
let t;
|
|
1169
|
+
return typeof e == "object" ? t = e : t = e !== void 0 ? { size: e } : {}, this.modifiers.push(new d({ font: t })), this;
|
|
1170
|
+
}
|
|
1171
|
+
fontWeight(e) {
|
|
1172
|
+
return this.modifiers.push(new d({ font: { weight: e } })), this;
|
|
1173
|
+
}
|
|
1174
|
+
fontSize(e) {
|
|
1175
|
+
return this.modifiers.push(new d({ font: { size: e } })), this;
|
|
1176
|
+
}
|
|
1177
|
+
fontFamily(e) {
|
|
1178
|
+
return this.modifiers.push(new d({ font: { family: e } })), this;
|
|
1179
|
+
}
|
|
1180
|
+
opacity(e) {
|
|
1181
|
+
return this.modifiers.push(new d({ opacity: e })), this;
|
|
1182
|
+
}
|
|
1183
|
+
cornerRadius(e) {
|
|
1184
|
+
return this.modifiers.push(new d({ cornerRadius: e })), this;
|
|
1185
|
+
}
|
|
1186
|
+
border(e, t) {
|
|
1187
|
+
let r;
|
|
1188
|
+
return typeof e == "object" ? r = e : r = {
|
|
1189
|
+
style: "solid",
|
|
1190
|
+
...e !== void 0 && { width: e },
|
|
1191
|
+
...t !== void 0 && { color: t }
|
|
1192
|
+
}, this.modifiers.push(new d({ border: r })), this;
|
|
1193
|
+
}
|
|
1194
|
+
borderWidth(e) {
|
|
1195
|
+
return this.modifiers.push(new d({ border: { width: e } })), this;
|
|
1196
|
+
}
|
|
1197
|
+
// Shadow functionality moved to @tachui/effects package
|
|
1198
|
+
// Visual Effects Modifiers (Phase 2 - Epic: Butternut)
|
|
1199
|
+
blur(e) {
|
|
1200
|
+
return this.modifiers.push(new d({ blur: e })), this;
|
|
1201
|
+
}
|
|
1202
|
+
brightness(e) {
|
|
1203
|
+
return this.modifiers.push(new d({ brightness: e })), this;
|
|
1204
|
+
}
|
|
1205
|
+
contrast(e) {
|
|
1206
|
+
return this.modifiers.push(new d({ contrast: e })), this;
|
|
1207
|
+
}
|
|
1208
|
+
saturation(e) {
|
|
1209
|
+
return this.modifiers.push(new d({ saturation: e })), this;
|
|
1210
|
+
}
|
|
1211
|
+
hueRotation(e) {
|
|
1212
|
+
return this.modifiers.push(new d({ hueRotation: e })), this;
|
|
1213
|
+
}
|
|
1214
|
+
grayscale(e) {
|
|
1215
|
+
return this.modifiers.push(new d({ grayscale: e })), this;
|
|
1216
|
+
}
|
|
1217
|
+
colorInvert(e = 1) {
|
|
1218
|
+
return this.modifiers.push(new d({ colorInvert: e })), this;
|
|
1219
|
+
}
|
|
1220
|
+
// ============================================================================
|
|
1221
|
+
// VISUAL EFFECTS MOVED TO @tachui/effects PACKAGE
|
|
1222
|
+
// ============================================================================
|
|
1223
|
+
//
|
|
1224
|
+
// Visual effects have been extracted to @tachui/effects for better tree-shaking
|
|
1225
|
+
// Visual effects methods removed - use @tachui/effects package
|
|
1226
|
+
// Phase 4 Advanced Gesture Modifiers moved to @tachui/modifiers
|
|
1227
|
+
// Use: import { onLongPressGesture } from '@tachui/modifiers'
|
|
1228
|
+
onLongPressGesture(e) {
|
|
1229
|
+
throw new Error(
|
|
1230
|
+
'onLongPressGesture has been moved to @tachui/modifiers. Please import { onLongPressGesture } from "@tachui/modifiers" and use .apply(onLongPressGesture(...)) instead.'
|
|
1231
|
+
);
|
|
1232
|
+
}
|
|
1233
|
+
keyboardShortcut(e, t, r) {
|
|
1234
|
+
throw new Error(
|
|
1235
|
+
'keyboardShortcut has been moved to @tachui/modifiers. Please import { keyboardShortcut } from "@tachui/modifiers" and use .apply(keyboardShortcut(...)) instead.'
|
|
1236
|
+
);
|
|
1237
|
+
}
|
|
1238
|
+
focused(e) {
|
|
1239
|
+
throw new Error(
|
|
1240
|
+
'focused has been moved to @tachui/modifiers. Please import { focused } from "@tachui/modifiers" and use .apply(focused(...)) instead.'
|
|
1241
|
+
);
|
|
1242
|
+
}
|
|
1243
|
+
focusable(e = !0, t) {
|
|
1244
|
+
throw new Error(
|
|
1245
|
+
'focusable has been moved to @tachui/modifiers. Please import { focusable } from "@tachui/modifiers" and use .apply(focusable(...)) instead.'
|
|
1246
|
+
);
|
|
1247
|
+
}
|
|
1248
|
+
onContinuousHover(e, t) {
|
|
1249
|
+
throw new Error(
|
|
1250
|
+
'onContinuousHover has been moved to @tachui/modifiers. Please import { onContinuousHover } from "@tachui/modifiers" and use .apply(onContinuousHover(...)) instead.'
|
|
1251
|
+
);
|
|
1252
|
+
}
|
|
1253
|
+
highPriorityGesture(e, t) {
|
|
1254
|
+
return this.modifiers.push(
|
|
1255
|
+
new l({
|
|
1256
|
+
highPriorityGesture: { gesture: e, including: t }
|
|
1257
|
+
})
|
|
1258
|
+
), this;
|
|
1259
|
+
}
|
|
1260
|
+
simultaneousGesture(e, t) {
|
|
1261
|
+
return this.modifiers.push(
|
|
1262
|
+
new l({
|
|
1263
|
+
simultaneousGesture: { gesture: e, including: t }
|
|
1264
|
+
})
|
|
1265
|
+
), this;
|
|
1266
|
+
}
|
|
1267
|
+
allowsHitTesting(e) {
|
|
1268
|
+
throw new Error(
|
|
1269
|
+
'allowsHitTesting has been moved to @tachui/modifiers. Please import { allowsHitTesting } from "@tachui/modifiers" and use .apply(allowsHitTesting(...)) instead.'
|
|
1270
|
+
);
|
|
1271
|
+
}
|
|
1272
|
+
// Animation modifiers
|
|
1273
|
+
transform(e) {
|
|
1274
|
+
return this.modifiers.push(new m({ transform: e })), this;
|
|
1275
|
+
}
|
|
1276
|
+
animation(e) {
|
|
1277
|
+
return this.modifiers.push(new m({ animation: e })), this;
|
|
1278
|
+
}
|
|
1279
|
+
// Lifecycle modifiers
|
|
1280
|
+
task(e, t) {
|
|
1281
|
+
return this.modifiers.push(
|
|
1282
|
+
new w({
|
|
1283
|
+
task: {
|
|
1284
|
+
operation: e,
|
|
1285
|
+
id: t?.id,
|
|
1286
|
+
priority: t?.priority || "default"
|
|
1287
|
+
}
|
|
1288
|
+
})
|
|
1289
|
+
), this;
|
|
1290
|
+
}
|
|
1291
|
+
// Custom modifier application
|
|
1292
|
+
modifier(e) {
|
|
1293
|
+
return this.modifiers.push(e), this;
|
|
1294
|
+
}
|
|
1295
|
+
// Resizable modifier for images
|
|
1296
|
+
resizable() {
|
|
1297
|
+
return this.modifiers.push(new Q({})), this;
|
|
1298
|
+
}
|
|
1299
|
+
// Responsive Design Methods
|
|
1300
|
+
/**
|
|
1301
|
+
* Add modifier to internal list (used by responsive builder)
|
|
1302
|
+
*/
|
|
1303
|
+
addModifier(e) {
|
|
1304
|
+
if (this.modifiers.push(e), "modifiers" in this.component && Array.isArray(this.component.modifiers)) {
|
|
1305
|
+
const t = this.component;
|
|
1306
|
+
t.modifiers = [
|
|
1307
|
+
...t.modifiers,
|
|
1308
|
+
e
|
|
1309
|
+
];
|
|
1310
|
+
}
|
|
1311
|
+
}
|
|
1312
|
+
// Responsive functionality moved to @tachui/responsive package
|
|
1313
|
+
// Interaction modifiers
|
|
1314
|
+
onTap(e) {
|
|
1315
|
+
return this.modifiers.push(A.onTap(e)), this;
|
|
1316
|
+
}
|
|
1317
|
+
onFocus(e) {
|
|
1318
|
+
return this.modifiers.push(A.onFocus(e)), this;
|
|
1319
|
+
}
|
|
1320
|
+
onBlur(e) {
|
|
1321
|
+
return this.modifiers.push(new l({ onBlur: e })), this;
|
|
1322
|
+
}
|
|
1323
|
+
onKeyDown(e) {
|
|
1324
|
+
return this.modifiers.push(new l({ onKeyDown: e })), this;
|
|
1325
|
+
}
|
|
1326
|
+
onScroll(e) {
|
|
1327
|
+
return this.modifiers.push(new l({ onScroll: e })), this;
|
|
1328
|
+
}
|
|
1329
|
+
onKeyPress(e) {
|
|
1330
|
+
return this.modifiers.push(new l({ onKeyPress: e })), this;
|
|
1331
|
+
}
|
|
1332
|
+
onKeyUp(e) {
|
|
1333
|
+
return this.modifiers.push(new l({ onKeyUp: e })), this;
|
|
1334
|
+
}
|
|
1335
|
+
onDoubleClick(e) {
|
|
1336
|
+
return this.modifiers.push(new l({ onDoubleClick: e })), this;
|
|
1337
|
+
}
|
|
1338
|
+
onContextMenu(e) {
|
|
1339
|
+
return this.modifiers.push(new l({ onContextMenu: e })), this;
|
|
1340
|
+
}
|
|
1341
|
+
onWheel(e) {
|
|
1342
|
+
return this.modifiers.push(new l({ onWheel: e })), this;
|
|
1343
|
+
}
|
|
1344
|
+
onInput(e) {
|
|
1345
|
+
return this.modifiers.push(new l({ onInput: e })), this;
|
|
1346
|
+
}
|
|
1347
|
+
onChange(e) {
|
|
1348
|
+
return this.modifiers.push(new l({ onChange: e })), this;
|
|
1349
|
+
}
|
|
1350
|
+
onCopy(e) {
|
|
1351
|
+
return this.modifiers.push(new l({ onCopy: e })), this;
|
|
1352
|
+
}
|
|
1353
|
+
onCut(e) {
|
|
1354
|
+
return this.modifiers.push(new l({ onCut: e })), this;
|
|
1355
|
+
}
|
|
1356
|
+
onPaste(e) {
|
|
1357
|
+
return this.modifiers.push(new l({ onPaste: e })), this;
|
|
1358
|
+
}
|
|
1359
|
+
onSelect(e) {
|
|
1360
|
+
return this.modifiers.push(new l({ onSelect: e })), this;
|
|
1361
|
+
}
|
|
1362
|
+
// Transition modifiers
|
|
1363
|
+
transition(e = "all", t = 300, r = "ease", n = 0) {
|
|
1364
|
+
return this.modifiers.push($t(e, t, r, n)), this;
|
|
1365
|
+
}
|
|
1366
|
+
// HTML and ARIA Attributes - MIGRATED TO @tachui/modifiers
|
|
1367
|
+
id(e) {
|
|
1368
|
+
throw new Error(
|
|
1369
|
+
'Attribute modifiers have been moved to @tachui/modifiers. Please import { id } from "@tachui/modifiers" and use it directly instead of chaining it on components.'
|
|
1370
|
+
);
|
|
1371
|
+
}
|
|
1372
|
+
data(e) {
|
|
1373
|
+
throw new Error(
|
|
1374
|
+
'Attribute modifiers have been moved to @tachui/modifiers. Please import { data } from "@tachui/modifiers" and use it directly instead of chaining it on components.'
|
|
1375
|
+
);
|
|
1376
|
+
}
|
|
1377
|
+
aria(e) {
|
|
1378
|
+
throw new Error(
|
|
1379
|
+
'Attribute modifiers have been moved to @tachui/modifiers. Please import { aria } from "@tachui/modifiers" and use it directly instead of chaining it on components.'
|
|
1380
|
+
);
|
|
1381
|
+
}
|
|
1382
|
+
tabIndex(e) {
|
|
1383
|
+
throw new Error(
|
|
1384
|
+
'Attribute modifiers have been moved to @tachui/modifiers. Please import { tabIndex } from "@tachui/modifiers" and use it directly instead of chaining it on components.'
|
|
1385
|
+
);
|
|
1386
|
+
}
|
|
1387
|
+
customProperties(e) {
|
|
1388
|
+
throw new Error(
|
|
1389
|
+
'CSS property modifiers have been moved to @tachui/modifiers. Please import { customProperties } from "@tachui/modifiers" and use it directly instead of chaining it on components.'
|
|
1390
|
+
);
|
|
1391
|
+
}
|
|
1392
|
+
customProperty(e, t) {
|
|
1393
|
+
throw new Error(
|
|
1394
|
+
'CSS property modifiers have been moved to @tachui/modifiers. Please import { customProperty } from "@tachui/modifiers" and use it directly instead of chaining it on components.'
|
|
1395
|
+
);
|
|
1396
|
+
}
|
|
1397
|
+
cssVariables(e) {
|
|
1398
|
+
throw new Error(
|
|
1399
|
+
'CSS property modifiers have been moved to @tachui/modifiers. Please import { cssVariables } from "@tachui/modifiers" and use it directly instead of chaining it on components.'
|
|
1400
|
+
);
|
|
1401
|
+
}
|
|
1402
|
+
themeColors(e) {
|
|
1403
|
+
throw new Error(
|
|
1404
|
+
'Theme modifiers have been moved to @tachui/modifiers. Please import { themeColors } from "@tachui/modifiers" and use it directly instead of chaining it on components.'
|
|
1405
|
+
);
|
|
1406
|
+
}
|
|
1407
|
+
designTokens(e) {
|
|
1408
|
+
throw new Error(
|
|
1409
|
+
'Design token modifiers have been moved to @tachui/modifiers. Please import { designTokens } from "@tachui/modifiers" and use it directly instead of chaining it on components.'
|
|
1410
|
+
);
|
|
1411
|
+
}
|
|
1412
|
+
// State modifiers
|
|
1413
|
+
disabled(e = !0) {
|
|
1414
|
+
return this.modifiers.push(new l({ disabled: e })), this;
|
|
1415
|
+
}
|
|
1416
|
+
// HTML Content Rendering (Text components only)
|
|
1417
|
+
asHTML(e) {
|
|
1418
|
+
return this.modifiers.push(Me(e)), this;
|
|
1419
|
+
}
|
|
1420
|
+
// Build the final component with all modifiers applied
|
|
1421
|
+
build() {
|
|
1422
|
+
if ("modifiers" in this.component) {
|
|
1423
|
+
const e = this.component, t = this.modifiers.filter(
|
|
1424
|
+
(r) => !e.modifiers.some(
|
|
1425
|
+
(n) => n === r
|
|
1426
|
+
// Reference equality check
|
|
1427
|
+
)
|
|
1428
|
+
);
|
|
1429
|
+
return e.modifiers = [
|
|
1430
|
+
...e.modifiers,
|
|
1431
|
+
...t
|
|
1432
|
+
], process.env.NODE_ENV === "test" && this.applyModifiersToPropsForTesting(e, [
|
|
1433
|
+
...e.modifiers
|
|
1434
|
+
]), this.component;
|
|
1435
|
+
} else {
|
|
1436
|
+
const e = oi(
|
|
1437
|
+
this.component,
|
|
1438
|
+
this.modifiers
|
|
1439
|
+
);
|
|
1440
|
+
return process.env.NODE_ENV === "test" && this.applyModifiersToPropsForTesting(
|
|
1441
|
+
e,
|
|
1442
|
+
this.modifiers
|
|
1443
|
+
), e;
|
|
1444
|
+
}
|
|
1445
|
+
}
|
|
1446
|
+
applyModifiersToPropsForTesting(e, t) {
|
|
1447
|
+
e.props || (e.props = {}), t.forEach((r) => {
|
|
1448
|
+
if (r.type === "aria") {
|
|
1449
|
+
const s = r.properties?.aria || {};
|
|
1450
|
+
Object.entries(s).forEach(([o, c]) => {
|
|
1451
|
+
if (c != null)
|
|
1452
|
+
if (o === "role")
|
|
1453
|
+
e.props.role = c;
|
|
1454
|
+
else {
|
|
1455
|
+
const u = o.startsWith("aria-") ? o : `aria-${o}`;
|
|
1456
|
+
e.props[u] = typeof c == "boolean" ? c : String(c);
|
|
1457
|
+
}
|
|
1458
|
+
});
|
|
1459
|
+
} else if (r.type === "interaction") {
|
|
1460
|
+
const s = r.properties;
|
|
1461
|
+
Object.entries(s).forEach(([o, c]) => {
|
|
1462
|
+
typeof c == "function" && (e.props[o] = c);
|
|
1463
|
+
}), (s.onSwipeLeft || s.onSwipeRight) && (e.props.onTouchStart = () => {
|
|
1464
|
+
});
|
|
1465
|
+
} else if (r.type === "utility") {
|
|
1466
|
+
const s = r.properties;
|
|
1467
|
+
e.props.style || (e.props.style = {}), Object.entries(s).forEach(([o, c]) => {
|
|
1468
|
+
c != null && (e.props.style[o] = c);
|
|
1469
|
+
});
|
|
1470
|
+
} else if (r.type === "tabIndex") {
|
|
1471
|
+
const n = r;
|
|
1472
|
+
e.props.tabIndex = n.properties?.tabIndex;
|
|
1473
|
+
} else if (r.type === "appearance") {
|
|
1474
|
+
const s = r.properties;
|
|
1475
|
+
e.props.style || (e.props.style = {}), s.backgroundColor && (e.props.style.backgroundColor = s.backgroundColor), s.foregroundColor && (e.props.style.color = s.foregroundColor), s.opacity !== void 0 && (e.props.style.opacity = s.opacity), s.role !== void 0 && (e.props.role = String(s.role)), s["aria-label"] !== void 0 && (e.props["aria-label"] = String(s["aria-label"])), s["aria-live"] !== void 0 && (e.props["aria-live"] = String(s["aria-live"])), s["aria-describedby"] !== void 0 && (e.props["aria-describedby"] = String(
|
|
1476
|
+
s["aria-describedby"]
|
|
1477
|
+
)), s["aria-modal"] !== void 0 && (e.props["aria-modal"] = s["aria-modal"] === "true" || s["aria-modal"] === !0), s["aria-hidden"] !== void 0 && (e.props["aria-hidden"] = String(s["aria-hidden"])), s.navigationTitle !== void 0 && (e.props.navigationTitle = String(s.navigationTitle)), s.navigationBarHidden !== void 0 && (e.props.navigationBarHidden = s.navigationBarHidden, s.navigationBarHidden && (e.props["aria-hidden"] = "true")), s.navigationBarItems !== void 0 && (e.props.navigationBarItems = s.navigationBarItems);
|
|
1478
|
+
} else if (r.type === "transition") {
|
|
1479
|
+
const s = r.properties;
|
|
1480
|
+
e.props.style || (e.props.style = {}), s.transition && (e.props.style.transition = s.transition);
|
|
1481
|
+
} else if (r.type === "size") {
|
|
1482
|
+
const s = r.properties;
|
|
1483
|
+
e.props.style || (e.props.style = {}), s.minHeight !== void 0 && (e.props.style.minHeight = s.minHeight), s.minWidth !== void 0 && (e.props.style.minWidth = s.minWidth), s.maxHeight !== void 0 && (e.props.style.maxHeight = s.maxHeight), s.maxWidth !== void 0 && (e.props.style.maxWidth = s.maxWidth), s.width !== void 0 && (e.props.style.width = s.width), s.height !== void 0 && (e.props.style.height = s.height);
|
|
1484
|
+
} else if (r.type === "css") {
|
|
1485
|
+
const s = r.properties;
|
|
1486
|
+
e.props.style || (e.props.style = {}), Object.entries(s).forEach(([o, c]) => {
|
|
1487
|
+
c != null && (e.props.style[o] = c);
|
|
1488
|
+
});
|
|
1489
|
+
}
|
|
1490
|
+
});
|
|
1491
|
+
}
|
|
1492
|
+
// ============================================================================
|
|
1493
|
+
// MISSING MODIFIER METHODS - ACCESSIBILITY & NAVIGATION
|
|
1494
|
+
// ============================================================================
|
|
1495
|
+
// Individual ARIA methods for better developer experience
|
|
1496
|
+
role(e) {
|
|
1497
|
+
return this.modifiers.push(new d({ role: e })), this;
|
|
1498
|
+
}
|
|
1499
|
+
ariaLabel(e) {
|
|
1500
|
+
return this.modifiers.push(new d({ "aria-label": e })), this;
|
|
1501
|
+
}
|
|
1502
|
+
ariaLive(e) {
|
|
1503
|
+
return this.modifiers.push(new d({ "aria-live": e })), this;
|
|
1504
|
+
}
|
|
1505
|
+
ariaDescribedBy(e) {
|
|
1506
|
+
return this.modifiers.push(new d({ "aria-describedby": e })), this;
|
|
1507
|
+
}
|
|
1508
|
+
ariaModal(e) {
|
|
1509
|
+
return this.modifiers.push(
|
|
1510
|
+
new d({ "aria-modal": e.toString() })
|
|
1511
|
+
), this;
|
|
1512
|
+
}
|
|
1513
|
+
// Touch and gesture events
|
|
1514
|
+
onTouchStart(e) {
|
|
1515
|
+
return this.modifiers.push(new l({ onTouchStart: e })), this;
|
|
1516
|
+
}
|
|
1517
|
+
onTouchMove(e) {
|
|
1518
|
+
return this.modifiers.push(new l({ onTouchMove: e })), this;
|
|
1519
|
+
}
|
|
1520
|
+
onTouchEnd(e) {
|
|
1521
|
+
return this.modifiers.push(new l({ onTouchEnd: e })), this;
|
|
1522
|
+
}
|
|
1523
|
+
// Swipe gestures (simplified implementations)
|
|
1524
|
+
onSwipeLeft(e) {
|
|
1525
|
+
return this.modifiers.push(new l({ onSwipeLeft: e })), this;
|
|
1526
|
+
}
|
|
1527
|
+
onSwipeRight(e) {
|
|
1528
|
+
return this.modifiers.push(new l({ onSwipeRight: e })), this;
|
|
1529
|
+
}
|
|
1530
|
+
// Navigation methods - these delegate to the navigation package functions
|
|
1531
|
+
navigationTitle(e) {
|
|
1532
|
+
return this.modifiers.push(
|
|
1533
|
+
new d({
|
|
1534
|
+
navigationTitle: e,
|
|
1535
|
+
role: "heading"
|
|
1536
|
+
})
|
|
1537
|
+
), this;
|
|
1538
|
+
}
|
|
1539
|
+
navigationBarHidden(e = !0) {
|
|
1540
|
+
return this.modifiers.push(
|
|
1541
|
+
new d({
|
|
1542
|
+
navigationBarHidden: e,
|
|
1543
|
+
"aria-hidden": e.toString()
|
|
1544
|
+
})
|
|
1545
|
+
), this;
|
|
1546
|
+
}
|
|
1547
|
+
navigationBarItems(e) {
|
|
1548
|
+
return this.modifiers.push(new d({ navigationBarItems: e })), this;
|
|
1549
|
+
}
|
|
1550
|
+
// ============================================================================
|
|
1551
|
+
// MISSING TRANSITION METHODS
|
|
1552
|
+
// ============================================================================
|
|
1553
|
+
transitions(e) {
|
|
1554
|
+
return this.modifiers.push(new m({ transitions: e })), this;
|
|
1555
|
+
}
|
|
1556
|
+
fadeTransition(e = 300) {
|
|
1557
|
+
return this.modifiers.push(Pt(e)), this;
|
|
1558
|
+
}
|
|
1559
|
+
transformTransition(e = 300) {
|
|
1560
|
+
return this.modifiers.push(It(e)), this;
|
|
1561
|
+
}
|
|
1562
|
+
colorTransition(e = 300) {
|
|
1563
|
+
return this.modifiers.push(Rt(e)), this;
|
|
1564
|
+
}
|
|
1565
|
+
layoutTransition(e = 300) {
|
|
1566
|
+
return this.modifiers.push(Nt(e)), this;
|
|
1567
|
+
}
|
|
1568
|
+
buttonTransition() {
|
|
1569
|
+
return this.modifiers.push(kt()), this;
|
|
1570
|
+
}
|
|
1571
|
+
cardTransition() {
|
|
1572
|
+
return this.modifiers.push(Bt()), this;
|
|
1573
|
+
}
|
|
1574
|
+
modalTransition() {
|
|
1575
|
+
return this.modifiers.push(Dt()), this;
|
|
1576
|
+
}
|
|
1577
|
+
smoothTransition(e = 300) {
|
|
1578
|
+
return this.modifiers.push(Ht(e)), this;
|
|
1579
|
+
}
|
|
1580
|
+
quickTransition(e = 150) {
|
|
1581
|
+
return this.modifiers.push(Ot(e)), this;
|
|
1582
|
+
}
|
|
1583
|
+
slowTransition(e = 500) {
|
|
1584
|
+
return this.modifiers.push(Ft(e)), this;
|
|
1585
|
+
}
|
|
1586
|
+
// ============================================================================
|
|
1587
|
+
// SCROLL METHODS
|
|
1588
|
+
// ============================================================================
|
|
1589
|
+
scroll(e) {
|
|
1590
|
+
return this.modifiers.push(Vt(e)), this;
|
|
1591
|
+
}
|
|
1592
|
+
scrollBehavior(e) {
|
|
1593
|
+
return this.modifiers.push(Wt(e)), this;
|
|
1594
|
+
}
|
|
1595
|
+
overscrollBehavior(e) {
|
|
1596
|
+
return this.modifiers.push(zt(e)), this;
|
|
1597
|
+
}
|
|
1598
|
+
overscrollBehaviorX(e) {
|
|
1599
|
+
return this.modifiers.push(jt(e)), this;
|
|
1600
|
+
}
|
|
1601
|
+
overscrollBehaviorY(e) {
|
|
1602
|
+
return this.modifiers.push(Ut(e)), this;
|
|
1603
|
+
}
|
|
1604
|
+
scrollMargin(e) {
|
|
1605
|
+
return this.modifiers.push(qt(e)), this;
|
|
1606
|
+
}
|
|
1607
|
+
scrollPadding(e) {
|
|
1608
|
+
return this.modifiers.push(Gt(e)), this;
|
|
1609
|
+
}
|
|
1610
|
+
scrollSnap(e) {
|
|
1611
|
+
return this.modifiers.push(Yt(e)), this;
|
|
1612
|
+
}
|
|
1613
|
+
// ============================================================================
|
|
1614
|
+
// MIGRATED MODIFIERS - NOW IN SPECIALIZED PACKAGES
|
|
1615
|
+
// ============================================================================
|
|
1616
|
+
// Viewport lifecycle modifiers - moved to @tachui/viewport
|
|
1617
|
+
onAppear(e) {
|
|
1618
|
+
throw new Error(
|
|
1619
|
+
'onAppear modifier has been moved to @tachui/viewport. Please import { onAppear } from "@tachui/viewport/modifiers" and use it directly instead of chaining it on components.'
|
|
1620
|
+
);
|
|
1621
|
+
}
|
|
1622
|
+
onDisappear(e) {
|
|
1623
|
+
throw new Error(
|
|
1624
|
+
'onDisappear modifier has been moved to @tachui/viewport. Please import { onDisappear } from "@tachui/viewport/modifiers" and use it directly instead of chaining it on components.'
|
|
1625
|
+
);
|
|
1626
|
+
}
|
|
1627
|
+
// Mobile gesture modifiers - moved to @tachui/mobile
|
|
1628
|
+
refreshable(e, t) {
|
|
1629
|
+
throw new Error(
|
|
1630
|
+
'refreshable modifier has been moved to @tachui/mobile. Please import { refreshable } from "@tachui/mobile/modifiers" and use it directly instead of chaining it on components.'
|
|
1631
|
+
);
|
|
1632
|
+
}
|
|
1633
|
+
// onAppear and onDisappear have been moved to @tachui/viewport/modifiers
|
|
1634
|
+
// to maintain proper architectural boundaries
|
|
1635
|
+
// Transform modifiers
|
|
1636
|
+
scaleEffect(e, t, r) {
|
|
1637
|
+
return this.modifiers.push(
|
|
1638
|
+
new m({
|
|
1639
|
+
scaleEffect: {
|
|
1640
|
+
x: e,
|
|
1641
|
+
y: t ?? e,
|
|
1642
|
+
// Default to uniform scaling
|
|
1643
|
+
anchor: r ?? "center"
|
|
1644
|
+
}
|
|
1645
|
+
})
|
|
1646
|
+
), this;
|
|
1647
|
+
}
|
|
1648
|
+
// Shadow modifiers - registry-based lookup
|
|
1649
|
+
shadow(e) {
|
|
1650
|
+
return this.modifiers.push(p("shadow", e)), this;
|
|
1651
|
+
}
|
|
1652
|
+
textShadow(e) {
|
|
1653
|
+
return this.modifiers.push(p("textShadow", e)), this;
|
|
1654
|
+
}
|
|
1655
|
+
shadows(e) {
|
|
1656
|
+
return this.modifiers.push(p("shadows", e)), this;
|
|
1657
|
+
}
|
|
1658
|
+
shadowPreset(e) {
|
|
1659
|
+
return this.modifiers.push(p("shadowPreset", e)), this;
|
|
1660
|
+
}
|
|
1661
|
+
}
|
|
1662
|
+
function X(i) {
|
|
1663
|
+
return new Xt(i);
|
|
1664
|
+
}
|
|
1665
|
+
function Mi(i, e) {
|
|
1666
|
+
return {
|
|
1667
|
+
...i,
|
|
1668
|
+
modifiers: e,
|
|
1669
|
+
modifierBuilder: X(i)
|
|
1670
|
+
};
|
|
1671
|
+
}
|
|
1672
|
+
const xi = {
|
|
1673
|
+
/**
|
|
1674
|
+
* Create a padding modifier with all sides
|
|
1675
|
+
*/
|
|
1676
|
+
paddingAll(i) {
|
|
1677
|
+
return new g({ padding: i });
|
|
1678
|
+
},
|
|
1679
|
+
/**
|
|
1680
|
+
* Create a margin modifier with all sides
|
|
1681
|
+
*/
|
|
1682
|
+
marginAll(i) {
|
|
1683
|
+
return new g({ margin: i });
|
|
1684
|
+
},
|
|
1685
|
+
/**
|
|
1686
|
+
* Create a font modifier with common presets
|
|
1687
|
+
*/
|
|
1688
|
+
fontPreset(i) {
|
|
1689
|
+
const e = {
|
|
1690
|
+
title: { size: 32, weight: "bold" },
|
|
1691
|
+
heading: { size: 24, weight: "600" },
|
|
1692
|
+
body: { size: 16, weight: "normal" },
|
|
1693
|
+
caption: { size: 12, weight: "normal" }
|
|
1694
|
+
};
|
|
1695
|
+
return new d({ font: e[i] });
|
|
1696
|
+
},
|
|
1697
|
+
// shadowPreset moved to @tachui/effects package
|
|
1698
|
+
/**
|
|
1699
|
+
* Create a transition modifier with common presets
|
|
1700
|
+
*/
|
|
1701
|
+
transitionPreset(i) {
|
|
1702
|
+
const e = {
|
|
1703
|
+
fast: { duration: 150, easing: "ease-out" },
|
|
1704
|
+
normal: { duration: 300, easing: "ease" },
|
|
1705
|
+
slow: { duration: 500, easing: "ease-in-out" }
|
|
1706
|
+
};
|
|
1707
|
+
return new m({ transition: e[i] });
|
|
1708
|
+
}
|
|
1709
|
+
};
|
|
1710
|
+
var Jt = Object.defineProperty, Kt = (i, e, t) => e in i ? Jt(i, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : i[e] = t, Zt = (i, e, t) => Kt(i, e + "", t);
|
|
1711
|
+
class J {
|
|
1712
|
+
constructor() {
|
|
1713
|
+
Zt(this, "modifiers", /* @__PURE__ */ new Map());
|
|
1714
|
+
}
|
|
1715
|
+
register(e, t) {
|
|
1716
|
+
this.modifiers.set(e, t);
|
|
1717
|
+
}
|
|
1718
|
+
get(e) {
|
|
1719
|
+
return this.modifiers.get(e);
|
|
1720
|
+
}
|
|
1721
|
+
has(e) {
|
|
1722
|
+
return this.modifiers.has(e);
|
|
1723
|
+
}
|
|
1724
|
+
list() {
|
|
1725
|
+
return Array.from(this.modifiers.keys());
|
|
1726
|
+
}
|
|
1727
|
+
clear() {
|
|
1728
|
+
this.modifiers.clear();
|
|
1729
|
+
}
|
|
1730
|
+
}
|
|
1731
|
+
const Qt = new J();
|
|
1732
|
+
function Li() {
|
|
1733
|
+
return new J();
|
|
1734
|
+
}
|
|
1735
|
+
function ei(i, e, t = {}, r = {}) {
|
|
1736
|
+
if (!e.length) return i;
|
|
1737
|
+
const n = {
|
|
1738
|
+
componentId: t.componentId || "unknown",
|
|
1739
|
+
phase: t.phase || "creation",
|
|
1740
|
+
...t.element && { element: t.element },
|
|
1741
|
+
...t.parentElement && { parentElement: t.parentElement },
|
|
1742
|
+
...t.componentInstance && { componentInstance: t.componentInstance },
|
|
1743
|
+
...t.previousModifiers && { previousModifiers: t.previousModifiers }
|
|
1744
|
+
};
|
|
1745
|
+
switch (r.batch ? "batch" : "sequential") {
|
|
1746
|
+
case "batch":
|
|
1747
|
+
return ii(i, e, n, r);
|
|
1748
|
+
default:
|
|
1749
|
+
return ti(i, e, n, r);
|
|
1750
|
+
}
|
|
1751
|
+
}
|
|
1752
|
+
function ti(i, e, t, r) {
|
|
1753
|
+
const n = [...e].sort((u, h) => u.priority - h.priority);
|
|
1754
|
+
let s = i;
|
|
1755
|
+
const o = [], c = [];
|
|
1756
|
+
for (const u of n)
|
|
1757
|
+
try {
|
|
1758
|
+
const h = u.apply(s, t);
|
|
1759
|
+
h && typeof h == "object" && "type" in h && (s = h), r.immediate && !r.suppressEffects && (o.forEach((I) => I()), o.length = 0);
|
|
1760
|
+
} catch (h) {
|
|
1761
|
+
console.error(`Failed to apply modifier ${u.type}:`, h);
|
|
1762
|
+
}
|
|
1763
|
+
if (c.length > 0) {
|
|
1764
|
+
const u = s.dispose;
|
|
1765
|
+
s.dispose = () => {
|
|
1766
|
+
c.forEach((h) => h()), u && u();
|
|
1767
|
+
};
|
|
1768
|
+
}
|
|
1769
|
+
return s;
|
|
1770
|
+
}
|
|
1771
|
+
function ii(i, e, t, r) {
|
|
1772
|
+
const n = ri(e);
|
|
1773
|
+
let s = i;
|
|
1774
|
+
const o = [], c = [];
|
|
1775
|
+
for (const [u, h] of n)
|
|
1776
|
+
try {
|
|
1777
|
+
s = si(s, h, t);
|
|
1778
|
+
} catch (I) {
|
|
1779
|
+
(typeof process > "u" || process.env.NODE_ENV !== "test") && console.error(`Failed to apply modifier group ${u}:`, I);
|
|
1780
|
+
}
|
|
1781
|
+
if (r.suppressEffects || o.forEach((u) => u()), c.length > 0) {
|
|
1782
|
+
const u = s.dispose;
|
|
1783
|
+
s.dispose = () => {
|
|
1784
|
+
c.forEach((h) => h()), u && u();
|
|
1785
|
+
};
|
|
1786
|
+
}
|
|
1787
|
+
return s;
|
|
1788
|
+
}
|
|
1789
|
+
function ri(i) {
|
|
1790
|
+
const e = /* @__PURE__ */ new Map();
|
|
1791
|
+
for (const t of i) {
|
|
1792
|
+
const r = e.get(t.type) || [];
|
|
1793
|
+
r.push(t), e.set(t.type, r);
|
|
1794
|
+
}
|
|
1795
|
+
return e;
|
|
1796
|
+
}
|
|
1797
|
+
function si(i, e, t) {
|
|
1798
|
+
const r = [...e].sort((s, o) => s.priority - o.priority);
|
|
1799
|
+
let n = i;
|
|
1800
|
+
for (const s of r)
|
|
1801
|
+
try {
|
|
1802
|
+
const o = s.apply(n, t);
|
|
1803
|
+
o && typeof o == "object" && "type" in o && (n = o);
|
|
1804
|
+
} catch (o) {
|
|
1805
|
+
(typeof process > "u" || process.env.NODE_ENV !== "test") && console.error(`Failed to apply modifier ${s.type}:`, o);
|
|
1806
|
+
}
|
|
1807
|
+
return n;
|
|
1808
|
+
}
|
|
1809
|
+
function ni(i) {
|
|
1810
|
+
return i && typeof i.concat == "function" && typeof i.toSegment == "function" && typeof i.isConcatenatable == "function";
|
|
1811
|
+
}
|
|
1812
|
+
function oi(i, e = []) {
|
|
1813
|
+
const t = {
|
|
1814
|
+
type: i.type,
|
|
1815
|
+
id: i.id,
|
|
1816
|
+
props: { ...i.props },
|
|
1817
|
+
mounted: i.mounted,
|
|
1818
|
+
cleanup: i.cleanup ? [...i.cleanup] : [],
|
|
1819
|
+
modifiers: [...e],
|
|
1820
|
+
modifierBuilder: null,
|
|
1821
|
+
// Will be set after component is created
|
|
1822
|
+
render: i.render ? i.render.bind(i) : () => []
|
|
1823
|
+
// Bind to original component or provide default
|
|
1824
|
+
};
|
|
1825
|
+
t.modifierBuilder = X(t), i.modifiableComponent = t;
|
|
1826
|
+
const r = i._enhancedLifecycle;
|
|
1827
|
+
r && (t._enhancedLifecycle = r, "domElements" in i && (t.domElements = i.domElements), "primaryElement" in i && (t.primaryElement = i.primaryElement), "domReady" in i && (t.domReady = i.domReady), "children" in i && (t.children = i.children));
|
|
1828
|
+
const n = i.render ? i.render.bind(i) : () => [];
|
|
1829
|
+
return t.render = () => {
|
|
1830
|
+
const s = n();
|
|
1831
|
+
return (Array.isArray(s) ? s : [s]).map((c) => (c && typeof c == "object" && (c.modifiers = t.modifiers, c.componentId = i.id), c));
|
|
1832
|
+
}, ni(i) && (t.concat = function(s) {
|
|
1833
|
+
const o = {
|
|
1834
|
+
id: t.id,
|
|
1835
|
+
component: t,
|
|
1836
|
+
modifiers: t.modifiers,
|
|
1837
|
+
render: () => {
|
|
1838
|
+
const h = t.render();
|
|
1839
|
+
return Array.isArray(h) ? h[0] : h;
|
|
1840
|
+
}
|
|
1841
|
+
}, c = s.toSegment(), u = {
|
|
1842
|
+
totalSegments: s instanceof b ? s.segments.length + 1 : 2,
|
|
1843
|
+
accessibilityRole: "text",
|
|
1844
|
+
// Simplified for now
|
|
1845
|
+
semanticStructure: "inline"
|
|
1846
|
+
// Simplified for now
|
|
1847
|
+
};
|
|
1848
|
+
return s instanceof b ? new b([o, ...s.segments], u) : new b([o, c], u);
|
|
1849
|
+
}, t.toSegment = function() {
|
|
1850
|
+
return {
|
|
1851
|
+
id: t.id,
|
|
1852
|
+
component: t,
|
|
1853
|
+
modifiers: t.modifiers,
|
|
1854
|
+
render: () => {
|
|
1855
|
+
const s = t.render();
|
|
1856
|
+
return Array.isArray(s) ? s[0] : s;
|
|
1857
|
+
}
|
|
1858
|
+
};
|
|
1859
|
+
}, t.isConcatenatable = function() {
|
|
1860
|
+
return !0;
|
|
1861
|
+
}), t;
|
|
1862
|
+
}
|
|
1863
|
+
function $i(i, e, t = {}) {
|
|
1864
|
+
i.modifiers = [...e], i.mounted && i.context && console.log("Updating modifiers on mounted component", i.id);
|
|
1865
|
+
}
|
|
1866
|
+
const Pi = {
|
|
1867
|
+
/**
|
|
1868
|
+
* Check if a component has specific modifier types
|
|
1869
|
+
*/
|
|
1870
|
+
hasModifierOfType(i, e) {
|
|
1871
|
+
return i.modifiers.some((t) => t.type === e);
|
|
1872
|
+
},
|
|
1873
|
+
/**
|
|
1874
|
+
* Get modifiers of a specific type from a component
|
|
1875
|
+
*/
|
|
1876
|
+
getModifiersOfType(i, e) {
|
|
1877
|
+
return i.modifiers.filter((t) => t.type === e);
|
|
1878
|
+
},
|
|
1879
|
+
/**
|
|
1880
|
+
* Remove modifiers of a specific type from a component
|
|
1881
|
+
*/
|
|
1882
|
+
removeModifiersOfType(i, e) {
|
|
1883
|
+
i.modifiers = i.modifiers.filter((t) => t.type !== e);
|
|
1884
|
+
},
|
|
1885
|
+
/**
|
|
1886
|
+
* Replace modifiers of a specific type
|
|
1887
|
+
*/
|
|
1888
|
+
replaceModifiersOfType(i, e, t) {
|
|
1889
|
+
i.modifiers = i.modifiers.filter((r) => r.type !== e), i.modifiers.push(...t);
|
|
1890
|
+
},
|
|
1891
|
+
/**
|
|
1892
|
+
* Get the total number of modifiers on a component
|
|
1893
|
+
*/
|
|
1894
|
+
getModifierCount(i) {
|
|
1895
|
+
return i.modifiers.length;
|
|
1896
|
+
},
|
|
1897
|
+
/**
|
|
1898
|
+
* Check if two modifier arrays are equivalent
|
|
1899
|
+
*/
|
|
1900
|
+
areModifiersEqual(i, e) {
|
|
1901
|
+
if (i.length !== e.length) return !1;
|
|
1902
|
+
for (let t = 0; t < i.length; t++) {
|
|
1903
|
+
const r = i[t], n = e[t];
|
|
1904
|
+
if (r.type !== n.type || r.priority !== n.priority || JSON.stringify(r.properties) !== JSON.stringify(n.properties))
|
|
1905
|
+
return !1;
|
|
1906
|
+
}
|
|
1907
|
+
return !0;
|
|
1908
|
+
}
|
|
1909
|
+
}, ai = /* @__PURE__ */ new Set([
|
|
1910
|
+
// Container tags
|
|
1911
|
+
"div",
|
|
1912
|
+
"section",
|
|
1913
|
+
"article",
|
|
1914
|
+
"aside",
|
|
1915
|
+
"nav",
|
|
1916
|
+
"main",
|
|
1917
|
+
"header",
|
|
1918
|
+
"footer",
|
|
1919
|
+
// Heading tags
|
|
1920
|
+
"h1",
|
|
1921
|
+
"h2",
|
|
1922
|
+
"h3",
|
|
1923
|
+
"h4",
|
|
1924
|
+
"h5",
|
|
1925
|
+
"h6",
|
|
1926
|
+
// Content tags
|
|
1927
|
+
"p",
|
|
1928
|
+
"span",
|
|
1929
|
+
"strong",
|
|
1930
|
+
"em",
|
|
1931
|
+
"code",
|
|
1932
|
+
"pre",
|
|
1933
|
+
"blockquote",
|
|
1934
|
+
"address",
|
|
1935
|
+
// List tags
|
|
1936
|
+
"ul",
|
|
1937
|
+
"ol",
|
|
1938
|
+
"li",
|
|
1939
|
+
"dl",
|
|
1940
|
+
"dt",
|
|
1941
|
+
"dd",
|
|
1942
|
+
// Interactive tags (with warnings)
|
|
1943
|
+
"button",
|
|
1944
|
+
"a",
|
|
1945
|
+
"input",
|
|
1946
|
+
"textarea",
|
|
1947
|
+
"select",
|
|
1948
|
+
"form",
|
|
1949
|
+
"label",
|
|
1950
|
+
// Media tags
|
|
1951
|
+
"img",
|
|
1952
|
+
"video",
|
|
1953
|
+
"audio",
|
|
1954
|
+
"canvas",
|
|
1955
|
+
"svg",
|
|
1956
|
+
"picture",
|
|
1957
|
+
"source",
|
|
1958
|
+
// Table tags
|
|
1959
|
+
"table",
|
|
1960
|
+
"thead",
|
|
1961
|
+
"tbody",
|
|
1962
|
+
"tfoot",
|
|
1963
|
+
"tr",
|
|
1964
|
+
"th",
|
|
1965
|
+
"td",
|
|
1966
|
+
"caption",
|
|
1967
|
+
"colgroup",
|
|
1968
|
+
"col",
|
|
1969
|
+
// Form tags
|
|
1970
|
+
"fieldset",
|
|
1971
|
+
"legend",
|
|
1972
|
+
"optgroup",
|
|
1973
|
+
"option",
|
|
1974
|
+
"datalist",
|
|
1975
|
+
"output",
|
|
1976
|
+
"progress",
|
|
1977
|
+
"meter",
|
|
1978
|
+
// Interactive content
|
|
1979
|
+
"details",
|
|
1980
|
+
"summary",
|
|
1981
|
+
"dialog",
|
|
1982
|
+
// Text semantics
|
|
1983
|
+
"abbr",
|
|
1984
|
+
"cite",
|
|
1985
|
+
"dfn",
|
|
1986
|
+
"kbd",
|
|
1987
|
+
"mark",
|
|
1988
|
+
"q",
|
|
1989
|
+
"s",
|
|
1990
|
+
"samp",
|
|
1991
|
+
"small",
|
|
1992
|
+
"sub",
|
|
1993
|
+
"sup",
|
|
1994
|
+
"time",
|
|
1995
|
+
"u",
|
|
1996
|
+
"var",
|
|
1997
|
+
// Document sections
|
|
1998
|
+
"body",
|
|
1999
|
+
"head",
|
|
2000
|
+
"title",
|
|
2001
|
+
"base",
|
|
2002
|
+
"link",
|
|
2003
|
+
"meta",
|
|
2004
|
+
"style",
|
|
2005
|
+
"script",
|
|
2006
|
+
"noscript",
|
|
2007
|
+
// Embedded content
|
|
2008
|
+
"embed",
|
|
2009
|
+
"iframe",
|
|
2010
|
+
"object",
|
|
2011
|
+
"param",
|
|
2012
|
+
"track",
|
|
2013
|
+
"map",
|
|
2014
|
+
"area",
|
|
2015
|
+
// Interactive elements
|
|
2016
|
+
"menu",
|
|
2017
|
+
"menuitem"
|
|
2018
|
+
]), T = /* @__PURE__ */ new Map([
|
|
2019
|
+
["nav", { role: "navigation", applyARIA: !0 }],
|
|
2020
|
+
["main", { role: "main", applyARIA: !0 }],
|
|
2021
|
+
["article", { role: "article", applyARIA: !0 }],
|
|
2022
|
+
["section", { role: "region", applyARIA: !0 }],
|
|
2023
|
+
["aside", { role: "complementary", applyARIA: !0 }],
|
|
2024
|
+
["header", { role: "banner", applyARIA: !1 }],
|
|
2025
|
+
// Context dependent - may not always be page banner
|
|
2026
|
+
["footer", { role: "contentinfo", applyARIA: !1 }],
|
|
2027
|
+
// Context dependent - may not always be page footer
|
|
2028
|
+
["form", { role: "form", applyARIA: !0 }],
|
|
2029
|
+
["search", { role: "search", applyARIA: !0 }],
|
|
2030
|
+
["dialog", { role: "dialog", applyARIA: !0 }],
|
|
2031
|
+
["button", { role: "button", applyARIA: !1 }],
|
|
2032
|
+
// Usually implicit
|
|
2033
|
+
["a", { role: "link", applyARIA: !1 }]
|
|
2034
|
+
// Usually implicit
|
|
2035
|
+
]), ci = /* @__PURE__ */ new Map([
|
|
2036
|
+
// Layout Components - Ideal for semantic containers (Warning Level: None)
|
|
2037
|
+
[
|
|
2038
|
+
"HStack",
|
|
2039
|
+
{
|
|
2040
|
+
warningLevel: "none",
|
|
2041
|
+
idealTags: [
|
|
2042
|
+
"nav",
|
|
2043
|
+
"header",
|
|
2044
|
+
"footer",
|
|
2045
|
+
"section",
|
|
2046
|
+
"article",
|
|
2047
|
+
"aside",
|
|
2048
|
+
"main",
|
|
2049
|
+
"div"
|
|
2050
|
+
]
|
|
2051
|
+
}
|
|
2052
|
+
],
|
|
2053
|
+
[
|
|
2054
|
+
"VStack",
|
|
2055
|
+
{
|
|
2056
|
+
warningLevel: "none",
|
|
2057
|
+
idealTags: [
|
|
2058
|
+
"main",
|
|
2059
|
+
"section",
|
|
2060
|
+
"article",
|
|
2061
|
+
"aside",
|
|
2062
|
+
"header",
|
|
2063
|
+
"footer",
|
|
2064
|
+
"div"
|
|
2065
|
+
]
|
|
2066
|
+
}
|
|
2067
|
+
],
|
|
2068
|
+
[
|
|
2069
|
+
"ZStack",
|
|
2070
|
+
{ warningLevel: "none", idealTags: ["article", "aside", "section", "div"] }
|
|
2071
|
+
],
|
|
2072
|
+
// Content Components - Common for specific overrides (Warning Level: None for appropriate tags)
|
|
2073
|
+
[
|
|
2074
|
+
"Text",
|
|
2075
|
+
{
|
|
2076
|
+
warningLevel: "none",
|
|
2077
|
+
idealTags: [
|
|
2078
|
+
"h1",
|
|
2079
|
+
"h2",
|
|
2080
|
+
"h3",
|
|
2081
|
+
"h4",
|
|
2082
|
+
"h5",
|
|
2083
|
+
"h6",
|
|
2084
|
+
"p",
|
|
2085
|
+
"span",
|
|
2086
|
+
"strong",
|
|
2087
|
+
"em"
|
|
2088
|
+
]
|
|
2089
|
+
}
|
|
2090
|
+
],
|
|
2091
|
+
[
|
|
2092
|
+
"Image",
|
|
2093
|
+
{ warningLevel: "warning", problematicTags: ["figure", "picture"] }
|
|
2094
|
+
],
|
|
2095
|
+
// May break functionality
|
|
2096
|
+
["Spacer", { warningLevel: "none" }],
|
|
2097
|
+
// Interactive Components - Use with warnings
|
|
2098
|
+
[
|
|
2099
|
+
"Button",
|
|
2100
|
+
{ warningLevel: "warning", problematicTags: ["div", "span", "a"] }
|
|
2101
|
+
],
|
|
2102
|
+
// May break accessibility
|
|
2103
|
+
[
|
|
2104
|
+
"Link",
|
|
2105
|
+
{ warningLevel: "warning", problematicTags: ["div", "span", "button"] }
|
|
2106
|
+
]
|
|
2107
|
+
// May break navigation
|
|
2108
|
+
]);
|
|
2109
|
+
function di(i, e) {
|
|
2110
|
+
const t = ci.get(i);
|
|
2111
|
+
return t ? t.warningLevel === "none" ? !1 : t.warningLevel === "warning" && t.problematicTags ? t.problematicTags.includes(e) : !(t.idealTags && t.idealTags.includes(e)) : !0;
|
|
2112
|
+
}
|
|
2113
|
+
class ui {
|
|
2114
|
+
static validate(e, t) {
|
|
2115
|
+
return ai.has(e) ? {
|
|
2116
|
+
valid: !0,
|
|
2117
|
+
warnings: this.checkSemanticWarnings(e, t),
|
|
2118
|
+
semanticRole: T.get(e)
|
|
2119
|
+
} : (process.env.NODE_ENV !== "production" && console.error(
|
|
2120
|
+
`Invalid tag '${e}' for component type '${t}'`
|
|
2121
|
+
), {
|
|
2122
|
+
valid: !1,
|
|
2123
|
+
warning: `Invalid HTML tag '${e}' specified for ${t}. Tag will be used as-is.`,
|
|
2124
|
+
severity: "error"
|
|
2125
|
+
});
|
|
2126
|
+
}
|
|
2127
|
+
static checkSemanticWarnings(e, t) {
|
|
2128
|
+
const r = [];
|
|
2129
|
+
if (["button", "a", "input", "select", "textarea"].includes(e) && ["HStack", "VStack", "ZStack"].includes(t)) {
|
|
2130
|
+
const n = `Using interactive tag '${e}' on layout component ${t} may cause accessibility issues.`;
|
|
2131
|
+
r.push({ message: n, severity: "warning" }), process.env.NODE_ENV !== "production" && console.warn(
|
|
2132
|
+
`Interactive tag '${e}' on layout component '${t}' may cause unexpected behavior`
|
|
2133
|
+
);
|
|
2134
|
+
}
|
|
2135
|
+
if (e === "li" && !["VStack", "HStack"].includes(t) && (r.push({ message: "<li> tags should typically be used within list structures.", severity: "info" }), process.env.NODE_ENV !== "production" && console.info(
|
|
2136
|
+
`Consider using '${e}' within <ul> or <ol> structure for component '${t}'`
|
|
2137
|
+
)), ["h1", "h2", "h3", "h4", "h5", "h6"].includes(e) && ["HStack", "VStack", "ZStack"].includes(t)) {
|
|
2138
|
+
const n = `Using heading tag '${e}' on layout component ${t}. Consider using Text component instead.`;
|
|
2139
|
+
r.push({ message: n, severity: "info" }), process.env.NODE_ENV !== "production" && console.info(
|
|
2140
|
+
`Heading tag '${e}' is better suited for Text components than '${t}'`
|
|
2141
|
+
);
|
|
2142
|
+
}
|
|
2143
|
+
if (["form", "fieldset", "legend"].includes(e) && !["VStack", "HStack", "Form"].includes(t)) {
|
|
2144
|
+
const n = `Form tag '${e}' used on ${t}. Ensure proper form semantics.`;
|
|
2145
|
+
r.push({ message: n, severity: "info" }), process.env.NODE_ENV !== "production" && console.info(
|
|
2146
|
+
`Form tag '${e}' requires proper semantic context for component '${t}'`
|
|
2147
|
+
);
|
|
2148
|
+
}
|
|
2149
|
+
return r;
|
|
2150
|
+
}
|
|
2151
|
+
}
|
|
2152
|
+
let H = {
|
|
2153
|
+
autoApplySemanticRoles: !0,
|
|
2154
|
+
warnOnOverrides: process.env.NODE_ENV !== "production",
|
|
2155
|
+
warnOnSemanticIssues: process.env.NODE_ENV !== "production",
|
|
2156
|
+
validateTags: !0,
|
|
2157
|
+
allowInvalidTags: !0
|
|
2158
|
+
};
|
|
2159
|
+
function Ii(i) {
|
|
2160
|
+
H = { ...H, ...i };
|
|
2161
|
+
}
|
|
2162
|
+
function K() {
|
|
2163
|
+
return { ...H };
|
|
2164
|
+
}
|
|
2165
|
+
function li(i, e, t) {
|
|
2166
|
+
const r = t || e, n = K();
|
|
2167
|
+
let s = { valid: !0 };
|
|
2168
|
+
return t && (n.warnOnOverrides && di(i, t) && process.env.NODE_ENV !== "production" && console.warn(
|
|
2169
|
+
`Element override: ${i} changed from '${e}' to '${t}'`
|
|
2170
|
+
), n.validateTags && (s = ui.validate(t, i), !s.valid && !n.allowInvalidTags)) ? (process.env.NODE_ENV !== "production" && console.warn(
|
|
2171
|
+
`Invalid tag '${t}' rejected for '${i}', using default '${e}' instead`
|
|
2172
|
+
), { tag: e, validation: s }) : { tag: r, validation: s };
|
|
2173
|
+
}
|
|
2174
|
+
function Ri(i, e) {
|
|
2175
|
+
return (t) => li(i, e, t);
|
|
2176
|
+
}
|
|
2177
|
+
var pi = Object.defineProperty, hi = (i, e, t) => e in i ? pi(i, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : i[e] = t, fi = (i, e, t) => hi(i, e + "", t);
|
|
2178
|
+
const Z = class _ {
|
|
2179
|
+
static getInstance() {
|
|
2180
|
+
return _.instance || (_.instance = new _()), _.instance;
|
|
2181
|
+
}
|
|
2182
|
+
/**
|
|
2183
|
+
* Apply semantic ARIA attributes to an element based on its tag
|
|
2184
|
+
*/
|
|
2185
|
+
applySemanticAttributes(e, t, r) {
|
|
2186
|
+
const n = K();
|
|
2187
|
+
if (!n.autoApplySemanticRoles) return;
|
|
2188
|
+
const s = T.get(t);
|
|
2189
|
+
if (!(!s || !s.applyARIA)) {
|
|
2190
|
+
if (r?.role) {
|
|
2191
|
+
n.warnOnSemanticIssues && process.env.NODE_ENV !== "production" && console.warn(
|
|
2192
|
+
`ARIA role '${r.role}' overrides semantic role '${s.role}' for tag '${t}'`
|
|
2193
|
+
);
|
|
2194
|
+
return;
|
|
2195
|
+
}
|
|
2196
|
+
if (e.hasAttribute("role")) {
|
|
2197
|
+
n.warnOnSemanticIssues && process.env.NODE_ENV !== "production" && console.warn(
|
|
2198
|
+
`Existing role attribute overrides semantic role '${s.role}' for tag '${t}'`
|
|
2199
|
+
);
|
|
2200
|
+
return;
|
|
2201
|
+
}
|
|
2202
|
+
e.setAttribute("role", s.role), n.warnOnSemanticIssues && process.env.NODE_ENV !== "production" && console.info(
|
|
2203
|
+
`Applied semantic role '${s.role}' to tag '${t}'`
|
|
2204
|
+
);
|
|
2205
|
+
}
|
|
2206
|
+
}
|
|
2207
|
+
/**
|
|
2208
|
+
* Get semantic role information for a tag
|
|
2209
|
+
*/
|
|
2210
|
+
getSemanticRole(e) {
|
|
2211
|
+
return T.get(e);
|
|
2212
|
+
}
|
|
2213
|
+
/**
|
|
2214
|
+
* Check if a tag has automatic ARIA role application enabled
|
|
2215
|
+
*/
|
|
2216
|
+
hasAutoARIA(e) {
|
|
2217
|
+
const t = T.get(e);
|
|
2218
|
+
return t ? t.applyARIA : !1;
|
|
2219
|
+
}
|
|
2220
|
+
/**
|
|
2221
|
+
* Get all tags that support automatic ARIA roles
|
|
2222
|
+
*/
|
|
2223
|
+
getAutoARIATags() {
|
|
2224
|
+
return Array.from(T.entries()).filter(([, e]) => e.applyARIA).map(([e]) => e);
|
|
2225
|
+
}
|
|
2226
|
+
/**
|
|
2227
|
+
* Apply semantic attributes during DOM node creation
|
|
2228
|
+
* This is called by the renderer when creating elements
|
|
2229
|
+
*/
|
|
2230
|
+
processElementNode(e, t, r, n) {
|
|
2231
|
+
if (this.applySemanticAttributes(e, t, n), r && process.env.NODE_ENV !== "production") {
|
|
2232
|
+
const s = this.getSemanticRole(t);
|
|
2233
|
+
s && e.setAttribute(
|
|
2234
|
+
"data-tachui-semantic",
|
|
2235
|
+
JSON.stringify({
|
|
2236
|
+
originalComponent: r.originalType,
|
|
2237
|
+
overriddenTo: t,
|
|
2238
|
+
semanticRole: s.role,
|
|
2239
|
+
autoApplied: s.applyARIA
|
|
2240
|
+
})
|
|
2241
|
+
);
|
|
2242
|
+
}
|
|
2243
|
+
}
|
|
2244
|
+
};
|
|
2245
|
+
fi(Z, "instance");
|
|
2246
|
+
let mi = Z;
|
|
2247
|
+
const P = mi.getInstance(), Ni = (i, e, t) => P.applySemanticAttributes(i, e, t), ki = (i) => P.getSemanticRole(i), Bi = (i) => P.hasAutoARIA(i);
|
|
2248
|
+
var gi = Object.defineProperty, yi = (i, e, t) => e in i ? gi(i, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : i[e] = t, k = (i, e, t) => yi(i, typeof e != "symbol" ? e + "" : e, t);
|
|
2249
|
+
class bi {
|
|
2250
|
+
constructor() {
|
|
2251
|
+
k(this, "nodeMap", /* @__PURE__ */ new WeakMap()), k(this, "cleanupMap", /* @__PURE__ */ new WeakMap()), k(this, "renderedNodes", /* @__PURE__ */ new Set());
|
|
2252
|
+
}
|
|
2253
|
+
/**
|
|
2254
|
+
* Render a DOM node to an actual DOM element
|
|
2255
|
+
*/
|
|
2256
|
+
render(e, t) {
|
|
2257
|
+
return Array.isArray(e) ? this.renderFragment(e, t) : this.renderSingle(e, t);
|
|
2258
|
+
}
|
|
2259
|
+
/**
|
|
2260
|
+
* Render a single DOM node
|
|
2261
|
+
*/
|
|
2262
|
+
renderSingle(e, t) {
|
|
2263
|
+
this.renderedNodes.add(e);
|
|
2264
|
+
let r;
|
|
2265
|
+
switch (e.type) {
|
|
2266
|
+
case "element":
|
|
2267
|
+
r = this.createElement(e);
|
|
2268
|
+
break;
|
|
2269
|
+
case "text":
|
|
2270
|
+
r = this.createTextNode(e);
|
|
2271
|
+
break;
|
|
2272
|
+
case "comment":
|
|
2273
|
+
r = this.createComment(e);
|
|
2274
|
+
break;
|
|
2275
|
+
default:
|
|
2276
|
+
throw new Error(`Unknown node type: ${e.type}`);
|
|
2277
|
+
}
|
|
2278
|
+
if (this.nodeMap.set(e, r), e.element = r, r instanceof Element) {
|
|
2279
|
+
let n = [];
|
|
2280
|
+
"modifiers" in e && Array.isArray(e.modifiers) && e.modifiers.length > 0 && (n = e.modifiers), "componentMetadata" in e && e.componentMetadata?.modifiers && Array.isArray(e.componentMetadata.modifiers) && e.componentMetadata.modifiers.length > 0 && (n = e.componentMetadata.modifiers), n.length > 0 && this.applyModifiersToElement(r, n, e);
|
|
2281
|
+
}
|
|
2282
|
+
return e.dispose && this.addCleanup(r, e.dispose), t && t.appendChild(r), r;
|
|
2283
|
+
}
|
|
2284
|
+
/**
|
|
2285
|
+
* Render multiple nodes as a document fragment
|
|
2286
|
+
*/
|
|
2287
|
+
renderFragment(e, t) {
|
|
2288
|
+
const r = document.createDocumentFragment();
|
|
2289
|
+
return e.forEach((n) => {
|
|
2290
|
+
const s = this.renderSingle(n);
|
|
2291
|
+
r.appendChild(s);
|
|
2292
|
+
}), t && t.appendChild(r), r;
|
|
2293
|
+
}
|
|
2294
|
+
/**
|
|
2295
|
+
* Create a DOM element with props and children
|
|
2296
|
+
*/
|
|
2297
|
+
createElement(e) {
|
|
2298
|
+
if (!e.tag)
|
|
2299
|
+
throw new Error("Element node must have a tag");
|
|
2300
|
+
const t = document.createElement(e.tag);
|
|
2301
|
+
if (this.applyDebugAttributes(t, e), e.props && this.applyProps(t, e.props), "componentMetadata" in e && e.componentMetadata) {
|
|
2302
|
+
const r = e.componentMetadata;
|
|
2303
|
+
if (r.overriddenTo && r.originalType)
|
|
2304
|
+
try {
|
|
2305
|
+
P.processElementNode(
|
|
2306
|
+
t,
|
|
2307
|
+
e.tag,
|
|
2308
|
+
r,
|
|
2309
|
+
e.props?.aria || void 0
|
|
2310
|
+
);
|
|
2311
|
+
} catch (n) {
|
|
2312
|
+
console.warn("[tachUI] Could not process semantic attributes:", n);
|
|
2313
|
+
}
|
|
2314
|
+
}
|
|
2315
|
+
return e.children && e.children.length > 0 && e.children.forEach((r) => {
|
|
2316
|
+
const n = this.renderSingle(r);
|
|
2317
|
+
t.appendChild(n);
|
|
2318
|
+
}), t;
|
|
2319
|
+
}
|
|
2320
|
+
/**
|
|
2321
|
+
* Apply debug attributes to DOM element if debug mode is enabled
|
|
2322
|
+
*/
|
|
2323
|
+
applyDebugAttributes(e, t) {
|
|
2324
|
+
}
|
|
2325
|
+
/**
|
|
2326
|
+
* Create a text node
|
|
2327
|
+
*/
|
|
2328
|
+
createTextNode(e) {
|
|
2329
|
+
return document.createTextNode(e.text || "");
|
|
2330
|
+
}
|
|
2331
|
+
/**
|
|
2332
|
+
* Create a comment node
|
|
2333
|
+
*/
|
|
2334
|
+
createComment(e) {
|
|
2335
|
+
return document.createComment(e.text || "");
|
|
2336
|
+
}
|
|
2337
|
+
/**
|
|
2338
|
+
* Apply props to a DOM element with reactive updates
|
|
2339
|
+
*/
|
|
2340
|
+
applyProps(e, t) {
|
|
2341
|
+
Object.entries(t).forEach(([r, n]) => {
|
|
2342
|
+
this.applyProp(e, r, n);
|
|
2343
|
+
});
|
|
2344
|
+
}
|
|
2345
|
+
/**
|
|
2346
|
+
* Apply a single prop to an element
|
|
2347
|
+
*/
|
|
2348
|
+
applyProp(e, t, r) {
|
|
2349
|
+
if (t === "className" || t === "class") {
|
|
2350
|
+
this.applyClassName(e, r);
|
|
2351
|
+
return;
|
|
2352
|
+
}
|
|
2353
|
+
if (t === "style") {
|
|
2354
|
+
this.applyStyle(e, r);
|
|
2355
|
+
return;
|
|
2356
|
+
}
|
|
2357
|
+
if (t.startsWith("on") && typeof r == "function") {
|
|
2358
|
+
this.applyEventListener(e, t, r);
|
|
2359
|
+
return;
|
|
2360
|
+
}
|
|
2361
|
+
if (S(r) || E(r)) {
|
|
2362
|
+
const n = y(() => {
|
|
2363
|
+
const s = r();
|
|
2364
|
+
this.setElementProp(e, t, s);
|
|
2365
|
+
});
|
|
2366
|
+
this.addCleanup(e, () => {
|
|
2367
|
+
n.dispose();
|
|
2368
|
+
});
|
|
2369
|
+
return;
|
|
2370
|
+
}
|
|
2371
|
+
this.setElementProp(e, t, r);
|
|
2372
|
+
}
|
|
2373
|
+
/**
|
|
2374
|
+
* Set a property on an element
|
|
2375
|
+
*/
|
|
2376
|
+
setElementProp(e, t, r) {
|
|
2377
|
+
if (r == null) {
|
|
2378
|
+
e.removeAttribute(t);
|
|
2379
|
+
return;
|
|
2380
|
+
}
|
|
2381
|
+
if (typeof r == "boolean") {
|
|
2382
|
+
r ? e.setAttribute(t, "") : e.removeAttribute(t);
|
|
2383
|
+
return;
|
|
2384
|
+
}
|
|
2385
|
+
e.setAttribute(t, String(r));
|
|
2386
|
+
}
|
|
2387
|
+
/**
|
|
2388
|
+
* Apply className with reactive updates
|
|
2389
|
+
*/
|
|
2390
|
+
applyClassName(e, t) {
|
|
2391
|
+
if (S(t) || E(t)) {
|
|
2392
|
+
const r = y(() => {
|
|
2393
|
+
const n = t();
|
|
2394
|
+
e.className = this.normalizeClassName(n);
|
|
2395
|
+
});
|
|
2396
|
+
this.addCleanup(e, () => {
|
|
2397
|
+
r.dispose();
|
|
2398
|
+
});
|
|
2399
|
+
} else
|
|
2400
|
+
e.className = this.normalizeClassName(t);
|
|
2401
|
+
}
|
|
2402
|
+
/**
|
|
2403
|
+
* Normalize className value
|
|
2404
|
+
*/
|
|
2405
|
+
normalizeClassName(e) {
|
|
2406
|
+
return Array.isArray(e) ? e.filter(Boolean).join(" ") : typeof e == "object" && e !== null ? Object.entries(e).filter(([, t]) => !!t).map(([t]) => t).join(" ") : String(e || "");
|
|
2407
|
+
}
|
|
2408
|
+
/**
|
|
2409
|
+
* Apply styles with reactive updates
|
|
2410
|
+
*/
|
|
2411
|
+
applyStyle(e, t) {
|
|
2412
|
+
const r = e;
|
|
2413
|
+
if (S(t) || E(t)) {
|
|
2414
|
+
const n = y(() => {
|
|
2415
|
+
const s = t();
|
|
2416
|
+
this.setElementStyles(r, s);
|
|
2417
|
+
});
|
|
2418
|
+
this.addCleanup(e, () => {
|
|
2419
|
+
n.dispose();
|
|
2420
|
+
});
|
|
2421
|
+
} else
|
|
2422
|
+
this.setElementStyles(r, t);
|
|
2423
|
+
}
|
|
2424
|
+
/**
|
|
2425
|
+
* Set styles on an element
|
|
2426
|
+
*/
|
|
2427
|
+
setElementStyles(e, t) {
|
|
2428
|
+
if (typeof t == "string") {
|
|
2429
|
+
e.style.cssText = t;
|
|
2430
|
+
return;
|
|
2431
|
+
}
|
|
2432
|
+
typeof t == "object" && t !== null && Object.entries(t).forEach(([r, n]) => {
|
|
2433
|
+
if (S(n) || E(n)) {
|
|
2434
|
+
const s = y(() => {
|
|
2435
|
+
const o = n();
|
|
2436
|
+
o == null ? e.style.removeProperty(r) : e.style.setProperty(
|
|
2437
|
+
r.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`),
|
|
2438
|
+
String(o)
|
|
2439
|
+
);
|
|
2440
|
+
});
|
|
2441
|
+
this.addCleanup(e, () => {
|
|
2442
|
+
s.dispose();
|
|
2443
|
+
});
|
|
2444
|
+
} else
|
|
2445
|
+
n == null ? e.style.removeProperty(r) : e.style.setProperty(
|
|
2446
|
+
r.replace(/[A-Z]/g, (s) => `-${s.toLowerCase()}`),
|
|
2447
|
+
String(n)
|
|
2448
|
+
);
|
|
2449
|
+
});
|
|
2450
|
+
}
|
|
2451
|
+
/**
|
|
2452
|
+
* Apply event listener
|
|
2453
|
+
*/
|
|
2454
|
+
applyEventListener(e, t, r) {
|
|
2455
|
+
const n = t.slice(2).toLowerCase(), s = (o) => {
|
|
2456
|
+
try {
|
|
2457
|
+
r(o);
|
|
2458
|
+
} catch (c) {
|
|
2459
|
+
console.error(`Event handler error for ${t}:`, c);
|
|
2460
|
+
}
|
|
2461
|
+
};
|
|
2462
|
+
e.addEventListener(n, s), this.addCleanup(e, () => {
|
|
2463
|
+
e.removeEventListener(n, s);
|
|
2464
|
+
});
|
|
2465
|
+
}
|
|
2466
|
+
/**
|
|
2467
|
+
* Add cleanup function for an element
|
|
2468
|
+
*/
|
|
2469
|
+
addCleanup(e, t) {
|
|
2470
|
+
const r = this.cleanupMap.get(e) || [];
|
|
2471
|
+
r.push(t), this.cleanupMap.set(e, r);
|
|
2472
|
+
}
|
|
2473
|
+
/**
|
|
2474
|
+
* Update an existing DOM node
|
|
2475
|
+
*/
|
|
2476
|
+
updateNode(e, t) {
|
|
2477
|
+
const r = this.nodeMap.get(e);
|
|
2478
|
+
!r || typeof r.setAttribute != "function" || t && this.applyProps(r, t);
|
|
2479
|
+
}
|
|
2480
|
+
/**
|
|
2481
|
+
* Remove a DOM node and run cleanup
|
|
2482
|
+
*/
|
|
2483
|
+
removeNode(e) {
|
|
2484
|
+
const t = this.nodeMap.get(e);
|
|
2485
|
+
if (!t) return;
|
|
2486
|
+
const r = this.cleanupMap.get(t);
|
|
2487
|
+
r && (r.forEach((n) => {
|
|
2488
|
+
try {
|
|
2489
|
+
n();
|
|
2490
|
+
} catch (s) {
|
|
2491
|
+
console.error("Cleanup error:", s);
|
|
2492
|
+
}
|
|
2493
|
+
}), this.cleanupMap.delete(t)), t.parentNode && t.parentNode.removeChild(t), this.nodeMap.delete(e), e.element !== void 0 && (e.element = void 0);
|
|
2494
|
+
}
|
|
2495
|
+
/**
|
|
2496
|
+
* Create reactive text content
|
|
2497
|
+
*/
|
|
2498
|
+
createReactiveText(e) {
|
|
2499
|
+
const t = document.createTextNode("");
|
|
2500
|
+
return y(() => {
|
|
2501
|
+
t.textContent = e();
|
|
2502
|
+
}), t;
|
|
2503
|
+
}
|
|
2504
|
+
/**
|
|
2505
|
+
* Create reactive element with dynamic props
|
|
2506
|
+
*/
|
|
2507
|
+
createReactiveElement(e, t, r) {
|
|
2508
|
+
const n = document.createElement(e);
|
|
2509
|
+
return y(() => {
|
|
2510
|
+
const s = t();
|
|
2511
|
+
this.applyProps(n, s);
|
|
2512
|
+
}), r && r.forEach((s) => {
|
|
2513
|
+
const o = this.renderSingle(s);
|
|
2514
|
+
n.appendChild(o);
|
|
2515
|
+
}), n;
|
|
2516
|
+
}
|
|
2517
|
+
/**
|
|
2518
|
+
* Apply modifiers to a DOM element
|
|
2519
|
+
*/
|
|
2520
|
+
applyModifiersToElement(e, t, r) {
|
|
2521
|
+
try {
|
|
2522
|
+
const n = r.componentInstance || r.componentMetadata && r.componentMetadata.componentInstance || r;
|
|
2523
|
+
ei(
|
|
2524
|
+
r,
|
|
2525
|
+
t,
|
|
2526
|
+
{
|
|
2527
|
+
element: e,
|
|
2528
|
+
componentId: r.componentId || "unknown",
|
|
2529
|
+
phase: "creation",
|
|
2530
|
+
componentInstance: n
|
|
2531
|
+
// Pass the component instance
|
|
2532
|
+
},
|
|
2533
|
+
{
|
|
2534
|
+
batch: !0
|
|
2535
|
+
// Enable batched modifier application
|
|
2536
|
+
}
|
|
2537
|
+
);
|
|
2538
|
+
} catch (n) {
|
|
2539
|
+
console.error("Failed to apply modifiers to element:", n);
|
|
2540
|
+
}
|
|
2541
|
+
}
|
|
2542
|
+
/**
|
|
2543
|
+
* Cleanup all tracked elements
|
|
2544
|
+
*/
|
|
2545
|
+
cleanup() {
|
|
2546
|
+
for (const e of this.renderedNodes)
|
|
2547
|
+
if (e.dispose && typeof e.dispose == "function")
|
|
2548
|
+
try {
|
|
2549
|
+
e.dispose();
|
|
2550
|
+
} catch (t) {
|
|
2551
|
+
console.error("Cleanup error:", t);
|
|
2552
|
+
}
|
|
2553
|
+
this.renderedNodes.clear(), this.nodeMap = /* @__PURE__ */ new WeakMap(), this.cleanupMap = /* @__PURE__ */ new WeakMap();
|
|
2554
|
+
}
|
|
2555
|
+
}
|
|
2556
|
+
const B = new bi();
|
|
2557
|
+
function Di(i, e) {
|
|
2558
|
+
return q(() => {
|
|
2559
|
+
let t = [];
|
|
2560
|
+
const r = y(() => {
|
|
2561
|
+
t.forEach((o) => {
|
|
2562
|
+
B.removeNode(o);
|
|
2563
|
+
});
|
|
2564
|
+
const n = i.render(), s = Array.isArray(n) ? n : [n];
|
|
2565
|
+
t = s, s.forEach((o) => {
|
|
2566
|
+
B.render(o, e);
|
|
2567
|
+
});
|
|
2568
|
+
});
|
|
2569
|
+
return () => {
|
|
2570
|
+
r.dispose(), t.forEach((n) => {
|
|
2571
|
+
B.removeNode(n);
|
|
2572
|
+
});
|
|
2573
|
+
};
|
|
2574
|
+
});
|
|
2575
|
+
}
|
|
2576
|
+
function vi(i, e, ...t) {
|
|
2577
|
+
const r = t.flat().filter((s) => s != null).map((s) => typeof s == "string" || typeof s == "number" ? { type: "text", text: String(s) } : s);
|
|
2578
|
+
return {
|
|
2579
|
+
type: "element",
|
|
2580
|
+
tag: i,
|
|
2581
|
+
props: e || {},
|
|
2582
|
+
children: r
|
|
2583
|
+
};
|
|
2584
|
+
}
|
|
2585
|
+
function Hi(i) {
|
|
2586
|
+
if (S(i) || E(i) || typeof i == "function") {
|
|
2587
|
+
const e = {
|
|
2588
|
+
type: "text",
|
|
2589
|
+
text: "",
|
|
2590
|
+
dispose: void 0
|
|
2591
|
+
}, t = q(() => {
|
|
2592
|
+
const r = y(() => {
|
|
2593
|
+
const n = i();
|
|
2594
|
+
if (e.text = String(n), e.element && e.element instanceof Text) {
|
|
2595
|
+
const s = e.element.parentElement;
|
|
2596
|
+
if (s && s.__tachui_asHTML)
|
|
2597
|
+
return;
|
|
2598
|
+
e.element.textContent = e.text;
|
|
2599
|
+
}
|
|
2600
|
+
});
|
|
2601
|
+
return () => {
|
|
2602
|
+
r.dispose();
|
|
2603
|
+
};
|
|
2604
|
+
});
|
|
2605
|
+
return e.dispose = t, e;
|
|
2606
|
+
}
|
|
2607
|
+
return {
|
|
2608
|
+
type: "text",
|
|
2609
|
+
text: i
|
|
2610
|
+
};
|
|
2611
|
+
}
|
|
2612
|
+
var wi = Object.defineProperty, Si = (i, e, t) => e in i ? wi(i, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : i[e] = t, v = (i, e, t) => Si(i, typeof e != "symbol" ? e + "" : e, t);
|
|
2613
|
+
class b {
|
|
2614
|
+
// Make segments public
|
|
2615
|
+
constructor(e, t, r = !0) {
|
|
2616
|
+
this.metadata = t, v(this, "type", "component"), v(this, "id"), v(this, "mounted", !1), v(this, "cleanup", []), v(this, "props", {}), v(this, "segments"), this.id = `concat-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`, this.segments = e;
|
|
2617
|
+
}
|
|
2618
|
+
/**
|
|
2619
|
+
* Render the concatenated component to DOM nodes (Enhanced - Phase 4.2)
|
|
2620
|
+
*/
|
|
2621
|
+
render() {
|
|
2622
|
+
const e = this.determineContainerClass(), t = this.buildAccessibilityLabel(), r = this.buildAccessibilityAttributes(), n = this.segments.map((o) => o.render()).flat();
|
|
2623
|
+
return [vi("span", {
|
|
2624
|
+
class: `tachui-concatenated ${e}`,
|
|
2625
|
+
...r,
|
|
2626
|
+
"aria-label": t || void 0,
|
|
2627
|
+
// Enhanced live region support for dynamic content
|
|
2628
|
+
...this.hasInteractiveContent() && {
|
|
2629
|
+
"aria-live": "polite",
|
|
2630
|
+
"aria-atomic": "true"
|
|
2631
|
+
},
|
|
2632
|
+
// Add debug information in development
|
|
2633
|
+
...process.env.NODE_ENV === "development" && {
|
|
2634
|
+
"data-concatenated-segments": this.segments.length,
|
|
2635
|
+
"data-semantic-structure": this.metadata.semanticStructure,
|
|
2636
|
+
"data-accessibility-role": this.metadata.accessibilityRole
|
|
2637
|
+
}
|
|
2638
|
+
}, ...n)];
|
|
2639
|
+
}
|
|
2640
|
+
/**
|
|
2641
|
+
* Build comprehensive accessibility attributes
|
|
2642
|
+
*/
|
|
2643
|
+
buildAccessibilityAttributes() {
|
|
2644
|
+
const e = {};
|
|
2645
|
+
switch (this.metadata.accessibilityRole) {
|
|
2646
|
+
case "text":
|
|
2647
|
+
break;
|
|
2648
|
+
case "group":
|
|
2649
|
+
e.role = "group", e["aria-describedby"] = this.generateGroupDescription();
|
|
2650
|
+
break;
|
|
2651
|
+
case "composite":
|
|
2652
|
+
e.role = "group", e["aria-roledescription"] = "interactive content group";
|
|
2653
|
+
break;
|
|
2654
|
+
}
|
|
2655
|
+
return this.metadata.semanticStructure === "mixed" && this.segments.length > 2 && (e["aria-flowto"] = this.generateFlowTargets()), this.hasInteractiveContent() && (e.tabindex = "0", e["aria-description"] = "Contains interactive elements. Use Tab to navigate."), e;
|
|
2656
|
+
}
|
|
2657
|
+
/**
|
|
2658
|
+
* Generate description for grouped content
|
|
2659
|
+
*/
|
|
2660
|
+
generateGroupDescription() {
|
|
2661
|
+
const e = this.getUniqueComponentTypes();
|
|
2662
|
+
return e.length === 1 ? `Group of ${this.segments.length} ${e[0]} elements` : `Group containing ${e.join(", ")} elements`;
|
|
2663
|
+
}
|
|
2664
|
+
/**
|
|
2665
|
+
* Generate flow targets for reading order
|
|
2666
|
+
*/
|
|
2667
|
+
generateFlowTargets() {
|
|
2668
|
+
return "";
|
|
2669
|
+
}
|
|
2670
|
+
/**
|
|
2671
|
+
* Check if concatenated content contains interactive elements
|
|
2672
|
+
*/
|
|
2673
|
+
hasInteractiveContent() {
|
|
2674
|
+
return this.segments.some((e) => {
|
|
2675
|
+
const t = e.component.constructor.name;
|
|
2676
|
+
return t === "EnhancedButton" || t === "EnhancedLinkComponent";
|
|
2677
|
+
});
|
|
2678
|
+
}
|
|
2679
|
+
/**
|
|
2680
|
+
* Get unique component types in this concatenation
|
|
2681
|
+
*/
|
|
2682
|
+
getUniqueComponentTypes() {
|
|
2683
|
+
const e = new Set(this.segments.map((t) => {
|
|
2684
|
+
switch (t.component.constructor.name) {
|
|
2685
|
+
case "EnhancedText":
|
|
2686
|
+
return "text";
|
|
2687
|
+
case "EnhancedImage":
|
|
2688
|
+
return "image";
|
|
2689
|
+
case "EnhancedButton":
|
|
2690
|
+
return "button";
|
|
2691
|
+
case "EnhancedLinkComponent":
|
|
2692
|
+
return "link";
|
|
2693
|
+
default:
|
|
2694
|
+
return "component";
|
|
2695
|
+
}
|
|
2696
|
+
}));
|
|
2697
|
+
return Array.from(e);
|
|
2698
|
+
}
|
|
2699
|
+
/**
|
|
2700
|
+
* Concatenate this component with another concatenatable component
|
|
2701
|
+
*/
|
|
2702
|
+
concat(e) {
|
|
2703
|
+
let t, r;
|
|
2704
|
+
return e instanceof b ? (t = [...this.segments, ...e.segments], r = this.mergeMetadata(this.metadata, e.metadata, t.length)) : (t = [...this.segments, e.toSegment()], r = this.mergeMetadata(
|
|
2705
|
+
this.metadata,
|
|
2706
|
+
{
|
|
2707
|
+
totalSegments: 1,
|
|
2708
|
+
accessibilityRole: this.determineComponentAccessibilityRole(e),
|
|
2709
|
+
semanticStructure: this.determineComponentSemanticStructure(e)
|
|
2710
|
+
},
|
|
2711
|
+
t.length
|
|
2712
|
+
)), new b(t, r);
|
|
2713
|
+
}
|
|
2714
|
+
/**
|
|
2715
|
+
* Convert this concatenated component to a segment (for further concatenation)
|
|
2716
|
+
*/
|
|
2717
|
+
toSegment() {
|
|
2718
|
+
return {
|
|
2719
|
+
id: this.id,
|
|
2720
|
+
component: this,
|
|
2721
|
+
// Cast to satisfy interface requirements
|
|
2722
|
+
modifiers: [],
|
|
2723
|
+
// Concatenated components don't have their own modifiers
|
|
2724
|
+
render: () => this.render()[0]
|
|
2725
|
+
};
|
|
2726
|
+
}
|
|
2727
|
+
/**
|
|
2728
|
+
* Check if this component supports concatenation
|
|
2729
|
+
*/
|
|
2730
|
+
isConcatenatable() {
|
|
2731
|
+
return !0;
|
|
2732
|
+
}
|
|
2733
|
+
/**
|
|
2734
|
+
* Determine the appropriate CSS class for the container
|
|
2735
|
+
*/
|
|
2736
|
+
determineContainerClass() {
|
|
2737
|
+
const e = this.segments.map((o) => o.component.constructor.name), t = e.some((o) => o === "EnhancedImage"), r = e.some((o) => o === "EnhancedText"), n = e.some((o) => o === "EnhancedButton"), s = e.some((o) => o === "EnhancedLink");
|
|
2738
|
+
return t && r && (n || s) ? "mixed-content" : t && r ? "image-text-composition" : t && !r ? "image-composition" : r && !t ? "text-composition" : "generic-composition";
|
|
2739
|
+
}
|
|
2740
|
+
/**
|
|
2741
|
+
* Build comprehensive accessibility label for screen readers (Enhanced - Phase 4.2)
|
|
2742
|
+
*/
|
|
2743
|
+
buildAccessibilityLabel() {
|
|
2744
|
+
const t = this.segments.map((r) => this.extractAccessibilityText(r)).filter(Boolean);
|
|
2745
|
+
return t.length === 0 ? "" : this.joinAccessibilityLabels(t);
|
|
2746
|
+
}
|
|
2747
|
+
/**
|
|
2748
|
+
* Intelligently join accessibility labels based on content and structure
|
|
2749
|
+
*/
|
|
2750
|
+
joinAccessibilityLabels(e) {
|
|
2751
|
+
if (e.length === 1) return e[0];
|
|
2752
|
+
switch (this.metadata.semanticStructure) {
|
|
2753
|
+
case "inline":
|
|
2754
|
+
return e.join(" ");
|
|
2755
|
+
case "block":
|
|
2756
|
+
return e.join(". ");
|
|
2757
|
+
case "mixed":
|
|
2758
|
+
return this.smartJoinLabels(e);
|
|
2759
|
+
default:
|
|
2760
|
+
return e.join(" ");
|
|
2761
|
+
}
|
|
2762
|
+
}
|
|
2763
|
+
/**
|
|
2764
|
+
* Context-aware label joining for mixed content
|
|
2765
|
+
*/
|
|
2766
|
+
smartJoinLabels(e) {
|
|
2767
|
+
const t = [];
|
|
2768
|
+
for (let r = 0; r < e.length; r++) {
|
|
2769
|
+
const n = e[r], s = e[r + 1];
|
|
2770
|
+
t.push(n), s && (this.needsExplicitSeparator(n, s) ? t.push(". ") : t.push(" "));
|
|
2771
|
+
}
|
|
2772
|
+
return t.join("");
|
|
2773
|
+
}
|
|
2774
|
+
/**
|
|
2775
|
+
* Determine if two accessibility labels need explicit separation
|
|
2776
|
+
*/
|
|
2777
|
+
needsExplicitSeparator(e, t) {
|
|
2778
|
+
const r = /[.!?:;]$/.test(e.trim()), n = /^[A-Z]/.test(t.trim());
|
|
2779
|
+
return !r && n;
|
|
2780
|
+
}
|
|
2781
|
+
/**
|
|
2782
|
+
* Extract accessibility text from a component segment
|
|
2783
|
+
*/
|
|
2784
|
+
extractAccessibilityText(e) {
|
|
2785
|
+
const t = e.component;
|
|
2786
|
+
switch (t.constructor.name) {
|
|
2787
|
+
case "EnhancedText":
|
|
2788
|
+
return t.content || t.title || "";
|
|
2789
|
+
case "EnhancedImage":
|
|
2790
|
+
return t.alt || t.accessibilityLabel || "Image";
|
|
2791
|
+
case "EnhancedButton":
|
|
2792
|
+
return t.title || t.accessibilityLabel || "Button";
|
|
2793
|
+
case "EnhancedLink":
|
|
2794
|
+
return t.title || t.accessibilityLabel || "Link";
|
|
2795
|
+
case "ConcatenatedComponent":
|
|
2796
|
+
return t.buildAccessibilityLabel();
|
|
2797
|
+
default:
|
|
2798
|
+
return t.accessibilityLabel || "";
|
|
2799
|
+
}
|
|
2800
|
+
}
|
|
2801
|
+
/**
|
|
2802
|
+
* Merge metadata from two concatenation operations
|
|
2803
|
+
*/
|
|
2804
|
+
mergeMetadata(e, t, r) {
|
|
2805
|
+
return {
|
|
2806
|
+
totalSegments: r,
|
|
2807
|
+
accessibilityRole: this.mergeAccessibilityRoles(
|
|
2808
|
+
e.accessibilityRole,
|
|
2809
|
+
t.accessibilityRole
|
|
2810
|
+
),
|
|
2811
|
+
semanticStructure: this.mergeSemanticStructures(
|
|
2812
|
+
e.semanticStructure,
|
|
2813
|
+
t.semanticStructure
|
|
2814
|
+
)
|
|
2815
|
+
};
|
|
2816
|
+
}
|
|
2817
|
+
/**
|
|
2818
|
+
* Merge accessibility roles from two components
|
|
2819
|
+
*/
|
|
2820
|
+
mergeAccessibilityRoles(e, t) {
|
|
2821
|
+
return e === "text" && t === "text" ? "text" : e === "composite" || t === "composite" ? "composite" : "group";
|
|
2822
|
+
}
|
|
2823
|
+
/**
|
|
2824
|
+
* Merge semantic structures from two components
|
|
2825
|
+
*/
|
|
2826
|
+
mergeSemanticStructures(e, t) {
|
|
2827
|
+
return e === "inline" && t === "inline" ? "inline" : e === "block" && t === "block" ? "block" : "mixed";
|
|
2828
|
+
}
|
|
2829
|
+
/**
|
|
2830
|
+
* Determine accessibility role for a single component
|
|
2831
|
+
*/
|
|
2832
|
+
determineComponentAccessibilityRole(e) {
|
|
2833
|
+
switch (e.constructor.name) {
|
|
2834
|
+
case "EnhancedText":
|
|
2835
|
+
return "text";
|
|
2836
|
+
case "EnhancedImage":
|
|
2837
|
+
return "group";
|
|
2838
|
+
case "EnhancedButton":
|
|
2839
|
+
case "EnhancedLink":
|
|
2840
|
+
return "group";
|
|
2841
|
+
default:
|
|
2842
|
+
return "composite";
|
|
2843
|
+
}
|
|
2844
|
+
}
|
|
2845
|
+
/**
|
|
2846
|
+
* Determine semantic structure for a single component
|
|
2847
|
+
*/
|
|
2848
|
+
determineComponentSemanticStructure(e) {
|
|
2849
|
+
switch (e.constructor.name) {
|
|
2850
|
+
case "EnhancedText":
|
|
2851
|
+
case "EnhancedImage":
|
|
2852
|
+
return "inline";
|
|
2853
|
+
case "EnhancedButton":
|
|
2854
|
+
case "EnhancedLink":
|
|
2855
|
+
return "inline";
|
|
2856
|
+
// Buttons and links are typically inline in concatenation
|
|
2857
|
+
default:
|
|
2858
|
+
return "mixed";
|
|
2859
|
+
}
|
|
2860
|
+
}
|
|
2861
|
+
/**
|
|
2862
|
+
* Generate comprehensive accessibility tree for this concatenated component
|
|
2863
|
+
*/
|
|
2864
|
+
generateAccessibilityTree() {
|
|
2865
|
+
return {
|
|
2866
|
+
role: this.metadata.accessibilityRole,
|
|
2867
|
+
label: this.buildAccessibilityLabel(),
|
|
2868
|
+
children: this.segments.map((e) => this.segmentToAccessibilityNode(e))
|
|
2869
|
+
};
|
|
2870
|
+
}
|
|
2871
|
+
/**
|
|
2872
|
+
* Convert a component segment to an accessibility node
|
|
2873
|
+
*/
|
|
2874
|
+
segmentToAccessibilityNode(e) {
|
|
2875
|
+
const t = e.component;
|
|
2876
|
+
return {
|
|
2877
|
+
role: this.determineComponentAccessibilityRole(t),
|
|
2878
|
+
label: this.extractAccessibilityText(e),
|
|
2879
|
+
children: t instanceof b ? t.generateAccessibilityTree().children : void 0
|
|
2880
|
+
};
|
|
2881
|
+
}
|
|
2882
|
+
}
|
|
2883
|
+
export {
|
|
2884
|
+
Ii as A,
|
|
2885
|
+
K as B,
|
|
2886
|
+
b as C,
|
|
2887
|
+
bi as D,
|
|
2888
|
+
ui as E,
|
|
2889
|
+
li as F,
|
|
2890
|
+
Ri as G,
|
|
2891
|
+
mi as H,
|
|
2892
|
+
P as I,
|
|
2893
|
+
Ni as J,
|
|
2894
|
+
ki as K,
|
|
2895
|
+
Bi as L,
|
|
2896
|
+
Xt as M,
|
|
2897
|
+
xe as N,
|
|
2898
|
+
me as O,
|
|
2899
|
+
ge as P,
|
|
2900
|
+
ye as Q,
|
|
2901
|
+
be as R,
|
|
2902
|
+
T as S,
|
|
2903
|
+
J as T,
|
|
2904
|
+
$i as U,
|
|
2905
|
+
ai as V,
|
|
2906
|
+
Pi as W,
|
|
2907
|
+
Mi as a,
|
|
2908
|
+
ei as b,
|
|
2909
|
+
X as c,
|
|
2910
|
+
oi as d,
|
|
2911
|
+
Li as e,
|
|
2912
|
+
D as f,
|
|
2913
|
+
Qt as g,
|
|
2914
|
+
f as h,
|
|
2915
|
+
Ci as i,
|
|
2916
|
+
A as j,
|
|
2917
|
+
re as k,
|
|
2918
|
+
x as l,
|
|
2919
|
+
xi as m,
|
|
2920
|
+
se as n,
|
|
2921
|
+
ne as o,
|
|
2922
|
+
Le as p,
|
|
2923
|
+
oe as q,
|
|
2924
|
+
ae as r,
|
|
2925
|
+
ce as s,
|
|
2926
|
+
de as t,
|
|
2927
|
+
ue as u,
|
|
2928
|
+
vi as v,
|
|
2929
|
+
Di as w,
|
|
2930
|
+
Hi as x,
|
|
2931
|
+
ci as y,
|
|
2932
|
+
di as z
|
|
2933
|
+
};
|