@almadar/ui 2.27.3 → 2.27.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/components/atoms/flow/FlowLabel.d.ts +23 -0
  2. package/dist/components/atoms/flow/FlowMinimap.d.ts +28 -0
  3. package/dist/components/atoms/flow/FlowNodeShell.d.ts +25 -0
  4. package/dist/components/atoms/flow/FlowPort.d.ts +26 -0
  5. package/dist/components/atoms/flow/FlowWire.d.ts +39 -0
  6. package/dist/components/atoms/flow/index.d.ts +13 -0
  7. package/dist/components/atoms/index.d.ts +1 -0
  8. package/dist/components/index.cjs +1744 -1017
  9. package/dist/components/index.js +853 -141
  10. package/dist/components/molecules/avl/AvlBehaviorGlyph.d.ts +61 -0
  11. package/dist/components/molecules/avl/index.d.ts +1 -0
  12. package/dist/components/molecules/flow/BehaviorNode.d.ts +28 -0
  13. package/dist/components/molecules/flow/EffectNode.d.ts +26 -0
  14. package/dist/components/molecules/flow/EventWireEdge.d.ts +23 -0
  15. package/dist/components/molecules/flow/ExprNode.d.ts +27 -0
  16. package/dist/components/molecules/flow/FlowStateNode.d.ts +18 -0
  17. package/dist/components/molecules/flow/NodePalette.d.ts +36 -0
  18. package/dist/components/molecules/flow/OrbitalNode.d.ts +31 -0
  19. package/dist/components/molecules/flow/TransitionEdge.d.ts +26 -0
  20. package/dist/components/molecules/flow/index.d.ts +8 -0
  21. package/dist/components/molecules/index.d.ts +1 -0
  22. package/dist/flow/index.cjs +3832 -0
  23. package/dist/flow/index.d.cts +367 -0
  24. package/dist/flow/index.d.ts +10 -0
  25. package/dist/flow/index.js +3793 -0
  26. package/dist/providers/index.cjs +145 -143
  27. package/dist/providers/index.js +43 -41
  28. package/dist/runtime/index.cjs +978 -920
  29. package/dist/runtime/index.js +204 -146
  30. package/package.json +7 -1
@@ -0,0 +1,3832 @@
1
+ 'use strict';
2
+
3
+ var React2 = require('react');
4
+ var jsxRuntime = require('react/jsx-runtime');
5
+ var LucideIcons = require('lucide-react');
6
+ var react = require('@xyflow/react');
7
+
8
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
+
10
+ function _interopNamespace(e) {
11
+ if (e && e.__esModule) return e;
12
+ var n = Object.create(null);
13
+ if (e) {
14
+ Object.keys(e).forEach(function (k) {
15
+ if (k !== 'default') {
16
+ var d = Object.getOwnPropertyDescriptor(e, k);
17
+ Object.defineProperty(n, k, d.get ? d : {
18
+ enumerable: true,
19
+ get: function () { return e[k]; }
20
+ });
21
+ }
22
+ });
23
+ }
24
+ n.default = e;
25
+ return Object.freeze(n);
26
+ }
27
+
28
+ var React2__default = /*#__PURE__*/_interopDefault(React2);
29
+ var LucideIcons__namespace = /*#__PURE__*/_interopNamespace(LucideIcons);
30
+
31
+ // node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs
32
+ function r(e) {
33
+ var t, f, n = "";
34
+ if ("string" == typeof e || "number" == typeof e) n += e;
35
+ else if ("object" == typeof e) if (Array.isArray(e)) {
36
+ var o = e.length;
37
+ for (t = 0; t < o; t++) e[t] && (f = r(e[t])) && (n && (n += " "), n += f);
38
+ } else for (f in e) e[f] && (n && (n += " "), n += f);
39
+ return n;
40
+ }
41
+ function clsx() {
42
+ for (var e, t, f = 0, n = "", o = arguments.length; f < o; f++) (e = arguments[f]) && (t = r(e)) && (n && (n += " "), n += t);
43
+ return n;
44
+ }
45
+
46
+ // node_modules/.pnpm/tailwind-merge@2.6.1/node_modules/tailwind-merge/dist/bundle-mjs.mjs
47
+ var CLASS_PART_SEPARATOR = "-";
48
+ var createClassGroupUtils = (config) => {
49
+ const classMap = createClassMap(config);
50
+ const {
51
+ conflictingClassGroups,
52
+ conflictingClassGroupModifiers
53
+ } = config;
54
+ const getClassGroupId = (className) => {
55
+ const classParts = className.split(CLASS_PART_SEPARATOR);
56
+ if (classParts[0] === "" && classParts.length !== 1) {
57
+ classParts.shift();
58
+ }
59
+ return getGroupRecursive(classParts, classMap) || getGroupIdForArbitraryProperty(className);
60
+ };
61
+ const getConflictingClassGroupIds = (classGroupId, hasPostfixModifier) => {
62
+ const conflicts = conflictingClassGroups[classGroupId] || [];
63
+ if (hasPostfixModifier && conflictingClassGroupModifiers[classGroupId]) {
64
+ return [...conflicts, ...conflictingClassGroupModifiers[classGroupId]];
65
+ }
66
+ return conflicts;
67
+ };
68
+ return {
69
+ getClassGroupId,
70
+ getConflictingClassGroupIds
71
+ };
72
+ };
73
+ var getGroupRecursive = (classParts, classPartObject) => {
74
+ if (classParts.length === 0) {
75
+ return classPartObject.classGroupId;
76
+ }
77
+ const currentClassPart = classParts[0];
78
+ const nextClassPartObject = classPartObject.nextPart.get(currentClassPart);
79
+ const classGroupFromNextClassPart = nextClassPartObject ? getGroupRecursive(classParts.slice(1), nextClassPartObject) : void 0;
80
+ if (classGroupFromNextClassPart) {
81
+ return classGroupFromNextClassPart;
82
+ }
83
+ if (classPartObject.validators.length === 0) {
84
+ return void 0;
85
+ }
86
+ const classRest = classParts.join(CLASS_PART_SEPARATOR);
87
+ return classPartObject.validators.find(({
88
+ validator
89
+ }) => validator(classRest))?.classGroupId;
90
+ };
91
+ var arbitraryPropertyRegex = /^\[(.+)\]$/;
92
+ var getGroupIdForArbitraryProperty = (className) => {
93
+ if (arbitraryPropertyRegex.test(className)) {
94
+ const arbitraryPropertyClassName = arbitraryPropertyRegex.exec(className)[1];
95
+ const property = arbitraryPropertyClassName?.substring(0, arbitraryPropertyClassName.indexOf(":"));
96
+ if (property) {
97
+ return "arbitrary.." + property;
98
+ }
99
+ }
100
+ };
101
+ var createClassMap = (config) => {
102
+ const {
103
+ theme,
104
+ prefix
105
+ } = config;
106
+ const classMap = {
107
+ nextPart: /* @__PURE__ */ new Map(),
108
+ validators: []
109
+ };
110
+ const prefixedClassGroupEntries = getPrefixedClassGroupEntries(Object.entries(config.classGroups), prefix);
111
+ prefixedClassGroupEntries.forEach(([classGroupId, classGroup]) => {
112
+ processClassesRecursively(classGroup, classMap, classGroupId, theme);
113
+ });
114
+ return classMap;
115
+ };
116
+ var processClassesRecursively = (classGroup, classPartObject, classGroupId, theme) => {
117
+ classGroup.forEach((classDefinition) => {
118
+ if (typeof classDefinition === "string") {
119
+ const classPartObjectToEdit = classDefinition === "" ? classPartObject : getPart(classPartObject, classDefinition);
120
+ classPartObjectToEdit.classGroupId = classGroupId;
121
+ return;
122
+ }
123
+ if (typeof classDefinition === "function") {
124
+ if (isThemeGetter(classDefinition)) {
125
+ processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme);
126
+ return;
127
+ }
128
+ classPartObject.validators.push({
129
+ validator: classDefinition,
130
+ classGroupId
131
+ });
132
+ return;
133
+ }
134
+ Object.entries(classDefinition).forEach(([key, classGroup2]) => {
135
+ processClassesRecursively(classGroup2, getPart(classPartObject, key), classGroupId, theme);
136
+ });
137
+ });
138
+ };
139
+ var getPart = (classPartObject, path) => {
140
+ let currentClassPartObject = classPartObject;
141
+ path.split(CLASS_PART_SEPARATOR).forEach((pathPart) => {
142
+ if (!currentClassPartObject.nextPart.has(pathPart)) {
143
+ currentClassPartObject.nextPart.set(pathPart, {
144
+ nextPart: /* @__PURE__ */ new Map(),
145
+ validators: []
146
+ });
147
+ }
148
+ currentClassPartObject = currentClassPartObject.nextPart.get(pathPart);
149
+ });
150
+ return currentClassPartObject;
151
+ };
152
+ var isThemeGetter = (func) => func.isThemeGetter;
153
+ var getPrefixedClassGroupEntries = (classGroupEntries, prefix) => {
154
+ if (!prefix) {
155
+ return classGroupEntries;
156
+ }
157
+ return classGroupEntries.map(([classGroupId, classGroup]) => {
158
+ const prefixedClassGroup = classGroup.map((classDefinition) => {
159
+ if (typeof classDefinition === "string") {
160
+ return prefix + classDefinition;
161
+ }
162
+ if (typeof classDefinition === "object") {
163
+ return Object.fromEntries(Object.entries(classDefinition).map(([key, value]) => [prefix + key, value]));
164
+ }
165
+ return classDefinition;
166
+ });
167
+ return [classGroupId, prefixedClassGroup];
168
+ });
169
+ };
170
+ var createLruCache = (maxCacheSize) => {
171
+ if (maxCacheSize < 1) {
172
+ return {
173
+ get: () => void 0,
174
+ set: () => {
175
+ }
176
+ };
177
+ }
178
+ let cacheSize = 0;
179
+ let cache = /* @__PURE__ */ new Map();
180
+ let previousCache = /* @__PURE__ */ new Map();
181
+ const update = (key, value) => {
182
+ cache.set(key, value);
183
+ cacheSize++;
184
+ if (cacheSize > maxCacheSize) {
185
+ cacheSize = 0;
186
+ previousCache = cache;
187
+ cache = /* @__PURE__ */ new Map();
188
+ }
189
+ };
190
+ return {
191
+ get(key) {
192
+ let value = cache.get(key);
193
+ if (value !== void 0) {
194
+ return value;
195
+ }
196
+ if ((value = previousCache.get(key)) !== void 0) {
197
+ update(key, value);
198
+ return value;
199
+ }
200
+ },
201
+ set(key, value) {
202
+ if (cache.has(key)) {
203
+ cache.set(key, value);
204
+ } else {
205
+ update(key, value);
206
+ }
207
+ }
208
+ };
209
+ };
210
+ var IMPORTANT_MODIFIER = "!";
211
+ var createParseClassName = (config) => {
212
+ const {
213
+ separator,
214
+ experimentalParseClassName
215
+ } = config;
216
+ const isSeparatorSingleCharacter = separator.length === 1;
217
+ const firstSeparatorCharacter = separator[0];
218
+ const separatorLength = separator.length;
219
+ const parseClassName = (className) => {
220
+ const modifiers = [];
221
+ let bracketDepth = 0;
222
+ let modifierStart = 0;
223
+ let postfixModifierPosition;
224
+ for (let index = 0; index < className.length; index++) {
225
+ let currentCharacter = className[index];
226
+ if (bracketDepth === 0) {
227
+ if (currentCharacter === firstSeparatorCharacter && (isSeparatorSingleCharacter || className.slice(index, index + separatorLength) === separator)) {
228
+ modifiers.push(className.slice(modifierStart, index));
229
+ modifierStart = index + separatorLength;
230
+ continue;
231
+ }
232
+ if (currentCharacter === "/") {
233
+ postfixModifierPosition = index;
234
+ continue;
235
+ }
236
+ }
237
+ if (currentCharacter === "[") {
238
+ bracketDepth++;
239
+ } else if (currentCharacter === "]") {
240
+ bracketDepth--;
241
+ }
242
+ }
243
+ const baseClassNameWithImportantModifier = modifiers.length === 0 ? className : className.substring(modifierStart);
244
+ const hasImportantModifier = baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER);
245
+ const baseClassName = hasImportantModifier ? baseClassNameWithImportantModifier.substring(1) : baseClassNameWithImportantModifier;
246
+ const maybePostfixModifierPosition = postfixModifierPosition && postfixModifierPosition > modifierStart ? postfixModifierPosition - modifierStart : void 0;
247
+ return {
248
+ modifiers,
249
+ hasImportantModifier,
250
+ baseClassName,
251
+ maybePostfixModifierPosition
252
+ };
253
+ };
254
+ if (experimentalParseClassName) {
255
+ return (className) => experimentalParseClassName({
256
+ className,
257
+ parseClassName
258
+ });
259
+ }
260
+ return parseClassName;
261
+ };
262
+ var sortModifiers = (modifiers) => {
263
+ if (modifiers.length <= 1) {
264
+ return modifiers;
265
+ }
266
+ const sortedModifiers = [];
267
+ let unsortedModifiers = [];
268
+ modifiers.forEach((modifier) => {
269
+ const isArbitraryVariant = modifier[0] === "[";
270
+ if (isArbitraryVariant) {
271
+ sortedModifiers.push(...unsortedModifiers.sort(), modifier);
272
+ unsortedModifiers = [];
273
+ } else {
274
+ unsortedModifiers.push(modifier);
275
+ }
276
+ });
277
+ sortedModifiers.push(...unsortedModifiers.sort());
278
+ return sortedModifiers;
279
+ };
280
+ var createConfigUtils = (config) => ({
281
+ cache: createLruCache(config.cacheSize),
282
+ parseClassName: createParseClassName(config),
283
+ ...createClassGroupUtils(config)
284
+ });
285
+ var SPLIT_CLASSES_REGEX = /\s+/;
286
+ var mergeClassList = (classList, configUtils) => {
287
+ const {
288
+ parseClassName,
289
+ getClassGroupId,
290
+ getConflictingClassGroupIds
291
+ } = configUtils;
292
+ const classGroupsInConflict = [];
293
+ const classNames = classList.trim().split(SPLIT_CLASSES_REGEX);
294
+ let result = "";
295
+ for (let index = classNames.length - 1; index >= 0; index -= 1) {
296
+ const originalClassName = classNames[index];
297
+ const {
298
+ modifiers,
299
+ hasImportantModifier,
300
+ baseClassName,
301
+ maybePostfixModifierPosition
302
+ } = parseClassName(originalClassName);
303
+ let hasPostfixModifier = Boolean(maybePostfixModifierPosition);
304
+ let classGroupId = getClassGroupId(hasPostfixModifier ? baseClassName.substring(0, maybePostfixModifierPosition) : baseClassName);
305
+ if (!classGroupId) {
306
+ if (!hasPostfixModifier) {
307
+ result = originalClassName + (result.length > 0 ? " " + result : result);
308
+ continue;
309
+ }
310
+ classGroupId = getClassGroupId(baseClassName);
311
+ if (!classGroupId) {
312
+ result = originalClassName + (result.length > 0 ? " " + result : result);
313
+ continue;
314
+ }
315
+ hasPostfixModifier = false;
316
+ }
317
+ const variantModifier = sortModifiers(modifiers).join(":");
318
+ const modifierId = hasImportantModifier ? variantModifier + IMPORTANT_MODIFIER : variantModifier;
319
+ const classId = modifierId + classGroupId;
320
+ if (classGroupsInConflict.includes(classId)) {
321
+ continue;
322
+ }
323
+ classGroupsInConflict.push(classId);
324
+ const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier);
325
+ for (let i = 0; i < conflictGroups.length; ++i) {
326
+ const group = conflictGroups[i];
327
+ classGroupsInConflict.push(modifierId + group);
328
+ }
329
+ result = originalClassName + (result.length > 0 ? " " + result : result);
330
+ }
331
+ return result;
332
+ };
333
+ function twJoin() {
334
+ let index = 0;
335
+ let argument;
336
+ let resolvedValue;
337
+ let string = "";
338
+ while (index < arguments.length) {
339
+ if (argument = arguments[index++]) {
340
+ if (resolvedValue = toValue(argument)) {
341
+ string && (string += " ");
342
+ string += resolvedValue;
343
+ }
344
+ }
345
+ }
346
+ return string;
347
+ }
348
+ var toValue = (mix) => {
349
+ if (typeof mix === "string") {
350
+ return mix;
351
+ }
352
+ let resolvedValue;
353
+ let string = "";
354
+ for (let k = 0; k < mix.length; k++) {
355
+ if (mix[k]) {
356
+ if (resolvedValue = toValue(mix[k])) {
357
+ string && (string += " ");
358
+ string += resolvedValue;
359
+ }
360
+ }
361
+ }
362
+ return string;
363
+ };
364
+ function createTailwindMerge(createConfigFirst, ...createConfigRest) {
365
+ let configUtils;
366
+ let cacheGet;
367
+ let cacheSet;
368
+ let functionToCall = initTailwindMerge;
369
+ function initTailwindMerge(classList) {
370
+ const config = createConfigRest.reduce((previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig), createConfigFirst());
371
+ configUtils = createConfigUtils(config);
372
+ cacheGet = configUtils.cache.get;
373
+ cacheSet = configUtils.cache.set;
374
+ functionToCall = tailwindMerge;
375
+ return tailwindMerge(classList);
376
+ }
377
+ function tailwindMerge(classList) {
378
+ const cachedResult = cacheGet(classList);
379
+ if (cachedResult) {
380
+ return cachedResult;
381
+ }
382
+ const result = mergeClassList(classList, configUtils);
383
+ cacheSet(classList, result);
384
+ return result;
385
+ }
386
+ return function callTailwindMerge() {
387
+ return functionToCall(twJoin.apply(null, arguments));
388
+ };
389
+ }
390
+ var fromTheme = (key) => {
391
+ const themeGetter = (theme) => theme[key] || [];
392
+ themeGetter.isThemeGetter = true;
393
+ return themeGetter;
394
+ };
395
+ var arbitraryValueRegex = /^\[(?:([a-z-]+):)?(.+)\]$/i;
396
+ var fractionRegex = /^\d+\/\d+$/;
397
+ var stringLengths = /* @__PURE__ */ new Set(["px", "full", "screen"]);
398
+ var tshirtUnitRegex = /^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/;
399
+ 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$/;
400
+ var colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/;
401
+ var shadowRegex = /^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/;
402
+ var imageRegex = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/;
403
+ var isLength = (value) => isNumber(value) || stringLengths.has(value) || fractionRegex.test(value);
404
+ var isArbitraryLength = (value) => getIsArbitraryValue(value, "length", isLengthOnly);
405
+ var isNumber = (value) => Boolean(value) && !Number.isNaN(Number(value));
406
+ var isArbitraryNumber = (value) => getIsArbitraryValue(value, "number", isNumber);
407
+ var isInteger = (value) => Boolean(value) && Number.isInteger(Number(value));
408
+ var isPercent = (value) => value.endsWith("%") && isNumber(value.slice(0, -1));
409
+ var isArbitraryValue = (value) => arbitraryValueRegex.test(value);
410
+ var isTshirtSize = (value) => tshirtUnitRegex.test(value);
411
+ var sizeLabels = /* @__PURE__ */ new Set(["length", "size", "percentage"]);
412
+ var isArbitrarySize = (value) => getIsArbitraryValue(value, sizeLabels, isNever);
413
+ var isArbitraryPosition = (value) => getIsArbitraryValue(value, "position", isNever);
414
+ var imageLabels = /* @__PURE__ */ new Set(["image", "url"]);
415
+ var isArbitraryImage = (value) => getIsArbitraryValue(value, imageLabels, isImage);
416
+ var isArbitraryShadow = (value) => getIsArbitraryValue(value, "", isShadow);
417
+ var isAny = () => true;
418
+ var getIsArbitraryValue = (value, label, testValue) => {
419
+ const result = arbitraryValueRegex.exec(value);
420
+ if (result) {
421
+ if (result[1]) {
422
+ return typeof label === "string" ? result[1] === label : label.has(result[1]);
423
+ }
424
+ return testValue(result[2]);
425
+ }
426
+ return false;
427
+ };
428
+ var isLengthOnly = (value) => (
429
+ // `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.
430
+ // For example, `hsl(0 0% 0%)` would be classified as a length without this check.
431
+ // I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.
432
+ lengthUnitRegex.test(value) && !colorFunctionRegex.test(value)
433
+ );
434
+ var isNever = () => false;
435
+ var isShadow = (value) => shadowRegex.test(value);
436
+ var isImage = (value) => imageRegex.test(value);
437
+ var getDefaultConfig = () => {
438
+ const colors = fromTheme("colors");
439
+ const spacing = fromTheme("spacing");
440
+ const blur = fromTheme("blur");
441
+ const brightness = fromTheme("brightness");
442
+ const borderColor = fromTheme("borderColor");
443
+ const borderRadius = fromTheme("borderRadius");
444
+ const borderSpacing = fromTheme("borderSpacing");
445
+ const borderWidth = fromTheme("borderWidth");
446
+ const contrast = fromTheme("contrast");
447
+ const grayscale = fromTheme("grayscale");
448
+ const hueRotate = fromTheme("hueRotate");
449
+ const invert = fromTheme("invert");
450
+ const gap = fromTheme("gap");
451
+ const gradientColorStops = fromTheme("gradientColorStops");
452
+ const gradientColorStopPositions = fromTheme("gradientColorStopPositions");
453
+ const inset = fromTheme("inset");
454
+ const margin = fromTheme("margin");
455
+ const opacity = fromTheme("opacity");
456
+ const padding = fromTheme("padding");
457
+ const saturate = fromTheme("saturate");
458
+ const scale = fromTheme("scale");
459
+ const sepia = fromTheme("sepia");
460
+ const skew = fromTheme("skew");
461
+ const space = fromTheme("space");
462
+ const translate = fromTheme("translate");
463
+ const getOverscroll = () => ["auto", "contain", "none"];
464
+ const getOverflow = () => ["auto", "hidden", "clip", "visible", "scroll"];
465
+ const getSpacingWithAutoAndArbitrary = () => ["auto", isArbitraryValue, spacing];
466
+ const getSpacingWithArbitrary = () => [isArbitraryValue, spacing];
467
+ const getLengthWithEmptyAndArbitrary = () => ["", isLength, isArbitraryLength];
468
+ const getNumberWithAutoAndArbitrary = () => ["auto", isNumber, isArbitraryValue];
469
+ const getPositions = () => ["bottom", "center", "left", "left-bottom", "left-top", "right", "right-bottom", "right-top", "top"];
470
+ const getLineStyles = () => ["solid", "dashed", "dotted", "double", "none"];
471
+ const getBlendModes = () => ["normal", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "hue", "saturation", "color", "luminosity"];
472
+ const getAlign = () => ["start", "end", "center", "between", "around", "evenly", "stretch"];
473
+ const getZeroAndEmpty = () => ["", "0", isArbitraryValue];
474
+ const getBreaks = () => ["auto", "avoid", "all", "avoid-page", "page", "left", "right", "column"];
475
+ const getNumberAndArbitrary = () => [isNumber, isArbitraryValue];
476
+ return {
477
+ cacheSize: 500,
478
+ separator: ":",
479
+ theme: {
480
+ colors: [isAny],
481
+ spacing: [isLength, isArbitraryLength],
482
+ blur: ["none", "", isTshirtSize, isArbitraryValue],
483
+ brightness: getNumberAndArbitrary(),
484
+ borderColor: [colors],
485
+ borderRadius: ["none", "", "full", isTshirtSize, isArbitraryValue],
486
+ borderSpacing: getSpacingWithArbitrary(),
487
+ borderWidth: getLengthWithEmptyAndArbitrary(),
488
+ contrast: getNumberAndArbitrary(),
489
+ grayscale: getZeroAndEmpty(),
490
+ hueRotate: getNumberAndArbitrary(),
491
+ invert: getZeroAndEmpty(),
492
+ gap: getSpacingWithArbitrary(),
493
+ gradientColorStops: [colors],
494
+ gradientColorStopPositions: [isPercent, isArbitraryLength],
495
+ inset: getSpacingWithAutoAndArbitrary(),
496
+ margin: getSpacingWithAutoAndArbitrary(),
497
+ opacity: getNumberAndArbitrary(),
498
+ padding: getSpacingWithArbitrary(),
499
+ saturate: getNumberAndArbitrary(),
500
+ scale: getNumberAndArbitrary(),
501
+ sepia: getZeroAndEmpty(),
502
+ skew: getNumberAndArbitrary(),
503
+ space: getSpacingWithArbitrary(),
504
+ translate: getSpacingWithArbitrary()
505
+ },
506
+ classGroups: {
507
+ // Layout
508
+ /**
509
+ * Aspect Ratio
510
+ * @see https://tailwindcss.com/docs/aspect-ratio
511
+ */
512
+ aspect: [{
513
+ aspect: ["auto", "square", "video", isArbitraryValue]
514
+ }],
515
+ /**
516
+ * Container
517
+ * @see https://tailwindcss.com/docs/container
518
+ */
519
+ container: ["container"],
520
+ /**
521
+ * Columns
522
+ * @see https://tailwindcss.com/docs/columns
523
+ */
524
+ columns: [{
525
+ columns: [isTshirtSize]
526
+ }],
527
+ /**
528
+ * Break After
529
+ * @see https://tailwindcss.com/docs/break-after
530
+ */
531
+ "break-after": [{
532
+ "break-after": getBreaks()
533
+ }],
534
+ /**
535
+ * Break Before
536
+ * @see https://tailwindcss.com/docs/break-before
537
+ */
538
+ "break-before": [{
539
+ "break-before": getBreaks()
540
+ }],
541
+ /**
542
+ * Break Inside
543
+ * @see https://tailwindcss.com/docs/break-inside
544
+ */
545
+ "break-inside": [{
546
+ "break-inside": ["auto", "avoid", "avoid-page", "avoid-column"]
547
+ }],
548
+ /**
549
+ * Box Decoration Break
550
+ * @see https://tailwindcss.com/docs/box-decoration-break
551
+ */
552
+ "box-decoration": [{
553
+ "box-decoration": ["slice", "clone"]
554
+ }],
555
+ /**
556
+ * Box Sizing
557
+ * @see https://tailwindcss.com/docs/box-sizing
558
+ */
559
+ box: [{
560
+ box: ["border", "content"]
561
+ }],
562
+ /**
563
+ * Display
564
+ * @see https://tailwindcss.com/docs/display
565
+ */
566
+ 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"],
567
+ /**
568
+ * Floats
569
+ * @see https://tailwindcss.com/docs/float
570
+ */
571
+ float: [{
572
+ float: ["right", "left", "none", "start", "end"]
573
+ }],
574
+ /**
575
+ * Clear
576
+ * @see https://tailwindcss.com/docs/clear
577
+ */
578
+ clear: [{
579
+ clear: ["left", "right", "both", "none", "start", "end"]
580
+ }],
581
+ /**
582
+ * Isolation
583
+ * @see https://tailwindcss.com/docs/isolation
584
+ */
585
+ isolation: ["isolate", "isolation-auto"],
586
+ /**
587
+ * Object Fit
588
+ * @see https://tailwindcss.com/docs/object-fit
589
+ */
590
+ "object-fit": [{
591
+ object: ["contain", "cover", "fill", "none", "scale-down"]
592
+ }],
593
+ /**
594
+ * Object Position
595
+ * @see https://tailwindcss.com/docs/object-position
596
+ */
597
+ "object-position": [{
598
+ object: [...getPositions(), isArbitraryValue]
599
+ }],
600
+ /**
601
+ * Overflow
602
+ * @see https://tailwindcss.com/docs/overflow
603
+ */
604
+ overflow: [{
605
+ overflow: getOverflow()
606
+ }],
607
+ /**
608
+ * Overflow X
609
+ * @see https://tailwindcss.com/docs/overflow
610
+ */
611
+ "overflow-x": [{
612
+ "overflow-x": getOverflow()
613
+ }],
614
+ /**
615
+ * Overflow Y
616
+ * @see https://tailwindcss.com/docs/overflow
617
+ */
618
+ "overflow-y": [{
619
+ "overflow-y": getOverflow()
620
+ }],
621
+ /**
622
+ * Overscroll Behavior
623
+ * @see https://tailwindcss.com/docs/overscroll-behavior
624
+ */
625
+ overscroll: [{
626
+ overscroll: getOverscroll()
627
+ }],
628
+ /**
629
+ * Overscroll Behavior X
630
+ * @see https://tailwindcss.com/docs/overscroll-behavior
631
+ */
632
+ "overscroll-x": [{
633
+ "overscroll-x": getOverscroll()
634
+ }],
635
+ /**
636
+ * Overscroll Behavior Y
637
+ * @see https://tailwindcss.com/docs/overscroll-behavior
638
+ */
639
+ "overscroll-y": [{
640
+ "overscroll-y": getOverscroll()
641
+ }],
642
+ /**
643
+ * Position
644
+ * @see https://tailwindcss.com/docs/position
645
+ */
646
+ position: ["static", "fixed", "absolute", "relative", "sticky"],
647
+ /**
648
+ * Top / Right / Bottom / Left
649
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
650
+ */
651
+ inset: [{
652
+ inset: [inset]
653
+ }],
654
+ /**
655
+ * Right / Left
656
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
657
+ */
658
+ "inset-x": [{
659
+ "inset-x": [inset]
660
+ }],
661
+ /**
662
+ * Top / Bottom
663
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
664
+ */
665
+ "inset-y": [{
666
+ "inset-y": [inset]
667
+ }],
668
+ /**
669
+ * Start
670
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
671
+ */
672
+ start: [{
673
+ start: [inset]
674
+ }],
675
+ /**
676
+ * End
677
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
678
+ */
679
+ end: [{
680
+ end: [inset]
681
+ }],
682
+ /**
683
+ * Top
684
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
685
+ */
686
+ top: [{
687
+ top: [inset]
688
+ }],
689
+ /**
690
+ * Right
691
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
692
+ */
693
+ right: [{
694
+ right: [inset]
695
+ }],
696
+ /**
697
+ * Bottom
698
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
699
+ */
700
+ bottom: [{
701
+ bottom: [inset]
702
+ }],
703
+ /**
704
+ * Left
705
+ * @see https://tailwindcss.com/docs/top-right-bottom-left
706
+ */
707
+ left: [{
708
+ left: [inset]
709
+ }],
710
+ /**
711
+ * Visibility
712
+ * @see https://tailwindcss.com/docs/visibility
713
+ */
714
+ visibility: ["visible", "invisible", "collapse"],
715
+ /**
716
+ * Z-Index
717
+ * @see https://tailwindcss.com/docs/z-index
718
+ */
719
+ z: [{
720
+ z: ["auto", isInteger, isArbitraryValue]
721
+ }],
722
+ // Flexbox and Grid
723
+ /**
724
+ * Flex Basis
725
+ * @see https://tailwindcss.com/docs/flex-basis
726
+ */
727
+ basis: [{
728
+ basis: getSpacingWithAutoAndArbitrary()
729
+ }],
730
+ /**
731
+ * Flex Direction
732
+ * @see https://tailwindcss.com/docs/flex-direction
733
+ */
734
+ "flex-direction": [{
735
+ flex: ["row", "row-reverse", "col", "col-reverse"]
736
+ }],
737
+ /**
738
+ * Flex Wrap
739
+ * @see https://tailwindcss.com/docs/flex-wrap
740
+ */
741
+ "flex-wrap": [{
742
+ flex: ["wrap", "wrap-reverse", "nowrap"]
743
+ }],
744
+ /**
745
+ * Flex
746
+ * @see https://tailwindcss.com/docs/flex
747
+ */
748
+ flex: [{
749
+ flex: ["1", "auto", "initial", "none", isArbitraryValue]
750
+ }],
751
+ /**
752
+ * Flex Grow
753
+ * @see https://tailwindcss.com/docs/flex-grow
754
+ */
755
+ grow: [{
756
+ grow: getZeroAndEmpty()
757
+ }],
758
+ /**
759
+ * Flex Shrink
760
+ * @see https://tailwindcss.com/docs/flex-shrink
761
+ */
762
+ shrink: [{
763
+ shrink: getZeroAndEmpty()
764
+ }],
765
+ /**
766
+ * Order
767
+ * @see https://tailwindcss.com/docs/order
768
+ */
769
+ order: [{
770
+ order: ["first", "last", "none", isInteger, isArbitraryValue]
771
+ }],
772
+ /**
773
+ * Grid Template Columns
774
+ * @see https://tailwindcss.com/docs/grid-template-columns
775
+ */
776
+ "grid-cols": [{
777
+ "grid-cols": [isAny]
778
+ }],
779
+ /**
780
+ * Grid Column Start / End
781
+ * @see https://tailwindcss.com/docs/grid-column
782
+ */
783
+ "col-start-end": [{
784
+ col: ["auto", {
785
+ span: ["full", isInteger, isArbitraryValue]
786
+ }, isArbitraryValue]
787
+ }],
788
+ /**
789
+ * Grid Column Start
790
+ * @see https://tailwindcss.com/docs/grid-column
791
+ */
792
+ "col-start": [{
793
+ "col-start": getNumberWithAutoAndArbitrary()
794
+ }],
795
+ /**
796
+ * Grid Column End
797
+ * @see https://tailwindcss.com/docs/grid-column
798
+ */
799
+ "col-end": [{
800
+ "col-end": getNumberWithAutoAndArbitrary()
801
+ }],
802
+ /**
803
+ * Grid Template Rows
804
+ * @see https://tailwindcss.com/docs/grid-template-rows
805
+ */
806
+ "grid-rows": [{
807
+ "grid-rows": [isAny]
808
+ }],
809
+ /**
810
+ * Grid Row Start / End
811
+ * @see https://tailwindcss.com/docs/grid-row
812
+ */
813
+ "row-start-end": [{
814
+ row: ["auto", {
815
+ span: [isInteger, isArbitraryValue]
816
+ }, isArbitraryValue]
817
+ }],
818
+ /**
819
+ * Grid Row Start
820
+ * @see https://tailwindcss.com/docs/grid-row
821
+ */
822
+ "row-start": [{
823
+ "row-start": getNumberWithAutoAndArbitrary()
824
+ }],
825
+ /**
826
+ * Grid Row End
827
+ * @see https://tailwindcss.com/docs/grid-row
828
+ */
829
+ "row-end": [{
830
+ "row-end": getNumberWithAutoAndArbitrary()
831
+ }],
832
+ /**
833
+ * Grid Auto Flow
834
+ * @see https://tailwindcss.com/docs/grid-auto-flow
835
+ */
836
+ "grid-flow": [{
837
+ "grid-flow": ["row", "col", "dense", "row-dense", "col-dense"]
838
+ }],
839
+ /**
840
+ * Grid Auto Columns
841
+ * @see https://tailwindcss.com/docs/grid-auto-columns
842
+ */
843
+ "auto-cols": [{
844
+ "auto-cols": ["auto", "min", "max", "fr", isArbitraryValue]
845
+ }],
846
+ /**
847
+ * Grid Auto Rows
848
+ * @see https://tailwindcss.com/docs/grid-auto-rows
849
+ */
850
+ "auto-rows": [{
851
+ "auto-rows": ["auto", "min", "max", "fr", isArbitraryValue]
852
+ }],
853
+ /**
854
+ * Gap
855
+ * @see https://tailwindcss.com/docs/gap
856
+ */
857
+ gap: [{
858
+ gap: [gap]
859
+ }],
860
+ /**
861
+ * Gap X
862
+ * @see https://tailwindcss.com/docs/gap
863
+ */
864
+ "gap-x": [{
865
+ "gap-x": [gap]
866
+ }],
867
+ /**
868
+ * Gap Y
869
+ * @see https://tailwindcss.com/docs/gap
870
+ */
871
+ "gap-y": [{
872
+ "gap-y": [gap]
873
+ }],
874
+ /**
875
+ * Justify Content
876
+ * @see https://tailwindcss.com/docs/justify-content
877
+ */
878
+ "justify-content": [{
879
+ justify: ["normal", ...getAlign()]
880
+ }],
881
+ /**
882
+ * Justify Items
883
+ * @see https://tailwindcss.com/docs/justify-items
884
+ */
885
+ "justify-items": [{
886
+ "justify-items": ["start", "end", "center", "stretch"]
887
+ }],
888
+ /**
889
+ * Justify Self
890
+ * @see https://tailwindcss.com/docs/justify-self
891
+ */
892
+ "justify-self": [{
893
+ "justify-self": ["auto", "start", "end", "center", "stretch"]
894
+ }],
895
+ /**
896
+ * Align Content
897
+ * @see https://tailwindcss.com/docs/align-content
898
+ */
899
+ "align-content": [{
900
+ content: ["normal", ...getAlign(), "baseline"]
901
+ }],
902
+ /**
903
+ * Align Items
904
+ * @see https://tailwindcss.com/docs/align-items
905
+ */
906
+ "align-items": [{
907
+ items: ["start", "end", "center", "baseline", "stretch"]
908
+ }],
909
+ /**
910
+ * Align Self
911
+ * @see https://tailwindcss.com/docs/align-self
912
+ */
913
+ "align-self": [{
914
+ self: ["auto", "start", "end", "center", "stretch", "baseline"]
915
+ }],
916
+ /**
917
+ * Place Content
918
+ * @see https://tailwindcss.com/docs/place-content
919
+ */
920
+ "place-content": [{
921
+ "place-content": [...getAlign(), "baseline"]
922
+ }],
923
+ /**
924
+ * Place Items
925
+ * @see https://tailwindcss.com/docs/place-items
926
+ */
927
+ "place-items": [{
928
+ "place-items": ["start", "end", "center", "baseline", "stretch"]
929
+ }],
930
+ /**
931
+ * Place Self
932
+ * @see https://tailwindcss.com/docs/place-self
933
+ */
934
+ "place-self": [{
935
+ "place-self": ["auto", "start", "end", "center", "stretch"]
936
+ }],
937
+ // Spacing
938
+ /**
939
+ * Padding
940
+ * @see https://tailwindcss.com/docs/padding
941
+ */
942
+ p: [{
943
+ p: [padding]
944
+ }],
945
+ /**
946
+ * Padding X
947
+ * @see https://tailwindcss.com/docs/padding
948
+ */
949
+ px: [{
950
+ px: [padding]
951
+ }],
952
+ /**
953
+ * Padding Y
954
+ * @see https://tailwindcss.com/docs/padding
955
+ */
956
+ py: [{
957
+ py: [padding]
958
+ }],
959
+ /**
960
+ * Padding Start
961
+ * @see https://tailwindcss.com/docs/padding
962
+ */
963
+ ps: [{
964
+ ps: [padding]
965
+ }],
966
+ /**
967
+ * Padding End
968
+ * @see https://tailwindcss.com/docs/padding
969
+ */
970
+ pe: [{
971
+ pe: [padding]
972
+ }],
973
+ /**
974
+ * Padding Top
975
+ * @see https://tailwindcss.com/docs/padding
976
+ */
977
+ pt: [{
978
+ pt: [padding]
979
+ }],
980
+ /**
981
+ * Padding Right
982
+ * @see https://tailwindcss.com/docs/padding
983
+ */
984
+ pr: [{
985
+ pr: [padding]
986
+ }],
987
+ /**
988
+ * Padding Bottom
989
+ * @see https://tailwindcss.com/docs/padding
990
+ */
991
+ pb: [{
992
+ pb: [padding]
993
+ }],
994
+ /**
995
+ * Padding Left
996
+ * @see https://tailwindcss.com/docs/padding
997
+ */
998
+ pl: [{
999
+ pl: [padding]
1000
+ }],
1001
+ /**
1002
+ * Margin
1003
+ * @see https://tailwindcss.com/docs/margin
1004
+ */
1005
+ m: [{
1006
+ m: [margin]
1007
+ }],
1008
+ /**
1009
+ * Margin X
1010
+ * @see https://tailwindcss.com/docs/margin
1011
+ */
1012
+ mx: [{
1013
+ mx: [margin]
1014
+ }],
1015
+ /**
1016
+ * Margin Y
1017
+ * @see https://tailwindcss.com/docs/margin
1018
+ */
1019
+ my: [{
1020
+ my: [margin]
1021
+ }],
1022
+ /**
1023
+ * Margin Start
1024
+ * @see https://tailwindcss.com/docs/margin
1025
+ */
1026
+ ms: [{
1027
+ ms: [margin]
1028
+ }],
1029
+ /**
1030
+ * Margin End
1031
+ * @see https://tailwindcss.com/docs/margin
1032
+ */
1033
+ me: [{
1034
+ me: [margin]
1035
+ }],
1036
+ /**
1037
+ * Margin Top
1038
+ * @see https://tailwindcss.com/docs/margin
1039
+ */
1040
+ mt: [{
1041
+ mt: [margin]
1042
+ }],
1043
+ /**
1044
+ * Margin Right
1045
+ * @see https://tailwindcss.com/docs/margin
1046
+ */
1047
+ mr: [{
1048
+ mr: [margin]
1049
+ }],
1050
+ /**
1051
+ * Margin Bottom
1052
+ * @see https://tailwindcss.com/docs/margin
1053
+ */
1054
+ mb: [{
1055
+ mb: [margin]
1056
+ }],
1057
+ /**
1058
+ * Margin Left
1059
+ * @see https://tailwindcss.com/docs/margin
1060
+ */
1061
+ ml: [{
1062
+ ml: [margin]
1063
+ }],
1064
+ /**
1065
+ * Space Between X
1066
+ * @see https://tailwindcss.com/docs/space
1067
+ */
1068
+ "space-x": [{
1069
+ "space-x": [space]
1070
+ }],
1071
+ /**
1072
+ * Space Between X Reverse
1073
+ * @see https://tailwindcss.com/docs/space
1074
+ */
1075
+ "space-x-reverse": ["space-x-reverse"],
1076
+ /**
1077
+ * Space Between Y
1078
+ * @see https://tailwindcss.com/docs/space
1079
+ */
1080
+ "space-y": [{
1081
+ "space-y": [space]
1082
+ }],
1083
+ /**
1084
+ * Space Between Y Reverse
1085
+ * @see https://tailwindcss.com/docs/space
1086
+ */
1087
+ "space-y-reverse": ["space-y-reverse"],
1088
+ // Sizing
1089
+ /**
1090
+ * Width
1091
+ * @see https://tailwindcss.com/docs/width
1092
+ */
1093
+ w: [{
1094
+ w: ["auto", "min", "max", "fit", "svw", "lvw", "dvw", isArbitraryValue, spacing]
1095
+ }],
1096
+ /**
1097
+ * Min-Width
1098
+ * @see https://tailwindcss.com/docs/min-width
1099
+ */
1100
+ "min-w": [{
1101
+ "min-w": [isArbitraryValue, spacing, "min", "max", "fit"]
1102
+ }],
1103
+ /**
1104
+ * Max-Width
1105
+ * @see https://tailwindcss.com/docs/max-width
1106
+ */
1107
+ "max-w": [{
1108
+ "max-w": [isArbitraryValue, spacing, "none", "full", "min", "max", "fit", "prose", {
1109
+ screen: [isTshirtSize]
1110
+ }, isTshirtSize]
1111
+ }],
1112
+ /**
1113
+ * Height
1114
+ * @see https://tailwindcss.com/docs/height
1115
+ */
1116
+ h: [{
1117
+ h: [isArbitraryValue, spacing, "auto", "min", "max", "fit", "svh", "lvh", "dvh"]
1118
+ }],
1119
+ /**
1120
+ * Min-Height
1121
+ * @see https://tailwindcss.com/docs/min-height
1122
+ */
1123
+ "min-h": [{
1124
+ "min-h": [isArbitraryValue, spacing, "min", "max", "fit", "svh", "lvh", "dvh"]
1125
+ }],
1126
+ /**
1127
+ * Max-Height
1128
+ * @see https://tailwindcss.com/docs/max-height
1129
+ */
1130
+ "max-h": [{
1131
+ "max-h": [isArbitraryValue, spacing, "min", "max", "fit", "svh", "lvh", "dvh"]
1132
+ }],
1133
+ /**
1134
+ * Size
1135
+ * @see https://tailwindcss.com/docs/size
1136
+ */
1137
+ size: [{
1138
+ size: [isArbitraryValue, spacing, "auto", "min", "max", "fit"]
1139
+ }],
1140
+ // Typography
1141
+ /**
1142
+ * Font Size
1143
+ * @see https://tailwindcss.com/docs/font-size
1144
+ */
1145
+ "font-size": [{
1146
+ text: ["base", isTshirtSize, isArbitraryLength]
1147
+ }],
1148
+ /**
1149
+ * Font Smoothing
1150
+ * @see https://tailwindcss.com/docs/font-smoothing
1151
+ */
1152
+ "font-smoothing": ["antialiased", "subpixel-antialiased"],
1153
+ /**
1154
+ * Font Style
1155
+ * @see https://tailwindcss.com/docs/font-style
1156
+ */
1157
+ "font-style": ["italic", "not-italic"],
1158
+ /**
1159
+ * Font Weight
1160
+ * @see https://tailwindcss.com/docs/font-weight
1161
+ */
1162
+ "font-weight": [{
1163
+ font: ["thin", "extralight", "light", "normal", "medium", "semibold", "bold", "extrabold", "black", isArbitraryNumber]
1164
+ }],
1165
+ /**
1166
+ * Font Family
1167
+ * @see https://tailwindcss.com/docs/font-family
1168
+ */
1169
+ "font-family": [{
1170
+ font: [isAny]
1171
+ }],
1172
+ /**
1173
+ * Font Variant Numeric
1174
+ * @see https://tailwindcss.com/docs/font-variant-numeric
1175
+ */
1176
+ "fvn-normal": ["normal-nums"],
1177
+ /**
1178
+ * Font Variant Numeric
1179
+ * @see https://tailwindcss.com/docs/font-variant-numeric
1180
+ */
1181
+ "fvn-ordinal": ["ordinal"],
1182
+ /**
1183
+ * Font Variant Numeric
1184
+ * @see https://tailwindcss.com/docs/font-variant-numeric
1185
+ */
1186
+ "fvn-slashed-zero": ["slashed-zero"],
1187
+ /**
1188
+ * Font Variant Numeric
1189
+ * @see https://tailwindcss.com/docs/font-variant-numeric
1190
+ */
1191
+ "fvn-figure": ["lining-nums", "oldstyle-nums"],
1192
+ /**
1193
+ * Font Variant Numeric
1194
+ * @see https://tailwindcss.com/docs/font-variant-numeric
1195
+ */
1196
+ "fvn-spacing": ["proportional-nums", "tabular-nums"],
1197
+ /**
1198
+ * Font Variant Numeric
1199
+ * @see https://tailwindcss.com/docs/font-variant-numeric
1200
+ */
1201
+ "fvn-fraction": ["diagonal-fractions", "stacked-fractions"],
1202
+ /**
1203
+ * Letter Spacing
1204
+ * @see https://tailwindcss.com/docs/letter-spacing
1205
+ */
1206
+ tracking: [{
1207
+ tracking: ["tighter", "tight", "normal", "wide", "wider", "widest", isArbitraryValue]
1208
+ }],
1209
+ /**
1210
+ * Line Clamp
1211
+ * @see https://tailwindcss.com/docs/line-clamp
1212
+ */
1213
+ "line-clamp": [{
1214
+ "line-clamp": ["none", isNumber, isArbitraryNumber]
1215
+ }],
1216
+ /**
1217
+ * Line Height
1218
+ * @see https://tailwindcss.com/docs/line-height
1219
+ */
1220
+ leading: [{
1221
+ leading: ["none", "tight", "snug", "normal", "relaxed", "loose", isLength, isArbitraryValue]
1222
+ }],
1223
+ /**
1224
+ * List Style Image
1225
+ * @see https://tailwindcss.com/docs/list-style-image
1226
+ */
1227
+ "list-image": [{
1228
+ "list-image": ["none", isArbitraryValue]
1229
+ }],
1230
+ /**
1231
+ * List Style Type
1232
+ * @see https://tailwindcss.com/docs/list-style-type
1233
+ */
1234
+ "list-style-type": [{
1235
+ list: ["none", "disc", "decimal", isArbitraryValue]
1236
+ }],
1237
+ /**
1238
+ * List Style Position
1239
+ * @see https://tailwindcss.com/docs/list-style-position
1240
+ */
1241
+ "list-style-position": [{
1242
+ list: ["inside", "outside"]
1243
+ }],
1244
+ /**
1245
+ * Placeholder Color
1246
+ * @deprecated since Tailwind CSS v3.0.0
1247
+ * @see https://tailwindcss.com/docs/placeholder-color
1248
+ */
1249
+ "placeholder-color": [{
1250
+ placeholder: [colors]
1251
+ }],
1252
+ /**
1253
+ * Placeholder Opacity
1254
+ * @see https://tailwindcss.com/docs/placeholder-opacity
1255
+ */
1256
+ "placeholder-opacity": [{
1257
+ "placeholder-opacity": [opacity]
1258
+ }],
1259
+ /**
1260
+ * Text Alignment
1261
+ * @see https://tailwindcss.com/docs/text-align
1262
+ */
1263
+ "text-alignment": [{
1264
+ text: ["left", "center", "right", "justify", "start", "end"]
1265
+ }],
1266
+ /**
1267
+ * Text Color
1268
+ * @see https://tailwindcss.com/docs/text-color
1269
+ */
1270
+ "text-color": [{
1271
+ text: [colors]
1272
+ }],
1273
+ /**
1274
+ * Text Opacity
1275
+ * @see https://tailwindcss.com/docs/text-opacity
1276
+ */
1277
+ "text-opacity": [{
1278
+ "text-opacity": [opacity]
1279
+ }],
1280
+ /**
1281
+ * Text Decoration
1282
+ * @see https://tailwindcss.com/docs/text-decoration
1283
+ */
1284
+ "text-decoration": ["underline", "overline", "line-through", "no-underline"],
1285
+ /**
1286
+ * Text Decoration Style
1287
+ * @see https://tailwindcss.com/docs/text-decoration-style
1288
+ */
1289
+ "text-decoration-style": [{
1290
+ decoration: [...getLineStyles(), "wavy"]
1291
+ }],
1292
+ /**
1293
+ * Text Decoration Thickness
1294
+ * @see https://tailwindcss.com/docs/text-decoration-thickness
1295
+ */
1296
+ "text-decoration-thickness": [{
1297
+ decoration: ["auto", "from-font", isLength, isArbitraryLength]
1298
+ }],
1299
+ /**
1300
+ * Text Underline Offset
1301
+ * @see https://tailwindcss.com/docs/text-underline-offset
1302
+ */
1303
+ "underline-offset": [{
1304
+ "underline-offset": ["auto", isLength, isArbitraryValue]
1305
+ }],
1306
+ /**
1307
+ * Text Decoration Color
1308
+ * @see https://tailwindcss.com/docs/text-decoration-color
1309
+ */
1310
+ "text-decoration-color": [{
1311
+ decoration: [colors]
1312
+ }],
1313
+ /**
1314
+ * Text Transform
1315
+ * @see https://tailwindcss.com/docs/text-transform
1316
+ */
1317
+ "text-transform": ["uppercase", "lowercase", "capitalize", "normal-case"],
1318
+ /**
1319
+ * Text Overflow
1320
+ * @see https://tailwindcss.com/docs/text-overflow
1321
+ */
1322
+ "text-overflow": ["truncate", "text-ellipsis", "text-clip"],
1323
+ /**
1324
+ * Text Wrap
1325
+ * @see https://tailwindcss.com/docs/text-wrap
1326
+ */
1327
+ "text-wrap": [{
1328
+ text: ["wrap", "nowrap", "balance", "pretty"]
1329
+ }],
1330
+ /**
1331
+ * Text Indent
1332
+ * @see https://tailwindcss.com/docs/text-indent
1333
+ */
1334
+ indent: [{
1335
+ indent: getSpacingWithArbitrary()
1336
+ }],
1337
+ /**
1338
+ * Vertical Alignment
1339
+ * @see https://tailwindcss.com/docs/vertical-align
1340
+ */
1341
+ "vertical-align": [{
1342
+ align: ["baseline", "top", "middle", "bottom", "text-top", "text-bottom", "sub", "super", isArbitraryValue]
1343
+ }],
1344
+ /**
1345
+ * Whitespace
1346
+ * @see https://tailwindcss.com/docs/whitespace
1347
+ */
1348
+ whitespace: [{
1349
+ whitespace: ["normal", "nowrap", "pre", "pre-line", "pre-wrap", "break-spaces"]
1350
+ }],
1351
+ /**
1352
+ * Word Break
1353
+ * @see https://tailwindcss.com/docs/word-break
1354
+ */
1355
+ break: [{
1356
+ break: ["normal", "words", "all", "keep"]
1357
+ }],
1358
+ /**
1359
+ * Hyphens
1360
+ * @see https://tailwindcss.com/docs/hyphens
1361
+ */
1362
+ hyphens: [{
1363
+ hyphens: ["none", "manual", "auto"]
1364
+ }],
1365
+ /**
1366
+ * Content
1367
+ * @see https://tailwindcss.com/docs/content
1368
+ */
1369
+ content: [{
1370
+ content: ["none", isArbitraryValue]
1371
+ }],
1372
+ // Backgrounds
1373
+ /**
1374
+ * Background Attachment
1375
+ * @see https://tailwindcss.com/docs/background-attachment
1376
+ */
1377
+ "bg-attachment": [{
1378
+ bg: ["fixed", "local", "scroll"]
1379
+ }],
1380
+ /**
1381
+ * Background Clip
1382
+ * @see https://tailwindcss.com/docs/background-clip
1383
+ */
1384
+ "bg-clip": [{
1385
+ "bg-clip": ["border", "padding", "content", "text"]
1386
+ }],
1387
+ /**
1388
+ * Background Opacity
1389
+ * @deprecated since Tailwind CSS v3.0.0
1390
+ * @see https://tailwindcss.com/docs/background-opacity
1391
+ */
1392
+ "bg-opacity": [{
1393
+ "bg-opacity": [opacity]
1394
+ }],
1395
+ /**
1396
+ * Background Origin
1397
+ * @see https://tailwindcss.com/docs/background-origin
1398
+ */
1399
+ "bg-origin": [{
1400
+ "bg-origin": ["border", "padding", "content"]
1401
+ }],
1402
+ /**
1403
+ * Background Position
1404
+ * @see https://tailwindcss.com/docs/background-position
1405
+ */
1406
+ "bg-position": [{
1407
+ bg: [...getPositions(), isArbitraryPosition]
1408
+ }],
1409
+ /**
1410
+ * Background Repeat
1411
+ * @see https://tailwindcss.com/docs/background-repeat
1412
+ */
1413
+ "bg-repeat": [{
1414
+ bg: ["no-repeat", {
1415
+ repeat: ["", "x", "y", "round", "space"]
1416
+ }]
1417
+ }],
1418
+ /**
1419
+ * Background Size
1420
+ * @see https://tailwindcss.com/docs/background-size
1421
+ */
1422
+ "bg-size": [{
1423
+ bg: ["auto", "cover", "contain", isArbitrarySize]
1424
+ }],
1425
+ /**
1426
+ * Background Image
1427
+ * @see https://tailwindcss.com/docs/background-image
1428
+ */
1429
+ "bg-image": [{
1430
+ bg: ["none", {
1431
+ "gradient-to": ["t", "tr", "r", "br", "b", "bl", "l", "tl"]
1432
+ }, isArbitraryImage]
1433
+ }],
1434
+ /**
1435
+ * Background Color
1436
+ * @see https://tailwindcss.com/docs/background-color
1437
+ */
1438
+ "bg-color": [{
1439
+ bg: [colors]
1440
+ }],
1441
+ /**
1442
+ * Gradient Color Stops From Position
1443
+ * @see https://tailwindcss.com/docs/gradient-color-stops
1444
+ */
1445
+ "gradient-from-pos": [{
1446
+ from: [gradientColorStopPositions]
1447
+ }],
1448
+ /**
1449
+ * Gradient Color Stops Via Position
1450
+ * @see https://tailwindcss.com/docs/gradient-color-stops
1451
+ */
1452
+ "gradient-via-pos": [{
1453
+ via: [gradientColorStopPositions]
1454
+ }],
1455
+ /**
1456
+ * Gradient Color Stops To Position
1457
+ * @see https://tailwindcss.com/docs/gradient-color-stops
1458
+ */
1459
+ "gradient-to-pos": [{
1460
+ to: [gradientColorStopPositions]
1461
+ }],
1462
+ /**
1463
+ * Gradient Color Stops From
1464
+ * @see https://tailwindcss.com/docs/gradient-color-stops
1465
+ */
1466
+ "gradient-from": [{
1467
+ from: [gradientColorStops]
1468
+ }],
1469
+ /**
1470
+ * Gradient Color Stops Via
1471
+ * @see https://tailwindcss.com/docs/gradient-color-stops
1472
+ */
1473
+ "gradient-via": [{
1474
+ via: [gradientColorStops]
1475
+ }],
1476
+ /**
1477
+ * Gradient Color Stops To
1478
+ * @see https://tailwindcss.com/docs/gradient-color-stops
1479
+ */
1480
+ "gradient-to": [{
1481
+ to: [gradientColorStops]
1482
+ }],
1483
+ // Borders
1484
+ /**
1485
+ * Border Radius
1486
+ * @see https://tailwindcss.com/docs/border-radius
1487
+ */
1488
+ rounded: [{
1489
+ rounded: [borderRadius]
1490
+ }],
1491
+ /**
1492
+ * Border Radius Start
1493
+ * @see https://tailwindcss.com/docs/border-radius
1494
+ */
1495
+ "rounded-s": [{
1496
+ "rounded-s": [borderRadius]
1497
+ }],
1498
+ /**
1499
+ * Border Radius End
1500
+ * @see https://tailwindcss.com/docs/border-radius
1501
+ */
1502
+ "rounded-e": [{
1503
+ "rounded-e": [borderRadius]
1504
+ }],
1505
+ /**
1506
+ * Border Radius Top
1507
+ * @see https://tailwindcss.com/docs/border-radius
1508
+ */
1509
+ "rounded-t": [{
1510
+ "rounded-t": [borderRadius]
1511
+ }],
1512
+ /**
1513
+ * Border Radius Right
1514
+ * @see https://tailwindcss.com/docs/border-radius
1515
+ */
1516
+ "rounded-r": [{
1517
+ "rounded-r": [borderRadius]
1518
+ }],
1519
+ /**
1520
+ * Border Radius Bottom
1521
+ * @see https://tailwindcss.com/docs/border-radius
1522
+ */
1523
+ "rounded-b": [{
1524
+ "rounded-b": [borderRadius]
1525
+ }],
1526
+ /**
1527
+ * Border Radius Left
1528
+ * @see https://tailwindcss.com/docs/border-radius
1529
+ */
1530
+ "rounded-l": [{
1531
+ "rounded-l": [borderRadius]
1532
+ }],
1533
+ /**
1534
+ * Border Radius Start Start
1535
+ * @see https://tailwindcss.com/docs/border-radius
1536
+ */
1537
+ "rounded-ss": [{
1538
+ "rounded-ss": [borderRadius]
1539
+ }],
1540
+ /**
1541
+ * Border Radius Start End
1542
+ * @see https://tailwindcss.com/docs/border-radius
1543
+ */
1544
+ "rounded-se": [{
1545
+ "rounded-se": [borderRadius]
1546
+ }],
1547
+ /**
1548
+ * Border Radius End End
1549
+ * @see https://tailwindcss.com/docs/border-radius
1550
+ */
1551
+ "rounded-ee": [{
1552
+ "rounded-ee": [borderRadius]
1553
+ }],
1554
+ /**
1555
+ * Border Radius End Start
1556
+ * @see https://tailwindcss.com/docs/border-radius
1557
+ */
1558
+ "rounded-es": [{
1559
+ "rounded-es": [borderRadius]
1560
+ }],
1561
+ /**
1562
+ * Border Radius Top Left
1563
+ * @see https://tailwindcss.com/docs/border-radius
1564
+ */
1565
+ "rounded-tl": [{
1566
+ "rounded-tl": [borderRadius]
1567
+ }],
1568
+ /**
1569
+ * Border Radius Top Right
1570
+ * @see https://tailwindcss.com/docs/border-radius
1571
+ */
1572
+ "rounded-tr": [{
1573
+ "rounded-tr": [borderRadius]
1574
+ }],
1575
+ /**
1576
+ * Border Radius Bottom Right
1577
+ * @see https://tailwindcss.com/docs/border-radius
1578
+ */
1579
+ "rounded-br": [{
1580
+ "rounded-br": [borderRadius]
1581
+ }],
1582
+ /**
1583
+ * Border Radius Bottom Left
1584
+ * @see https://tailwindcss.com/docs/border-radius
1585
+ */
1586
+ "rounded-bl": [{
1587
+ "rounded-bl": [borderRadius]
1588
+ }],
1589
+ /**
1590
+ * Border Width
1591
+ * @see https://tailwindcss.com/docs/border-width
1592
+ */
1593
+ "border-w": [{
1594
+ border: [borderWidth]
1595
+ }],
1596
+ /**
1597
+ * Border Width X
1598
+ * @see https://tailwindcss.com/docs/border-width
1599
+ */
1600
+ "border-w-x": [{
1601
+ "border-x": [borderWidth]
1602
+ }],
1603
+ /**
1604
+ * Border Width Y
1605
+ * @see https://tailwindcss.com/docs/border-width
1606
+ */
1607
+ "border-w-y": [{
1608
+ "border-y": [borderWidth]
1609
+ }],
1610
+ /**
1611
+ * Border Width Start
1612
+ * @see https://tailwindcss.com/docs/border-width
1613
+ */
1614
+ "border-w-s": [{
1615
+ "border-s": [borderWidth]
1616
+ }],
1617
+ /**
1618
+ * Border Width End
1619
+ * @see https://tailwindcss.com/docs/border-width
1620
+ */
1621
+ "border-w-e": [{
1622
+ "border-e": [borderWidth]
1623
+ }],
1624
+ /**
1625
+ * Border Width Top
1626
+ * @see https://tailwindcss.com/docs/border-width
1627
+ */
1628
+ "border-w-t": [{
1629
+ "border-t": [borderWidth]
1630
+ }],
1631
+ /**
1632
+ * Border Width Right
1633
+ * @see https://tailwindcss.com/docs/border-width
1634
+ */
1635
+ "border-w-r": [{
1636
+ "border-r": [borderWidth]
1637
+ }],
1638
+ /**
1639
+ * Border Width Bottom
1640
+ * @see https://tailwindcss.com/docs/border-width
1641
+ */
1642
+ "border-w-b": [{
1643
+ "border-b": [borderWidth]
1644
+ }],
1645
+ /**
1646
+ * Border Width Left
1647
+ * @see https://tailwindcss.com/docs/border-width
1648
+ */
1649
+ "border-w-l": [{
1650
+ "border-l": [borderWidth]
1651
+ }],
1652
+ /**
1653
+ * Border Opacity
1654
+ * @see https://tailwindcss.com/docs/border-opacity
1655
+ */
1656
+ "border-opacity": [{
1657
+ "border-opacity": [opacity]
1658
+ }],
1659
+ /**
1660
+ * Border Style
1661
+ * @see https://tailwindcss.com/docs/border-style
1662
+ */
1663
+ "border-style": [{
1664
+ border: [...getLineStyles(), "hidden"]
1665
+ }],
1666
+ /**
1667
+ * Divide Width X
1668
+ * @see https://tailwindcss.com/docs/divide-width
1669
+ */
1670
+ "divide-x": [{
1671
+ "divide-x": [borderWidth]
1672
+ }],
1673
+ /**
1674
+ * Divide Width X Reverse
1675
+ * @see https://tailwindcss.com/docs/divide-width
1676
+ */
1677
+ "divide-x-reverse": ["divide-x-reverse"],
1678
+ /**
1679
+ * Divide Width Y
1680
+ * @see https://tailwindcss.com/docs/divide-width
1681
+ */
1682
+ "divide-y": [{
1683
+ "divide-y": [borderWidth]
1684
+ }],
1685
+ /**
1686
+ * Divide Width Y Reverse
1687
+ * @see https://tailwindcss.com/docs/divide-width
1688
+ */
1689
+ "divide-y-reverse": ["divide-y-reverse"],
1690
+ /**
1691
+ * Divide Opacity
1692
+ * @see https://tailwindcss.com/docs/divide-opacity
1693
+ */
1694
+ "divide-opacity": [{
1695
+ "divide-opacity": [opacity]
1696
+ }],
1697
+ /**
1698
+ * Divide Style
1699
+ * @see https://tailwindcss.com/docs/divide-style
1700
+ */
1701
+ "divide-style": [{
1702
+ divide: getLineStyles()
1703
+ }],
1704
+ /**
1705
+ * Border Color
1706
+ * @see https://tailwindcss.com/docs/border-color
1707
+ */
1708
+ "border-color": [{
1709
+ border: [borderColor]
1710
+ }],
1711
+ /**
1712
+ * Border Color X
1713
+ * @see https://tailwindcss.com/docs/border-color
1714
+ */
1715
+ "border-color-x": [{
1716
+ "border-x": [borderColor]
1717
+ }],
1718
+ /**
1719
+ * Border Color Y
1720
+ * @see https://tailwindcss.com/docs/border-color
1721
+ */
1722
+ "border-color-y": [{
1723
+ "border-y": [borderColor]
1724
+ }],
1725
+ /**
1726
+ * Border Color S
1727
+ * @see https://tailwindcss.com/docs/border-color
1728
+ */
1729
+ "border-color-s": [{
1730
+ "border-s": [borderColor]
1731
+ }],
1732
+ /**
1733
+ * Border Color E
1734
+ * @see https://tailwindcss.com/docs/border-color
1735
+ */
1736
+ "border-color-e": [{
1737
+ "border-e": [borderColor]
1738
+ }],
1739
+ /**
1740
+ * Border Color Top
1741
+ * @see https://tailwindcss.com/docs/border-color
1742
+ */
1743
+ "border-color-t": [{
1744
+ "border-t": [borderColor]
1745
+ }],
1746
+ /**
1747
+ * Border Color Right
1748
+ * @see https://tailwindcss.com/docs/border-color
1749
+ */
1750
+ "border-color-r": [{
1751
+ "border-r": [borderColor]
1752
+ }],
1753
+ /**
1754
+ * Border Color Bottom
1755
+ * @see https://tailwindcss.com/docs/border-color
1756
+ */
1757
+ "border-color-b": [{
1758
+ "border-b": [borderColor]
1759
+ }],
1760
+ /**
1761
+ * Border Color Left
1762
+ * @see https://tailwindcss.com/docs/border-color
1763
+ */
1764
+ "border-color-l": [{
1765
+ "border-l": [borderColor]
1766
+ }],
1767
+ /**
1768
+ * Divide Color
1769
+ * @see https://tailwindcss.com/docs/divide-color
1770
+ */
1771
+ "divide-color": [{
1772
+ divide: [borderColor]
1773
+ }],
1774
+ /**
1775
+ * Outline Style
1776
+ * @see https://tailwindcss.com/docs/outline-style
1777
+ */
1778
+ "outline-style": [{
1779
+ outline: ["", ...getLineStyles()]
1780
+ }],
1781
+ /**
1782
+ * Outline Offset
1783
+ * @see https://tailwindcss.com/docs/outline-offset
1784
+ */
1785
+ "outline-offset": [{
1786
+ "outline-offset": [isLength, isArbitraryValue]
1787
+ }],
1788
+ /**
1789
+ * Outline Width
1790
+ * @see https://tailwindcss.com/docs/outline-width
1791
+ */
1792
+ "outline-w": [{
1793
+ outline: [isLength, isArbitraryLength]
1794
+ }],
1795
+ /**
1796
+ * Outline Color
1797
+ * @see https://tailwindcss.com/docs/outline-color
1798
+ */
1799
+ "outline-color": [{
1800
+ outline: [colors]
1801
+ }],
1802
+ /**
1803
+ * Ring Width
1804
+ * @see https://tailwindcss.com/docs/ring-width
1805
+ */
1806
+ "ring-w": [{
1807
+ ring: getLengthWithEmptyAndArbitrary()
1808
+ }],
1809
+ /**
1810
+ * Ring Width Inset
1811
+ * @see https://tailwindcss.com/docs/ring-width
1812
+ */
1813
+ "ring-w-inset": ["ring-inset"],
1814
+ /**
1815
+ * Ring Color
1816
+ * @see https://tailwindcss.com/docs/ring-color
1817
+ */
1818
+ "ring-color": [{
1819
+ ring: [colors]
1820
+ }],
1821
+ /**
1822
+ * Ring Opacity
1823
+ * @see https://tailwindcss.com/docs/ring-opacity
1824
+ */
1825
+ "ring-opacity": [{
1826
+ "ring-opacity": [opacity]
1827
+ }],
1828
+ /**
1829
+ * Ring Offset Width
1830
+ * @see https://tailwindcss.com/docs/ring-offset-width
1831
+ */
1832
+ "ring-offset-w": [{
1833
+ "ring-offset": [isLength, isArbitraryLength]
1834
+ }],
1835
+ /**
1836
+ * Ring Offset Color
1837
+ * @see https://tailwindcss.com/docs/ring-offset-color
1838
+ */
1839
+ "ring-offset-color": [{
1840
+ "ring-offset": [colors]
1841
+ }],
1842
+ // Effects
1843
+ /**
1844
+ * Box Shadow
1845
+ * @see https://tailwindcss.com/docs/box-shadow
1846
+ */
1847
+ shadow: [{
1848
+ shadow: ["", "inner", "none", isTshirtSize, isArbitraryShadow]
1849
+ }],
1850
+ /**
1851
+ * Box Shadow Color
1852
+ * @see https://tailwindcss.com/docs/box-shadow-color
1853
+ */
1854
+ "shadow-color": [{
1855
+ shadow: [isAny]
1856
+ }],
1857
+ /**
1858
+ * Opacity
1859
+ * @see https://tailwindcss.com/docs/opacity
1860
+ */
1861
+ opacity: [{
1862
+ opacity: [opacity]
1863
+ }],
1864
+ /**
1865
+ * Mix Blend Mode
1866
+ * @see https://tailwindcss.com/docs/mix-blend-mode
1867
+ */
1868
+ "mix-blend": [{
1869
+ "mix-blend": [...getBlendModes(), "plus-lighter", "plus-darker"]
1870
+ }],
1871
+ /**
1872
+ * Background Blend Mode
1873
+ * @see https://tailwindcss.com/docs/background-blend-mode
1874
+ */
1875
+ "bg-blend": [{
1876
+ "bg-blend": getBlendModes()
1877
+ }],
1878
+ // Filters
1879
+ /**
1880
+ * Filter
1881
+ * @deprecated since Tailwind CSS v3.0.0
1882
+ * @see https://tailwindcss.com/docs/filter
1883
+ */
1884
+ filter: [{
1885
+ filter: ["", "none"]
1886
+ }],
1887
+ /**
1888
+ * Blur
1889
+ * @see https://tailwindcss.com/docs/blur
1890
+ */
1891
+ blur: [{
1892
+ blur: [blur]
1893
+ }],
1894
+ /**
1895
+ * Brightness
1896
+ * @see https://tailwindcss.com/docs/brightness
1897
+ */
1898
+ brightness: [{
1899
+ brightness: [brightness]
1900
+ }],
1901
+ /**
1902
+ * Contrast
1903
+ * @see https://tailwindcss.com/docs/contrast
1904
+ */
1905
+ contrast: [{
1906
+ contrast: [contrast]
1907
+ }],
1908
+ /**
1909
+ * Drop Shadow
1910
+ * @see https://tailwindcss.com/docs/drop-shadow
1911
+ */
1912
+ "drop-shadow": [{
1913
+ "drop-shadow": ["", "none", isTshirtSize, isArbitraryValue]
1914
+ }],
1915
+ /**
1916
+ * Grayscale
1917
+ * @see https://tailwindcss.com/docs/grayscale
1918
+ */
1919
+ grayscale: [{
1920
+ grayscale: [grayscale]
1921
+ }],
1922
+ /**
1923
+ * Hue Rotate
1924
+ * @see https://tailwindcss.com/docs/hue-rotate
1925
+ */
1926
+ "hue-rotate": [{
1927
+ "hue-rotate": [hueRotate]
1928
+ }],
1929
+ /**
1930
+ * Invert
1931
+ * @see https://tailwindcss.com/docs/invert
1932
+ */
1933
+ invert: [{
1934
+ invert: [invert]
1935
+ }],
1936
+ /**
1937
+ * Saturate
1938
+ * @see https://tailwindcss.com/docs/saturate
1939
+ */
1940
+ saturate: [{
1941
+ saturate: [saturate]
1942
+ }],
1943
+ /**
1944
+ * Sepia
1945
+ * @see https://tailwindcss.com/docs/sepia
1946
+ */
1947
+ sepia: [{
1948
+ sepia: [sepia]
1949
+ }],
1950
+ /**
1951
+ * Backdrop Filter
1952
+ * @deprecated since Tailwind CSS v3.0.0
1953
+ * @see https://tailwindcss.com/docs/backdrop-filter
1954
+ */
1955
+ "backdrop-filter": [{
1956
+ "backdrop-filter": ["", "none"]
1957
+ }],
1958
+ /**
1959
+ * Backdrop Blur
1960
+ * @see https://tailwindcss.com/docs/backdrop-blur
1961
+ */
1962
+ "backdrop-blur": [{
1963
+ "backdrop-blur": [blur]
1964
+ }],
1965
+ /**
1966
+ * Backdrop Brightness
1967
+ * @see https://tailwindcss.com/docs/backdrop-brightness
1968
+ */
1969
+ "backdrop-brightness": [{
1970
+ "backdrop-brightness": [brightness]
1971
+ }],
1972
+ /**
1973
+ * Backdrop Contrast
1974
+ * @see https://tailwindcss.com/docs/backdrop-contrast
1975
+ */
1976
+ "backdrop-contrast": [{
1977
+ "backdrop-contrast": [contrast]
1978
+ }],
1979
+ /**
1980
+ * Backdrop Grayscale
1981
+ * @see https://tailwindcss.com/docs/backdrop-grayscale
1982
+ */
1983
+ "backdrop-grayscale": [{
1984
+ "backdrop-grayscale": [grayscale]
1985
+ }],
1986
+ /**
1987
+ * Backdrop Hue Rotate
1988
+ * @see https://tailwindcss.com/docs/backdrop-hue-rotate
1989
+ */
1990
+ "backdrop-hue-rotate": [{
1991
+ "backdrop-hue-rotate": [hueRotate]
1992
+ }],
1993
+ /**
1994
+ * Backdrop Invert
1995
+ * @see https://tailwindcss.com/docs/backdrop-invert
1996
+ */
1997
+ "backdrop-invert": [{
1998
+ "backdrop-invert": [invert]
1999
+ }],
2000
+ /**
2001
+ * Backdrop Opacity
2002
+ * @see https://tailwindcss.com/docs/backdrop-opacity
2003
+ */
2004
+ "backdrop-opacity": [{
2005
+ "backdrop-opacity": [opacity]
2006
+ }],
2007
+ /**
2008
+ * Backdrop Saturate
2009
+ * @see https://tailwindcss.com/docs/backdrop-saturate
2010
+ */
2011
+ "backdrop-saturate": [{
2012
+ "backdrop-saturate": [saturate]
2013
+ }],
2014
+ /**
2015
+ * Backdrop Sepia
2016
+ * @see https://tailwindcss.com/docs/backdrop-sepia
2017
+ */
2018
+ "backdrop-sepia": [{
2019
+ "backdrop-sepia": [sepia]
2020
+ }],
2021
+ // Tables
2022
+ /**
2023
+ * Border Collapse
2024
+ * @see https://tailwindcss.com/docs/border-collapse
2025
+ */
2026
+ "border-collapse": [{
2027
+ border: ["collapse", "separate"]
2028
+ }],
2029
+ /**
2030
+ * Border Spacing
2031
+ * @see https://tailwindcss.com/docs/border-spacing
2032
+ */
2033
+ "border-spacing": [{
2034
+ "border-spacing": [borderSpacing]
2035
+ }],
2036
+ /**
2037
+ * Border Spacing X
2038
+ * @see https://tailwindcss.com/docs/border-spacing
2039
+ */
2040
+ "border-spacing-x": [{
2041
+ "border-spacing-x": [borderSpacing]
2042
+ }],
2043
+ /**
2044
+ * Border Spacing Y
2045
+ * @see https://tailwindcss.com/docs/border-spacing
2046
+ */
2047
+ "border-spacing-y": [{
2048
+ "border-spacing-y": [borderSpacing]
2049
+ }],
2050
+ /**
2051
+ * Table Layout
2052
+ * @see https://tailwindcss.com/docs/table-layout
2053
+ */
2054
+ "table-layout": [{
2055
+ table: ["auto", "fixed"]
2056
+ }],
2057
+ /**
2058
+ * Caption Side
2059
+ * @see https://tailwindcss.com/docs/caption-side
2060
+ */
2061
+ caption: [{
2062
+ caption: ["top", "bottom"]
2063
+ }],
2064
+ // Transitions and Animation
2065
+ /**
2066
+ * Tranisition Property
2067
+ * @see https://tailwindcss.com/docs/transition-property
2068
+ */
2069
+ transition: [{
2070
+ transition: ["none", "all", "", "colors", "opacity", "shadow", "transform", isArbitraryValue]
2071
+ }],
2072
+ /**
2073
+ * Transition Duration
2074
+ * @see https://tailwindcss.com/docs/transition-duration
2075
+ */
2076
+ duration: [{
2077
+ duration: getNumberAndArbitrary()
2078
+ }],
2079
+ /**
2080
+ * Transition Timing Function
2081
+ * @see https://tailwindcss.com/docs/transition-timing-function
2082
+ */
2083
+ ease: [{
2084
+ ease: ["linear", "in", "out", "in-out", isArbitraryValue]
2085
+ }],
2086
+ /**
2087
+ * Transition Delay
2088
+ * @see https://tailwindcss.com/docs/transition-delay
2089
+ */
2090
+ delay: [{
2091
+ delay: getNumberAndArbitrary()
2092
+ }],
2093
+ /**
2094
+ * Animation
2095
+ * @see https://tailwindcss.com/docs/animation
2096
+ */
2097
+ animate: [{
2098
+ animate: ["none", "spin", "ping", "pulse", "bounce", isArbitraryValue]
2099
+ }],
2100
+ // Transforms
2101
+ /**
2102
+ * Transform
2103
+ * @see https://tailwindcss.com/docs/transform
2104
+ */
2105
+ transform: [{
2106
+ transform: ["", "gpu", "none"]
2107
+ }],
2108
+ /**
2109
+ * Scale
2110
+ * @see https://tailwindcss.com/docs/scale
2111
+ */
2112
+ scale: [{
2113
+ scale: [scale]
2114
+ }],
2115
+ /**
2116
+ * Scale X
2117
+ * @see https://tailwindcss.com/docs/scale
2118
+ */
2119
+ "scale-x": [{
2120
+ "scale-x": [scale]
2121
+ }],
2122
+ /**
2123
+ * Scale Y
2124
+ * @see https://tailwindcss.com/docs/scale
2125
+ */
2126
+ "scale-y": [{
2127
+ "scale-y": [scale]
2128
+ }],
2129
+ /**
2130
+ * Rotate
2131
+ * @see https://tailwindcss.com/docs/rotate
2132
+ */
2133
+ rotate: [{
2134
+ rotate: [isInteger, isArbitraryValue]
2135
+ }],
2136
+ /**
2137
+ * Translate X
2138
+ * @see https://tailwindcss.com/docs/translate
2139
+ */
2140
+ "translate-x": [{
2141
+ "translate-x": [translate]
2142
+ }],
2143
+ /**
2144
+ * Translate Y
2145
+ * @see https://tailwindcss.com/docs/translate
2146
+ */
2147
+ "translate-y": [{
2148
+ "translate-y": [translate]
2149
+ }],
2150
+ /**
2151
+ * Skew X
2152
+ * @see https://tailwindcss.com/docs/skew
2153
+ */
2154
+ "skew-x": [{
2155
+ "skew-x": [skew]
2156
+ }],
2157
+ /**
2158
+ * Skew Y
2159
+ * @see https://tailwindcss.com/docs/skew
2160
+ */
2161
+ "skew-y": [{
2162
+ "skew-y": [skew]
2163
+ }],
2164
+ /**
2165
+ * Transform Origin
2166
+ * @see https://tailwindcss.com/docs/transform-origin
2167
+ */
2168
+ "transform-origin": [{
2169
+ origin: ["center", "top", "top-right", "right", "bottom-right", "bottom", "bottom-left", "left", "top-left", isArbitraryValue]
2170
+ }],
2171
+ // Interactivity
2172
+ /**
2173
+ * Accent Color
2174
+ * @see https://tailwindcss.com/docs/accent-color
2175
+ */
2176
+ accent: [{
2177
+ accent: ["auto", colors]
2178
+ }],
2179
+ /**
2180
+ * Appearance
2181
+ * @see https://tailwindcss.com/docs/appearance
2182
+ */
2183
+ appearance: [{
2184
+ appearance: ["none", "auto"]
2185
+ }],
2186
+ /**
2187
+ * Cursor
2188
+ * @see https://tailwindcss.com/docs/cursor
2189
+ */
2190
+ cursor: [{
2191
+ 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]
2192
+ }],
2193
+ /**
2194
+ * Caret Color
2195
+ * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities
2196
+ */
2197
+ "caret-color": [{
2198
+ caret: [colors]
2199
+ }],
2200
+ /**
2201
+ * Pointer Events
2202
+ * @see https://tailwindcss.com/docs/pointer-events
2203
+ */
2204
+ "pointer-events": [{
2205
+ "pointer-events": ["none", "auto"]
2206
+ }],
2207
+ /**
2208
+ * Resize
2209
+ * @see https://tailwindcss.com/docs/resize
2210
+ */
2211
+ resize: [{
2212
+ resize: ["none", "y", "x", ""]
2213
+ }],
2214
+ /**
2215
+ * Scroll Behavior
2216
+ * @see https://tailwindcss.com/docs/scroll-behavior
2217
+ */
2218
+ "scroll-behavior": [{
2219
+ scroll: ["auto", "smooth"]
2220
+ }],
2221
+ /**
2222
+ * Scroll Margin
2223
+ * @see https://tailwindcss.com/docs/scroll-margin
2224
+ */
2225
+ "scroll-m": [{
2226
+ "scroll-m": getSpacingWithArbitrary()
2227
+ }],
2228
+ /**
2229
+ * Scroll Margin X
2230
+ * @see https://tailwindcss.com/docs/scroll-margin
2231
+ */
2232
+ "scroll-mx": [{
2233
+ "scroll-mx": getSpacingWithArbitrary()
2234
+ }],
2235
+ /**
2236
+ * Scroll Margin Y
2237
+ * @see https://tailwindcss.com/docs/scroll-margin
2238
+ */
2239
+ "scroll-my": [{
2240
+ "scroll-my": getSpacingWithArbitrary()
2241
+ }],
2242
+ /**
2243
+ * Scroll Margin Start
2244
+ * @see https://tailwindcss.com/docs/scroll-margin
2245
+ */
2246
+ "scroll-ms": [{
2247
+ "scroll-ms": getSpacingWithArbitrary()
2248
+ }],
2249
+ /**
2250
+ * Scroll Margin End
2251
+ * @see https://tailwindcss.com/docs/scroll-margin
2252
+ */
2253
+ "scroll-me": [{
2254
+ "scroll-me": getSpacingWithArbitrary()
2255
+ }],
2256
+ /**
2257
+ * Scroll Margin Top
2258
+ * @see https://tailwindcss.com/docs/scroll-margin
2259
+ */
2260
+ "scroll-mt": [{
2261
+ "scroll-mt": getSpacingWithArbitrary()
2262
+ }],
2263
+ /**
2264
+ * Scroll Margin Right
2265
+ * @see https://tailwindcss.com/docs/scroll-margin
2266
+ */
2267
+ "scroll-mr": [{
2268
+ "scroll-mr": getSpacingWithArbitrary()
2269
+ }],
2270
+ /**
2271
+ * Scroll Margin Bottom
2272
+ * @see https://tailwindcss.com/docs/scroll-margin
2273
+ */
2274
+ "scroll-mb": [{
2275
+ "scroll-mb": getSpacingWithArbitrary()
2276
+ }],
2277
+ /**
2278
+ * Scroll Margin Left
2279
+ * @see https://tailwindcss.com/docs/scroll-margin
2280
+ */
2281
+ "scroll-ml": [{
2282
+ "scroll-ml": getSpacingWithArbitrary()
2283
+ }],
2284
+ /**
2285
+ * Scroll Padding
2286
+ * @see https://tailwindcss.com/docs/scroll-padding
2287
+ */
2288
+ "scroll-p": [{
2289
+ "scroll-p": getSpacingWithArbitrary()
2290
+ }],
2291
+ /**
2292
+ * Scroll Padding X
2293
+ * @see https://tailwindcss.com/docs/scroll-padding
2294
+ */
2295
+ "scroll-px": [{
2296
+ "scroll-px": getSpacingWithArbitrary()
2297
+ }],
2298
+ /**
2299
+ * Scroll Padding Y
2300
+ * @see https://tailwindcss.com/docs/scroll-padding
2301
+ */
2302
+ "scroll-py": [{
2303
+ "scroll-py": getSpacingWithArbitrary()
2304
+ }],
2305
+ /**
2306
+ * Scroll Padding Start
2307
+ * @see https://tailwindcss.com/docs/scroll-padding
2308
+ */
2309
+ "scroll-ps": [{
2310
+ "scroll-ps": getSpacingWithArbitrary()
2311
+ }],
2312
+ /**
2313
+ * Scroll Padding End
2314
+ * @see https://tailwindcss.com/docs/scroll-padding
2315
+ */
2316
+ "scroll-pe": [{
2317
+ "scroll-pe": getSpacingWithArbitrary()
2318
+ }],
2319
+ /**
2320
+ * Scroll Padding Top
2321
+ * @see https://tailwindcss.com/docs/scroll-padding
2322
+ */
2323
+ "scroll-pt": [{
2324
+ "scroll-pt": getSpacingWithArbitrary()
2325
+ }],
2326
+ /**
2327
+ * Scroll Padding Right
2328
+ * @see https://tailwindcss.com/docs/scroll-padding
2329
+ */
2330
+ "scroll-pr": [{
2331
+ "scroll-pr": getSpacingWithArbitrary()
2332
+ }],
2333
+ /**
2334
+ * Scroll Padding Bottom
2335
+ * @see https://tailwindcss.com/docs/scroll-padding
2336
+ */
2337
+ "scroll-pb": [{
2338
+ "scroll-pb": getSpacingWithArbitrary()
2339
+ }],
2340
+ /**
2341
+ * Scroll Padding Left
2342
+ * @see https://tailwindcss.com/docs/scroll-padding
2343
+ */
2344
+ "scroll-pl": [{
2345
+ "scroll-pl": getSpacingWithArbitrary()
2346
+ }],
2347
+ /**
2348
+ * Scroll Snap Align
2349
+ * @see https://tailwindcss.com/docs/scroll-snap-align
2350
+ */
2351
+ "snap-align": [{
2352
+ snap: ["start", "end", "center", "align-none"]
2353
+ }],
2354
+ /**
2355
+ * Scroll Snap Stop
2356
+ * @see https://tailwindcss.com/docs/scroll-snap-stop
2357
+ */
2358
+ "snap-stop": [{
2359
+ snap: ["normal", "always"]
2360
+ }],
2361
+ /**
2362
+ * Scroll Snap Type
2363
+ * @see https://tailwindcss.com/docs/scroll-snap-type
2364
+ */
2365
+ "snap-type": [{
2366
+ snap: ["none", "x", "y", "both"]
2367
+ }],
2368
+ /**
2369
+ * Scroll Snap Type Strictness
2370
+ * @see https://tailwindcss.com/docs/scroll-snap-type
2371
+ */
2372
+ "snap-strictness": [{
2373
+ snap: ["mandatory", "proximity"]
2374
+ }],
2375
+ /**
2376
+ * Touch Action
2377
+ * @see https://tailwindcss.com/docs/touch-action
2378
+ */
2379
+ touch: [{
2380
+ touch: ["auto", "none", "manipulation"]
2381
+ }],
2382
+ /**
2383
+ * Touch Action X
2384
+ * @see https://tailwindcss.com/docs/touch-action
2385
+ */
2386
+ "touch-x": [{
2387
+ "touch-pan": ["x", "left", "right"]
2388
+ }],
2389
+ /**
2390
+ * Touch Action Y
2391
+ * @see https://tailwindcss.com/docs/touch-action
2392
+ */
2393
+ "touch-y": [{
2394
+ "touch-pan": ["y", "up", "down"]
2395
+ }],
2396
+ /**
2397
+ * Touch Action Pinch Zoom
2398
+ * @see https://tailwindcss.com/docs/touch-action
2399
+ */
2400
+ "touch-pz": ["touch-pinch-zoom"],
2401
+ /**
2402
+ * User Select
2403
+ * @see https://tailwindcss.com/docs/user-select
2404
+ */
2405
+ select: [{
2406
+ select: ["none", "text", "all", "auto"]
2407
+ }],
2408
+ /**
2409
+ * Will Change
2410
+ * @see https://tailwindcss.com/docs/will-change
2411
+ */
2412
+ "will-change": [{
2413
+ "will-change": ["auto", "scroll", "contents", "transform", isArbitraryValue]
2414
+ }],
2415
+ // SVG
2416
+ /**
2417
+ * Fill
2418
+ * @see https://tailwindcss.com/docs/fill
2419
+ */
2420
+ fill: [{
2421
+ fill: [colors, "none"]
2422
+ }],
2423
+ /**
2424
+ * Stroke Width
2425
+ * @see https://tailwindcss.com/docs/stroke-width
2426
+ */
2427
+ "stroke-w": [{
2428
+ stroke: [isLength, isArbitraryLength, isArbitraryNumber]
2429
+ }],
2430
+ /**
2431
+ * Stroke
2432
+ * @see https://tailwindcss.com/docs/stroke
2433
+ */
2434
+ stroke: [{
2435
+ stroke: [colors, "none"]
2436
+ }],
2437
+ // Accessibility
2438
+ /**
2439
+ * Screen Readers
2440
+ * @see https://tailwindcss.com/docs/screen-readers
2441
+ */
2442
+ sr: ["sr-only", "not-sr-only"],
2443
+ /**
2444
+ * Forced Color Adjust
2445
+ * @see https://tailwindcss.com/docs/forced-color-adjust
2446
+ */
2447
+ "forced-color-adjust": [{
2448
+ "forced-color-adjust": ["auto", "none"]
2449
+ }]
2450
+ },
2451
+ conflictingClassGroups: {
2452
+ overflow: ["overflow-x", "overflow-y"],
2453
+ overscroll: ["overscroll-x", "overscroll-y"],
2454
+ inset: ["inset-x", "inset-y", "start", "end", "top", "right", "bottom", "left"],
2455
+ "inset-x": ["right", "left"],
2456
+ "inset-y": ["top", "bottom"],
2457
+ flex: ["basis", "grow", "shrink"],
2458
+ gap: ["gap-x", "gap-y"],
2459
+ p: ["px", "py", "ps", "pe", "pt", "pr", "pb", "pl"],
2460
+ px: ["pr", "pl"],
2461
+ py: ["pt", "pb"],
2462
+ m: ["mx", "my", "ms", "me", "mt", "mr", "mb", "ml"],
2463
+ mx: ["mr", "ml"],
2464
+ my: ["mt", "mb"],
2465
+ size: ["w", "h"],
2466
+ "font-size": ["leading"],
2467
+ "fvn-normal": ["fvn-ordinal", "fvn-slashed-zero", "fvn-figure", "fvn-spacing", "fvn-fraction"],
2468
+ "fvn-ordinal": ["fvn-normal"],
2469
+ "fvn-slashed-zero": ["fvn-normal"],
2470
+ "fvn-figure": ["fvn-normal"],
2471
+ "fvn-spacing": ["fvn-normal"],
2472
+ "fvn-fraction": ["fvn-normal"],
2473
+ "line-clamp": ["display", "overflow"],
2474
+ 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"],
2475
+ "rounded-s": ["rounded-ss", "rounded-es"],
2476
+ "rounded-e": ["rounded-se", "rounded-ee"],
2477
+ "rounded-t": ["rounded-tl", "rounded-tr"],
2478
+ "rounded-r": ["rounded-tr", "rounded-br"],
2479
+ "rounded-b": ["rounded-br", "rounded-bl"],
2480
+ "rounded-l": ["rounded-tl", "rounded-bl"],
2481
+ "border-spacing": ["border-spacing-x", "border-spacing-y"],
2482
+ "border-w": ["border-w-s", "border-w-e", "border-w-t", "border-w-r", "border-w-b", "border-w-l"],
2483
+ "border-w-x": ["border-w-r", "border-w-l"],
2484
+ "border-w-y": ["border-w-t", "border-w-b"],
2485
+ "border-color": ["border-color-s", "border-color-e", "border-color-t", "border-color-r", "border-color-b", "border-color-l"],
2486
+ "border-color-x": ["border-color-r", "border-color-l"],
2487
+ "border-color-y": ["border-color-t", "border-color-b"],
2488
+ "scroll-m": ["scroll-mx", "scroll-my", "scroll-ms", "scroll-me", "scroll-mt", "scroll-mr", "scroll-mb", "scroll-ml"],
2489
+ "scroll-mx": ["scroll-mr", "scroll-ml"],
2490
+ "scroll-my": ["scroll-mt", "scroll-mb"],
2491
+ "scroll-p": ["scroll-px", "scroll-py", "scroll-ps", "scroll-pe", "scroll-pt", "scroll-pr", "scroll-pb", "scroll-pl"],
2492
+ "scroll-px": ["scroll-pr", "scroll-pl"],
2493
+ "scroll-py": ["scroll-pt", "scroll-pb"],
2494
+ touch: ["touch-x", "touch-y", "touch-pz"],
2495
+ "touch-x": ["touch"],
2496
+ "touch-y": ["touch"],
2497
+ "touch-pz": ["touch"]
2498
+ },
2499
+ conflictingClassGroupModifiers: {
2500
+ "font-size": ["leading"]
2501
+ }
2502
+ };
2503
+ };
2504
+ var twMerge = /* @__PURE__ */ createTailwindMerge(getDefaultConfig);
2505
+
2506
+ // lib/cn.ts
2507
+ function cn(...inputs) {
2508
+ return twMerge(clsx(inputs));
2509
+ }
2510
+ var EventBusContext = React2.createContext(null);
2511
+
2512
+ // hooks/useEventBus.ts
2513
+ function getGlobalEventBus() {
2514
+ if (typeof window !== "undefined") {
2515
+ return window.__kflowEventBus ?? null;
2516
+ }
2517
+ return null;
2518
+ }
2519
+ var fallbackListeners = /* @__PURE__ */ new Map();
2520
+ var fallbackAnyListeners = /* @__PURE__ */ new Set();
2521
+ var fallbackEventBus = {
2522
+ emit: (type, payload) => {
2523
+ const event = {
2524
+ type,
2525
+ payload,
2526
+ timestamp: Date.now()
2527
+ };
2528
+ const handlers = fallbackListeners.get(type);
2529
+ if (handlers) {
2530
+ handlers.forEach((handler) => {
2531
+ try {
2532
+ handler(event);
2533
+ } catch (error) {
2534
+ console.error(`[EventBus] Error in listener for '${type}':`, error);
2535
+ }
2536
+ });
2537
+ }
2538
+ fallbackAnyListeners.forEach((handler) => {
2539
+ try {
2540
+ handler(event);
2541
+ } catch (error) {
2542
+ console.error(`[EventBus] Error in onAny listener for '${type}':`, error);
2543
+ }
2544
+ });
2545
+ },
2546
+ on: (type, listener) => {
2547
+ if (!fallbackListeners.has(type)) {
2548
+ fallbackListeners.set(type, /* @__PURE__ */ new Set());
2549
+ }
2550
+ fallbackListeners.get(type).add(listener);
2551
+ return () => {
2552
+ const handlers = fallbackListeners.get(type);
2553
+ if (handlers) {
2554
+ handlers.delete(listener);
2555
+ if (handlers.size === 0) {
2556
+ fallbackListeners.delete(type);
2557
+ }
2558
+ }
2559
+ };
2560
+ },
2561
+ once: (type, listener) => {
2562
+ const wrappedListener = (event) => {
2563
+ fallbackListeners.get(type)?.delete(wrappedListener);
2564
+ listener(event);
2565
+ };
2566
+ return fallbackEventBus.on(type, wrappedListener);
2567
+ },
2568
+ hasListeners: (type) => {
2569
+ const handlers = fallbackListeners.get(type);
2570
+ return handlers !== void 0 && handlers.size > 0;
2571
+ },
2572
+ onAny: (listener) => {
2573
+ fallbackAnyListeners.add(listener);
2574
+ return () => {
2575
+ fallbackAnyListeners.delete(listener);
2576
+ };
2577
+ }
2578
+ };
2579
+ function useEventBus() {
2580
+ const context = React2.useContext(EventBusContext);
2581
+ return context ?? getGlobalEventBus() ?? fallbackEventBus;
2582
+ }
2583
+ var paddingStyles = {
2584
+ none: "p-0",
2585
+ xs: "p-1",
2586
+ sm: "p-2",
2587
+ md: "p-4",
2588
+ lg: "p-6",
2589
+ xl: "p-8",
2590
+ "2xl": "p-12"
2591
+ };
2592
+ var paddingXStyles = {
2593
+ none: "px-0",
2594
+ xs: "px-1",
2595
+ sm: "px-2",
2596
+ md: "px-4",
2597
+ lg: "px-6",
2598
+ xl: "px-8",
2599
+ "2xl": "px-12"
2600
+ };
2601
+ var paddingYStyles = {
2602
+ none: "py-0",
2603
+ xs: "py-1",
2604
+ sm: "py-2",
2605
+ md: "py-4",
2606
+ lg: "py-6",
2607
+ xl: "py-8",
2608
+ "2xl": "py-12"
2609
+ };
2610
+ var marginStyles = {
2611
+ none: "m-0",
2612
+ xs: "m-1",
2613
+ sm: "m-2",
2614
+ md: "m-4",
2615
+ lg: "m-6",
2616
+ xl: "m-8",
2617
+ "2xl": "m-12",
2618
+ auto: "m-auto"
2619
+ };
2620
+ var marginXStyles = {
2621
+ none: "mx-0",
2622
+ xs: "mx-1",
2623
+ sm: "mx-2",
2624
+ md: "mx-4",
2625
+ lg: "mx-6",
2626
+ xl: "mx-8",
2627
+ "2xl": "mx-12",
2628
+ auto: "mx-auto"
2629
+ };
2630
+ var marginYStyles = {
2631
+ none: "my-0",
2632
+ xs: "my-1",
2633
+ sm: "my-2",
2634
+ md: "my-4",
2635
+ lg: "my-6",
2636
+ xl: "my-8",
2637
+ "2xl": "my-12",
2638
+ auto: "my-auto"
2639
+ };
2640
+ var bgStyles = {
2641
+ transparent: "bg-transparent",
2642
+ primary: "bg-primary text-primary-foreground",
2643
+ secondary: "bg-secondary text-secondary-foreground",
2644
+ muted: "bg-muted text-foreground",
2645
+ accent: "bg-accent text-accent-foreground",
2646
+ surface: "bg-card",
2647
+ overlay: "bg-card/80 backdrop-blur-sm"
2648
+ };
2649
+ var roundedStyles = {
2650
+ none: "rounded-none",
2651
+ sm: "rounded-sm",
2652
+ md: "rounded-md",
2653
+ lg: "rounded-lg",
2654
+ xl: "rounded-xl",
2655
+ "2xl": "rounded-xl",
2656
+ full: "rounded-full"
2657
+ };
2658
+ var shadowStyles = {
2659
+ none: "shadow-none",
2660
+ sm: "shadow-sm",
2661
+ md: "shadow",
2662
+ lg: "shadow-lg",
2663
+ xl: "shadow-lg"
2664
+ };
2665
+ var displayStyles = {
2666
+ block: "block",
2667
+ inline: "inline",
2668
+ "inline-block": "inline-block",
2669
+ flex: "flex",
2670
+ "inline-flex": "inline-flex",
2671
+ grid: "grid"
2672
+ };
2673
+ var overflowStyles = {
2674
+ auto: "overflow-auto",
2675
+ hidden: "overflow-hidden",
2676
+ visible: "overflow-visible",
2677
+ scroll: "overflow-scroll"
2678
+ };
2679
+ var positionStyles = {
2680
+ relative: "relative",
2681
+ absolute: "absolute",
2682
+ fixed: "fixed",
2683
+ sticky: "sticky"
2684
+ };
2685
+ var Box = React2__default.default.forwardRef(
2686
+ ({
2687
+ padding,
2688
+ paddingX,
2689
+ paddingY,
2690
+ margin,
2691
+ marginX,
2692
+ marginY,
2693
+ bg = "transparent",
2694
+ border = false,
2695
+ rounded = "none",
2696
+ shadow = "none",
2697
+ display,
2698
+ fullWidth = false,
2699
+ fullHeight = false,
2700
+ overflow,
2701
+ position,
2702
+ className,
2703
+ children,
2704
+ as: Component = "div",
2705
+ action,
2706
+ actionPayload,
2707
+ hoverEvent,
2708
+ onClick,
2709
+ onMouseEnter,
2710
+ onMouseLeave,
2711
+ ...rest
2712
+ }, ref) => {
2713
+ const eventBus = useEventBus();
2714
+ const handleClick = React2.useCallback((e) => {
2715
+ if (action) {
2716
+ e.stopPropagation();
2717
+ eventBus.emit(`UI:${action}`, actionPayload ?? {});
2718
+ }
2719
+ onClick?.(e);
2720
+ }, [action, actionPayload, eventBus, onClick]);
2721
+ const handleMouseEnter = React2.useCallback((e) => {
2722
+ if (hoverEvent) {
2723
+ eventBus.emit(`UI:${hoverEvent}`, { hovered: true });
2724
+ }
2725
+ onMouseEnter?.(e);
2726
+ }, [hoverEvent, eventBus, onMouseEnter]);
2727
+ const handleMouseLeave = React2.useCallback((e) => {
2728
+ if (hoverEvent) {
2729
+ eventBus.emit(`UI:${hoverEvent}`, { hovered: false });
2730
+ }
2731
+ onMouseLeave?.(e);
2732
+ }, [hoverEvent, eventBus, onMouseLeave]);
2733
+ const isClickable = action || onClick;
2734
+ const Comp = Component;
2735
+ return /* @__PURE__ */ jsxRuntime.jsx(
2736
+ Comp,
2737
+ {
2738
+ ref,
2739
+ className: cn(
2740
+ // Padding
2741
+ padding && paddingStyles[padding],
2742
+ paddingX && paddingXStyles[paddingX],
2743
+ paddingY && paddingYStyles[paddingY],
2744
+ // Margin
2745
+ margin && marginStyles[margin],
2746
+ marginX && marginXStyles[marginX],
2747
+ marginY && marginYStyles[marginY],
2748
+ // Background
2749
+ bgStyles[bg],
2750
+ // Border - uses theme variables
2751
+ border && "border-[length:var(--border-width)] border-border",
2752
+ // Rounded
2753
+ roundedStyles[rounded],
2754
+ // Shadow
2755
+ shadowStyles[shadow],
2756
+ // Display
2757
+ display && displayStyles[display],
2758
+ // Dimensions
2759
+ fullWidth && "w-full",
2760
+ fullHeight && "h-full",
2761
+ // Overflow
2762
+ overflow && overflowStyles[overflow],
2763
+ // Position
2764
+ position && positionStyles[position],
2765
+ // Cursor for clickable
2766
+ isClickable && "cursor-pointer",
2767
+ className
2768
+ ),
2769
+ onClick: isClickable ? handleClick : void 0,
2770
+ onMouseEnter: hoverEvent || onMouseEnter ? handleMouseEnter : void 0,
2771
+ onMouseLeave: hoverEvent || onMouseLeave ? handleMouseLeave : void 0,
2772
+ ...rest,
2773
+ children
2774
+ }
2775
+ );
2776
+ }
2777
+ );
2778
+ Box.displayName = "Box";
2779
+ var variantStyles = {
2780
+ h1: "text-4xl font-bold tracking-tight text-foreground",
2781
+ h2: "text-3xl font-bold tracking-tight text-foreground",
2782
+ h3: "text-2xl font-bold text-foreground",
2783
+ h4: "text-xl font-bold text-foreground",
2784
+ h5: "text-lg font-bold text-foreground",
2785
+ h6: "text-base font-bold text-foreground",
2786
+ heading: "text-2xl font-bold text-foreground",
2787
+ subheading: "text-lg font-semibold text-foreground",
2788
+ body1: "text-base font-normal text-foreground",
2789
+ body2: "text-sm font-normal text-foreground",
2790
+ body: "text-base font-normal text-foreground",
2791
+ caption: "text-xs font-normal text-muted-foreground",
2792
+ overline: "text-xs uppercase tracking-wide font-bold text-muted-foreground",
2793
+ small: "text-sm font-normal text-foreground",
2794
+ large: "text-lg font-medium text-foreground",
2795
+ label: "text-sm font-medium text-foreground"
2796
+ };
2797
+ var colorStyles = {
2798
+ primary: "text-foreground",
2799
+ secondary: "text-muted-foreground",
2800
+ muted: "text-muted-foreground",
2801
+ error: "text-error",
2802
+ success: "text-success",
2803
+ warning: "text-warning",
2804
+ inherit: "text-inherit"
2805
+ };
2806
+ var weightStyles = {
2807
+ light: "font-light",
2808
+ normal: "font-normal",
2809
+ medium: "font-medium",
2810
+ semibold: "font-semibold",
2811
+ bold: "font-bold"
2812
+ };
2813
+ var defaultElements = {
2814
+ h1: "h1",
2815
+ h2: "h2",
2816
+ h3: "h3",
2817
+ h4: "h4",
2818
+ h5: "h5",
2819
+ h6: "h6",
2820
+ heading: "h2",
2821
+ subheading: "h3",
2822
+ body1: "p",
2823
+ body2: "p",
2824
+ body: "p",
2825
+ caption: "span",
2826
+ overline: "span",
2827
+ small: "span",
2828
+ large: "p",
2829
+ label: "span"
2830
+ };
2831
+ var typographySizeStyles = {
2832
+ xs: "text-xs",
2833
+ sm: "text-sm",
2834
+ md: "text-base",
2835
+ lg: "text-lg",
2836
+ xl: "text-xl",
2837
+ "2xl": "text-2xl",
2838
+ "3xl": "text-3xl"
2839
+ };
2840
+ var overflowStyles2 = {
2841
+ visible: "overflow-visible",
2842
+ hidden: "overflow-hidden",
2843
+ wrap: "break-words overflow-hidden",
2844
+ "clamp-2": "overflow-hidden line-clamp-2",
2845
+ "clamp-3": "overflow-hidden line-clamp-3"
2846
+ };
2847
+ var Typography = ({
2848
+ variant: variantProp,
2849
+ level,
2850
+ color = "primary",
2851
+ align,
2852
+ weight,
2853
+ size,
2854
+ truncate: truncate2 = false,
2855
+ overflow,
2856
+ as,
2857
+ id,
2858
+ className,
2859
+ style,
2860
+ content,
2861
+ children
2862
+ }) => {
2863
+ const variant = variantProp ?? (level ? `h${level}` : "body1");
2864
+ const Component = as || defaultElements[variant];
2865
+ const Comp = Component;
2866
+ return /* @__PURE__ */ jsxRuntime.jsx(
2867
+ Comp,
2868
+ {
2869
+ id,
2870
+ className: cn(
2871
+ variantStyles[variant],
2872
+ colorStyles[color],
2873
+ weight && weightStyles[weight],
2874
+ size && typographySizeStyles[size],
2875
+ align && `text-${align}`,
2876
+ truncate2 && "truncate overflow-hidden text-ellipsis",
2877
+ overflow && overflowStyles2[overflow],
2878
+ className
2879
+ ),
2880
+ style,
2881
+ children: children ?? content
2882
+ }
2883
+ );
2884
+ };
2885
+ Typography.displayName = "Typography";
2886
+ var gapStyles = {
2887
+ none: "gap-0",
2888
+ xs: "gap-1",
2889
+ sm: "gap-2",
2890
+ md: "gap-4",
2891
+ lg: "gap-6",
2892
+ xl: "gap-8",
2893
+ "2xl": "gap-12"
2894
+ };
2895
+ var alignStyles = {
2896
+ start: "items-start",
2897
+ center: "items-center",
2898
+ end: "items-end",
2899
+ stretch: "items-stretch",
2900
+ baseline: "items-baseline"
2901
+ };
2902
+ var justifyStyles = {
2903
+ start: "justify-start",
2904
+ center: "justify-center",
2905
+ end: "justify-end",
2906
+ between: "justify-between",
2907
+ around: "justify-around",
2908
+ evenly: "justify-evenly"
2909
+ };
2910
+ var Stack = ({
2911
+ direction = "vertical",
2912
+ gap = "md",
2913
+ align = "stretch",
2914
+ justify = "start",
2915
+ wrap = false,
2916
+ reverse = false,
2917
+ flex = false,
2918
+ className,
2919
+ style,
2920
+ children,
2921
+ as: Component = "div",
2922
+ onClick,
2923
+ onKeyDown,
2924
+ role,
2925
+ tabIndex,
2926
+ action,
2927
+ actionPayload,
2928
+ responsive = false
2929
+ }) => {
2930
+ const eventBus = useEventBus();
2931
+ const handleClick = (e) => {
2932
+ if (action) {
2933
+ eventBus.emit(`UI:${action}`, actionPayload ?? {});
2934
+ }
2935
+ onClick?.(e);
2936
+ };
2937
+ const isHorizontal = direction === "horizontal";
2938
+ 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";
2939
+ const Comp = Component;
2940
+ return /* @__PURE__ */ jsxRuntime.jsx(
2941
+ Comp,
2942
+ {
2943
+ className: cn(
2944
+ "flex",
2945
+ directionClass,
2946
+ gapStyles[gap],
2947
+ alignStyles[align],
2948
+ justifyStyles[justify],
2949
+ wrap && "flex-wrap",
2950
+ flex && "flex-1",
2951
+ className
2952
+ ),
2953
+ style,
2954
+ onClick: action || onClick ? handleClick : void 0,
2955
+ onKeyDown,
2956
+ role,
2957
+ tabIndex,
2958
+ children
2959
+ }
2960
+ );
2961
+ };
2962
+ var VStack = (props) => /* @__PURE__ */ jsxRuntime.jsx(Stack, { direction: "vertical", ...props });
2963
+ var HStack = (props) => /* @__PURE__ */ jsxRuntime.jsx(Stack, { direction: "horizontal", ...props });
2964
+ var FlowPort = ({
2965
+ direction,
2966
+ portType,
2967
+ label,
2968
+ connected = false,
2969
+ compatible = false,
2970
+ className
2971
+ }) => {
2972
+ const dot = /* @__PURE__ */ jsxRuntime.jsx(
2973
+ Box,
2974
+ {
2975
+ className: cn(
2976
+ "w-3 h-3 rounded-full shrink-0 transition-all duration-150",
2977
+ connected ? "bg-primary" : "bg-transparent border-[length:var(--border-width)] border-muted-foreground",
2978
+ compatible && "ring-2 ring-success ring-offset-1 ring-offset-background",
2979
+ className
2980
+ ),
2981
+ role: "presentation",
2982
+ "aria-label": `${direction} port: ${portType}`
2983
+ }
2984
+ );
2985
+ if (!label) return dot;
2986
+ return /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", className: cn(direction === "in" ? "flex-row-reverse" : "flex-row"), children: [
2987
+ dot,
2988
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", className: "text-muted-foreground select-none whitespace-nowrap", children: label })
2989
+ ] });
2990
+ };
2991
+ FlowPort.displayName = "FlowPort";
2992
+ var FlowNodeShell = ({
2993
+ selected = false,
2994
+ warning = false,
2995
+ nodeType,
2996
+ headerColor = "var(--color-primary)",
2997
+ children,
2998
+ className
2999
+ }) => /* @__PURE__ */ jsxRuntime.jsxs(
3000
+ Box,
3001
+ {
3002
+ className: cn(
3003
+ "rounded-md overflow-hidden bg-card",
3004
+ "border-[length:var(--border-width)] border-border",
3005
+ "shadow-sm transition-shadow duration-150 min-w-[140px]",
3006
+ selected && "ring-2 ring-primary",
3007
+ warning && !selected && "ring-2 ring-dashed ring-warning",
3008
+ className
3009
+ ),
3010
+ children: [
3011
+ /* @__PURE__ */ jsxRuntime.jsx(
3012
+ Box,
3013
+ {
3014
+ className: "flex items-center px-2",
3015
+ style: { backgroundColor: headerColor, height: 8 },
3016
+ children: nodeType && /* @__PURE__ */ jsxRuntime.jsx(
3017
+ Typography,
3018
+ {
3019
+ variant: "caption",
3020
+ className: "text-white/90 font-semibold select-none leading-none sr-only",
3021
+ children: nodeType
3022
+ }
3023
+ )
3024
+ }
3025
+ ),
3026
+ nodeType && /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "px-2 pt-1.5 pb-0.5", children: /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", className: "text-muted-foreground font-semibold uppercase tracking-wider select-none", children: nodeType }) }),
3027
+ /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "px-2 pb-2", children })
3028
+ ]
3029
+ }
3030
+ );
3031
+ FlowNodeShell.displayName = "FlowNodeShell";
3032
+ var iconAliases = {
3033
+ "close": LucideIcons__namespace.X,
3034
+ "trash": LucideIcons__namespace.Trash2,
3035
+ "loader": LucideIcons__namespace.Loader2,
3036
+ "stop": LucideIcons__namespace.Square,
3037
+ "volume": LucideIcons__namespace.Volume2,
3038
+ "volume-off": LucideIcons__namespace.VolumeX,
3039
+ "refresh": LucideIcons__namespace.RefreshCw,
3040
+ "share": LucideIcons__namespace.Share2,
3041
+ "sort-asc": LucideIcons__namespace.ArrowUpNarrowWide,
3042
+ "sort-desc": LucideIcons__namespace.ArrowDownNarrowWide
3043
+ };
3044
+ function kebabToPascal(name) {
3045
+ return name.split("-").map((part) => {
3046
+ if (/^\d+$/.test(part)) return part;
3047
+ return part.charAt(0).toUpperCase() + part.slice(1);
3048
+ }).join("");
3049
+ }
3050
+ var resolvedCache = /* @__PURE__ */ new Map();
3051
+ function resolveIcon(name) {
3052
+ const cached = resolvedCache.get(name);
3053
+ if (cached) return cached;
3054
+ const resolved = doResolve(name);
3055
+ resolvedCache.set(name, resolved);
3056
+ return resolved;
3057
+ }
3058
+ function doResolve(name) {
3059
+ if (iconAliases[name]) return iconAliases[name];
3060
+ const pascalName = kebabToPascal(name);
3061
+ const directLookup = LucideIcons__namespace[pascalName];
3062
+ if (directLookup && typeof directLookup === "object") return directLookup;
3063
+ const asIs = LucideIcons__namespace[name];
3064
+ if (asIs && typeof asIs === "object") return asIs;
3065
+ return LucideIcons__namespace.HelpCircle;
3066
+ }
3067
+ var sizeClasses = {
3068
+ xs: "w-3 h-3",
3069
+ sm: "w-4 h-4",
3070
+ md: "w-5 h-5",
3071
+ lg: "w-6 h-6",
3072
+ xl: "w-8 h-8"
3073
+ };
3074
+ var animationClasses = {
3075
+ none: "",
3076
+ spin: "animate-spin",
3077
+ pulse: "animate-pulse"
3078
+ };
3079
+ var Icon = ({
3080
+ icon,
3081
+ name,
3082
+ size = "md",
3083
+ color,
3084
+ animation = "none",
3085
+ className,
3086
+ strokeWidth,
3087
+ style
3088
+ }) => {
3089
+ const IconComponent = icon ?? (name ? resolveIcon(name) : LucideIcons__namespace.HelpCircle);
3090
+ const effectiveStrokeWidth = strokeWidth ?? void 0;
3091
+ return /* @__PURE__ */ jsxRuntime.jsx(
3092
+ IconComponent,
3093
+ {
3094
+ className: cn(
3095
+ sizeClasses[size],
3096
+ animationClasses[animation],
3097
+ // Use theme's icon color or provided color
3098
+ color ? color : "text-[var(--icon-color,currentColor)]",
3099
+ className
3100
+ ),
3101
+ strokeWidth: effectiveStrokeWidth,
3102
+ style: {
3103
+ ...effectiveStrokeWidth === void 0 ? { strokeWidth: "var(--icon-stroke-width, 2)" } : {},
3104
+ ...style
3105
+ }
3106
+ }
3107
+ );
3108
+ };
3109
+ Icon.displayName = "Icon";
3110
+ var variantStyles2 = {
3111
+ default: [
3112
+ "bg-muted text-foreground",
3113
+ "border-[length:var(--border-width-thin)] border-border"
3114
+ ].join(" "),
3115
+ primary: "bg-primary text-primary-foreground",
3116
+ secondary: "bg-secondary text-secondary-foreground",
3117
+ success: [
3118
+ "bg-surface text-success",
3119
+ "border-[length:var(--border-width)] border-success"
3120
+ ].join(" "),
3121
+ warning: [
3122
+ "bg-surface text-warning",
3123
+ "border-[length:var(--border-width)] border-warning"
3124
+ ].join(" "),
3125
+ danger: [
3126
+ "bg-surface text-error",
3127
+ "border-[length:var(--border-width)] border-error"
3128
+ ].join(" "),
3129
+ error: [
3130
+ "bg-surface text-error",
3131
+ "border-[length:var(--border-width)] border-error"
3132
+ ].join(" "),
3133
+ info: [
3134
+ "bg-surface text-info",
3135
+ "border-[length:var(--border-width)] border-info"
3136
+ ].join(" "),
3137
+ neutral: [
3138
+ "bg-muted text-muted-foreground",
3139
+ "border-[length:var(--border-width-thin)] border-border"
3140
+ ].join(" ")
3141
+ };
3142
+ var sizeStyles2 = {
3143
+ sm: "px-2 py-0.5 text-xs",
3144
+ md: "px-2.5 py-1 text-sm",
3145
+ lg: "px-3 py-1.5 text-base"
3146
+ };
3147
+ var Badge = React2__default.default.forwardRef(
3148
+ ({ className, variant = "default", size = "sm", amount, label, icon, children, ...props }, ref) => {
3149
+ const iconSizes = { sm: "w-3 h-3", md: "w-3.5 h-3.5", lg: "w-4 h-4" };
3150
+ const resolvedIcon = typeof icon === "string" ? (() => {
3151
+ const I = resolveIcon(icon);
3152
+ return I ? /* @__PURE__ */ jsxRuntime.jsx(I, { className: iconSizes[size] }) : null;
3153
+ })() : icon;
3154
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3155
+ "span",
3156
+ {
3157
+ ref,
3158
+ className: cn(
3159
+ "inline-flex items-center gap-1 font-bold rounded-sm",
3160
+ variantStyles2[variant],
3161
+ sizeStyles2[size],
3162
+ className
3163
+ ),
3164
+ ...props,
3165
+ children: [
3166
+ resolvedIcon,
3167
+ children || (amount != null ? `${label ? `${label} ` : ""}${amount}` : label)
3168
+ ]
3169
+ }
3170
+ );
3171
+ }
3172
+ );
3173
+ Badge.displayName = "Badge";
3174
+ var variantToBadge = {
3175
+ default: "neutral",
3176
+ primary: "primary",
3177
+ warning: "warning",
3178
+ error: "danger"
3179
+ };
3180
+ var FlowLabel = ({
3181
+ text,
3182
+ truncate: truncate2,
3183
+ variant = "default",
3184
+ className
3185
+ }) => {
3186
+ const isTruncated = truncate2 != null && text.length > truncate2;
3187
+ const display = isTruncated ? `${text.slice(0, truncate2)}...` : text;
3188
+ return /* @__PURE__ */ jsxRuntime.jsx(
3189
+ Badge,
3190
+ {
3191
+ variant: variantToBadge[variant],
3192
+ size: "sm",
3193
+ className: cn("max-w-[180px] cursor-default", className),
3194
+ title: isTruncated ? text : void 0,
3195
+ children: display
3196
+ }
3197
+ );
3198
+ };
3199
+ FlowLabel.displayName = "FlowLabel";
3200
+
3201
+ // components/atoms/avl/types.ts
3202
+ var AVL_OPERATOR_COLORS = {
3203
+ arithmetic: "#4A90D9",
3204
+ comparison: "#E8913A",
3205
+ logic: "#9B59B6",
3206
+ string: "#27AE60",
3207
+ collection: "#1ABC9C",
3208
+ time: "#F39C12",
3209
+ control: "#E74C3C",
3210
+ async: "#E91E8F"
3211
+ };
3212
+ var STATE_COLORS = {
3213
+ initial: { fill: "#22C55E1F", border: "#16A34A" },
3214
+ terminal: { fill: "#EF44441F", border: "#DC2626" },
3215
+ hub: { fill: "#3B82F61F", border: "#2563EB" },
3216
+ error: { fill: "#F59E0B1F", border: "#D97706" },
3217
+ default: { fill: "#6B72801F", border: "#4B5563" }
3218
+ };
3219
+ var EFFECT_CATEGORY_COLORS = {
3220
+ ui: { color: "#8B5CF6", bg: "#8B5CF614" },
3221
+ data: { color: "#3B82F6", bg: "#3B82F614" },
3222
+ communication: { color: "#F97316", bg: "#F9731614" },
3223
+ lifecycle: { color: "#10B981", bg: "#10B98114" },
3224
+ control: { color: "#6B7280", bg: "#6B728014" }
3225
+ };
3226
+ var EFFECT_TYPE_TO_CATEGORY = {
3227
+ "render-ui": "ui",
3228
+ "navigate": "ui",
3229
+ "set": "data",
3230
+ "persist": "data",
3231
+ "fetch": "data",
3232
+ "emit": "communication",
3233
+ "notify": "communication",
3234
+ "call-service": "communication",
3235
+ "spawn": "lifecycle",
3236
+ "despawn": "lifecycle",
3237
+ "do": "control",
3238
+ "if": "control",
3239
+ "log": "control"
3240
+ };
3241
+ var CONNECTION_COLORS = {
3242
+ forward: { color: "#1E293B", width: 2, dash: "none" },
3243
+ backward: { color: "#94A3B8", width: 1.5, dash: "6 3" },
3244
+ emitListen: { color: "#F97316", width: 1.5, dash: "4 3" }
3245
+ };
3246
+ var wireTypeToColor = {
3247
+ transition: CONNECTION_COLORS.forward.color,
3248
+ event: CONNECTION_COLORS.emitListen.color,
3249
+ data: "#3B82F6",
3250
+ guard: "#9B59B6"
3251
+ };
3252
+ var wireTypeToWidth = {
3253
+ transition: CONNECTION_COLORS.forward.width,
3254
+ event: CONNECTION_COLORS.emitListen.width,
3255
+ data: 1.5,
3256
+ guard: 1.5
3257
+ };
3258
+ var wireTypeToDash = {
3259
+ transition: void 0,
3260
+ event: CONNECTION_COLORS.emitListen.dash,
3261
+ data: "5 3",
3262
+ guard: "3 3"
3263
+ };
3264
+ function getFlowWireStyle(props) {
3265
+ const { wireType = "transition", status = "valid", animated = false } = props;
3266
+ let stroke = wireTypeToColor[wireType];
3267
+ if (status === "invalid") {
3268
+ stroke = "var(--color-destructive, #EF4444)";
3269
+ }
3270
+ const strokeWidth = wireTypeToWidth[wireType];
3271
+ let strokeDasharray = wireTypeToDash[wireType];
3272
+ if (status === "pending") {
3273
+ strokeDasharray = "6 4";
3274
+ }
3275
+ const animation = animated || status === "pending" ? "flow-wire-dash 1s linear infinite" : void 0;
3276
+ return { stroke, strokeWidth, strokeDasharray, animation };
3277
+ }
3278
+ var FlowWire = ({
3279
+ wireType = "transition",
3280
+ status = "valid",
3281
+ animated = false,
3282
+ d,
3283
+ className
3284
+ }) => {
3285
+ const style = getFlowWireStyle({ wireType, status, animated });
3286
+ return /* @__PURE__ */ jsxRuntime.jsx(
3287
+ "path",
3288
+ {
3289
+ d,
3290
+ fill: "none",
3291
+ stroke: style.stroke,
3292
+ strokeWidth: style.strokeWidth,
3293
+ strokeDasharray: style.strokeDasharray,
3294
+ className: cn(
3295
+ "transition-colors duration-150",
3296
+ (animated || status === "pending") && "animate-[flow-wire-dash_1s_linear_infinite]",
3297
+ className
3298
+ ),
3299
+ style: style.animation ? { animation: style.animation } : void 0
3300
+ }
3301
+ );
3302
+ };
3303
+ FlowWire.displayName = "FlowWire";
3304
+ var MINIMAP_COLORS = {
3305
+ nodeColor: "var(--color-primary, #3B82F6)",
3306
+ maskColor: "var(--color-background, #ffffff80)",
3307
+ nodeStrokeColor: "var(--color-border, #E5E7EB)"
3308
+ };
3309
+ var FlowMinimap = ({
3310
+ className,
3311
+ children
3312
+ }) => /* @__PURE__ */ jsxRuntime.jsx(
3313
+ Box,
3314
+ {
3315
+ className: cn(
3316
+ "rounded-md overflow-hidden",
3317
+ "bg-card border-[length:var(--border-width)] border-border",
3318
+ "shadow-sm",
3319
+ className
3320
+ ),
3321
+ children
3322
+ }
3323
+ );
3324
+ FlowMinimap.displayName = "FlowMinimap";
3325
+ function resolveRole(data) {
3326
+ if (data.isInitial) return "initial";
3327
+ if (data.isTerminal) return "terminal";
3328
+ return "default";
3329
+ }
3330
+ var FlowStateNode = ({
3331
+ data,
3332
+ selected = false
3333
+ }) => {
3334
+ const role = resolveRole(data);
3335
+ const colors = STATE_COLORS[role];
3336
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3337
+ FlowNodeShell,
3338
+ {
3339
+ selected,
3340
+ nodeType: "State",
3341
+ headerColor: colors.border,
3342
+ className: cn("min-w-[120px]"),
3343
+ children: [
3344
+ /* @__PURE__ */ jsxRuntime.jsx(
3345
+ react.Handle,
3346
+ {
3347
+ type: "target",
3348
+ position: react.Position.Top,
3349
+ className: "!bg-muted-foreground !w-2 !h-2"
3350
+ }
3351
+ ),
3352
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", className: "font-semibold text-center select-none", children: data.name }),
3353
+ (data.isInitial || data.isTerminal) && /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", justify: "center", className: "mt-1", children: [
3354
+ data.isInitial && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "success", size: "sm", children: "initial" }),
3355
+ data.isTerminal && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "danger", size: "sm", children: "terminal" })
3356
+ ] }),
3357
+ /* @__PURE__ */ jsxRuntime.jsx(
3358
+ react.Handle,
3359
+ {
3360
+ type: "source",
3361
+ position: react.Position.Bottom,
3362
+ className: "!bg-muted-foreground !w-2 !h-2"
3363
+ }
3364
+ )
3365
+ ]
3366
+ }
3367
+ );
3368
+ };
3369
+ FlowStateNode.displayName = "FlowStateNode";
3370
+ var OrbitalNode = ({
3371
+ data,
3372
+ selected = false
3373
+ }) => {
3374
+ const handleSpacing = 24;
3375
+ const maxPorts = Math.max(data.emits.length, data.listens.length, 1);
3376
+ const bodyHeight = maxPorts * handleSpacing + 24;
3377
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3378
+ FlowNodeShell,
3379
+ {
3380
+ selected,
3381
+ nodeType: "Orbital",
3382
+ headerColor: "var(--color-primary)",
3383
+ className: cn("min-w-[180px]"),
3384
+ children: [
3385
+ data.listens.map((event, i) => /* @__PURE__ */ jsxRuntime.jsx(
3386
+ react.Handle,
3387
+ {
3388
+ type: "target",
3389
+ position: react.Position.Left,
3390
+ id: `listen-${event}`,
3391
+ className: "!bg-orange-500 !w-2 !h-2",
3392
+ style: { top: 48 + i * handleSpacing }
3393
+ },
3394
+ `listen-${event}`
3395
+ )),
3396
+ /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "xs", style: { minHeight: bodyHeight }, children: [
3397
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", className: "font-semibold select-none", children: data.name }),
3398
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", className: "text-muted-foreground select-none", children: data.entityName }),
3399
+ /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", className: "text-muted-foreground select-none", children: [
3400
+ data.traitCount,
3401
+ " traits, ",
3402
+ data.pageCount,
3403
+ " pages"
3404
+ ] }),
3405
+ data.listens.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(VStack, { gap: "none", className: "mt-1", children: data.listens.map((event) => /* @__PURE__ */ jsxRuntime.jsx(
3406
+ Typography,
3407
+ {
3408
+ variant: "caption",
3409
+ className: "text-orange-500 select-none text-left",
3410
+ children: event
3411
+ },
3412
+ event
3413
+ )) }),
3414
+ data.emits.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(VStack, { gap: "none", className: "mt-1", children: data.emits.map((event) => /* @__PURE__ */ jsxRuntime.jsx(
3415
+ Typography,
3416
+ {
3417
+ variant: "caption",
3418
+ className: "text-orange-500 select-none text-right",
3419
+ children: event
3420
+ },
3421
+ event
3422
+ )) })
3423
+ ] }),
3424
+ data.emits.map((event, i) => /* @__PURE__ */ jsxRuntime.jsx(
3425
+ react.Handle,
3426
+ {
3427
+ type: "source",
3428
+ position: react.Position.Right,
3429
+ id: `emit-${event}`,
3430
+ className: "!bg-orange-500 !w-2 !h-2",
3431
+ style: { top: 48 + i * handleSpacing }
3432
+ },
3433
+ `emit-${event}`
3434
+ ))
3435
+ ]
3436
+ }
3437
+ );
3438
+ };
3439
+ OrbitalNode.displayName = "OrbitalNode";
3440
+ var MAX_DESC = 60;
3441
+ function truncate(text, max) {
3442
+ if (!text) return "";
3443
+ return text.length > max ? `${text.slice(0, max)}...` : text;
3444
+ }
3445
+ var BehaviorNode = ({
3446
+ data,
3447
+ selected = false
3448
+ }) => {
3449
+ const handleSpacing = 24;
3450
+ const maxPorts = Math.max(data.emits.length, data.listens.length, 1);
3451
+ const bodyHeight = maxPorts * handleSpacing + 24;
3452
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3453
+ FlowNodeShell,
3454
+ {
3455
+ selected,
3456
+ nodeType: "Behavior",
3457
+ headerColor: "#10B981",
3458
+ className: cn("min-w-[170px]"),
3459
+ children: [
3460
+ data.listens.map((event, i) => /* @__PURE__ */ jsxRuntime.jsx(
3461
+ react.Handle,
3462
+ {
3463
+ type: "target",
3464
+ position: react.Position.Left,
3465
+ id: `listen-${event}`,
3466
+ className: "!bg-orange-500 !w-2 !h-2",
3467
+ style: { top: 48 + i * handleSpacing }
3468
+ },
3469
+ `listen-${event}`
3470
+ )),
3471
+ /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "xs", style: { minHeight: bodyHeight }, children: [
3472
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", className: "font-semibold select-none", children: data.name }),
3473
+ data.description && /* @__PURE__ */ jsxRuntime.jsx(Box, { title: data.description.length > MAX_DESC ? data.description : void 0, children: /* @__PURE__ */ jsxRuntime.jsx(
3474
+ Typography,
3475
+ {
3476
+ variant: "caption",
3477
+ className: "text-muted-foreground select-none",
3478
+ children: truncate(data.description, MAX_DESC)
3479
+ }
3480
+ ) }),
3481
+ /* @__PURE__ */ jsxRuntime.jsxs(Typography, { variant: "caption", className: "text-muted-foreground select-none", children: [
3482
+ data.stateCount,
3483
+ " states"
3484
+ ] })
3485
+ ] }),
3486
+ data.emits.map((event, i) => /* @__PURE__ */ jsxRuntime.jsx(
3487
+ react.Handle,
3488
+ {
3489
+ type: "source",
3490
+ position: react.Position.Right,
3491
+ id: `emit-${event}`,
3492
+ className: "!bg-orange-500 !w-2 !h-2",
3493
+ style: { top: 48 + i * handleSpacing }
3494
+ },
3495
+ `emit-${event}`
3496
+ ))
3497
+ ]
3498
+ }
3499
+ );
3500
+ };
3501
+ BehaviorNode.displayName = "BehaviorNode";
3502
+ var ExprNode = ({
3503
+ data,
3504
+ selected = false
3505
+ }) => {
3506
+ const ns = data.namespace ?? "arithmetic";
3507
+ const headerColor = AVL_OPERATOR_COLORS[ns];
3508
+ const handleSpacing = 22;
3509
+ const bodyHeight = Math.max(data.operandCount, 1) * handleSpacing + 12;
3510
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3511
+ FlowNodeShell,
3512
+ {
3513
+ selected,
3514
+ nodeType: "Expr",
3515
+ headerColor,
3516
+ className: cn("min-w-[100px]"),
3517
+ children: [
3518
+ Array.from({ length: data.operandCount }, (_, i) => /* @__PURE__ */ jsxRuntime.jsx(
3519
+ react.Handle,
3520
+ {
3521
+ type: "target",
3522
+ position: react.Position.Left,
3523
+ id: `operand-${i}`,
3524
+ className: "!w-2 !h-2",
3525
+ style: {
3526
+ top: 40 + i * handleSpacing,
3527
+ backgroundColor: headerColor
3528
+ }
3529
+ },
3530
+ `op-${i}`
3531
+ )),
3532
+ /* @__PURE__ */ jsxRuntime.jsx(
3533
+ Typography,
3534
+ {
3535
+ variant: "body",
3536
+ className: "font-mono font-bold text-center select-none",
3537
+ style: { color: headerColor, minHeight: bodyHeight },
3538
+ children: data.operator
3539
+ }
3540
+ ),
3541
+ /* @__PURE__ */ jsxRuntime.jsx(
3542
+ react.Handle,
3543
+ {
3544
+ type: "source",
3545
+ position: react.Position.Right,
3546
+ id: "result",
3547
+ className: "!w-2 !h-2",
3548
+ style: { backgroundColor: headerColor }
3549
+ }
3550
+ )
3551
+ ]
3552
+ }
3553
+ );
3554
+ };
3555
+ ExprNode.displayName = "ExprNode";
3556
+ var EFFECT_ICONS = {
3557
+ "render-ui": "\u229E",
3558
+ // grid
3559
+ "set": "\u270E",
3560
+ // pencil
3561
+ "persist": "\u26C1",
3562
+ // cylinder
3563
+ "fetch": "\u21E3",
3564
+ // down arrow
3565
+ "emit": "\u{1F4E1}",
3566
+ // antenna
3567
+ "navigate": "\u21E2",
3568
+ // right arrow
3569
+ "notify": "\u{1F514}",
3570
+ // bell
3571
+ "call-service": "\u21C4",
3572
+ // bidirectional
3573
+ "spawn": "\u2295",
3574
+ // plus circle
3575
+ "despawn": "\u2296",
3576
+ // minus circle
3577
+ "do": "\u25B6",
3578
+ // play
3579
+ "if": "\u25C7",
3580
+ // diamond
3581
+ "log": "\xB6"
3582
+ // pilcrow
3583
+ };
3584
+ function resolveCategory(data) {
3585
+ if (data.category) return data.category;
3586
+ const mapped = EFFECT_TYPE_TO_CATEGORY[data.effectType];
3587
+ return mapped ?? "control";
3588
+ }
3589
+ var EffectNode = ({
3590
+ data,
3591
+ selected = false
3592
+ }) => {
3593
+ const category = resolveCategory(data);
3594
+ const colors = EFFECT_CATEGORY_COLORS[category];
3595
+ const icon = EFFECT_ICONS[data.effectType] ?? "\u2022";
3596
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3597
+ FlowNodeShell,
3598
+ {
3599
+ selected,
3600
+ nodeType: "Effect",
3601
+ headerColor: colors.color,
3602
+ className: cn("min-w-[120px]"),
3603
+ children: [
3604
+ /* @__PURE__ */ jsxRuntime.jsx(
3605
+ react.Handle,
3606
+ {
3607
+ type: "target",
3608
+ position: react.Position.Left,
3609
+ className: "!w-2 !h-2",
3610
+ style: { backgroundColor: colors.color }
3611
+ }
3612
+ ),
3613
+ /* @__PURE__ */ jsxRuntime.jsxs(HStack, { gap: "xs", align: "center", children: [
3614
+ /* @__PURE__ */ jsxRuntime.jsx(
3615
+ Typography,
3616
+ {
3617
+ variant: "body",
3618
+ className: "select-none",
3619
+ style: { color: colors.color },
3620
+ children: icon
3621
+ }
3622
+ ),
3623
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "body", className: "font-semibold select-none", children: data.effectType })
3624
+ ] }),
3625
+ data.args && /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", className: "text-muted-foreground select-none mt-0.5 truncate max-w-[160px]", children: data.args }),
3626
+ /* @__PURE__ */ jsxRuntime.jsx(
3627
+ react.Handle,
3628
+ {
3629
+ type: "source",
3630
+ position: react.Position.Right,
3631
+ className: "!w-2 !h-2",
3632
+ style: { backgroundColor: colors.color }
3633
+ }
3634
+ )
3635
+ ]
3636
+ }
3637
+ );
3638
+ };
3639
+ EffectNode.displayName = "EffectNode";
3640
+ var TransitionEdge = ({
3641
+ id,
3642
+ sourceX,
3643
+ sourceY,
3644
+ targetX,
3645
+ targetY,
3646
+ sourcePosition,
3647
+ targetPosition,
3648
+ data,
3649
+ markerEnd,
3650
+ style
3651
+ }) => {
3652
+ const [edgePath, labelX, labelY] = react.getBezierPath({
3653
+ sourceX,
3654
+ sourceY,
3655
+ targetX,
3656
+ targetY,
3657
+ sourcePosition,
3658
+ targetPosition
3659
+ });
3660
+ const isBackward = targetX < sourceX;
3661
+ const connStyle = isBackward ? CONNECTION_COLORS.backward : CONNECTION_COLORS.forward;
3662
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3663
+ /* @__PURE__ */ jsxRuntime.jsx(
3664
+ react.BaseEdge,
3665
+ {
3666
+ id,
3667
+ path: edgePath,
3668
+ markerEnd,
3669
+ style: {
3670
+ stroke: connStyle.color,
3671
+ strokeWidth: connStyle.width,
3672
+ strokeDasharray: connStyle.dash,
3673
+ ...style
3674
+ }
3675
+ }
3676
+ ),
3677
+ /* @__PURE__ */ jsxRuntime.jsx(react.EdgeLabelRenderer, { children: /* @__PURE__ */ jsxRuntime.jsxs(
3678
+ Box,
3679
+ {
3680
+ className: cn(
3681
+ "absolute pointer-events-all nodrag nopan",
3682
+ "flex items-center gap-1"
3683
+ ),
3684
+ style: {
3685
+ transform: `translate(-50%, -50%) translate(${labelX}px, ${labelY}px)`
3686
+ },
3687
+ children: [
3688
+ data?.hasGuard && /* @__PURE__ */ jsxRuntime.jsx(
3689
+ Box,
3690
+ {
3691
+ className: "w-3 h-3 rotate-45 border border-amber-500 bg-amber-500/10 shrink-0",
3692
+ title: "Has guard"
3693
+ }
3694
+ ),
3695
+ /* @__PURE__ */ jsxRuntime.jsx(
3696
+ FlowLabel,
3697
+ {
3698
+ text: data?.event ?? "",
3699
+ truncate: 20,
3700
+ variant: "default"
3701
+ }
3702
+ ),
3703
+ data?.hasEffects && /* @__PURE__ */ jsxRuntime.jsx(
3704
+ Box,
3705
+ {
3706
+ className: "w-2.5 h-2.5 rounded-full bg-violet-500/80 shrink-0",
3707
+ title: "Has effects"
3708
+ }
3709
+ )
3710
+ ]
3711
+ }
3712
+ ) })
3713
+ ] });
3714
+ };
3715
+ TransitionEdge.displayName = "TransitionEdge";
3716
+ var EventWireEdge = ({
3717
+ id,
3718
+ sourceX,
3719
+ sourceY,
3720
+ targetX,
3721
+ targetY,
3722
+ sourcePosition,
3723
+ targetPosition,
3724
+ data,
3725
+ markerEnd,
3726
+ style
3727
+ }) => {
3728
+ const [edgePath, labelX, labelY] = react.getBezierPath({
3729
+ sourceX,
3730
+ sourceY,
3731
+ targetX,
3732
+ targetY,
3733
+ sourcePosition,
3734
+ targetPosition
3735
+ });
3736
+ const isCompatible = data?.compatible !== false;
3737
+ const wireColor = isCompatible ? CONNECTION_COLORS.emitListen.color : "#EF4444";
3738
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
3739
+ /* @__PURE__ */ jsxRuntime.jsx(
3740
+ react.BaseEdge,
3741
+ {
3742
+ id,
3743
+ path: edgePath,
3744
+ markerEnd,
3745
+ style: {
3746
+ stroke: wireColor,
3747
+ strokeWidth: CONNECTION_COLORS.emitListen.width,
3748
+ strokeDasharray: CONNECTION_COLORS.emitListen.dash,
3749
+ ...style
3750
+ }
3751
+ }
3752
+ ),
3753
+ /* @__PURE__ */ jsxRuntime.jsx(react.EdgeLabelRenderer, { children: /* @__PURE__ */ jsxRuntime.jsx(
3754
+ Box,
3755
+ {
3756
+ className: cn(
3757
+ "absolute pointer-events-all nodrag nopan",
3758
+ "flex items-center"
3759
+ ),
3760
+ style: {
3761
+ transform: `translate(-50%, -50%) translate(${labelX}px, ${labelY}px)`
3762
+ },
3763
+ children: /* @__PURE__ */ jsxRuntime.jsx(
3764
+ FlowLabel,
3765
+ {
3766
+ text: data?.event ?? "",
3767
+ truncate: 24,
3768
+ variant: isCompatible ? "primary" : "error"
3769
+ }
3770
+ )
3771
+ }
3772
+ ) })
3773
+ ] });
3774
+ };
3775
+ EventWireEdge.displayName = "EventWireEdge";
3776
+ var NodePalette = ({
3777
+ categories,
3778
+ className
3779
+ }) => {
3780
+ const handleDragStart = React2.useCallback(
3781
+ (event, nodeType) => {
3782
+ event.dataTransfer.setData("application/reactflow", nodeType);
3783
+ event.dataTransfer.effectAllowed = "move";
3784
+ },
3785
+ []
3786
+ );
3787
+ return /* @__PURE__ */ jsxRuntime.jsx(VStack, { gap: "md", className: cn("p-3 select-none", className), children: categories.map((cat) => /* @__PURE__ */ jsxRuntime.jsxs(VStack, { gap: "xs", children: [
3788
+ /* @__PURE__ */ jsxRuntime.jsx(
3789
+ Typography,
3790
+ {
3791
+ variant: "caption",
3792
+ className: "font-semibold uppercase tracking-wider text-muted-foreground",
3793
+ children: cat.name
3794
+ }
3795
+ ),
3796
+ /* @__PURE__ */ jsxRuntime.jsx(Box, { className: "grid grid-cols-2 gap-1.5", children: cat.items.map((item) => /* @__PURE__ */ jsxRuntime.jsxs(
3797
+ Box,
3798
+ {
3799
+ draggable: true,
3800
+ onDragStart: (e) => handleDragStart(e, item.type),
3801
+ className: cn(
3802
+ "flex flex-col items-center gap-1 p-2 rounded-md cursor-grab",
3803
+ "border border-border bg-card hover:bg-accent/50",
3804
+ "transition-colors duration-100",
3805
+ "active:cursor-grabbing"
3806
+ ),
3807
+ children: [
3808
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { name: item.icon, size: "sm" }),
3809
+ /* @__PURE__ */ jsxRuntime.jsx(Typography, { variant: "caption", className: "text-center leading-tight", children: item.label })
3810
+ ]
3811
+ },
3812
+ item.type
3813
+ )) })
3814
+ ] }, cat.name)) });
3815
+ };
3816
+ NodePalette.displayName = "NodePalette";
3817
+
3818
+ exports.BehaviorNode = BehaviorNode;
3819
+ exports.EffectNode = EffectNode;
3820
+ exports.EventWireEdge = EventWireEdge;
3821
+ exports.ExprNode = ExprNode;
3822
+ exports.FlowLabel = FlowLabel;
3823
+ exports.FlowMinimap = FlowMinimap;
3824
+ exports.FlowNodeShell = FlowNodeShell;
3825
+ exports.FlowPort = FlowPort;
3826
+ exports.FlowStateNode = FlowStateNode;
3827
+ exports.FlowWire = FlowWire;
3828
+ exports.MINIMAP_COLORS = MINIMAP_COLORS;
3829
+ exports.NodePalette = NodePalette;
3830
+ exports.OrbitalNode = OrbitalNode;
3831
+ exports.TransitionEdge = TransitionEdge;
3832
+ exports.getFlowWireStyle = getFlowWireStyle;