@tenphi/tasty 0.0.0-snapshot.08a6610

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 (288) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +666 -0
  3. package/dist/_virtual/_rolldown/runtime.js +8 -0
  4. package/dist/chunks/cacheKey.js +70 -0
  5. package/dist/chunks/cacheKey.js.map +1 -0
  6. package/dist/chunks/definitions.d.ts +37 -0
  7. package/dist/chunks/definitions.js +259 -0
  8. package/dist/chunks/definitions.js.map +1 -0
  9. package/dist/chunks/renderChunk.js +61 -0
  10. package/dist/chunks/renderChunk.js.map +1 -0
  11. package/dist/config.d.ts +311 -0
  12. package/dist/config.js +458 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/core/index.d.ts +32 -0
  15. package/dist/core/index.js +26 -0
  16. package/dist/debug.d.ts +204 -0
  17. package/dist/debug.js +733 -0
  18. package/dist/debug.js.map +1 -0
  19. package/dist/hooks/useGlobalStyles.d.ts +30 -0
  20. package/dist/hooks/useGlobalStyles.js +83 -0
  21. package/dist/hooks/useGlobalStyles.js.map +1 -0
  22. package/dist/hooks/useKeyframes.d.ts +56 -0
  23. package/dist/hooks/useKeyframes.js +69 -0
  24. package/dist/hooks/useKeyframes.js.map +1 -0
  25. package/dist/hooks/useProperty.d.ts +79 -0
  26. package/dist/hooks/useProperty.js +114 -0
  27. package/dist/hooks/useProperty.js.map +1 -0
  28. package/dist/hooks/useRawCSS.d.ts +53 -0
  29. package/dist/hooks/useRawCSS.js +40 -0
  30. package/dist/hooks/useRawCSS.js.map +1 -0
  31. package/dist/hooks/useStyles.d.ts +45 -0
  32. package/dist/hooks/useStyles.js +248 -0
  33. package/dist/hooks/useStyles.js.map +1 -0
  34. package/dist/index.d.ts +47 -0
  35. package/dist/index.js +33 -0
  36. package/dist/injector/index.d.ts +165 -0
  37. package/dist/injector/index.js +162 -0
  38. package/dist/injector/index.js.map +1 -0
  39. package/dist/injector/injector.d.ts +148 -0
  40. package/dist/injector/injector.js +430 -0
  41. package/dist/injector/injector.js.map +1 -0
  42. package/dist/injector/sheet-manager.d.ts +136 -0
  43. package/dist/injector/sheet-manager.js +729 -0
  44. package/dist/injector/sheet-manager.js.map +1 -0
  45. package/dist/injector/types.d.ts +144 -0
  46. package/dist/keyframes/index.js +206 -0
  47. package/dist/keyframes/index.js.map +1 -0
  48. package/dist/parser/classify.js +319 -0
  49. package/dist/parser/classify.js.map +1 -0
  50. package/dist/parser/const.js +33 -0
  51. package/dist/parser/const.js.map +1 -0
  52. package/dist/parser/lru.js +109 -0
  53. package/dist/parser/lru.js.map +1 -0
  54. package/dist/parser/parser.d.ts +25 -0
  55. package/dist/parser/parser.js +116 -0
  56. package/dist/parser/parser.js.map +1 -0
  57. package/dist/parser/tokenizer.js +69 -0
  58. package/dist/parser/tokenizer.js.map +1 -0
  59. package/dist/parser/types.d.ts +51 -0
  60. package/dist/parser/types.js +46 -0
  61. package/dist/parser/types.js.map +1 -0
  62. package/dist/pipeline/conditions.d.ts +134 -0
  63. package/dist/pipeline/conditions.js +406 -0
  64. package/dist/pipeline/conditions.js.map +1 -0
  65. package/dist/pipeline/exclusive.js +231 -0
  66. package/dist/pipeline/exclusive.js.map +1 -0
  67. package/dist/pipeline/index.d.ts +53 -0
  68. package/dist/pipeline/index.js +660 -0
  69. package/dist/pipeline/index.js.map +1 -0
  70. package/dist/pipeline/materialize.js +856 -0
  71. package/dist/pipeline/materialize.js.map +1 -0
  72. package/dist/pipeline/parseStateKey.d.ts +15 -0
  73. package/dist/pipeline/parseStateKey.js +451 -0
  74. package/dist/pipeline/parseStateKey.js.map +1 -0
  75. package/dist/pipeline/simplify.js +516 -0
  76. package/dist/pipeline/simplify.js.map +1 -0
  77. package/dist/pipeline/warnings.js +18 -0
  78. package/dist/pipeline/warnings.js.map +1 -0
  79. package/dist/plugins/okhsl-plugin.d.ts +35 -0
  80. package/dist/plugins/okhsl-plugin.js +371 -0
  81. package/dist/plugins/okhsl-plugin.js.map +1 -0
  82. package/dist/plugins/types.d.ts +76 -0
  83. package/dist/properties/index.js +236 -0
  84. package/dist/properties/index.js.map +1 -0
  85. package/dist/properties/property-type-resolver.d.ts +24 -0
  86. package/dist/properties/property-type-resolver.js +91 -0
  87. package/dist/properties/property-type-resolver.js.map +1 -0
  88. package/dist/ssr/astro.d.ts +29 -0
  89. package/dist/ssr/astro.js +65 -0
  90. package/dist/ssr/astro.js.map +1 -0
  91. package/dist/ssr/async-storage.d.ts +17 -0
  92. package/dist/ssr/async-storage.js +35 -0
  93. package/dist/ssr/async-storage.js.map +1 -0
  94. package/dist/ssr/collect-auto-properties.js +40 -0
  95. package/dist/ssr/collect-auto-properties.js.map +1 -0
  96. package/dist/ssr/collector.d.ts +85 -0
  97. package/dist/ssr/collector.js +183 -0
  98. package/dist/ssr/collector.js.map +1 -0
  99. package/dist/ssr/context.d.ts +8 -0
  100. package/dist/ssr/context.js +14 -0
  101. package/dist/ssr/context.js.map +1 -0
  102. package/dist/ssr/format-global-rules.js +22 -0
  103. package/dist/ssr/format-global-rules.js.map +1 -0
  104. package/dist/ssr/format-keyframes.js +70 -0
  105. package/dist/ssr/format-keyframes.js.map +1 -0
  106. package/dist/ssr/format-property.js +48 -0
  107. package/dist/ssr/format-property.js.map +1 -0
  108. package/dist/ssr/format-rules.js +70 -0
  109. package/dist/ssr/format-rules.js.map +1 -0
  110. package/dist/ssr/hydrate.d.ts +22 -0
  111. package/dist/ssr/hydrate.js +50 -0
  112. package/dist/ssr/hydrate.js.map +1 -0
  113. package/dist/ssr/index.d.ts +5 -0
  114. package/dist/ssr/index.js +12 -0
  115. package/dist/ssr/index.js.map +1 -0
  116. package/dist/ssr/next.d.ts +45 -0
  117. package/dist/ssr/next.js +71 -0
  118. package/dist/ssr/next.js.map +1 -0
  119. package/dist/ssr/ssr-collector-ref.js +12 -0
  120. package/dist/ssr/ssr-collector-ref.js.map +1 -0
  121. package/dist/states/index.d.ts +49 -0
  122. package/dist/states/index.js +416 -0
  123. package/dist/states/index.js.map +1 -0
  124. package/dist/static/index.d.ts +5 -0
  125. package/dist/static/index.js +5 -0
  126. package/dist/static/tastyStatic.d.ts +46 -0
  127. package/dist/static/tastyStatic.js +31 -0
  128. package/dist/static/tastyStatic.js.map +1 -0
  129. package/dist/static/types.d.ts +49 -0
  130. package/dist/static/types.js +24 -0
  131. package/dist/static/types.js.map +1 -0
  132. package/dist/styles/align.d.ts +15 -0
  133. package/dist/styles/align.js +14 -0
  134. package/dist/styles/align.js.map +1 -0
  135. package/dist/styles/border.d.ts +25 -0
  136. package/dist/styles/border.js +114 -0
  137. package/dist/styles/border.js.map +1 -0
  138. package/dist/styles/color.d.ts +14 -0
  139. package/dist/styles/color.js +23 -0
  140. package/dist/styles/color.js.map +1 -0
  141. package/dist/styles/createStyle.js +77 -0
  142. package/dist/styles/createStyle.js.map +1 -0
  143. package/dist/styles/dimension.js +97 -0
  144. package/dist/styles/dimension.js.map +1 -0
  145. package/dist/styles/display.d.ts +37 -0
  146. package/dist/styles/display.js +67 -0
  147. package/dist/styles/display.js.map +1 -0
  148. package/dist/styles/fade.d.ts +15 -0
  149. package/dist/styles/fade.js +58 -0
  150. package/dist/styles/fade.js.map +1 -0
  151. package/dist/styles/fill.d.ts +42 -0
  152. package/dist/styles/fill.js +52 -0
  153. package/dist/styles/fill.js.map +1 -0
  154. package/dist/styles/flow.d.ts +16 -0
  155. package/dist/styles/flow.js +12 -0
  156. package/dist/styles/flow.js.map +1 -0
  157. package/dist/styles/gap.d.ts +31 -0
  158. package/dist/styles/gap.js +37 -0
  159. package/dist/styles/gap.js.map +1 -0
  160. package/dist/styles/height.d.ts +17 -0
  161. package/dist/styles/height.js +20 -0
  162. package/dist/styles/height.js.map +1 -0
  163. package/dist/styles/index.d.ts +2 -0
  164. package/dist/styles/index.js +9 -0
  165. package/dist/styles/index.js.map +1 -0
  166. package/dist/styles/inset.d.ts +52 -0
  167. package/dist/styles/inset.js +150 -0
  168. package/dist/styles/inset.js.map +1 -0
  169. package/dist/styles/justify.d.ts +15 -0
  170. package/dist/styles/justify.js +14 -0
  171. package/dist/styles/justify.js.map +1 -0
  172. package/dist/styles/list.d.ts +16 -0
  173. package/dist/styles/list.js +98 -0
  174. package/dist/styles/list.js.map +1 -0
  175. package/dist/styles/margin.d.ts +24 -0
  176. package/dist/styles/margin.js +104 -0
  177. package/dist/styles/margin.js.map +1 -0
  178. package/dist/styles/outline.d.ts +29 -0
  179. package/dist/styles/outline.js +65 -0
  180. package/dist/styles/outline.js.map +1 -0
  181. package/dist/styles/padding.d.ts +24 -0
  182. package/dist/styles/padding.js +104 -0
  183. package/dist/styles/padding.js.map +1 -0
  184. package/dist/styles/predefined.d.ts +71 -0
  185. package/dist/styles/predefined.js +238 -0
  186. package/dist/styles/predefined.js.map +1 -0
  187. package/dist/styles/preset.d.ts +47 -0
  188. package/dist/styles/preset.js +126 -0
  189. package/dist/styles/preset.js.map +1 -0
  190. package/dist/styles/radius.d.ts +14 -0
  191. package/dist/styles/radius.js +51 -0
  192. package/dist/styles/radius.js.map +1 -0
  193. package/dist/styles/scrollbar.d.ts +25 -0
  194. package/dist/styles/scrollbar.js +48 -0
  195. package/dist/styles/scrollbar.js.map +1 -0
  196. package/dist/styles/shadow.d.ts +14 -0
  197. package/dist/styles/shadow.js +24 -0
  198. package/dist/styles/shadow.js.map +1 -0
  199. package/dist/styles/transition.d.ts +14 -0
  200. package/dist/styles/transition.js +158 -0
  201. package/dist/styles/transition.js.map +1 -0
  202. package/dist/styles/types.d.ts +508 -0
  203. package/dist/styles/width.d.ts +17 -0
  204. package/dist/styles/width.js +20 -0
  205. package/dist/styles/width.js.map +1 -0
  206. package/dist/tasty.d.ts +981 -0
  207. package/dist/tasty.js +206 -0
  208. package/dist/tasty.js.map +1 -0
  209. package/dist/types.d.ts +184 -0
  210. package/dist/utils/cache-wrapper.js +26 -0
  211. package/dist/utils/cache-wrapper.js.map +1 -0
  212. package/dist/utils/case-converter.js +8 -0
  213. package/dist/utils/case-converter.js.map +1 -0
  214. package/dist/utils/colors.d.ts +5 -0
  215. package/dist/utils/colors.js +9 -0
  216. package/dist/utils/colors.js.map +1 -0
  217. package/dist/utils/css-types.d.ts +7 -0
  218. package/dist/utils/dotize.d.ts +26 -0
  219. package/dist/utils/dotize.js +122 -0
  220. package/dist/utils/dotize.js.map +1 -0
  221. package/dist/utils/filter-base-props.d.ts +15 -0
  222. package/dist/utils/filter-base-props.js +45 -0
  223. package/dist/utils/filter-base-props.js.map +1 -0
  224. package/dist/utils/get-display-name.d.ts +7 -0
  225. package/dist/utils/get-display-name.js +10 -0
  226. package/dist/utils/get-display-name.js.map +1 -0
  227. package/dist/utils/hsl-to-rgb.js +38 -0
  228. package/dist/utils/hsl-to-rgb.js.map +1 -0
  229. package/dist/utils/is-dev-env.js +19 -0
  230. package/dist/utils/is-dev-env.js.map +1 -0
  231. package/dist/utils/is-valid-element-type.js +15 -0
  232. package/dist/utils/is-valid-element-type.js.map +1 -0
  233. package/dist/utils/merge-styles.d.ts +7 -0
  234. package/dist/utils/merge-styles.js +146 -0
  235. package/dist/utils/merge-styles.js.map +1 -0
  236. package/dist/utils/mod-attrs.d.ts +8 -0
  237. package/dist/utils/mod-attrs.js +21 -0
  238. package/dist/utils/mod-attrs.js.map +1 -0
  239. package/dist/utils/okhsl-to-rgb.js +296 -0
  240. package/dist/utils/okhsl-to-rgb.js.map +1 -0
  241. package/dist/utils/process-tokens.d.ts +31 -0
  242. package/dist/utils/process-tokens.js +171 -0
  243. package/dist/utils/process-tokens.js.map +1 -0
  244. package/dist/utils/resolve-recipes.d.ts +17 -0
  245. package/dist/utils/resolve-recipes.js +147 -0
  246. package/dist/utils/resolve-recipes.js.map +1 -0
  247. package/dist/utils/selector-transform.js +32 -0
  248. package/dist/utils/selector-transform.js.map +1 -0
  249. package/dist/utils/string.js +8 -0
  250. package/dist/utils/string.js.map +1 -0
  251. package/dist/utils/styles.d.ts +177 -0
  252. package/dist/utils/styles.js +730 -0
  253. package/dist/utils/styles.js.map +1 -0
  254. package/dist/utils/typography.d.ts +47 -0
  255. package/dist/utils/typography.js +43 -0
  256. package/dist/utils/typography.js.map +1 -0
  257. package/dist/utils/warnings.d.ts +16 -0
  258. package/dist/utils/warnings.js +16 -0
  259. package/dist/utils/warnings.js.map +1 -0
  260. package/dist/zero/babel.d.ts +147 -0
  261. package/dist/zero/babel.js +331 -0
  262. package/dist/zero/babel.js.map +1 -0
  263. package/dist/zero/css-writer.d.ts +45 -0
  264. package/dist/zero/css-writer.js +74 -0
  265. package/dist/zero/css-writer.js.map +1 -0
  266. package/dist/zero/extractor.d.ts +24 -0
  267. package/dist/zero/extractor.js +215 -0
  268. package/dist/zero/extractor.js.map +1 -0
  269. package/dist/zero/index.d.ts +3 -0
  270. package/dist/zero/index.js +4 -0
  271. package/dist/zero/next.d.ts +74 -0
  272. package/dist/zero/next.js +129 -0
  273. package/dist/zero/next.js.map +1 -0
  274. package/docs/adoption.md +286 -0
  275. package/docs/comparison.md +413 -0
  276. package/docs/configuration.md +242 -0
  277. package/docs/debug.md +505 -0
  278. package/docs/design-system.md +401 -0
  279. package/docs/dsl.md +540 -0
  280. package/docs/getting-started.md +201 -0
  281. package/docs/injector.md +528 -0
  282. package/docs/methodology.md +501 -0
  283. package/docs/runtime.md +291 -0
  284. package/docs/ssr.md +382 -0
  285. package/docs/styles.md +574 -0
  286. package/docs/tasty-static.md +421 -0
  287. package/package.json +209 -0
  288. package/tasty.config.ts +14 -0
@@ -0,0 +1,122 @@
1
+ //#region src/utils/dotize.ts
2
+ const dotize = {
3
+ valTypes: {
4
+ none: "NONE",
5
+ primitive: "PRIM",
6
+ object: "OBJECT",
7
+ array: "ARRAY"
8
+ },
9
+ getValType: function(val) {
10
+ if (!val || typeof val != "object" || Array.isArray(val)) return dotize.valTypes.primitive;
11
+ if (typeof val == "object") return dotize.valTypes.object;
12
+ },
13
+ getPathType: function(arrPath) {
14
+ const arrPathTypes = [];
15
+ for (const path in arrPath) {
16
+ const pathVal = arrPath[path];
17
+ if (!pathVal) arrPathTypes.push(dotize.valTypes.none);
18
+ else if (dotize.isNumber(pathVal)) arrPathTypes.push(dotize.valTypes.array);
19
+ else arrPathTypes.push(dotize.valTypes.object);
20
+ }
21
+ return arrPathTypes;
22
+ },
23
+ isUndefined: function(obj) {
24
+ return typeof obj == "undefined";
25
+ },
26
+ isNumber: function(f) {
27
+ return !isNaN(parseInt(f));
28
+ },
29
+ isEmptyObj: function(obj) {
30
+ for (const prop in obj) if (Object.hasOwnProperty.call(obj, prop)) return false;
31
+ return JSON.stringify(obj) === JSON.stringify({});
32
+ },
33
+ isPlainObject: function(obj) {
34
+ if (typeof obj !== "object" || obj === null) return false;
35
+ return Object.getPrototypeOf(obj) === Object.prototype;
36
+ },
37
+ isNotObject: function(obj) {
38
+ return !obj || !this.isPlainObject(obj);
39
+ },
40
+ isEmptyArray: function(arr) {
41
+ return Array.isArray(arr) && arr.length == 0;
42
+ },
43
+ isNotArray: function(arr) {
44
+ return Array.isArray(arr) == false;
45
+ },
46
+ removeEmptyArrayItem: function(arr) {
47
+ return arr.filter(function(el) {
48
+ return el != null && el != "";
49
+ });
50
+ },
51
+ getFieldName: function(field, prefix, isRoot, isArrayItem, isArray) {
52
+ if (isArray) return (prefix ? prefix : "") + (dotize.isNumber(field) ? "[" + field + "]" : (isRoot && !prefix ? "" : ".") + field);
53
+ else if (isArrayItem) return (prefix ? prefix : "") + "[" + field + "]";
54
+ else return (prefix ? prefix + "." : "") + field;
55
+ },
56
+ startsWith: function(val, valToSearch) {
57
+ return val.indexOf(valToSearch) == 0;
58
+ },
59
+ convert: function(obj, prefix = "") {
60
+ let newObj = {};
61
+ if (dotize.isNotObject(obj)) if (prefix) {
62
+ newObj[prefix] = obj;
63
+ return newObj;
64
+ } else return obj;
65
+ return (function recurse(o, p, isRoot) {
66
+ const isArrayItem = Array.isArray(o);
67
+ for (const f in o) {
68
+ const currentProp = o[f];
69
+ if (currentProp && typeof currentProp === "object" && !Array.isArray(currentProp) && dotize.isPlainObject(currentProp)) {
70
+ if (isArrayItem && dotize.isEmptyObj(currentProp) == false) newObj = recurse(currentProp, dotize.getFieldName(f, p, isRoot, true));
71
+ else if (dotize.isEmptyObj(currentProp) == false) newObj = recurse(currentProp, dotize.getFieldName(f, p, isRoot));
72
+ else if (dotize.isEmptyObj(currentProp)) newObj[dotize.getFieldName(f, p, isRoot, isArrayItem)] = currentProp;
73
+ } else if (isArrayItem || dotize.isNumber(f)) newObj[dotize.getFieldName(f, p, isRoot, true)] = currentProp;
74
+ else newObj[dotize.getFieldName(f, p, isRoot)] = currentProp;
75
+ }
76
+ return newObj;
77
+ })(obj, prefix, true);
78
+ },
79
+ backward: function(obj, prefix) {
80
+ let newObj = {};
81
+ const arStartRegex = /\[(\d+)\]/g;
82
+ if (dotize.isNotObject(obj) && dotize.isNotArray(obj)) if (prefix) return obj[prefix];
83
+ else return obj;
84
+ for (let tProp in obj) {
85
+ const tPropVal = obj[tProp];
86
+ if (prefix) {
87
+ const prefixRegex = new RegExp("^" + prefix);
88
+ tProp = tProp.replace(prefixRegex, "");
89
+ }
90
+ tProp = tProp.replace(arStartRegex, ".$1");
91
+ if (dotize.startsWith(tProp, ".")) tProp = tProp.replace(/^\./, "");
92
+ const arrPath = tProp.split(".");
93
+ const arrPathTypes = dotize.getPathType(arrPath);
94
+ if (!dotize.isUndefined(arrPathTypes) && arrPathTypes[0] == dotize.valTypes.array && Array.isArray(newObj) == false) newObj = [];
95
+ (function recurse(rPropVal, rObj, rPropValPrev, rObjPrev) {
96
+ let currentPath = arrPath.shift();
97
+ const currentPathType = arrPathTypes.shift();
98
+ if (typeof currentPath == "undefined" || currentPath == "") {
99
+ newObj = rPropVal;
100
+ return;
101
+ }
102
+ const isArray = currentPathType == dotize.valTypes.array;
103
+ if (dotize.isNumber(currentPath)) currentPath = parseInt(currentPath);
104
+ if (arrPath.length > 0) {
105
+ if (typeof rObj[currentPath] == "undefined") if (isArray) rObj[currentPath] = [];
106
+ else rObj[currentPath] = {};
107
+ recurse(rPropVal, rObj[currentPath], currentPath, rObj);
108
+ return;
109
+ }
110
+ if (currentPathType == dotize.valTypes.array && rPropValPrev && rObjPrev) {
111
+ if (Array.isArray(rObjPrev[rPropValPrev]) == false) rObjPrev[rPropValPrev] = [];
112
+ rObjPrev[rPropValPrev].push(rPropVal);
113
+ } else rObj[currentPath] = rPropVal;
114
+ })(tPropVal, newObj);
115
+ }
116
+ return newObj;
117
+ }
118
+ };
119
+
120
+ //#endregion
121
+ export { dotize };
122
+ //# sourceMappingURL=dotize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dotize.js","names":[],"sources":["../../src/utils/dotize.ts"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\n// Convert complex js object to dot notation js object\n// url: https://github.com/vardars/dotize\n// author: vardars\n\nexport const dotize = {\n valTypes: {\n none: 'NONE',\n primitive: 'PRIM',\n object: 'OBJECT',\n array: 'ARRAY',\n },\n\n getValType: function (val) {\n if (!val || typeof val != 'object' || Array.isArray(val))\n return dotize.valTypes.primitive;\n if (typeof val == 'object') return dotize.valTypes.object;\n },\n\n getPathType: function (arrPath) {\n const arrPathTypes = [];\n for (const path in arrPath) {\n const pathVal = arrPath[path];\n if (!pathVal) arrPathTypes.push(dotize.valTypes.none);\n else if (dotize.isNumber(pathVal))\n arrPathTypes.push(dotize.valTypes.array);\n else arrPathTypes.push(dotize.valTypes.object);\n }\n return arrPathTypes;\n },\n\n isUndefined: function (obj) {\n return typeof obj == 'undefined';\n },\n\n isNumber: function (f) {\n return !isNaN(parseInt(f));\n },\n\n isEmptyObj: function (obj) {\n for (const prop in obj) {\n if (Object.hasOwnProperty.call(obj, prop)) return false;\n }\n\n return JSON.stringify(obj) === JSON.stringify({});\n },\n\n isPlainObject: function (obj) {\n if (typeof obj !== 'object' || obj === null) return false;\n\n return Object.getPrototypeOf(obj) === Object.prototype;\n },\n\n isNotObject: function (obj) {\n return !obj || !this.isPlainObject(obj);\n },\n\n isEmptyArray: function (arr) {\n return Array.isArray(arr) && arr.length == 0;\n },\n\n isNotArray: function (arr) {\n return Array.isArray(arr) == false;\n },\n\n removeEmptyArrayItem: function (arr) {\n return arr.filter(function (el) {\n return el != null && el != '';\n });\n },\n\n getFieldName: function (field, prefix, isRoot, isArrayItem, isArray) {\n if (isArray)\n return (\n (prefix ? prefix : '') +\n (dotize.isNumber(field)\n ? '[' + field + ']'\n : (isRoot && !prefix ? '' : '.') + field)\n );\n else if (isArrayItem) return (prefix ? prefix : '') + '[' + field + ']';\n else return (prefix ? prefix + '.' : '') + field;\n },\n\n startsWith: function (val, valToSearch) {\n return val.indexOf(valToSearch) == 0;\n },\n\n convert: function (obj, prefix = '') {\n let newObj = {};\n\n // primitives\n if (dotize.isNotObject(obj)) {\n if (prefix) {\n newObj[prefix] = obj;\n return newObj;\n } else {\n return obj;\n }\n }\n\n return (function recurse(o, p, isRoot) {\n const isArrayItem = Array.isArray(o);\n for (const f in o) {\n const currentProp = o[f];\n if (\n currentProp &&\n typeof currentProp === 'object' &&\n !Array.isArray(currentProp) &&\n dotize.isPlainObject(currentProp)\n ) {\n if (isArrayItem && dotize.isEmptyObj(currentProp) == false) {\n newObj = recurse(\n currentProp,\n dotize.getFieldName(f, p, isRoot, true),\n ); // array item object\n } else if (dotize.isEmptyObj(currentProp) == false) {\n newObj = recurse(currentProp, dotize.getFieldName(f, p, isRoot)); // object\n } else if (dotize.isEmptyObj(currentProp)) {\n newObj[dotize.getFieldName(f, p, isRoot, isArrayItem)] =\n currentProp;\n }\n } else {\n if (isArrayItem || dotize.isNumber(f)) {\n newObj[dotize.getFieldName(f, p, isRoot, true)] = currentProp; // array item primitive\n } else {\n newObj[dotize.getFieldName(f, p, isRoot)] = currentProp; // primitive\n }\n }\n }\n\n return newObj;\n })(obj, prefix, true);\n },\n\n backward: function (obj, prefix) {\n let newObj = {};\n const arStartRegex = /\\[(\\d+)\\]/g;\n\n // primitives\n if (dotize.isNotObject(obj) && dotize.isNotArray(obj)) {\n if (prefix) {\n return obj[prefix];\n } else {\n return obj;\n }\n }\n\n for (let tProp in obj) {\n const tPropVal = obj[tProp];\n\n if (prefix) {\n const prefixRegex = new RegExp('^' + prefix);\n tProp = tProp.replace(prefixRegex, '');\n }\n\n tProp = tProp.replace(arStartRegex, '.$1');\n\n if (dotize.startsWith(tProp, '.')) tProp = tProp.replace(/^\\./, '');\n\n const arrPath = tProp.split('.');\n const arrPathTypes = dotize.getPathType(arrPath);\n\n // has array on root\n if (\n !dotize.isUndefined(arrPathTypes) &&\n arrPathTypes[0] == dotize.valTypes.array &&\n Array.isArray(newObj) == false\n ) {\n newObj = [];\n }\n\n (function recurse(rPropVal, rObj, rPropValPrev, rObjPrev) {\n let currentPath = arrPath.shift();\n const currentPathType = arrPathTypes.shift();\n\n if (typeof currentPath == 'undefined' || currentPath == '') {\n newObj = rPropVal;\n return;\n }\n\n const isArray = currentPathType == dotize.valTypes.array;\n\n if (dotize.isNumber(currentPath)) currentPath = parseInt(currentPath);\n\n // has multiple levels\n if (arrPath.length > 0) {\n // is not assigned before\n if (typeof rObj[currentPath] == 'undefined') {\n if (isArray) {\n rObj[currentPath] = [];\n } else {\n rObj[currentPath] = {};\n }\n }\n\n recurse(rPropVal, rObj[currentPath], currentPath, rObj);\n return;\n }\n\n if (\n currentPathType == dotize.valTypes.array &&\n rPropValPrev &&\n rObjPrev\n ) {\n if (Array.isArray(rObjPrev[rPropValPrev]) == false)\n rObjPrev[rPropValPrev] = [];\n rObjPrev[rPropValPrev].push(rPropVal);\n } else {\n rObj[currentPath] = rPropVal;\n }\n })(tPropVal, newObj);\n }\n\n return newObj;\n },\n};\n"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ //#region src/utils/filter-base-props.d.ts
2
+ interface PropsFilterOptions {
3
+ labelable?: boolean;
4
+ propNames?: Set<string>;
5
+ eventProps?: boolean;
6
+ }
7
+ /**
8
+ * Filters out all props that aren't valid DOM props or defined via override prop obj.
9
+ * @param props - The component props to be filtered.
10
+ * @param opts - Props to override.
11
+ */
12
+ declare function filterBaseProps(props: Record<string, unknown>, opts?: PropsFilterOptions): Record<string, unknown>;
13
+ //#endregion
14
+ export { filterBaseProps };
15
+ //# sourceMappingURL=filter-base-props.d.ts.map
@@ -0,0 +1,45 @@
1
+ //#region src/utils/filter-base-props.ts
2
+ const DOMPropNames = new Set(["id"]);
3
+ const BasePropNames = new Set([
4
+ "role",
5
+ "as",
6
+ "element",
7
+ "css",
8
+ "qa",
9
+ "mods",
10
+ "qaVal",
11
+ "hidden",
12
+ "isHidden",
13
+ "disabled",
14
+ "isDisabled",
15
+ "children",
16
+ "style",
17
+ "className",
18
+ "href",
19
+ "target",
20
+ "tabIndex"
21
+ ]);
22
+ const ignoreEventPropsNames = new Set([
23
+ "onPress",
24
+ "onHoverStart",
25
+ "onHoverEnd",
26
+ "onPressStart",
27
+ "onPressEnd"
28
+ ]);
29
+ const propRe = /^((data-).*)$/;
30
+ const eventRe = /^on[A-Z].+$/;
31
+ /**
32
+ * Filters out all props that aren't valid DOM props or defined via override prop obj.
33
+ * @param props - The component props to be filtered.
34
+ * @param opts - Props to override.
35
+ */
36
+ function filterBaseProps(props, opts = {}) {
37
+ const { propNames, eventProps } = opts;
38
+ const filteredProps = {};
39
+ for (const prop in props) if (Object.prototype.hasOwnProperty.call(props, prop) && (DOMPropNames.has(prop) || BasePropNames.has(prop) || prop.startsWith("aria-") || eventProps && eventRe.test(prop) && !ignoreEventPropsNames.has(prop) || propNames?.has(prop) || propRe.test(prop))) filteredProps[prop] = props[prop];
40
+ return filteredProps;
41
+ }
42
+
43
+ //#endregion
44
+ export { filterBaseProps };
45
+ //# sourceMappingURL=filter-base-props.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-base-props.js","names":[],"sources":["../../src/utils/filter-base-props.ts"],"sourcesContent":["const DOMPropNames = new Set(['id']);\n\nconst BasePropNames = new Set([\n 'role',\n 'as',\n 'element',\n 'css',\n 'qa',\n 'mods',\n 'qaVal',\n 'hidden',\n 'isHidden',\n 'disabled',\n 'isDisabled',\n 'children',\n 'style',\n 'className',\n 'href',\n 'target',\n 'tabIndex',\n]);\n\nconst ignoreEventPropsNames = new Set([\n 'onPress',\n 'onHoverStart',\n 'onHoverEnd',\n 'onPressStart',\n 'onPressEnd',\n]);\n\nconst propRe = /^((data-).*)$/;\nconst eventRe = /^on[A-Z].+$/;\n\ninterface PropsFilterOptions {\n // @deprecated\n labelable?: boolean;\n propNames?: Set<string>;\n eventProps?: boolean;\n}\n\n/**\n * Filters out all props that aren't valid DOM props or defined via override prop obj.\n * @param props - The component props to be filtered.\n * @param opts - Props to override.\n */\nexport function filterBaseProps(\n props: Record<string, unknown>,\n opts: PropsFilterOptions = {},\n): Record<string, unknown> {\n const { propNames, eventProps } = opts;\n const filteredProps: Record<string, unknown> = {};\n\n for (const prop in props) {\n if (\n Object.prototype.hasOwnProperty.call(props, prop) &&\n (DOMPropNames.has(prop) ||\n BasePropNames.has(prop) ||\n // Always preserve any ARIA attributes to maintain accessibility support.\n prop.startsWith('aria-') ||\n (eventProps &&\n eventRe.test(prop) &&\n !ignoreEventPropsNames.has(prop)) ||\n propNames?.has(prop) ||\n propRe.test(prop))\n ) {\n filteredProps[prop] = props[prop];\n }\n }\n\n return filteredProps;\n}\n"],"mappings":";AAAA,MAAM,eAAe,IAAI,IAAI,CAAC,KAAK,CAAC;AAEpC,MAAM,gBAAgB,IAAI,IAAI;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,wBAAwB,IAAI,IAAI;CACpC;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,SAAS;AACf,MAAM,UAAU;;;;;;AAchB,SAAgB,gBACd,OACA,OAA2B,EAAE,EACJ;CACzB,MAAM,EAAE,WAAW,eAAe;CAClC,MAAM,gBAAyC,EAAE;AAEjD,MAAK,MAAM,QAAQ,MACjB,KACE,OAAO,UAAU,eAAe,KAAK,OAAO,KAAK,KAChD,aAAa,IAAI,KAAK,IACrB,cAAc,IAAI,KAAK,IAEvB,KAAK,WAAW,QAAQ,IACvB,cACC,QAAQ,KAAK,KAAK,IAClB,CAAC,sBAAsB,IAAI,KAAK,IAClC,WAAW,IAAI,KAAK,IACpB,OAAO,KAAK,KAAK,EAEnB,eAAc,QAAQ,MAAM;AAIhC,QAAO"}
@@ -0,0 +1,7 @@
1
+ import { ElementType } from "react";
2
+
3
+ //#region src/utils/get-display-name.d.ts
4
+ declare function getDisplayName<T>(Component: ElementType<T>, fallbackName?: string): string;
5
+ //#endregion
6
+ export { getDisplayName };
7
+ //# sourceMappingURL=get-display-name.d.ts.map
@@ -0,0 +1,10 @@
1
+ //#region src/utils/get-display-name.ts
2
+ const DEFAULT_NAME = "Anonymous";
3
+ function getDisplayName(Component, fallbackName = DEFAULT_NAME) {
4
+ if (typeof Component === "function") return Component.displayName ?? Component.name ?? fallbackName;
5
+ return fallbackName;
6
+ }
7
+
8
+ //#endregion
9
+ export { getDisplayName };
10
+ //# sourceMappingURL=get-display-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-display-name.js","names":[],"sources":["../../src/utils/get-display-name.ts"],"sourcesContent":["import type { ElementType } from 'react';\n\nconst DEFAULT_NAME = 'Anonymous';\n\nexport function getDisplayName<T>(\n Component: ElementType<T>,\n fallbackName = DEFAULT_NAME,\n): string {\n if (typeof Component === 'function') {\n return Component.displayName ?? Component.name ?? fallbackName;\n }\n\n return fallbackName;\n}\n"],"mappings":";AAEA,MAAM,eAAe;AAErB,SAAgB,eACd,WACA,eAAe,cACP;AACR,KAAI,OAAO,cAAc,WACvB,QAAO,UAAU,eAAe,UAAU,QAAQ;AAGpD,QAAO"}
@@ -0,0 +1,38 @@
1
+ import { hslToRgbValues } from "./process-tokens.js";
2
+
3
+ //#region src/utils/hsl-to-rgb.ts
4
+ /**
5
+ * Convert HSL color string to RGB.
6
+ * Supports:
7
+ * - Modern: hsl(h s% l%), hsl(h s% l% / a)
8
+ * - Legacy: hsl(h, s%, l%), hsla(h, s%, l%, a)
9
+ */
10
+ function hslToRgb(hslStr) {
11
+ const match = hslStr.match(/hsla?\(([^)]+)\)/i);
12
+ if (!match) return null;
13
+ const [colorPart, slashAlpha] = match[1].trim().split("/");
14
+ const parts = colorPart.trim().split(/[,\s]+/).filter(Boolean);
15
+ if (parts.length < 3) return null;
16
+ const alphaPart = slashAlpha?.trim() || (parts.length >= 4 ? parts[3] : null);
17
+ let h = parseFloat(parts[0]);
18
+ const hueStr = parts[0].toLowerCase();
19
+ if (hueStr.endsWith("turn")) h = parseFloat(hueStr) * 360;
20
+ else if (hueStr.endsWith("rad")) h = parseFloat(hueStr) * 180 / Math.PI;
21
+ h = (h % 360 + 360) % 360;
22
+ const parsePercent = (val) => {
23
+ const num = parseFloat(val);
24
+ return val.includes("%") ? num / 100 : num;
25
+ };
26
+ const s = Math.max(0, Math.min(1, parsePercent(parts[1])));
27
+ const l = Math.max(0, Math.min(1, parsePercent(parts[2])));
28
+ const [r, g, b] = hslToRgbValues(h, s, l);
29
+ if (alphaPart) {
30
+ const alpha = parseFloat(alphaPart.trim());
31
+ return `rgba(${Math.round(r)}, ${Math.round(g)}, ${Math.round(b)}, ${alpha})`;
32
+ }
33
+ return `rgb(${Math.round(r)} ${Math.round(g)} ${Math.round(b)})`;
34
+ }
35
+
36
+ //#endregion
37
+ export { hslToRgb };
38
+ //# sourceMappingURL=hsl-to-rgb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hsl-to-rgb.js","names":[],"sources":["../../src/utils/hsl-to-rgb.ts"],"sourcesContent":["import { hslToRgbValues } from './process-tokens';\n\n/**\n * Convert HSL color string to RGB.\n * Supports:\n * - Modern: hsl(h s% l%), hsl(h s% l% / a)\n * - Legacy: hsl(h, s%, l%), hsla(h, s%, l%, a)\n */\nexport function hslToRgb(hslStr: string): string | null {\n const match = hslStr.match(/hsla?\\(([^)]+)\\)/i);\n if (!match) return null;\n\n const inner = match[1].trim();\n const [colorPart, slashAlpha] = inner.split('/');\n const parts = colorPart\n .trim()\n .split(/[,\\s]+/)\n .filter(Boolean);\n\n if (parts.length < 3) return null;\n\n // Alpha can come from slash notation (modern) or 4th part (legacy comma syntax)\n const alphaPart = slashAlpha?.trim() || (parts.length >= 4 ? parts[3] : null);\n\n // Parse hue\n let h = parseFloat(parts[0]);\n const hueStr = parts[0].toLowerCase();\n if (hueStr.endsWith('turn')) h = parseFloat(hueStr) * 360;\n else if (hueStr.endsWith('rad')) h = (parseFloat(hueStr) * 180) / Math.PI;\n h = ((h % 360) + 360) % 360;\n\n // Parse saturation and lightness\n const parsePercent = (val: string): number => {\n const num = parseFloat(val);\n return val.includes('%') ? num / 100 : num;\n };\n const s = Math.max(0, Math.min(1, parsePercent(parts[1])));\n const l = Math.max(0, Math.min(1, parsePercent(parts[2])));\n\n // Use shared HSL to RGB conversion\n const [r, g, b] = hslToRgbValues(h, s, l);\n\n if (alphaPart) {\n const alpha = parseFloat(alphaPart.trim());\n return `rgba(${Math.round(r)}, ${Math.round(g)}, ${Math.round(b)}, ${alpha})`;\n }\n\n return `rgb(${Math.round(r)} ${Math.round(g)} ${Math.round(b)})`;\n}\n"],"mappings":";;;;;;;;;AAQA,SAAgB,SAAS,QAA+B;CACtD,MAAM,QAAQ,OAAO,MAAM,oBAAoB;AAC/C,KAAI,CAAC,MAAO,QAAO;CAGnB,MAAM,CAAC,WAAW,cADJ,MAAM,GAAG,MAAM,CACS,MAAM,IAAI;CAChD,MAAM,QAAQ,UACX,MAAM,CACN,MAAM,SAAS,CACf,OAAO,QAAQ;AAElB,KAAI,MAAM,SAAS,EAAG,QAAO;CAG7B,MAAM,YAAY,YAAY,MAAM,KAAK,MAAM,UAAU,IAAI,MAAM,KAAK;CAGxE,IAAI,IAAI,WAAW,MAAM,GAAG;CAC5B,MAAM,SAAS,MAAM,GAAG,aAAa;AACrC,KAAI,OAAO,SAAS,OAAO,CAAE,KAAI,WAAW,OAAO,GAAG;UAC7C,OAAO,SAAS,MAAM,CAAE,KAAK,WAAW,OAAO,GAAG,MAAO,KAAK;AACvE,MAAM,IAAI,MAAO,OAAO;CAGxB,MAAM,gBAAgB,QAAwB;EAC5C,MAAM,MAAM,WAAW,IAAI;AAC3B,SAAO,IAAI,SAAS,IAAI,GAAG,MAAM,MAAM;;CAEzC,MAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,aAAa,MAAM,GAAG,CAAC,CAAC;CAC1D,MAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,aAAa,MAAM,GAAG,CAAC,CAAC;CAG1D,MAAM,CAAC,GAAG,GAAG,KAAK,eAAe,GAAG,GAAG,EAAE;AAEzC,KAAI,WAAW;EACb,MAAM,QAAQ,WAAW,UAAU,MAAM,CAAC;AAC1C,SAAO,QAAQ,KAAK,MAAM,EAAE,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC,IAAI,MAAM;;AAG7E,QAAO,OAAO,KAAK,MAAM,EAAE,CAAC,GAAG,KAAK,MAAM,EAAE,CAAC,GAAG,KAAK,MAAM,EAAE,CAAC"}
@@ -0,0 +1,19 @@
1
+ //#region src/utils/is-dev-env.ts
2
+ /**
3
+ * Check if we're in a development environment at runtime
4
+ * Uses bracket notation to avoid bundler compilation
5
+ * Also checks for TASTY_DEBUG localStorage setting
6
+ */
7
+ function isDevEnv() {
8
+ if (typeof window !== "undefined" && window.localStorage) try {
9
+ const forceTastyDebug = window.localStorage.getItem("TASTY_DEBUG");
10
+ if (forceTastyDebug !== null && forceTastyDebug.toLowerCase() === "true") return true;
11
+ } catch {}
12
+ if (typeof process === "undefined") return false;
13
+ const nodeEnv = "development";
14
+ return nodeEnv !== "test" && nodeEnv !== "production";
15
+ }
16
+
17
+ //#endregion
18
+ export { isDevEnv };
19
+ //# sourceMappingURL=is-dev-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-dev-env.js","names":[],"sources":["../../src/utils/is-dev-env.ts"],"sourcesContent":["/**\n * Check if we're in a development environment at runtime\n * Uses bracket notation to avoid bundler compilation\n * Also checks for TASTY_DEBUG localStorage setting\n */\nexport function isDevEnv(): boolean {\n // Check localStorage for DEBUG_TASTY setting (browser environment)\n if (typeof window !== 'undefined' && window.localStorage) {\n try {\n const forceTastyDebug = window.localStorage.getItem('TASTY_DEBUG');\n if (\n forceTastyDebug !== null &&\n forceTastyDebug.toLowerCase() === 'true'\n ) {\n return true;\n }\n } catch {\n // localStorage might not be available (private browsing, etc.)\n // Continue with other checks\n }\n }\n\n // Check NODE_ENV for Node.js environments\n if (typeof process === 'undefined') return false;\n\n // Use bracket notation to avoid bundler replacement\n const nodeEnv = process.env?.['NODE_ENV'];\n return nodeEnv !== 'test' && nodeEnv !== 'production';\n}\n"],"mappings":";;;;;;AAKA,SAAgB,WAAoB;AAElC,KAAI,OAAO,WAAW,eAAe,OAAO,aAC1C,KAAI;EACF,MAAM,kBAAkB,OAAO,aAAa,QAAQ,cAAc;AAClE,MACE,oBAAoB,QACpB,gBAAgB,aAAa,KAAK,OAElC,QAAO;SAEH;AAOV,KAAI,OAAO,YAAY,YAAa,QAAO;CAG3C,MAAM;AACN,QAAO,YAAY,UAAU,YAAY"}
@@ -0,0 +1,15 @@
1
+ //#region src/utils/is-valid-element-type.ts
2
+ /**
3
+ * Lightweight replacement for `react-is`'s isValidElementType.
4
+ * Detects string tags, function/class components, and React exotic types
5
+ * (forwardRef, memo, lazy, etc.) via their internal $$typeof symbol.
6
+ */
7
+ function isValidElementType(value) {
8
+ if (typeof value === "string" || typeof value === "function") return true;
9
+ if (typeof value === "object" && value !== null) return typeof value.$$typeof === "symbol";
10
+ return false;
11
+ }
12
+
13
+ //#endregion
14
+ export { isValidElementType };
15
+ //# sourceMappingURL=is-valid-element-type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-valid-element-type.js","names":[],"sources":["../../src/utils/is-valid-element-type.ts"],"sourcesContent":["/**\n * Lightweight replacement for `react-is`'s isValidElementType.\n * Detects string tags, function/class components, and React exotic types\n * (forwardRef, memo, lazy, etc.) via their internal $$typeof symbol.\n */\nexport function isValidElementType(value: unknown): boolean {\n if (typeof value === 'string' || typeof value === 'function') {\n return true;\n }\n\n if (typeof value === 'object' && value !== null) {\n return typeof (value as { $$typeof?: unknown }).$$typeof === 'symbol';\n }\n\n return false;\n}\n"],"mappings":";;;;;;AAKA,SAAgB,mBAAmB,OAAyB;AAC1D,KAAI,OAAO,UAAU,YAAY,OAAO,UAAU,WAChD,QAAO;AAGT,KAAI,OAAO,UAAU,YAAY,UAAU,KACzC,QAAO,OAAQ,MAAiC,aAAa;AAG/D,QAAO"}
@@ -0,0 +1,7 @@
1
+ import { Styles } from "../styles/types.js";
2
+
3
+ //#region src/utils/merge-styles.d.ts
4
+ declare function mergeStyles(...objects: (Styles | undefined | null)[]): Styles;
5
+ //#endregion
6
+ export { mergeStyles };
7
+ //# sourceMappingURL=merge-styles.d.ts.map
@@ -0,0 +1,146 @@
1
+ import { isDevEnv } from "./is-dev-env.js";
2
+ import { isSelector } from "../pipeline/index.js";
3
+
4
+ //#region src/utils/merge-styles.ts
5
+ const devMode = isDevEnv();
6
+ const INHERIT_VALUE = "@inherit";
7
+ /**
8
+ * Check if a value is a state map (object, not array).
9
+ */
10
+ function isStateMap(value) {
11
+ return typeof value === "object" && value !== null && !Array.isArray(value);
12
+ }
13
+ /**
14
+ * Normalize a parent value to a state map.
15
+ * - Already a state map → return as-is
16
+ * - Non-null, non-false primitive → wrap as `{ '': value }`
17
+ * - null / undefined / false → return null (no parent to merge with)
18
+ */
19
+ function normalizeToStateMap(value) {
20
+ if (isStateMap(value)) return value;
21
+ if (value != null && value !== false) return { "": value };
22
+ return null;
23
+ }
24
+ /**
25
+ * Resolve a child state map against a parent value.
26
+ *
27
+ * Mode is determined by whether the child contains a `''` (default) key:
28
+ * - No `''` → extend mode: parent entries preserved, child adds/overrides/repositions
29
+ * - Has `''` → replace mode: child defines everything, `@inherit` cherry-picks from parent
30
+ *
31
+ * In both modes:
32
+ * - `@inherit` value → resolve from parent state map
33
+ * - `null` value → remove this state from the result
34
+ * - `false` value → tombstone, persists through all layers, blocks recipe
35
+ */
36
+ function resolveStateMap(parentValue, childMap) {
37
+ const isExtend = !("" in childMap);
38
+ const parentMap = normalizeToStateMap(parentValue);
39
+ if (!parentMap) {
40
+ const result = {};
41
+ for (const key of Object.keys(childMap)) {
42
+ const val = childMap[key];
43
+ if (val === null || val === INHERIT_VALUE) continue;
44
+ result[key] = val;
45
+ }
46
+ return result;
47
+ }
48
+ if (isExtend) return resolveExtendMode(parentMap, childMap);
49
+ return resolveReplaceMode(parentMap, childMap);
50
+ }
51
+ /**
52
+ * Extend mode: parent entries are preserved, child entries add/override/reposition.
53
+ */
54
+ function resolveExtendMode(parentMap, childMap) {
55
+ const inheritKeys = /* @__PURE__ */ new Set();
56
+ const removeKeys = /* @__PURE__ */ new Set();
57
+ const overrideKeys = /* @__PURE__ */ new Map();
58
+ for (const key of Object.keys(childMap)) {
59
+ const val = childMap[key];
60
+ if (val === INHERIT_VALUE) {
61
+ if (key in parentMap) inheritKeys.add(key);
62
+ else if (devMode) console.warn(`[Tasty] @inherit used for state '${key}' that does not exist in the parent style map. Entry skipped.`);
63
+ } else if (val === null) removeKeys.add(key);
64
+ else if (key in parentMap) overrideKeys.set(key, val);
65
+ }
66
+ const result = {};
67
+ for (const key of Object.keys(parentMap)) {
68
+ if (removeKeys.has(key)) continue;
69
+ if (inheritKeys.has(key)) continue;
70
+ if (overrideKeys.has(key)) result[key] = overrideKeys.get(key);
71
+ else result[key] = parentMap[key];
72
+ }
73
+ for (const key of Object.keys(childMap)) if (inheritKeys.has(key)) result[key] = parentMap[key];
74
+ else if (!removeKeys.has(key) && !overrideKeys.has(key) && childMap[key] !== INHERIT_VALUE) result[key] = childMap[key];
75
+ return result;
76
+ }
77
+ /**
78
+ * Replace mode: child entries define the result, `@inherit` pulls from parent.
79
+ */
80
+ function resolveReplaceMode(parentMap, childMap) {
81
+ const result = {};
82
+ for (const key of Object.keys(childMap)) {
83
+ const val = childMap[key];
84
+ if (val === INHERIT_VALUE) {
85
+ if (key in parentMap) result[key] = parentMap[key];
86
+ else if (devMode) console.warn(`[Tasty] @inherit used for state '${key}' that does not exist in the parent style map. Entry skipped.`);
87
+ } else if (val !== null) result[key] = val;
88
+ }
89
+ return result;
90
+ }
91
+ /**
92
+ * Merge sub-element properties with state map / null / undefined support.
93
+ */
94
+ function mergeSubElementStyles(parentSub, childSub) {
95
+ const parent = parentSub;
96
+ const child = childSub;
97
+ const merged = {
98
+ ...parent,
99
+ ...child
100
+ };
101
+ for (const key of Object.keys(child)) {
102
+ const val = child[key];
103
+ if (val === void 0) {
104
+ if (parent && key in parent) merged[key] = parent[key];
105
+ } else if (val === null) delete merged[key];
106
+ else if (isStateMap(val)) merged[key] = resolveStateMap(parent ? parent[key] : void 0, val);
107
+ }
108
+ return merged;
109
+ }
110
+ function mergeStyles(...objects) {
111
+ let styles = objects[0] ? { ...objects[0] } : {};
112
+ let pos = 1;
113
+ while (pos in objects) {
114
+ const selectorKeys = Object.keys(styles).filter((key) => isSelector(key) && styles[key]);
115
+ const newStyles = objects[pos];
116
+ if (newStyles) {
117
+ const resultStyles = {
118
+ ...styles,
119
+ ...newStyles
120
+ };
121
+ const newSelectorKeys = Object.keys(newStyles).filter(isSelector);
122
+ const allSelectorKeys = new Set([...selectorKeys, ...newSelectorKeys]);
123
+ for (const key of allSelectorKeys) {
124
+ const newValue = newStyles?.[key];
125
+ if (newValue === false || newValue === null) delete resultStyles[key];
126
+ else if (newValue === void 0) resultStyles[key] = styles[key];
127
+ else if (newValue) resultStyles[key] = mergeSubElementStyles(styles[key], newValue);
128
+ }
129
+ for (const key of Object.keys(newStyles)) {
130
+ if (isSelector(key)) continue;
131
+ const newValue = newStyles[key];
132
+ if (newValue === void 0) if (key in styles) resultStyles[key] = styles[key];
133
+ else delete resultStyles[key];
134
+ else if (newValue === null) delete resultStyles[key];
135
+ else if (isStateMap(newValue)) resultStyles[key] = resolveStateMap(styles[key], newValue);
136
+ }
137
+ styles = resultStyles;
138
+ }
139
+ pos++;
140
+ }
141
+ return styles;
142
+ }
143
+
144
+ //#endregion
145
+ export { mergeStyles };
146
+ //# sourceMappingURL=merge-styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-styles.js","names":[],"sources":["../../src/utils/merge-styles.ts"],"sourcesContent":["import { isSelector } from '../pipeline';\nimport type { Styles, StylesWithoutSelectors } from '../styles/types';\n\nimport { isDevEnv } from './is-dev-env';\n\nconst devMode = isDevEnv();\n\nconst INHERIT_VALUE = '@inherit';\n\n/**\n * Check if a value is a state map (object, not array).\n */\nfunction isStateMap(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Normalize a parent value to a state map.\n * - Already a state map → return as-is\n * - Non-null, non-false primitive → wrap as `{ '': value }`\n * - null / undefined / false → return null (no parent to merge with)\n */\nfunction normalizeToStateMap(value: unknown): Record<string, unknown> | null {\n if (isStateMap(value)) return value as Record<string, unknown>;\n if (value != null && value !== false) return { '': value };\n return null;\n}\n\n/**\n * Resolve a child state map against a parent value.\n *\n * Mode is determined by whether the child contains a `''` (default) key:\n * - No `''` → extend mode: parent entries preserved, child adds/overrides/repositions\n * - Has `''` → replace mode: child defines everything, `@inherit` cherry-picks from parent\n *\n * In both modes:\n * - `@inherit` value → resolve from parent state map\n * - `null` value → remove this state from the result\n * - `false` value → tombstone, persists through all layers, blocks recipe\n */\nfunction resolveStateMap(\n parentValue: unknown,\n childMap: Record<string, unknown>,\n): Record<string, unknown> {\n const isExtend = !('' in childMap);\n const parentMap = normalizeToStateMap(parentValue);\n\n if (!parentMap) {\n // No parent to merge with — strip nulls and @inherit, return child entries\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(childMap)) {\n const val = childMap[key];\n if (val === null || val === INHERIT_VALUE) continue;\n result[key] = val;\n }\n return result;\n }\n\n if (isExtend) {\n return resolveExtendMode(parentMap, childMap);\n }\n\n return resolveReplaceMode(parentMap, childMap);\n}\n\n/**\n * Extend mode: parent entries are preserved, child entries add/override/reposition.\n */\nfunction resolveExtendMode(\n parentMap: Record<string, unknown>,\n childMap: Record<string, unknown>,\n): Record<string, unknown> {\n const inheritKeys = new Set<string>();\n const removeKeys = new Set<string>();\n const overrideKeys = new Map<string, unknown>();\n\n for (const key of Object.keys(childMap)) {\n const val = childMap[key];\n if (val === INHERIT_VALUE) {\n if (key in parentMap) {\n inheritKeys.add(key);\n } else if (devMode) {\n console.warn(\n `[Tasty] @inherit used for state '${key}' that does not exist in the parent style map. Entry skipped.`,\n );\n }\n } else if (val === null) {\n removeKeys.add(key);\n } else if (key in parentMap) {\n overrideKeys.set(key, val);\n }\n }\n\n // 1. Parent entries in order (skip removed, skip repositioned, apply overrides)\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(parentMap)) {\n if (removeKeys.has(key)) continue;\n if (inheritKeys.has(key)) continue;\n if (overrideKeys.has(key)) {\n result[key] = overrideKeys.get(key);\n } else {\n result[key] = parentMap[key];\n }\n }\n\n // 2. Append new + repositioned entries in child declaration order\n for (const key of Object.keys(childMap)) {\n if (inheritKeys.has(key)) {\n result[key] = parentMap[key];\n } else if (\n !removeKeys.has(key) &&\n !overrideKeys.has(key) &&\n // Skip @inherit for keys that weren't in the parent (already warned above)\n childMap[key] !== INHERIT_VALUE\n ) {\n result[key] = childMap[key];\n }\n }\n\n return result;\n}\n\n/**\n * Replace mode: child entries define the result, `@inherit` pulls from parent.\n */\nfunction resolveReplaceMode(\n parentMap: Record<string, unknown>,\n childMap: Record<string, unknown>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const key of Object.keys(childMap)) {\n const val = childMap[key];\n if (val === INHERIT_VALUE) {\n if (key in parentMap) {\n result[key] = parentMap[key];\n } else if (devMode) {\n console.warn(\n `[Tasty] @inherit used for state '${key}' that does not exist in the parent style map. Entry skipped.`,\n );\n }\n } else if (val !== null) {\n result[key] = val;\n }\n }\n\n return result;\n}\n\n/**\n * Merge sub-element properties with state map / null / undefined support.\n */\nfunction mergeSubElementStyles(\n parentSub: StylesWithoutSelectors | undefined,\n childSub: StylesWithoutSelectors,\n): StylesWithoutSelectors {\n const parent = parentSub as Record<string, unknown> | undefined;\n const child = childSub as Record<string, unknown>;\n const merged: Record<string, unknown> = { ...parent, ...child };\n\n for (const key of Object.keys(child)) {\n const val = child[key];\n\n if (val === undefined) {\n if (parent && key in parent) {\n merged[key] = parent[key];\n }\n } else if (val === null) {\n delete merged[key];\n } else if (isStateMap(val)) {\n merged[key] = resolveStateMap(\n parent ? parent[key] : undefined,\n val as Record<string, unknown>,\n );\n }\n }\n\n return merged as StylesWithoutSelectors;\n}\n\nexport function mergeStyles(...objects: (Styles | undefined | null)[]): Styles {\n let styles: Styles = objects[0] ? { ...objects[0] } : {};\n let pos = 1;\n\n while (pos in objects) {\n const selectorKeys = Object.keys(styles).filter(\n (key) => isSelector(key) && styles[key],\n );\n const newStyles = objects[pos];\n\n if (newStyles) {\n const resultStyles = { ...styles, ...newStyles };\n\n // Collect all selector keys from both parent and child\n const newSelectorKeys = Object.keys(newStyles).filter(isSelector);\n const allSelectorKeys = new Set([...selectorKeys, ...newSelectorKeys]);\n\n for (const key of allSelectorKeys) {\n const newValue = newStyles?.[key];\n\n if (newValue === false || newValue === null) {\n delete resultStyles[key];\n } else if (newValue === undefined) {\n resultStyles[key] = styles[key];\n } else if (newValue) {\n resultStyles[key] = mergeSubElementStyles(\n styles[key] as StylesWithoutSelectors,\n newValue as StylesWithoutSelectors,\n );\n }\n }\n\n // Handle non-selector properties: state maps, null, undefined\n for (const key of Object.keys(newStyles)) {\n if (isSelector(key)) continue;\n\n const newValue = newStyles[key];\n\n if (newValue === undefined) {\n if (key in styles) {\n resultStyles[key] = styles[key];\n } else {\n delete resultStyles[key];\n }\n } else if (newValue === null) {\n delete resultStyles[key];\n } else if (isStateMap(newValue)) {\n (resultStyles as Record<string, unknown>)[key] = resolveStateMap(\n styles[key],\n newValue as Record<string, unknown>,\n );\n }\n }\n\n styles = resultStyles;\n }\n\n pos++;\n }\n\n return styles;\n}\n"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { ModValue } from "../types.js";
2
+ import "../index.js";
3
+
4
+ //#region src/utils/mod-attrs.d.ts
5
+ declare const _modAttrs: (firstArg: Record<string, ModValue> | undefined, secondArg?: unknown) => Record<string, string> | null;
6
+ //#endregion
7
+ export { _modAttrs };
8
+ //# sourceMappingURL=mod-attrs.d.ts.map
@@ -0,0 +1,21 @@
1
+ import { cacheWrapper } from "./cache-wrapper.js";
2
+ import { camelToKebab } from "./case-converter.js";
3
+
4
+ //#region src/utils/mod-attrs.ts
5
+ function modAttrs(map) {
6
+ return map ? Object.keys(map).reduce((attrs, key) => {
7
+ const value = map[key];
8
+ if (value == null || value === false) return attrs;
9
+ const attrName = `data-${camelToKebab(key)}`;
10
+ if (value === true) attrs[attrName] = "";
11
+ else if (typeof value === "string") attrs[attrName] = value;
12
+ else if (typeof value === "number") attrs[attrName] = String(value);
13
+ else console.warn(`CubeUIKit: Invalid mod value for "${key}". Expected boolean, string, or number, got ${typeof value}`);
14
+ return attrs;
15
+ }, {}) : null;
16
+ }
17
+ const _modAttrs = cacheWrapper(modAttrs);
18
+
19
+ //#endregion
20
+ export { _modAttrs };
21
+ //# sourceMappingURL=mod-attrs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod-attrs.js","names":[],"sources":["../../src/utils/mod-attrs.ts"],"sourcesContent":["/**\n * Generate data DOM attributes from modifier map.\n */\nimport type { AllBaseProps } from '../types';\n\nimport { cacheWrapper } from './cache-wrapper';\nimport { camelToKebab } from './case-converter';\n\nfunction modAttrs(map: AllBaseProps['mods']): Record<string, string> | null {\n return map\n ? Object.keys(map).reduce(\n (attrs, key) => {\n const value = map[key];\n\n // Skip null, undefined, false\n if (value == null || value === false) {\n return attrs;\n }\n\n const attrName = `data-${camelToKebab(key)}`;\n\n if (value === true) {\n // Boolean true: data-{name}=\"\"\n attrs[attrName] = '';\n } else if (typeof value === 'string') {\n // String value: data-{name}=\"value\"\n attrs[attrName] = value;\n } else if (typeof value === 'number') {\n // Number: convert to string\n attrs[attrName] = String(value);\n } else {\n // Reject other types (objects, arrays, functions)\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `CubeUIKit: Invalid mod value for \"${key}\". Expected boolean, string, or number, got ${typeof value}`,\n );\n }\n }\n\n return attrs;\n },\n {} as Record<string, string>,\n )\n : null;\n}\n\nconst _modAttrs = cacheWrapper(modAttrs);\n\nexport { _modAttrs as modAttrs };\n"],"mappings":";;;;AAQA,SAAS,SAAS,KAA0D;AAC1E,QAAO,MACH,OAAO,KAAK,IAAI,CAAC,QACd,OAAO,QAAQ;EACd,MAAM,QAAQ,IAAI;AAGlB,MAAI,SAAS,QAAQ,UAAU,MAC7B,QAAO;EAGT,MAAM,WAAW,QAAQ,aAAa,IAAI;AAE1C,MAAI,UAAU,KAEZ,OAAM,YAAY;WACT,OAAO,UAAU,SAE1B,OAAM,YAAY;WACT,OAAO,UAAU,SAE1B,OAAM,YAAY,OAAO,MAAM;MAI7B,SAAQ,KACN,qCAAqC,IAAI,8CAA8C,OAAO,QAC/F;AAIL,SAAO;IAET,EAAE,CACH,GACD;;AAGN,MAAM,YAAY,aAAa,SAAS"}