@tenphi/tasty 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (359) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +236 -0
  3. package/dist/_virtual/_rolldown/runtime.mjs +7 -0
  4. package/dist/chunks/cacheKey.d.ts +1 -0
  5. package/dist/chunks/cacheKey.js +70 -0
  6. package/dist/chunks/cacheKey.js.map +1 -0
  7. package/dist/chunks/cacheKey.mjs +70 -0
  8. package/dist/chunks/cacheKey.mjs.map +1 -0
  9. package/dist/chunks/definitions.d.ts +37 -0
  10. package/dist/chunks/definitions.js +260 -0
  11. package/dist/chunks/definitions.js.map +1 -0
  12. package/dist/chunks/definitions.mjs +260 -0
  13. package/dist/chunks/definitions.mjs.map +1 -0
  14. package/dist/chunks/index.d.ts +3 -0
  15. package/dist/chunks/renderChunk.d.ts +2 -0
  16. package/dist/chunks/renderChunk.js +61 -0
  17. package/dist/chunks/renderChunk.js.map +1 -0
  18. package/dist/chunks/renderChunk.mjs +61 -0
  19. package/dist/chunks/renderChunk.mjs.map +1 -0
  20. package/dist/config.d.ts +279 -0
  21. package/dist/config.js +400 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/config.mjs +231 -0
  24. package/dist/config.mjs.map +1 -0
  25. package/dist/css-writer.d.mts +45 -0
  26. package/dist/css-writer.mjs +74 -0
  27. package/dist/css-writer.mjs.map +1 -0
  28. package/dist/debug.d.ts +204 -0
  29. package/dist/debug.js +733 -0
  30. package/dist/debug.js.map +1 -0
  31. package/dist/extractor.d.mts +24 -0
  32. package/dist/extractor.mjs +150 -0
  33. package/dist/extractor.mjs.map +1 -0
  34. package/dist/hooks/index.d.ts +5 -0
  35. package/dist/hooks/useGlobalStyles.d.ts +27 -0
  36. package/dist/hooks/useGlobalStyles.js +56 -0
  37. package/dist/hooks/useGlobalStyles.js.map +1 -0
  38. package/dist/hooks/useKeyframes.d.ts +56 -0
  39. package/dist/hooks/useKeyframes.js +54 -0
  40. package/dist/hooks/useKeyframes.js.map +1 -0
  41. package/dist/hooks/useProperty.d.ts +79 -0
  42. package/dist/hooks/useProperty.js +91 -0
  43. package/dist/hooks/useProperty.js.map +1 -0
  44. package/dist/hooks/useRawCSS.d.ts +53 -0
  45. package/dist/hooks/useRawCSS.js +28 -0
  46. package/dist/hooks/useRawCSS.js.map +1 -0
  47. package/dist/hooks/useStyles.d.ts +40 -0
  48. package/dist/hooks/useStyles.js +169 -0
  49. package/dist/hooks/useStyles.js.map +1 -0
  50. package/dist/index.d.ts +38 -0
  51. package/dist/index.js +30 -0
  52. package/dist/injector/index.d.ts +157 -0
  53. package/dist/injector/index.js +154 -0
  54. package/dist/injector/index.js.map +1 -0
  55. package/dist/injector/injector.d.ts +139 -0
  56. package/dist/injector/injector.js +404 -0
  57. package/dist/injector/injector.js.map +1 -0
  58. package/dist/injector/injector.mjs +404 -0
  59. package/dist/injector/injector.mjs.map +1 -0
  60. package/dist/injector/sheet-manager.d.ts +127 -0
  61. package/dist/injector/sheet-manager.js +714 -0
  62. package/dist/injector/sheet-manager.js.map +1 -0
  63. package/dist/injector/sheet-manager.mjs +714 -0
  64. package/dist/injector/sheet-manager.mjs.map +1 -0
  65. package/dist/injector/types.d.mts +18 -0
  66. package/dist/injector/types.d.ts +135 -0
  67. package/dist/keyframes/index.js +206 -0
  68. package/dist/keyframes/index.js.map +1 -0
  69. package/dist/keyframes/index.mjs +156 -0
  70. package/dist/keyframes/index.mjs.map +1 -0
  71. package/dist/parser/classify.js +319 -0
  72. package/dist/parser/classify.js.map +1 -0
  73. package/dist/parser/classify.mjs +319 -0
  74. package/dist/parser/classify.mjs.map +1 -0
  75. package/dist/parser/const.js +33 -0
  76. package/dist/parser/const.js.map +1 -0
  77. package/dist/parser/const.mjs +33 -0
  78. package/dist/parser/const.mjs.map +1 -0
  79. package/dist/parser/lru.js +109 -0
  80. package/dist/parser/lru.js.map +1 -0
  81. package/dist/parser/lru.mjs +109 -0
  82. package/dist/parser/lru.mjs.map +1 -0
  83. package/dist/parser/parser.d.ts +25 -0
  84. package/dist/parser/parser.js +116 -0
  85. package/dist/parser/parser.js.map +1 -0
  86. package/dist/parser/parser.mjs +116 -0
  87. package/dist/parser/parser.mjs.map +1 -0
  88. package/dist/parser/tokenizer.js +69 -0
  89. package/dist/parser/tokenizer.js.map +1 -0
  90. package/dist/parser/tokenizer.mjs +69 -0
  91. package/dist/parser/tokenizer.mjs.map +1 -0
  92. package/dist/parser/types.d.mts +37 -0
  93. package/dist/parser/types.d.ts +46 -0
  94. package/dist/parser/types.js +46 -0
  95. package/dist/parser/types.js.map +1 -0
  96. package/dist/parser/types.mjs +46 -0
  97. package/dist/parser/types.mjs.map +1 -0
  98. package/dist/pipeline/conditions.js +377 -0
  99. package/dist/pipeline/conditions.js.map +1 -0
  100. package/dist/pipeline/conditions.mjs +377 -0
  101. package/dist/pipeline/conditions.mjs.map +1 -0
  102. package/dist/pipeline/exclusive.d.ts +1 -0
  103. package/dist/pipeline/exclusive.js +231 -0
  104. package/dist/pipeline/exclusive.js.map +1 -0
  105. package/dist/pipeline/exclusive.mjs +231 -0
  106. package/dist/pipeline/exclusive.mjs.map +1 -0
  107. package/dist/pipeline/index.d.ts +53 -0
  108. package/dist/pipeline/index.js +641 -0
  109. package/dist/pipeline/index.js.map +1 -0
  110. package/dist/pipeline/index.mjs +635 -0
  111. package/dist/pipeline/index.mjs.map +1 -0
  112. package/dist/pipeline/materialize.js +821 -0
  113. package/dist/pipeline/materialize.js.map +1 -0
  114. package/dist/pipeline/materialize.mjs +821 -0
  115. package/dist/pipeline/materialize.mjs.map +1 -0
  116. package/dist/pipeline/parseStateKey.d.ts +1 -0
  117. package/dist/pipeline/parseStateKey.js +418 -0
  118. package/dist/pipeline/parseStateKey.js.map +1 -0
  119. package/dist/pipeline/parseStateKey.mjs +418 -0
  120. package/dist/pipeline/parseStateKey.mjs.map +1 -0
  121. package/dist/pipeline/simplify.js +557 -0
  122. package/dist/pipeline/simplify.js.map +1 -0
  123. package/dist/pipeline/simplify.mjs +557 -0
  124. package/dist/pipeline/simplify.mjs.map +1 -0
  125. package/dist/plugins/index.d.ts +2 -0
  126. package/dist/plugins/okhsl-plugin.d.ts +35 -0
  127. package/dist/plugins/okhsl-plugin.js +371 -0
  128. package/dist/plugins/okhsl-plugin.js.map +1 -0
  129. package/dist/plugins/okhsl-plugin.mjs +345 -0
  130. package/dist/plugins/okhsl-plugin.mjs.map +1 -0
  131. package/dist/plugins/types.d.mts +49 -0
  132. package/dist/plugins/types.d.ts +69 -0
  133. package/dist/properties/index.js +158 -0
  134. package/dist/properties/index.js.map +1 -0
  135. package/dist/properties/index.mjs +141 -0
  136. package/dist/properties/index.mjs.map +1 -0
  137. package/dist/states/index.d.ts +45 -0
  138. package/dist/states/index.js +389 -0
  139. package/dist/states/index.js.map +1 -0
  140. package/dist/states/index.mjs +161 -0
  141. package/dist/states/index.mjs.map +1 -0
  142. package/dist/static/index.d.ts +5 -0
  143. package/dist/static/index.js +5 -0
  144. package/dist/static/tastyStatic.d.ts +46 -0
  145. package/dist/static/tastyStatic.js +31 -0
  146. package/dist/static/tastyStatic.js.map +1 -0
  147. package/dist/static/types.d.ts +49 -0
  148. package/dist/static/types.js +24 -0
  149. package/dist/static/types.js.map +1 -0
  150. package/dist/styles/align.d.ts +15 -0
  151. package/dist/styles/align.js +14 -0
  152. package/dist/styles/align.js.map +1 -0
  153. package/dist/styles/align.mjs +14 -0
  154. package/dist/styles/align.mjs.map +1 -0
  155. package/dist/styles/border.d.ts +25 -0
  156. package/dist/styles/border.js +114 -0
  157. package/dist/styles/border.js.map +1 -0
  158. package/dist/styles/border.mjs +114 -0
  159. package/dist/styles/border.mjs.map +1 -0
  160. package/dist/styles/color.d.ts +14 -0
  161. package/dist/styles/color.js +23 -0
  162. package/dist/styles/color.js.map +1 -0
  163. package/dist/styles/color.mjs +23 -0
  164. package/dist/styles/color.mjs.map +1 -0
  165. package/dist/styles/createStyle.js +77 -0
  166. package/dist/styles/createStyle.js.map +1 -0
  167. package/dist/styles/createStyle.mjs +77 -0
  168. package/dist/styles/createStyle.mjs.map +1 -0
  169. package/dist/styles/dimension.js +97 -0
  170. package/dist/styles/dimension.js.map +1 -0
  171. package/dist/styles/dimension.mjs +97 -0
  172. package/dist/styles/dimension.mjs.map +1 -0
  173. package/dist/styles/display.d.ts +37 -0
  174. package/dist/styles/display.js +67 -0
  175. package/dist/styles/display.js.map +1 -0
  176. package/dist/styles/display.mjs +67 -0
  177. package/dist/styles/display.mjs.map +1 -0
  178. package/dist/styles/fade.d.ts +15 -0
  179. package/dist/styles/fade.js +58 -0
  180. package/dist/styles/fade.js.map +1 -0
  181. package/dist/styles/fade.mjs +58 -0
  182. package/dist/styles/fade.mjs.map +1 -0
  183. package/dist/styles/fill.d.ts +44 -0
  184. package/dist/styles/fill.js +51 -0
  185. package/dist/styles/fill.js.map +1 -0
  186. package/dist/styles/fill.mjs +51 -0
  187. package/dist/styles/fill.mjs.map +1 -0
  188. package/dist/styles/flow.d.ts +16 -0
  189. package/dist/styles/flow.js +12 -0
  190. package/dist/styles/flow.js.map +1 -0
  191. package/dist/styles/flow.mjs +12 -0
  192. package/dist/styles/flow.mjs.map +1 -0
  193. package/dist/styles/gap.d.ts +31 -0
  194. package/dist/styles/gap.js +37 -0
  195. package/dist/styles/gap.js.map +1 -0
  196. package/dist/styles/gap.mjs +37 -0
  197. package/dist/styles/gap.mjs.map +1 -0
  198. package/dist/styles/height.d.ts +17 -0
  199. package/dist/styles/height.js +20 -0
  200. package/dist/styles/height.js.map +1 -0
  201. package/dist/styles/height.mjs +20 -0
  202. package/dist/styles/height.mjs.map +1 -0
  203. package/dist/styles/index.d.ts +2 -0
  204. package/dist/styles/index.js +9 -0
  205. package/dist/styles/index.js.map +1 -0
  206. package/dist/styles/index.mjs +9 -0
  207. package/dist/styles/index.mjs.map +1 -0
  208. package/dist/styles/inset.d.ts +50 -0
  209. package/dist/styles/inset.js +142 -0
  210. package/dist/styles/inset.js.map +1 -0
  211. package/dist/styles/inset.mjs +142 -0
  212. package/dist/styles/inset.mjs.map +1 -0
  213. package/dist/styles/justify.d.ts +15 -0
  214. package/dist/styles/justify.js +14 -0
  215. package/dist/styles/justify.js.map +1 -0
  216. package/dist/styles/justify.mjs +14 -0
  217. package/dist/styles/justify.mjs.map +1 -0
  218. package/dist/styles/list.d.ts +16 -0
  219. package/dist/styles/list.js +98 -0
  220. package/dist/styles/list.js.map +1 -0
  221. package/dist/styles/margin.d.ts +28 -0
  222. package/dist/styles/margin.js +96 -0
  223. package/dist/styles/margin.js.map +1 -0
  224. package/dist/styles/margin.mjs +96 -0
  225. package/dist/styles/margin.mjs.map +1 -0
  226. package/dist/styles/outline.d.ts +29 -0
  227. package/dist/styles/outline.js +65 -0
  228. package/dist/styles/outline.js.map +1 -0
  229. package/dist/styles/outline.mjs +65 -0
  230. package/dist/styles/outline.mjs.map +1 -0
  231. package/dist/styles/padding.d.ts +28 -0
  232. package/dist/styles/padding.js +96 -0
  233. package/dist/styles/padding.js.map +1 -0
  234. package/dist/styles/padding.mjs +96 -0
  235. package/dist/styles/padding.mjs.map +1 -0
  236. package/dist/styles/predefined.d.ts +74 -0
  237. package/dist/styles/predefined.js +241 -0
  238. package/dist/styles/predefined.js.map +1 -0
  239. package/dist/styles/predefined.mjs +232 -0
  240. package/dist/styles/predefined.mjs.map +1 -0
  241. package/dist/styles/preset.d.ts +47 -0
  242. package/dist/styles/preset.js +126 -0
  243. package/dist/styles/preset.js.map +1 -0
  244. package/dist/styles/preset.mjs +126 -0
  245. package/dist/styles/preset.mjs.map +1 -0
  246. package/dist/styles/radius.d.ts +14 -0
  247. package/dist/styles/radius.js +51 -0
  248. package/dist/styles/radius.js.map +1 -0
  249. package/dist/styles/radius.mjs +51 -0
  250. package/dist/styles/radius.mjs.map +1 -0
  251. package/dist/styles/scrollbar.d.ts +21 -0
  252. package/dist/styles/scrollbar.js +105 -0
  253. package/dist/styles/scrollbar.js.map +1 -0
  254. package/dist/styles/scrollbar.mjs +105 -0
  255. package/dist/styles/scrollbar.mjs.map +1 -0
  256. package/dist/styles/shadow.d.ts +14 -0
  257. package/dist/styles/shadow.js +24 -0
  258. package/dist/styles/shadow.js.map +1 -0
  259. package/dist/styles/shadow.mjs +24 -0
  260. package/dist/styles/shadow.mjs.map +1 -0
  261. package/dist/styles/styledScrollbar.d.ts +47 -0
  262. package/dist/styles/styledScrollbar.js +38 -0
  263. package/dist/styles/styledScrollbar.js.map +1 -0
  264. package/dist/styles/styledScrollbar.mjs +38 -0
  265. package/dist/styles/styledScrollbar.mjs.map +1 -0
  266. package/dist/styles/transition.d.ts +14 -0
  267. package/dist/styles/transition.js +138 -0
  268. package/dist/styles/transition.js.map +1 -0
  269. package/dist/styles/transition.mjs +138 -0
  270. package/dist/styles/transition.mjs.map +1 -0
  271. package/dist/styles/types.d.mts +492 -0
  272. package/dist/styles/types.d.ts +496 -0
  273. package/dist/styles/width.d.ts +17 -0
  274. package/dist/styles/width.js +20 -0
  275. package/dist/styles/width.js.map +1 -0
  276. package/dist/styles/width.mjs +20 -0
  277. package/dist/styles/width.mjs.map +1 -0
  278. package/dist/tasty.d.ts +983 -0
  279. package/dist/tasty.js +191 -0
  280. package/dist/tasty.js.map +1 -0
  281. package/dist/tokens/typography.d.ts +19 -0
  282. package/dist/tokens/typography.js +237 -0
  283. package/dist/tokens/typography.js.map +1 -0
  284. package/dist/types.d.ts +182 -0
  285. package/dist/utils/cache-wrapper.js +26 -0
  286. package/dist/utils/cache-wrapper.js.map +1 -0
  287. package/dist/utils/cache-wrapper.mjs +26 -0
  288. package/dist/utils/cache-wrapper.mjs.map +1 -0
  289. package/dist/utils/case-converter.js +8 -0
  290. package/dist/utils/case-converter.js.map +1 -0
  291. package/dist/utils/case-converter.mjs +8 -0
  292. package/dist/utils/case-converter.mjs.map +1 -0
  293. package/dist/utils/colors.d.ts +5 -0
  294. package/dist/utils/colors.js +9 -0
  295. package/dist/utils/colors.js.map +1 -0
  296. package/dist/utils/dotize.d.ts +26 -0
  297. package/dist/utils/dotize.js +122 -0
  298. package/dist/utils/dotize.js.map +1 -0
  299. package/dist/utils/filter-base-props.d.ts +15 -0
  300. package/dist/utils/filter-base-props.js +45 -0
  301. package/dist/utils/filter-base-props.js.map +1 -0
  302. package/dist/utils/get-display-name.d.ts +7 -0
  303. package/dist/utils/get-display-name.js +10 -0
  304. package/dist/utils/get-display-name.js.map +1 -0
  305. package/dist/utils/hsl-to-rgb.js +38 -0
  306. package/dist/utils/hsl-to-rgb.js.map +1 -0
  307. package/dist/utils/hsl-to-rgb.mjs +38 -0
  308. package/dist/utils/hsl-to-rgb.mjs.map +1 -0
  309. package/dist/utils/is-dev-env.js +19 -0
  310. package/dist/utils/is-dev-env.js.map +1 -0
  311. package/dist/utils/is-dev-env.mjs +19 -0
  312. package/dist/utils/is-dev-env.mjs.map +1 -0
  313. package/dist/utils/merge-styles.d.ts +7 -0
  314. package/dist/utils/merge-styles.js +146 -0
  315. package/dist/utils/merge-styles.js.map +1 -0
  316. package/dist/utils/merge-styles.mjs +146 -0
  317. package/dist/utils/merge-styles.mjs.map +1 -0
  318. package/dist/utils/mod-attrs.d.ts +8 -0
  319. package/dist/utils/mod-attrs.js +21 -0
  320. package/dist/utils/mod-attrs.js.map +1 -0
  321. package/dist/utils/okhsl-to-rgb.js +296 -0
  322. package/dist/utils/okhsl-to-rgb.js.map +1 -0
  323. package/dist/utils/okhsl-to-rgb.mjs +296 -0
  324. package/dist/utils/okhsl-to-rgb.mjs.map +1 -0
  325. package/dist/utils/process-tokens.d.ts +31 -0
  326. package/dist/utils/process-tokens.js +171 -0
  327. package/dist/utils/process-tokens.js.map +1 -0
  328. package/dist/utils/process-tokens.mjs +28 -0
  329. package/dist/utils/process-tokens.mjs.map +1 -0
  330. package/dist/utils/resolve-recipes.d.ts +17 -0
  331. package/dist/utils/resolve-recipes.js +143 -0
  332. package/dist/utils/resolve-recipes.js.map +1 -0
  333. package/dist/utils/resolve-recipes.mjs +143 -0
  334. package/dist/utils/resolve-recipes.mjs.map +1 -0
  335. package/dist/utils/string.js +8 -0
  336. package/dist/utils/string.js.map +1 -0
  337. package/dist/utils/string.mjs +8 -0
  338. package/dist/utils/string.mjs.map +1 -0
  339. package/dist/utils/styles.d.mts +18 -0
  340. package/dist/utils/styles.d.ts +183 -0
  341. package/dist/utils/styles.js +585 -0
  342. package/dist/utils/styles.js.map +1 -0
  343. package/dist/utils/styles.mjs +346 -0
  344. package/dist/utils/styles.mjs.map +1 -0
  345. package/dist/utils/typography.d.ts +36 -0
  346. package/dist/utils/typography.js +53 -0
  347. package/dist/utils/typography.js.map +1 -0
  348. package/dist/utils/warnings.d.ts +16 -0
  349. package/dist/utils/warnings.js +16 -0
  350. package/dist/utils/warnings.js.map +1 -0
  351. package/dist/zero/babel.d.mts +108 -0
  352. package/dist/zero/babel.mjs +282 -0
  353. package/dist/zero/babel.mjs.map +1 -0
  354. package/dist/zero/index.d.mts +3 -0
  355. package/dist/zero/index.mjs +4 -0
  356. package/dist/zero/next.d.mts +60 -0
  357. package/dist/zero/next.mjs +78 -0
  358. package/dist/zero/next.mjs.map +1 -0
  359. package/package.json +127 -0
@@ -0,0 +1,585 @@
1
+ import { StyleParser } from "../parser/parser.js";
2
+ import { okhslFunc } from "../plugins/okhsl-plugin.js";
3
+ import { cacheWrapper } from "./cache-wrapper.js";
4
+ import { camelToKebab } from "./case-converter.js";
5
+ import { okhslToRgb } from "./okhsl-to-rgb.js";
6
+ import { hslToRgb } from "./hsl-to-rgb.js";
7
+ import { createStateParserContext, parseAdvancedState } from "../states/index.js";
8
+
9
+ //#region src/utils/styles.ts
10
+ /**
11
+ * Normalize a color token value.
12
+ * - Boolean `true` is converted to `'transparent'`
13
+ * - Boolean `false` returns `null` (signals the token should be skipped)
14
+ * - Other values are returned as-is
15
+ *
16
+ * @param value - The raw token value
17
+ * @returns Normalized value or null if the token should be skipped
18
+ */
19
+ function normalizeColorTokenValue(value) {
20
+ if (value === true) return "transparent";
21
+ if (value === false) return null;
22
+ return value;
23
+ }
24
+ const COLOR_VAR_PATTERN = /var\(--([a-z0-9-]+)-color/;
25
+ const COLOR_VAR_RGB_PATTERN = /var\(--([a-z0-9-]+)-color-rgb/;
26
+ const RGB_ALPHA_PATTERN = /\/\s*([0-9.]+)\)/;
27
+ const SIMPLE_COLOR_PATTERNS = [
28
+ /^#[0-9a-fA-F]{3,8}$/,
29
+ /^rgb\(/,
30
+ /^hsl\(/,
31
+ /^lch\(/,
32
+ /^oklch\(/,
33
+ /^okhsl\(/,
34
+ /^var\(--[a-z0-9-]+-color/,
35
+ /^currentColor$/,
36
+ /^transparent$/
37
+ ];
38
+ let colorWarningCount = 0;
39
+ const MAX_COLOR_WARNINGS = 10;
40
+ const CUSTOM_UNITS = {
41
+ r: "6px",
42
+ cr: "10px",
43
+ bw: "1px",
44
+ ow: "3px",
45
+ x: "8px",
46
+ fs: "var(--font-size)",
47
+ lh: "var(--line-height)",
48
+ sf: function sf(num) {
49
+ return `minmax(0, ${num}fr)`;
50
+ }
51
+ };
52
+ const DIRECTIONS = [
53
+ "top",
54
+ "right",
55
+ "bottom",
56
+ "left"
57
+ ];
58
+ const MOD_NAME_CACHE = /* @__PURE__ */ new Map();
59
+ function getModSelector(modName) {
60
+ if (!MOD_NAME_CACHE.has(modName)) {
61
+ let selector;
62
+ const valueModMatch = modName.match(/^([a-z][a-z0-9-]*)(\^=|\$=|\*=|=)(.+)$/i);
63
+ if (valueModMatch) {
64
+ const key = valueModMatch[1];
65
+ const operator = valueModMatch[2];
66
+ let value = valueModMatch[3];
67
+ if (value.startsWith("\"") && value.endsWith("\"") || value.startsWith("'") && value.endsWith("'")) value = value.slice(1, -1);
68
+ selector = `[data-${camelToKebab(key)}${operator}"${value}"]`;
69
+ } else if (modName.match(/^[a-z]/)) selector = `[data-${camelToKebab(modName)}]`;
70
+ else if (modName.includes(":has(")) selector = modName.replace(/:has\(([^)]+)\)/g, (match, content) => {
71
+ if (/[A-Z][a-z]*[>+~]|[>+~][A-Z][a-z]*/.test(content)) console.error(`[Tasty] Invalid :has() selector syntax: "${modName}"\nCombinators (>, +, ~) must have spaces around them when used with element names.\nExample: Use ":has(Body > Row)" instead of ":has(Body>Row)"\nThis is a design choice: the parser uses simple whitespace splitting for performance.`);
72
+ return `:has(${content.split(/\s+/).map((token) => /^[A-Z]/.test(token) ? `[data-element="${token}"]` : token).join(" ")})`;
73
+ });
74
+ else selector = modName;
75
+ MOD_NAME_CACHE.set(modName, selector);
76
+ }
77
+ return MOD_NAME_CACHE.get(modName);
78
+ }
79
+ let __tastyParser = null;
80
+ function getOrCreateParser() {
81
+ if (!__tastyParser) {
82
+ __tastyParser = new StyleParser({ units: CUSTOM_UNITS });
83
+ __tastyParser.setFuncs(__tastyFuncs);
84
+ }
85
+ return __tastyParser;
86
+ }
87
+ const __tastyFuncs = { okhsl: okhslFunc };
88
+ function customFunc(name, fn) {
89
+ __tastyFuncs[name] = fn;
90
+ getOrCreateParser().setFuncs(__tastyFuncs);
91
+ }
92
+ /**
93
+ * Get the global StyleParser instance.
94
+ * Used by configure() to apply parser configuration.
95
+ */
96
+ function getGlobalParser() {
97
+ return getOrCreateParser();
98
+ }
99
+ /**
100
+ * Get the current custom functions registry.
101
+ * Used by configure() to merge with new functions.
102
+ */
103
+ function getGlobalFuncs() {
104
+ return __tastyFuncs;
105
+ }
106
+ /**
107
+ * Storage for predefined tokens that are replaced during style parsing.
108
+ * Keys are token names (with $ or # prefix), values are pre-processed CSS values.
109
+ */
110
+ let __globalPredefinedTokens = null;
111
+ /**
112
+ * Set global predefined tokens.
113
+ * Called from configure() after processing token values.
114
+ * Merges with existing tokens (new tokens override existing ones with same key).
115
+ * Keys are normalized to lowercase (parser lowercases input before classification).
116
+ * @internal
117
+ */
118
+ function setGlobalPredefinedTokens(tokens) {
119
+ const normalizedTokens = {};
120
+ for (const [key, value] of Object.entries(tokens)) {
121
+ const lowerKey = key.toLowerCase();
122
+ const lowerValue = value.toLowerCase();
123
+ if (lowerKey.startsWith("#") && lowerValue === "#current") {
124
+ console.warn(`Tasty: Using #current to define color token "${key}" is not supported. The #current token represents currentcolor which cannot be used as a base for other tokens.`);
125
+ continue;
126
+ }
127
+ normalizedTokens[lowerKey] = value;
128
+ }
129
+ __globalPredefinedTokens = __globalPredefinedTokens ? {
130
+ ...__globalPredefinedTokens,
131
+ ...normalizedTokens
132
+ } : normalizedTokens;
133
+ getOrCreateParser().clearCache();
134
+ }
135
+ /**
136
+ * Get the current global predefined tokens.
137
+ * Returns null if no tokens are configured.
138
+ */
139
+ function getGlobalPredefinedTokens() {
140
+ return __globalPredefinedTokens;
141
+ }
142
+ /**
143
+ * Reset global predefined tokens.
144
+ * Used for testing.
145
+ * @internal
146
+ */
147
+ function resetGlobalPredefinedTokens() {
148
+ __globalPredefinedTokens = null;
149
+ getOrCreateParser().clearCache();
150
+ }
151
+ /**
152
+ *
153
+ * @param {String} value
154
+ * @param {Number} mode
155
+ * @returns {Object<String,String|Array>}
156
+ */
157
+ function parseStyle(value) {
158
+ let str;
159
+ if (typeof value === "string") str = value;
160
+ else if (typeof value === "number") str = String(value);
161
+ else str = "";
162
+ return getOrCreateParser().process(str);
163
+ }
164
+ /**
165
+ * Parse color. Find it value, name and opacity.
166
+ * Optimized to avoid heavy parseStyle calls for simple color patterns.
167
+ */
168
+ function parseColor(val, ignoreError = false) {
169
+ if (typeof val !== "string") val = String(val ?? "");
170
+ val = val.trim();
171
+ if (!val) return {};
172
+ const isSimpleColor = SIMPLE_COLOR_PATTERNS.some((pattern) => pattern.test(val));
173
+ let firstColor;
174
+ if (isSimpleColor) firstColor = val;
175
+ else {
176
+ const extractedColor = parseStyle(val).groups.find((g) => g.colors.length)?.colors[0];
177
+ if (!extractedColor) {
178
+ if (!ignoreError && colorWarningCount < MAX_COLOR_WARNINGS) {
179
+ console.warn("CubeUIKit: unable to parse color:", val);
180
+ colorWarningCount++;
181
+ if (colorWarningCount === MAX_COLOR_WARNINGS) console.warn("CubeUIKit: color parsing warnings will be suppressed from now on");
182
+ }
183
+ return {};
184
+ }
185
+ firstColor = extractedColor;
186
+ }
187
+ let nameMatch = firstColor.match(COLOR_VAR_PATTERN);
188
+ if (!nameMatch) nameMatch = firstColor.match(COLOR_VAR_RGB_PATTERN);
189
+ let opacity;
190
+ if (firstColor.startsWith("rgb") || firstColor.startsWith("hsl") || firstColor.startsWith("lch") || firstColor.startsWith("oklch") || firstColor.startsWith("okhsl")) {
191
+ const alphaMatch = firstColor.match(RGB_ALPHA_PATTERN);
192
+ if (alphaMatch) {
193
+ const v = parseFloat(alphaMatch[1]);
194
+ if (!isNaN(v)) opacity = v * 100;
195
+ }
196
+ }
197
+ return {
198
+ color: firstColor,
199
+ name: nameMatch ? nameMatch[1] : void 0,
200
+ opacity
201
+ };
202
+ }
203
+ function strToRgb(color, _ignoreAlpha = false) {
204
+ if (!color) return void 0;
205
+ if (color.startsWith("rgb")) return color;
206
+ if (color.startsWith("#")) return hexToRgb(color);
207
+ if (color.startsWith("okhsl(")) return okhslToRgb(color);
208
+ if (color.startsWith("hsl")) return hslToRgb(color);
209
+ return null;
210
+ }
211
+ /**
212
+ * Extract RGB values from an rgb()/rgba() string.
213
+ * Supports all modern CSS syntax variations:
214
+ * - Comma-separated: rgb(255, 128, 0)
215
+ * - Space-separated: rgb(255 128 0)
216
+ * - Fractional: rgb(128.5, 64.3, 32.1)
217
+ * - Percentages: rgb(50%, 25%, 75%)
218
+ * - Slash alpha notation: rgb(255 128 0 / 0.5)
219
+ *
220
+ * Returns array of RGB values (0-255 range), converting percentages as needed.
221
+ */
222
+ function getRgbValuesFromRgbaString(str) {
223
+ const match = str.match(/rgba?\(([^)]+)\)/i);
224
+ if (!match) return [];
225
+ const [colorPart] = match[1].trim().split("/");
226
+ return colorPart.trim().split(/[,\s]+/).filter(Boolean).slice(0, 3).map((part) => {
227
+ part = part.trim();
228
+ if (part.endsWith("%")) return parseFloat(part) / 100 * 255;
229
+ return parseFloat(part);
230
+ });
231
+ }
232
+ function hexToRgb(hex) {
233
+ const rgba = hex.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i, (m, r, g, b) => "#" + r + r + g + g + b + b).substring(1).match(/.{2}/g).map((x, i) => parseInt(x, 16) * (i === 3 ? 1 / 255 : 1));
234
+ if (rgba.some((v) => Number.isNaN(v))) return null;
235
+ if (rgba.length >= 3) return `rgb(${rgba.slice(0, 3).join(" ")}${rgba.length > 3 ? ` / ${rgba[3]}` : ""})`;
236
+ return null;
237
+ }
238
+ function filterMods(mods, allowedMods) {
239
+ return mods.filter((mod) => allowedMods.includes(mod));
240
+ }
241
+ function extendStyles(defaultStyles, newStyles) {
242
+ let styles = {};
243
+ if (!defaultStyles) {
244
+ if (!newStyles) return styles;
245
+ } else styles = Object.assign({}, defaultStyles);
246
+ if (newStyles) Object.keys(newStyles).forEach((key) => {
247
+ if (newStyles[key] != null) styles[key] = newStyles[key];
248
+ });
249
+ return styles;
250
+ }
251
+ /**
252
+ * Split properties into style and non-style properties.
253
+ * @param props - Component prop map.
254
+ * @param [styleList] - List of all style properties.
255
+ * @param [defaultStyles] - Default style map of the component.
256
+ * @param [propMap] - Props to style alias map.
257
+ * @param [ignoreList] - A list of properties to ignore.
258
+ */
259
+ function extractStyles(props, styleList = [], defaultStyles, propMap, ignoreList = []) {
260
+ const styles = {
261
+ ...defaultStyles,
262
+ ...ignoreList.includes("styles") ? void 0 : props.styles && typeof props.styles === "object" ? props.styles : void 0
263
+ };
264
+ Object.keys(props).forEach((prop) => {
265
+ const propName = propMap ? propMap[prop] || prop : prop;
266
+ const value = props[prop];
267
+ if (ignoreList && ignoreList.includes(prop)) {} else if (styleList.includes(propName)) styles[propName] = value;
268
+ }, {});
269
+ return styles;
270
+ }
271
+ const STATES_REGEXP = /([&|!^])|([()])|(@media:[a-z]+)|(@media\([^)]+\))|(@root\([^)]+\))|(@own\([^)]+\))|(@\([^)]+\))|(@starting)|(@[A-Za-z][A-Za-z0-9-]*)|([a-z][a-z0-9-]+=(?:"[^"]*"|'[^']*'|[^\s&|!^()]+))|([a-z][a-z0-9-]+)|(:[a-z][a-z0-9-]+\([^)]+\)|:[a-z][a-z0-9-]+)|(\.[a-z][a-z0-9-]+)|(\[[^\]]+])/gi;
272
+ /**
273
+ * Check if a token is an advanced state (starts with @)
274
+ */
275
+ function isAdvancedStateToken(token) {
276
+ return token.startsWith("@") || token.startsWith("!@");
277
+ }
278
+ const STATE_OPERATORS = {
279
+ NOT: "!",
280
+ AND: "&",
281
+ OR: "|",
282
+ XOR: "^"
283
+ };
284
+ const STATE_OPERATOR_LIST = [
285
+ "!",
286
+ "&",
287
+ "|",
288
+ "^"
289
+ ];
290
+ /**
291
+ * Convert state notation tokens to a compute model (string, or nested [op, lhs, rhs]).
292
+ */
293
+ function convertTokensToComputeUnits(tokens) {
294
+ if (tokens.length === 1) return tokens[0];
295
+ const hasLength = (x) => typeof x === "string" || Array.isArray(x);
296
+ STATE_OPERATOR_LIST.forEach((operator) => {
297
+ let i;
298
+ while ((i = tokens.indexOf(operator)) !== -1) {
299
+ const token = tokens[i];
300
+ if (token === "!") {
301
+ const next = tokens[i + 1];
302
+ if (next !== void 0 && hasLength(next) && next.length !== 1) tokens.splice(i, 2, ["!", next]);
303
+ else tokens.splice(i, 1);
304
+ } else {
305
+ const prev = tokens[i - 1];
306
+ const next = tokens[i + 1];
307
+ if (prev !== void 0 && next !== void 0 && hasLength(prev) && hasLength(next) && prev.length !== 1 && next.length !== 1) tokens.splice(i - 1, 3, [
308
+ token,
309
+ prev,
310
+ next
311
+ ]);
312
+ else tokens.splice(i, 1);
313
+ }
314
+ }
315
+ });
316
+ return tokens.length === 1 ? tokens[0] : tokens;
317
+ }
318
+ /**
319
+ * Replace commas with | only outside of parentheses.
320
+ * This preserves commas in advanced states like @(card, w < 600px)
321
+ */
322
+ function replaceCommasOutsideParens(str) {
323
+ let result = "";
324
+ let depth = 0;
325
+ for (const char of str) if (char === "(") {
326
+ depth++;
327
+ result += char;
328
+ } else if (char === ")") {
329
+ depth--;
330
+ result += char;
331
+ } else if (char === "," && depth === 0) result += "|";
332
+ else result += char;
333
+ return result;
334
+ }
335
+ /**
336
+ * Parse state notation and return tokens, modifiers and compute model.
337
+ */
338
+ function parseStateNotationInner(notation, value) {
339
+ const tokens = replaceCommasOutsideParens(notation).match(STATES_REGEXP);
340
+ if (!tokens || !tokens.length) return {
341
+ model: void 0,
342
+ mods: [],
343
+ notMods: [],
344
+ tokens: [],
345
+ value
346
+ };
347
+ else if (tokens.length === 1) return {
348
+ model: tokens[0],
349
+ mods: tokens.slice(0),
350
+ notMods: [],
351
+ tokens,
352
+ value
353
+ };
354
+ const mods = [];
355
+ const operations = [[]];
356
+ let list = operations[0];
357
+ let position = 0;
358
+ let operation;
359
+ tokens.forEach((token) => {
360
+ switch (token) {
361
+ case "(":
362
+ operation = [];
363
+ position++;
364
+ list = operations[position] = operation;
365
+ break;
366
+ case ")":
367
+ position--;
368
+ operations[position].push(convertTokensToComputeUnits(list));
369
+ list = operations[position];
370
+ break;
371
+ default:
372
+ if (token.length > 1) {
373
+ if (!mods.includes(token)) mods.push(token);
374
+ }
375
+ list.push(token);
376
+ }
377
+ });
378
+ while (position) {
379
+ position--;
380
+ operations[position].push(convertTokensToComputeUnits(list));
381
+ list = operations[position];
382
+ }
383
+ return {
384
+ tokens,
385
+ mods,
386
+ notMods: [],
387
+ model: convertTokensToComputeUnits(operations[0]),
388
+ value
389
+ };
390
+ }
391
+ const parseStateNotation = cacheWrapper(parseStateNotationInner);
392
+ /**
393
+ * Build an AtRuleContext from parsed advanced states
394
+ */
395
+ function buildAtRuleContext(advancedStates, negatedStates) {
396
+ if (advancedStates.length === 0) return void 0;
397
+ const ctx = {};
398
+ for (const state of advancedStates) {
399
+ const isNegated = negatedStates.has(state.raw);
400
+ switch (state.type) {
401
+ case "media": {
402
+ if (!ctx.media) ctx.media = [];
403
+ let mediaCondition = "";
404
+ if (state.mediaType) mediaCondition = state.mediaType;
405
+ else if (state.condition) mediaCondition = `(${state.condition})`;
406
+ if (mediaCondition) if (isNegated) ctx.media.push(`not ${mediaCondition}`);
407
+ else ctx.media.push(mediaCondition);
408
+ break;
409
+ }
410
+ case "container": {
411
+ if (!ctx.container) ctx.container = [];
412
+ let condition = state.condition;
413
+ if (isNegated) condition = `not (${condition})`;
414
+ ctx.container.push({
415
+ name: state.containerName,
416
+ condition
417
+ });
418
+ break;
419
+ }
420
+ case "root": {
421
+ if (!ctx.rootStates) ctx.rootStates = [];
422
+ const rootSelector = buildRootSelector(state.condition, isNegated);
423
+ ctx.rootStates.push(rootSelector);
424
+ break;
425
+ }
426
+ case "starting":
427
+ if (!isNegated) ctx.startingStyle = true;
428
+ break;
429
+ }
430
+ }
431
+ if (!ctx.media?.length && !ctx.container?.length && !ctx.rootStates?.length && !ctx.startingStyle) return;
432
+ return ctx;
433
+ }
434
+ /**
435
+ * Build a root state selector from a condition
436
+ */
437
+ function buildRootSelector(condition, isNegated) {
438
+ let selector;
439
+ if (condition.startsWith(".")) selector = condition;
440
+ else if (condition.startsWith("[")) selector = condition;
441
+ else if (condition.includes("=")) {
442
+ const [key, value] = condition.split("=");
443
+ selector = `[data-${camelToKebab(key.trim())}="${value.trim()}"]`;
444
+ } else selector = `[data-${camelToKebab(condition)}]`;
445
+ if (isNegated) return `:not(${selector})`;
446
+ return selector;
447
+ }
448
+ /**
449
+ * Parse state notation and return tokens, modifiers and compute model.
450
+ * Enhanced to detect and extract advanced states.
451
+ */
452
+ function styleStateMapToStyleStateDataList(styleStateMap, parserContext) {
453
+ if (typeof styleStateMap !== "object" || !styleStateMap) return {
454
+ states: [{
455
+ model: void 0,
456
+ mods: [],
457
+ notMods: [],
458
+ value: styleStateMap
459
+ }],
460
+ mods: [],
461
+ hasAdvancedStates: false
462
+ };
463
+ const stateDataList = [];
464
+ let hasAdvancedStates = false;
465
+ Object.keys(styleStateMap).forEach((stateNotation) => {
466
+ const state = parseStateNotation(stateNotation, styleStateMap[stateNotation]);
467
+ const advancedStates = [];
468
+ const negatedAdvancedStates = /* @__PURE__ */ new Set();
469
+ const regularMods = [];
470
+ const ownMods = [];
471
+ const negatedOwnMods = [];
472
+ if (state.tokens) {
473
+ let isNegated = false;
474
+ for (const token of state.tokens) {
475
+ if (token === "!") {
476
+ isNegated = true;
477
+ continue;
478
+ }
479
+ if (isAdvancedStateToken(token)) {
480
+ hasAdvancedStates = true;
481
+ const parsed = parseAdvancedState(token, parserContext || createStateParserContext(void 0));
482
+ advancedStates.push(parsed);
483
+ if (parsed.type === "own" && parsed.condition) if (isNegated) negatedOwnMods.push(parsed.condition);
484
+ else ownMods.push(parsed.condition);
485
+ else if (isNegated) negatedAdvancedStates.add(token);
486
+ isNegated = false;
487
+ } else if (token.length > 1 && ![
488
+ "&",
489
+ "|",
490
+ "^",
491
+ "(",
492
+ ")"
493
+ ].includes(token)) {
494
+ regularMods.push(token);
495
+ isNegated = false;
496
+ } else isNegated = false;
497
+ }
498
+ }
499
+ if (advancedStates.length > 0) {
500
+ state.advancedStates = advancedStates;
501
+ state.atRuleContext = buildAtRuleContext(advancedStates, negatedAdvancedStates);
502
+ state.mods = regularMods;
503
+ }
504
+ if (ownMods.length > 0) state.ownMods = ownMods;
505
+ if (negatedOwnMods.length > 0) state.negatedOwnMods = negatedOwnMods;
506
+ stateDataList.push(state);
507
+ });
508
+ stateDataList.reverse();
509
+ let initialState;
510
+ const allMods = stateDataList.reduce((all, state) => {
511
+ if (!state.mods.length && !state.advancedStates?.length) initialState = state;
512
+ else state.mods.forEach((mod) => {
513
+ if (!all.includes(mod)) all.push(mod);
514
+ });
515
+ return all;
516
+ }, []);
517
+ if (!initialState) stateDataList.push({
518
+ mods: [],
519
+ notMods: allMods,
520
+ value: true
521
+ });
522
+ return {
523
+ states: stateDataList,
524
+ mods: allMods,
525
+ hasAdvancedStates
526
+ };
527
+ }
528
+ const COMPUTE_FUNC_MAP = {
529
+ "!": (a) => !a,
530
+ "^": (a, b) => a && !b || !a && b,
531
+ "|": (a, b) => a || b,
532
+ "&": (a, b) => a && b
533
+ };
534
+ /**
535
+ * Compute a result based on a model and incoming map.
536
+ */
537
+ function computeState(computeModel, valueMap) {
538
+ if (!computeModel) return true;
539
+ if (!Array.isArray(computeModel)) if (typeof valueMap === "function") return !!valueMap(computeModel);
540
+ else return !!valueMap[computeModel];
541
+ const func = COMPUTE_FUNC_MAP[computeModel[0]];
542
+ if (!func) console.warn("CubeUIKit: unexpected compute method in the model", computeModel);
543
+ let a = computeModel[1];
544
+ if (typeof a === "object") a = !!computeState(a, valueMap);
545
+ else if (typeof valueMap === "function") a = !!valueMap(a);
546
+ else a = !!valueMap[a];
547
+ if (computeModel.length === 2) return func(a);
548
+ let b = computeModel[2];
549
+ if (typeof b === "object") b = !!computeState(b, valueMap);
550
+ else if (typeof valueMap === "function") b = !!valueMap(b);
551
+ else b = !!valueMap[b];
552
+ return !!func(a, b);
553
+ }
554
+ const _innerCache = /* @__PURE__ */ new WeakMap();
555
+ function stringifyStyles(styles) {
556
+ if (styles == null || typeof styles !== "object") return "";
557
+ const keys = Object.keys(styles).sort();
558
+ const parts = [];
559
+ for (const k of keys) {
560
+ const v = styles[k];
561
+ if (v === void 0 || typeof v === "function" || typeof v === "symbol") continue;
562
+ const c0 = k.charCodeAt(0);
563
+ const needsInnerSort = (c0 >= 65 && c0 <= 90 || c0 === 38) && v && typeof v === "object" && !Array.isArray(v);
564
+ let sv;
565
+ if (needsInnerSort) {
566
+ sv = _innerCache.get(v);
567
+ if (sv === void 0) {
568
+ const innerKeys = Object.keys(v).sort();
569
+ const innerParts = [];
570
+ for (const ik of innerKeys) {
571
+ const ivs = JSON.stringify(v[ik]);
572
+ if (ivs !== void 0) innerParts.push(JSON.stringify(ik) + ":" + ivs);
573
+ }
574
+ sv = "{" + innerParts.join(",") + "}";
575
+ _innerCache.set(v, sv);
576
+ }
577
+ } else sv = JSON.stringify(v);
578
+ parts.push(JSON.stringify(k) + ":" + sv);
579
+ }
580
+ return "{" + parts.join(",") + "}";
581
+ }
582
+
583
+ //#endregion
584
+ export { COMPUTE_FUNC_MAP, CUSTOM_UNITS, DIRECTIONS, STATE_OPERATORS, STATE_OPERATOR_LIST, buildAtRuleContext, computeState, customFunc, extendStyles, extractStyles, filterMods, getGlobalFuncs, getGlobalParser, getGlobalPredefinedTokens, getModSelector, getRgbValuesFromRgbaString, hexToRgb, isAdvancedStateToken, normalizeColorTokenValue, parseColor, parseStateNotation, parseStyle, resetGlobalPredefinedTokens, setGlobalPredefinedTokens, strToRgb, stringifyStyles, styleStateMapToStyleStateDataList };
585
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.js","names":[],"sources":["../../src/utils/styles.ts"],"sourcesContent":["import { StyleParser } from '../parser/parser';\nimport { okhslFunc } from '../plugins/okhsl-plugin';\nimport { createStateParserContext, parseAdvancedState } from '../states';\nimport type { Styles } from '../styles/types';\n\nimport { cacheWrapper } from './cache-wrapper';\nimport { camelToKebab } from './case-converter';\nimport { hslToRgb } from './hsl-to-rgb';\nimport { okhslToRgb } from './okhsl-to-rgb';\n\nimport type { ProcessedStyle, StyleDetails } from '../parser/types';\nimport type {\n AtRuleContext,\n ParsedAdvancedState,\n StateParserContext,\n} from '../states';\n\nexport type StyleValue<T = string> = T | boolean | number | null | undefined;\n\n/**\n * Normalize a color token value.\n * - Boolean `true` is converted to `'transparent'`\n * - Boolean `false` returns `null` (signals the token should be skipped)\n * - Other values are returned as-is\n *\n * @param value - The raw token value\n * @returns Normalized value or null if the token should be skipped\n */\nexport function normalizeColorTokenValue<T>(\n value: T | boolean,\n): T | 'transparent' | null {\n if (value === true) {\n return 'transparent';\n }\n if (value === false) {\n return null;\n }\n return value as T;\n}\n\nexport type StyleValueStateMap<T = string> = Record<string, StyleValue<T> | '@inherit'>;\n\n/**\n * Combined type for style values that can be either a direct value or a state map.\n * Use this for component props that accept style values.\n */\nexport type StylePropValue<T = string> = StyleValue<T> | StyleValueStateMap<T>;\n\nexport type ComputeModel = string | number;\n\nexport type CSSMap = { $?: string | string[] } & Record<string, string | string[]>;\n\nexport type StyleHandlerResult = CSSMap | CSSMap[] | void;\n\nexport type RawStyleHandler = (value: StyleValueStateMap) => StyleHandlerResult;\n\nexport type StyleHandler = RawStyleHandler & {\n __lookupStyles: string[];\n};\n\n/**\n * Handler definition forms for configure() and plugins.\n * - Function only: lookup styles inferred from key name\n * - Single property tuple: ['styleName', handler]\n * - Multi-property tuple: [['style1', 'style2'], handler]\n */\nexport type StyleHandlerDefinition =\n | RawStyleHandler\n | [string, RawStyleHandler]\n | [string[], RawStyleHandler];\n\nexport interface StyleStateData {\n model?: ComputeModel;\n tokens?: string[];\n value: StyleValue | StyleValueStateMap | StyleStateData;\n /** The list of mods to apply */\n mods: string[];\n /** The list of **not** mods to apply (e.g. `:not(:hover)`) */\n notMods: string[];\n /** Advanced states (media queries, container queries, etc.) */\n advancedStates?: ParsedAdvancedState[];\n /** At-rule context for CSS generation */\n atRuleContext?: AtRuleContext;\n /** Own mods for sub-element states (from @own()) - applied to sub-element selector */\n ownMods?: string[];\n /** Negated own mods for sub-element states */\n negatedOwnMods?: string[];\n}\n\nexport interface ParsedColor {\n color?: string;\n name?: string;\n opacity?: number;\n}\n\nexport type StyleStateDataList = StyleStateData[];\n\nexport type StyleStateDataListMap = Record<string, StyleStateDataList>;\n\nexport type StyleMap = Record<string, StyleValue | StyleValueStateMap>;\n\nexport type StyleStateMap = Record<string, StyleStateData>;\n\nconst devMode = process.env.NODE_ENV !== 'production';\n\n// Precompiled regex patterns for parseColor optimization\n// Match var(--name-color...) and extract the name, regardless of fallbacks\nconst COLOR_VAR_PATTERN = /var\\(--([a-z0-9-]+)-color/;\nconst COLOR_VAR_RGB_PATTERN = /var\\(--([a-z0-9-]+)-color-rgb/;\nconst RGB_ALPHA_PATTERN = /\\/\\s*([0-9.]+)\\)/;\nconst SIMPLE_COLOR_PATTERNS = [\n /^#[0-9a-fA-F]{3,8}$/, // Hex colors: #fff, #ffffff, #ffff, #ffffffff\n /^rgb\\(/, // RGB/RGBA functions\n /^hsl\\(/, // HSL/HSLA functions\n /^lch\\(/, // LCH color functions\n /^oklch\\(/, // OKLCH color functions\n /^okhsl\\(/, // OKHSL color functions\n /^var\\(--[a-z0-9-]+-color/, // CSS custom properties for colors\n /^currentColor$/, // CSS currentColor keyword\n /^transparent$/, // CSS transparent keyword\n];\n\n// Rate limiting for dev warnings to avoid spam\nlet colorWarningCount = 0;\nconst MAX_COLOR_WARNINGS = 10;\n\nexport const CUSTOM_UNITS = {\n r: '6px',\n cr: '10px',\n bw: '1px',\n ow: '3px',\n x: '8px',\n fs: 'var(--font-size)',\n lh: 'var(--line-height)',\n sf: function sf(num) {\n return `minmax(0, ${num}fr)`;\n },\n};\n\nexport const DIRECTIONS = ['top', 'right', 'bottom', 'left'];\n\nconst MOD_NAME_CACHE = new Map();\n\nexport function getModSelector(modName: string): string {\n if (!MOD_NAME_CACHE.has(modName)) {\n let selector: string;\n\n // Check if it's a shorthand value mod: key=value, key^=value, key$=value, key*=value\n // Supports: key=value, key=\"value\", key='value', and with ^=, $=, *= operators\n const valueModMatch = modName.match(\n /^([a-z][a-z0-9-]*)(\\^=|\\$=|\\*=|=)(.+)$/i,\n );\n if (valueModMatch) {\n const key = valueModMatch[1];\n const operator = valueModMatch[2];\n let value = valueModMatch[3];\n\n // Remove quotes if present\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n\n // Convert to full attribute selector with the appropriate operator\n selector = `[data-${camelToKebab(key)}${operator}\"${value}\"]`;\n } else if (modName.match(/^[a-z]/)) {\n // Boolean mod: convert camelCase to kebab-case\n selector = `[data-${camelToKebab(modName)}]`;\n } else {\n // Check if it contains :has() with capitalized element names\n if (modName.includes(':has(')) {\n selector = modName.replace(/:has\\(([^)]+)\\)/g, (match, content) => {\n // Validate that combinators have spaces around them\n // Check for capitalized words adjacent to combinators without spaces\n const invalidPattern = /[A-Z][a-z]*[>+~]|[>+~][A-Z][a-z]*/;\n if (invalidPattern.test(content)) {\n console.error(\n `[Tasty] Invalid :has() selector syntax: \"${modName}\"\\n` +\n `Combinators (>, +, ~) must have spaces around them when used with element names.\\n` +\n `Example: Use \":has(Body > Row)\" instead of \":has(Body>Row)\"\\n` +\n `This is a design choice: the parser uses simple whitespace splitting for performance.`,\n );\n }\n\n // Transform capitalized words to [data-element=\"...\"] selectors\n const tokens = content.split(/\\s+/);\n const transformed = tokens.map((token: string) =>\n /^[A-Z]/.test(token) ? `[data-element=\"${token}\"]` : token,\n );\n return `:has(${transformed.join(' ')})`;\n });\n } else {\n // Pass through (e.g., :hover, .class, [attr])\n selector = modName;\n }\n }\n\n MOD_NAME_CACHE.set(modName, selector);\n }\n\n return MOD_NAME_CACHE.get(modName);\n}\n\n// Lazy-initialized to break the circular dependency:\n// parser.ts → classify.ts → utils/styles.ts → parser.ts\nlet __tastyParser: StyleParser | null = null;\n\nfunction getOrCreateParser(): StyleParser {\n if (!__tastyParser) {\n __tastyParser = new StyleParser({ units: CUSTOM_UNITS });\n __tastyParser.setFuncs(__tastyFuncs);\n }\n return __tastyParser;\n}\n\n// Registry for user-provided custom functions that the parser can call.\n// It is updated through the `customFunc` helper exported below.\n// okhsl is registered as a built-in function so it works regardless of\n// tree-shaking or module initialization order.\nconst __tastyFuncs: Record<string, (groups: StyleDetails[]) => string> = {\n okhsl: okhslFunc,\n};\n\nexport function customFunc(\n name: string,\n fn: (groups: StyleDetails[]) => string,\n) {\n __tastyFuncs[name] = fn;\n getOrCreateParser().setFuncs(__tastyFuncs);\n}\n\n/**\n * Get the global StyleParser instance.\n * Used by configure() to apply parser configuration.\n */\nexport function getGlobalParser(): StyleParser {\n return getOrCreateParser();\n}\n\n/**\n * Get the current custom functions registry.\n * Used by configure() to merge with new functions.\n */\nexport function getGlobalFuncs(): Record<\n string,\n (groups: StyleDetails[]) => string\n> {\n return __tastyFuncs;\n}\n\n// ============================================================================\n// Global Predefined Tokens\n// ============================================================================\n\n/**\n * Storage for predefined tokens that are replaced during style parsing.\n * Keys are token names (with $ or # prefix), values are pre-processed CSS values.\n */\nlet __globalPredefinedTokens: Record<string, string> | null = null;\n\n/**\n * Set global predefined tokens.\n * Called from configure() after processing token values.\n * Merges with existing tokens (new tokens override existing ones with same key).\n * Keys are normalized to lowercase (parser lowercases input before classification).\n * @internal\n */\nexport function setGlobalPredefinedTokens(\n tokens: Record<string, string>,\n): void {\n // Normalize keys to lowercase for case-insensitive matching\n const normalizedTokens: Record<string, string> = {};\n for (const [key, value] of Object.entries(tokens)) {\n const lowerKey = key.toLowerCase();\n const lowerValue = value.toLowerCase();\n\n // Warn if trying to use bare #current to define other color tokens\n // #current represents currentcolor which cannot be used as a base for recursive token resolution\n // Note: #current.5 (with opacity) is allowed since it resolves to a concrete color-mix value\n if (lowerKey.startsWith('#') && lowerValue === '#current') {\n console.warn(\n `Tasty: Using #current to define color token \"${key}\" is not supported. ` +\n `The #current token represents currentcolor which cannot be used as a base for other tokens.`,\n );\n continue; // Skip this token\n }\n\n normalizedTokens[lowerKey] = value;\n }\n // Merge with existing tokens (consistent with how states, units, funcs are handled)\n __globalPredefinedTokens = __globalPredefinedTokens\n ? { ...__globalPredefinedTokens, ...normalizedTokens }\n : normalizedTokens;\n // Clear parser cache since token values affect parsing\n getOrCreateParser().clearCache();\n}\n\n/**\n * Get the current global predefined tokens.\n * Returns null if no tokens are configured.\n */\nexport function getGlobalPredefinedTokens(): Record<string, string> | null {\n return __globalPredefinedTokens;\n}\n\n/**\n * Reset global predefined tokens.\n * Used for testing.\n * @internal\n */\nexport function resetGlobalPredefinedTokens(): void {\n __globalPredefinedTokens = null;\n // Clear parser cache since token availability affects parsing\n getOrCreateParser().clearCache();\n}\n\n/**\n *\n * @param {String} value\n * @param {Number} mode\n * @returns {Object<String,String|Array>}\n */\nexport function parseStyle(value: StyleValue): ProcessedStyle {\n let str: string;\n\n if (typeof value === 'string') {\n str = value;\n } else if (typeof value === 'number') {\n str = String(value);\n } else {\n // boolean, null, undefined, objects etc. → empty string\n str = '';\n }\n\n return getOrCreateParser().process(str);\n}\n\n/**\n * Parse color. Find it value, name and opacity.\n * Optimized to avoid heavy parseStyle calls for simple color patterns.\n */\nexport function parseColor(val: string, ignoreError = false): ParsedColor {\n // Early return for non-strings or empty values\n if (typeof val !== 'string') {\n val = String(val ?? '');\n }\n\n val = val.trim();\n if (!val) return {};\n\n // Fast path: Check if it's a simple color pattern that doesn't need full parsing\n const isSimpleColor = SIMPLE_COLOR_PATTERNS.some((pattern) =>\n pattern.test(val),\n );\n\n let firstColor: string;\n if (isSimpleColor) {\n // For simple colors, use the value directly without parsing\n firstColor = val;\n } else {\n const processed = parseStyle(val);\n const extractedColor = processed.groups.find((g) => g.colors.length)\n ?.colors[0];\n\n if (!extractedColor) {\n // Rate-limited warning to avoid spam\n if (!ignoreError && devMode && colorWarningCount < MAX_COLOR_WARNINGS) {\n console.warn('CubeUIKit: unable to parse color:', val);\n colorWarningCount++;\n if (colorWarningCount === MAX_COLOR_WARNINGS) {\n console.warn(\n 'CubeUIKit: color parsing warnings will be suppressed from now on',\n );\n }\n }\n return {};\n }\n\n firstColor = extractedColor;\n }\n\n // Extract color name (if present) from variable pattern using precompiled regex\n let nameMatch = firstColor.match(COLOR_VAR_PATTERN);\n if (!nameMatch) {\n nameMatch = firstColor.match(COLOR_VAR_RGB_PATTERN);\n }\n\n let opacity: number | undefined;\n if (\n firstColor.startsWith('rgb') ||\n firstColor.startsWith('hsl') ||\n firstColor.startsWith('lch') ||\n firstColor.startsWith('oklch') ||\n firstColor.startsWith('okhsl')\n ) {\n const alphaMatch = firstColor.match(RGB_ALPHA_PATTERN);\n if (alphaMatch) {\n const v = parseFloat(alphaMatch[1]);\n if (!isNaN(v)) opacity = v * 100;\n }\n }\n\n return {\n color: firstColor,\n name: nameMatch ? nameMatch[1] : undefined,\n opacity,\n };\n}\n\nexport function strToRgb(color, _ignoreAlpha = false) {\n if (!color) return undefined;\n\n if (color.startsWith('rgb')) return color;\n\n if (color.startsWith('#')) return hexToRgb(color);\n\n if (color.startsWith('okhsl(')) return okhslToRgb(color);\n\n if (color.startsWith('hsl')) return hslToRgb(color);\n\n return null;\n}\n\n/**\n * Extract RGB values from an rgb()/rgba() string.\n * Supports all modern CSS syntax variations:\n * - Comma-separated: rgb(255, 128, 0)\n * - Space-separated: rgb(255 128 0)\n * - Fractional: rgb(128.5, 64.3, 32.1)\n * - Percentages: rgb(50%, 25%, 75%)\n * - Slash alpha notation: rgb(255 128 0 / 0.5)\n *\n * Returns array of RGB values (0-255 range), converting percentages as needed.\n */\nexport function getRgbValuesFromRgbaString(str: string): number[] {\n // Extract content inside rgb()/rgba()\n const match = str.match(/rgba?\\(([^)]+)\\)/i);\n if (!match) return [];\n\n const inner = match[1].trim();\n // Split by slash first (for alpha), then handle color components\n const [colorPart] = inner.split('/');\n // Split by comma or whitespace\n const parts = colorPart\n .trim()\n .split(/[,\\s]+/)\n .filter(Boolean);\n\n return parts.slice(0, 3).map((part) => {\n part = part.trim();\n if (part.endsWith('%')) {\n // Convert percentage to 0-255 range\n return (parseFloat(part) / 100) * 255;\n }\n return parseFloat(part);\n });\n}\n\nexport function hexToRgb(hex) {\n const rgba = hex\n .replace(\n /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i,\n (m, r, g, b) => '#' + r + r + g + g + b + b,\n )\n .substring(1)\n .match(/.{2}/g)\n .map((x, i) => parseInt(x, 16) * (i === 3 ? 1 / 255 : 1));\n\n if (rgba.some((v) => Number.isNaN(v))) {\n return null;\n }\n\n if (rgba.length >= 3) {\n return `rgb(${rgba.slice(0, 3).join(' ')}${rgba.length > 3 ? ` / ${rgba[3]}` : ''})`;\n }\n\n return null;\n}\n\nexport function filterMods(mods, allowedMods) {\n return mods.filter((mod) => allowedMods.includes(mod));\n}\n\nexport function extendStyles(defaultStyles, newStyles) {\n let styles = {};\n\n if (!defaultStyles) {\n if (!newStyles) {\n return styles;\n }\n } else {\n styles = Object.assign({}, defaultStyles);\n }\n\n if (newStyles) {\n Object.keys(newStyles).forEach((key) => {\n if (newStyles[key] != null) {\n styles[key] = newStyles[key];\n }\n });\n }\n\n return styles;\n}\n\n/**\n * Split properties into style and non-style properties.\n * @param props - Component prop map.\n * @param [styleList] - List of all style properties.\n * @param [defaultStyles] - Default style map of the component.\n * @param [propMap] - Props to style alias map.\n * @param [ignoreList] - A list of properties to ignore.\n */\nexport function extractStyles(\n props: Record<string, unknown>,\n styleList: readonly string[] = [],\n defaultStyles?: Styles,\n propMap?: Record<string, string>,\n ignoreList: readonly string[] = [],\n): Styles {\n const styles: Styles = {\n ...defaultStyles,\n ...(ignoreList.includes('styles')\n ? undefined\n : props.styles && typeof props.styles === 'object'\n ? (props.styles as Styles)\n : undefined),\n };\n\n Object.keys(props).forEach((prop) => {\n const propName = propMap ? propMap[prop] || prop : prop;\n const value = props[prop];\n\n if (ignoreList && ignoreList.includes(prop)) {\n // do nothing\n } else if (styleList.includes(propName)) {\n styles[propName] = value as Styles[keyof Styles];\n }\n }, {});\n\n return styles;\n}\n\n// Enhanced regex that includes advanced state patterns\n// Matches: operators, parentheses, @media(...), @(...), @root(...), @own(...), @starting, @predefined,\n// value mods, boolean mods, pseudo-classes, classes, attribute selectors\nconst STATES_REGEXP =\n /([&|!^])|([()])|(@media:[a-z]+)|(@media\\([^)]+\\))|(@root\\([^)]+\\))|(@own\\([^)]+\\))|(@\\([^)]+\\))|(@starting)|(@[A-Za-z][A-Za-z0-9-]*)|([a-z][a-z0-9-]+=(?:\"[^\"]*\"|'[^']*'|[^\\s&|!^()]+))|([a-z][a-z0-9-]+)|(:[a-z][a-z0-9-]+\\([^)]+\\)|:[a-z][a-z0-9-]+)|(\\.[a-z][a-z0-9-]+)|(\\[[^\\]]+])/gi;\n\n/**\n * Check if a token is an advanced state (starts with @)\n */\nexport function isAdvancedStateToken(token: string): boolean {\n return token.startsWith('@') || token.startsWith('!@');\n}\nexport const STATE_OPERATORS = {\n NOT: '!',\n AND: '&',\n OR: '|',\n XOR: '^',\n};\n\nexport const STATE_OPERATOR_LIST = ['!', '&', '|', '^'];\n\n/**\n * Convert state notation tokens to a compute model (string, or nested [op, lhs, rhs]).\n */\nfunction convertTokensToComputeUnits(tokens: unknown[]): unknown {\n if (tokens.length === 1) {\n return tokens[0];\n }\n\n const hasLength = (x: unknown): x is string | unknown[] =>\n typeof x === 'string' || Array.isArray(x);\n\n STATE_OPERATOR_LIST.forEach((operator) => {\n let i;\n\n while ((i = tokens.indexOf(operator)) !== -1) {\n const token = tokens[i];\n\n if (token === '!') {\n const next = tokens[i + 1];\n if (next !== undefined && hasLength(next) && next.length !== 1) {\n tokens.splice(i, 2, ['!', next]);\n } else {\n tokens.splice(i, 1);\n }\n } else {\n const prev = tokens[i - 1];\n const next = tokens[i + 1];\n if (\n prev !== undefined &&\n next !== undefined &&\n hasLength(prev) &&\n hasLength(next) &&\n prev.length !== 1 &&\n next.length !== 1\n ) {\n tokens.splice(i - 1, 3, [token, prev, next]);\n } else {\n tokens.splice(i, 1);\n }\n }\n }\n });\n\n return tokens.length === 1 ? tokens[0] : tokens;\n}\n\n/**\n * Replace commas with | only outside of parentheses.\n * This preserves commas in advanced states like @(card, w < 600px)\n */\nfunction replaceCommasOutsideParens(str: string): string {\n let result = '';\n let depth = 0;\n\n for (const char of str) {\n\n if (char === '(') {\n depth++;\n result += char;\n } else if (char === ')') {\n depth--;\n result += char;\n } else if (char === ',' && depth === 0) {\n // Only replace commas at the top level (outside parentheses)\n result += '|';\n } else {\n result += char;\n }\n }\n\n return result;\n}\n\n/**\n * Parse state notation and return tokens, modifiers and compute model.\n */\nfunction parseStateNotationInner(\n notation: string,\n value: StyleValue | StyleValueStateMap | StyleStateData,\n): StyleStateData {\n const tokens = replaceCommasOutsideParens(notation).match(STATES_REGEXP);\n\n if (!tokens || !tokens.length) {\n return {\n model: undefined,\n mods: [],\n notMods: [],\n tokens: [],\n value,\n };\n } else if (tokens.length === 1) {\n return {\n model: tokens[0],\n mods: tokens.slice(0),\n notMods: [],\n tokens,\n value,\n };\n }\n\n const mods: string[] = [];\n\n const operations: unknown[][] = [[]];\n let list = operations[0];\n let position = 0;\n let operation: unknown[];\n\n tokens.forEach((token) => {\n switch (token) {\n case '(':\n operation = [];\n position++;\n list = operations[position] = operation;\n break;\n case ')':\n position--;\n operations[position].push(\n convertTokensToComputeUnits(list as unknown[]),\n );\n list = operations[position];\n break;\n default:\n if (token.length > 1) {\n if (!mods.includes(token)) {\n mods.push(token);\n }\n }\n list.push(token);\n }\n });\n\n while (position) {\n position--;\n operations[position].push(\n convertTokensToComputeUnits(list as unknown[]),\n );\n list = operations[position];\n }\n\n return {\n tokens,\n mods,\n notMods: [],\n model: convertTokensToComputeUnits(\n operations[0] as unknown[],\n ) as ComputeModel | undefined,\n value,\n };\n}\n\nexport const parseStateNotation = cacheWrapper(parseStateNotationInner);\n\n/**\n * Build an AtRuleContext from parsed advanced states\n */\nexport function buildAtRuleContext(\n advancedStates: ParsedAdvancedState[],\n negatedStates: Set<string>,\n): AtRuleContext | undefined {\n if (advancedStates.length === 0) return undefined;\n\n const ctx: AtRuleContext = {};\n\n for (const state of advancedStates) {\n const isNegated = negatedStates.has(state.raw);\n\n switch (state.type) {\n case 'media': {\n if (!ctx.media) ctx.media = [];\n let mediaCondition = '';\n\n if (state.mediaType) {\n // @media:print, @media:screen, etc.\n mediaCondition = state.mediaType;\n } else if (state.condition) {\n // @media(width < 920px)\n mediaCondition = `(${state.condition})`;\n }\n\n if (mediaCondition) {\n if (isNegated) {\n ctx.media.push(`not ${mediaCondition}`);\n } else {\n ctx.media.push(mediaCondition);\n }\n }\n break;\n }\n\n case 'container': {\n if (!ctx.container) ctx.container = [];\n let condition = state.condition;\n if (isNegated) {\n condition = `not (${condition})`;\n }\n ctx.container.push({\n name: state.containerName,\n condition,\n });\n break;\n }\n\n case 'root': {\n if (!ctx.rootStates) ctx.rootStates = [];\n // Parse the condition to generate the proper selector\n const rootSelector = buildRootSelector(state.condition, isNegated);\n ctx.rootStates.push(rootSelector);\n break;\n }\n\n case 'starting': {\n if (!isNegated) {\n ctx.startingStyle = true;\n }\n break;\n }\n\n // 'own' and 'predefined' are handled differently (selector-based, not at-rule)\n // 'modifier' is a regular state\n }\n }\n\n // Return undefined if no at-rules were added\n if (\n !ctx.media?.length &&\n !ctx.container?.length &&\n !ctx.rootStates?.length &&\n !ctx.startingStyle\n ) {\n return undefined;\n }\n\n return ctx;\n}\n\n/**\n * Build a root state selector from a condition\n */\nfunction buildRootSelector(condition: string, isNegated: boolean): string {\n // Handle different condition formats:\n // - theme=dark -> [data-theme=\"dark\"]\n // - .className -> .className\n // - [attr] -> [attr]\n // - booleanMod -> [data-boolean-mod]\n\n let selector: string;\n\n if (condition.startsWith('.')) {\n // Class selector\n selector = condition;\n } else if (condition.startsWith('[')) {\n // Attribute selector\n selector = condition;\n } else if (condition.includes('=')) {\n // Value mod: theme=dark -> [data-theme=\"dark\"]\n const [key, value] = condition.split('=');\n selector = `[data-${camelToKebab(key.trim())}=\"${value.trim()}\"]`;\n } else {\n // Boolean mod: camelCase -> [data-camel-case]\n selector = `[data-${camelToKebab(condition)}]`;\n }\n\n if (isNegated) {\n return `:not(${selector})`;\n }\n return selector;\n}\n\n/**\n * Parse state notation and return tokens, modifiers and compute model.\n * Enhanced to detect and extract advanced states.\n */\nexport function styleStateMapToStyleStateDataList(\n styleStateMap: StyleStateMap | StyleValue | StyleValueStateMap,\n parserContext?: StateParserContext,\n): { states: StyleStateDataList; mods: string[]; hasAdvancedStates: boolean } {\n if (typeof styleStateMap !== 'object' || !styleStateMap) {\n return {\n states: [\n {\n model: undefined,\n mods: [],\n notMods: [],\n value: styleStateMap,\n },\n ],\n mods: [],\n hasAdvancedStates: false,\n };\n }\n\n const stateDataList: StyleStateDataList = [];\n let hasAdvancedStates = false;\n\n Object.keys(styleStateMap).forEach((stateNotation) => {\n const state = parseStateNotation(\n stateNotation,\n styleStateMap[stateNotation],\n );\n\n // Check if this state contains any advanced states\n const advancedStates: ParsedAdvancedState[] = [];\n const negatedAdvancedStates = new Set<string>();\n const regularMods: string[] = [];\n const ownMods: string[] = [];\n const negatedOwnMods: string[] = [];\n\n // Scan tokens for advanced states\n if (state.tokens) {\n let isNegated = false;\n for (const token of state.tokens) {\n if (token === '!') {\n isNegated = true;\n continue;\n }\n\n if (isAdvancedStateToken(token)) {\n hasAdvancedStates = true;\n const ctx = parserContext || createStateParserContext(undefined);\n const parsed = parseAdvancedState(token, ctx);\n advancedStates.push(parsed);\n\n // Handle @own states specially - extract condition as ownMod\n if (parsed.type === 'own' && parsed.condition) {\n if (isNegated) {\n negatedOwnMods.push(parsed.condition);\n } else {\n ownMods.push(parsed.condition);\n }\n } else if (isNegated) {\n negatedAdvancedStates.add(token);\n }\n isNegated = false;\n } else if (\n token.length > 1 &&\n !['&', '|', '^', '(', ')'].includes(token)\n ) {\n regularMods.push(token);\n isNegated = false;\n } else {\n isNegated = false;\n }\n }\n }\n\n // If there are advanced states, build the atRuleContext\n if (advancedStates.length > 0) {\n state.advancedStates = advancedStates;\n state.atRuleContext = buildAtRuleContext(\n advancedStates,\n negatedAdvancedStates,\n );\n // Filter mods to only include regular mods (not advanced states)\n state.mods = regularMods;\n }\n\n // Store own mods for sub-element selector generation\n if (ownMods.length > 0) {\n state.ownMods = ownMods;\n }\n if (negatedOwnMods.length > 0) {\n state.negatedOwnMods = negatedOwnMods;\n }\n\n stateDataList.push(state);\n });\n\n stateDataList.reverse();\n\n let initialState;\n\n const allMods: string[] = stateDataList.reduce((all: string[], state) => {\n if (!state.mods.length && !state.advancedStates?.length) {\n initialState = state;\n } else {\n state.mods.forEach((mod) => {\n if (!all.includes(mod)) {\n all.push(mod);\n }\n });\n }\n\n return all;\n }, []);\n\n if (!initialState) {\n stateDataList.push({\n mods: [],\n notMods: allMods,\n value: true,\n });\n }\n\n return { states: stateDataList, mods: allMods, hasAdvancedStates };\n}\n\nexport const COMPUTE_FUNC_MAP = {\n '!': (a) => !a, // NOT - boolean negation\n '^': (a, b) => (a && !b) || (!a && b), // XOR - true when exactly one is true\n '|': (a, b) => a || b, // OR - logical OR\n '&': (a, b) => a && b, // AND - logical AND\n};\n\n/**\n * Compute a result based on a model and incoming map.\n */\nexport function computeState(\n computeModel: ComputeModel,\n valueMap: (number | boolean)[] | Record<string, boolean> | ((...args: unknown[]) => unknown),\n) {\n if (!computeModel) return true;\n\n if (!Array.isArray(computeModel)) {\n if (typeof valueMap === 'function') {\n return !!valueMap(computeModel);\n } else {\n return !!valueMap[computeModel];\n }\n }\n\n const func = COMPUTE_FUNC_MAP[computeModel[0]];\n\n if (!func) {\n console.warn(\n 'CubeUIKit: unexpected compute method in the model',\n computeModel,\n );\n // return false;\n }\n\n let a = computeModel[1];\n\n if (typeof a === 'object') {\n a = !!computeState(a, valueMap);\n } else if (typeof valueMap === 'function') {\n a = !!valueMap(a);\n } else {\n a = !!valueMap[a];\n }\n\n if (computeModel.length === 2) {\n return func(a);\n }\n\n let b = computeModel[2];\n\n if (typeof b === 'object') {\n b = !!computeState(b, valueMap);\n } else if (typeof valueMap === 'function') {\n b = !!valueMap(b);\n } else {\n b = !!valueMap[b];\n }\n\n return !!func(a, b);\n}\n\nconst _innerCache = new WeakMap();\n\nexport function stringifyStyles(styles: unknown): string {\n if (styles == null || typeof styles !== 'object') return '';\n const keys = Object.keys(styles).sort();\n const parts: string[] = [];\n for (const k of keys) {\n const v = styles[k];\n if (v === undefined || typeof v === 'function' || typeof v === 'symbol')\n continue;\n\n const c0 = k.charCodeAt(0);\n const needsInnerSort =\n ((c0 >= 65 && c0 <= 90) || c0 === 38) &&\n v &&\n typeof v === 'object' &&\n !Array.isArray(v);\n\n let sv: string;\n if (needsInnerSort) {\n sv = _innerCache.get(v);\n if (sv === undefined) {\n const innerKeys = Object.keys(v).sort();\n const innerParts: string[] = [];\n for (const ik of innerKeys) {\n const ivs = JSON.stringify(v[ik]);\n if (ivs !== undefined)\n innerParts.push(JSON.stringify(ik) + ':' + ivs);\n }\n sv = '{' + innerParts.join(',') + '}';\n _innerCache.set(v, sv);\n }\n } else {\n sv = JSON.stringify(v);\n }\n parts.push(JSON.stringify(k) + ':' + sv);\n }\n return '{' + parts.join(',') + '}';\n}\n"],"mappings":"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"}