@tamagui/tailwind 0.0.0-bootstrap.0 → 3.0.0-beta.643.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/cjs/candidate.cjs +385 -0
  2. package/dist/cjs/candidate.native.cjs +431 -0
  3. package/dist/cjs/candidate.native.js +433 -0
  4. package/dist/cjs/candidate.native.js.map +1 -0
  5. package/dist/cjs/frontend.cjs +80 -0
  6. package/dist/cjs/frontend.native.cjs +95 -0
  7. package/dist/cjs/frontend.native.js +97 -0
  8. package/dist/cjs/frontend.native.js.map +1 -0
  9. package/dist/cjs/index.cjs +39 -0
  10. package/dist/cjs/index.native.cjs +41 -0
  11. package/dist/cjs/index.native.js +43 -0
  12. package/dist/cjs/index.native.js.map +1 -0
  13. package/dist/cjs/styled.cjs +30 -0
  14. package/dist/cjs/styled.native.cjs +32 -0
  15. package/dist/cjs/styled.native.js +34 -0
  16. package/dist/cjs/styled.native.js.map +1 -0
  17. package/dist/cjs/types.cjs +17 -0
  18. package/dist/cjs/types.native.cjs +19 -0
  19. package/dist/cjs/types.native.js +21 -0
  20. package/dist/cjs/types.native.js.map +1 -0
  21. package/dist/cjs/vite/state.cjs +249 -0
  22. package/dist/cjs/vite/state.native.cjs +331 -0
  23. package/dist/cjs/vite/state.native.js +333 -0
  24. package/dist/cjs/vite/state.native.js.map +1 -0
  25. package/dist/cjs/vite.cjs +148 -0
  26. package/dist/cjs/vite.native.cjs +188 -0
  27. package/dist/cjs/vite.native.js +190 -0
  28. package/dist/cjs/vite.native.js.map +1 -0
  29. package/dist/esm/candidate.mjs +360 -0
  30. package/dist/esm/candidate.mjs.map +1 -0
  31. package/dist/esm/candidate.native.js +404 -0
  32. package/dist/esm/candidate.native.js.map +1 -0
  33. package/dist/esm/frontend.mjs +57 -0
  34. package/dist/esm/frontend.mjs.map +1 -0
  35. package/dist/esm/frontend.native.js +70 -0
  36. package/dist/esm/frontend.native.js.map +1 -0
  37. package/dist/esm/index.mjs +11 -0
  38. package/dist/esm/index.mjs.map +1 -0
  39. package/dist/esm/index.native.js +11 -0
  40. package/dist/esm/index.native.js.map +1 -0
  41. package/dist/esm/styled.mjs +10 -0
  42. package/dist/esm/styled.mjs.map +1 -0
  43. package/dist/esm/styled.native.js +10 -0
  44. package/dist/esm/styled.native.js.map +1 -0
  45. package/dist/esm/types.mjs +0 -0
  46. package/dist/esm/types.native.js +0 -0
  47. package/dist/esm/vite/state.mjs +215 -0
  48. package/dist/esm/vite/state.mjs.map +1 -0
  49. package/dist/esm/vite/state.native.js +295 -0
  50. package/dist/esm/vite/state.native.js.map +1 -0
  51. package/dist/esm/vite.mjs +116 -0
  52. package/dist/esm/vite.mjs.map +1 -0
  53. package/dist/esm/vite.native.js +154 -0
  54. package/dist/esm/vite.native.js.map +1 -0
  55. package/package.json +88 -5
  56. package/src/candidate.ts +527 -0
  57. package/src/frontend.ts +116 -0
  58. package/src/index.tsx +24 -0
  59. package/src/styled.tsx +52 -0
  60. package/src/types.ts +226 -0
  61. package/src/vite/state.ts +274 -0
  62. package/src/vite.ts +204 -0
  63. package/types/candidate.d.ts +23 -0
  64. package/types/candidate.d.ts.map +1 -0
  65. package/types/frontend.d.ts +20 -0
  66. package/types/frontend.d.ts.map +1 -0
  67. package/types/index.d.ts +8 -0
  68. package/types/index.d.ts.map +1 -0
  69. package/types/styled.d.ts +12 -0
  70. package/types/styled.d.ts.map +1 -0
  71. package/types/types.d.ts +158 -0
  72. package/types/types.d.ts.map +1 -0
  73. package/types/vite/state.d.ts +28 -0
  74. package/types/vite/state.d.ts.map +1 -0
  75. package/types/vite.d.ts +20 -0
  76. package/types/vite.d.ts.map +1 -0
  77. package/README.md +0 -1
@@ -0,0 +1,360 @@
1
+ import { isWeb } from "@tamagui/constants";
2
+ import { STYLE_FRONTEND_PASSTHROUGH_PREFIX, createFrontendProgram, plainValueToPayload } from "@tamagui/core/internal-runtime";
3
+ import { borderSideSuffix, classifyCandidate, createGrammarConfigView, decodeArbitrary, getSafeAreaEdge, getTokenCategory, percentUtilityProps, radiusCornerProps, splitColorOpacitySuffix } from "@tamagui/style-grammar/runtime";
4
+
5
+ const styleGrammarConfigCache = /* @__PURE__ */ new WeakMap();
6
+ function getStyleGrammarConfig(config) {
7
+ const cached = styleGrammarConfigCache.get(config);
8
+ if (cached) return cached;
9
+ const view = createGrammarConfigView(config);
10
+ styleGrammarConfigCache.set(config, view);
11
+ return view;
12
+ }
13
+ function isTokenValueProp(prop) {
14
+ return getTokenCategory(prop) !== null;
15
+ }
16
+ function arbitraryValue(inner) {
17
+ const px = /^(-?\d*\.?\d+)px$/.exec(inner);
18
+ if (px) return Number(px[1]);
19
+ if (/^-?\d*\.?\d+$/.test(inner)) return Number(inner);
20
+ return inner;
21
+ }
22
+ function tailwindSizingValue(prop, value) {
23
+ if (value === "full") return "100%";
24
+ if (value === "auto") return "auto";
25
+ if (value === "screen") return /[Hh]eight/.test(prop) ? "100vh" : "100vw";
26
+ if (value === "min") return "min-content";
27
+ if (value === "max") return "max-content";
28
+ if (value === "fit") return "fit-content";
29
+ const frac = /^(\d+)\/(\d+)$/.exec(value);
30
+ if (frac && Number(frac[2]) !== 0) {
31
+ return `${Number(frac[1]) / Number(frac[2]) * 100}%`;
32
+ }
33
+ return null;
34
+ }
35
+ function borderDimValue(raw) {
36
+ let inner = raw;
37
+ if (raw.length > 1 && raw[0] === "[" && raw[raw.length - 1] === "]") {
38
+ inner = decodeArbitrary(raw.slice(1, -1));
39
+ }
40
+ const px = /^(-?\d*\.?\d+)px$/.exec(inner);
41
+ if (px) return Number.parseFloat(px[1]);
42
+ if (/^-?\d*\.?\d+$/.test(inner)) return Number(inner);
43
+ return inner;
44
+ }
45
+ function expandBorderCandidate(parsed, value) {
46
+ const prefix = parsed.prefix;
47
+ if (!prefix) return null;
48
+ if (prefix.startsWith("rounded-")) {
49
+ const props = radiusCornerProps[prefix.slice("rounded-".length)];
50
+ if (!props || props.length === 1) return null;
51
+ const out2 = {};
52
+ for (const p of props) out2[p] = value;
53
+ return out2;
54
+ }
55
+ const m = /^border-([trblxy])$/.exec(prefix);
56
+ if (!m) return null;
57
+ const sides = borderSideSuffix[m[1]];
58
+ const suffix = parsed.entry?.prop.endsWith("Width") ? "Width" : "Color";
59
+ const out = {};
60
+ for (const side of sides) out[`border${side}${suffix}`] = value;
61
+ return out;
62
+ }
63
+ function tailwindClassToFlatProp(parsed) {
64
+ if (parsed.kind !== "dynamic" || !parsed.entry || parsed.rawValue === void 0) {
65
+ return null;
66
+ }
67
+ const prop = parsed.entry.prop;
68
+ const category = parsed.entry.tokenCategory;
69
+ let value = parsed.rawValue;
70
+ if (prop.endsWith("Width") && parsed.prefix?.startsWith("border")) {
71
+ if (parsed.valueKind === "token") {
72
+ value = `${parsed.negative ? "-" : ""}${value}`;
73
+ } else if (parsed.valueKind === "arbitrary") {
74
+ value = borderDimValue(value);
75
+ } else {
76
+ return null;
77
+ }
78
+ return {
79
+ key: prop,
80
+ value
81
+ };
82
+ }
83
+ if (prop === "fontFamily") {
84
+ let famValue;
85
+ if (value.length > 2 && value[0] === "[" && value[value.length - 1] === "]") {
86
+ famValue = decodeArbitrary(value.slice(1, -1));
87
+ } else {
88
+ const generic = {
89
+ sans: "sans-serif",
90
+ serif: "serif",
91
+ mono: "monospace"
92
+ };
93
+ famValue = parsed.valueKind === "token" ? value : generic[value] || value;
94
+ }
95
+ return {
96
+ key: "fontFamily",
97
+ value: famValue
98
+ };
99
+ }
100
+ if (prop === "fontSize") {
101
+ let fsValue;
102
+ if (value.length > 2 && value[0] === "[" && value[value.length - 1] === "]") {
103
+ fsValue = arbitraryValue(decodeArbitrary(value.slice(1, -1)));
104
+ } else {
105
+ fsValue = value;
106
+ }
107
+ return {
108
+ key: "fontSize",
109
+ value: fsValue
110
+ };
111
+ }
112
+ if (prop === "lineHeight") {
113
+ let lhValue;
114
+ if (value.length > 2 && value[0] === "[" && value[value.length - 1] === "]") {
115
+ const inner = decodeArbitrary(value.slice(1, -1));
116
+ lhValue = /^-?\d*\.?\d+px$/.test(inner) ? Number.parseFloat(inner) : inner;
117
+ } else {
118
+ lhValue = value;
119
+ }
120
+ return {
121
+ key: "lineHeight",
122
+ value: lhValue
123
+ };
124
+ }
125
+ if (prop === "letterSpacing") {
126
+ let lsValue;
127
+ if (value.length > 2 && value[0] === "[" && value[value.length - 1] === "]") {
128
+ lsValue = arbitraryValue(decodeArbitrary(value.slice(1, -1)));
129
+ } else {
130
+ lsValue = value;
131
+ }
132
+ return {
133
+ key: "letterSpacing",
134
+ value: lsValue
135
+ };
136
+ }
137
+ if (prop === "boxShadow" && value[0] === "[" && value[value.length - 1] === "]") {
138
+ return {
139
+ key: "boxShadow",
140
+ value: decodeArbitrary(value.slice(1, -1))
141
+ };
142
+ }
143
+ if (value.length > 2 && value[0] === "[" && value[value.length - 1] === "]") {
144
+ const inner = decodeArbitrary(value.slice(1, -1));
145
+ if (inner === "") return null;
146
+ return {
147
+ key: prop,
148
+ value: arbitraryValue(inner)
149
+ };
150
+ }
151
+ if (category === "size" && parsed.valueKind !== "token") {
152
+ const sized = tailwindSizingValue(prop, value);
153
+ if (sized != null) {
154
+ return {
155
+ key: prop,
156
+ value: sized
157
+ };
158
+ }
159
+ }
160
+ let opacitySuffix = "";
161
+ if (category === "color" && typeof value === "string") {
162
+ const suffix = splitColorOpacitySuffix(value);
163
+ if (suffix.kind === "invalid") {
164
+ return {
165
+ key: prop,
166
+ value
167
+ };
168
+ }
169
+ if (suffix.kind === "valid") {
170
+ opacitySuffix = value.slice(suffix.name.length);
171
+ value = suffix.name;
172
+ }
173
+ }
174
+ if (percentUtilityProps.has(prop) && /^\d+$/.test(value)) {
175
+ value = Number(value) / 100;
176
+ } else if (/^\d+(\.\d+)?$/.test(value)) {
177
+ if (category === "zIndex" && parsed.valueKind === "convenience") {
178
+ value = Number(value);
179
+ } else if (category) {
180
+ value = `${parsed.negative ? "-" : ""}${value}`;
181
+ } else {
182
+ value = Number(value);
183
+ }
184
+ } else if (typeof value === "string") {
185
+ if (category && !((category === "space" || category === "size" || category === "radius") && getSafeAreaEdge(value))) {
186
+ value = `${parsed.negative ? "-" : ""}${value}`;
187
+ }
188
+ }
189
+ if (opacitySuffix && typeof value === "string") {
190
+ value = `${value}${opacitySuffix}`;
191
+ }
192
+ if (parsed.negative && !category) {
193
+ if (typeof value === "number") value = -value;
194
+ else if (typeof value === "string" && value[0] !== "-") value = `-${value}`;
195
+ }
196
+ return {
197
+ key: prop,
198
+ value
199
+ };
200
+ }
201
+ const classPlanCache = /* @__PURE__ */ new WeakMap();
202
+ function getClassPlanCache(grammarConfig) {
203
+ let cache = classPlanCache.get(grammarConfig);
204
+ if (!cache) {
205
+ cache = /* @__PURE__ */ new Map();
206
+ classPlanCache.set(grammarConfig, cache);
207
+ }
208
+ return cache;
209
+ }
210
+ function createPlanEntry(property, value, modifiers) {
211
+ if (modifiers.length === 0) return [property, value];
212
+ const payload = plainValueToPayload(value, property);
213
+ if (payload === null) return null;
214
+ return [null, createFrontendProgram(property, {
215
+ base: null,
216
+ clauses: [{
217
+ modifiers,
218
+ payload
219
+ }]
220
+ })];
221
+ }
222
+ function computeClassPlan(cls, grammarConfig) {
223
+ const groupMarker = /^group(?:\/([A-Za-z0-9_-]+))?$/.exec(cls);
224
+ if (groupMarker) {
225
+ return {
226
+ entries: [["group", groupMarker[1] || true]],
227
+ preserveRawClass: isWeb
228
+ };
229
+ }
230
+ const containerMarker = /^@container(-size)?(?:\/([A-Za-z0-9_-]+))?$/.exec(cls);
231
+ if (containerMarker) {
232
+ const isSize = containerMarker[1] !== void 0;
233
+ const name = containerMarker[2];
234
+ const entries = [];
235
+ if (name) entries.push(["containerName", name]);
236
+ if (isSize) {
237
+ entries.push(["containerType", "size"]);
238
+ } else if (name) {
239
+ entries.push(["containerType", "inline-size"]);
240
+ } else {
241
+ entries.push(["container", true]);
242
+ }
243
+ return {
244
+ entries,
245
+ preserveRawClass: isWeb
246
+ };
247
+ }
248
+ const classification = classifyCandidate(cls, grammarConfig);
249
+ if (classification.kind === "passthrough") {
250
+ return isWeb ? "raw" : null;
251
+ }
252
+ const parsed = classification.parsed;
253
+ const util = parsed.kind === "utility" ? parsed.properties : null;
254
+ if (util) {
255
+ const entries = [];
256
+ for (const p in util) {
257
+ const entry = createPlanEntry(p, util[p], parsed.modifiers);
258
+ if (!entry) return "raw";
259
+ entries.push(entry);
260
+ }
261
+ return entries;
262
+ }
263
+ const flatProp = tailwindClassToFlatProp(parsed);
264
+ if (flatProp) {
265
+ const expanded = expandBorderCandidate(parsed, flatProp.value);
266
+ if (expanded) {
267
+ const entries = [];
268
+ for (const p in expanded) {
269
+ const entry2 = createPlanEntry(p, expanded[p], parsed.modifiers);
270
+ if (!entry2) return "raw";
271
+ entries.push(entry2);
272
+ }
273
+ return entries;
274
+ }
275
+ const entry = createPlanEntry(flatProp.key, flatProp.value, parsed.modifiers);
276
+ return entry ? [entry] : "raw";
277
+ }
278
+ return "raw";
279
+ }
280
+ const warnedNativePassthroughCandidates = /* @__PURE__ */ new Set();
281
+ function setInAuthoredOrder(target, key, value) {
282
+ if (key in target) delete target[key];
283
+ target[key] = value;
284
+ }
285
+ function preprocessTailwindClassName(props, config, preservePassthroughPosition = false) {
286
+ const className = props.className;
287
+ if (!className || typeof className !== "string") {
288
+ return props;
289
+ }
290
+ const classes = className.split(/\s+/).filter(Boolean);
291
+ const result = {};
292
+ const grammarConfig = getStyleGrammarConfig(config);
293
+ const plans = getClassPlanCache(grammarConfig);
294
+ const classPlans = classes.map((cls) => {
295
+ let plan = plans.get(cls);
296
+ if (plan === void 0) {
297
+ plan = computeClassPlan(cls, grammarConfig);
298
+ plans.set(cls, plan);
299
+ }
300
+ return plan;
301
+ });
302
+ const hasOwnedStyleCandidate = preservePassthroughPosition && classPlans.some((plan) => Array.isArray(plan));
303
+ let frontendProgramIndex = 0;
304
+ let passthroughIndex = 0;
305
+ const regularClasses = [];
306
+ const preserveRawClass = (cls) => {
307
+ if (hasOwnedStyleCandidate) {
308
+ result[`${STYLE_FRONTEND_PASSTHROUGH_PREFIX}${passthroughIndex++}`] = cls;
309
+ } else {
310
+ regularClasses.push(cls);
311
+ }
312
+ };
313
+ const applyEntry = ([key, value]) => {
314
+ if (key === null) {
315
+ result[`__tamagui_frontend_program_${frontendProgramIndex++}`] = value;
316
+ } else {
317
+ setInAuthoredOrder(result, key, value);
318
+ }
319
+ };
320
+ for (const key in props) {
321
+ if (key !== "className") {
322
+ setInAuthoredOrder(result, key, props[key]);
323
+ continue;
324
+ }
325
+ for (let classIndex = 0; classIndex < classes.length; classIndex++) {
326
+ const cls = classes[classIndex];
327
+ const plan = classPlans[classIndex];
328
+ if (plan === null) {
329
+ if (process.env.NODE_ENV !== "production" && !warnedNativePassthroughCandidates.has(cls)) {
330
+ warnedNativePassthroughCandidates.add(cls);
331
+ console.warn(`[tamagui] Tailwind candidate "${cls}" is web-only and was dropped on native. Use a Tamagui grammar candidate or a native style prop for cross-platform output.`);
332
+ }
333
+ continue;
334
+ }
335
+ if (plan === "raw") {
336
+ preserveRawClass(cls);
337
+ continue;
338
+ }
339
+ if (!Array.isArray(plan)) {
340
+ if (plan.preserveRawClass) {
341
+ preserveRawClass(cls);
342
+ }
343
+ for (let i = 0; i < plan.entries.length; i++) {
344
+ applyEntry(plan.entries[i]);
345
+ }
346
+ continue;
347
+ }
348
+ for (let i = 0; i < plan.length; i++) {
349
+ applyEntry(plan[i]);
350
+ }
351
+ }
352
+ if (regularClasses.length > 0) {
353
+ result.className = regularClasses.join(" ");
354
+ }
355
+ }
356
+ return result;
357
+ }
358
+
359
+ export { getStyleGrammarConfig, isTokenValueProp, preprocessTailwindClassName, setInAuthoredOrder };
360
+ //# sourceMappingURL=candidate.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"candidate.js","names":[],"sources":["esm/candidate.js"],"sourcesContent":["import { isWeb } from \"@tamagui/constants\";\nimport {\n STYLE_FRONTEND_PASSTHROUGH_PREFIX,\n createFrontendProgram,\n plainValueToPayload\n} from \"@tamagui/core/internal-runtime\";\nimport {\n borderSideSuffix,\n classifyCandidate,\n createGrammarConfigView,\n decodeArbitrary,\n getTokenCategory,\n getSafeAreaEdge,\n percentUtilityProps,\n radiusCornerProps,\n splitColorOpacitySuffix\n} from \"@tamagui/style-grammar/runtime\";\nconst styleGrammarConfigCache = /* @__PURE__ */ new WeakMap();\nfunction getStyleGrammarConfig(config) {\n const cached = styleGrammarConfigCache.get(config);\n if (cached) return cached;\n const view = createGrammarConfigView(config);\n styleGrammarConfigCache.set(config, view);\n return view;\n}\nfunction isTokenValueProp(prop) {\n return getTokenCategory(prop) !== null;\n}\nfunction arbitraryValue(inner) {\n const px = /^(-?\\d*\\.?\\d+)px$/.exec(inner);\n if (px) return Number(px[1]);\n if (/^-?\\d*\\.?\\d+$/.test(inner)) return Number(inner);\n return inner;\n}\nfunction tailwindSizingValue(prop, value) {\n if (value === \"full\") return \"100%\";\n if (value === \"auto\") return \"auto\";\n if (value === \"screen\") return /[Hh]eight/.test(prop) ? \"100vh\" : \"100vw\";\n if (value === \"min\") return \"min-content\";\n if (value === \"max\") return \"max-content\";\n if (value === \"fit\") return \"fit-content\";\n const frac = /^(\\d+)\\/(\\d+)$/.exec(value);\n if (frac && Number(frac[2]) !== 0) {\n return `${Number(frac[1]) / Number(frac[2]) * 100}%`;\n }\n return null;\n}\nfunction borderDimValue(raw) {\n let inner = raw;\n if (raw.length > 1 && raw[0] === \"[\" && raw[raw.length - 1] === \"]\") {\n inner = decodeArbitrary(raw.slice(1, -1));\n }\n const px = /^(-?\\d*\\.?\\d+)px$/.exec(inner);\n if (px) return Number.parseFloat(px[1]);\n if (/^-?\\d*\\.?\\d+$/.test(inner)) return Number(inner);\n return inner;\n}\nfunction expandBorderCandidate(parsed, value) {\n const prefix = parsed.prefix;\n if (!prefix) return null;\n if (prefix.startsWith(\"rounded-\")) {\n const props = radiusCornerProps[prefix.slice(\"rounded-\".length)];\n if (!props || props.length === 1) return null;\n const out2 = {};\n for (const p of props) out2[p] = value;\n return out2;\n }\n const m = /^border-([trblxy])$/.exec(prefix);\n if (!m) return null;\n const sides = borderSideSuffix[m[1]];\n const suffix = parsed.entry?.prop.endsWith(\"Width\") ? \"Width\" : \"Color\";\n const out = {};\n for (const side of sides) out[`border${side}${suffix}`] = value;\n return out;\n}\nfunction tailwindClassToFlatProp(parsed) {\n if (parsed.kind !== \"dynamic\" || !parsed.entry || parsed.rawValue === void 0) {\n return null;\n }\n const prop = parsed.entry.prop;\n const category = parsed.entry.tokenCategory;\n let value = parsed.rawValue;\n if (prop.endsWith(\"Width\") && parsed.prefix?.startsWith(\"border\")) {\n if (parsed.valueKind === \"token\") {\n value = `${parsed.negative ? \"-\" : \"\"}${value}`;\n } else if (parsed.valueKind === \"arbitrary\") {\n value = borderDimValue(value);\n } else {\n return null;\n }\n return { key: prop, value };\n }\n if (prop === \"fontFamily\") {\n let famValue;\n if (value.length > 2 && value[0] === \"[\" && value[value.length - 1] === \"]\") {\n famValue = decodeArbitrary(value.slice(1, -1));\n } else {\n const generic = {\n sans: \"sans-serif\",\n serif: \"serif\",\n mono: \"monospace\"\n };\n famValue = parsed.valueKind === \"token\" ? value : generic[value] || value;\n }\n return {\n key: \"fontFamily\",\n value: famValue\n };\n }\n if (prop === \"fontSize\") {\n let fsValue;\n if (value.length > 2 && value[0] === \"[\" && value[value.length - 1] === \"]\") {\n fsValue = arbitraryValue(decodeArbitrary(value.slice(1, -1)));\n } else {\n fsValue = value;\n }\n return {\n key: \"fontSize\",\n value: fsValue\n };\n }\n if (prop === \"lineHeight\") {\n let lhValue;\n if (value.length > 2 && value[0] === \"[\" && value[value.length - 1] === \"]\") {\n const inner = decodeArbitrary(value.slice(1, -1));\n lhValue = /^-?\\d*\\.?\\d+px$/.test(inner) ? Number.parseFloat(inner) : inner;\n } else {\n lhValue = value;\n }\n return {\n key: \"lineHeight\",\n value: lhValue\n };\n }\n if (prop === \"letterSpacing\") {\n let lsValue;\n if (value.length > 2 && value[0] === \"[\" && value[value.length - 1] === \"]\") {\n lsValue = arbitraryValue(decodeArbitrary(value.slice(1, -1)));\n } else {\n lsValue = value;\n }\n return {\n key: \"letterSpacing\",\n value: lsValue\n };\n }\n if (prop === \"boxShadow\" && value[0] === \"[\" && value[value.length - 1] === \"]\") {\n return {\n key: \"boxShadow\",\n value: decodeArbitrary(value.slice(1, -1))\n };\n }\n if (value.length > 2 && value[0] === \"[\" && value[value.length - 1] === \"]\") {\n const inner = decodeArbitrary(value.slice(1, -1));\n if (inner === \"\") return null;\n return { key: prop, value: arbitraryValue(inner) };\n }\n if (category === \"size\" && parsed.valueKind !== \"token\") {\n const sized = tailwindSizingValue(prop, value);\n if (sized != null) {\n return { key: prop, value: sized };\n }\n }\n let opacitySuffix = \"\";\n if (category === \"color\" && typeof value === \"string\") {\n const suffix = splitColorOpacitySuffix(value);\n if (suffix.kind === \"invalid\") {\n return { key: prop, value };\n }\n if (suffix.kind === \"valid\") {\n opacitySuffix = value.slice(suffix.name.length);\n value = suffix.name;\n }\n }\n if (percentUtilityProps.has(prop) && /^\\d+$/.test(value)) {\n value = Number(value) / 100;\n } else if (/^\\d+(\\.\\d+)?$/.test(value)) {\n if (category === \"zIndex\" && parsed.valueKind === \"convenience\") {\n value = Number(value);\n } else if (category) {\n value = `${parsed.negative ? \"-\" : \"\"}${value}`;\n } else {\n value = Number(value);\n }\n } else if (typeof value === \"string\") {\n if (category && !((category === \"space\" || category === \"size\" || category === \"radius\") && getSafeAreaEdge(value))) {\n value = `${parsed.negative ? \"-\" : \"\"}${value}`;\n }\n }\n if (opacitySuffix && typeof value === \"string\") {\n value = `${value}${opacitySuffix}`;\n }\n if (parsed.negative && !category) {\n if (typeof value === \"number\") value = -value;\n else if (typeof value === \"string\" && value[0] !== \"-\") value = `-${value}`;\n }\n return { key: prop, value };\n}\nconst classPlanCache = /* @__PURE__ */ new WeakMap();\nfunction getClassPlanCache(grammarConfig) {\n let cache = classPlanCache.get(grammarConfig);\n if (!cache) {\n cache = /* @__PURE__ */ new Map();\n classPlanCache.set(grammarConfig, cache);\n }\n return cache;\n}\nfunction createPlanEntry(property, value, modifiers) {\n if (modifiers.length === 0) return [property, value];\n const payload = plainValueToPayload(value, property);\n if (payload === null) return null;\n return [\n null,\n createFrontendProgram(property, {\n base: null,\n clauses: [{ modifiers, payload }]\n })\n ];\n}\nfunction computeClassPlan(cls, grammarConfig) {\n const groupMarker = /^group(?:\\/([A-Za-z0-9_-]+))?$/.exec(cls);\n if (groupMarker) {\n return {\n entries: [[\"group\", groupMarker[1] || true]],\n preserveRawClass: isWeb\n };\n }\n const containerMarker = /^@container(-size)?(?:\\/([A-Za-z0-9_-]+))?$/.exec(cls);\n if (containerMarker) {\n const isSize = containerMarker[1] !== void 0;\n const name = containerMarker[2];\n const entries = [];\n if (name) entries.push([\"containerName\", name]);\n if (isSize) {\n entries.push([\"containerType\", \"size\"]);\n } else if (name) {\n entries.push([\"containerType\", \"inline-size\"]);\n } else {\n entries.push([\"container\", true]);\n }\n return { entries, preserveRawClass: isWeb };\n }\n const classification = classifyCandidate(cls, grammarConfig);\n if (classification.kind === \"passthrough\") {\n return isWeb ? \"raw\" : null;\n }\n const parsed = classification.parsed;\n const util = parsed.kind === \"utility\" ? parsed.properties : null;\n if (util) {\n const entries = [];\n for (const p in util) {\n const entry = createPlanEntry(p, util[p], parsed.modifiers);\n if (!entry) return \"raw\";\n entries.push(entry);\n }\n return entries;\n }\n const flatProp = tailwindClassToFlatProp(parsed);\n if (flatProp) {\n const expanded = expandBorderCandidate(parsed, flatProp.value);\n if (expanded) {\n const entries = [];\n for (const p in expanded) {\n const entry2 = createPlanEntry(p, expanded[p], parsed.modifiers);\n if (!entry2) return \"raw\";\n entries.push(entry2);\n }\n return entries;\n }\n const entry = createPlanEntry(flatProp.key, flatProp.value, parsed.modifiers);\n return entry ? [entry] : \"raw\";\n }\n return \"raw\";\n}\nconst warnedNativePassthroughCandidates = /* @__PURE__ */ new Set();\nfunction setInAuthoredOrder(target, key, value) {\n if (key in target) delete target[key];\n target[key] = value;\n}\nfunction preprocessTailwindClassName(props, config, preservePassthroughPosition = false) {\n const className = props.className;\n if (!className || typeof className !== \"string\") {\n return props;\n }\n const classes = className.split(/\\s+/).filter(Boolean);\n const result = {};\n const grammarConfig = getStyleGrammarConfig(config);\n const plans = getClassPlanCache(grammarConfig);\n const classPlans = classes.map((cls) => {\n let plan = plans.get(cls);\n if (plan === void 0) {\n plan = computeClassPlan(cls, grammarConfig);\n plans.set(cls, plan);\n }\n return plan;\n });\n const hasOwnedStyleCandidate = preservePassthroughPosition && classPlans.some((plan) => Array.isArray(plan));\n let frontendProgramIndex = 0;\n let passthroughIndex = 0;\n const regularClasses = [];\n const preserveRawClass = (cls) => {\n if (hasOwnedStyleCandidate) {\n result[`${STYLE_FRONTEND_PASSTHROUGH_PREFIX}${passthroughIndex++}`] = cls;\n } else {\n regularClasses.push(cls);\n }\n };\n const applyEntry = ([key, value]) => {\n if (key === null) {\n result[`__tamagui_frontend_program_${frontendProgramIndex++}`] = value;\n } else {\n setInAuthoredOrder(result, key, value);\n }\n };\n for (const key in props) {\n if (key !== \"className\") {\n setInAuthoredOrder(result, key, props[key]);\n continue;\n }\n for (let classIndex = 0; classIndex < classes.length; classIndex++) {\n const cls = classes[classIndex];\n const plan = classPlans[classIndex];\n if (plan === null) {\n if (process.env.NODE_ENV !== \"production\" && !warnedNativePassthroughCandidates.has(cls)) {\n warnedNativePassthroughCandidates.add(cls);\n console.warn(\n `[tamagui] Tailwind candidate \"${cls}\" is web-only and was dropped on native. Use a Tamagui grammar candidate or a native style prop for cross-platform output.`\n );\n }\n continue;\n }\n if (plan === \"raw\") {\n preserveRawClass(cls);\n continue;\n }\n if (!Array.isArray(plan)) {\n if (plan.preserveRawClass) {\n preserveRawClass(cls);\n }\n for (let i = 0; i < plan.entries.length; i++) {\n applyEntry(plan.entries[i]);\n }\n continue;\n }\n for (let i = 0; i < plan.length; i++) {\n applyEntry(plan[i]);\n }\n }\n if (regularClasses.length > 0) {\n result.className = regularClasses.join(\" \");\n }\n }\n return result;\n}\nexport {\n getStyleGrammarConfig,\n isTokenValueProp,\n preprocessTailwindClassName,\n setInAuthoredOrder\n};\n//# sourceMappingURL=candidate.js.map\n"],"mappings":";;;;;AAiBA,MAAM,0CAA0C,IAAI,QAAQ;AAC5D,SAAS,sBAAsB,QAAQ;CACrC,MAAM,SAAS,wBAAwB,IAAI,MAAM;CACjD,IAAI,QAAQ,OAAO;CACnB,MAAM,OAAO,wBAAwB,MAAM;CAC3C,wBAAwB,IAAI,QAAQ,IAAI;CACxC,OAAO;AACT;AACA,SAAS,iBAAiB,MAAM;CAC9B,OAAO,iBAAiB,IAAI,MAAM;AACpC;AACA,SAAS,eAAe,OAAO;CAC7B,MAAM,KAAK,oBAAoB,KAAK,KAAK;CACzC,IAAI,IAAI,OAAO,OAAO,GAAG,EAAE;CAC3B,IAAI,gBAAgB,KAAK,KAAK,GAAG,OAAO,OAAO,KAAK;CACpD,OAAO;AACT;AACA,SAAS,oBAAoB,MAAM,OAAO;CACxC,IAAI,UAAU,QAAQ,OAAO;CAC7B,IAAI,UAAU,QAAQ,OAAO;CAC7B,IAAI,UAAU,UAAU,OAAO,YAAY,KAAK,IAAI,IAAI,UAAU;CAClE,IAAI,UAAU,OAAO,OAAO;CAC5B,IAAI,UAAU,OAAO,OAAO;CAC5B,IAAI,UAAU,OAAO,OAAO;CAC5B,MAAM,OAAO,iBAAiB,KAAK,KAAK;CACxC,IAAI,QAAQ,OAAO,KAAK,EAAE,MAAM,GAAG;EACjC,OAAO,GAAG,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,EAAE,IAAI,IAAI;CACpD;CACA,OAAO;AACT;AACA,SAAS,eAAe,KAAK;CAC3B,IAAI,QAAQ;CACZ,IAAI,IAAI,SAAS,KAAK,IAAI,OAAO,OAAO,IAAI,IAAI,SAAS,OAAO,KAAK;EACnE,QAAQ,gBAAgB,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC;CAC1C;CACA,MAAM,KAAK,oBAAoB,KAAK,KAAK;CACzC,IAAI,IAAI,OAAO,OAAO,WAAW,GAAG,EAAE;CACtC,IAAI,gBAAgB,KAAK,KAAK,GAAG,OAAO,OAAO,KAAK;CACpD,OAAO;AACT;AACA,SAAS,sBAAsB,QAAQ,OAAO;CAC5C,MAAM,SAAS,OAAO;CACtB,IAAI,CAAC,QAAQ,OAAO;CACpB,IAAI,OAAO,WAAW,UAAU,GAAG;EACjC,MAAM,QAAQ,kBAAkB,OAAO,MAAM,WAAW,MAAM;EAC9D,IAAI,CAAC,SAAS,MAAM,WAAW,GAAG,OAAO;EACzC,MAAM,OAAO,CAAC;EACd,KAAK,MAAM,KAAK,OAAO,KAAK,KAAK;EACjC,OAAO;CACT;CACA,MAAM,IAAI,sBAAsB,KAAK,MAAM;CAC3C,IAAI,CAAC,GAAG,OAAO;CACf,MAAM,QAAQ,iBAAiB,EAAE;CACjC,MAAM,SAAS,OAAO,OAAO,KAAK,SAAS,OAAO,IAAI,UAAU;CAChE,MAAM,MAAM,CAAC;CACb,KAAK,MAAM,QAAQ,OAAO,IAAI,SAAS,OAAO,YAAY;CAC1D,OAAO;AACT;AACA,SAAS,wBAAwB,QAAQ;CACvC,IAAI,OAAO,SAAS,aAAa,CAAC,OAAO,SAAS,OAAO,aAAa,KAAK,GAAG;EAC5E,OAAO;CACT;CACA,MAAM,OAAO,OAAO,MAAM;CAC1B,MAAM,WAAW,OAAO,MAAM;CAC9B,IAAI,QAAQ,OAAO;CACnB,IAAI,KAAK,SAAS,OAAO,KAAK,OAAO,QAAQ,WAAW,QAAQ,GAAG;EACjE,IAAI,OAAO,cAAc,SAAS;GAChC,QAAQ,GAAG,OAAO,WAAW,MAAM,KAAK;EAC1C,OAAO,IAAI,OAAO,cAAc,aAAa;GAC3C,QAAQ,eAAe,KAAK;EAC9B,OAAO;GACL,OAAO;EACT;EACA,OAAO;GAAE,KAAK;GAAM;EAAM;CAC5B;CACA,IAAI,SAAS,cAAc;EACzB,IAAI;EACJ,IAAI,MAAM,SAAS,KAAK,MAAM,OAAO,OAAO,MAAM,MAAM,SAAS,OAAO,KAAK;GAC3E,WAAW,gBAAgB,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC;EAC/C,OAAO;GACL,MAAM,UAAU;IACd,MAAM;IACN,OAAO;IACP,MAAM;GACR;GACA,WAAW,OAAO,cAAc,UAAU,QAAQ,QAAQ,UAAU;EACtE;EACA,OAAO;GACL,KAAK;GACL,OAAO;EACT;CACF;CACA,IAAI,SAAS,YAAY;EACvB,IAAI;EACJ,IAAI,MAAM,SAAS,KAAK,MAAM,OAAO,OAAO,MAAM,MAAM,SAAS,OAAO,KAAK;GAC3E,UAAU,eAAe,gBAAgB,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;EAC9D,OAAO;GACL,UAAU;EACZ;EACA,OAAO;GACL,KAAK;GACL,OAAO;EACT;CACF;CACA,IAAI,SAAS,cAAc;EACzB,IAAI;EACJ,IAAI,MAAM,SAAS,KAAK,MAAM,OAAO,OAAO,MAAM,MAAM,SAAS,OAAO,KAAK;GAC3E,MAAM,QAAQ,gBAAgB,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC;GAChD,UAAU,kBAAkB,KAAK,KAAK,IAAI,OAAO,WAAW,KAAK,IAAI;EACvE,OAAO;GACL,UAAU;EACZ;EACA,OAAO;GACL,KAAK;GACL,OAAO;EACT;CACF;CACA,IAAI,SAAS,iBAAiB;EAC5B,IAAI;EACJ,IAAI,MAAM,SAAS,KAAK,MAAM,OAAO,OAAO,MAAM,MAAM,SAAS,OAAO,KAAK;GAC3E,UAAU,eAAe,gBAAgB,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;EAC9D,OAAO;GACL,UAAU;EACZ;EACA,OAAO;GACL,KAAK;GACL,OAAO;EACT;CACF;CACA,IAAI,SAAS,eAAe,MAAM,OAAO,OAAO,MAAM,MAAM,SAAS,OAAO,KAAK;EAC/E,OAAO;GACL,KAAK;GACL,OAAO,gBAAgB,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC;EAC3C;CACF;CACA,IAAI,MAAM,SAAS,KAAK,MAAM,OAAO,OAAO,MAAM,MAAM,SAAS,OAAO,KAAK;EAC3E,MAAM,QAAQ,gBAAgB,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC;EAChD,IAAI,UAAU,IAAI,OAAO;EACzB,OAAO;GAAE,KAAK;GAAM,OAAO,eAAe,KAAK;EAAE;CACnD;CACA,IAAI,aAAa,UAAU,OAAO,cAAc,SAAS;EACvD,MAAM,QAAQ,oBAAoB,MAAM,KAAK;EAC7C,IAAI,SAAS,MAAM;GACjB,OAAO;IAAE,KAAK;IAAM,OAAO;GAAM;EACnC;CACF;CACA,IAAI,gBAAgB;CACpB,IAAI,aAAa,WAAW,OAAO,UAAU,UAAU;EACrD,MAAM,SAAS,wBAAwB,KAAK;EAC5C,IAAI,OAAO,SAAS,WAAW;GAC7B,OAAO;IAAE,KAAK;IAAM;GAAM;EAC5B;EACA,IAAI,OAAO,SAAS,SAAS;GAC3B,gBAAgB,MAAM,MAAM,OAAO,KAAK,MAAM;GAC9C,QAAQ,OAAO;EACjB;CACF;CACA,IAAI,oBAAoB,IAAI,IAAI,KAAK,QAAQ,KAAK,KAAK,GAAG;EACxD,QAAQ,OAAO,KAAK,IAAI;CAC1B,OAAO,IAAI,gBAAgB,KAAK,KAAK,GAAG;EACtC,IAAI,aAAa,YAAY,OAAO,cAAc,eAAe;GAC/D,QAAQ,OAAO,KAAK;EACtB,OAAO,IAAI,UAAU;GACnB,QAAQ,GAAG,OAAO,WAAW,MAAM,KAAK;EAC1C,OAAO;GACL,QAAQ,OAAO,KAAK;EACtB;CACF,OAAO,IAAI,OAAO,UAAU,UAAU;EACpC,IAAI,YAAY,GAAG,aAAa,WAAW,aAAa,UAAU,aAAa,aAAa,gBAAgB,KAAK,IAAI;GACnH,QAAQ,GAAG,OAAO,WAAW,MAAM,KAAK;EAC1C;CACF;CACA,IAAI,iBAAiB,OAAO,UAAU,UAAU;EAC9C,QAAQ,GAAG,QAAQ;CACrB;CACA,IAAI,OAAO,YAAY,CAAC,UAAU;EAChC,IAAI,OAAO,UAAU,UAAU,QAAQ,CAAC;OACnC,IAAI,OAAO,UAAU,YAAY,MAAM,OAAO,KAAK,QAAQ,IAAI;CACtE;CACA,OAAO;EAAE,KAAK;EAAM;CAAM;AAC5B;AACA,MAAM,iCAAiC,IAAI,QAAQ;AACnD,SAAS,kBAAkB,eAAe;CACxC,IAAI,QAAQ,eAAe,IAAI,aAAa;CAC5C,IAAI,CAAC,OAAO;EACV,wBAAwB,IAAI,IAAI;EAChC,eAAe,IAAI,eAAe,KAAK;CACzC;CACA,OAAO;AACT;AACA,SAAS,gBAAgB,UAAU,OAAO,WAAW;CACnD,IAAI,UAAU,WAAW,GAAG,OAAO,CAAC,UAAU,KAAK;CACnD,MAAM,UAAU,oBAAoB,OAAO,QAAQ;CACnD,IAAI,YAAY,MAAM,OAAO;CAC7B,OAAO,CACL,MACA,sBAAsB,UAAU;EAC9B,MAAM;EACN,SAAS,CAAC;GAAE;GAAW;EAAQ,CAAC;CAClC,CAAC,CACH;AACF;AACA,SAAS,iBAAiB,KAAK,eAAe;CAC5C,MAAM,cAAc,iCAAiC,KAAK,GAAG;CAC7D,IAAI,aAAa;EACf,OAAO;GACL,SAAS,CAAC,CAAC,SAAS,YAAY,MAAM,IAAI,CAAC;GAC3C,kBAAkB;EACpB;CACF;CACA,MAAM,kBAAkB,8CAA8C,KAAK,GAAG;CAC9E,IAAI,iBAAiB;EACnB,MAAM,SAAS,gBAAgB,OAAO,KAAK;EAC3C,MAAM,OAAO,gBAAgB;EAC7B,MAAM,UAAU,CAAC;EACjB,IAAI,MAAM,QAAQ,KAAK,CAAC,iBAAiB,IAAI,CAAC;EAC9C,IAAI,QAAQ;GACV,QAAQ,KAAK,CAAC,iBAAiB,MAAM,CAAC;EACxC,OAAO,IAAI,MAAM;GACf,QAAQ,KAAK,CAAC,iBAAiB,aAAa,CAAC;EAC/C,OAAO;GACL,QAAQ,KAAK,CAAC,aAAa,IAAI,CAAC;EAClC;EACA,OAAO;GAAE;GAAS,kBAAkB;EAAM;CAC5C;CACA,MAAM,iBAAiB,kBAAkB,KAAK,aAAa;CAC3D,IAAI,eAAe,SAAS,eAAe;EACzC,OAAO,QAAQ,QAAQ;CACzB;CACA,MAAM,SAAS,eAAe;CAC9B,MAAM,OAAO,OAAO,SAAS,YAAY,OAAO,aAAa;CAC7D,IAAI,MAAM;EACR,MAAM,UAAU,CAAC;EACjB,KAAK,MAAM,KAAK,MAAM;GACpB,MAAM,QAAQ,gBAAgB,GAAG,KAAK,IAAI,OAAO,SAAS;GAC1D,IAAI,CAAC,OAAO,OAAO;GACnB,QAAQ,KAAK,KAAK;EACpB;EACA,OAAO;CACT;CACA,MAAM,WAAW,wBAAwB,MAAM;CAC/C,IAAI,UAAU;EACZ,MAAM,WAAW,sBAAsB,QAAQ,SAAS,KAAK;EAC7D,IAAI,UAAU;GACZ,MAAM,UAAU,CAAC;GACjB,KAAK,MAAM,KAAK,UAAU;IACxB,MAAM,SAAS,gBAAgB,GAAG,SAAS,IAAI,OAAO,SAAS;IAC/D,IAAI,CAAC,QAAQ,OAAO;IACpB,QAAQ,KAAK,MAAM;GACrB;GACA,OAAO;EACT;EACA,MAAM,QAAQ,gBAAgB,SAAS,KAAK,SAAS,OAAO,OAAO,SAAS;EAC5E,OAAO,QAAQ,CAAC,KAAK,IAAI;CAC3B;CACA,OAAO;AACT;AACA,MAAM,oDAAoD,IAAI,IAAI;AAClE,SAAS,mBAAmB,QAAQ,KAAK,OAAO;CAC9C,IAAI,OAAO,QAAQ,OAAO,OAAO;CACjC,OAAO,OAAO;AAChB;AACA,SAAS,4BAA4B,OAAO,QAAQ,8BAA8B,OAAO;CACvF,MAAM,YAAY,MAAM;CACxB,IAAI,CAAC,aAAa,OAAO,cAAc,UAAU;EAC/C,OAAO;CACT;CACA,MAAM,UAAU,UAAU,MAAM,KAAK,EAAE,OAAO,OAAO;CACrD,MAAM,SAAS,CAAC;CAChB,MAAM,gBAAgB,sBAAsB,MAAM;CAClD,MAAM,QAAQ,kBAAkB,aAAa;CAC7C,MAAM,aAAa,QAAQ,KAAK,QAAQ;EACtC,IAAI,OAAO,MAAM,IAAI,GAAG;EACxB,IAAI,SAAS,KAAK,GAAG;GACnB,OAAO,iBAAiB,KAAK,aAAa;GAC1C,MAAM,IAAI,KAAK,IAAI;EACrB;EACA,OAAO;CACT,CAAC;CACD,MAAM,yBAAyB,+BAA+B,WAAW,MAAM,SAAS,MAAM,QAAQ,IAAI,CAAC;CAC3G,IAAI,uBAAuB;CAC3B,IAAI,mBAAmB;CACvB,MAAM,iBAAiB,CAAC;CACxB,MAAM,oBAAoB,QAAQ;EAChC,IAAI,wBAAwB;GAC1B,OAAO,GAAG,oCAAoC,wBAAwB;EACxE,OAAO;GACL,eAAe,KAAK,GAAG;EACzB;CACF;CACA,MAAM,cAAc,CAAC,KAAK,WAAW;EACnC,IAAI,QAAQ,MAAM;GAChB,OAAO,8BAA8B,4BAA4B;EACnE,OAAO;GACL,mBAAmB,QAAQ,KAAK,KAAK;EACvC;CACF;CACA,KAAK,MAAM,OAAO,OAAO;EACvB,IAAI,QAAQ,aAAa;GACvB,mBAAmB,QAAQ,KAAK,MAAM,IAAI;GAC1C;EACF;EACA,KAAK,IAAI,aAAa,GAAG,aAAa,QAAQ,QAAQ,cAAc;GAClE,MAAM,MAAM,QAAQ;GACpB,MAAM,OAAO,WAAW;GACxB,IAAI,SAAS,MAAM;IACjB,IAAI,QAAQ,IAAI,aAAa,gBAAgB,CAAC,kCAAkC,IAAI,GAAG,GAAG;KACxF,kCAAkC,IAAI,GAAG;KACzC,QAAQ,KACN,iCAAiC,IAAI,2HACvC;IACF;IACA;GACF;GACA,IAAI,SAAS,OAAO;IAClB,iBAAiB,GAAG;IACpB;GACF;GACA,IAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;IACxB,IAAI,KAAK,kBAAkB;KACzB,iBAAiB,GAAG;IACtB;IACA,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,QAAQ,KAAK;KAC5C,WAAW,KAAK,QAAQ,EAAE;IAC5B;IACA;GACF;GACA,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;IACpC,WAAW,KAAK,EAAE;GACpB;EACF;EACA,IAAI,eAAe,SAAS,GAAG;GAC7B,OAAO,YAAY,eAAe,KAAK,GAAG;EAC5C;CACF;CACA,OAAO;AACT"}