@number10/jsx-core 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +667 -0
- package/README.md +38 -0
- package/dist/animation/animated-signal.cjs +19 -0
- package/dist/animation/animated-signal.cjs.map +1 -0
- package/dist/animation/animated-signal.d.ts +35 -0
- package/dist/animation/animated-signal.d.ts.map +1 -0
- package/dist/animation/animated-signal.js +19 -0
- package/dist/animation/animated-signal.js.map +1 -0
- package/dist/animation/create-spring.cjs +80 -0
- package/dist/animation/create-spring.cjs.map +1 -0
- package/dist/animation/create-spring.d.ts +56 -0
- package/dist/animation/create-spring.d.ts.map +1 -0
- package/dist/animation/create-spring.js +80 -0
- package/dist/animation/create-spring.js.map +1 -0
- package/dist/animation/easing.cjs +76 -0
- package/dist/animation/easing.cjs.map +1 -0
- package/dist/animation/easing.d.ts +45 -0
- package/dist/animation/easing.d.ts.map +1 -0
- package/dist/animation/easing.js +76 -0
- package/dist/animation/easing.js.map +1 -0
- package/dist/animation/effect-definitions.cjs +441 -0
- package/dist/animation/effect-definitions.cjs.map +1 -0
- package/dist/animation/effect-definitions.d.ts +60 -0
- package/dist/animation/effect-definitions.d.ts.map +1 -0
- package/dist/animation/effect-definitions.js +441 -0
- package/dist/animation/effect-definitions.js.map +1 -0
- package/dist/animation/effect-engine.cjs +189 -0
- package/dist/animation/effect-engine.cjs.map +1 -0
- package/dist/animation/effect-engine.d.ts +70 -0
- package/dist/animation/effect-engine.d.ts.map +1 -0
- package/dist/animation/effect-engine.js +189 -0
- package/dist/animation/effect-engine.js.map +1 -0
- package/dist/animation/index.d.ts +24 -0
- package/dist/animation/index.d.ts.map +1 -0
- package/dist/animation/spring-physics.cjs +94 -0
- package/dist/animation/spring-physics.cjs.map +1 -0
- package/dist/animation/spring-physics.d.ts +145 -0
- package/dist/animation/spring-physics.d.ts.map +1 -0
- package/dist/animation/spring-physics.js +94 -0
- package/dist/animation/spring-physics.js.map +1 -0
- package/dist/animation/tween.cjs +67 -0
- package/dist/animation/tween.cjs.map +1 -0
- package/dist/animation/tween.d.ts +60 -0
- package/dist/animation/tween.d.ts.map +1 -0
- package/dist/animation/tween.js +67 -0
- package/dist/animation/tween.js.map +1 -0
- package/dist/animation/types.d.ts +31 -0
- package/dist/animation/types.d.ts.map +1 -0
- package/dist/animation/useSpring.cjs +152 -0
- package/dist/animation/useSpring.cjs.map +1 -0
- package/dist/animation/useSpring.d.ts +55 -0
- package/dist/animation/useSpring.d.ts.map +1 -0
- package/dist/animation/useSpring.js +149 -0
- package/dist/animation/useSpring.js.map +1 -0
- package/dist/animation/useTween.cjs +208 -0
- package/dist/animation/useTween.cjs.map +1 -0
- package/dist/animation/useTween.d.ts +116 -0
- package/dist/animation/useTween.d.ts.map +1 -0
- package/dist/animation/useTween.js +208 -0
- package/dist/animation/useTween.js.map +1 -0
- package/dist/border-geometry.cjs +447 -0
- package/dist/border-geometry.cjs.map +1 -0
- package/dist/border-geometry.d.ts +114 -0
- package/dist/border-geometry.d.ts.map +1 -0
- package/dist/border-geometry.js +447 -0
- package/dist/border-geometry.js.map +1 -0
- package/dist/colors/color-presets.cjs +236 -0
- package/dist/colors/color-presets.cjs.map +1 -0
- package/dist/colors/color-presets.d.ts +89 -0
- package/dist/colors/color-presets.d.ts.map +1 -0
- package/dist/colors/color-presets.js +236 -0
- package/dist/colors/color-presets.js.map +1 -0
- package/dist/colors/color-theme-helpers.cjs +32 -0
- package/dist/colors/color-theme-helpers.cjs.map +1 -0
- package/dist/colors/color-theme-helpers.d.ts +65 -0
- package/dist/colors/color-theme-helpers.d.ts.map +1 -0
- package/dist/colors/color-theme-helpers.js +32 -0
- package/dist/colors/color-theme-helpers.js.map +1 -0
- package/dist/colors/color-types.cjs +38 -0
- package/dist/colors/color-types.cjs.map +1 -0
- package/dist/colors/color-types.d.ts +112 -0
- package/dist/colors/color-types.d.ts.map +1 -0
- package/dist/colors/color-types.js +38 -0
- package/dist/colors/color-types.js.map +1 -0
- package/dist/colors/color-utils.cjs +197 -0
- package/dist/colors/color-utils.cjs.map +1 -0
- package/dist/colors/color-utils.d.ts +216 -0
- package/dist/colors/color-utils.d.ts.map +1 -0
- package/dist/colors/color-utils.js +197 -0
- package/dist/colors/color-utils.js.map +1 -0
- package/dist/colors/contrast-contracts.cjs +265 -0
- package/dist/colors/contrast-contracts.cjs.map +1 -0
- package/dist/colors/contrast-contracts.d.ts +289 -0
- package/dist/colors/contrast-contracts.d.ts.map +1 -0
- package/dist/colors/contrast-contracts.js +265 -0
- package/dist/colors/contrast-contracts.js.map +1 -0
- package/dist/colors/index.cjs +55 -0
- package/dist/colors/index.cjs.map +1 -0
- package/dist/colors/index.d.ts +16 -0
- package/dist/colors/index.d.ts.map +1 -0
- package/dist/colors/index.js +55 -0
- package/dist/colors/index.js.map +1 -0
- package/dist/core-props.cjs +66 -0
- package/dist/core-props.cjs.map +1 -0
- package/dist/core-props.d.ts +395 -0
- package/dist/core-props.d.ts.map +1 -0
- package/dist/core-props.js +66 -0
- package/dist/core-props.js.map +1 -0
- package/dist/design-tokens/design-token-presets.cjs +91 -0
- package/dist/design-tokens/design-token-presets.cjs.map +1 -0
- package/dist/design-tokens/design-token-presets.d.ts +34 -0
- package/dist/design-tokens/design-token-presets.d.ts.map +1 -0
- package/dist/design-tokens/design-token-presets.js +91 -0
- package/dist/design-tokens/design-token-presets.js.map +1 -0
- package/dist/design-tokens/design-token-types.d.ts +97 -0
- package/dist/design-tokens/design-token-types.d.ts.map +1 -0
- package/dist/design-tokens/index.cjs +10 -0
- package/dist/design-tokens/index.cjs.map +1 -0
- package/dist/design-tokens/index.d.ts +9 -0
- package/dist/design-tokens/index.d.ts.map +1 -0
- package/dist/design-tokens/index.js +10 -0
- package/dist/design-tokens/index.js.map +1 -0
- package/dist/dev-config.cjs +296 -0
- package/dist/dev-config.cjs.map +1 -0
- package/dist/dev-config.d.ts +238 -0
- package/dist/dev-config.d.ts.map +1 -0
- package/dist/dev-config.js +296 -0
- package/dist/dev-config.js.map +1 -0
- package/dist/effects.cjs +69 -0
- package/dist/effects.cjs.map +1 -0
- package/dist/effects.d.ts +152 -0
- package/dist/effects.d.ts.map +1 -0
- package/dist/effects.js +69 -0
- package/dist/effects.js.map +1 -0
- package/dist/global-registry.cjs +25 -0
- package/dist/global-registry.cjs.map +1 -0
- package/dist/global-registry.d.ts +19 -0
- package/dist/global-registry.d.ts.map +1 -0
- package/dist/global-registry.js +25 -0
- package/dist/global-registry.js.map +1 -0
- package/dist/hooks.cjs +378 -0
- package/dist/hooks.cjs.map +1 -0
- package/dist/hooks.d.ts +322 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +378 -0
- package/dist/hooks.js.map +1 -0
- package/dist/host-adapter.d.ts +414 -0
- package/dist/host-adapter.d.ts.map +1 -0
- package/dist/index.cjs +229 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +226 -0
- package/dist/index.js.map +1 -0
- package/dist/jsx-dev-runtime.cjs +10 -0
- package/dist/jsx-dev-runtime.cjs.map +1 -0
- package/dist/jsx-dev-runtime.d.ts +5 -0
- package/dist/jsx-dev-runtime.d.ts.map +1 -0
- package/dist/jsx-dev-runtime.js +11 -0
- package/dist/jsx-dev-runtime.js.map +1 -0
- package/dist/jsx-runtime.cjs +44 -0
- package/dist/jsx-runtime.cjs.map +1 -0
- package/dist/jsx-runtime.d.ts +24 -0
- package/dist/jsx-runtime.d.ts.map +1 -0
- package/dist/jsx-runtime.js +44 -0
- package/dist/jsx-runtime.js.map +1 -0
- package/dist/jsx-types.d.ts +25 -0
- package/dist/jsx-types.d.ts.map +1 -0
- package/dist/layout/appliers/container-applier.cjs +20 -0
- package/dist/layout/appliers/container-applier.cjs.map +1 -0
- package/dist/layout/appliers/container-applier.d.ts +9 -0
- package/dist/layout/appliers/container-applier.d.ts.map +1 -0
- package/dist/layout/appliers/container-applier.js +20 -0
- package/dist/layout/appliers/container-applier.js.map +1 -0
- package/dist/layout/appliers/position-applier.cjs +31 -0
- package/dist/layout/appliers/position-applier.cjs.map +1 -0
- package/dist/layout/appliers/position-applier.d.ts +8 -0
- package/dist/layout/appliers/position-applier.d.ts.map +1 -0
- package/dist/layout/appliers/position-applier.js +31 -0
- package/dist/layout/appliers/position-applier.js.map +1 -0
- package/dist/layout/layout-engine-test-utils.d.ts +26 -0
- package/dist/layout/layout-engine-test-utils.d.ts.map +1 -0
- package/dist/layout/layout-engine.cjs +628 -0
- package/dist/layout/layout-engine.cjs.map +1 -0
- package/dist/layout/layout-engine.d.ts +140 -0
- package/dist/layout/layout-engine.d.ts.map +1 -0
- package/dist/layout/layout-engine.js +628 -0
- package/dist/layout/layout-engine.js.map +1 -0
- package/dist/layout/strategies/base-strategy.cjs +31 -0
- package/dist/layout/strategies/base-strategy.cjs.map +1 -0
- package/dist/layout/strategies/base-strategy.d.ts +59 -0
- package/dist/layout/strategies/base-strategy.d.ts.map +1 -0
- package/dist/layout/strategies/base-strategy.js +31 -0
- package/dist/layout/strategies/base-strategy.js.map +1 -0
- package/dist/layout/strategies/column-layout.cjs +145 -0
- package/dist/layout/strategies/column-layout.cjs.map +1 -0
- package/dist/layout/strategies/column-layout.d.ts +38 -0
- package/dist/layout/strategies/column-layout.d.ts.map +1 -0
- package/dist/layout/strategies/column-layout.js +145 -0
- package/dist/layout/strategies/column-layout.js.map +1 -0
- package/dist/layout/strategies/row-layout.cjs +145 -0
- package/dist/layout/strategies/row-layout.cjs.map +1 -0
- package/dist/layout/strategies/row-layout.d.ts +38 -0
- package/dist/layout/strategies/row-layout.d.ts.map +1 -0
- package/dist/layout/strategies/row-layout.js +145 -0
- package/dist/layout/strategies/row-layout.js.map +1 -0
- package/dist/layout/strategies/stack-layout.cjs +94 -0
- package/dist/layout/strategies/stack-layout.cjs.map +1 -0
- package/dist/layout/strategies/stack-layout.d.ts +30 -0
- package/dist/layout/strategies/stack-layout.d.ts.map +1 -0
- package/dist/layout/strategies/stack-layout.js +94 -0
- package/dist/layout/strategies/stack-layout.js.map +1 -0
- package/dist/layout/types.d.ts +134 -0
- package/dist/layout/types.d.ts.map +1 -0
- package/dist/layout/utils/child-utils.cjs +129 -0
- package/dist/layout/utils/child-utils.cjs.map +1 -0
- package/dist/layout/utils/child-utils.d.ts +54 -0
- package/dist/layout/utils/child-utils.d.ts.map +1 -0
- package/dist/layout/utils/child-utils.js +129 -0
- package/dist/layout/utils/child-utils.js.map +1 -0
- package/dist/layout/utils/dimension-calculator.cjs +109 -0
- package/dist/layout/utils/dimension-calculator.cjs.map +1 -0
- package/dist/layout/utils/dimension-calculator.d.ts +59 -0
- package/dist/layout/utils/dimension-calculator.d.ts.map +1 -0
- package/dist/layout/utils/dimension-calculator.js +109 -0
- package/dist/layout/utils/dimension-calculator.js.map +1 -0
- package/dist/layout/utils/flex-distributor.cjs +173 -0
- package/dist/layout/utils/flex-distributor.cjs.map +1 -0
- package/dist/layout/utils/flex-distributor.d.ts +18 -0
- package/dist/layout/utils/flex-distributor.d.ts.map +1 -0
- package/dist/layout/utils/flex-distributor.js +173 -0
- package/dist/layout/utils/flex-distributor.js.map +1 -0
- package/dist/layout/utils/size-resolver.cjs +280 -0
- package/dist/layout/utils/size-resolver.cjs.map +1 -0
- package/dist/layout/utils/size-resolver.d.ts +84 -0
- package/dist/layout/utils/size-resolver.d.ts.map +1 -0
- package/dist/layout/utils/size-resolver.js +280 -0
- package/dist/layout/utils/size-resolver.js.map +1 -0
- package/dist/layout/utils/spacing-calculator.cjs +50 -0
- package/dist/layout/utils/spacing-calculator.cjs.map +1 -0
- package/dist/layout/utils/spacing-calculator.d.ts +27 -0
- package/dist/layout/utils/spacing-calculator.d.ts.map +1 -0
- package/dist/layout/utils/spacing-calculator.js +50 -0
- package/dist/layout/utils/spacing-calculator.js.map +1 -0
- package/dist/memo.cjs +18 -0
- package/dist/memo.cjs.map +1 -0
- package/dist/memo.d.ts +29 -0
- package/dist/memo.d.ts.map +1 -0
- package/dist/memo.js +18 -0
- package/dist/memo.js.map +1 -0
- package/dist/nineslice-contract.cjs +60 -0
- package/dist/nineslice-contract.cjs.map +1 -0
- package/dist/nineslice-contract.d.ts +107 -0
- package/dist/nineslice-contract.d.ts.map +1 -0
- package/dist/nineslice-contract.js +60 -0
- package/dist/nineslice-contract.js.map +1 -0
- package/dist/placeholder.cjs +12 -0
- package/dist/placeholder.cjs.map +1 -0
- package/dist/placeholder.d.ts +44 -0
- package/dist/placeholder.d.ts.map +1 -0
- package/dist/placeholder.js +12 -0
- package/dist/placeholder.js.map +1 -0
- package/dist/portal.cjs +89 -0
- package/dist/portal.cjs.map +1 -0
- package/dist/portal.d.ts +62 -0
- package/dist/portal.d.ts.map +1 -0
- package/dist/portal.js +89 -0
- package/dist/portal.js.map +1 -0
- package/dist/primitive-contracts.cjs +12 -0
- package/dist/primitive-contracts.cjs.map +1 -0
- package/dist/primitive-contracts.d.ts +186 -0
- package/dist/primitive-contracts.d.ts.map +1 -0
- package/dist/primitive-contracts.js +12 -0
- package/dist/primitive-contracts.js.map +1 -0
- package/dist/theme.cjs +332 -0
- package/dist/theme.cjs.map +1 -0
- package/dist/theme.d.ts +204 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +332 -0
- package/dist/theme.js.map +1 -0
- package/dist/types.d.ts +86 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/vdom/create-runtime.cjs +79 -0
- package/dist/vdom/create-runtime.cjs.map +1 -0
- package/dist/vdom/create-runtime.d.ts +7 -0
- package/dist/vdom/create-runtime.d.ts.map +1 -0
- package/dist/vdom/create-runtime.js +79 -0
- package/dist/vdom/create-runtime.js.map +1 -0
- package/dist/vdom/index.cjs +8 -0
- package/dist/vdom/index.cjs.map +1 -0
- package/dist/vdom/index.d.ts +4 -0
- package/dist/vdom/index.d.ts.map +1 -0
- package/dist/vdom/index.js +8 -0
- package/dist/vdom/index.js.map +1 -0
- package/dist/vdom/mount.cjs +161 -0
- package/dist/vdom/mount.cjs.map +1 -0
- package/dist/vdom/mount.d.ts +6 -0
- package/dist/vdom/mount.d.ts.map +1 -0
- package/dist/vdom/mount.js +161 -0
- package/dist/vdom/mount.js.map +1 -0
- package/dist/vdom/patch.cjs +163 -0
- package/dist/vdom/patch.cjs.map +1 -0
- package/dist/vdom/patch.d.ts +3 -0
- package/dist/vdom/patch.d.ts.map +1 -0
- package/dist/vdom/patch.js +163 -0
- package/dist/vdom/patch.js.map +1 -0
- package/dist/vdom/registry.cjs +85 -0
- package/dist/vdom/registry.cjs.map +1 -0
- package/dist/vdom/registry.d.ts +28 -0
- package/dist/vdom/registry.d.ts.map +1 -0
- package/dist/vdom/registry.js +85 -0
- package/dist/vdom/registry.js.map +1 -0
- package/dist/vdom/runtime-helpers.cjs +23 -0
- package/dist/vdom/runtime-helpers.cjs.map +1 -0
- package/dist/vdom/runtime-helpers.d.ts +8 -0
- package/dist/vdom/runtime-helpers.d.ts.map +1 -0
- package/dist/vdom/runtime-helpers.js +23 -0
- package/dist/vdom/runtime-helpers.js.map +1 -0
- package/dist/vdom/surface.cjs +107 -0
- package/dist/vdom/surface.cjs.map +1 -0
- package/dist/vdom/surface.d.ts +9 -0
- package/dist/vdom/surface.d.ts.map +1 -0
- package/dist/vdom/surface.js +107 -0
- package/dist/vdom/surface.js.map +1 -0
- package/dist/vdom/types.d.ts +104 -0
- package/dist/vdom/types.d.ts.map +1 -0
- package/dist/vdom/utils.cjs +146 -0
- package/dist/vdom/utils.cjs.map +1 -0
- package/dist/vdom/utils.d.ts +24 -0
- package/dist/vdom/utils.d.ts.map +1 -0
- package/dist/vdom/utils.js +146 -0
- package/dist/vdom/utils.js.map +1 -0
- package/dist/vdom.d.ts +4 -0
- package/dist/vdom.d.ts.map +1 -0
- package/dist/vector-draw-context.d.ts +63 -0
- package/dist/vector-draw-context.d.ts.map +1 -0
- package/package.json +161 -0
- package/vdom/index.cjs +1 -0
- package/vdom/index.d.ts +1 -0
- package/vdom/index.js +1 -0
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const devConfig = require("../../dev-config.cjs");
|
|
4
|
+
const parseSizeCache = /* @__PURE__ */ new Map();
|
|
5
|
+
const warnedSizes = /* @__PURE__ */ new Set();
|
|
6
|
+
function parseCalcOperand(operand) {
|
|
7
|
+
const trimmed = operand.trim();
|
|
8
|
+
const percentMatch = trimmed.match(/^(\d+(?:\.\d+)?)%$/);
|
|
9
|
+
if (percentMatch && percentMatch[1]) {
|
|
10
|
+
return { type: "percent", value: parseFloat(percentMatch[1]) };
|
|
11
|
+
}
|
|
12
|
+
const vwMatch = trimmed.match(/^(\d+(?:\.\d+)?)vw$/);
|
|
13
|
+
if (vwMatch && vwMatch[1]) {
|
|
14
|
+
return { type: "vw", value: parseFloat(vwMatch[1]) };
|
|
15
|
+
}
|
|
16
|
+
const vhMatch = trimmed.match(/^(\d+(?:\.\d+)?)vh$/);
|
|
17
|
+
if (vhMatch && vhMatch[1]) {
|
|
18
|
+
return { type: "vh", value: parseFloat(vhMatch[1]) };
|
|
19
|
+
}
|
|
20
|
+
const pixelMatch = trimmed.match(/^(-?\d+(?:\.\d+)?)(?:px)?$/);
|
|
21
|
+
if (pixelMatch && pixelMatch[1]) {
|
|
22
|
+
return { type: "fixed", value: parseFloat(pixelMatch[1]) };
|
|
23
|
+
}
|
|
24
|
+
throw new Error(`[Size] Invalid calc operand: "${operand}"`);
|
|
25
|
+
}
|
|
26
|
+
function parseCalcExpression(expr) {
|
|
27
|
+
expr = expr.replace(/\s+/g, "");
|
|
28
|
+
function parseExpression(str) {
|
|
29
|
+
str = str.trim();
|
|
30
|
+
if (str.startsWith("(") && str.endsWith(")")) {
|
|
31
|
+
return parseExpression(str.slice(1, -1));
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
return parseCalcOperand(str);
|
|
35
|
+
} catch {
|
|
36
|
+
}
|
|
37
|
+
const operators = ["+", "-", "*", "/"];
|
|
38
|
+
let parenDepth = 0;
|
|
39
|
+
let lastOpIndex = -1;
|
|
40
|
+
let lastOp = "";
|
|
41
|
+
for (let i = str.length - 1; i >= 0; i--) {
|
|
42
|
+
const char = str.charAt(i);
|
|
43
|
+
if (char === ")") parenDepth++;
|
|
44
|
+
else if (char === "(") parenDepth--;
|
|
45
|
+
else if (parenDepth === 0 && operators.includes(char)) {
|
|
46
|
+
if (char === "*" || char === "/" || lastOp !== "*" && lastOp !== "/") {
|
|
47
|
+
lastOpIndex = i;
|
|
48
|
+
lastOp = char;
|
|
49
|
+
if (char === "+" || char === "-") break;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (lastOpIndex === -1) {
|
|
54
|
+
throw new Error(`[Size] No valid operator found in calc expression: "${str}"`);
|
|
55
|
+
}
|
|
56
|
+
const leftStr = str.slice(0, lastOpIndex);
|
|
57
|
+
const rightStr = str.slice(lastOpIndex + 1);
|
|
58
|
+
if (!leftStr || !rightStr) {
|
|
59
|
+
throw new Error(`[Size] Invalid calc expression: "${str}"`);
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
left: parseExpression(leftStr),
|
|
63
|
+
operator: lastOp,
|
|
64
|
+
right: parseExpression(rightStr)
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
return parseExpression(expr);
|
|
68
|
+
}
|
|
69
|
+
function parseSize(size) {
|
|
70
|
+
const cached = parseSizeCache.get(size);
|
|
71
|
+
if (cached !== void 0) {
|
|
72
|
+
return cached;
|
|
73
|
+
}
|
|
74
|
+
const result = parseSizeInternal(size);
|
|
75
|
+
parseSizeCache.set(size, result);
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
function parseSizeInternal(size) {
|
|
79
|
+
if (size === void 0) {
|
|
80
|
+
return { type: "auto" };
|
|
81
|
+
}
|
|
82
|
+
if (typeof size === "number") {
|
|
83
|
+
return { type: "fixed", value: size };
|
|
84
|
+
}
|
|
85
|
+
if (size === "auto") {
|
|
86
|
+
return { type: "auto" };
|
|
87
|
+
}
|
|
88
|
+
if (size === "fill") {
|
|
89
|
+
return { type: "fill" };
|
|
90
|
+
}
|
|
91
|
+
const calcMatch = size.match(/^calc\((.+)\)$/);
|
|
92
|
+
if (calcMatch && calcMatch[1]) {
|
|
93
|
+
return { type: "calc", calc: parseCalcExpression(calcMatch[1]) };
|
|
94
|
+
}
|
|
95
|
+
const percentMatch = size.match(/^(\d+(?:\.\d+)?)%$/);
|
|
96
|
+
if (percentMatch && percentMatch[1]) {
|
|
97
|
+
const value = parseFloat(percentMatch[1]);
|
|
98
|
+
if (value < 0 || value > 100) {
|
|
99
|
+
const warnKey = `percent:${value}`;
|
|
100
|
+
if (!warnedSizes.has(warnKey)) {
|
|
101
|
+
warnedSizes.add(warnKey);
|
|
102
|
+
devConfig.DebugLogger.warn("Size", `Percentage value ${value}% is outside valid range (0-100%)`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return { type: "percent", value };
|
|
106
|
+
}
|
|
107
|
+
const vwMatch = size.match(/^(\d+(?:\.\d+)?)vw$/);
|
|
108
|
+
if (vwMatch && vwMatch[1]) {
|
|
109
|
+
return { type: "vw", value: parseFloat(vwMatch[1]) };
|
|
110
|
+
}
|
|
111
|
+
const vhMatch = size.match(/^(\d+(?:\.\d+)?)vh$/);
|
|
112
|
+
if (vhMatch && vhMatch[1]) {
|
|
113
|
+
return { type: "vh", value: parseFloat(vhMatch[1]) };
|
|
114
|
+
}
|
|
115
|
+
throw new Error(
|
|
116
|
+
`[Size] Invalid size format: "${size}". Supported formats: number, "X%", "XvW", "Xvh", "calc(...)", "auto", "fill", undefined`
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
function resolveCalcOperand(operand, parentSize, viewportSize) {
|
|
120
|
+
if ("type" in operand) {
|
|
121
|
+
if (operand.type === "fixed") {
|
|
122
|
+
return operand.value;
|
|
123
|
+
}
|
|
124
|
+
if (operand.type === "percent") {
|
|
125
|
+
if (parentSize === void 0) {
|
|
126
|
+
return 0;
|
|
127
|
+
}
|
|
128
|
+
return parentSize * operand.value / 100;
|
|
129
|
+
}
|
|
130
|
+
if (operand.type === "vw") {
|
|
131
|
+
const viewport = viewportSize || { width: 0 };
|
|
132
|
+
if (!viewport) {
|
|
133
|
+
devConfig.DebugLogger.warn("Size", "Cannot resolve vw without viewport size. Using 0.");
|
|
134
|
+
return 0;
|
|
135
|
+
}
|
|
136
|
+
return viewport.width * operand.value / 100;
|
|
137
|
+
}
|
|
138
|
+
if (operand.type === "vh") {
|
|
139
|
+
const viewport = viewportSize || { height: 0 };
|
|
140
|
+
if (!viewport) {
|
|
141
|
+
devConfig.DebugLogger.warn("Size", "Cannot resolve vh without viewport size. Using 0.");
|
|
142
|
+
return 0;
|
|
143
|
+
}
|
|
144
|
+
return viewport.height * operand.value / 100;
|
|
145
|
+
}
|
|
146
|
+
return 0;
|
|
147
|
+
} else {
|
|
148
|
+
return resolveCalcExpression(operand, parentSize, viewportSize);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
function resolveCalcExpression(calc, parentSize, viewportSize) {
|
|
152
|
+
const left = resolveCalcOperand(calc.left, parentSize, viewportSize);
|
|
153
|
+
const right = resolveCalcOperand(calc.right, parentSize, viewportSize);
|
|
154
|
+
switch (calc.operator) {
|
|
155
|
+
case "+":
|
|
156
|
+
return left + right;
|
|
157
|
+
case "-":
|
|
158
|
+
return left - right;
|
|
159
|
+
case "*":
|
|
160
|
+
return left * right;
|
|
161
|
+
case "/":
|
|
162
|
+
if (right === 0) {
|
|
163
|
+
devConfig.DebugLogger.error("Size", "Division by zero in calc expression");
|
|
164
|
+
return 0;
|
|
165
|
+
}
|
|
166
|
+
return left / right;
|
|
167
|
+
default:
|
|
168
|
+
devConfig.DebugLogger.error("Size", `Unknown calc operator: ${calc.operator}`);
|
|
169
|
+
return 0;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
function resolveSize(parsed, parentSize, contentSize, parentPadding, viewportSize) {
|
|
173
|
+
switch (parsed.type) {
|
|
174
|
+
case "fixed":
|
|
175
|
+
return parsed.value ?? 100;
|
|
176
|
+
case "percent":
|
|
177
|
+
if (parentSize === void 0) {
|
|
178
|
+
if (contentSize === void 0) {
|
|
179
|
+
devConfig.DebugLogger.warn(
|
|
180
|
+
"Size",
|
|
181
|
+
"Cannot resolve percentage without parent size and no content fallback."
|
|
182
|
+
);
|
|
183
|
+
return 100;
|
|
184
|
+
}
|
|
185
|
+
return contentSize;
|
|
186
|
+
}
|
|
187
|
+
return parentSize * (parsed.value ?? 0) / 100;
|
|
188
|
+
case "vw": {
|
|
189
|
+
const viewport = viewportSize || { width: 0 };
|
|
190
|
+
if (!viewport) {
|
|
191
|
+
devConfig.DebugLogger.warn("Size", "Cannot resolve vw without viewport size. Using fallback 100px");
|
|
192
|
+
return 100;
|
|
193
|
+
}
|
|
194
|
+
return viewport.width * (parsed.value ?? 0) / 100;
|
|
195
|
+
}
|
|
196
|
+
case "vh": {
|
|
197
|
+
const viewport = viewportSize || { height: 0 };
|
|
198
|
+
if (!viewport) {
|
|
199
|
+
devConfig.DebugLogger.warn("Size", "Cannot resolve vh without viewport size. Using fallback 100px");
|
|
200
|
+
return 100;
|
|
201
|
+
}
|
|
202
|
+
return viewport.height * (parsed.value ?? 0) / 100;
|
|
203
|
+
}
|
|
204
|
+
case "calc":
|
|
205
|
+
if (!parsed.calc) {
|
|
206
|
+
devConfig.DebugLogger.error("Size", "Calc type without calc expression");
|
|
207
|
+
return 100;
|
|
208
|
+
}
|
|
209
|
+
return resolveCalcExpression(parsed.calc, parentSize, viewportSize);
|
|
210
|
+
case "auto":
|
|
211
|
+
if (contentSize === void 0) {
|
|
212
|
+
devConfig.DebugLogger.warn("Size", "Auto size without content size, using fallback 100px");
|
|
213
|
+
return 100;
|
|
214
|
+
}
|
|
215
|
+
return contentSize;
|
|
216
|
+
case "fill": {
|
|
217
|
+
if (parentSize === void 0) {
|
|
218
|
+
return 0;
|
|
219
|
+
}
|
|
220
|
+
if (parentPadding !== void 0 && parentPadding > 0) {
|
|
221
|
+
return Math.max(0, parentSize - parentPadding);
|
|
222
|
+
}
|
|
223
|
+
return parentSize;
|
|
224
|
+
}
|
|
225
|
+
default:
|
|
226
|
+
devConfig.DebugLogger.error("Size", `Unknown size type: ${parsed.type}`);
|
|
227
|
+
return 100;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
function clearSizeCaches() {
|
|
231
|
+
parseSizeCache.clear();
|
|
232
|
+
warnedSizes.clear();
|
|
233
|
+
}
|
|
234
|
+
function calcRequiresParent(calc) {
|
|
235
|
+
const checkOperand = (op) => {
|
|
236
|
+
if ("type" in op) {
|
|
237
|
+
return op.type === "percent";
|
|
238
|
+
} else {
|
|
239
|
+
return calcRequiresParent(op);
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
return checkOperand(calc.left) || checkOperand(calc.right);
|
|
243
|
+
}
|
|
244
|
+
function requiresParent(parsed) {
|
|
245
|
+
if (parsed.type === "percent" || parsed.type === "fill") {
|
|
246
|
+
return true;
|
|
247
|
+
}
|
|
248
|
+
if (parsed.type === "calc" && parsed.calc) {
|
|
249
|
+
return calcRequiresParent(parsed.calc);
|
|
250
|
+
}
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
function isExplicit(parsed) {
|
|
254
|
+
return parsed.type === "fixed" || parsed.type === "percent" || parsed.type === "vw" || parsed.type === "vh" || parsed.type === "calc" || parsed.type === "fill";
|
|
255
|
+
}
|
|
256
|
+
function clampSize(size, minSize, maxSize, parentSize, fallbackSize, parentPadding) {
|
|
257
|
+
let clamped = size;
|
|
258
|
+
if (minSize !== void 0) {
|
|
259
|
+
const parsedMin = parseSize(minSize);
|
|
260
|
+
const resolvedMin = resolveSize(parsedMin, parentSize, fallbackSize, parentPadding);
|
|
261
|
+
if (clamped < resolvedMin) {
|
|
262
|
+
clamped = resolvedMin;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
if (maxSize !== void 0) {
|
|
266
|
+
const parsedMax = parseSize(maxSize);
|
|
267
|
+
const resolvedMax = resolveSize(parsedMax, parentSize, fallbackSize, parentPadding);
|
|
268
|
+
if (clamped > resolvedMax) {
|
|
269
|
+
clamped = resolvedMax;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return clamped;
|
|
273
|
+
}
|
|
274
|
+
exports.clampSize = clampSize;
|
|
275
|
+
exports.clearSizeCaches = clearSizeCaches;
|
|
276
|
+
exports.isExplicit = isExplicit;
|
|
277
|
+
exports.parseSize = parseSize;
|
|
278
|
+
exports.requiresParent = requiresParent;
|
|
279
|
+
exports.resolveSize = resolveSize;
|
|
280
|
+
//# sourceMappingURL=size-resolver.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"size-resolver.cjs","sources":["../../../src/layout/utils/size-resolver.ts"],"sourcesContent":["/**\n * Size resolution utilities for handling different size value types.\n * Supports fixed pixels, percentages, viewport units (vw/vh), auto sizing, and calc() expressions.\n * Renderer-neutral — viewport dimensions are passed as parameters.\n */\nimport { DebugLogger } from '../../dev-config'\nimport type { CalcExpression, CalcOperand, ParsedSize } from '../types'\n\n// Re-export for convenience\nexport type { ParsedSize } from '../types'\n\n/**\n * Cache for parseSize results to avoid repeated string parsing\n * Key: original size value, Value: parsed size object\n */\nconst parseSizeCache = new Map<unknown, ParsedSize>()\n\n/**\n * Set of size values that already triggered a warning\n * Prevents console spam from repeated warnings for the same invalid value\n */\nconst warnedSizes = new Set<string>()\n\n/**\n * Parse a calc operand (e.g., \"50%\" or \"20px\" or \"100vw\")\n * @param operand - String operand from calc expression\n * @returns Parsed operand\n */\nfunction parseCalcOperand(operand: string): CalcOperand {\n const trimmed = operand.trim()\n\n // Percentage: \"50%\"\n const percentMatch = trimmed.match(/^(\\d+(?:\\.\\d+)?)%$/)\n if (percentMatch && percentMatch[1]) {\n return { type: 'percent', value: parseFloat(percentMatch[1]) }\n }\n\n // Viewport width: \"100vw\"\n const vwMatch = trimmed.match(/^(\\d+(?:\\.\\d+)?)vw$/)\n if (vwMatch && vwMatch[1]) {\n return { type: 'vw', value: parseFloat(vwMatch[1]) }\n }\n\n // Viewport height: \"100vh\"\n const vhMatch = trimmed.match(/^(\\d+(?:\\.\\d+)?)vh$/)\n if (vhMatch && vhMatch[1]) {\n return { type: 'vh', value: parseFloat(vhMatch[1]) }\n }\n\n // Fixed pixels: \"20px\" or \"20\"\n const pixelMatch = trimmed.match(/^(-?\\d+(?:\\.\\d+)?)(?:px)?$/)\n if (pixelMatch && pixelMatch[1]) {\n return { type: 'fixed', value: parseFloat(pixelMatch[1]) }\n }\n\n throw new Error(`[Size] Invalid calc operand: \"${operand}\"`)\n}\n\n/**\n * Parse a calc() expression\n * @param expr - Calc expression string without \"calc(\" prefix\n * @returns Parsed calc expression\n */\nfunction parseCalcExpression(expr: string): CalcExpression {\n // Remove spaces\n expr = expr.replace(/\\s+/g, '')\n\n // Simple recursive parser for calc expressions\n function parseExpression(str: string): CalcExpression | CalcOperand {\n str = str.trim()\n\n // Handle parentheses\n if (str.startsWith('(') && str.endsWith(')')) {\n return parseExpression(str.slice(1, -1))\n }\n\n // Check if it's just an operand\n try {\n return parseCalcOperand(str)\n } catch {\n // Not an operand, continue parsing\n }\n\n // Find operators, respecting precedence: * / before + -\n const operators = ['+', '-', '*', '/']\n let parenDepth = 0\n let lastOpIndex = -1\n let lastOp = ''\n\n for (let i = str.length - 1; i >= 0; i--) {\n const char = str.charAt(i)\n if (char === ')') parenDepth++\n else if (char === '(') parenDepth--\n else if (parenDepth === 0 && operators.includes(char)) {\n // Check precedence: prefer * / over + -\n if (char === '*' || char === '/' || (lastOp !== '*' && lastOp !== '/')) {\n lastOpIndex = i\n lastOp = char\n if (char === '+' || char === '-') break // Lowest precedence, stop here\n }\n }\n }\n\n if (lastOpIndex === -1) {\n throw new Error(`[Size] No valid operator found in calc expression: \"${str}\"`)\n }\n\n const leftStr = str.slice(0, lastOpIndex)\n const rightStr = str.slice(lastOpIndex + 1)\n\n if (!leftStr || !rightStr) {\n throw new Error(`[Size] Invalid calc expression: \"${str}\"`)\n }\n\n return {\n left: parseExpression(leftStr),\n operator: lastOp as '+' | '-' | '*' | '/',\n right: parseExpression(rightStr),\n }\n }\n\n return parseExpression(expr) as CalcExpression\n}\n\n/**\n * Parse a size value into its components\n * Results are cached to avoid repeated string parsing during layout calculations\n * @param size - Size value (number, string, or undefined)\n * @returns Parsed size information\n * @throws Error if string format is invalid\n *\n * @example\n * parseSize(100) // { type: 'fixed', value: 100 }\n * parseSize('50%') // { type: 'percent', value: 50 }\n * parseSize('calc(100% - 40px)') // { type: 'calc', calc: {...} }\n * parseSize(undefined) // { type: 'auto' }\n * parseSize('auto') // { type: 'auto' }\n */\nexport function parseSize(size: number | string | undefined): ParsedSize {\n // Debug: Track parseSize call frequency\n // console.log('parseSize called:', size)\n\n // Check cache first (huge performance win for repeated calls)\n const cached = parseSizeCache.get(size)\n if (cached !== undefined) {\n return cached\n }\n\n // Parse the size value\n const result = parseSizeInternal(size)\n\n // Cache the result for future calls\n parseSizeCache.set(size, result)\n\n return result\n}\n\n/**\n * Internal parsing logic for size values\n * Separated to allow caching in parseSize()\n * @param size - Size value to parse\n * @returns Parsed size information\n */\nfunction parseSizeInternal(size: number | string | undefined): ParsedSize {\n // undefined -> auto (dynamic based on content)\n if (size === undefined) {\n return { type: 'auto' }\n }\n\n // number -> fixed pixel value\n if (typeof size === 'number') {\n return { type: 'fixed', value: size }\n }\n\n // string -> parse format\n if (size === 'auto') {\n return { type: 'auto' }\n }\n\n if (size === 'fill') {\n return { type: 'fill' }\n }\n\n // Calc expression: \"calc(100% - 40px)\"\n const calcMatch = size.match(/^calc\\((.+)\\)$/)\n if (calcMatch && calcMatch[1]) {\n return { type: 'calc', calc: parseCalcExpression(calcMatch[1]) }\n }\n\n // Percentage format: \"50%\", \"75.5%\", \"100%\"\n const percentMatch = size.match(/^(\\d+(?:\\.\\d+)?)%$/)\n if (percentMatch && percentMatch[1]) {\n const value = parseFloat(percentMatch[1])\n if (value < 0 || value > 100) {\n // Only warn once per unique invalid value to prevent console spam\n const warnKey = `percent:${value}`\n if (!warnedSizes.has(warnKey)) {\n warnedSizes.add(warnKey)\n DebugLogger.warn('Size', `Percentage value ${value}% is outside valid range (0-100%)`)\n }\n }\n return { type: 'percent', value }\n }\n\n // Viewport width: \"100vw\", \"50vw\"\n const vwMatch = size.match(/^(\\d+(?:\\.\\d+)?)vw$/)\n if (vwMatch && vwMatch[1]) {\n return { type: 'vw', value: parseFloat(vwMatch[1]) }\n }\n\n // Viewport height: \"100vh\", \"50vh\"\n const vhMatch = size.match(/^(\\d+(?:\\.\\d+)?)vh$/)\n if (vhMatch && vhMatch[1]) {\n return { type: 'vh', value: parseFloat(vhMatch[1]) }\n }\n\n // Unknown format\n throw new Error(\n `[Size] Invalid size format: \"${size}\". Supported formats: number, \"X%\", \"XvW\", \"Xvh\", \"calc(...)\", \"auto\", \"fill\", undefined`\n )\n}\n\n/**\n * Resolve a calc operand to pixel value\n * @param operand - Calc operand or sub-expression\n * @param parentSize - Parent dimension for percentage resolution\n * @param viewportSize - Viewport dimensions for vw/vh resolution\n * @returns Resolved pixel value\n */\nfunction resolveCalcOperand(\n operand: CalcOperand | CalcExpression,\n parentSize?: number,\n viewportSize?: { width: number; height: number }\n): number {\n if ('type' in operand) {\n // It's a CalcOperand\n if (operand.type === 'fixed') {\n return operand.value\n }\n\n // Percentage\n if (operand.type === 'percent') {\n if (parentSize === undefined) {\n return 0\n }\n return (parentSize * operand.value) / 100\n }\n\n // Viewport width\n if (operand.type === 'vw') {\n const viewport = viewportSize || { width: 0, height: 0 }\n if (!viewport) {\n DebugLogger.warn('Size', 'Cannot resolve vw without viewport size. Using 0.')\n return 0\n }\n return (viewport.width * operand.value) / 100\n }\n\n // Viewport height\n if (operand.type === 'vh') {\n const viewport = viewportSize || { width: 0, height: 0 }\n if (!viewport) {\n DebugLogger.warn('Size', 'Cannot resolve vh without viewport size. Using 0.')\n return 0\n }\n return (viewport.height * operand.value) / 100\n }\n\n return 0\n } else {\n // It's a CalcExpression\n return resolveCalcExpression(operand, parentSize, viewportSize)\n }\n}\n\n/**\n * Resolve a calc expression to pixel value\n * @param calc - Calc expression\n * @param parentSize - Parent dimension for percentage resolution\n * @param viewportSize - Viewport dimensions for vw/vh resolution\n * @returns Resolved pixel value\n */\nfunction resolveCalcExpression(\n calc: CalcExpression,\n parentSize?: number,\n viewportSize?: { width: number; height: number }\n): number {\n const left = resolveCalcOperand(calc.left, parentSize, viewportSize)\n const right = resolveCalcOperand(calc.right, parentSize, viewportSize)\n\n switch (calc.operator) {\n case '+':\n return left + right\n case '-':\n return left - right\n case '*':\n return left * right\n case '/':\n if (right === 0) {\n DebugLogger.error('Size', 'Division by zero in calc expression')\n return 0\n }\n return left / right\n default:\n DebugLogger.error('Size', `Unknown calc operator: ${calc.operator}`)\n return 0\n }\n}\n\n/**\n * Resolve a parsed size to actual pixel value\n * @param parsed - Parsed size information\n * @param parentSize - Parent dimension in pixels (required for percentage and calc)\n * @param contentSize - Content dimension in pixels (fallback for auto)\n * @param parentPadding - Parent padding in the relevant direction (for fill)\n * @param viewportSize - Viewport dimensions for vw/vh resolution\n * @returns Resolved size in pixels\n *\n * @example\n * resolveSize({ type: 'fixed', value: 100 }, 200) // 100\n * resolveSize({ type: 'percent', value: 50 }, 200) // 100 (50% of 200)\n * resolveSize({ type: 'vw', value: 100 }, undefined, undefined, undefined, viewport) // viewport.width\n * resolveSize({ type: 'vh', value: 50 }, undefined, undefined, undefined, viewport) // viewport.height * 0.5\n * resolveSize({ type: 'calc', calc: {...} }, 200) // calc result\n * resolveSize({ type: 'auto' }, 200, 150) // 150 (content size)\n * resolveSize({ type: 'fill' }, 200, undefined, 40) // 160 (200 - 40)\n */\nexport function resolveSize(\n parsed: ParsedSize,\n parentSize?: number,\n contentSize?: number,\n parentPadding?: number,\n viewportSize?: { width: number; height: number }\n): number {\n switch (parsed.type) {\n case 'fixed':\n return parsed.value ?? 100\n\n case 'percent':\n if (parentSize === undefined) {\n // Only warn if we also don't have a fallback content size\n if (contentSize === undefined) {\n DebugLogger.warn(\n 'Size',\n 'Cannot resolve percentage without parent size and no content fallback.'\n )\n return 100\n }\n // Parent size will be available in next layout pass - use content size for now\n return contentSize\n }\n return (parentSize * (parsed.value ?? 0)) / 100\n\n case 'vw': {\n const viewport = viewportSize || { width: 0, height: 0 }\n if (!viewport) {\n DebugLogger.warn('Size', 'Cannot resolve vw without viewport size. Using fallback 100px')\n return 100\n }\n return (viewport.width * (parsed.value ?? 0)) / 100\n }\n\n case 'vh': {\n const viewport = viewportSize || { width: 0, height: 0 }\n if (!viewport) {\n DebugLogger.warn('Size', 'Cannot resolve vh without viewport size. Using fallback 100px')\n return 100\n }\n return (viewport.height * (parsed.value ?? 0)) / 100\n }\n\n case 'calc':\n if (!parsed.calc) {\n DebugLogger.error('Size', 'Calc type without calc expression')\n return 100\n }\n return resolveCalcExpression(parsed.calc, parentSize, viewportSize)\n\n case 'auto':\n if (contentSize === undefined) {\n DebugLogger.warn('Size', 'Auto size without content size, using fallback 100px')\n return 100\n }\n return contentSize\n\n case 'fill': {\n if (parentSize === undefined) {\n // this would be possible at startup before parent sizes are known, therefore just return 0\n // DebugLogger.warn('Size', 'Fill size without parent size, using fallback 0px')\n return 0\n }\n // Fill = parent size minus padding (content-area)\n if (parentPadding !== undefined && parentPadding > 0) {\n return Math.max(0, parentSize - parentPadding)\n }\n // No padding or already content-area\n return parentSize\n }\n\n default:\n // Should never happen with proper typing\n DebugLogger.error('Size', `Unknown size type: ${(parsed as ParsedSize).type}`)\n return 100\n }\n}\n\n/**\n * Clear the parseSize cache and warning deduplication set\n * Useful for testing or memory management in long-running applications\n *\n * @example\n * ```typescript\n * // Clear caches after major UI rebuild\n * clearSizeCaches()\n * ```\n */\nexport function clearSizeCaches(): void {\n parseSizeCache.clear()\n warnedSizes.clear()\n}\n\n/**\n * Check if a calc expression requires parent context\n * @param calc - Calc expression\n * @returns True if expression contains percentages\n */\nfunction calcRequiresParent(calc: CalcExpression): boolean {\n const checkOperand = (op: CalcOperand | CalcExpression): boolean => {\n if ('type' in op) {\n return op.type === 'percent'\n } else {\n return calcRequiresParent(op)\n }\n }\n return checkOperand(calc.left) || checkOperand(calc.right)\n}\n\n/**\n * Check if a size needs parent context to resolve\n * @param parsed - Parsed size information\n * @returns True if size requires parent dimension\n */\nexport function requiresParent(parsed: ParsedSize): boolean {\n if (parsed.type === 'percent' || parsed.type === 'fill') {\n return true\n }\n\n // Calc expressions might contain percentages\n if (parsed.type === 'calc' && parsed.calc) {\n return calcRequiresParent(parsed.calc)\n }\n\n return false\n}\n\n/**\n * Check if a size can be determined without content measurement\n * @param parsed - Parsed size information\n * @returns True if size is explicitly defined (not auto)\n */\nexport function isExplicit(parsed: ParsedSize): boolean {\n return (\n parsed.type === 'fixed' ||\n parsed.type === 'percent' ||\n parsed.type === 'vw' ||\n parsed.type === 'vh' ||\n parsed.type === 'calc' ||\n parsed.type === 'fill'\n )\n}\n\n/**\n * Clamp a size value to min/max constraints\n * Min/max constraints can be SizeValue (pixels, percentage, viewport units, calc)\n * They are resolved relative to the same parent/viewport context as the size itself\n *\n * @param size - Resolved size in pixels\n * @param minSize - Minimum size constraint (SizeValue or undefined = no constraint)\n * @param maxSize - Maximum size constraint (SizeValue or undefined = no constraint)\n * @param parentSize - Parent dimension for percentage resolution in constraints\n * @param fallbackSize - Fallback size for auto constraints (not typically used for min/max)\n * @param parentPadding - Parent padding for fill constraints (not typically used for min/max)\n * @returns Clamped size in pixels\n *\n * @example\n * clampSize(150, 100, 200) // 150 (within bounds)\n * clampSize(50, 100, 200) // 100 (clamped to min)\n * clampSize(300, 100, 200) // 200 (clamped to max)\n * clampSize(150, undefined, \"80%\", 1000) // 150 (max = 800px)\n * clampSize(1000, undefined, \"80%\", 1000) // 800 (clamped to 80% of parent)\n */\nexport function clampSize(\n size: number,\n minSize?: number | string,\n maxSize?: number | string,\n parentSize?: number,\n fallbackSize?: number,\n parentPadding?: number\n): number {\n let clamped = size\n\n // Resolve and apply minimum constraint\n if (minSize !== undefined) {\n const parsedMin = parseSize(minSize)\n const resolvedMin = resolveSize(parsedMin, parentSize, fallbackSize, parentPadding)\n if (clamped < resolvedMin) {\n clamped = resolvedMin\n }\n }\n\n // Resolve and apply maximum constraint\n if (maxSize !== undefined) {\n const parsedMax = parseSize(maxSize)\n const resolvedMax = resolveSize(parsedMax, parentSize, fallbackSize, parentPadding)\n if (clamped > resolvedMax) {\n clamped = resolvedMax\n }\n }\n\n return clamped\n}\n"],"names":["DebugLogger"],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { ParsedSize } from '../types';
|
|
2
|
+
export type { ParsedSize } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Parse a size value into its components
|
|
5
|
+
* Results are cached to avoid repeated string parsing during layout calculations
|
|
6
|
+
* @param size - Size value (number, string, or undefined)
|
|
7
|
+
* @returns Parsed size information
|
|
8
|
+
* @throws Error if string format is invalid
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* parseSize(100) // { type: 'fixed', value: 100 }
|
|
12
|
+
* parseSize('50%') // { type: 'percent', value: 50 }
|
|
13
|
+
* parseSize('calc(100% - 40px)') // { type: 'calc', calc: {...} }
|
|
14
|
+
* parseSize(undefined) // { type: 'auto' }
|
|
15
|
+
* parseSize('auto') // { type: 'auto' }
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseSize(size: number | string | undefined): ParsedSize;
|
|
18
|
+
/**
|
|
19
|
+
* Resolve a parsed size to actual pixel value
|
|
20
|
+
* @param parsed - Parsed size information
|
|
21
|
+
* @param parentSize - Parent dimension in pixels (required for percentage and calc)
|
|
22
|
+
* @param contentSize - Content dimension in pixels (fallback for auto)
|
|
23
|
+
* @param parentPadding - Parent padding in the relevant direction (for fill)
|
|
24
|
+
* @param viewportSize - Viewport dimensions for vw/vh resolution
|
|
25
|
+
* @returns Resolved size in pixels
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* resolveSize({ type: 'fixed', value: 100 }, 200) // 100
|
|
29
|
+
* resolveSize({ type: 'percent', value: 50 }, 200) // 100 (50% of 200)
|
|
30
|
+
* resolveSize({ type: 'vw', value: 100 }, undefined, undefined, undefined, viewport) // viewport.width
|
|
31
|
+
* resolveSize({ type: 'vh', value: 50 }, undefined, undefined, undefined, viewport) // viewport.height * 0.5
|
|
32
|
+
* resolveSize({ type: 'calc', calc: {...} }, 200) // calc result
|
|
33
|
+
* resolveSize({ type: 'auto' }, 200, 150) // 150 (content size)
|
|
34
|
+
* resolveSize({ type: 'fill' }, 200, undefined, 40) // 160 (200 - 40)
|
|
35
|
+
*/
|
|
36
|
+
export declare function resolveSize(parsed: ParsedSize, parentSize?: number, contentSize?: number, parentPadding?: number, viewportSize?: {
|
|
37
|
+
width: number;
|
|
38
|
+
height: number;
|
|
39
|
+
}): number;
|
|
40
|
+
/**
|
|
41
|
+
* Clear the parseSize cache and warning deduplication set
|
|
42
|
+
* Useful for testing or memory management in long-running applications
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```typescript
|
|
46
|
+
* // Clear caches after major UI rebuild
|
|
47
|
+
* clearSizeCaches()
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export declare function clearSizeCaches(): void;
|
|
51
|
+
/**
|
|
52
|
+
* Check if a size needs parent context to resolve
|
|
53
|
+
* @param parsed - Parsed size information
|
|
54
|
+
* @returns True if size requires parent dimension
|
|
55
|
+
*/
|
|
56
|
+
export declare function requiresParent(parsed: ParsedSize): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Check if a size can be determined without content measurement
|
|
59
|
+
* @param parsed - Parsed size information
|
|
60
|
+
* @returns True if size is explicitly defined (not auto)
|
|
61
|
+
*/
|
|
62
|
+
export declare function isExplicit(parsed: ParsedSize): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Clamp a size value to min/max constraints
|
|
65
|
+
* Min/max constraints can be SizeValue (pixels, percentage, viewport units, calc)
|
|
66
|
+
* They are resolved relative to the same parent/viewport context as the size itself
|
|
67
|
+
*
|
|
68
|
+
* @param size - Resolved size in pixels
|
|
69
|
+
* @param minSize - Minimum size constraint (SizeValue or undefined = no constraint)
|
|
70
|
+
* @param maxSize - Maximum size constraint (SizeValue or undefined = no constraint)
|
|
71
|
+
* @param parentSize - Parent dimension for percentage resolution in constraints
|
|
72
|
+
* @param fallbackSize - Fallback size for auto constraints (not typically used for min/max)
|
|
73
|
+
* @param parentPadding - Parent padding for fill constraints (not typically used for min/max)
|
|
74
|
+
* @returns Clamped size in pixels
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* clampSize(150, 100, 200) // 150 (within bounds)
|
|
78
|
+
* clampSize(50, 100, 200) // 100 (clamped to min)
|
|
79
|
+
* clampSize(300, 100, 200) // 200 (clamped to max)
|
|
80
|
+
* clampSize(150, undefined, "80%", 1000) // 150 (max = 800px)
|
|
81
|
+
* clampSize(1000, undefined, "80%", 1000) // 800 (clamped to 80% of parent)
|
|
82
|
+
*/
|
|
83
|
+
export declare function clampSize(size: number, minSize?: number | string, maxSize?: number | string, parentSize?: number, fallbackSize?: number, parentPadding?: number): number;
|
|
84
|
+
//# sourceMappingURL=size-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"size-resolver.d.ts","sourceRoot":"","sources":["../../../src/layout/utils/size-resolver.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAA+B,UAAU,EAAE,MAAM,UAAU,CAAA;AAGvE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAmH1C;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAiBvE;AA0JD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,UAAU,EAClB,UAAU,CAAC,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,EACpB,aAAa,CAAC,EAAE,MAAM,EACtB,YAAY,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC/C,MAAM,CAuER;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAGtC;AAkBD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAW1D;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAStD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EACzB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EACzB,UAAU,CAAC,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,MAAM,EACrB,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,CAsBR"}
|