@almadar/ui 2.19.2 → 2.20.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.
@@ -2,10 +2,12 @@
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  var React6 = require('react');
5
+ var ELK = require('elkjs/lib/elk.bundled.js');
5
6
 
6
7
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
8
 
8
9
  var React6__default = /*#__PURE__*/_interopDefault(React6);
10
+ var ELK__default = /*#__PURE__*/_interopDefault(ELK);
9
11
 
10
12
  // components/atoms/avl/types.ts
11
13
  var AVL_OPERATOR_COLORS = {
@@ -30,7 +32,7 @@ var AVL_FIELD_TYPE_SHAPES = {
30
32
  var AvlOrbital = ({
31
33
  cx = 0,
32
34
  cy = 0,
33
- r = 80,
35
+ r: r2 = 80,
34
36
  label,
35
37
  color = "var(--color-primary)",
36
38
  opacity = 1,
@@ -42,7 +44,7 @@ var AvlOrbital = ({
42
44
  {
43
45
  cx,
44
46
  cy,
45
- r,
47
+ r: r2,
46
48
  fill: "none",
47
49
  stroke: color,
48
50
  strokeWidth: 2
@@ -53,7 +55,7 @@ var AvlOrbital = ({
53
55
  {
54
56
  cx,
55
57
  cy,
56
- r,
58
+ r: r2,
57
59
  fill: color,
58
60
  opacity: 0.03
59
61
  }
@@ -62,7 +64,7 @@ var AvlOrbital = ({
62
64
  "text",
63
65
  {
64
66
  x: cx,
65
- y: cy - r - 8,
67
+ y: cy - r2 - 8,
66
68
  textAnchor: "middle",
67
69
  fill: color,
68
70
  fontSize: 11,
@@ -89,7 +91,7 @@ function persistenceStroke(kind) {
89
91
  var AvlEntity = ({
90
92
  x = 0,
91
93
  y = 0,
92
- r = 18,
94
+ r: r2 = 18,
93
95
  fieldCount = 0,
94
96
  persistence = "persistent",
95
97
  label,
@@ -100,8 +102,8 @@ var AvlEntity = ({
100
102
  const strokeProps = persistenceStroke(persistence);
101
103
  const facets = Array.from({ length: fieldCount }, (_, i) => {
102
104
  const angle = Math.PI * 2 * i / fieldCount - Math.PI / 2;
103
- const innerR = r + 2;
104
- const outerR = r + 10;
105
+ const innerR = r2 + 2;
106
+ const outerR = r2 + 10;
105
107
  return {
106
108
  x1: x + innerR * Math.cos(angle),
107
109
  y1: y + innerR * Math.sin(angle),
@@ -110,13 +112,13 @@ var AvlEntity = ({
110
112
  };
111
113
  });
112
114
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { className, opacity, children: [
113
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: x, cy: y, r, fill: color, opacity: 0.15 }),
115
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: x, cy: y, r: r2, fill: color, opacity: 0.15 }),
114
116
  /* @__PURE__ */ jsxRuntime.jsx(
115
117
  "circle",
116
118
  {
117
119
  cx: x,
118
120
  cy: y,
119
- r,
121
+ r: r2,
120
122
  fill: "none",
121
123
  stroke: color,
122
124
  strokeWidth: strokeProps.strokeWidth,
@@ -128,7 +130,7 @@ var AvlEntity = ({
128
130
  {
129
131
  cx: x,
130
132
  cy: y,
131
- r: r - 4,
133
+ r: r2 - 4,
132
134
  fill: "none",
133
135
  stroke: color,
134
136
  strokeWidth: 1.5
@@ -151,7 +153,7 @@ var AvlEntity = ({
151
153
  "text",
152
154
  {
153
155
  x,
154
- y: y + r + (fieldCount > 0 ? 18 : 14),
156
+ y: y + r2 + (fieldCount > 0 ? 18 : 14),
155
157
  textAnchor: "middle",
156
158
  fill: color,
157
159
  fontSize: 10,
@@ -1054,33 +1056,33 @@ var AvlBindingRef = ({
1054
1056
  AvlBindingRef.displayName = "AvlBindingRef";
1055
1057
 
1056
1058
  // components/molecules/avl/avl-layout.ts
1057
- function ringPositions(cx, cy, r, count, startAngle = -Math.PI / 2) {
1059
+ function ringPositions(cx, cy, r2, count, startAngle = -Math.PI / 2) {
1058
1060
  if (count === 0) return [];
1059
1061
  if (count === 1) {
1060
1062
  return [{ x: cx, y: cy, angle: 0 }];
1061
1063
  }
1062
1064
  if (count === 2) {
1063
1065
  return [
1064
- { x: cx - r * 0.7, y: cy, angle: Math.PI },
1065
- { x: cx + r * 0.7, y: cy, angle: 0 }
1066
+ { x: cx - r2 * 0.7, y: cy, angle: Math.PI },
1067
+ { x: cx + r2 * 0.7, y: cy, angle: 0 }
1066
1068
  ];
1067
1069
  }
1068
1070
  return Array.from({ length: count }, (_, i) => {
1069
1071
  const angle = startAngle + Math.PI * 2 * i / count;
1070
1072
  return {
1071
- x: cx + r * Math.cos(angle),
1072
- y: cy + r * Math.sin(angle),
1073
+ x: cx + r2 * Math.cos(angle),
1074
+ y: cy + r2 * Math.sin(angle),
1073
1075
  angle
1074
1076
  };
1075
1077
  });
1076
1078
  }
1077
- function arcPath(cx, cy, r, startAngle, endAngle) {
1078
- const x1 = cx + r * Math.cos(startAngle);
1079
- const y1 = cy + r * Math.sin(startAngle);
1080
- const x2 = cx + r * Math.cos(endAngle);
1081
- const y2 = cy + r * Math.sin(endAngle);
1079
+ function arcPath(cx, cy, r2, startAngle, endAngle) {
1080
+ const x1 = cx + r2 * Math.cos(startAngle);
1081
+ const y1 = cy + r2 * Math.sin(startAngle);
1082
+ const x2 = cx + r2 * Math.cos(endAngle);
1083
+ const y2 = cy + r2 * Math.sin(endAngle);
1082
1084
  const largeArc = endAngle - startAngle > Math.PI ? 1 : 0;
1083
- return `M${x1},${y1} A${r},${r} 0 ${largeArc},1 ${x2},${y2}`;
1085
+ return `M${x1},${y1} A${r2},${r2} 0 ${largeArc},1 ${x2},${y2}`;
1084
1086
  }
1085
1087
  function radialPositions(cx, cy, innerR, outerR, count, startAngle = -Math.PI / 2) {
1086
1088
  return Array.from({ length: count }, (_, i) => {
@@ -1132,10 +1134,10 @@ var AvlStateMachine = ({
1132
1134
  }, []);
1133
1135
  const cx = 300;
1134
1136
  const cy = 200;
1135
- const r = 150;
1137
+ const r2 = 150;
1136
1138
  const stateWidth = 90;
1137
1139
  const stateHeight = 36;
1138
- const positions = ringPositions(cx, cy, r, states.length);
1140
+ const positions = ringPositions(cx, cy, r2, states.length);
1139
1141
  const stateIndex = new Map(states.map((s, i) => [s.name, i]));
1140
1142
  const pairCount = /* @__PURE__ */ new Map();
1141
1143
  const pairSeen = /* @__PURE__ */ new Map();
@@ -1160,7 +1162,7 @@ var AvlStateMachine = ({
1160
1162
  animated && /* @__PURE__ */ jsxRuntime.jsx("style", { children: `
1161
1163
  @keyframes avl-sm-dash { from { stroke-dashoffset: 20; } to { stroke-dashoffset: 0; } }
1162
1164
  ` }),
1163
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx, cy, r: r + 30, fill: `url(#${ids.grad})` }),
1165
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx, cy, r: r2 + 30, fill: `url(#${ids.grad})` }),
1164
1166
  transitions.map((tr, i) => {
1165
1167
  if (tr.from !== tr.to) return null;
1166
1168
  const idx = stateIndex.get(tr.from);
@@ -1419,10 +1421,10 @@ var AvlClosedCircuit = ({
1419
1421
  }, []);
1420
1422
  const cx = 300;
1421
1423
  const cy = 200;
1422
- const r = 120;
1424
+ const r2 = 120;
1423
1425
  const stateW = 80;
1424
1426
  const stateH = 32;
1425
- const positions = ringPositions(cx, cy, r, states.length);
1427
+ const positions = ringPositions(cx, cy, r2, states.length);
1426
1428
  const stateIndex = new Map(states.map((s, i) => [s.name, i]));
1427
1429
  return /* @__PURE__ */ jsxRuntime.jsxs("svg", { viewBox: "0 0 600 400", xmlns: "http://www.w3.org/2000/svg", className, children: [
1428
1430
  /* @__PURE__ */ jsxRuntime.jsxs("defs", { children: [
@@ -1455,7 +1457,7 @@ var AvlClosedCircuit = ({
1455
1457
  animated && /* @__PURE__ */ jsxRuntime.jsx("style", { children: `
1456
1458
  @keyframes avl-cc-flow { from { stroke-dashoffset: 24; } to { stroke-dashoffset: 0; } }
1457
1459
  ` }),
1458
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx, cy, r: r + 30, fill: "none", stroke: color, strokeWidth: 0.3, opacity: 0.06 }),
1460
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx, cy, r: r2 + 30, fill: "none", stroke: color, strokeWidth: 0.3, opacity: 0.06 }),
1459
1461
  /* @__PURE__ */ jsxRuntime.jsx("circle", { cx, cy, r: 50, fill: "none", stroke: color, strokeWidth: 0.5, opacity: 0.08 }),
1460
1462
  transitions.map((tr, i) => {
1461
1463
  const fromIdx = stateIndex.get(tr.from);
@@ -1817,7 +1819,7 @@ function nodeColor(type, baseColor) {
1817
1819
  function renderNode(node, color, glowId) {
1818
1820
  const labelLen = node.label.length;
1819
1821
  const baseR = node.type === "operator" ? 20 : 16;
1820
- const r = Math.max(baseR, labelLen * 3.5 + 6);
1822
+ const r2 = Math.max(baseR, labelLen * 3.5 + 6);
1821
1823
  const nc = nodeColor(node.type, color);
1822
1824
  return /* @__PURE__ */ jsxRuntime.jsxs(React6__default.default.Fragment, { children: [
1823
1825
  node.children.map((child, i) => {
@@ -1829,7 +1831,7 @@ function renderNode(node, color, glowId) {
1829
1831
  "line",
1830
1832
  {
1831
1833
  x1: node.x,
1832
- y1: node.y + (node.type === "operator" ? r * 0.7 : r),
1834
+ y1: node.y + (node.type === "operator" ? r2 * 0.7 : r2),
1833
1835
  x2: child.x,
1834
1836
  y2: child.y - (child.type === "operator" ? childR * 0.7 : childR),
1835
1837
  stroke: color,
@@ -1842,10 +1844,10 @@ function renderNode(node, color, glowId) {
1842
1844
  node.type === "operator" ? /* @__PURE__ */ jsxRuntime.jsx(
1843
1845
  "rect",
1844
1846
  {
1845
- x: node.x - r,
1846
- y: node.y - r * 0.6,
1847
- width: r * 2,
1848
- height: r * 1.2,
1847
+ x: node.x - r2,
1848
+ y: node.y - r2 * 0.6,
1849
+ width: r2 * 2,
1850
+ height: r2 * 1.2,
1849
1851
  rx: 4,
1850
1852
  ry: 4,
1851
1853
  fill: color,
@@ -1853,7 +1855,7 @@ function renderNode(node, color, glowId) {
1853
1855
  stroke: nc,
1854
1856
  strokeWidth: 1.5
1855
1857
  }
1856
- ) : node.type === "binding" ? /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: node.x, cy: node.y, r, fill: "none", stroke: nc, strokeWidth: 1.5, strokeDasharray: "3 2" }) : /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: node.x, cy: node.y, r, fill: "none", stroke: nc, strokeWidth: 1, opacity: 0.5 }),
1858
+ ) : node.type === "binding" ? /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: node.x, cy: node.y, r: r2, fill: "none", stroke: nc, strokeWidth: 1.5, strokeDasharray: "3 2" }) : /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: node.x, cy: node.y, r: r2, fill: "none", stroke: nc, strokeWidth: 1, opacity: 0.5 }),
1857
1859
  /* @__PURE__ */ jsxRuntime.jsx(
1858
1860
  "text",
1859
1861
  {
@@ -1894,12 +1896,4477 @@ var AvlExprTree = ({
1894
1896
  };
1895
1897
  AvlExprTree.displayName = "AvlExprTree";
1896
1898
 
1899
+ // node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs
1900
+ function r(e) {
1901
+ var t, f, n = "";
1902
+ if ("string" == typeof e || "number" == typeof e) n += e;
1903
+ else if ("object" == typeof e) if (Array.isArray(e)) {
1904
+ var o = e.length;
1905
+ for (t = 0; t < o; t++) e[t] && (f = r(e[t])) && (n && (n += " "), n += f);
1906
+ } else for (f in e) e[f] && (n && (n += " "), n += f);
1907
+ return n;
1908
+ }
1909
+ function clsx() {
1910
+ for (var e, t, f = 0, n = "", o = arguments.length; f < o; f++) (e = arguments[f]) && (t = r(e)) && (n && (n += " "), n += t);
1911
+ return n;
1912
+ }
1913
+
1914
+ // node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/dist/bundle-mjs.mjs
1915
+ var CLASS_PART_SEPARATOR = "-";
1916
+ var createClassGroupUtils = (config) => {
1917
+ const classMap = createClassMap(config);
1918
+ const {
1919
+ conflictingClassGroups,
1920
+ conflictingClassGroupModifiers
1921
+ } = config;
1922
+ const getClassGroupId = (className) => {
1923
+ const classParts = className.split(CLASS_PART_SEPARATOR);
1924
+ if (classParts[0] === "" && classParts.length !== 1) {
1925
+ classParts.shift();
1926
+ }
1927
+ return getGroupRecursive(classParts, classMap) || getGroupIdForArbitraryProperty(className);
1928
+ };
1929
+ const getConflictingClassGroupIds = (classGroupId, hasPostfixModifier) => {
1930
+ const conflicts = conflictingClassGroups[classGroupId] || [];
1931
+ if (hasPostfixModifier && conflictingClassGroupModifiers[classGroupId]) {
1932
+ return [...conflicts, ...conflictingClassGroupModifiers[classGroupId]];
1933
+ }
1934
+ return conflicts;
1935
+ };
1936
+ return {
1937
+ getClassGroupId,
1938
+ getConflictingClassGroupIds
1939
+ };
1940
+ };
1941
+ var getGroupRecursive = (classParts, classPartObject) => {
1942
+ if (classParts.length === 0) {
1943
+ return classPartObject.classGroupId;
1944
+ }
1945
+ const currentClassPart = classParts[0];
1946
+ const nextClassPartObject = classPartObject.nextPart.get(currentClassPart);
1947
+ const classGroupFromNextClassPart = nextClassPartObject ? getGroupRecursive(classParts.slice(1), nextClassPartObject) : void 0;
1948
+ if (classGroupFromNextClassPart) {
1949
+ return classGroupFromNextClassPart;
1950
+ }
1951
+ if (classPartObject.validators.length === 0) {
1952
+ return void 0;
1953
+ }
1954
+ const classRest = classParts.join(CLASS_PART_SEPARATOR);
1955
+ return classPartObject.validators.find(({
1956
+ validator
1957
+ }) => validator(classRest))?.classGroupId;
1958
+ };
1959
+ var arbitraryPropertyRegex = /^\[(.+)\]$/;
1960
+ var getGroupIdForArbitraryProperty = (className) => {
1961
+ if (arbitraryPropertyRegex.test(className)) {
1962
+ const arbitraryPropertyClassName = arbitraryPropertyRegex.exec(className)[1];
1963
+ const property = arbitraryPropertyClassName?.substring(0, arbitraryPropertyClassName.indexOf(":"));
1964
+ if (property) {
1965
+ return "arbitrary.." + property;
1966
+ }
1967
+ }
1968
+ };
1969
+ var createClassMap = (config) => {
1970
+ const {
1971
+ theme,
1972
+ prefix
1973
+ } = config;
1974
+ const classMap = {
1975
+ nextPart: /* @__PURE__ */ new Map(),
1976
+ validators: []
1977
+ };
1978
+ const prefixedClassGroupEntries = getPrefixedClassGroupEntries(Object.entries(config.classGroups), prefix);
1979
+ prefixedClassGroupEntries.forEach(([classGroupId, classGroup]) => {
1980
+ processClassesRecursively(classGroup, classMap, classGroupId, theme);
1981
+ });
1982
+ return classMap;
1983
+ };
1984
+ var processClassesRecursively = (classGroup, classPartObject, classGroupId, theme) => {
1985
+ classGroup.forEach((classDefinition) => {
1986
+ if (typeof classDefinition === "string") {
1987
+ const classPartObjectToEdit = classDefinition === "" ? classPartObject : getPart(classPartObject, classDefinition);
1988
+ classPartObjectToEdit.classGroupId = classGroupId;
1989
+ return;
1990
+ }
1991
+ if (typeof classDefinition === "function") {
1992
+ if (isThemeGetter(classDefinition)) {
1993
+ processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme);
1994
+ return;
1995
+ }
1996
+ classPartObject.validators.push({
1997
+ validator: classDefinition,
1998
+ classGroupId
1999
+ });
2000
+ return;
2001
+ }
2002
+ Object.entries(classDefinition).forEach(([key, classGroup2]) => {
2003
+ processClassesRecursively(classGroup2, getPart(classPartObject, key), classGroupId, theme);
2004
+ });
2005
+ });
2006
+ };
2007
+ var getPart = (classPartObject, path) => {
2008
+ let currentClassPartObject = classPartObject;
2009
+ path.split(CLASS_PART_SEPARATOR).forEach((pathPart) => {
2010
+ if (!currentClassPartObject.nextPart.has(pathPart)) {
2011
+ currentClassPartObject.nextPart.set(pathPart, {
2012
+ nextPart: /* @__PURE__ */ new Map(),
2013
+ validators: []
2014
+ });
2015
+ }
2016
+ currentClassPartObject = currentClassPartObject.nextPart.get(pathPart);
2017
+ });
2018
+ return currentClassPartObject;
2019
+ };
2020
+ var isThemeGetter = (func) => func.isThemeGetter;
2021
+ var getPrefixedClassGroupEntries = (classGroupEntries, prefix) => {
2022
+ if (!prefix) {
2023
+ return classGroupEntries;
2024
+ }
2025
+ return classGroupEntries.map(([classGroupId, classGroup]) => {
2026
+ const prefixedClassGroup = classGroup.map((classDefinition) => {
2027
+ if (typeof classDefinition === "string") {
2028
+ return prefix + classDefinition;
2029
+ }
2030
+ if (typeof classDefinition === "object") {
2031
+ return Object.fromEntries(Object.entries(classDefinition).map(([key, value]) => [prefix + key, value]));
2032
+ }
2033
+ return classDefinition;
2034
+ });
2035
+ return [classGroupId, prefixedClassGroup];
2036
+ });
2037
+ };
2038
+ var createLruCache = (maxCacheSize) => {
2039
+ if (maxCacheSize < 1) {
2040
+ return {
2041
+ get: () => void 0,
2042
+ set: () => {
2043
+ }
2044
+ };
2045
+ }
2046
+ let cacheSize = 0;
2047
+ let cache = /* @__PURE__ */ new Map();
2048
+ let previousCache = /* @__PURE__ */ new Map();
2049
+ const update = (key, value) => {
2050
+ cache.set(key, value);
2051
+ cacheSize++;
2052
+ if (cacheSize > maxCacheSize) {
2053
+ cacheSize = 0;
2054
+ previousCache = cache;
2055
+ cache = /* @__PURE__ */ new Map();
2056
+ }
2057
+ };
2058
+ return {
2059
+ get(key) {
2060
+ let value = cache.get(key);
2061
+ if (value !== void 0) {
2062
+ return value;
2063
+ }
2064
+ if ((value = previousCache.get(key)) !== void 0) {
2065
+ update(key, value);
2066
+ return value;
2067
+ }
2068
+ },
2069
+ set(key, value) {
2070
+ if (cache.has(key)) {
2071
+ cache.set(key, value);
2072
+ } else {
2073
+ update(key, value);
2074
+ }
2075
+ }
2076
+ };
2077
+ };
2078
+ var IMPORTANT_MODIFIER = "!";
2079
+ var createParseClassName = (config) => {
2080
+ const {
2081
+ separator,
2082
+ experimentalParseClassName
2083
+ } = config;
2084
+ const isSeparatorSingleCharacter = separator.length === 1;
2085
+ const firstSeparatorCharacter = separator[0];
2086
+ const separatorLength = separator.length;
2087
+ const parseClassName = (className) => {
2088
+ const modifiers = [];
2089
+ let bracketDepth = 0;
2090
+ let modifierStart = 0;
2091
+ let postfixModifierPosition;
2092
+ for (let index = 0; index < className.length; index++) {
2093
+ let currentCharacter = className[index];
2094
+ if (bracketDepth === 0) {
2095
+ if (currentCharacter === firstSeparatorCharacter && (isSeparatorSingleCharacter || className.slice(index, index + separatorLength) === separator)) {
2096
+ modifiers.push(className.slice(modifierStart, index));
2097
+ modifierStart = index + separatorLength;
2098
+ continue;
2099
+ }
2100
+ if (currentCharacter === "/") {
2101
+ postfixModifierPosition = index;
2102
+ continue;
2103
+ }
2104
+ }
2105
+ if (currentCharacter === "[") {
2106
+ bracketDepth++;
2107
+ } else if (currentCharacter === "]") {
2108
+ bracketDepth--;
2109
+ }
2110
+ }
2111
+ const baseClassNameWithImportantModifier = modifiers.length === 0 ? className : className.substring(modifierStart);
2112
+ const hasImportantModifier = baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER);
2113
+ const baseClassName = hasImportantModifier ? baseClassNameWithImportantModifier.substring(1) : baseClassNameWithImportantModifier;
2114
+ const maybePostfixModifierPosition = postfixModifierPosition && postfixModifierPosition > modifierStart ? postfixModifierPosition - modifierStart : void 0;
2115
+ return {
2116
+ modifiers,
2117
+ hasImportantModifier,
2118
+ baseClassName,
2119
+ maybePostfixModifierPosition
2120
+ };
2121
+ };
2122
+ if (experimentalParseClassName) {
2123
+ return (className) => experimentalParseClassName({
2124
+ className,
2125
+ parseClassName
2126
+ });
2127
+ }
2128
+ return parseClassName;
2129
+ };
2130
+ var sortModifiers = (modifiers) => {
2131
+ if (modifiers.length <= 1) {
2132
+ return modifiers;
2133
+ }
2134
+ const sortedModifiers = [];
2135
+ let unsortedModifiers = [];
2136
+ modifiers.forEach((modifier) => {
2137
+ const isArbitraryVariant = modifier[0] === "[";
2138
+ if (isArbitraryVariant) {
2139
+ sortedModifiers.push(...unsortedModifiers.sort(), modifier);
2140
+ unsortedModifiers = [];
2141
+ } else {
2142
+ unsortedModifiers.push(modifier);
2143
+ }
2144
+ });
2145
+ sortedModifiers.push(...unsortedModifiers.sort());
2146
+ return sortedModifiers;
2147
+ };
2148
+ var createConfigUtils = (config) => ({
2149
+ cache: createLruCache(config.cacheSize),
2150
+ parseClassName: createParseClassName(config),
2151
+ ...createClassGroupUtils(config)
2152
+ });
2153
+ var SPLIT_CLASSES_REGEX = /\s+/;
2154
+ var mergeClassList = (classList, configUtils) => {
2155
+ const {
2156
+ parseClassName,
2157
+ getClassGroupId,
2158
+ getConflictingClassGroupIds
2159
+ } = configUtils;
2160
+ const classGroupsInConflict = [];
2161
+ const classNames = classList.trim().split(SPLIT_CLASSES_REGEX);
2162
+ let result = "";
2163
+ for (let index = classNames.length - 1; index >= 0; index -= 1) {
2164
+ const originalClassName = classNames[index];
2165
+ const {
2166
+ modifiers,
2167
+ hasImportantModifier,
2168
+ baseClassName,
2169
+ maybePostfixModifierPosition
2170
+ } = parseClassName(originalClassName);
2171
+ let hasPostfixModifier = Boolean(maybePostfixModifierPosition);
2172
+ let classGroupId = getClassGroupId(hasPostfixModifier ? baseClassName.substring(0, maybePostfixModifierPosition) : baseClassName);
2173
+ if (!classGroupId) {
2174
+ if (!hasPostfixModifier) {
2175
+ result = originalClassName + (result.length > 0 ? " " + result : result);
2176
+ continue;
2177
+ }
2178
+ classGroupId = getClassGroupId(baseClassName);
2179
+ if (!classGroupId) {
2180
+ result = originalClassName + (result.length > 0 ? " " + result : result);
2181
+ continue;
2182
+ }
2183
+ hasPostfixModifier = false;
2184
+ }
2185
+ const variantModifier = sortModifiers(modifiers).join(":");
2186
+ const modifierId = hasImportantModifier ? variantModifier + IMPORTANT_MODIFIER : variantModifier;
2187
+ const classId = modifierId + classGroupId;
2188
+ if (classGroupsInConflict.includes(classId)) {
2189
+ continue;
2190
+ }
2191
+ classGroupsInConflict.push(classId);
2192
+ const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier);
2193
+ for (let i = 0; i < conflictGroups.length; ++i) {
2194
+ const group = conflictGroups[i];
2195
+ classGroupsInConflict.push(modifierId + group);
2196
+ }
2197
+ result = originalClassName + (result.length > 0 ? " " + result : result);
2198
+ }
2199
+ return result;
2200
+ };
2201
+ function twJoin() {
2202
+ let index = 0;
2203
+ let argument;
2204
+ let resolvedValue;
2205
+ let string = "";
2206
+ while (index < arguments.length) {
2207
+ if (argument = arguments[index++]) {
2208
+ if (resolvedValue = toValue(argument)) {
2209
+ string && (string += " ");
2210
+ string += resolvedValue;
2211
+ }
2212
+ }
2213
+ }
2214
+ return string;
2215
+ }
2216
+ var toValue = (mix) => {
2217
+ if (typeof mix === "string") {
2218
+ return mix;
2219
+ }
2220
+ let resolvedValue;
2221
+ let string = "";
2222
+ for (let k = 0; k < mix.length; k++) {
2223
+ if (mix[k]) {
2224
+ if (resolvedValue = toValue(mix[k])) {
2225
+ string && (string += " ");
2226
+ string += resolvedValue;
2227
+ }
2228
+ }
2229
+ }
2230
+ return string;
2231
+ };
2232
+ function createTailwindMerge(createConfigFirst, ...createConfigRest) {
2233
+ let configUtils;
2234
+ let cacheGet;
2235
+ let cacheSet;
2236
+ let functionToCall = initTailwindMerge;
2237
+ function initTailwindMerge(classList) {
2238
+ const config = createConfigRest.reduce((previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig), createConfigFirst());
2239
+ configUtils = createConfigUtils(config);
2240
+ cacheGet = configUtils.cache.get;
2241
+ cacheSet = configUtils.cache.set;
2242
+ functionToCall = tailwindMerge;
2243
+ return tailwindMerge(classList);
2244
+ }
2245
+ function tailwindMerge(classList) {
2246
+ const cachedResult = cacheGet(classList);
2247
+ if (cachedResult) {
2248
+ return cachedResult;
2249
+ }
2250
+ const result = mergeClassList(classList, configUtils);
2251
+ cacheSet(classList, result);
2252
+ return result;
2253
+ }
2254
+ return function callTailwindMerge() {
2255
+ return functionToCall(twJoin.apply(null, arguments));
2256
+ };
2257
+ }
2258
+ var fromTheme = (key) => {
2259
+ const themeGetter = (theme) => theme[key] || [];
2260
+ themeGetter.isThemeGetter = true;
2261
+ return themeGetter;
2262
+ };
2263
+ var arbitraryValueRegex = /^\[(?:([a-z-]+):)?(.+)\]$/i;
2264
+ var fractionRegex = /^\d+\/\d+$/;
2265
+ var stringLengths = /* @__PURE__ */ new Set(["px", "full", "screen"]);
2266
+ var tshirtUnitRegex = /^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/;
2267
+ var lengthUnitRegex = /\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/;
2268
+ var colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/;
2269
+ var shadowRegex = /^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/;
2270
+ var imageRegex = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/;
2271
+ var isLength = (value) => isNumber(value) || stringLengths.has(value) || fractionRegex.test(value);
2272
+ var isArbitraryLength = (value) => getIsArbitraryValue(value, "length", isLengthOnly);
2273
+ var isNumber = (value) => Boolean(value) && !Number.isNaN(Number(value));
2274
+ var isArbitraryNumber = (value) => getIsArbitraryValue(value, "number", isNumber);
2275
+ var isInteger = (value) => Boolean(value) && Number.isInteger(Number(value));
2276
+ var isPercent = (value) => value.endsWith("%") && isNumber(value.slice(0, -1));
2277
+ var isArbitraryValue = (value) => arbitraryValueRegex.test(value);
2278
+ var isTshirtSize = (value) => tshirtUnitRegex.test(value);
2279
+ var sizeLabels = /* @__PURE__ */ new Set(["length", "size", "percentage"]);
2280
+ var isArbitrarySize = (value) => getIsArbitraryValue(value, sizeLabels, isNever);
2281
+ var isArbitraryPosition = (value) => getIsArbitraryValue(value, "position", isNever);
2282
+ var imageLabels = /* @__PURE__ */ new Set(["image", "url"]);
2283
+ var isArbitraryImage = (value) => getIsArbitraryValue(value, imageLabels, isImage);
2284
+ var isArbitraryShadow = (value) => getIsArbitraryValue(value, "", isShadow);
2285
+ var isAny = () => true;
2286
+ var getIsArbitraryValue = (value, label, testValue) => {
2287
+ const result = arbitraryValueRegex.exec(value);
2288
+ if (result) {
2289
+ if (result[1]) {
2290
+ return typeof label === "string" ? result[1] === label : label.has(result[1]);
2291
+ }
2292
+ return testValue(result[2]);
2293
+ }
2294
+ return false;
2295
+ };
2296
+ var isLengthOnly = (value) => (
2297
+ // `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.
2298
+ // For example, `hsl(0 0% 0%)` would be classified as a length without this check.
2299
+ // I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.
2300
+ lengthUnitRegex.test(value) && !colorFunctionRegex.test(value)
2301
+ );
2302
+ var isNever = () => false;
2303
+ var isShadow = (value) => shadowRegex.test(value);
2304
+ var isImage = (value) => imageRegex.test(value);
2305
+ var getDefaultConfig = () => {
2306
+ const colors = fromTheme("colors");
2307
+ const spacing = fromTheme("spacing");
2308
+ const blur = fromTheme("blur");
2309
+ const brightness = fromTheme("brightness");
2310
+ const borderColor = fromTheme("borderColor");
2311
+ const borderRadius = fromTheme("borderRadius");
2312
+ const borderSpacing = fromTheme("borderSpacing");
2313
+ const borderWidth = fromTheme("borderWidth");
2314
+ const contrast = fromTheme("contrast");
2315
+ const grayscale = fromTheme("grayscale");
2316
+ const hueRotate = fromTheme("hueRotate");
2317
+ const invert = fromTheme("invert");
2318
+ const gap = fromTheme("gap");
2319
+ const gradientColorStops = fromTheme("gradientColorStops");
2320
+ const gradientColorStopPositions = fromTheme("gradientColorStopPositions");
2321
+ const inset = fromTheme("inset");
2322
+ const margin = fromTheme("margin");
2323
+ const opacity = fromTheme("opacity");
2324
+ const padding = fromTheme("padding");
2325
+ const saturate = fromTheme("saturate");
2326
+ const scale = fromTheme("scale");
2327
+ const sepia = fromTheme("sepia");
2328
+ const skew = fromTheme("skew");
2329
+ const space = fromTheme("space");
2330
+ const translate = fromTheme("translate");
2331
+ const getOverscroll = () => ["auto", "contain", "none"];
2332
+ const getOverflow = () => ["auto", "hidden", "clip", "visible", "scroll"];
2333
+ const getSpacingWithAutoAndArbitrary = () => ["auto", isArbitraryValue, spacing];
2334
+ const getSpacingWithArbitrary = () => [isArbitraryValue, spacing];
2335
+ const getLengthWithEmptyAndArbitrary = () => ["", isLength, isArbitraryLength];
2336
+ const getNumberWithAutoAndArbitrary = () => ["auto", isNumber, isArbitraryValue];
2337
+ const getPositions = () => ["bottom", "center", "left", "left-bottom", "left-top", "right", "right-bottom", "right-top", "top"];
2338
+ const getLineStyles = () => ["solid", "dashed", "dotted", "double", "none"];
2339
+ const getBlendModes = () => ["normal", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "hue", "saturation", "color", "luminosity"];
2340
+ const getAlign = () => ["start", "end", "center", "between", "around", "evenly", "stretch"];
2341
+ const getZeroAndEmpty = () => ["", "0", isArbitraryValue];
2342
+ const getBreaks = () => ["auto", "avoid", "all", "avoid-page", "page", "left", "right", "column"];
2343
+ const getNumberAndArbitrary = () => [isNumber, isArbitraryValue];
2344
+ return {
2345
+ cacheSize: 500,
2346
+ separator: ":",
2347
+ theme: {
2348
+ colors: [isAny],
2349
+ spacing: [isLength, isArbitraryLength],
2350
+ blur: ["none", "", isTshirtSize, isArbitraryValue],
2351
+ brightness: getNumberAndArbitrary(),
2352
+ borderColor: [colors],
2353
+ borderRadius: ["none", "", "full", isTshirtSize, isArbitraryValue],
2354
+ borderSpacing: getSpacingWithArbitrary(),
2355
+ borderWidth: getLengthWithEmptyAndArbitrary(),
2356
+ contrast: getNumberAndArbitrary(),
2357
+ grayscale: getZeroAndEmpty(),
2358
+ hueRotate: getNumberAndArbitrary(),
2359
+ invert: getZeroAndEmpty(),
2360
+ gap: getSpacingWithArbitrary(),
2361
+ gradientColorStops: [colors],
2362
+ gradientColorStopPositions: [isPercent, isArbitraryLength],
2363
+ inset: getSpacingWithAutoAndArbitrary(),
2364
+ margin: getSpacingWithAutoAndArbitrary(),
2365
+ opacity: getNumberAndArbitrary(),
2366
+ padding: getSpacingWithArbitrary(),
2367
+ saturate: getNumberAndArbitrary(),
2368
+ scale: getNumberAndArbitrary(),
2369
+ sepia: getZeroAndEmpty(),
2370
+ skew: getNumberAndArbitrary(),
2371
+ space: getSpacingWithArbitrary(),
2372
+ translate: getSpacingWithArbitrary()
2373
+ },
2374
+ classGroups: {
2375
+ // Layout
2376
+ /**
2377
+ * Aspect Ratio
2378
+ * @see https://tailwindcss.com/docs/aspect-ratio
2379
+ */
2380
+ aspect: [{
2381
+ aspect: ["auto", "square", "video", isArbitraryValue]
2382
+ }],
2383
+ /**
2384
+ * Container
2385
+ * @see https://tailwindcss.com/docs/container
2386
+ */
2387
+ container: ["container"],
2388
+ /**
2389
+ * Columns
2390
+ * @see https://tailwindcss.com/docs/columns
2391
+ */
2392
+ columns: [{
2393
+ columns: [isTshirtSize]
2394
+ }],
2395
+ /**
2396
+ * Break After
2397
+ * @see https://tailwindcss.com/docs/break-after
2398
+ */
2399
+ "break-after": [{
2400
+ "break-after": getBreaks()
2401
+ }],
2402
+ /**
2403
+ * Break Before
2404
+ * @see https://tailwindcss.com/docs/break-before
2405
+ */
2406
+ "break-before": [{
2407
+ "break-before": getBreaks()
2408
+ }],
2409
+ /**
2410
+ * Break Inside
2411
+ * @see https://tailwindcss.com/docs/break-inside
2412
+ */
2413
+ "break-inside": [{
2414
+ "break-inside": ["auto", "avoid", "avoid-page", "avoid-column"]
2415
+ }],
2416
+ /**
2417
+ * Box Decoration Break
2418
+ * @see https://tailwindcss.com/docs/box-decoration-break
2419
+ */
2420
+ "box-decoration": [{
2421
+ "box-decoration": ["slice", "clone"]
2422
+ }],
2423
+ /**
2424
+ * Box Sizing
2425
+ * @see https://tailwindcss.com/docs/box-sizing
2426
+ */
2427
+ box: [{
2428
+ box: ["border", "content"]
2429
+ }],
2430
+ /**
2431
+ * Display
2432
+ * @see https://tailwindcss.com/docs/display
2433
+ */
2434
+ display: ["block", "inline-block", "inline", "flex", "inline-flex", "table", "inline-table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row-group", "table-row", "flow-root", "grid", "inline-grid", "contents", "list-item", "hidden"],
2435
+ /**
2436
+ * Floats
2437
+ * @see https://tailwindcss.com/docs/float
2438
+ */
2439
+ float: [{
2440
+ float: ["right", "left", "none", "start", "end"]
2441
+ }],
2442
+ /**
2443
+ * Clear
2444
+ * @see https://tailwindcss.com/docs/clear
2445
+ */
2446
+ clear: [{
2447
+ clear: ["left", "right", "both", "none", "start", "end"]
2448
+ }],
2449
+ /**
2450
+ * Isolation
2451
+ * @see https://tailwindcss.com/docs/isolation
2452
+ */
2453
+ isolation: ["isolate", "isolation-auto"],
2454
+ /**
2455
+ * Object Fit
2456
+ * @see https://tailwindcss.com/docs/object-fit
2457
+ */
2458
+ "object-fit": [{
2459
+ object: ["contain", "cover", "fill", "none", "scale-down"]
2460
+ }],
2461
+ /**
2462
+ * Object Position
2463
+ * @see https://tailwindcss.com/docs/object-position
2464
+ */
2465
+ "object-position": [{
2466
+ object: [...getPositions(), isArbitraryValue]
2467
+ }],
2468
+ /**
2469
+ * Overflow
2470
+ * @see https://tailwindcss.com/docs/overflow
2471
+ */
2472
+ overflow: [{
2473
+ overflow: getOverflow()
2474
+ }],
2475
+ /**
2476
+ * Overflow X
2477
+ * @see https://tailwindcss.com/docs/overflow
2478
+ */
2479
+ "overflow-x": [{
2480
+ "overflow-x": getOverflow()
2481
+ }],
2482
+ /**
2483
+ * Overflow Y
2484
+ * @see https://tailwindcss.com/docs/overflow
2485
+ */
2486
+ "overflow-y": [{
2487
+ "overflow-y": getOverflow()
2488
+ }],
2489
+ /**
2490
+ * Overscroll Behavior
2491
+ * @see https://tailwindcss.com/docs/overscroll-behavior
2492
+ */
2493
+ overscroll: [{
2494
+ overscroll: getOverscroll()
2495
+ }],
2496
+ /**
2497
+ * Overscroll Behavior X
2498
+ * @see https://tailwindcss.com/docs/overscroll-behavior
2499
+ */
2500
+ "overscroll-x": [{
2501
+ "overscroll-x": getOverscroll()
2502
+ }],
2503
+ /**
2504
+ * Overscroll Behavior Y
2505
+ * @see https://tailwindcss.com/docs/overscroll-behavior
2506
+ */
2507
+ "overscroll-y": [{
2508
+ "overscroll-y": getOverscroll()
2509
+ }],
2510
+ /**
2511
+ * Position
2512
+ * @see https://tailwindcss.com/docs/position
2513
+ */
2514
+ position: ["static", "fixed", "absolute", "relative", "sticky"],
2515
+ /**
2516
+ * Top / Right / Bottom / Left
2517
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
2518
+ */
2519
+ inset: [{
2520
+ inset: [inset]
2521
+ }],
2522
+ /**
2523
+ * Right / Left
2524
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
2525
+ */
2526
+ "inset-x": [{
2527
+ "inset-x": [inset]
2528
+ }],
2529
+ /**
2530
+ * Top / Bottom
2531
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
2532
+ */
2533
+ "inset-y": [{
2534
+ "inset-y": [inset]
2535
+ }],
2536
+ /**
2537
+ * Start
2538
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
2539
+ */
2540
+ start: [{
2541
+ start: [inset]
2542
+ }],
2543
+ /**
2544
+ * End
2545
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
2546
+ */
2547
+ end: [{
2548
+ end: [inset]
2549
+ }],
2550
+ /**
2551
+ * Top
2552
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
2553
+ */
2554
+ top: [{
2555
+ top: [inset]
2556
+ }],
2557
+ /**
2558
+ * Right
2559
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
2560
+ */
2561
+ right: [{
2562
+ right: [inset]
2563
+ }],
2564
+ /**
2565
+ * Bottom
2566
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
2567
+ */
2568
+ bottom: [{
2569
+ bottom: [inset]
2570
+ }],
2571
+ /**
2572
+ * Left
2573
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
2574
+ */
2575
+ left: [{
2576
+ left: [inset]
2577
+ }],
2578
+ /**
2579
+ * Visibility
2580
+ * @see https://tailwindcss.com/docs/visibility
2581
+ */
2582
+ visibility: ["visible", "invisible", "collapse"],
2583
+ /**
2584
+ * Z-Index
2585
+ * @see https://tailwindcss.com/docs/z-index
2586
+ */
2587
+ z: [{
2588
+ z: ["auto", isInteger, isArbitraryValue]
2589
+ }],
2590
+ // Flexbox and Grid
2591
+ /**
2592
+ * Flex Basis
2593
+ * @see https://tailwindcss.com/docs/flex-basis
2594
+ */
2595
+ basis: [{
2596
+ basis: getSpacingWithAutoAndArbitrary()
2597
+ }],
2598
+ /**
2599
+ * Flex Direction
2600
+ * @see https://tailwindcss.com/docs/flex-direction
2601
+ */
2602
+ "flex-direction": [{
2603
+ flex: ["row", "row-reverse", "col", "col-reverse"]
2604
+ }],
2605
+ /**
2606
+ * Flex Wrap
2607
+ * @see https://tailwindcss.com/docs/flex-wrap
2608
+ */
2609
+ "flex-wrap": [{
2610
+ flex: ["wrap", "wrap-reverse", "nowrap"]
2611
+ }],
2612
+ /**
2613
+ * Flex
2614
+ * @see https://tailwindcss.com/docs/flex
2615
+ */
2616
+ flex: [{
2617
+ flex: ["1", "auto", "initial", "none", isArbitraryValue]
2618
+ }],
2619
+ /**
2620
+ * Flex Grow
2621
+ * @see https://tailwindcss.com/docs/flex-grow
2622
+ */
2623
+ grow: [{
2624
+ grow: getZeroAndEmpty()
2625
+ }],
2626
+ /**
2627
+ * Flex Shrink
2628
+ * @see https://tailwindcss.com/docs/flex-shrink
2629
+ */
2630
+ shrink: [{
2631
+ shrink: getZeroAndEmpty()
2632
+ }],
2633
+ /**
2634
+ * Order
2635
+ * @see https://tailwindcss.com/docs/order
2636
+ */
2637
+ order: [{
2638
+ order: ["first", "last", "none", isInteger, isArbitraryValue]
2639
+ }],
2640
+ /**
2641
+ * Grid Template Columns
2642
+ * @see https://tailwindcss.com/docs/grid-template-columns
2643
+ */
2644
+ "grid-cols": [{
2645
+ "grid-cols": [isAny]
2646
+ }],
2647
+ /**
2648
+ * Grid Column Start / End
2649
+ * @see https://tailwindcss.com/docs/grid-column
2650
+ */
2651
+ "col-start-end": [{
2652
+ col: ["auto", {
2653
+ span: ["full", isInteger, isArbitraryValue]
2654
+ }, isArbitraryValue]
2655
+ }],
2656
+ /**
2657
+ * Grid Column Start
2658
+ * @see https://tailwindcss.com/docs/grid-column
2659
+ */
2660
+ "col-start": [{
2661
+ "col-start": getNumberWithAutoAndArbitrary()
2662
+ }],
2663
+ /**
2664
+ * Grid Column End
2665
+ * @see https://tailwindcss.com/docs/grid-column
2666
+ */
2667
+ "col-end": [{
2668
+ "col-end": getNumberWithAutoAndArbitrary()
2669
+ }],
2670
+ /**
2671
+ * Grid Template Rows
2672
+ * @see https://tailwindcss.com/docs/grid-template-rows
2673
+ */
2674
+ "grid-rows": [{
2675
+ "grid-rows": [isAny]
2676
+ }],
2677
+ /**
2678
+ * Grid Row Start / End
2679
+ * @see https://tailwindcss.com/docs/grid-row
2680
+ */
2681
+ "row-start-end": [{
2682
+ row: ["auto", {
2683
+ span: [isInteger, isArbitraryValue]
2684
+ }, isArbitraryValue]
2685
+ }],
2686
+ /**
2687
+ * Grid Row Start
2688
+ * @see https://tailwindcss.com/docs/grid-row
2689
+ */
2690
+ "row-start": [{
2691
+ "row-start": getNumberWithAutoAndArbitrary()
2692
+ }],
2693
+ /**
2694
+ * Grid Row End
2695
+ * @see https://tailwindcss.com/docs/grid-row
2696
+ */
2697
+ "row-end": [{
2698
+ "row-end": getNumberWithAutoAndArbitrary()
2699
+ }],
2700
+ /**
2701
+ * Grid Auto Flow
2702
+ * @see https://tailwindcss.com/docs/grid-auto-flow
2703
+ */
2704
+ "grid-flow": [{
2705
+ "grid-flow": ["row", "col", "dense", "row-dense", "col-dense"]
2706
+ }],
2707
+ /**
2708
+ * Grid Auto Columns
2709
+ * @see https://tailwindcss.com/docs/grid-auto-columns
2710
+ */
2711
+ "auto-cols": [{
2712
+ "auto-cols": ["auto", "min", "max", "fr", isArbitraryValue]
2713
+ }],
2714
+ /**
2715
+ * Grid Auto Rows
2716
+ * @see https://tailwindcss.com/docs/grid-auto-rows
2717
+ */
2718
+ "auto-rows": [{
2719
+ "auto-rows": ["auto", "min", "max", "fr", isArbitraryValue]
2720
+ }],
2721
+ /**
2722
+ * Gap
2723
+ * @see https://tailwindcss.com/docs/gap
2724
+ */
2725
+ gap: [{
2726
+ gap: [gap]
2727
+ }],
2728
+ /**
2729
+ * Gap X
2730
+ * @see https://tailwindcss.com/docs/gap
2731
+ */
2732
+ "gap-x": [{
2733
+ "gap-x": [gap]
2734
+ }],
2735
+ /**
2736
+ * Gap Y
2737
+ * @see https://tailwindcss.com/docs/gap
2738
+ */
2739
+ "gap-y": [{
2740
+ "gap-y": [gap]
2741
+ }],
2742
+ /**
2743
+ * Justify Content
2744
+ * @see https://tailwindcss.com/docs/justify-content
2745
+ */
2746
+ "justify-content": [{
2747
+ justify: ["normal", ...getAlign()]
2748
+ }],
2749
+ /**
2750
+ * Justify Items
2751
+ * @see https://tailwindcss.com/docs/justify-items
2752
+ */
2753
+ "justify-items": [{
2754
+ "justify-items": ["start", "end", "center", "stretch"]
2755
+ }],
2756
+ /**
2757
+ * Justify Self
2758
+ * @see https://tailwindcss.com/docs/justify-self
2759
+ */
2760
+ "justify-self": [{
2761
+ "justify-self": ["auto", "start", "end", "center", "stretch"]
2762
+ }],
2763
+ /**
2764
+ * Align Content
2765
+ * @see https://tailwindcss.com/docs/align-content
2766
+ */
2767
+ "align-content": [{
2768
+ content: ["normal", ...getAlign(), "baseline"]
2769
+ }],
2770
+ /**
2771
+ * Align Items
2772
+ * @see https://tailwindcss.com/docs/align-items
2773
+ */
2774
+ "align-items": [{
2775
+ items: ["start", "end", "center", "baseline", "stretch"]
2776
+ }],
2777
+ /**
2778
+ * Align Self
2779
+ * @see https://tailwindcss.com/docs/align-self
2780
+ */
2781
+ "align-self": [{
2782
+ self: ["auto", "start", "end", "center", "stretch", "baseline"]
2783
+ }],
2784
+ /**
2785
+ * Place Content
2786
+ * @see https://tailwindcss.com/docs/place-content
2787
+ */
2788
+ "place-content": [{
2789
+ "place-content": [...getAlign(), "baseline"]
2790
+ }],
2791
+ /**
2792
+ * Place Items
2793
+ * @see https://tailwindcss.com/docs/place-items
2794
+ */
2795
+ "place-items": [{
2796
+ "place-items": ["start", "end", "center", "baseline", "stretch"]
2797
+ }],
2798
+ /**
2799
+ * Place Self
2800
+ * @see https://tailwindcss.com/docs/place-self
2801
+ */
2802
+ "place-self": [{
2803
+ "place-self": ["auto", "start", "end", "center", "stretch"]
2804
+ }],
2805
+ // Spacing
2806
+ /**
2807
+ * Padding
2808
+ * @see https://tailwindcss.com/docs/padding
2809
+ */
2810
+ p: [{
2811
+ p: [padding]
2812
+ }],
2813
+ /**
2814
+ * Padding X
2815
+ * @see https://tailwindcss.com/docs/padding
2816
+ */
2817
+ px: [{
2818
+ px: [padding]
2819
+ }],
2820
+ /**
2821
+ * Padding Y
2822
+ * @see https://tailwindcss.com/docs/padding
2823
+ */
2824
+ py: [{
2825
+ py: [padding]
2826
+ }],
2827
+ /**
2828
+ * Padding Start
2829
+ * @see https://tailwindcss.com/docs/padding
2830
+ */
2831
+ ps: [{
2832
+ ps: [padding]
2833
+ }],
2834
+ /**
2835
+ * Padding End
2836
+ * @see https://tailwindcss.com/docs/padding
2837
+ */
2838
+ pe: [{
2839
+ pe: [padding]
2840
+ }],
2841
+ /**
2842
+ * Padding Top
2843
+ * @see https://tailwindcss.com/docs/padding
2844
+ */
2845
+ pt: [{
2846
+ pt: [padding]
2847
+ }],
2848
+ /**
2849
+ * Padding Right
2850
+ * @see https://tailwindcss.com/docs/padding
2851
+ */
2852
+ pr: [{
2853
+ pr: [padding]
2854
+ }],
2855
+ /**
2856
+ * Padding Bottom
2857
+ * @see https://tailwindcss.com/docs/padding
2858
+ */
2859
+ pb: [{
2860
+ pb: [padding]
2861
+ }],
2862
+ /**
2863
+ * Padding Left
2864
+ * @see https://tailwindcss.com/docs/padding
2865
+ */
2866
+ pl: [{
2867
+ pl: [padding]
2868
+ }],
2869
+ /**
2870
+ * Margin
2871
+ * @see https://tailwindcss.com/docs/margin
2872
+ */
2873
+ m: [{
2874
+ m: [margin]
2875
+ }],
2876
+ /**
2877
+ * Margin X
2878
+ * @see https://tailwindcss.com/docs/margin
2879
+ */
2880
+ mx: [{
2881
+ mx: [margin]
2882
+ }],
2883
+ /**
2884
+ * Margin Y
2885
+ * @see https://tailwindcss.com/docs/margin
2886
+ */
2887
+ my: [{
2888
+ my: [margin]
2889
+ }],
2890
+ /**
2891
+ * Margin Start
2892
+ * @see https://tailwindcss.com/docs/margin
2893
+ */
2894
+ ms: [{
2895
+ ms: [margin]
2896
+ }],
2897
+ /**
2898
+ * Margin End
2899
+ * @see https://tailwindcss.com/docs/margin
2900
+ */
2901
+ me: [{
2902
+ me: [margin]
2903
+ }],
2904
+ /**
2905
+ * Margin Top
2906
+ * @see https://tailwindcss.com/docs/margin
2907
+ */
2908
+ mt: [{
2909
+ mt: [margin]
2910
+ }],
2911
+ /**
2912
+ * Margin Right
2913
+ * @see https://tailwindcss.com/docs/margin
2914
+ */
2915
+ mr: [{
2916
+ mr: [margin]
2917
+ }],
2918
+ /**
2919
+ * Margin Bottom
2920
+ * @see https://tailwindcss.com/docs/margin
2921
+ */
2922
+ mb: [{
2923
+ mb: [margin]
2924
+ }],
2925
+ /**
2926
+ * Margin Left
2927
+ * @see https://tailwindcss.com/docs/margin
2928
+ */
2929
+ ml: [{
2930
+ ml: [margin]
2931
+ }],
2932
+ /**
2933
+ * Space Between X
2934
+ * @see https://tailwindcss.com/docs/space
2935
+ */
2936
+ "space-x": [{
2937
+ "space-x": [space]
2938
+ }],
2939
+ /**
2940
+ * Space Between X Reverse
2941
+ * @see https://tailwindcss.com/docs/space
2942
+ */
2943
+ "space-x-reverse": ["space-x-reverse"],
2944
+ /**
2945
+ * Space Between Y
2946
+ * @see https://tailwindcss.com/docs/space
2947
+ */
2948
+ "space-y": [{
2949
+ "space-y": [space]
2950
+ }],
2951
+ /**
2952
+ * Space Between Y Reverse
2953
+ * @see https://tailwindcss.com/docs/space
2954
+ */
2955
+ "space-y-reverse": ["space-y-reverse"],
2956
+ // Sizing
2957
+ /**
2958
+ * Width
2959
+ * @see https://tailwindcss.com/docs/width
2960
+ */
2961
+ w: [{
2962
+ w: ["auto", "min", "max", "fit", "svw", "lvw", "dvw", isArbitraryValue, spacing]
2963
+ }],
2964
+ /**
2965
+ * Min-Width
2966
+ * @see https://tailwindcss.com/docs/min-width
2967
+ */
2968
+ "min-w": [{
2969
+ "min-w": [isArbitraryValue, spacing, "min", "max", "fit"]
2970
+ }],
2971
+ /**
2972
+ * Max-Width
2973
+ * @see https://tailwindcss.com/docs/max-width
2974
+ */
2975
+ "max-w": [{
2976
+ "max-w": [isArbitraryValue, spacing, "none", "full", "min", "max", "fit", "prose", {
2977
+ screen: [isTshirtSize]
2978
+ }, isTshirtSize]
2979
+ }],
2980
+ /**
2981
+ * Height
2982
+ * @see https://tailwindcss.com/docs/height
2983
+ */
2984
+ h: [{
2985
+ h: [isArbitraryValue, spacing, "auto", "min", "max", "fit", "svh", "lvh", "dvh"]
2986
+ }],
2987
+ /**
2988
+ * Min-Height
2989
+ * @see https://tailwindcss.com/docs/min-height
2990
+ */
2991
+ "min-h": [{
2992
+ "min-h": [isArbitraryValue, spacing, "min", "max", "fit", "svh", "lvh", "dvh"]
2993
+ }],
2994
+ /**
2995
+ * Max-Height
2996
+ * @see https://tailwindcss.com/docs/max-height
2997
+ */
2998
+ "max-h": [{
2999
+ "max-h": [isArbitraryValue, spacing, "min", "max", "fit", "svh", "lvh", "dvh"]
3000
+ }],
3001
+ /**
3002
+ * Size
3003
+ * @see https://tailwindcss.com/docs/size
3004
+ */
3005
+ size: [{
3006
+ size: [isArbitraryValue, spacing, "auto", "min", "max", "fit"]
3007
+ }],
3008
+ // Typography
3009
+ /**
3010
+ * Font Size
3011
+ * @see https://tailwindcss.com/docs/font-size
3012
+ */
3013
+ "font-size": [{
3014
+ text: ["base", isTshirtSize, isArbitraryLength]
3015
+ }],
3016
+ /**
3017
+ * Font Smoothing
3018
+ * @see https://tailwindcss.com/docs/font-smoothing
3019
+ */
3020
+ "font-smoothing": ["antialiased", "subpixel-antialiased"],
3021
+ /**
3022
+ * Font Style
3023
+ * @see https://tailwindcss.com/docs/font-style
3024
+ */
3025
+ "font-style": ["italic", "not-italic"],
3026
+ /**
3027
+ * Font Weight
3028
+ * @see https://tailwindcss.com/docs/font-weight
3029
+ */
3030
+ "font-weight": [{
3031
+ font: ["thin", "extralight", "light", "normal", "medium", "semibold", "bold", "extrabold", "black", isArbitraryNumber]
3032
+ }],
3033
+ /**
3034
+ * Font Family
3035
+ * @see https://tailwindcss.com/docs/font-family
3036
+ */
3037
+ "font-family": [{
3038
+ font: [isAny]
3039
+ }],
3040
+ /**
3041
+ * Font Variant Numeric
3042
+ * @see https://tailwindcss.com/docs/font-variant-numeric
3043
+ */
3044
+ "fvn-normal": ["normal-nums"],
3045
+ /**
3046
+ * Font Variant Numeric
3047
+ * @see https://tailwindcss.com/docs/font-variant-numeric
3048
+ */
3049
+ "fvn-ordinal": ["ordinal"],
3050
+ /**
3051
+ * Font Variant Numeric
3052
+ * @see https://tailwindcss.com/docs/font-variant-numeric
3053
+ */
3054
+ "fvn-slashed-zero": ["slashed-zero"],
3055
+ /**
3056
+ * Font Variant Numeric
3057
+ * @see https://tailwindcss.com/docs/font-variant-numeric
3058
+ */
3059
+ "fvn-figure": ["lining-nums", "oldstyle-nums"],
3060
+ /**
3061
+ * Font Variant Numeric
3062
+ * @see https://tailwindcss.com/docs/font-variant-numeric
3063
+ */
3064
+ "fvn-spacing": ["proportional-nums", "tabular-nums"],
3065
+ /**
3066
+ * Font Variant Numeric
3067
+ * @see https://tailwindcss.com/docs/font-variant-numeric
3068
+ */
3069
+ "fvn-fraction": ["diagonal-fractions", "stacked-fractions"],
3070
+ /**
3071
+ * Letter Spacing
3072
+ * @see https://tailwindcss.com/docs/letter-spacing
3073
+ */
3074
+ tracking: [{
3075
+ tracking: ["tighter", "tight", "normal", "wide", "wider", "widest", isArbitraryValue]
3076
+ }],
3077
+ /**
3078
+ * Line Clamp
3079
+ * @see https://tailwindcss.com/docs/line-clamp
3080
+ */
3081
+ "line-clamp": [{
3082
+ "line-clamp": ["none", isNumber, isArbitraryNumber]
3083
+ }],
3084
+ /**
3085
+ * Line Height
3086
+ * @see https://tailwindcss.com/docs/line-height
3087
+ */
3088
+ leading: [{
3089
+ leading: ["none", "tight", "snug", "normal", "relaxed", "loose", isLength, isArbitraryValue]
3090
+ }],
3091
+ /**
3092
+ * List Style Image
3093
+ * @see https://tailwindcss.com/docs/list-style-image
3094
+ */
3095
+ "list-image": [{
3096
+ "list-image": ["none", isArbitraryValue]
3097
+ }],
3098
+ /**
3099
+ * List Style Type
3100
+ * @see https://tailwindcss.com/docs/list-style-type
3101
+ */
3102
+ "list-style-type": [{
3103
+ list: ["none", "disc", "decimal", isArbitraryValue]
3104
+ }],
3105
+ /**
3106
+ * List Style Position
3107
+ * @see https://tailwindcss.com/docs/list-style-position
3108
+ */
3109
+ "list-style-position": [{
3110
+ list: ["inside", "outside"]
3111
+ }],
3112
+ /**
3113
+ * Placeholder Color
3114
+ * @deprecated since Tailwind CSS v3.0.0
3115
+ * @see https://tailwindcss.com/docs/placeholder-color
3116
+ */
3117
+ "placeholder-color": [{
3118
+ placeholder: [colors]
3119
+ }],
3120
+ /**
3121
+ * Placeholder Opacity
3122
+ * @see https://tailwindcss.com/docs/placeholder-opacity
3123
+ */
3124
+ "placeholder-opacity": [{
3125
+ "placeholder-opacity": [opacity]
3126
+ }],
3127
+ /**
3128
+ * Text Alignment
3129
+ * @see https://tailwindcss.com/docs/text-align
3130
+ */
3131
+ "text-alignment": [{
3132
+ text: ["left", "center", "right", "justify", "start", "end"]
3133
+ }],
3134
+ /**
3135
+ * Text Color
3136
+ * @see https://tailwindcss.com/docs/text-color
3137
+ */
3138
+ "text-color": [{
3139
+ text: [colors]
3140
+ }],
3141
+ /**
3142
+ * Text Opacity
3143
+ * @see https://tailwindcss.com/docs/text-opacity
3144
+ */
3145
+ "text-opacity": [{
3146
+ "text-opacity": [opacity]
3147
+ }],
3148
+ /**
3149
+ * Text Decoration
3150
+ * @see https://tailwindcss.com/docs/text-decoration
3151
+ */
3152
+ "text-decoration": ["underline", "overline", "line-through", "no-underline"],
3153
+ /**
3154
+ * Text Decoration Style
3155
+ * @see https://tailwindcss.com/docs/text-decoration-style
3156
+ */
3157
+ "text-decoration-style": [{
3158
+ decoration: [...getLineStyles(), "wavy"]
3159
+ }],
3160
+ /**
3161
+ * Text Decoration Thickness
3162
+ * @see https://tailwindcss.com/docs/text-decoration-thickness
3163
+ */
3164
+ "text-decoration-thickness": [{
3165
+ decoration: ["auto", "from-font", isLength, isArbitraryLength]
3166
+ }],
3167
+ /**
3168
+ * Text Underline Offset
3169
+ * @see https://tailwindcss.com/docs/text-underline-offset
3170
+ */
3171
+ "underline-offset": [{
3172
+ "underline-offset": ["auto", isLength, isArbitraryValue]
3173
+ }],
3174
+ /**
3175
+ * Text Decoration Color
3176
+ * @see https://tailwindcss.com/docs/text-decoration-color
3177
+ */
3178
+ "text-decoration-color": [{
3179
+ decoration: [colors]
3180
+ }],
3181
+ /**
3182
+ * Text Transform
3183
+ * @see https://tailwindcss.com/docs/text-transform
3184
+ */
3185
+ "text-transform": ["uppercase", "lowercase", "capitalize", "normal-case"],
3186
+ /**
3187
+ * Text Overflow
3188
+ * @see https://tailwindcss.com/docs/text-overflow
3189
+ */
3190
+ "text-overflow": ["truncate", "text-ellipsis", "text-clip"],
3191
+ /**
3192
+ * Text Wrap
3193
+ * @see https://tailwindcss.com/docs/text-wrap
3194
+ */
3195
+ "text-wrap": [{
3196
+ text: ["wrap", "nowrap", "balance", "pretty"]
3197
+ }],
3198
+ /**
3199
+ * Text Indent
3200
+ * @see https://tailwindcss.com/docs/text-indent
3201
+ */
3202
+ indent: [{
3203
+ indent: getSpacingWithArbitrary()
3204
+ }],
3205
+ /**
3206
+ * Vertical Alignment
3207
+ * @see https://tailwindcss.com/docs/vertical-align
3208
+ */
3209
+ "vertical-align": [{
3210
+ align: ["baseline", "top", "middle", "bottom", "text-top", "text-bottom", "sub", "super", isArbitraryValue]
3211
+ }],
3212
+ /**
3213
+ * Whitespace
3214
+ * @see https://tailwindcss.com/docs/whitespace
3215
+ */
3216
+ whitespace: [{
3217
+ whitespace: ["normal", "nowrap", "pre", "pre-line", "pre-wrap", "break-spaces"]
3218
+ }],
3219
+ /**
3220
+ * Word Break
3221
+ * @see https://tailwindcss.com/docs/word-break
3222
+ */
3223
+ break: [{
3224
+ break: ["normal", "words", "all", "keep"]
3225
+ }],
3226
+ /**
3227
+ * Hyphens
3228
+ * @see https://tailwindcss.com/docs/hyphens
3229
+ */
3230
+ hyphens: [{
3231
+ hyphens: ["none", "manual", "auto"]
3232
+ }],
3233
+ /**
3234
+ * Content
3235
+ * @see https://tailwindcss.com/docs/content
3236
+ */
3237
+ content: [{
3238
+ content: ["none", isArbitraryValue]
3239
+ }],
3240
+ // Backgrounds
3241
+ /**
3242
+ * Background Attachment
3243
+ * @see https://tailwindcss.com/docs/background-attachment
3244
+ */
3245
+ "bg-attachment": [{
3246
+ bg: ["fixed", "local", "scroll"]
3247
+ }],
3248
+ /**
3249
+ * Background Clip
3250
+ * @see https://tailwindcss.com/docs/background-clip
3251
+ */
3252
+ "bg-clip": [{
3253
+ "bg-clip": ["border", "padding", "content", "text"]
3254
+ }],
3255
+ /**
3256
+ * Background Opacity
3257
+ * @deprecated since Tailwind CSS v3.0.0
3258
+ * @see https://tailwindcss.com/docs/background-opacity
3259
+ */
3260
+ "bg-opacity": [{
3261
+ "bg-opacity": [opacity]
3262
+ }],
3263
+ /**
3264
+ * Background Origin
3265
+ * @see https://tailwindcss.com/docs/background-origin
3266
+ */
3267
+ "bg-origin": [{
3268
+ "bg-origin": ["border", "padding", "content"]
3269
+ }],
3270
+ /**
3271
+ * Background Position
3272
+ * @see https://tailwindcss.com/docs/background-position
3273
+ */
3274
+ "bg-position": [{
3275
+ bg: [...getPositions(), isArbitraryPosition]
3276
+ }],
3277
+ /**
3278
+ * Background Repeat
3279
+ * @see https://tailwindcss.com/docs/background-repeat
3280
+ */
3281
+ "bg-repeat": [{
3282
+ bg: ["no-repeat", {
3283
+ repeat: ["", "x", "y", "round", "space"]
3284
+ }]
3285
+ }],
3286
+ /**
3287
+ * Background Size
3288
+ * @see https://tailwindcss.com/docs/background-size
3289
+ */
3290
+ "bg-size": [{
3291
+ bg: ["auto", "cover", "contain", isArbitrarySize]
3292
+ }],
3293
+ /**
3294
+ * Background Image
3295
+ * @see https://tailwindcss.com/docs/background-image
3296
+ */
3297
+ "bg-image": [{
3298
+ bg: ["none", {
3299
+ "gradient-to": ["t", "tr", "r", "br", "b", "bl", "l", "tl"]
3300
+ }, isArbitraryImage]
3301
+ }],
3302
+ /**
3303
+ * Background Color
3304
+ * @see https://tailwindcss.com/docs/background-color
3305
+ */
3306
+ "bg-color": [{
3307
+ bg: [colors]
3308
+ }],
3309
+ /**
3310
+ * Gradient Color Stops From Position
3311
+ * @see https://tailwindcss.com/docs/gradient-color-stops
3312
+ */
3313
+ "gradient-from-pos": [{
3314
+ from: [gradientColorStopPositions]
3315
+ }],
3316
+ /**
3317
+ * Gradient Color Stops Via Position
3318
+ * @see https://tailwindcss.com/docs/gradient-color-stops
3319
+ */
3320
+ "gradient-via-pos": [{
3321
+ via: [gradientColorStopPositions]
3322
+ }],
3323
+ /**
3324
+ * Gradient Color Stops To Position
3325
+ * @see https://tailwindcss.com/docs/gradient-color-stops
3326
+ */
3327
+ "gradient-to-pos": [{
3328
+ to: [gradientColorStopPositions]
3329
+ }],
3330
+ /**
3331
+ * Gradient Color Stops From
3332
+ * @see https://tailwindcss.com/docs/gradient-color-stops
3333
+ */
3334
+ "gradient-from": [{
3335
+ from: [gradientColorStops]
3336
+ }],
3337
+ /**
3338
+ * Gradient Color Stops Via
3339
+ * @see https://tailwindcss.com/docs/gradient-color-stops
3340
+ */
3341
+ "gradient-via": [{
3342
+ via: [gradientColorStops]
3343
+ }],
3344
+ /**
3345
+ * Gradient Color Stops To
3346
+ * @see https://tailwindcss.com/docs/gradient-color-stops
3347
+ */
3348
+ "gradient-to": [{
3349
+ to: [gradientColorStops]
3350
+ }],
3351
+ // Borders
3352
+ /**
3353
+ * Border Radius
3354
+ * @see https://tailwindcss.com/docs/border-radius
3355
+ */
3356
+ rounded: [{
3357
+ rounded: [borderRadius]
3358
+ }],
3359
+ /**
3360
+ * Border Radius Start
3361
+ * @see https://tailwindcss.com/docs/border-radius
3362
+ */
3363
+ "rounded-s": [{
3364
+ "rounded-s": [borderRadius]
3365
+ }],
3366
+ /**
3367
+ * Border Radius End
3368
+ * @see https://tailwindcss.com/docs/border-radius
3369
+ */
3370
+ "rounded-e": [{
3371
+ "rounded-e": [borderRadius]
3372
+ }],
3373
+ /**
3374
+ * Border Radius Top
3375
+ * @see https://tailwindcss.com/docs/border-radius
3376
+ */
3377
+ "rounded-t": [{
3378
+ "rounded-t": [borderRadius]
3379
+ }],
3380
+ /**
3381
+ * Border Radius Right
3382
+ * @see https://tailwindcss.com/docs/border-radius
3383
+ */
3384
+ "rounded-r": [{
3385
+ "rounded-r": [borderRadius]
3386
+ }],
3387
+ /**
3388
+ * Border Radius Bottom
3389
+ * @see https://tailwindcss.com/docs/border-radius
3390
+ */
3391
+ "rounded-b": [{
3392
+ "rounded-b": [borderRadius]
3393
+ }],
3394
+ /**
3395
+ * Border Radius Left
3396
+ * @see https://tailwindcss.com/docs/border-radius
3397
+ */
3398
+ "rounded-l": [{
3399
+ "rounded-l": [borderRadius]
3400
+ }],
3401
+ /**
3402
+ * Border Radius Start Start
3403
+ * @see https://tailwindcss.com/docs/border-radius
3404
+ */
3405
+ "rounded-ss": [{
3406
+ "rounded-ss": [borderRadius]
3407
+ }],
3408
+ /**
3409
+ * Border Radius Start End
3410
+ * @see https://tailwindcss.com/docs/border-radius
3411
+ */
3412
+ "rounded-se": [{
3413
+ "rounded-se": [borderRadius]
3414
+ }],
3415
+ /**
3416
+ * Border Radius End End
3417
+ * @see https://tailwindcss.com/docs/border-radius
3418
+ */
3419
+ "rounded-ee": [{
3420
+ "rounded-ee": [borderRadius]
3421
+ }],
3422
+ /**
3423
+ * Border Radius End Start
3424
+ * @see https://tailwindcss.com/docs/border-radius
3425
+ */
3426
+ "rounded-es": [{
3427
+ "rounded-es": [borderRadius]
3428
+ }],
3429
+ /**
3430
+ * Border Radius Top Left
3431
+ * @see https://tailwindcss.com/docs/border-radius
3432
+ */
3433
+ "rounded-tl": [{
3434
+ "rounded-tl": [borderRadius]
3435
+ }],
3436
+ /**
3437
+ * Border Radius Top Right
3438
+ * @see https://tailwindcss.com/docs/border-radius
3439
+ */
3440
+ "rounded-tr": [{
3441
+ "rounded-tr": [borderRadius]
3442
+ }],
3443
+ /**
3444
+ * Border Radius Bottom Right
3445
+ * @see https://tailwindcss.com/docs/border-radius
3446
+ */
3447
+ "rounded-br": [{
3448
+ "rounded-br": [borderRadius]
3449
+ }],
3450
+ /**
3451
+ * Border Radius Bottom Left
3452
+ * @see https://tailwindcss.com/docs/border-radius
3453
+ */
3454
+ "rounded-bl": [{
3455
+ "rounded-bl": [borderRadius]
3456
+ }],
3457
+ /**
3458
+ * Border Width
3459
+ * @see https://tailwindcss.com/docs/border-width
3460
+ */
3461
+ "border-w": [{
3462
+ border: [borderWidth]
3463
+ }],
3464
+ /**
3465
+ * Border Width X
3466
+ * @see https://tailwindcss.com/docs/border-width
3467
+ */
3468
+ "border-w-x": [{
3469
+ "border-x": [borderWidth]
3470
+ }],
3471
+ /**
3472
+ * Border Width Y
3473
+ * @see https://tailwindcss.com/docs/border-width
3474
+ */
3475
+ "border-w-y": [{
3476
+ "border-y": [borderWidth]
3477
+ }],
3478
+ /**
3479
+ * Border Width Start
3480
+ * @see https://tailwindcss.com/docs/border-width
3481
+ */
3482
+ "border-w-s": [{
3483
+ "border-s": [borderWidth]
3484
+ }],
3485
+ /**
3486
+ * Border Width End
3487
+ * @see https://tailwindcss.com/docs/border-width
3488
+ */
3489
+ "border-w-e": [{
3490
+ "border-e": [borderWidth]
3491
+ }],
3492
+ /**
3493
+ * Border Width Top
3494
+ * @see https://tailwindcss.com/docs/border-width
3495
+ */
3496
+ "border-w-t": [{
3497
+ "border-t": [borderWidth]
3498
+ }],
3499
+ /**
3500
+ * Border Width Right
3501
+ * @see https://tailwindcss.com/docs/border-width
3502
+ */
3503
+ "border-w-r": [{
3504
+ "border-r": [borderWidth]
3505
+ }],
3506
+ /**
3507
+ * Border Width Bottom
3508
+ * @see https://tailwindcss.com/docs/border-width
3509
+ */
3510
+ "border-w-b": [{
3511
+ "border-b": [borderWidth]
3512
+ }],
3513
+ /**
3514
+ * Border Width Left
3515
+ * @see https://tailwindcss.com/docs/border-width
3516
+ */
3517
+ "border-w-l": [{
3518
+ "border-l": [borderWidth]
3519
+ }],
3520
+ /**
3521
+ * Border Opacity
3522
+ * @see https://tailwindcss.com/docs/border-opacity
3523
+ */
3524
+ "border-opacity": [{
3525
+ "border-opacity": [opacity]
3526
+ }],
3527
+ /**
3528
+ * Border Style
3529
+ * @see https://tailwindcss.com/docs/border-style
3530
+ */
3531
+ "border-style": [{
3532
+ border: [...getLineStyles(), "hidden"]
3533
+ }],
3534
+ /**
3535
+ * Divide Width X
3536
+ * @see https://tailwindcss.com/docs/divide-width
3537
+ */
3538
+ "divide-x": [{
3539
+ "divide-x": [borderWidth]
3540
+ }],
3541
+ /**
3542
+ * Divide Width X Reverse
3543
+ * @see https://tailwindcss.com/docs/divide-width
3544
+ */
3545
+ "divide-x-reverse": ["divide-x-reverse"],
3546
+ /**
3547
+ * Divide Width Y
3548
+ * @see https://tailwindcss.com/docs/divide-width
3549
+ */
3550
+ "divide-y": [{
3551
+ "divide-y": [borderWidth]
3552
+ }],
3553
+ /**
3554
+ * Divide Width Y Reverse
3555
+ * @see https://tailwindcss.com/docs/divide-width
3556
+ */
3557
+ "divide-y-reverse": ["divide-y-reverse"],
3558
+ /**
3559
+ * Divide Opacity
3560
+ * @see https://tailwindcss.com/docs/divide-opacity
3561
+ */
3562
+ "divide-opacity": [{
3563
+ "divide-opacity": [opacity]
3564
+ }],
3565
+ /**
3566
+ * Divide Style
3567
+ * @see https://tailwindcss.com/docs/divide-style
3568
+ */
3569
+ "divide-style": [{
3570
+ divide: getLineStyles()
3571
+ }],
3572
+ /**
3573
+ * Border Color
3574
+ * @see https://tailwindcss.com/docs/border-color
3575
+ */
3576
+ "border-color": [{
3577
+ border: [borderColor]
3578
+ }],
3579
+ /**
3580
+ * Border Color X
3581
+ * @see https://tailwindcss.com/docs/border-color
3582
+ */
3583
+ "border-color-x": [{
3584
+ "border-x": [borderColor]
3585
+ }],
3586
+ /**
3587
+ * Border Color Y
3588
+ * @see https://tailwindcss.com/docs/border-color
3589
+ */
3590
+ "border-color-y": [{
3591
+ "border-y": [borderColor]
3592
+ }],
3593
+ /**
3594
+ * Border Color S
3595
+ * @see https://tailwindcss.com/docs/border-color
3596
+ */
3597
+ "border-color-s": [{
3598
+ "border-s": [borderColor]
3599
+ }],
3600
+ /**
3601
+ * Border Color E
3602
+ * @see https://tailwindcss.com/docs/border-color
3603
+ */
3604
+ "border-color-e": [{
3605
+ "border-e": [borderColor]
3606
+ }],
3607
+ /**
3608
+ * Border Color Top
3609
+ * @see https://tailwindcss.com/docs/border-color
3610
+ */
3611
+ "border-color-t": [{
3612
+ "border-t": [borderColor]
3613
+ }],
3614
+ /**
3615
+ * Border Color Right
3616
+ * @see https://tailwindcss.com/docs/border-color
3617
+ */
3618
+ "border-color-r": [{
3619
+ "border-r": [borderColor]
3620
+ }],
3621
+ /**
3622
+ * Border Color Bottom
3623
+ * @see https://tailwindcss.com/docs/border-color
3624
+ */
3625
+ "border-color-b": [{
3626
+ "border-b": [borderColor]
3627
+ }],
3628
+ /**
3629
+ * Border Color Left
3630
+ * @see https://tailwindcss.com/docs/border-color
3631
+ */
3632
+ "border-color-l": [{
3633
+ "border-l": [borderColor]
3634
+ }],
3635
+ /**
3636
+ * Divide Color
3637
+ * @see https://tailwindcss.com/docs/divide-color
3638
+ */
3639
+ "divide-color": [{
3640
+ divide: [borderColor]
3641
+ }],
3642
+ /**
3643
+ * Outline Style
3644
+ * @see https://tailwindcss.com/docs/outline-style
3645
+ */
3646
+ "outline-style": [{
3647
+ outline: ["", ...getLineStyles()]
3648
+ }],
3649
+ /**
3650
+ * Outline Offset
3651
+ * @see https://tailwindcss.com/docs/outline-offset
3652
+ */
3653
+ "outline-offset": [{
3654
+ "outline-offset": [isLength, isArbitraryValue]
3655
+ }],
3656
+ /**
3657
+ * Outline Width
3658
+ * @see https://tailwindcss.com/docs/outline-width
3659
+ */
3660
+ "outline-w": [{
3661
+ outline: [isLength, isArbitraryLength]
3662
+ }],
3663
+ /**
3664
+ * Outline Color
3665
+ * @see https://tailwindcss.com/docs/outline-color
3666
+ */
3667
+ "outline-color": [{
3668
+ outline: [colors]
3669
+ }],
3670
+ /**
3671
+ * Ring Width
3672
+ * @see https://tailwindcss.com/docs/ring-width
3673
+ */
3674
+ "ring-w": [{
3675
+ ring: getLengthWithEmptyAndArbitrary()
3676
+ }],
3677
+ /**
3678
+ * Ring Width Inset
3679
+ * @see https://tailwindcss.com/docs/ring-width
3680
+ */
3681
+ "ring-w-inset": ["ring-inset"],
3682
+ /**
3683
+ * Ring Color
3684
+ * @see https://tailwindcss.com/docs/ring-color
3685
+ */
3686
+ "ring-color": [{
3687
+ ring: [colors]
3688
+ }],
3689
+ /**
3690
+ * Ring Opacity
3691
+ * @see https://tailwindcss.com/docs/ring-opacity
3692
+ */
3693
+ "ring-opacity": [{
3694
+ "ring-opacity": [opacity]
3695
+ }],
3696
+ /**
3697
+ * Ring Offset Width
3698
+ * @see https://tailwindcss.com/docs/ring-offset-width
3699
+ */
3700
+ "ring-offset-w": [{
3701
+ "ring-offset": [isLength, isArbitraryLength]
3702
+ }],
3703
+ /**
3704
+ * Ring Offset Color
3705
+ * @see https://tailwindcss.com/docs/ring-offset-color
3706
+ */
3707
+ "ring-offset-color": [{
3708
+ "ring-offset": [colors]
3709
+ }],
3710
+ // Effects
3711
+ /**
3712
+ * Box Shadow
3713
+ * @see https://tailwindcss.com/docs/box-shadow
3714
+ */
3715
+ shadow: [{
3716
+ shadow: ["", "inner", "none", isTshirtSize, isArbitraryShadow]
3717
+ }],
3718
+ /**
3719
+ * Box Shadow Color
3720
+ * @see https://tailwindcss.com/docs/box-shadow-color
3721
+ */
3722
+ "shadow-color": [{
3723
+ shadow: [isAny]
3724
+ }],
3725
+ /**
3726
+ * Opacity
3727
+ * @see https://tailwindcss.com/docs/opacity
3728
+ */
3729
+ opacity: [{
3730
+ opacity: [opacity]
3731
+ }],
3732
+ /**
3733
+ * Mix Blend Mode
3734
+ * @see https://tailwindcss.com/docs/mix-blend-mode
3735
+ */
3736
+ "mix-blend": [{
3737
+ "mix-blend": [...getBlendModes(), "plus-lighter", "plus-darker"]
3738
+ }],
3739
+ /**
3740
+ * Background Blend Mode
3741
+ * @see https://tailwindcss.com/docs/background-blend-mode
3742
+ */
3743
+ "bg-blend": [{
3744
+ "bg-blend": getBlendModes()
3745
+ }],
3746
+ // Filters
3747
+ /**
3748
+ * Filter
3749
+ * @deprecated since Tailwind CSS v3.0.0
3750
+ * @see https://tailwindcss.com/docs/filter
3751
+ */
3752
+ filter: [{
3753
+ filter: ["", "none"]
3754
+ }],
3755
+ /**
3756
+ * Blur
3757
+ * @see https://tailwindcss.com/docs/blur
3758
+ */
3759
+ blur: [{
3760
+ blur: [blur]
3761
+ }],
3762
+ /**
3763
+ * Brightness
3764
+ * @see https://tailwindcss.com/docs/brightness
3765
+ */
3766
+ brightness: [{
3767
+ brightness: [brightness]
3768
+ }],
3769
+ /**
3770
+ * Contrast
3771
+ * @see https://tailwindcss.com/docs/contrast
3772
+ */
3773
+ contrast: [{
3774
+ contrast: [contrast]
3775
+ }],
3776
+ /**
3777
+ * Drop Shadow
3778
+ * @see https://tailwindcss.com/docs/drop-shadow
3779
+ */
3780
+ "drop-shadow": [{
3781
+ "drop-shadow": ["", "none", isTshirtSize, isArbitraryValue]
3782
+ }],
3783
+ /**
3784
+ * Grayscale
3785
+ * @see https://tailwindcss.com/docs/grayscale
3786
+ */
3787
+ grayscale: [{
3788
+ grayscale: [grayscale]
3789
+ }],
3790
+ /**
3791
+ * Hue Rotate
3792
+ * @see https://tailwindcss.com/docs/hue-rotate
3793
+ */
3794
+ "hue-rotate": [{
3795
+ "hue-rotate": [hueRotate]
3796
+ }],
3797
+ /**
3798
+ * Invert
3799
+ * @see https://tailwindcss.com/docs/invert
3800
+ */
3801
+ invert: [{
3802
+ invert: [invert]
3803
+ }],
3804
+ /**
3805
+ * Saturate
3806
+ * @see https://tailwindcss.com/docs/saturate
3807
+ */
3808
+ saturate: [{
3809
+ saturate: [saturate]
3810
+ }],
3811
+ /**
3812
+ * Sepia
3813
+ * @see https://tailwindcss.com/docs/sepia
3814
+ */
3815
+ sepia: [{
3816
+ sepia: [sepia]
3817
+ }],
3818
+ /**
3819
+ * Backdrop Filter
3820
+ * @deprecated since Tailwind CSS v3.0.0
3821
+ * @see https://tailwindcss.com/docs/backdrop-filter
3822
+ */
3823
+ "backdrop-filter": [{
3824
+ "backdrop-filter": ["", "none"]
3825
+ }],
3826
+ /**
3827
+ * Backdrop Blur
3828
+ * @see https://tailwindcss.com/docs/backdrop-blur
3829
+ */
3830
+ "backdrop-blur": [{
3831
+ "backdrop-blur": [blur]
3832
+ }],
3833
+ /**
3834
+ * Backdrop Brightness
3835
+ * @see https://tailwindcss.com/docs/backdrop-brightness
3836
+ */
3837
+ "backdrop-brightness": [{
3838
+ "backdrop-brightness": [brightness]
3839
+ }],
3840
+ /**
3841
+ * Backdrop Contrast
3842
+ * @see https://tailwindcss.com/docs/backdrop-contrast
3843
+ */
3844
+ "backdrop-contrast": [{
3845
+ "backdrop-contrast": [contrast]
3846
+ }],
3847
+ /**
3848
+ * Backdrop Grayscale
3849
+ * @see https://tailwindcss.com/docs/backdrop-grayscale
3850
+ */
3851
+ "backdrop-grayscale": [{
3852
+ "backdrop-grayscale": [grayscale]
3853
+ }],
3854
+ /**
3855
+ * Backdrop Hue Rotate
3856
+ * @see https://tailwindcss.com/docs/backdrop-hue-rotate
3857
+ */
3858
+ "backdrop-hue-rotate": [{
3859
+ "backdrop-hue-rotate": [hueRotate]
3860
+ }],
3861
+ /**
3862
+ * Backdrop Invert
3863
+ * @see https://tailwindcss.com/docs/backdrop-invert
3864
+ */
3865
+ "backdrop-invert": [{
3866
+ "backdrop-invert": [invert]
3867
+ }],
3868
+ /**
3869
+ * Backdrop Opacity
3870
+ * @see https://tailwindcss.com/docs/backdrop-opacity
3871
+ */
3872
+ "backdrop-opacity": [{
3873
+ "backdrop-opacity": [opacity]
3874
+ }],
3875
+ /**
3876
+ * Backdrop Saturate
3877
+ * @see https://tailwindcss.com/docs/backdrop-saturate
3878
+ */
3879
+ "backdrop-saturate": [{
3880
+ "backdrop-saturate": [saturate]
3881
+ }],
3882
+ /**
3883
+ * Backdrop Sepia
3884
+ * @see https://tailwindcss.com/docs/backdrop-sepia
3885
+ */
3886
+ "backdrop-sepia": [{
3887
+ "backdrop-sepia": [sepia]
3888
+ }],
3889
+ // Tables
3890
+ /**
3891
+ * Border Collapse
3892
+ * @see https://tailwindcss.com/docs/border-collapse
3893
+ */
3894
+ "border-collapse": [{
3895
+ border: ["collapse", "separate"]
3896
+ }],
3897
+ /**
3898
+ * Border Spacing
3899
+ * @see https://tailwindcss.com/docs/border-spacing
3900
+ */
3901
+ "border-spacing": [{
3902
+ "border-spacing": [borderSpacing]
3903
+ }],
3904
+ /**
3905
+ * Border Spacing X
3906
+ * @see https://tailwindcss.com/docs/border-spacing
3907
+ */
3908
+ "border-spacing-x": [{
3909
+ "border-spacing-x": [borderSpacing]
3910
+ }],
3911
+ /**
3912
+ * Border Spacing Y
3913
+ * @see https://tailwindcss.com/docs/border-spacing
3914
+ */
3915
+ "border-spacing-y": [{
3916
+ "border-spacing-y": [borderSpacing]
3917
+ }],
3918
+ /**
3919
+ * Table Layout
3920
+ * @see https://tailwindcss.com/docs/table-layout
3921
+ */
3922
+ "table-layout": [{
3923
+ table: ["auto", "fixed"]
3924
+ }],
3925
+ /**
3926
+ * Caption Side
3927
+ * @see https://tailwindcss.com/docs/caption-side
3928
+ */
3929
+ caption: [{
3930
+ caption: ["top", "bottom"]
3931
+ }],
3932
+ // Transitions and Animation
3933
+ /**
3934
+ * Tranisition Property
3935
+ * @see https://tailwindcss.com/docs/transition-property
3936
+ */
3937
+ transition: [{
3938
+ transition: ["none", "all", "", "colors", "opacity", "shadow", "transform", isArbitraryValue]
3939
+ }],
3940
+ /**
3941
+ * Transition Duration
3942
+ * @see https://tailwindcss.com/docs/transition-duration
3943
+ */
3944
+ duration: [{
3945
+ duration: getNumberAndArbitrary()
3946
+ }],
3947
+ /**
3948
+ * Transition Timing Function
3949
+ * @see https://tailwindcss.com/docs/transition-timing-function
3950
+ */
3951
+ ease: [{
3952
+ ease: ["linear", "in", "out", "in-out", isArbitraryValue]
3953
+ }],
3954
+ /**
3955
+ * Transition Delay
3956
+ * @see https://tailwindcss.com/docs/transition-delay
3957
+ */
3958
+ delay: [{
3959
+ delay: getNumberAndArbitrary()
3960
+ }],
3961
+ /**
3962
+ * Animation
3963
+ * @see https://tailwindcss.com/docs/animation
3964
+ */
3965
+ animate: [{
3966
+ animate: ["none", "spin", "ping", "pulse", "bounce", isArbitraryValue]
3967
+ }],
3968
+ // Transforms
3969
+ /**
3970
+ * Transform
3971
+ * @see https://tailwindcss.com/docs/transform
3972
+ */
3973
+ transform: [{
3974
+ transform: ["", "gpu", "none"]
3975
+ }],
3976
+ /**
3977
+ * Scale
3978
+ * @see https://tailwindcss.com/docs/scale
3979
+ */
3980
+ scale: [{
3981
+ scale: [scale]
3982
+ }],
3983
+ /**
3984
+ * Scale X
3985
+ * @see https://tailwindcss.com/docs/scale
3986
+ */
3987
+ "scale-x": [{
3988
+ "scale-x": [scale]
3989
+ }],
3990
+ /**
3991
+ * Scale Y
3992
+ * @see https://tailwindcss.com/docs/scale
3993
+ */
3994
+ "scale-y": [{
3995
+ "scale-y": [scale]
3996
+ }],
3997
+ /**
3998
+ * Rotate
3999
+ * @see https://tailwindcss.com/docs/rotate
4000
+ */
4001
+ rotate: [{
4002
+ rotate: [isInteger, isArbitraryValue]
4003
+ }],
4004
+ /**
4005
+ * Translate X
4006
+ * @see https://tailwindcss.com/docs/translate
4007
+ */
4008
+ "translate-x": [{
4009
+ "translate-x": [translate]
4010
+ }],
4011
+ /**
4012
+ * Translate Y
4013
+ * @see https://tailwindcss.com/docs/translate
4014
+ */
4015
+ "translate-y": [{
4016
+ "translate-y": [translate]
4017
+ }],
4018
+ /**
4019
+ * Skew X
4020
+ * @see https://tailwindcss.com/docs/skew
4021
+ */
4022
+ "skew-x": [{
4023
+ "skew-x": [skew]
4024
+ }],
4025
+ /**
4026
+ * Skew Y
4027
+ * @see https://tailwindcss.com/docs/skew
4028
+ */
4029
+ "skew-y": [{
4030
+ "skew-y": [skew]
4031
+ }],
4032
+ /**
4033
+ * Transform Origin
4034
+ * @see https://tailwindcss.com/docs/transform-origin
4035
+ */
4036
+ "transform-origin": [{
4037
+ origin: ["center", "top", "top-right", "right", "bottom-right", "bottom", "bottom-left", "left", "top-left", isArbitraryValue]
4038
+ }],
4039
+ // Interactivity
4040
+ /**
4041
+ * Accent Color
4042
+ * @see https://tailwindcss.com/docs/accent-color
4043
+ */
4044
+ accent: [{
4045
+ accent: ["auto", colors]
4046
+ }],
4047
+ /**
4048
+ * Appearance
4049
+ * @see https://tailwindcss.com/docs/appearance
4050
+ */
4051
+ appearance: [{
4052
+ appearance: ["none", "auto"]
4053
+ }],
4054
+ /**
4055
+ * Cursor
4056
+ * @see https://tailwindcss.com/docs/cursor
4057
+ */
4058
+ cursor: [{
4059
+ cursor: ["auto", "default", "pointer", "wait", "text", "move", "help", "not-allowed", "none", "context-menu", "progress", "cell", "crosshair", "vertical-text", "alias", "copy", "no-drop", "grab", "grabbing", "all-scroll", "col-resize", "row-resize", "n-resize", "e-resize", "s-resize", "w-resize", "ne-resize", "nw-resize", "se-resize", "sw-resize", "ew-resize", "ns-resize", "nesw-resize", "nwse-resize", "zoom-in", "zoom-out", isArbitraryValue]
4060
+ }],
4061
+ /**
4062
+ * Caret Color
4063
+ * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities
4064
+ */
4065
+ "caret-color": [{
4066
+ caret: [colors]
4067
+ }],
4068
+ /**
4069
+ * Pointer Events
4070
+ * @see https://tailwindcss.com/docs/pointer-events
4071
+ */
4072
+ "pointer-events": [{
4073
+ "pointer-events": ["none", "auto"]
4074
+ }],
4075
+ /**
4076
+ * Resize
4077
+ * @see https://tailwindcss.com/docs/resize
4078
+ */
4079
+ resize: [{
4080
+ resize: ["none", "y", "x", ""]
4081
+ }],
4082
+ /**
4083
+ * Scroll Behavior
4084
+ * @see https://tailwindcss.com/docs/scroll-behavior
4085
+ */
4086
+ "scroll-behavior": [{
4087
+ scroll: ["auto", "smooth"]
4088
+ }],
4089
+ /**
4090
+ * Scroll Margin
4091
+ * @see https://tailwindcss.com/docs/scroll-margin
4092
+ */
4093
+ "scroll-m": [{
4094
+ "scroll-m": getSpacingWithArbitrary()
4095
+ }],
4096
+ /**
4097
+ * Scroll Margin X
4098
+ * @see https://tailwindcss.com/docs/scroll-margin
4099
+ */
4100
+ "scroll-mx": [{
4101
+ "scroll-mx": getSpacingWithArbitrary()
4102
+ }],
4103
+ /**
4104
+ * Scroll Margin Y
4105
+ * @see https://tailwindcss.com/docs/scroll-margin
4106
+ */
4107
+ "scroll-my": [{
4108
+ "scroll-my": getSpacingWithArbitrary()
4109
+ }],
4110
+ /**
4111
+ * Scroll Margin Start
4112
+ * @see https://tailwindcss.com/docs/scroll-margin
4113
+ */
4114
+ "scroll-ms": [{
4115
+ "scroll-ms": getSpacingWithArbitrary()
4116
+ }],
4117
+ /**
4118
+ * Scroll Margin End
4119
+ * @see https://tailwindcss.com/docs/scroll-margin
4120
+ */
4121
+ "scroll-me": [{
4122
+ "scroll-me": getSpacingWithArbitrary()
4123
+ }],
4124
+ /**
4125
+ * Scroll Margin Top
4126
+ * @see https://tailwindcss.com/docs/scroll-margin
4127
+ */
4128
+ "scroll-mt": [{
4129
+ "scroll-mt": getSpacingWithArbitrary()
4130
+ }],
4131
+ /**
4132
+ * Scroll Margin Right
4133
+ * @see https://tailwindcss.com/docs/scroll-margin
4134
+ */
4135
+ "scroll-mr": [{
4136
+ "scroll-mr": getSpacingWithArbitrary()
4137
+ }],
4138
+ /**
4139
+ * Scroll Margin Bottom
4140
+ * @see https://tailwindcss.com/docs/scroll-margin
4141
+ */
4142
+ "scroll-mb": [{
4143
+ "scroll-mb": getSpacingWithArbitrary()
4144
+ }],
4145
+ /**
4146
+ * Scroll Margin Left
4147
+ * @see https://tailwindcss.com/docs/scroll-margin
4148
+ */
4149
+ "scroll-ml": [{
4150
+ "scroll-ml": getSpacingWithArbitrary()
4151
+ }],
4152
+ /**
4153
+ * Scroll Padding
4154
+ * @see https://tailwindcss.com/docs/scroll-padding
4155
+ */
4156
+ "scroll-p": [{
4157
+ "scroll-p": getSpacingWithArbitrary()
4158
+ }],
4159
+ /**
4160
+ * Scroll Padding X
4161
+ * @see https://tailwindcss.com/docs/scroll-padding
4162
+ */
4163
+ "scroll-px": [{
4164
+ "scroll-px": getSpacingWithArbitrary()
4165
+ }],
4166
+ /**
4167
+ * Scroll Padding Y
4168
+ * @see https://tailwindcss.com/docs/scroll-padding
4169
+ */
4170
+ "scroll-py": [{
4171
+ "scroll-py": getSpacingWithArbitrary()
4172
+ }],
4173
+ /**
4174
+ * Scroll Padding Start
4175
+ * @see https://tailwindcss.com/docs/scroll-padding
4176
+ */
4177
+ "scroll-ps": [{
4178
+ "scroll-ps": getSpacingWithArbitrary()
4179
+ }],
4180
+ /**
4181
+ * Scroll Padding End
4182
+ * @see https://tailwindcss.com/docs/scroll-padding
4183
+ */
4184
+ "scroll-pe": [{
4185
+ "scroll-pe": getSpacingWithArbitrary()
4186
+ }],
4187
+ /**
4188
+ * Scroll Padding Top
4189
+ * @see https://tailwindcss.com/docs/scroll-padding
4190
+ */
4191
+ "scroll-pt": [{
4192
+ "scroll-pt": getSpacingWithArbitrary()
4193
+ }],
4194
+ /**
4195
+ * Scroll Padding Right
4196
+ * @see https://tailwindcss.com/docs/scroll-padding
4197
+ */
4198
+ "scroll-pr": [{
4199
+ "scroll-pr": getSpacingWithArbitrary()
4200
+ }],
4201
+ /**
4202
+ * Scroll Padding Bottom
4203
+ * @see https://tailwindcss.com/docs/scroll-padding
4204
+ */
4205
+ "scroll-pb": [{
4206
+ "scroll-pb": getSpacingWithArbitrary()
4207
+ }],
4208
+ /**
4209
+ * Scroll Padding Left
4210
+ * @see https://tailwindcss.com/docs/scroll-padding
4211
+ */
4212
+ "scroll-pl": [{
4213
+ "scroll-pl": getSpacingWithArbitrary()
4214
+ }],
4215
+ /**
4216
+ * Scroll Snap Align
4217
+ * @see https://tailwindcss.com/docs/scroll-snap-align
4218
+ */
4219
+ "snap-align": [{
4220
+ snap: ["start", "end", "center", "align-none"]
4221
+ }],
4222
+ /**
4223
+ * Scroll Snap Stop
4224
+ * @see https://tailwindcss.com/docs/scroll-snap-stop
4225
+ */
4226
+ "snap-stop": [{
4227
+ snap: ["normal", "always"]
4228
+ }],
4229
+ /**
4230
+ * Scroll Snap Type
4231
+ * @see https://tailwindcss.com/docs/scroll-snap-type
4232
+ */
4233
+ "snap-type": [{
4234
+ snap: ["none", "x", "y", "both"]
4235
+ }],
4236
+ /**
4237
+ * Scroll Snap Type Strictness
4238
+ * @see https://tailwindcss.com/docs/scroll-snap-type
4239
+ */
4240
+ "snap-strictness": [{
4241
+ snap: ["mandatory", "proximity"]
4242
+ }],
4243
+ /**
4244
+ * Touch Action
4245
+ * @see https://tailwindcss.com/docs/touch-action
4246
+ */
4247
+ touch: [{
4248
+ touch: ["auto", "none", "manipulation"]
4249
+ }],
4250
+ /**
4251
+ * Touch Action X
4252
+ * @see https://tailwindcss.com/docs/touch-action
4253
+ */
4254
+ "touch-x": [{
4255
+ "touch-pan": ["x", "left", "right"]
4256
+ }],
4257
+ /**
4258
+ * Touch Action Y
4259
+ * @see https://tailwindcss.com/docs/touch-action
4260
+ */
4261
+ "touch-y": [{
4262
+ "touch-pan": ["y", "up", "down"]
4263
+ }],
4264
+ /**
4265
+ * Touch Action Pinch Zoom
4266
+ * @see https://tailwindcss.com/docs/touch-action
4267
+ */
4268
+ "touch-pz": ["touch-pinch-zoom"],
4269
+ /**
4270
+ * User Select
4271
+ * @see https://tailwindcss.com/docs/user-select
4272
+ */
4273
+ select: [{
4274
+ select: ["none", "text", "all", "auto"]
4275
+ }],
4276
+ /**
4277
+ * Will Change
4278
+ * @see https://tailwindcss.com/docs/will-change
4279
+ */
4280
+ "will-change": [{
4281
+ "will-change": ["auto", "scroll", "contents", "transform", isArbitraryValue]
4282
+ }],
4283
+ // SVG
4284
+ /**
4285
+ * Fill
4286
+ * @see https://tailwindcss.com/docs/fill
4287
+ */
4288
+ fill: [{
4289
+ fill: [colors, "none"]
4290
+ }],
4291
+ /**
4292
+ * Stroke Width
4293
+ * @see https://tailwindcss.com/docs/stroke-width
4294
+ */
4295
+ "stroke-w": [{
4296
+ stroke: [isLength, isArbitraryLength, isArbitraryNumber]
4297
+ }],
4298
+ /**
4299
+ * Stroke
4300
+ * @see https://tailwindcss.com/docs/stroke
4301
+ */
4302
+ stroke: [{
4303
+ stroke: [colors, "none"]
4304
+ }],
4305
+ // Accessibility
4306
+ /**
4307
+ * Screen Readers
4308
+ * @see https://tailwindcss.com/docs/screen-readers
4309
+ */
4310
+ sr: ["sr-only", "not-sr-only"],
4311
+ /**
4312
+ * Forced Color Adjust
4313
+ * @see https://tailwindcss.com/docs/forced-color-adjust
4314
+ */
4315
+ "forced-color-adjust": [{
4316
+ "forced-color-adjust": ["auto", "none"]
4317
+ }]
4318
+ },
4319
+ conflictingClassGroups: {
4320
+ overflow: ["overflow-x", "overflow-y"],
4321
+ overscroll: ["overscroll-x", "overscroll-y"],
4322
+ inset: ["inset-x", "inset-y", "start", "end", "top", "right", "bottom", "left"],
4323
+ "inset-x": ["right", "left"],
4324
+ "inset-y": ["top", "bottom"],
4325
+ flex: ["basis", "grow", "shrink"],
4326
+ gap: ["gap-x", "gap-y"],
4327
+ p: ["px", "py", "ps", "pe", "pt", "pr", "pb", "pl"],
4328
+ px: ["pr", "pl"],
4329
+ py: ["pt", "pb"],
4330
+ m: ["mx", "my", "ms", "me", "mt", "mr", "mb", "ml"],
4331
+ mx: ["mr", "ml"],
4332
+ my: ["mt", "mb"],
4333
+ size: ["w", "h"],
4334
+ "font-size": ["leading"],
4335
+ "fvn-normal": ["fvn-ordinal", "fvn-slashed-zero", "fvn-figure", "fvn-spacing", "fvn-fraction"],
4336
+ "fvn-ordinal": ["fvn-normal"],
4337
+ "fvn-slashed-zero": ["fvn-normal"],
4338
+ "fvn-figure": ["fvn-normal"],
4339
+ "fvn-spacing": ["fvn-normal"],
4340
+ "fvn-fraction": ["fvn-normal"],
4341
+ "line-clamp": ["display", "overflow"],
4342
+ rounded: ["rounded-s", "rounded-e", "rounded-t", "rounded-r", "rounded-b", "rounded-l", "rounded-ss", "rounded-se", "rounded-ee", "rounded-es", "rounded-tl", "rounded-tr", "rounded-br", "rounded-bl"],
4343
+ "rounded-s": ["rounded-ss", "rounded-es"],
4344
+ "rounded-e": ["rounded-se", "rounded-ee"],
4345
+ "rounded-t": ["rounded-tl", "rounded-tr"],
4346
+ "rounded-r": ["rounded-tr", "rounded-br"],
4347
+ "rounded-b": ["rounded-br", "rounded-bl"],
4348
+ "rounded-l": ["rounded-tl", "rounded-bl"],
4349
+ "border-spacing": ["border-spacing-x", "border-spacing-y"],
4350
+ "border-w": ["border-w-s", "border-w-e", "border-w-t", "border-w-r", "border-w-b", "border-w-l"],
4351
+ "border-w-x": ["border-w-r", "border-w-l"],
4352
+ "border-w-y": ["border-w-t", "border-w-b"],
4353
+ "border-color": ["border-color-s", "border-color-e", "border-color-t", "border-color-r", "border-color-b", "border-color-l"],
4354
+ "border-color-x": ["border-color-r", "border-color-l"],
4355
+ "border-color-y": ["border-color-t", "border-color-b"],
4356
+ "scroll-m": ["scroll-mx", "scroll-my", "scroll-ms", "scroll-me", "scroll-mt", "scroll-mr", "scroll-mb", "scroll-ml"],
4357
+ "scroll-mx": ["scroll-mr", "scroll-ml"],
4358
+ "scroll-my": ["scroll-mt", "scroll-mb"],
4359
+ "scroll-p": ["scroll-px", "scroll-py", "scroll-ps", "scroll-pe", "scroll-pt", "scroll-pr", "scroll-pb", "scroll-pl"],
4360
+ "scroll-px": ["scroll-pr", "scroll-pl"],
4361
+ "scroll-py": ["scroll-pt", "scroll-pb"],
4362
+ touch: ["touch-x", "touch-y", "touch-pz"],
4363
+ "touch-x": ["touch"],
4364
+ "touch-y": ["touch"],
4365
+ "touch-pz": ["touch"]
4366
+ },
4367
+ conflictingClassGroupModifiers: {
4368
+ "font-size": ["leading"]
4369
+ }
4370
+ };
4371
+ };
4372
+ var twMerge = /* @__PURE__ */ createTailwindMerge(getDefaultConfig);
4373
+
4374
+ // lib/cn.ts
4375
+ function cn(...inputs) {
4376
+ return twMerge(clsx(inputs));
4377
+ }
4378
+ var EventBusContext = React6.createContext(null);
4379
+
4380
+ // hooks/useEventBus.ts
4381
+ function getGlobalEventBus() {
4382
+ if (typeof window !== "undefined") {
4383
+ return window.__kflowEventBus ?? null;
4384
+ }
4385
+ return null;
4386
+ }
4387
+ var fallbackListeners = /* @__PURE__ */ new Map();
4388
+ var fallbackAnyListeners = /* @__PURE__ */ new Set();
4389
+ var fallbackEventBus = {
4390
+ emit: (type, payload) => {
4391
+ const event = {
4392
+ type,
4393
+ payload,
4394
+ timestamp: Date.now()
4395
+ };
4396
+ const handlers = fallbackListeners.get(type);
4397
+ if (handlers) {
4398
+ handlers.forEach((handler) => {
4399
+ try {
4400
+ handler(event);
4401
+ } catch (error) {
4402
+ console.error(`[EventBus] Error in listener for '${type}':`, error);
4403
+ }
4404
+ });
4405
+ }
4406
+ fallbackAnyListeners.forEach((handler) => {
4407
+ try {
4408
+ handler(event);
4409
+ } catch (error) {
4410
+ console.error(`[EventBus] Error in onAny listener for '${type}':`, error);
4411
+ }
4412
+ });
4413
+ },
4414
+ on: (type, listener) => {
4415
+ if (!fallbackListeners.has(type)) {
4416
+ fallbackListeners.set(type, /* @__PURE__ */ new Set());
4417
+ }
4418
+ fallbackListeners.get(type).add(listener);
4419
+ return () => {
4420
+ const handlers = fallbackListeners.get(type);
4421
+ if (handlers) {
4422
+ handlers.delete(listener);
4423
+ if (handlers.size === 0) {
4424
+ fallbackListeners.delete(type);
4425
+ }
4426
+ }
4427
+ };
4428
+ },
4429
+ once: (type, listener) => {
4430
+ const wrappedListener = (event) => {
4431
+ fallbackListeners.get(type)?.delete(wrappedListener);
4432
+ listener(event);
4433
+ };
4434
+ return fallbackEventBus.on(type, wrappedListener);
4435
+ },
4436
+ hasListeners: (type) => {
4437
+ const handlers = fallbackListeners.get(type);
4438
+ return handlers !== void 0 && handlers.size > 0;
4439
+ },
4440
+ onAny: (listener) => {
4441
+ fallbackAnyListeners.add(listener);
4442
+ return () => {
4443
+ fallbackAnyListeners.delete(listener);
4444
+ };
4445
+ }
4446
+ };
4447
+ function useEventBus() {
4448
+ const context = React6.useContext(EventBusContext);
4449
+ return context ?? getGlobalEventBus() ?? fallbackEventBus;
4450
+ }
4451
+ var paddingStyles = {
4452
+ none: "p-0",
4453
+ xs: "p-1",
4454
+ sm: "p-2",
4455
+ md: "p-4",
4456
+ lg: "p-6",
4457
+ xl: "p-8",
4458
+ "2xl": "p-12"
4459
+ };
4460
+ var paddingXStyles = {
4461
+ none: "px-0",
4462
+ xs: "px-1",
4463
+ sm: "px-2",
4464
+ md: "px-4",
4465
+ lg: "px-6",
4466
+ xl: "px-8",
4467
+ "2xl": "px-12"
4468
+ };
4469
+ var paddingYStyles = {
4470
+ none: "py-0",
4471
+ xs: "py-1",
4472
+ sm: "py-2",
4473
+ md: "py-4",
4474
+ lg: "py-6",
4475
+ xl: "py-8",
4476
+ "2xl": "py-12"
4477
+ };
4478
+ var marginStyles = {
4479
+ none: "m-0",
4480
+ xs: "m-1",
4481
+ sm: "m-2",
4482
+ md: "m-4",
4483
+ lg: "m-6",
4484
+ xl: "m-8",
4485
+ "2xl": "m-12",
4486
+ auto: "m-auto"
4487
+ };
4488
+ var marginXStyles = {
4489
+ none: "mx-0",
4490
+ xs: "mx-1",
4491
+ sm: "mx-2",
4492
+ md: "mx-4",
4493
+ lg: "mx-6",
4494
+ xl: "mx-8",
4495
+ "2xl": "mx-12",
4496
+ auto: "mx-auto"
4497
+ };
4498
+ var marginYStyles = {
4499
+ none: "my-0",
4500
+ xs: "my-1",
4501
+ sm: "my-2",
4502
+ md: "my-4",
4503
+ lg: "my-6",
4504
+ xl: "my-8",
4505
+ "2xl": "my-12",
4506
+ auto: "my-auto"
4507
+ };
4508
+ var bgStyles = {
4509
+ transparent: "bg-transparent",
4510
+ primary: "bg-[var(--color-primary)] text-[var(--color-primary-foreground)]",
4511
+ secondary: "bg-[var(--color-secondary)] text-[var(--color-secondary-foreground)]",
4512
+ muted: "bg-[var(--color-muted)] text-[var(--color-foreground)]",
4513
+ accent: "bg-[var(--color-accent)] text-[var(--color-accent-foreground)]",
4514
+ surface: "bg-[var(--color-card)]",
4515
+ overlay: "bg-[var(--color-card)]/80 backdrop-blur-sm"
4516
+ };
4517
+ var roundedStyles = {
4518
+ none: "rounded-none",
4519
+ sm: "rounded-[var(--radius-sm)]",
4520
+ md: "rounded-[var(--radius-md)]",
4521
+ lg: "rounded-[var(--radius-lg)]",
4522
+ xl: "rounded-[var(--radius-xl)]",
4523
+ "2xl": "rounded-[var(--radius-xl)]",
4524
+ full: "rounded-[var(--radius-full)]"
4525
+ };
4526
+ var shadowStyles = {
4527
+ none: "shadow-none",
4528
+ sm: "shadow-[var(--shadow-sm)]",
4529
+ md: "shadow-[var(--shadow-main)]",
4530
+ lg: "shadow-[var(--shadow-lg)]",
4531
+ xl: "shadow-[var(--shadow-lg)]"
4532
+ };
4533
+ var displayStyles = {
4534
+ block: "block",
4535
+ inline: "inline",
4536
+ "inline-block": "inline-block",
4537
+ flex: "flex",
4538
+ "inline-flex": "inline-flex",
4539
+ grid: "grid"
4540
+ };
4541
+ var overflowStyles = {
4542
+ auto: "overflow-auto",
4543
+ hidden: "overflow-hidden",
4544
+ visible: "overflow-visible",
4545
+ scroll: "overflow-scroll"
4546
+ };
4547
+ var positionStyles = {
4548
+ relative: "relative",
4549
+ absolute: "absolute",
4550
+ fixed: "fixed",
4551
+ sticky: "sticky"
4552
+ };
4553
+ var Box = React6__default.default.forwardRef(
4554
+ ({
4555
+ padding,
4556
+ paddingX,
4557
+ paddingY,
4558
+ margin,
4559
+ marginX,
4560
+ marginY,
4561
+ bg = "transparent",
4562
+ border = false,
4563
+ rounded = "none",
4564
+ shadow = "none",
4565
+ display,
4566
+ fullWidth = false,
4567
+ fullHeight = false,
4568
+ overflow,
4569
+ position,
4570
+ className,
4571
+ children,
4572
+ as: Component = "div",
4573
+ action,
4574
+ actionPayload,
4575
+ hoverEvent,
4576
+ onClick,
4577
+ onMouseEnter,
4578
+ onMouseLeave,
4579
+ ...rest
4580
+ }, ref) => {
4581
+ const eventBus = useEventBus();
4582
+ const handleClick = React6.useCallback((e) => {
4583
+ if (action) {
4584
+ e.stopPropagation();
4585
+ eventBus.emit(`UI:${action}`, actionPayload ?? {});
4586
+ }
4587
+ onClick?.(e);
4588
+ }, [action, actionPayload, eventBus, onClick]);
4589
+ const handleMouseEnter = React6.useCallback((e) => {
4590
+ if (hoverEvent) {
4591
+ eventBus.emit(`UI:${hoverEvent}`, { hovered: true });
4592
+ }
4593
+ onMouseEnter?.(e);
4594
+ }, [hoverEvent, eventBus, onMouseEnter]);
4595
+ const handleMouseLeave = React6.useCallback((e) => {
4596
+ if (hoverEvent) {
4597
+ eventBus.emit(`UI:${hoverEvent}`, { hovered: false });
4598
+ }
4599
+ onMouseLeave?.(e);
4600
+ }, [hoverEvent, eventBus, onMouseLeave]);
4601
+ const isClickable = action || onClick;
4602
+ const Comp = Component;
4603
+ return /* @__PURE__ */ jsxRuntime.jsx(
4604
+ Comp,
4605
+ {
4606
+ ref,
4607
+ className: cn(
4608
+ // Padding
4609
+ padding && paddingStyles[padding],
4610
+ paddingX && paddingXStyles[paddingX],
4611
+ paddingY && paddingYStyles[paddingY],
4612
+ // Margin
4613
+ margin && marginStyles[margin],
4614
+ marginX && marginXStyles[marginX],
4615
+ marginY && marginYStyles[marginY],
4616
+ // Background
4617
+ bgStyles[bg],
4618
+ // Border - uses theme variables
4619
+ border && "border-[length:var(--border-width)] border-[var(--color-border)]",
4620
+ // Rounded
4621
+ roundedStyles[rounded],
4622
+ // Shadow
4623
+ shadowStyles[shadow],
4624
+ // Display
4625
+ display && displayStyles[display],
4626
+ // Dimensions
4627
+ fullWidth && "w-full",
4628
+ fullHeight && "h-full",
4629
+ // Overflow
4630
+ overflow && overflowStyles[overflow],
4631
+ // Position
4632
+ position && positionStyles[position],
4633
+ // Cursor for clickable
4634
+ isClickable && "cursor-pointer",
4635
+ className
4636
+ ),
4637
+ onClick: isClickable ? handleClick : void 0,
4638
+ onMouseEnter: hoverEvent || onMouseEnter ? handleMouseEnter : void 0,
4639
+ onMouseLeave: hoverEvent || onMouseLeave ? handleMouseLeave : void 0,
4640
+ ...rest,
4641
+ children
4642
+ }
4643
+ );
4644
+ }
4645
+ );
4646
+ Box.displayName = "Box";
4647
+ var variantStyles = {
4648
+ h1: "text-4xl font-bold tracking-tight text-[var(--color-foreground)]",
4649
+ h2: "text-3xl font-bold tracking-tight text-[var(--color-foreground)]",
4650
+ h3: "text-2xl font-bold text-[var(--color-foreground)]",
4651
+ h4: "text-xl font-bold text-[var(--color-foreground)]",
4652
+ h5: "text-lg font-bold text-[var(--color-foreground)]",
4653
+ h6: "text-base font-bold text-[var(--color-foreground)]",
4654
+ heading: "text-2xl font-bold text-[var(--color-foreground)]",
4655
+ subheading: "text-lg font-semibold text-[var(--color-foreground)]",
4656
+ body1: "text-base font-normal text-[var(--color-foreground)]",
4657
+ body2: "text-sm font-normal text-[var(--color-foreground)]",
4658
+ body: "text-base font-normal text-[var(--color-foreground)]",
4659
+ caption: "text-xs font-normal text-[var(--color-muted-foreground)]",
4660
+ overline: "text-xs uppercase tracking-wide font-bold text-[var(--color-muted-foreground)]",
4661
+ small: "text-sm font-normal text-[var(--color-foreground)]",
4662
+ large: "text-lg font-medium text-[var(--color-foreground)]",
4663
+ label: "text-sm font-medium text-[var(--color-foreground)]"
4664
+ };
4665
+ var colorStyles = {
4666
+ primary: "text-[var(--color-foreground)]",
4667
+ secondary: "text-[var(--color-muted-foreground)]",
4668
+ muted: "text-[var(--color-muted-foreground)]",
4669
+ error: "text-[var(--color-error)]",
4670
+ success: "text-[var(--color-success)]",
4671
+ warning: "text-[var(--color-warning)]",
4672
+ inherit: "text-inherit"
4673
+ };
4674
+ var weightStyles = {
4675
+ light: "font-light",
4676
+ normal: "font-normal",
4677
+ medium: "font-medium",
4678
+ semibold: "font-semibold",
4679
+ bold: "font-bold"
4680
+ };
4681
+ var defaultElements = {
4682
+ h1: "h1",
4683
+ h2: "h2",
4684
+ h3: "h3",
4685
+ h4: "h4",
4686
+ h5: "h5",
4687
+ h6: "h6",
4688
+ heading: "h2",
4689
+ subheading: "h3",
4690
+ body1: "p",
4691
+ body2: "p",
4692
+ body: "p",
4693
+ caption: "span",
4694
+ overline: "span",
4695
+ small: "span",
4696
+ large: "p",
4697
+ label: "span"
4698
+ };
4699
+ var typographySizeStyles = {
4700
+ xs: "text-xs",
4701
+ sm: "text-sm",
4702
+ md: "text-base",
4703
+ lg: "text-lg",
4704
+ xl: "text-xl",
4705
+ "2xl": "text-2xl",
4706
+ "3xl": "text-3xl"
4707
+ };
4708
+ var overflowStyles2 = {
4709
+ visible: "overflow-visible",
4710
+ hidden: "overflow-hidden",
4711
+ wrap: "break-words overflow-hidden",
4712
+ "clamp-2": "overflow-hidden line-clamp-2",
4713
+ "clamp-3": "overflow-hidden line-clamp-3"
4714
+ };
4715
+ var Typography = ({
4716
+ variant: variantProp,
4717
+ level,
4718
+ color = "primary",
4719
+ align,
4720
+ weight,
4721
+ size,
4722
+ truncate = false,
4723
+ overflow,
4724
+ as,
4725
+ id,
4726
+ className,
4727
+ style,
4728
+ content,
4729
+ children
4730
+ }) => {
4731
+ const variant = variantProp ?? (level ? `h${level}` : "body1");
4732
+ const Component = as || defaultElements[variant];
4733
+ const Comp = Component;
4734
+ return /* @__PURE__ */ jsxRuntime.jsx(
4735
+ Comp,
4736
+ {
4737
+ id,
4738
+ className: cn(
4739
+ variantStyles[variant],
4740
+ colorStyles[color],
4741
+ weight && weightStyles[weight],
4742
+ size && typographySizeStyles[size],
4743
+ align && `text-${align}`,
4744
+ truncate && "truncate overflow-hidden text-ellipsis",
4745
+ overflow && overflowStyles2[overflow],
4746
+ className
4747
+ ),
4748
+ style,
4749
+ children: children ?? content
4750
+ }
4751
+ );
4752
+ };
4753
+ Typography.displayName = "Typography";
4754
+ var gapStyles = {
4755
+ none: "gap-0",
4756
+ xs: "gap-1",
4757
+ sm: "gap-2",
4758
+ md: "gap-4",
4759
+ lg: "gap-6",
4760
+ xl: "gap-8",
4761
+ "2xl": "gap-12"
4762
+ };
4763
+ var alignStyles = {
4764
+ start: "items-start",
4765
+ center: "items-center",
4766
+ end: "items-end",
4767
+ stretch: "items-stretch",
4768
+ baseline: "items-baseline"
4769
+ };
4770
+ var justifyStyles = {
4771
+ start: "justify-start",
4772
+ center: "justify-center",
4773
+ end: "justify-end",
4774
+ between: "justify-between",
4775
+ around: "justify-around",
4776
+ evenly: "justify-evenly"
4777
+ };
4778
+ var Stack = ({
4779
+ direction = "vertical",
4780
+ gap = "md",
4781
+ align = "stretch",
4782
+ justify = "start",
4783
+ wrap = false,
4784
+ reverse = false,
4785
+ flex = false,
4786
+ className,
4787
+ style,
4788
+ children,
4789
+ as: Component = "div",
4790
+ onClick,
4791
+ onKeyDown,
4792
+ role,
4793
+ tabIndex,
4794
+ action,
4795
+ actionPayload,
4796
+ responsive = false
4797
+ }) => {
4798
+ const eventBus = useEventBus();
4799
+ const handleClick = (e) => {
4800
+ if (action) {
4801
+ eventBus.emit(`UI:${action}`, actionPayload ?? {});
4802
+ }
4803
+ onClick?.(e);
4804
+ };
4805
+ const isHorizontal = direction === "horizontal";
4806
+ const directionClass = responsive && isHorizontal ? reverse ? "flex-col-reverse md:flex-row-reverse" : "flex-col md:flex-row" : isHorizontal ? reverse ? "flex-row-reverse" : "flex-row" : reverse ? "flex-col-reverse" : "flex-col";
4807
+ const Comp = Component;
4808
+ return /* @__PURE__ */ jsxRuntime.jsx(
4809
+ Comp,
4810
+ {
4811
+ className: cn(
4812
+ "flex",
4813
+ directionClass,
4814
+ gapStyles[gap],
4815
+ alignStyles[align],
4816
+ justifyStyles[justify],
4817
+ wrap && "flex-wrap",
4818
+ flex && "flex-1",
4819
+ className
4820
+ ),
4821
+ style,
4822
+ onClick: action || onClick ? handleClick : void 0,
4823
+ onKeyDown,
4824
+ role,
4825
+ tabIndex,
4826
+ children
4827
+ }
4828
+ );
4829
+ };
4830
+ var HStack = (props) => /* @__PURE__ */ jsxRuntime.jsx(Stack, { direction: "horizontal", ...props });
4831
+
4832
+ // components/organisms/avl/avl-schema-parser.ts
4833
+ function getEntity(orbital) {
4834
+ const entity = orbital.entity;
4835
+ if (typeof entity === "string") {
4836
+ return { name: entity, fields: [], persistence: "runtime" };
4837
+ }
4838
+ const e = entity;
4839
+ return {
4840
+ name: e.name ?? orbital.name,
4841
+ fields: e.fields ?? [],
4842
+ persistence: e.persistence ?? "runtime"
4843
+ };
4844
+ }
4845
+ function getTraits(orbital) {
4846
+ if (!orbital.traits) return [];
4847
+ return orbital.traits.map((t) => {
4848
+ if (typeof t === "string") return { name: t };
4849
+ return t;
4850
+ });
4851
+ }
4852
+ function getPages(orbital) {
4853
+ if (!orbital.pages) return [];
4854
+ return orbital.pages.map((p) => {
4855
+ if (typeof p === "string") return { name: p, path: `/${p.toLowerCase()}` };
4856
+ return p;
4857
+ });
4858
+ }
4859
+ function getStateMachine(trait) {
4860
+ return trait.stateMachine ?? null;
4861
+ }
4862
+ function getStates(sm) {
4863
+ return sm.states ?? [];
4864
+ }
4865
+ function getTransitions(sm) {
4866
+ return sm.transitions ?? [];
4867
+ }
4868
+ function getEvents(sm) {
4869
+ return sm.events ?? [];
4870
+ }
4871
+ function getEmits(trait) {
4872
+ const emits = trait.emits;
4873
+ if (!emits) return [];
4874
+ return emits.map((e) => typeof e === "string" ? e : e.event ?? e.name ?? "");
4875
+ }
4876
+ function getListens(trait) {
4877
+ const listens = trait.listens;
4878
+ if (!listens) return [];
4879
+ return listens.map((l) => typeof l === "string" ? l : l.event ?? "");
4880
+ }
4881
+ function parseEffectType(effect) {
4882
+ if (Array.isArray(effect)) {
4883
+ const [type, ...args] = effect;
4884
+ return { type: String(type), args };
4885
+ }
4886
+ return { type: "unknown", args: [] };
4887
+ }
4888
+ function exprToTree(expr) {
4889
+ if (Array.isArray(expr)) {
4890
+ const [op, ...args] = expr;
4891
+ return {
4892
+ label: String(op),
4893
+ type: "operator",
4894
+ children: args.map((a) => exprToTree(a))
4895
+ };
4896
+ }
4897
+ if (typeof expr === "string") {
4898
+ if (expr.startsWith("@")) {
4899
+ return { label: expr, type: "binding" };
4900
+ }
4901
+ return { label: expr, type: "literal" };
4902
+ }
4903
+ return { label: String(expr), type: "literal" };
4904
+ }
4905
+ function parseApplicationLevel(schema) {
4906
+ const orbitals = [];
4907
+ const crossLinks = [];
4908
+ const count = schema.orbitals.length;
4909
+ const cols = Math.ceil(Math.sqrt(count));
4910
+ const rows = Math.ceil(count / cols);
4911
+ const spacing = 200;
4912
+ const gridW = cols * spacing;
4913
+ const gridH = rows * spacing;
4914
+ const originX = (600 - gridW) / 2 + spacing / 2;
4915
+ const originY = (400 - gridH) / 2 + spacing / 2;
4916
+ schema.orbitals.forEach((orbital, i) => {
4917
+ const entity = getEntity(orbital);
4918
+ const traits = getTraits(orbital);
4919
+ const pages = getPages(orbital);
4920
+ orbitals.push({
4921
+ name: orbital.name,
4922
+ entityName: entity.name,
4923
+ fieldCount: entity.fields.length,
4924
+ persistence: entity.persistence,
4925
+ traitNames: traits.map((t) => t.name ?? ""),
4926
+ pageNames: pages.map((p) => p.name ?? ""),
4927
+ position: {
4928
+ x: originX + i % cols * spacing,
4929
+ y: originY + Math.floor(i / cols) * spacing
4930
+ }
4931
+ });
4932
+ });
4933
+ const emitMap = [];
4934
+ const listenMap = [];
4935
+ for (const orbital of schema.orbitals) {
4936
+ for (const traitRef of getTraits(orbital)) {
4937
+ const traitName = traitRef.name ?? "";
4938
+ for (const event of getEmits(traitRef)) {
4939
+ emitMap.push({ orbital: orbital.name, trait: traitName, event });
4940
+ }
4941
+ for (const event of getListens(traitRef)) {
4942
+ listenMap.push({ orbital: orbital.name, trait: traitName, event });
4943
+ }
4944
+ }
4945
+ }
4946
+ for (const emit of emitMap) {
4947
+ for (const listen of listenMap) {
4948
+ if (emit.event === listen.event && emit.orbital !== listen.orbital) {
4949
+ crossLinks.push({
4950
+ emitterOrbital: emit.orbital,
4951
+ listenerOrbital: listen.orbital,
4952
+ eventName: emit.event,
4953
+ emitterTrait: emit.trait,
4954
+ listenerTrait: listen.trait
4955
+ });
4956
+ }
4957
+ }
4958
+ }
4959
+ return { orbitals, crossLinks };
4960
+ }
4961
+ function parseOrbitalLevel(schema, orbitalName) {
4962
+ const orbital = schema.orbitals.find((o) => o.name === orbitalName);
4963
+ if (!orbital) return null;
4964
+ const entity = getEntity(orbital);
4965
+ const traits = getTraits(orbital);
4966
+ const pages = getPages(orbital);
4967
+ const fields = entity.fields.map((f) => ({
4968
+ name: f.name ?? "",
4969
+ type: f.type ?? "string",
4970
+ required: f.required ?? false,
4971
+ hasDefault: f.default !== void 0
4972
+ }));
4973
+ const traitInfos = traits.map((t) => {
4974
+ const sm = getStateMachine(t);
4975
+ return {
4976
+ name: t.name ?? "",
4977
+ stateCount: sm ? getStates(sm).length : 0,
4978
+ eventCount: sm ? getEvents(sm).length : 0,
4979
+ transitionCount: sm ? getTransitions(sm).length : 0,
4980
+ emits: getEmits(t),
4981
+ listens: getListens(t)
4982
+ };
4983
+ });
4984
+ const pageInfos = pages.map((p) => ({
4985
+ name: p.name ?? "",
4986
+ route: p.path ?? `/${(p.name ?? "").toLowerCase()}`
4987
+ }));
4988
+ const externalLinks = [];
4989
+ const thisTraitEmits = traits.flatMap((t) => getEmits(t).map((e) => ({ trait: t.name ?? "", event: e })));
4990
+ const thisTraitListens = traits.flatMap((t) => getListens(t).map((e) => ({ trait: t.name ?? "", event: e })));
4991
+ for (const other of schema.orbitals) {
4992
+ if (other.name === orbitalName) continue;
4993
+ const otherTraits = getTraits(other);
4994
+ const otherListens = otherTraits.flatMap((t) => getListens(t));
4995
+ const otherEmits = otherTraits.flatMap((t) => getEmits(t));
4996
+ for (const emit of thisTraitEmits) {
4997
+ if (otherListens.includes(emit.event)) {
4998
+ externalLinks.push({
4999
+ targetOrbital: other.name,
5000
+ eventName: emit.event,
5001
+ direction: "out",
5002
+ traitName: emit.trait
5003
+ });
5004
+ }
5005
+ }
5006
+ for (const listen of thisTraitListens) {
5007
+ if (otherEmits.includes(listen.event)) {
5008
+ externalLinks.push({
5009
+ targetOrbital: other.name,
5010
+ eventName: listen.event,
5011
+ direction: "in",
5012
+ traitName: listen.trait
5013
+ });
5014
+ }
5015
+ }
5016
+ }
5017
+ return {
5018
+ name: orbital.name,
5019
+ entity: {
5020
+ name: entity.name,
5021
+ fields,
5022
+ persistence: entity.persistence
5023
+ },
5024
+ traits: traitInfos,
5025
+ pages: pageInfos,
5026
+ externalLinks
5027
+ };
5028
+ }
5029
+ function parseTraitLevel(schema, orbitalName, traitName) {
5030
+ const orbital = schema.orbitals.find((o) => o.name === orbitalName);
5031
+ if (!orbital) return null;
5032
+ const traits = getTraits(orbital);
5033
+ const trait = traits.find((t) => t.name === traitName);
5034
+ if (!trait) return null;
5035
+ const sm = getStateMachine(trait);
5036
+ if (!sm) return null;
5037
+ const states = getStates(sm).map((s) => ({
5038
+ name: s.name ?? "",
5039
+ isInitial: s.isInitial ?? false,
5040
+ isTerminal: s.isTerminal ?? false
5041
+ }));
5042
+ const transitions = getTransitions(sm).map((t, i) => ({
5043
+ from: t.from ?? "",
5044
+ to: t.to ?? "",
5045
+ event: t.event ?? "",
5046
+ guard: t.guard,
5047
+ effects: (t.effects ?? []).map(parseEffectType),
5048
+ index: i
5049
+ }));
5050
+ const entity = getEntity(orbital);
5051
+ return {
5052
+ name: traitName,
5053
+ linkedEntity: entity.name,
5054
+ states,
5055
+ transitions,
5056
+ emittedEvents: getEmits(trait),
5057
+ listenedEvents: getListens(trait)
5058
+ };
5059
+ }
5060
+ function parseTransitionLevel(schema, orbitalName, traitName, transitionIndex) {
5061
+ const traitData = parseTraitLevel(schema, orbitalName, traitName);
5062
+ if (!traitData) return null;
5063
+ const transition = traitData.transitions[transitionIndex];
5064
+ if (!transition) return null;
5065
+ const guard = transition.guard ? exprToTree(transition.guard) : null;
5066
+ const effects = transition.effects.map(
5067
+ (e) => exprToTree([e.type, ...e.args])
5068
+ );
5069
+ const slotTargets = transition.effects.filter((e) => e.type === "render-ui").map((e) => ({
5070
+ name: String(e.args[0] ?? "main"),
5071
+ pattern: typeof e.args[1] === "object" && e.args[1] !== null ? e.args[1].type ?? "unknown" : String(e.args[1] ?? "unknown")
5072
+ }));
5073
+ return {
5074
+ from: transition.from,
5075
+ to: transition.to,
5076
+ event: transition.event,
5077
+ guard,
5078
+ effects,
5079
+ slotTargets
5080
+ };
5081
+ }
5082
+
5083
+ // components/organisms/avl/avl-zoom-state.ts
5084
+ var initialZoomState = {
5085
+ level: "application",
5086
+ selectedOrbital: null,
5087
+ selectedTrait: null,
5088
+ selectedTransition: null,
5089
+ animating: false,
5090
+ animationDirection: "in",
5091
+ animationTarget: null
5092
+ };
5093
+ function zoomReducer(state, action) {
5094
+ switch (action.type) {
5095
+ case "ZOOM_INTO_ORBITAL": {
5096
+ if (state.level !== "application" || state.animating) return state;
5097
+ return {
5098
+ ...state,
5099
+ animating: true,
5100
+ animationDirection: "in",
5101
+ animationTarget: { x: action.targetPosition.x, y: action.targetPosition.y, scale: 3 },
5102
+ selectedOrbital: action.orbital
5103
+ };
5104
+ }
5105
+ case "ZOOM_INTO_TRAIT": {
5106
+ if (state.level !== "orbital" || state.animating) return state;
5107
+ return {
5108
+ ...state,
5109
+ animating: true,
5110
+ animationDirection: "in",
5111
+ animationTarget: { x: action.targetPosition.x, y: action.targetPosition.y, scale: 3 },
5112
+ selectedTrait: action.trait
5113
+ };
5114
+ }
5115
+ case "ZOOM_INTO_TRANSITION": {
5116
+ if (state.level !== "trait" || state.animating) return state;
5117
+ return {
5118
+ ...state,
5119
+ animating: true,
5120
+ animationDirection: "in",
5121
+ animationTarget: { x: action.targetPosition.x, y: action.targetPosition.y, scale: 3 },
5122
+ selectedTransition: action.transitionIndex
5123
+ };
5124
+ }
5125
+ case "ZOOM_OUT": {
5126
+ if (state.level === "application" || state.animating) return state;
5127
+ return {
5128
+ ...state,
5129
+ animating: true,
5130
+ animationDirection: "out",
5131
+ animationTarget: { x: 300, y: 200, scale: 0.3 }
5132
+ };
5133
+ }
5134
+ case "ANIMATION_COMPLETE": {
5135
+ if (!state.animating) return state;
5136
+ if (state.animationDirection === "in") {
5137
+ const nextLevel = state.level === "application" ? "orbital" : state.level === "orbital" ? "trait" : "transition";
5138
+ return {
5139
+ ...state,
5140
+ level: nextLevel,
5141
+ animating: false,
5142
+ animationTarget: null
5143
+ };
5144
+ }
5145
+ if (state.level === "transition") {
5146
+ return {
5147
+ ...state,
5148
+ level: "trait",
5149
+ selectedTransition: null,
5150
+ animating: false,
5151
+ animationTarget: null
5152
+ };
5153
+ }
5154
+ if (state.level === "trait") {
5155
+ return {
5156
+ ...state,
5157
+ level: "orbital",
5158
+ selectedTrait: null,
5159
+ animating: false,
5160
+ animationTarget: null
5161
+ };
5162
+ }
5163
+ if (state.level === "orbital") {
5164
+ return {
5165
+ ...state,
5166
+ level: "application",
5167
+ selectedOrbital: null,
5168
+ animating: false,
5169
+ animationTarget: null
5170
+ };
5171
+ }
5172
+ return state;
5173
+ }
5174
+ case "RESET": {
5175
+ return initialZoomState;
5176
+ }
5177
+ default:
5178
+ return state;
5179
+ }
5180
+ }
5181
+ function getBreadcrumbs(state) {
5182
+ const crumbs = [{ label: "Application", level: "application" }];
5183
+ if (state.selectedOrbital) {
5184
+ crumbs.push({ label: state.selectedOrbital, level: "orbital" });
5185
+ }
5186
+ if (state.selectedTrait) {
5187
+ crumbs.push({ label: state.selectedTrait, level: "trait" });
5188
+ }
5189
+ if (state.selectedTransition !== null) {
5190
+ crumbs.push({ label: `Transition #${state.selectedTransition}`, level: "transition" });
5191
+ }
5192
+ return crumbs;
5193
+ }
5194
+ var AvlClickTarget = ({
5195
+ x,
5196
+ y,
5197
+ width,
5198
+ height,
5199
+ onClick,
5200
+ onHover,
5201
+ cursor = "pointer",
5202
+ glowColor = "var(--color-primary)",
5203
+ label,
5204
+ children
5205
+ }) => {
5206
+ const [hovering, setHovering] = React6.useState(false);
5207
+ const handleMouseEnter = React6.useCallback(() => {
5208
+ setHovering(true);
5209
+ onHover?.(true);
5210
+ }, [onHover]);
5211
+ const handleMouseLeave = React6.useCallback(() => {
5212
+ setHovering(false);
5213
+ onHover?.(false);
5214
+ }, [onHover]);
5215
+ const handleKeyDown = React6.useCallback((e) => {
5216
+ if (e.key === "Enter" || e.key === " ") {
5217
+ e.preventDefault();
5218
+ onClick();
5219
+ }
5220
+ }, [onClick]);
5221
+ return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
5222
+ hovering && /* @__PURE__ */ jsxRuntime.jsx(
5223
+ "rect",
5224
+ {
5225
+ x: x - 4,
5226
+ y: y - 4,
5227
+ width: width + 8,
5228
+ height: height + 8,
5229
+ rx: 8,
5230
+ fill: glowColor,
5231
+ opacity: 0.08
5232
+ }
5233
+ ),
5234
+ children,
5235
+ /* @__PURE__ */ jsxRuntime.jsx(
5236
+ "rect",
5237
+ {
5238
+ x,
5239
+ y,
5240
+ width,
5241
+ height,
5242
+ fill: "transparent",
5243
+ style: { cursor },
5244
+ pointerEvents: "all",
5245
+ onClick,
5246
+ onMouseEnter: handleMouseEnter,
5247
+ onMouseLeave: handleMouseLeave,
5248
+ onKeyDown: handleKeyDown,
5249
+ tabIndex: 0,
5250
+ role: "button",
5251
+ "aria-label": label
5252
+ }
5253
+ )
5254
+ ] });
5255
+ };
5256
+ AvlClickTarget.displayName = "AvlClickTarget";
5257
+ var ORBITAL_R = 60;
5258
+ var ENTITY_R = 14;
5259
+ function bundleCrossLinks(links) {
5260
+ const bundles = /* @__PURE__ */ new Map();
5261
+ for (const link of links) {
5262
+ const key = [link.emitterOrbital, link.listenerOrbital].sort().join("::");
5263
+ if (!bundles.has(key)) bundles.set(key, []);
5264
+ bundles.get(key).push(link);
5265
+ }
5266
+ return bundles;
5267
+ }
5268
+ var AvlApplicationScene = ({
5269
+ data,
5270
+ color = "var(--color-primary)",
5271
+ onOrbitalClick
5272
+ }) => {
5273
+ const posMap = /* @__PURE__ */ new Map();
5274
+ data.orbitals.forEach((o) => posMap.set(o.name, o.position));
5275
+ const bundles = bundleCrossLinks(data.crossLinks);
5276
+ return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
5277
+ Array.from(bundles.entries()).map(([key, links]) => {
5278
+ const first = links[0];
5279
+ const fromPos = posMap.get(first.emitterOrbital);
5280
+ const toPos = posMap.get(first.listenerOrbital);
5281
+ if (!fromPos || !toPos) return null;
5282
+ const cp = curveControlPoint(fromPos.x, fromPos.y, toPos.x, toPos.y, 40);
5283
+ const midX = cp.cpx;
5284
+ const midY = cp.cpy;
5285
+ return /* @__PURE__ */ jsxRuntime.jsxs("g", { opacity: 0.5, children: [
5286
+ /* @__PURE__ */ jsxRuntime.jsx(
5287
+ "path",
5288
+ {
5289
+ d: `M${fromPos.x},${fromPos.y} Q${midX},${midY} ${toPos.x},${toPos.y}`,
5290
+ fill: "none",
5291
+ stroke: color,
5292
+ strokeWidth: 1.5,
5293
+ strokeDasharray: "6 3",
5294
+ markerEnd: "url(#cosmicArrow)"
5295
+ }
5296
+ ),
5297
+ links.map((link, i) => /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
5298
+ /* @__PURE__ */ jsxRuntime.jsx(
5299
+ AvlEffect,
5300
+ {
5301
+ x: midX - 12,
5302
+ y: midY - 10 + i * 16,
5303
+ effectType: "emit",
5304
+ size: 8,
5305
+ color
5306
+ }
5307
+ ),
5308
+ /* @__PURE__ */ jsxRuntime.jsx(
5309
+ "text",
5310
+ {
5311
+ x: midX + 2,
5312
+ y: midY - 6 + i * 16,
5313
+ fill: color,
5314
+ fontSize: 7,
5315
+ opacity: 0.7,
5316
+ children: link.eventName
5317
+ }
5318
+ )
5319
+ ] }, `${key}-${i}`))
5320
+ ] }, key);
5321
+ }),
5322
+ data.orbitals.map((orbital) => {
5323
+ const { x, y } = orbital.position;
5324
+ const traitAngleStart = -60;
5325
+ const traitAngleStep = orbital.traitNames.length > 1 ? 120 / (orbital.traitNames.length - 1) : 0;
5326
+ const pageAngleStart = -Math.PI / 3;
5327
+ const pageAngleStep = orbital.pageNames.length > 1 ? Math.PI * 0.8 / (orbital.pageNames.length - 1) : 0;
5328
+ return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
5329
+ /* @__PURE__ */ jsxRuntime.jsx(AvlOrbital, { cx: x, cy: y, r: ORBITAL_R, label: orbital.name, color }),
5330
+ orbital.traitNames.map((trait, i) => /* @__PURE__ */ jsxRuntime.jsx(
5331
+ AvlTrait,
5332
+ {
5333
+ cx: x,
5334
+ cy: y,
5335
+ rx: 25 + i * 10,
5336
+ ry: 12 + i * 4,
5337
+ rotation: traitAngleStart + i * traitAngleStep,
5338
+ color,
5339
+ opacity: 0.4
5340
+ },
5341
+ trait
5342
+ )),
5343
+ /* @__PURE__ */ jsxRuntime.jsx(
5344
+ AvlEntity,
5345
+ {
5346
+ x,
5347
+ y,
5348
+ r: ENTITY_R,
5349
+ fieldCount: orbital.fieldCount,
5350
+ persistence: orbital.persistence,
5351
+ color
5352
+ }
5353
+ ),
5354
+ orbital.pageNames.map((page, i) => {
5355
+ const angle = pageAngleStart + i * pageAngleStep;
5356
+ const px = x + (ORBITAL_R + 12) * Math.cos(angle);
5357
+ const py = y + (ORBITAL_R + 12) * Math.sin(angle);
5358
+ return /* @__PURE__ */ jsxRuntime.jsx(AvlPage, { x: px, y: py, size: 6, label: page, color }, page);
5359
+ }),
5360
+ onOrbitalClick && /* @__PURE__ */ jsxRuntime.jsx(
5361
+ AvlClickTarget,
5362
+ {
5363
+ x: x - ORBITAL_R,
5364
+ y: y - ORBITAL_R,
5365
+ width: ORBITAL_R * 2,
5366
+ height: ORBITAL_R * 2,
5367
+ onClick: () => onOrbitalClick(orbital.name, { x, y }),
5368
+ label: `Orbital: ${orbital.name} (${orbital.traitNames.length} traits, ${orbital.pageNames.length} pages)`,
5369
+ glowColor: color,
5370
+ children: /* @__PURE__ */ jsxRuntime.jsx("rect", { x: 0, y: 0, width: 0, height: 0, fill: "transparent" })
5371
+ }
5372
+ )
5373
+ ] }, orbital.name);
5374
+ }),
5375
+ /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsx("marker", { id: "cosmicArrow", viewBox: "0 0 10 10", refX: "8", refY: "5", markerWidth: "6", markerHeight: "6", orient: "auto-start-reverse", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M 0 0 L 10 5 L 0 10 z", fill: color, opacity: 0.5 }) }) })
5376
+ ] });
5377
+ };
5378
+ AvlApplicationScene.displayName = "AvlApplicationScene";
5379
+ var CX = 300;
5380
+ var CY = 200;
5381
+ var ORBITAL_R2 = 130;
5382
+ var ENTITY_R2 = 24;
5383
+ var AvlOrbitalScene = ({
5384
+ data,
5385
+ color = "var(--color-primary)",
5386
+ onTraitClick
5387
+ }) => {
5388
+ const traitAngleStart = -Math.PI / 3;
5389
+ const traitAngleStep = data.traits.length > 1 ? Math.PI * 1.2 / (data.traits.length - 1) : 0;
5390
+ const pageAngleStart = -Math.PI / 3;
5391
+ const pageAngleStep = data.pages.length > 1 ? Math.PI * 0.8 / (data.pages.length - 1) : 0;
5392
+ return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
5393
+ /* @__PURE__ */ jsxRuntime.jsx(AvlOrbital, { cx: CX, cy: CY, r: ORBITAL_R2, label: data.name, color }),
5394
+ data.traits.map((trait, i) => {
5395
+ const rotation = traitAngleStart + i * traitAngleStep;
5396
+ const rotationDeg = rotation * 180 / Math.PI;
5397
+ const baseRx = 55 + i * 20;
5398
+ const baseRy = 24 + i * 8;
5399
+ const labelX = CX - baseRx - 10;
5400
+ const labelY = CY;
5401
+ return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
5402
+ /* @__PURE__ */ jsxRuntime.jsx(
5403
+ AvlTrait,
5404
+ {
5405
+ cx: CX,
5406
+ cy: CY,
5407
+ rx: baseRx,
5408
+ ry: baseRy,
5409
+ rotation: rotationDeg,
5410
+ label: trait.name,
5411
+ color,
5412
+ opacity: 0.7
5413
+ }
5414
+ ),
5415
+ onTraitClick && /* @__PURE__ */ jsxRuntime.jsx(
5416
+ AvlClickTarget,
5417
+ {
5418
+ x: CX - baseRx,
5419
+ y: CY - baseRy,
5420
+ width: baseRx * 2,
5421
+ height: baseRy * 2,
5422
+ onClick: () => onTraitClick(trait.name, { x: CX, y: CY }),
5423
+ label: `Trait: ${trait.name} (${trait.stateCount} states)`,
5424
+ glowColor: color,
5425
+ children: /* @__PURE__ */ jsxRuntime.jsx("rect", { x: 0, y: 0, width: 0, height: 0, fill: "transparent" })
5426
+ }
5427
+ ),
5428
+ /* @__PURE__ */ jsxRuntime.jsxs(
5429
+ "text",
5430
+ {
5431
+ x: labelX - 20,
5432
+ y: labelY + 12,
5433
+ textAnchor: "end",
5434
+ fill: color,
5435
+ fontSize: 7,
5436
+ opacity: 0.4,
5437
+ transform: `rotate(${-rotationDeg},${labelX - 20},${labelY + 12})`,
5438
+ children: [
5439
+ trait.stateCount,
5440
+ "s ",
5441
+ trait.eventCount,
5442
+ "e"
5443
+ ]
5444
+ }
5445
+ )
5446
+ ] }, trait.name);
5447
+ }),
5448
+ /* @__PURE__ */ jsxRuntime.jsx(
5449
+ AvlEntity,
5450
+ {
5451
+ x: CX,
5452
+ y: CY,
5453
+ r: ENTITY_R2,
5454
+ fieldCount: data.entity.fields.length,
5455
+ persistence: data.entity.persistence,
5456
+ color
5457
+ }
5458
+ ),
5459
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: CX, y: CY + ENTITY_R2 + 16, textAnchor: "middle", fill: color, fontSize: 10, fontWeight: "bold", children: data.entity.name }),
5460
+ data.entity.fields.slice(0, 8).map((field, i) => {
5461
+ const angle = -Math.PI / 2 + Math.PI * 2 * i / Math.min(data.entity.fields.length, 8);
5462
+ const fx = CX + (ENTITY_R2 + 30) * Math.cos(angle);
5463
+ const fy = CY + (ENTITY_R2 + 30) * Math.sin(angle);
5464
+ return /* @__PURE__ */ jsxRuntime.jsx(
5465
+ "text",
5466
+ {
5467
+ x: fx,
5468
+ y: fy,
5469
+ textAnchor: "middle",
5470
+ dominantBaseline: "central",
5471
+ fill: color,
5472
+ fontSize: 7,
5473
+ opacity: 0.5,
5474
+ children: field.name
5475
+ },
5476
+ field.name
5477
+ );
5478
+ }),
5479
+ data.pages.map((page, i) => {
5480
+ const angle = pageAngleStart + i * pageAngleStep;
5481
+ const px = CX + (ORBITAL_R2 + 15) * Math.cos(angle);
5482
+ const py = CY + (ORBITAL_R2 + 15) * Math.sin(angle);
5483
+ return /* @__PURE__ */ jsxRuntime.jsx(AvlPage, { x: px, y: py, label: page.route, color }, page.name);
5484
+ }),
5485
+ data.externalLinks.map((link, i) => {
5486
+ const isOut = link.direction === "out";
5487
+ const edgeX = isOut ? 580 : 20;
5488
+ const y = 50 + i * 24;
5489
+ return /* @__PURE__ */ jsxRuntime.jsxs("g", { opacity: 0.3, children: [
5490
+ /* @__PURE__ */ jsxRuntime.jsx(
5491
+ "line",
5492
+ {
5493
+ x1: isOut ? CX + ORBITAL_R2 + 10 : edgeX,
5494
+ y1: y,
5495
+ x2: isOut ? edgeX : CX - ORBITAL_R2 - 10,
5496
+ y2: y,
5497
+ stroke: color,
5498
+ strokeWidth: 1,
5499
+ strokeDasharray: "6 3"
5500
+ }
5501
+ ),
5502
+ /* @__PURE__ */ jsxRuntime.jsxs(
5503
+ "text",
5504
+ {
5505
+ x: isOut ? 585 : 5,
5506
+ y: y + 4,
5507
+ textAnchor: isOut ? "start" : "start",
5508
+ fill: color,
5509
+ fontSize: 7,
5510
+ opacity: 0.7,
5511
+ children: [
5512
+ isOut ? "emit" : "listen",
5513
+ ": ",
5514
+ link.eventName,
5515
+ " (",
5516
+ link.targetOrbital,
5517
+ ")"
5518
+ ]
5519
+ }
5520
+ )
5521
+ ] }, `ext-${i}`);
5522
+ })
5523
+ ] });
5524
+ };
5525
+ AvlOrbitalScene.displayName = "AvlOrbitalScene";
5526
+ var STATE_W = 110;
5527
+ var STATE_H = 38;
5528
+ var LABEL_W = 90;
5529
+ var LABEL_H = 20;
5530
+ var elk = new ELK__default.default();
5531
+ async function computeLayout(data) {
5532
+ const elkGraph = {
5533
+ id: "root",
5534
+ layoutOptions: {
5535
+ "elk.algorithm": "layered",
5536
+ "elk.direction": "DOWN",
5537
+ "elk.spacing.nodeNode": "50",
5538
+ "elk.spacing.edgeNode": "30",
5539
+ "elk.spacing.edgeEdge": "20",
5540
+ "elk.spacing.edgeLabel": "8",
5541
+ "elk.spacing.labelLabel": "6",
5542
+ "elk.layered.spacing.nodeNodeBetweenLayers": "60",
5543
+ "elk.edgeLabels.placement": "CENTER",
5544
+ "elk.layered.mergeEdges": "false",
5545
+ "elk.layered.nodePlacement.strategy": "NETWORK_SIMPLEX"
5546
+ },
5547
+ children: data.states.map((s) => ({
5548
+ id: s.name,
5549
+ width: STATE_W,
5550
+ height: STATE_H,
5551
+ labels: [{ text: s.name, width: STATE_W - 10, height: 14 }]
5552
+ })),
5553
+ edges: data.transitions.map((t, i) => {
5554
+ const hasEffects = t.effects.length > 0;
5555
+ const labelH = hasEffects ? 38 : LABEL_H;
5556
+ const textW = Math.max(t.event.length * 7, 40);
5557
+ const iconsW = Math.min(t.effects.length, 4) * 14;
5558
+ const labelW = Math.max(textW, iconsW, LABEL_W) + 20;
5559
+ return {
5560
+ id: `e${i}`,
5561
+ sources: [t.from],
5562
+ targets: [t.to],
5563
+ labels: [{
5564
+ text: t.event,
5565
+ width: labelW,
5566
+ height: labelH
5567
+ }]
5568
+ };
5569
+ })
5570
+ };
5571
+ const layout = await elk.layout(elkGraph);
5572
+ const layoutChildren = layout.children ?? [];
5573
+ const layoutEdges = layout.edges ?? [];
5574
+ const nodes = layoutChildren.map((n) => ({
5575
+ id: n.id,
5576
+ x: n.x ?? 0,
5577
+ y: n.y ?? 0,
5578
+ width: n.width ?? STATE_W,
5579
+ height: n.height ?? STATE_H,
5580
+ isInitial: data.states.find((s) => s.name === n.id)?.isInitial,
5581
+ isTerminal: data.states.find((s) => s.name === n.id)?.isTerminal
5582
+ }));
5583
+ const edges = layoutEdges.map((e, i) => {
5584
+ const t = data.transitions[i];
5585
+ const labels = e.labels ?? [];
5586
+ const label = labels[0];
5587
+ const sections = e.sections ?? [];
5588
+ const points = [];
5589
+ for (const section of sections) {
5590
+ const startPoint = section.startPoint;
5591
+ const endPoint = section.endPoint;
5592
+ const bendPoints = section.bendPoints ?? [];
5593
+ points.push({ x: startPoint.x, y: startPoint.y });
5594
+ for (const bp of bendPoints) {
5595
+ points.push({ x: bp.x, y: bp.y });
5596
+ }
5597
+ points.push({ x: endPoint.x, y: endPoint.y });
5598
+ }
5599
+ return {
5600
+ id: e.id,
5601
+ from: t.from,
5602
+ to: t.to,
5603
+ event: t.event,
5604
+ effects: t.effects,
5605
+ guard: !!t.guard,
5606
+ index: t.index,
5607
+ labelX: (label?.x ?? 0) + (label?.width ?? 0) / 2,
5608
+ labelY: (label?.y ?? 0) + (label?.height ?? 0) / 2,
5609
+ points,
5610
+ isSelf: t.from === t.to
5611
+ };
5612
+ });
5613
+ return {
5614
+ nodes,
5615
+ edges,
5616
+ width: layout.width ?? 600,
5617
+ height: layout.height ?? 400
5618
+ };
5619
+ }
5620
+ function edgePath(points) {
5621
+ if (points.length === 0) return "";
5622
+ let d = `M ${points[0].x},${points[0].y}`;
5623
+ for (let i = 1; i < points.length; i++) {
5624
+ d += ` L ${points[i].x},${points[i].y}`;
5625
+ }
5626
+ return d;
5627
+ }
5628
+ function mapEffectType(label) {
5629
+ const map = {
5630
+ "render-ui": "render-ui",
5631
+ set: "set",
5632
+ persist: "persist",
5633
+ fetch: "fetch",
5634
+ emit: "emit",
5635
+ navigate: "navigate",
5636
+ notify: "notify",
5637
+ "call-service": "call-service",
5638
+ log: "log"
5639
+ };
5640
+ return map[label] ?? "log";
5641
+ }
5642
+ var AvlTraitScene = ({
5643
+ data,
5644
+ color = "var(--color-primary)",
5645
+ onTransitionClick
5646
+ }) => {
5647
+ const [layout, setLayout] = React6.useState(null);
5648
+ const dataKey = React6.useMemo(() => JSON.stringify(data), [data]);
5649
+ React6.useEffect(() => {
5650
+ computeLayout(data).then(setLayout).catch(console.error);
5651
+ }, [dataKey]);
5652
+ if (!layout) {
5653
+ return /* @__PURE__ */ jsxRuntime.jsx("g", { children: /* @__PURE__ */ jsxRuntime.jsx("text", { x: 300, y: 200, textAnchor: "middle", fill: color, fontSize: 12, opacity: 0.5, children: "Computing layout..." }) });
5654
+ }
5655
+ const padding = 30;
5656
+ const availW = 600 - padding * 2;
5657
+ const availH = 340;
5658
+ const scale = Math.min(1, availW / layout.width, availH / layout.height);
5659
+ const scaledW = layout.width * scale;
5660
+ const scaledH = layout.height * scale;
5661
+ const offsetX = padding + (availW - scaledW) / 2;
5662
+ const offsetY = 60 + (availH - scaledH) / 2;
5663
+ return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
5664
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: 300, y: 24, textAnchor: "middle", fill: color, fontSize: 16, fontWeight: "bold", children: data.name }),
5665
+ /* @__PURE__ */ jsxRuntime.jsxs("text", { x: 300, y: 42, textAnchor: "middle", fill: color, fontSize: 11, opacity: 0.5, children: [
5666
+ "linked to ",
5667
+ data.linkedEntity
5668
+ ] }),
5669
+ /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsx("marker", { id: "traitArrow", viewBox: "0 0 10 10", refX: "9", refY: "5", markerWidth: "6", markerHeight: "6", orient: "auto-start-reverse", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M 0 0 L 10 5 L 0 10 z", fill: color, opacity: 0.6 }) }) }),
5670
+ /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(${offsetX},${offsetY}) scale(${scale})`, children: [
5671
+ layout.edges.map((edge) => {
5672
+ const hasEmit = edge.effects.some((e) => e.type === "emit");
5673
+ return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
5674
+ /* @__PURE__ */ jsxRuntime.jsx(
5675
+ "path",
5676
+ {
5677
+ d: edgePath(edge.points),
5678
+ fill: "none",
5679
+ stroke: color,
5680
+ strokeWidth: 1.5,
5681
+ opacity: 0.4,
5682
+ markerEnd: "url(#traitArrow)"
5683
+ }
5684
+ ),
5685
+ (() => {
5686
+ const visibleEffects = edge.effects.slice(0, 4);
5687
+ const textW = Math.max(edge.event.length * 7, 40);
5688
+ const iconsW = visibleEffects.length * 14;
5689
+ const cardW = Math.max(textW, iconsW) + 20;
5690
+ const hasEffects = visibleEffects.length > 0;
5691
+ const cardH = hasEffects ? 34 : 20;
5692
+ const cardX = edge.labelX - cardW / 2;
5693
+ const cardY = edge.labelY - 10;
5694
+ return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
5695
+ /* @__PURE__ */ jsxRuntime.jsx(
5696
+ "rect",
5697
+ {
5698
+ x: cardX,
5699
+ y: cardY,
5700
+ width: cardW,
5701
+ height: cardH,
5702
+ rx: 5,
5703
+ fill: "var(--color-surface, white)",
5704
+ stroke: color,
5705
+ strokeWidth: 0.8,
5706
+ opacity: 0.95
5707
+ }
5708
+ ),
5709
+ /* @__PURE__ */ jsxRuntime.jsx(
5710
+ "text",
5711
+ {
5712
+ x: edge.labelX,
5713
+ y: cardY + 13,
5714
+ textAnchor: "middle",
5715
+ fill: color,
5716
+ fontSize: 11,
5717
+ fontWeight: "600",
5718
+ children: edge.event
5719
+ }
5720
+ ),
5721
+ hasEffects && /* @__PURE__ */ jsxRuntime.jsx("g", { children: visibleEffects.map((eff, ei) => {
5722
+ const iconX = edge.labelX - (visibleEffects.length - 1) * 7 + ei * 14;
5723
+ return /* @__PURE__ */ jsxRuntime.jsx(
5724
+ AvlEffect,
5725
+ {
5726
+ x: iconX,
5727
+ y: cardY + 25,
5728
+ effectType: mapEffectType(eff.type),
5729
+ size: 9,
5730
+ color
5731
+ },
5732
+ `${edge.id}-eff-${ei}`
5733
+ );
5734
+ }) }),
5735
+ edge.guard && /* @__PURE__ */ jsxRuntime.jsx(
5736
+ AvlGuard,
5737
+ {
5738
+ x: cardX + cardW - 10,
5739
+ y: cardY + 10,
5740
+ label: "",
5741
+ color,
5742
+ size: 6
5743
+ }
5744
+ ),
5745
+ hasEmit && /* @__PURE__ */ jsxRuntime.jsxs("circle", { cx: cardX - 8, cy: cardY + cardH / 2, r: 3, fill: color, opacity: 0.5, children: [
5746
+ /* @__PURE__ */ jsxRuntime.jsx("animate", { attributeName: "r", values: "2;5;2", dur: "1.5s", repeatCount: "indefinite" }),
5747
+ /* @__PURE__ */ jsxRuntime.jsx("animate", { attributeName: "opacity", values: "0.5;0.15;0.5", dur: "1.5s", repeatCount: "indefinite" })
5748
+ ] })
5749
+ ] });
5750
+ })(),
5751
+ onTransitionClick && /* @__PURE__ */ jsxRuntime.jsx(
5752
+ AvlClickTarget,
5753
+ {
5754
+ x: edge.labelX - 50,
5755
+ y: edge.labelY - 15,
5756
+ width: 100,
5757
+ height: 30,
5758
+ onClick: () => onTransitionClick(edge.index, { x: edge.labelX + offsetX, y: edge.labelY + offsetY }),
5759
+ label: `${edge.event}: ${edge.from} -> ${edge.to}`,
5760
+ glowColor: color,
5761
+ children: /* @__PURE__ */ jsxRuntime.jsx("rect", { x: 0, y: 0, width: 0, height: 0, fill: "transparent" })
5762
+ }
5763
+ )
5764
+ ] }, edge.id);
5765
+ }),
5766
+ layout.nodes.map((node) => /* @__PURE__ */ jsxRuntime.jsx("g", { children: /* @__PURE__ */ jsxRuntime.jsx(
5767
+ AvlState,
5768
+ {
5769
+ x: node.x,
5770
+ y: node.y,
5771
+ width: node.width,
5772
+ height: node.height,
5773
+ name: node.id,
5774
+ isInitial: node.isInitial,
5775
+ isTerminal: node.isTerminal,
5776
+ color
5777
+ }
5778
+ ) }, node.id))
5779
+ ] }),
5780
+ data.emittedEvents.map((evt, i) => /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
5781
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: 450, y1: 55 + i * 22, x2: 585, y2: 55 + i * 22, stroke: color, strokeWidth: 1, strokeDasharray: "4 3", opacity: 0.3 }),
5782
+ /* @__PURE__ */ jsxRuntime.jsxs("text", { x: 588, y: 59 + i * 22, fill: color, fontSize: 10, opacity: 0.5, children: [
5783
+ "emit: ",
5784
+ evt
5785
+ ] })
5786
+ ] }, `emit-${i}`)),
5787
+ data.listenedEvents.map((evt, i) => /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
5788
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: 15, y1: 55 + i * 22, x2: 150, y2: 55 + i * 22, stroke: color, strokeWidth: 1, strokeDasharray: "4 3", opacity: 0.3 }),
5789
+ /* @__PURE__ */ jsxRuntime.jsxs("text", { x: 5, y: 59 + i * 22, fill: color, fontSize: 10, opacity: 0.5, children: [
5790
+ "listen: ",
5791
+ evt
5792
+ ] })
5793
+ ] }, `listen-${i}`))
5794
+ ] });
5795
+ };
5796
+ AvlTraitScene.displayName = "AvlTraitScene";
5797
+ var CX2 = 300;
5798
+ var STATE_W2 = 120;
5799
+ var STATE_H2 = 40;
5800
+ var CARD_W = 140;
5801
+ function mapEffectType2(label) {
5802
+ const map = {
5803
+ "render-ui": "render-ui",
5804
+ set: "set",
5805
+ persist: "persist",
5806
+ fetch: "fetch",
5807
+ emit: "emit",
5808
+ navigate: "navigate",
5809
+ notify: "notify",
5810
+ "call-service": "call-service",
5811
+ log: "log"
5812
+ };
5813
+ return map[label] ?? "log";
5814
+ }
5815
+ function EffectNode({ node, x, y, color, id }) {
5816
+ if (node.type === "operator") {
5817
+ const children = node.children ?? [];
5818
+ const maxLabelLen = Math.max(...children.map((c) => c.label.length), 4);
5819
+ const childSpacing = Math.max(90, maxLabelLen * 8 + 20);
5820
+ const totalW = (children.length - 1) * childSpacing;
5821
+ const startX = x - totalW / 2;
5822
+ return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
5823
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: x - 30, y: y - 10, width: 60, height: 20, rx: 4, fill: "var(--color-surface, white)", stroke: color, strokeWidth: 0.8 }),
5824
+ /* @__PURE__ */ jsxRuntime.jsx(AvlEffect, { x: x - 16, y, effectType: mapEffectType2(node.label), size: 10, color }),
5825
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: x + 2, y: y + 4, fill: color, fontSize: 9, fontWeight: "500", children: node.label }),
5826
+ children.map((child, i) => {
5827
+ const cx = startX + i * childSpacing;
5828
+ const cy = y + 40;
5829
+ return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
5830
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: x, y1: y + 10, x2: cx, y2: cy - 10, stroke: color, strokeWidth: 0.8, opacity: 0.3 }),
5831
+ /* @__PURE__ */ jsxRuntime.jsx(EffectNode, { node: child, x: cx, y: cy, color, id: `${id}-${i}` })
5832
+ ] }, `${id}-${i}`);
5833
+ })
5834
+ ] });
5835
+ }
5836
+ const isBinding = node.type === "binding";
5837
+ return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
5838
+ /* @__PURE__ */ jsxRuntime.jsx(
5839
+ "circle",
5840
+ {
5841
+ cx: x,
5842
+ cy: y,
5843
+ r: isBinding ? 6 : 5,
5844
+ fill: isBinding ? "none" : color,
5845
+ opacity: isBinding ? 1 : 0.15,
5846
+ stroke: color,
5847
+ strokeWidth: 1,
5848
+ strokeDasharray: isBinding ? "2 1.5" : "none"
5849
+ }
5850
+ ),
5851
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x, y: y + 16, textAnchor: "middle", fill: color, fontSize: 8, opacity: 0.7, children: node.label })
5852
+ ] });
5853
+ }
5854
+ var AvlTransitionScene = ({
5855
+ data,
5856
+ color = "var(--color-primary)"
5857
+ }) => {
5858
+ let curY = 30;
5859
+ const fromY = curY;
5860
+ curY += STATE_H2;
5861
+ curY += 15;
5862
+ const eventY = curY;
5863
+ const eventH = 24;
5864
+ curY += eventH + 8;
5865
+ const guardY = curY;
5866
+ const hasGuard = !!data.guard;
5867
+ if (hasGuard) {
5868
+ curY += 24 + 8;
5869
+ }
5870
+ curY += 15;
5871
+ const effectsY = curY;
5872
+ const hasEffects = data.effects.length > 0;
5873
+ const effectsH = hasEffects ? 80 : 0;
5874
+ if (hasEffects) curY += effectsH + 8;
5875
+ const slotsY = curY;
5876
+ const hasSlots = data.slotTargets.length > 0;
5877
+ const slotsH = hasSlots ? 30 : 0;
5878
+ if (hasSlots) curY += slotsH + 8;
5879
+ curY += 15;
5880
+ const toY = curY;
5881
+ curY += STATE_H2;
5882
+ const totalH = curY;
5883
+ const offsetY = Math.max(0, (400 - totalH) / 2);
5884
+ return /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `translate(0,${offsetY})`, children: [
5885
+ /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsx("marker", { id: "transArrow", viewBox: "0 0 10 10", refX: "9", refY: "5", markerWidth: "5", markerHeight: "5", orient: "auto-start-reverse", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M 0 0 L 10 5 L 0 10 z", fill: color, opacity: 0.5 }) }) }),
5886
+ /* @__PURE__ */ jsxRuntime.jsx(AvlState, { x: CX2 - STATE_W2 / 2, y: fromY, width: STATE_W2, height: STATE_H2, name: data.from, isInitial: true, color }),
5887
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: CX2, y1: fromY + STATE_H2, x2: CX2, y2: eventY - 2, stroke: color, strokeWidth: 1.5, opacity: 0.4, markerEnd: "url(#transArrow)" }),
5888
+ /* @__PURE__ */ jsxRuntime.jsx(
5889
+ "rect",
5890
+ {
5891
+ x: CX2 - CARD_W / 2,
5892
+ y: eventY,
5893
+ width: CARD_W,
5894
+ height: eventH,
5895
+ rx: 5,
5896
+ fill: "var(--color-surface, white)",
5897
+ stroke: color,
5898
+ strokeWidth: 1
5899
+ }
5900
+ ),
5901
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: CX2, y: eventY + 15, textAnchor: "middle", fill: color, fontSize: 13, fontWeight: "700", children: data.event }),
5902
+ hasGuard && data.guard && /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
5903
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: CX2, y1: eventY + eventH, x2: CX2, y2: guardY - 2, stroke: color, strokeWidth: 1, opacity: 0.3 }),
5904
+ /* @__PURE__ */ jsxRuntime.jsx(
5905
+ "rect",
5906
+ {
5907
+ x: CX2 - 50,
5908
+ y: guardY,
5909
+ width: 100,
5910
+ height: 20,
5911
+ rx: 4,
5912
+ fill: "var(--color-surface, white)",
5913
+ stroke: color,
5914
+ strokeWidth: 0.8,
5915
+ opacity: 0.9
5916
+ }
5917
+ ),
5918
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: CX2 - 6, y: guardY + 14, textAnchor: "middle", fill: color, fontSize: 10, children: data.guard.label }),
5919
+ /* @__PURE__ */ jsxRuntime.jsx(
5920
+ "polygon",
5921
+ {
5922
+ points: `${CX2 - 40},${guardY + 10} ${CX2 - 46},${guardY + 10 - 5} ${CX2 - 40},${guardY + 10 - 10} ${CX2 - 34},${guardY + 10 - 5}`,
5923
+ fill: color,
5924
+ opacity: 0.2,
5925
+ stroke: color,
5926
+ strokeWidth: 0.8
5927
+ }
5928
+ )
5929
+ ] }),
5930
+ /* @__PURE__ */ jsxRuntime.jsx(
5931
+ "line",
5932
+ {
5933
+ x1: CX2,
5934
+ y1: hasGuard ? guardY + 20 : eventY + eventH,
5935
+ x2: CX2,
5936
+ y2: hasEffects ? effectsY - 8 : hasSlots ? slotsY - 8 : toY - 2,
5937
+ stroke: color,
5938
+ strokeWidth: 1.5,
5939
+ opacity: 0.4,
5940
+ markerEnd: "url(#transArrow)"
5941
+ }
5942
+ ),
5943
+ hasEffects && /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
5944
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: CX2, y: effectsY - 2, textAnchor: "middle", fill: color, fontSize: 9, fontWeight: "600", opacity: 0.5, children: "EFFECTS" }),
5945
+ data.effects.map((effect, i) => {
5946
+ const effectSpacing = 130;
5947
+ const effectX = CX2 - (data.effects.length - 1) * effectSpacing / 2 + i * effectSpacing;
5948
+ return /* @__PURE__ */ jsxRuntime.jsx(EffectNode, { node: effect, x: effectX, y: effectsY + 20, color, id: `eff-${i}` }, `eff-${i}`);
5949
+ })
5950
+ ] }),
5951
+ hasSlots && /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
5952
+ hasEffects && /* @__PURE__ */ jsxRuntime.jsx("line", { x1: CX2, y1: effectsY + effectsH - 10, x2: CX2, y2: slotsY - 4, stroke: color, strokeWidth: 1, opacity: 0.3 }),
5953
+ /* @__PURE__ */ jsxRuntime.jsx("text", { x: CX2, y: slotsY - 2, textAnchor: "middle", fill: color, fontSize: 9, fontWeight: "600", opacity: 0.5, children: "SLOTS" }),
5954
+ data.slotTargets.map((slot, i) => {
5955
+ const sx = CX2 - (data.slotTargets.length - 1) * 90 / 2 + i * 90;
5956
+ return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
5957
+ /* @__PURE__ */ jsxRuntime.jsx(
5958
+ "rect",
5959
+ {
5960
+ x: sx - 35,
5961
+ y: slotsY + 4,
5962
+ width: 70,
5963
+ height: 20,
5964
+ rx: 4,
5965
+ fill: color,
5966
+ opacity: 0.08,
5967
+ stroke: color,
5968
+ strokeWidth: 0.8
5969
+ }
5970
+ ),
5971
+ /* @__PURE__ */ jsxRuntime.jsxs("text", { x: sx, y: slotsY + 17, textAnchor: "middle", fill: color, fontSize: 9, children: [
5972
+ slot.name,
5973
+ ": ",
5974
+ slot.pattern
5975
+ ] })
5976
+ ] }, `slot-${i}`);
5977
+ })
5978
+ ] }),
5979
+ (hasEffects || hasSlots) && /* @__PURE__ */ jsxRuntime.jsx(
5980
+ "line",
5981
+ {
5982
+ x1: CX2,
5983
+ y1: hasSlots ? slotsY + slotsH : effectsY + effectsH - 10,
5984
+ x2: CX2,
5985
+ y2: toY - 2,
5986
+ stroke: color,
5987
+ strokeWidth: 1.5,
5988
+ opacity: 0.4,
5989
+ markerEnd: "url(#transArrow)"
5990
+ }
5991
+ ),
5992
+ /* @__PURE__ */ jsxRuntime.jsx(AvlState, { x: CX2 - STATE_W2 / 2, y: toY, width: STATE_W2, height: STATE_H2, name: data.to, color })
5993
+ ] });
5994
+ };
5995
+ AvlTransitionScene.displayName = "AvlTransitionScene";
5996
+ var APPLICATION_ITEMS = [
5997
+ {
5998
+ label: "Orbital",
5999
+ render: (x, y, c) => /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: x, cy: y, r: 8, fill: "none", stroke: c, strokeWidth: 1.5 })
6000
+ },
6001
+ {
6002
+ label: "Entity",
6003
+ render: (x, y, c) => /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
6004
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: x, cy: y, r: 5, fill: c, opacity: 0.2 }),
6005
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: x, cy: y, r: 5, fill: "none", stroke: c, strokeWidth: 1.5 })
6006
+ ] })
6007
+ },
6008
+ {
6009
+ label: "Trait",
6010
+ render: (x, y, c) => /* @__PURE__ */ jsxRuntime.jsx("ellipse", { cx: x, cy: y, rx: 10, ry: 5, fill: "none", stroke: c, strokeWidth: 1, strokeDasharray: "3 1.5" })
6011
+ },
6012
+ {
6013
+ label: "Page",
6014
+ render: (x, y, c) => /* @__PURE__ */ jsxRuntime.jsx("rect", { x: x - 3, y: y - 3, width: 6, height: 6, fill: c, opacity: 0.3, stroke: c, strokeWidth: 1 })
6015
+ },
6016
+ {
6017
+ label: "Event flow",
6018
+ render: (x, y, c) => /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
6019
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: x - 10, y1: y, x2: x + 10, y2: y, stroke: c, strokeWidth: 1, strokeDasharray: "4 2" }),
6020
+ /* @__PURE__ */ jsxRuntime.jsx("polygon", { points: `${x + 10},${y} ${x + 6},${y - 3} ${x + 6},${y + 3}`, fill: c, opacity: 0.5 })
6021
+ ] })
6022
+ }
6023
+ ];
6024
+ var ORBITAL_ITEMS = [
6025
+ {
6026
+ label: "Orbital boundary",
6027
+ render: (x, y, c) => /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: x, cy: y, r: 8, fill: "none", stroke: c, strokeWidth: 1.5 })
6028
+ },
6029
+ {
6030
+ label: "Entity (nucleus)",
6031
+ render: (x, y, c) => /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
6032
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: x, cy: y, r: 5, fill: c, opacity: 0.15 }),
6033
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: x, cy: y, r: 5, fill: "none", stroke: c, strokeWidth: 2 }),
6034
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: x, y1: y - 7, x2: x, y2: y - 9, stroke: c, strokeWidth: 0.8, opacity: 0.5 })
6035
+ ] })
6036
+ },
6037
+ {
6038
+ label: "Trait ring",
6039
+ render: (x, y, c) => /* @__PURE__ */ jsxRuntime.jsx("ellipse", { cx: x, cy: y, rx: 10, ry: 5, fill: "none", stroke: c, strokeWidth: 1, strokeDasharray: "3 1.5" })
6040
+ },
6041
+ {
6042
+ label: "Page",
6043
+ render: (x, y, c) => /* @__PURE__ */ jsxRuntime.jsx("rect", { x: x - 3, y: y - 3, width: 6, height: 6, fill: c, opacity: 0.3, stroke: c, strokeWidth: 1 })
6044
+ },
6045
+ {
6046
+ label: "External link",
6047
+ render: (x, y, c) => /* @__PURE__ */ jsxRuntime.jsx("line", { x1: x - 8, y1: y, x2: x + 8, y2: y, stroke: c, strokeWidth: 1, strokeDasharray: "4 2", opacity: 0.4 })
6048
+ }
6049
+ ];
6050
+ var TRAIT_ITEMS = [
6051
+ {
6052
+ label: "State",
6053
+ render: (x, y, c) => /* @__PURE__ */ jsxRuntime.jsx("rect", { x: x - 12, y: y - 6, width: 24, height: 12, rx: 6, fill: "none", stroke: c, strokeWidth: 1.5 })
6054
+ },
6055
+ {
6056
+ label: "Initial state",
6057
+ render: (x, y, c) => /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
6058
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: x - 10, cy: y, r: 3, fill: c }),
6059
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: x - 4, y: y - 6, width: 20, height: 12, rx: 6, fill: "none", stroke: c, strokeWidth: 1.5 })
6060
+ ] })
6061
+ },
6062
+ {
6063
+ label: "Transition",
6064
+ render: (x, y, c) => /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
6065
+ /* @__PURE__ */ jsxRuntime.jsx("line", { x1: x - 10, y1: y, x2: x + 8, y2: y, stroke: c, strokeWidth: 1.2, opacity: 0.5 }),
6066
+ /* @__PURE__ */ jsxRuntime.jsx("polygon", { points: `${x + 10},${y} ${x + 6},${y - 3} ${x + 6},${y + 3}`, fill: c, opacity: 0.5 })
6067
+ ] })
6068
+ },
6069
+ {
6070
+ label: "Event + effects",
6071
+ render: (x, y, c) => /* @__PURE__ */ jsxRuntime.jsx("rect", { x: x - 14, y: y - 7, width: 28, height: 14, rx: 3, fill: "var(--color-surface, white)", stroke: c, strokeWidth: 0.8 })
6072
+ },
6073
+ {
6074
+ label: "Emit (external)",
6075
+ render: (x, y, c) => /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: x, cy: y, r: 3, fill: c, opacity: 0.5, children: /* @__PURE__ */ jsxRuntime.jsx("animate", { attributeName: "r", values: "2;4;2", dur: "1.5s", repeatCount: "indefinite" }) })
6076
+ }
6077
+ ];
6078
+ var TRANSITION_ITEMS = [
6079
+ {
6080
+ label: "State",
6081
+ render: (x, y, c) => /* @__PURE__ */ jsxRuntime.jsx("rect", { x: x - 12, y: y - 6, width: 24, height: 12, rx: 6, fill: "none", stroke: c, strokeWidth: 1.5 })
6082
+ },
6083
+ {
6084
+ label: "Effect",
6085
+ render: (x, y, c) => /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
6086
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: x, cy: y, r: 5, fill: c, opacity: 0.15 }),
6087
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: x, cy: y, r: 5, fill: "none", stroke: c, strokeWidth: 1 })
6088
+ ] })
6089
+ },
6090
+ {
6091
+ label: "Slot target",
6092
+ render: (x, y, c) => /* @__PURE__ */ jsxRuntime.jsx("rect", { x: x - 10, y: y - 5, width: 20, height: 10, rx: 2, fill: c, opacity: 0.1, stroke: c, strokeWidth: 0.8 })
6093
+ },
6094
+ {
6095
+ label: "Binding (@path)",
6096
+ render: (x, y, c) => /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: x, cy: y, r: 5, fill: "none", stroke: c, strokeWidth: 1, strokeDasharray: "2 1.5", opacity: 0.6 })
6097
+ }
6098
+ ];
6099
+ var ITEMS_BY_LEVEL = {
6100
+ application: APPLICATION_ITEMS,
6101
+ orbital: ORBITAL_ITEMS,
6102
+ trait: TRAIT_ITEMS,
6103
+ transition: TRANSITION_ITEMS
6104
+ };
6105
+ var AvlLegend = ({
6106
+ level,
6107
+ color = "var(--color-primary)",
6108
+ x = 10,
6109
+ y = 360
6110
+ }) => {
6111
+ const items = ITEMS_BY_LEVEL[level];
6112
+ const itemSpacing = 16;
6113
+ const legendH = items.length * itemSpacing + 16;
6114
+ return /* @__PURE__ */ jsxRuntime.jsxs("g", { opacity: 0.6, children: [
6115
+ /* @__PURE__ */ jsxRuntime.jsx(
6116
+ "rect",
6117
+ {
6118
+ x,
6119
+ y: y - legendH + 10,
6120
+ width: 130,
6121
+ height: legendH,
6122
+ rx: 6,
6123
+ fill: "var(--color-surface, white)",
6124
+ stroke: color,
6125
+ strokeWidth: 0.5,
6126
+ opacity: 0.8
6127
+ }
6128
+ ),
6129
+ items.map((item, i) => {
6130
+ const iy = y - legendH + 22 + i * itemSpacing;
6131
+ return /* @__PURE__ */ jsxRuntime.jsxs("g", { children: [
6132
+ item.render(x + 18, iy, color),
6133
+ /* @__PURE__ */ jsxRuntime.jsx(
6134
+ "text",
6135
+ {
6136
+ x: x + 35,
6137
+ y: iy + 4,
6138
+ fill: color,
6139
+ fontSize: 8,
6140
+ opacity: 0.8,
6141
+ children: item.label
6142
+ }
6143
+ )
6144
+ ] }, item.label);
6145
+ })
6146
+ ] });
6147
+ };
6148
+ AvlLegend.displayName = "AvlLegend";
6149
+ var VIEWBOX_W = 600;
6150
+ var VIEWBOX_H = 400;
6151
+ var ANIMATION_DURATION = 600;
6152
+ var AvlCosmicZoom = ({
6153
+ schema: schemaProp,
6154
+ className,
6155
+ color = "var(--color-primary)",
6156
+ animated = true,
6157
+ initialOrbital,
6158
+ initialTrait,
6159
+ onZoomChange,
6160
+ width = "100%",
6161
+ height = 400,
6162
+ stateCoverage
6163
+ }) => {
6164
+ const schema = React6.useMemo(() => {
6165
+ if (typeof schemaProp === "string") {
6166
+ try {
6167
+ return JSON.parse(schemaProp);
6168
+ } catch {
6169
+ return { name: "Error", orbitals: [] };
6170
+ }
6171
+ }
6172
+ return schemaProp;
6173
+ }, [schemaProp]);
6174
+ const [state, dispatch] = React6.useReducer(zoomReducer, initialZoomState);
6175
+ const sceneRef = React6.useRef(null);
6176
+ const [transitionStyle, setTransitionStyle] = React6.useState({});
6177
+ React6.useEffect(() => {
6178
+ if (initialOrbital) {
6179
+ dispatch({ type: "ZOOM_INTO_ORBITAL", orbital: initialOrbital, targetPosition: { x: VIEWBOX_W / 2, y: VIEWBOX_H / 2 } });
6180
+ setTimeout(() => dispatch({ type: "ANIMATION_COMPLETE" }), 0);
6181
+ if (initialTrait) {
6182
+ setTimeout(() => {
6183
+ dispatch({ type: "ZOOM_INTO_TRAIT", trait: initialTrait, targetPosition: { x: VIEWBOX_W / 2, y: VIEWBOX_H / 2 } });
6184
+ setTimeout(() => dispatch({ type: "ANIMATION_COMPLETE" }), 0);
6185
+ }, 10);
6186
+ }
6187
+ }
6188
+ }, [initialOrbital, initialTrait]);
6189
+ React6.useEffect(() => {
6190
+ onZoomChange?.(state.level, {
6191
+ orbital: state.selectedOrbital ?? void 0,
6192
+ trait: state.selectedTrait ?? void 0
6193
+ });
6194
+ }, [state.level, state.selectedOrbital, state.selectedTrait, onZoomChange]);
6195
+ React6.useEffect(() => {
6196
+ if (!state.animating || !animated) {
6197
+ if (state.animating) {
6198
+ dispatch({ type: "ANIMATION_COMPLETE" });
6199
+ }
6200
+ setTransitionStyle({});
6201
+ return;
6202
+ }
6203
+ const target = state.animationTarget;
6204
+ if (!target) return;
6205
+ if (state.animationDirection === "in") {
6206
+ setTransitionStyle({
6207
+ transform: `scale(${target.scale}) translate(${-(target.x - VIEWBOX_W / 2)}px, ${-(target.y - VIEWBOX_H / 2)}px)`,
6208
+ transformOrigin: `${target.x}px ${target.y}px`,
6209
+ transition: `transform ${ANIMATION_DURATION}ms cubic-bezier(0.4, 0, 0.2, 1), opacity ${ANIMATION_DURATION}ms ease`,
6210
+ opacity: 0.3
6211
+ });
6212
+ } else {
6213
+ setTransitionStyle({
6214
+ transform: `scale(${target.scale})`,
6215
+ transformOrigin: "center center",
6216
+ transition: `transform ${ANIMATION_DURATION}ms cubic-bezier(0.4, 0, 0.2, 1), opacity ${ANIMATION_DURATION}ms ease`,
6217
+ opacity: 0.3
6218
+ });
6219
+ }
6220
+ const timer = setTimeout(() => {
6221
+ dispatch({ type: "ANIMATION_COMPLETE" });
6222
+ setTransitionStyle({});
6223
+ }, ANIMATION_DURATION);
6224
+ return () => clearTimeout(timer);
6225
+ }, [state.animating, state.animationDirection, state.animationTarget, animated]);
6226
+ const handleKeyDown = React6.useCallback((e) => {
6227
+ if (e.key === "Escape") {
6228
+ dispatch({ type: "ZOOM_OUT" });
6229
+ }
6230
+ }, []);
6231
+ const handleOrbitalClick = React6.useCallback((name, pos) => {
6232
+ dispatch({ type: "ZOOM_INTO_ORBITAL", orbital: name, targetPosition: pos });
6233
+ }, []);
6234
+ const handleTraitClick = React6.useCallback((name, pos) => {
6235
+ dispatch({ type: "ZOOM_INTO_TRAIT", trait: name, targetPosition: pos });
6236
+ }, []);
6237
+ const handleTransitionClick = React6.useCallback((index, pos) => {
6238
+ dispatch({ type: "ZOOM_INTO_TRANSITION", transitionIndex: index, targetPosition: pos });
6239
+ }, []);
6240
+ const handleBreadcrumbClick = React6.useCallback((targetLevel) => {
6241
+ const levelOrder = ["application", "orbital", "trait", "transition"];
6242
+ const currentIdx = levelOrder.indexOf(state.level);
6243
+ const targetIdx = levelOrder.indexOf(targetLevel);
6244
+ if (targetIdx < currentIdx) {
6245
+ dispatch({ type: "ZOOM_OUT" });
6246
+ }
6247
+ }, [state.level]);
6248
+ const sceneContent = React6.useMemo(() => {
6249
+ switch (state.level) {
6250
+ case "application": {
6251
+ const data = parseApplicationLevel(schema);
6252
+ return /* @__PURE__ */ jsxRuntime.jsx(
6253
+ AvlApplicationScene,
6254
+ {
6255
+ data,
6256
+ color,
6257
+ onOrbitalClick: handleOrbitalClick
6258
+ }
6259
+ );
6260
+ }
6261
+ case "orbital": {
6262
+ if (!state.selectedOrbital) return null;
6263
+ const data = parseOrbitalLevel(schema, state.selectedOrbital);
6264
+ if (!data) return null;
6265
+ return /* @__PURE__ */ jsxRuntime.jsx(
6266
+ AvlOrbitalScene,
6267
+ {
6268
+ data,
6269
+ color,
6270
+ onTraitClick: handleTraitClick
6271
+ }
6272
+ );
6273
+ }
6274
+ case "trait": {
6275
+ if (!state.selectedOrbital || !state.selectedTrait) return null;
6276
+ const data = parseTraitLevel(schema, state.selectedOrbital, state.selectedTrait);
6277
+ if (!data) return null;
6278
+ return /* @__PURE__ */ jsxRuntime.jsx(
6279
+ AvlTraitScene,
6280
+ {
6281
+ data,
6282
+ color,
6283
+ onTransitionClick: handleTransitionClick
6284
+ }
6285
+ );
6286
+ }
6287
+ case "transition": {
6288
+ if (!state.selectedOrbital || !state.selectedTrait || state.selectedTransition === null) return null;
6289
+ const data = parseTransitionLevel(schema, state.selectedOrbital, state.selectedTrait, state.selectedTransition);
6290
+ if (!data) return null;
6291
+ return /* @__PURE__ */ jsxRuntime.jsx(
6292
+ AvlTransitionScene,
6293
+ {
6294
+ data,
6295
+ color
6296
+ }
6297
+ );
6298
+ }
6299
+ default:
6300
+ return null;
6301
+ }
6302
+ }, [state.level, state.selectedOrbital, state.selectedTrait, state.selectedTransition, schema, color, handleOrbitalClick, handleTraitClick, handleTransitionClick]);
6303
+ const breadcrumbs = getBreadcrumbs(state);
6304
+ return /* @__PURE__ */ jsxRuntime.jsxs(
6305
+ Box,
6306
+ {
6307
+ className: `relative ${className ?? ""}`,
6308
+ style: { width, height: typeof height === "number" ? `${height}px` : height },
6309
+ onKeyDown: handleKeyDown,
6310
+ tabIndex: 0,
6311
+ children: [
6312
+ /* @__PURE__ */ jsxRuntime.jsx(
6313
+ HStack,
6314
+ {
6315
+ gap: "xs",
6316
+ align: "center",
6317
+ className: "absolute top-2 left-2 z-10 bg-[var(--color-surface)]/80 backdrop-blur rounded-md px-3 py-1.5",
6318
+ children: breadcrumbs.map((crumb, i) => /* @__PURE__ */ jsxRuntime.jsxs(React6__default.default.Fragment, { children: [
6319
+ i > 0 && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "muted", className: "mx-1", children: "/" }),
6320
+ i < breadcrumbs.length - 1 ? /* @__PURE__ */ jsxRuntime.jsx(
6321
+ Box,
6322
+ {
6323
+ as: "span",
6324
+ className: "cursor-pointer hover:underline",
6325
+ onClick: () => handleBreadcrumbClick(crumb.level),
6326
+ children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "muted", children: crumb.label })
6327
+ }
6328
+ ) : /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "small", color: "primary", className: "font-bold", children: crumb.label })
6329
+ ] }, crumb.level))
6330
+ }
6331
+ ),
6332
+ state.level !== "application" && /* @__PURE__ */ jsxRuntime.jsx(
6333
+ Typography,
6334
+ {
6335
+ variant: "small",
6336
+ color: "muted",
6337
+ className: "absolute bottom-2 right-2 z-10 bg-[var(--color-surface)]/60 backdrop-blur rounded px-2 py-1",
6338
+ children: "Press Esc to zoom out"
6339
+ }
6340
+ ),
6341
+ /* @__PURE__ */ jsxRuntime.jsxs(
6342
+ "svg",
6343
+ {
6344
+ viewBox: `0 0 ${VIEWBOX_W} ${VIEWBOX_H}`,
6345
+ xmlns: "http://www.w3.org/2000/svg",
6346
+ className: "w-full h-full",
6347
+ role: "img",
6348
+ "aria-label": `${schema.name} orbital visualization - ${state.level} level`,
6349
+ children: [
6350
+ /* @__PURE__ */ jsxRuntime.jsx("g", { ref: sceneRef, style: transitionStyle, children: sceneContent }),
6351
+ /* @__PURE__ */ jsxRuntime.jsx(AvlLegend, { level: state.level, color })
6352
+ ]
6353
+ }
6354
+ )
6355
+ ]
6356
+ }
6357
+ );
6358
+ };
6359
+ AvlCosmicZoom.displayName = "AvlCosmicZoom";
6360
+
1897
6361
  exports.AVL_FIELD_TYPE_SHAPES = AVL_FIELD_TYPE_SHAPES;
1898
6362
  exports.AVL_OPERATOR_COLORS = AVL_OPERATOR_COLORS;
1899
6363
  exports.AvlApplication = AvlApplication;
6364
+ exports.AvlApplicationScene = AvlApplicationScene;
1900
6365
  exports.AvlBinding = AvlBinding;
1901
6366
  exports.AvlBindingRef = AvlBindingRef;
6367
+ exports.AvlClickTarget = AvlClickTarget;
1902
6368
  exports.AvlClosedCircuit = AvlClosedCircuit;
6369
+ exports.AvlCosmicZoom = AvlCosmicZoom;
1903
6370
  exports.AvlEffect = AvlEffect;
1904
6371
  exports.AvlEmitListen = AvlEmitListen;
1905
6372
  exports.AvlEntity = AvlEntity;
@@ -1911,6 +6378,7 @@ exports.AvlGuard = AvlGuard;
1911
6378
  exports.AvlLiteral = AvlLiteral;
1912
6379
  exports.AvlOperator = AvlOperator;
1913
6380
  exports.AvlOrbital = AvlOrbital;
6381
+ exports.AvlOrbitalScene = AvlOrbitalScene;
1914
6382
  exports.AvlOrbitalUnit = AvlOrbitalUnit;
1915
6383
  exports.AvlPage = AvlPage;
1916
6384
  exports.AvlPersistence = AvlPersistence;
@@ -1919,9 +6387,15 @@ exports.AvlSlotMap = AvlSlotMap;
1919
6387
  exports.AvlState = AvlState;
1920
6388
  exports.AvlStateMachine = AvlStateMachine;
1921
6389
  exports.AvlTrait = AvlTrait;
6390
+ exports.AvlTraitScene = AvlTraitScene;
1922
6391
  exports.AvlTransition = AvlTransition;
6392
+ exports.AvlTransitionScene = AvlTransitionScene;
1923
6393
  exports.arcPath = arcPath;
1924
6394
  exports.curveControlPoint = curveControlPoint;
1925
6395
  exports.gridPositions = gridPositions;
6396
+ exports.parseApplicationLevel = parseApplicationLevel;
6397
+ exports.parseOrbitalLevel = parseOrbitalLevel;
6398
+ exports.parseTraitLevel = parseTraitLevel;
6399
+ exports.parseTransitionLevel = parseTransitionLevel;
1926
6400
  exports.radialPositions = radialPositions;
1927
6401
  exports.ringPositions = ringPositions;