@bookklik/senangstart-css 0.1.4 → 0.1.7

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 (524) hide show
  1. package/.github/workflows/deploy-docs.yml +7 -1
  2. package/dist/senangstart-css.js +1436 -14
  3. package/dist/senangstart-css.min.js +1159 -10
  4. package/docs/.vitepress/config.js +621 -15
  5. package/docs/SYNTAX-REFERENCE.md +1555 -0
  6. package/docs/guide/preflight.md +139 -0
  7. package/docs/ms/guide/preflight.md +139 -0
  8. package/docs/ms/reference/colors.md +45 -45
  9. package/docs/ms/reference/layout/align-content.md +35 -0
  10. package/docs/ms/reference/layout/align-items.md +33 -0
  11. package/docs/ms/reference/layout/align-self.md +34 -0
  12. package/docs/ms/reference/layout/aspect-ratio.md +40 -0
  13. package/docs/ms/reference/layout/border-collapse.md +30 -0
  14. package/docs/ms/reference/layout/border-spacing.md +39 -0
  15. package/docs/ms/reference/layout/box-sizing.md +30 -0
  16. package/docs/ms/reference/layout/caption-side.md +30 -0
  17. package/docs/ms/reference/layout/columns.md +30 -0
  18. package/docs/ms/reference/layout/container.md +29 -0
  19. package/docs/ms/reference/layout/display.md +60 -0
  20. package/docs/ms/reference/layout/flex-basis.md +38 -0
  21. package/docs/ms/reference/layout/flex-direction.md +33 -0
  22. package/docs/ms/reference/layout/flex-items.md +32 -0
  23. package/docs/ms/reference/layout/flex-wrap.md +31 -0
  24. package/docs/ms/reference/layout/flex.md +40 -0
  25. package/docs/ms/reference/layout/float-clear.md +32 -0
  26. package/docs/ms/reference/layout/grid-auto-flow.md +33 -0
  27. package/docs/ms/reference/layout/grid-auto-sizing.md +32 -0
  28. package/docs/ms/reference/layout/grid-column-span.md +31 -0
  29. package/docs/ms/reference/layout/grid-columns.md +32 -0
  30. package/docs/ms/reference/layout/grid-row-span.md +30 -0
  31. package/docs/ms/reference/layout/grid-rows.md +31 -0
  32. package/docs/ms/reference/layout/inset.md +44 -0
  33. package/docs/ms/reference/layout/isolation.md +30 -0
  34. package/docs/ms/reference/layout/justify-content.md +36 -0
  35. package/docs/ms/reference/layout/justify-items.md +32 -0
  36. package/docs/ms/reference/layout/justify-self.md +33 -0
  37. package/docs/ms/reference/layout/object-fit.md +33 -0
  38. package/docs/ms/reference/layout/object-position.md +45 -0
  39. package/docs/ms/reference/layout/order.md +32 -0
  40. package/docs/ms/reference/layout/overflow.md +34 -0
  41. package/docs/ms/reference/layout/overscroll.md +31 -0
  42. package/docs/ms/reference/layout/place-content.md +35 -0
  43. package/docs/ms/reference/layout/place-items.md +32 -0
  44. package/docs/ms/reference/layout/place-self.md +33 -0
  45. package/docs/ms/reference/layout/position.md +34 -0
  46. package/docs/ms/reference/layout/shorthand-alignment.md +34 -0
  47. package/docs/ms/reference/layout/table-layout.md +30 -0
  48. package/docs/ms/reference/layout/visibility.md +30 -0
  49. package/docs/ms/reference/layout/z-index.md +33 -0
  50. package/docs/ms/reference/layout.md +53 -95
  51. package/docs/ms/reference/space/arbitrary-values.md +32 -0
  52. package/docs/ms/reference/space/gap.md +44 -0
  53. package/docs/ms/reference/space/height.md +44 -0
  54. package/docs/ms/reference/space/margin.md +49 -0
  55. package/docs/ms/reference/space/padding.md +49 -0
  56. package/docs/ms/reference/space/scale-reference.md +43 -0
  57. package/docs/ms/reference/space/sizing.md +27 -0
  58. package/docs/ms/reference/space/width.md +45 -0
  59. package/docs/ms/reference/space.md +15 -99
  60. package/docs/ms/reference/spacing.md +22 -8
  61. package/docs/ms/reference/visual/accent-color.md +31 -0
  62. package/docs/ms/reference/visual/animation-builtin.md +41 -0
  63. package/docs/ms/reference/visual/animation-delay.md +41 -0
  64. package/docs/ms/reference/visual/animation-direction.md +32 -0
  65. package/docs/ms/reference/visual/animation-duration.md +43 -0
  66. package/docs/ms/reference/visual/animation-fill.md +32 -0
  67. package/docs/ms/reference/visual/animation-iteration.md +30 -0
  68. package/docs/ms/reference/visual/animation-play.md +30 -0
  69. package/docs/ms/reference/visual/appearance.md +30 -0
  70. package/docs/ms/reference/visual/backdrop-blur.md +43 -0
  71. package/docs/ms/reference/visual/backdrop-brightness.md +41 -0
  72. package/docs/ms/reference/visual/backdrop-contrast.md +41 -0
  73. package/docs/ms/reference/visual/backdrop-grayscale.md +39 -0
  74. package/docs/ms/reference/visual/backdrop-hue-rotate.md +39 -0
  75. package/docs/ms/reference/visual/backdrop-invert.md +39 -0
  76. package/docs/ms/reference/visual/backdrop-opacity.md +39 -0
  77. package/docs/ms/reference/visual/backdrop-saturate.md +41 -0
  78. package/docs/ms/reference/visual/backdrop-sepia.md +39 -0
  79. package/docs/ms/reference/visual/background-attachment.md +31 -0
  80. package/docs/ms/reference/visual/background-blend-mode.md +34 -0
  81. package/docs/ms/reference/visual/background-clip.md +32 -0
  82. package/docs/ms/reference/visual/background-color.md +33 -0
  83. package/docs/ms/reference/visual/background-image.md +41 -0
  84. package/docs/ms/reference/visual/background-origin.md +31 -0
  85. package/docs/ms/reference/visual/background-position.md +45 -0
  86. package/docs/ms/reference/visual/background-repeat.md +34 -0
  87. package/docs/ms/reference/visual/background-size.md +39 -0
  88. package/docs/ms/reference/visual/background.md +13 -0
  89. package/docs/ms/reference/visual/blend-modes.md +34 -0
  90. package/docs/ms/reference/visual/border-radius.md +34 -0
  91. package/docs/ms/reference/visual/border-style.md +33 -0
  92. package/docs/ms/reference/visual/border-width.md +44 -0
  93. package/docs/ms/reference/visual/border.md +43 -0
  94. package/docs/ms/reference/visual/box-shadow.md +33 -0
  95. package/docs/ms/reference/visual/caret-color.md +31 -0
  96. package/docs/ms/reference/visual/color-scheme.md +31 -0
  97. package/docs/ms/reference/visual/cursor.md +37 -0
  98. package/docs/ms/reference/visual/field-sizing.md +30 -0
  99. package/docs/ms/reference/visual/fill.md +38 -0
  100. package/docs/ms/reference/visual/filter-blur.md +43 -0
  101. package/docs/ms/reference/visual/filter-brightness.md +41 -0
  102. package/docs/ms/reference/visual/filter-contrast.md +41 -0
  103. package/docs/ms/reference/visual/filter-drop-shadow.md +42 -0
  104. package/docs/ms/reference/visual/filter-grayscale.md +39 -0
  105. package/docs/ms/reference/visual/filter-hue-rotate.md +39 -0
  106. package/docs/ms/reference/visual/filter-invert.md +39 -0
  107. package/docs/ms/reference/visual/filter-saturate.md +41 -0
  108. package/docs/ms/reference/visual/filter-sepia.md +39 -0
  109. package/docs/ms/reference/visual/font-family.md +31 -0
  110. package/docs/ms/reference/visual/font-smoothing.md +30 -0
  111. package/docs/ms/reference/visual/font-style.md +30 -0
  112. package/docs/ms/reference/visual/font-variant-numeric.md +35 -0
  113. package/docs/ms/reference/visual/font-weight.md +31 -0
  114. package/docs/ms/reference/visual/forced-color-adjust.md +30 -0
  115. package/docs/ms/reference/visual/hyphens.md +31 -0
  116. package/docs/ms/reference/visual/letter-spacing.md +42 -0
  117. package/docs/ms/reference/visual/line-clamp.md +40 -0
  118. package/docs/ms/reference/visual/line-height.md +42 -0
  119. package/docs/ms/reference/visual/list-style.md +34 -0
  120. package/docs/ms/reference/visual/mask.md +39 -0
  121. package/docs/ms/reference/visual/opacity.md +33 -0
  122. package/docs/ms/reference/visual/outline.md +31 -0
  123. package/docs/ms/reference/visual/pointer-events.md +30 -0
  124. package/docs/ms/reference/visual/resize.md +32 -0
  125. package/docs/ms/reference/visual/scroll-behavior.md +30 -0
  126. package/docs/ms/reference/visual/scroll-margin.md +41 -0
  127. package/docs/ms/reference/visual/scroll-padding.md +41 -0
  128. package/docs/ms/reference/visual/scroll-snap-align.md +32 -0
  129. package/docs/ms/reference/visual/scroll-snap-stop.md +30 -0
  130. package/docs/ms/reference/visual/scroll-snap-type.md +34 -0
  131. package/docs/ms/reference/visual/state-prefixes.md +37 -0
  132. package/docs/ms/reference/visual/stroke-width.md +39 -0
  133. package/docs/ms/reference/visual/stroke.md +38 -0
  134. package/docs/ms/reference/visual/text-alignment.md +32 -0
  135. package/docs/ms/reference/visual/text-color.md +41 -0
  136. package/docs/ms/reference/visual/text-decoration.md +32 -0
  137. package/docs/ms/reference/visual/text-indent.md +37 -0
  138. package/docs/ms/reference/visual/text-overflow.md +31 -0
  139. package/docs/ms/reference/visual/text-shadow.md +40 -0
  140. package/docs/ms/reference/visual/text-size.md +32 -0
  141. package/docs/ms/reference/visual/text-transform.md +32 -0
  142. package/docs/ms/reference/visual/text-wrap.md +32 -0
  143. package/docs/ms/reference/visual/touch-action.md +36 -0
  144. package/docs/ms/reference/visual/transform-backface.md +30 -0
  145. package/docs/ms/reference/visual/transform-origin.md +45 -0
  146. package/docs/ms/reference/visual/transform-perspective-origin.md +45 -0
  147. package/docs/ms/reference/visual/transform-perspective.md +43 -0
  148. package/docs/ms/reference/visual/transform-rotate.md +40 -0
  149. package/docs/ms/reference/visual/transform-scale.md +43 -0
  150. package/docs/ms/reference/visual/transform-skew.md +40 -0
  151. package/docs/ms/reference/visual/transform-style.md +30 -0
  152. package/docs/ms/reference/visual/transform-translate.md +39 -0
  153. package/docs/ms/reference/visual/transition-delay.md +41 -0
  154. package/docs/ms/reference/visual/transition-duration.md +43 -0
  155. package/docs/ms/reference/visual/transition-property.md +34 -0
  156. package/docs/ms/reference/visual/transition-timing.md +40 -0
  157. package/docs/ms/reference/visual/typography-keywords.md +81 -0
  158. package/docs/ms/reference/visual/user-select.md +32 -0
  159. package/docs/ms/reference/visual/vertical-align.md +36 -0
  160. package/docs/ms/reference/visual/whitespace.md +34 -0
  161. package/docs/ms/reference/visual/will-change.md +33 -0
  162. package/docs/ms/reference/visual/word-break.md +32 -0
  163. package/docs/ms/reference/visual.md +145 -148
  164. package/docs/public/assets/senangstart-css.min.js +1545 -0
  165. package/docs/reference/layout/align-content.md +35 -0
  166. package/docs/reference/layout/align-items.md +33 -0
  167. package/docs/reference/layout/align-self.md +34 -0
  168. package/docs/reference/layout/aspect-ratio.md +40 -0
  169. package/docs/reference/layout/border-collapse.md +30 -0
  170. package/docs/reference/layout/border-spacing.md +39 -0
  171. package/docs/reference/layout/box-sizing.md +30 -0
  172. package/docs/reference/layout/caption-side.md +30 -0
  173. package/docs/reference/layout/columns.md +30 -0
  174. package/docs/reference/layout/container.md +29 -0
  175. package/docs/reference/layout/display.md +60 -0
  176. package/docs/reference/layout/flex-basis.md +38 -0
  177. package/docs/reference/layout/flex-direction.md +33 -0
  178. package/docs/reference/layout/flex-items.md +32 -0
  179. package/docs/reference/layout/flex-wrap.md +31 -0
  180. package/docs/reference/layout/flex.md +40 -0
  181. package/docs/reference/layout/float-clear.md +32 -0
  182. package/docs/reference/layout/grid-auto-flow.md +33 -0
  183. package/docs/reference/layout/grid-auto-sizing.md +32 -0
  184. package/docs/reference/layout/grid-column-span.md +31 -0
  185. package/docs/reference/layout/grid-columns.md +32 -0
  186. package/docs/reference/layout/grid-row-span.md +30 -0
  187. package/docs/reference/layout/grid-rows.md +31 -0
  188. package/docs/reference/layout/inset.md +44 -0
  189. package/docs/reference/layout/isolation.md +30 -0
  190. package/docs/reference/layout/justify-content.md +36 -0
  191. package/docs/reference/layout/justify-items.md +32 -0
  192. package/docs/reference/layout/justify-self.md +33 -0
  193. package/docs/reference/layout/object-fit.md +33 -0
  194. package/docs/reference/layout/object-position.md +45 -0
  195. package/docs/reference/layout/order.md +32 -0
  196. package/docs/reference/layout/overflow.md +34 -0
  197. package/docs/reference/layout/overscroll.md +31 -0
  198. package/docs/reference/layout/place-content.md +35 -0
  199. package/docs/reference/layout/place-items.md +32 -0
  200. package/docs/reference/layout/place-self.md +33 -0
  201. package/docs/reference/layout/position.md +34 -0
  202. package/docs/reference/layout/shorthand-alignment.md +34 -0
  203. package/docs/reference/layout/table-layout.md +30 -0
  204. package/docs/reference/layout/visibility.md +30 -0
  205. package/docs/reference/layout/z-index.md +33 -0
  206. package/docs/reference/layout.md +60 -102
  207. package/docs/reference/space/arbitrary-values.md +39 -0
  208. package/docs/reference/space/gap.md +44 -0
  209. package/docs/reference/space/height.md +44 -0
  210. package/docs/reference/space/margin.md +49 -0
  211. package/docs/reference/space/padding.md +49 -0
  212. package/docs/reference/space/scale-reference.md +43 -0
  213. package/docs/reference/space/width.md +45 -0
  214. package/docs/reference/space.md +14 -98
  215. package/docs/reference/spacing.md +22 -8
  216. package/docs/reference/visual/accent-color.md +31 -0
  217. package/docs/reference/visual/animation-builtin.md +41 -0
  218. package/docs/reference/visual/animation-delay.md +41 -0
  219. package/docs/reference/visual/animation-direction.md +32 -0
  220. package/docs/reference/visual/animation-duration.md +43 -0
  221. package/docs/reference/visual/animation-fill.md +32 -0
  222. package/docs/reference/visual/animation-iteration.md +30 -0
  223. package/docs/reference/visual/animation-play.md +30 -0
  224. package/docs/reference/visual/appearance.md +30 -0
  225. package/docs/reference/visual/backdrop-blur.md +43 -0
  226. package/docs/reference/visual/backdrop-brightness.md +41 -0
  227. package/docs/reference/visual/backdrop-contrast.md +41 -0
  228. package/docs/reference/visual/backdrop-grayscale.md +39 -0
  229. package/docs/reference/visual/backdrop-hue-rotate.md +39 -0
  230. package/docs/reference/visual/backdrop-invert.md +39 -0
  231. package/docs/reference/visual/backdrop-opacity.md +39 -0
  232. package/docs/reference/visual/backdrop-saturate.md +41 -0
  233. package/docs/reference/visual/backdrop-sepia.md +39 -0
  234. package/docs/reference/visual/background-attachment.md +31 -0
  235. package/docs/reference/visual/background-blend-mode.md +34 -0
  236. package/docs/reference/visual/background-clip.md +32 -0
  237. package/docs/reference/visual/background-color.md +33 -0
  238. package/docs/reference/visual/background-image.md +41 -0
  239. package/docs/reference/visual/background-origin.md +31 -0
  240. package/docs/reference/visual/background-position.md +45 -0
  241. package/docs/reference/visual/background-repeat.md +34 -0
  242. package/docs/reference/visual/background-size.md +39 -0
  243. package/docs/reference/visual/blend-modes.md +34 -0
  244. package/docs/reference/visual/border-radius.md +34 -0
  245. package/docs/reference/visual/border-style.md +33 -0
  246. package/docs/reference/visual/border-width.md +44 -0
  247. package/docs/reference/visual/border.md +43 -0
  248. package/docs/reference/visual/box-shadow.md +33 -0
  249. package/docs/reference/visual/caret-color.md +31 -0
  250. package/docs/reference/visual/color-scheme.md +31 -0
  251. package/docs/reference/visual/cursor.md +37 -0
  252. package/docs/reference/visual/field-sizing.md +30 -0
  253. package/docs/reference/visual/fill.md +38 -0
  254. package/docs/reference/visual/filter-blur.md +43 -0
  255. package/docs/reference/visual/filter-brightness.md +41 -0
  256. package/docs/reference/visual/filter-contrast.md +41 -0
  257. package/docs/reference/visual/filter-drop-shadow.md +42 -0
  258. package/docs/reference/visual/filter-grayscale.md +39 -0
  259. package/docs/reference/visual/filter-hue-rotate.md +39 -0
  260. package/docs/reference/visual/filter-invert.md +39 -0
  261. package/docs/reference/visual/filter-saturate.md +41 -0
  262. package/docs/reference/visual/filter-sepia.md +39 -0
  263. package/docs/reference/visual/font-family.md +31 -0
  264. package/docs/reference/visual/font-smoothing.md +30 -0
  265. package/docs/reference/visual/font-style.md +30 -0
  266. package/docs/reference/visual/font-variant-numeric.md +35 -0
  267. package/docs/reference/visual/font-weight.md +31 -0
  268. package/docs/reference/visual/forced-color-adjust.md +30 -0
  269. package/docs/reference/visual/hyphens.md +31 -0
  270. package/docs/reference/visual/letter-spacing.md +42 -0
  271. package/docs/reference/visual/line-clamp.md +40 -0
  272. package/docs/reference/visual/line-height.md +42 -0
  273. package/docs/reference/visual/list-style.md +34 -0
  274. package/docs/reference/visual/mask.md +39 -0
  275. package/docs/reference/visual/opacity.md +33 -0
  276. package/docs/reference/visual/outline.md +31 -0
  277. package/docs/reference/visual/pointer-events.md +30 -0
  278. package/docs/reference/visual/resize.md +32 -0
  279. package/docs/reference/visual/scroll-behavior.md +30 -0
  280. package/docs/reference/visual/scroll-margin.md +41 -0
  281. package/docs/reference/visual/scroll-padding.md +41 -0
  282. package/docs/reference/visual/scroll-snap-align.md +32 -0
  283. package/docs/reference/visual/scroll-snap-stop.md +30 -0
  284. package/docs/reference/visual/scroll-snap-type.md +34 -0
  285. package/docs/reference/visual/state-prefixes.md +37 -0
  286. package/docs/reference/visual/stroke-width.md +39 -0
  287. package/docs/reference/visual/stroke.md +38 -0
  288. package/docs/reference/visual/text-alignment.md +32 -0
  289. package/docs/reference/visual/text-color.md +41 -0
  290. package/docs/reference/visual/text-decoration.md +32 -0
  291. package/docs/reference/visual/text-indent.md +37 -0
  292. package/docs/reference/visual/text-overflow.md +31 -0
  293. package/docs/reference/visual/text-shadow.md +40 -0
  294. package/docs/reference/visual/text-size.md +32 -0
  295. package/docs/reference/visual/text-transform.md +32 -0
  296. package/docs/reference/visual/text-wrap.md +32 -0
  297. package/docs/reference/visual/touch-action.md +36 -0
  298. package/docs/reference/visual/transform-backface.md +30 -0
  299. package/docs/reference/visual/transform-origin.md +45 -0
  300. package/docs/reference/visual/transform-perspective-origin.md +45 -0
  301. package/docs/reference/visual/transform-perspective.md +43 -0
  302. package/docs/reference/visual/transform-rotate.md +40 -0
  303. package/docs/reference/visual/transform-scale.md +43 -0
  304. package/docs/reference/visual/transform-skew.md +40 -0
  305. package/docs/reference/visual/transform-style.md +30 -0
  306. package/docs/reference/visual/transform-translate.md +39 -0
  307. package/docs/reference/visual/transition-delay.md +41 -0
  308. package/docs/reference/visual/transition-duration.md +43 -0
  309. package/docs/reference/visual/transition-property.md +34 -0
  310. package/docs/reference/visual/transition-timing.md +40 -0
  311. package/docs/reference/visual/typography-keywords.md +81 -0
  312. package/docs/reference/visual/user-select.md +32 -0
  313. package/docs/reference/visual/vertical-align.md +36 -0
  314. package/docs/reference/visual/whitespace.md +34 -0
  315. package/docs/reference/visual/will-change.md +33 -0
  316. package/docs/reference/visual/word-break.md +32 -0
  317. package/docs/reference/visual.md +151 -154
  318. package/docs/syntax-reference.json +1973 -0
  319. package/package.json +10 -2
  320. package/playground/index.html +78 -0
  321. package/playground/jit-test.html +384 -0
  322. package/scripts/extract-syntax.js +152 -0
  323. package/scripts/generate-docs.js +352 -0
  324. package/src/cdn/jit.js +1436 -14
  325. package/src/cli/commands/build.js +5 -0
  326. package/src/cli/index.js +2 -0
  327. package/src/compiler/generators/css.js +1537 -25
  328. package/src/compiler/generators/preflight.js +379 -0
  329. package/src/config/defaults.js +19 -1
  330. package/src/definitions/index.js +153 -0
  331. package/src/definitions/layout-alignment.js +257 -0
  332. package/src/definitions/layout-flex.js +209 -0
  333. package/src/definitions/layout-grid.js +150 -0
  334. package/src/definitions/layout-positioning.js +89 -0
  335. package/src/definitions/layout-table.js +98 -0
  336. package/src/definitions/layout-utilities.js +262 -0
  337. package/src/definitions/layout.js +195 -0
  338. package/src/definitions/space.js +164 -0
  339. package/src/definitions/visual-backgrounds.js +423 -0
  340. package/src/definitions/visual-borders.js +111 -0
  341. package/src/definitions/visual-filters.js +204 -0
  342. package/src/definitions/visual-interactivity.js +292 -0
  343. package/src/definitions/visual-svg.js +80 -0
  344. package/src/definitions/visual-transform3d.js +159 -0
  345. package/src/definitions/visual-transforms.js +142 -0
  346. package/src/definitions/visual-transitions.js +277 -0
  347. package/src/definitions/visual-typography.js +386 -0
  348. package/src/definitions/visual.js +542 -0
  349. package/tests/helpers/test-utils.js +144 -0
  350. package/tests/integration/compiler.test.js +247 -0
  351. package/tests/sync/docs-sync.test.js +364 -0
  352. package/tests/unit/compiler/generators/css.test.js +719 -0
  353. package/tests/unit/compiler/parser.test.js +244 -0
  354. package/tests/unit/compiler/tokenizer.test.js +305 -0
  355. package/tests/unit/config/defaults.test.js +168 -0
  356. package/docs/.vitepress/cache/deps/_metadata.json +0 -31
  357. package/docs/.vitepress/cache/deps/chunk-LE5NDSFD.js +0 -12824
  358. package/docs/.vitepress/cache/deps/chunk-LE5NDSFD.js.map +0 -7
  359. package/docs/.vitepress/cache/deps/package.json +0 -3
  360. package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js +0 -4505
  361. package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js.map +0 -7
  362. package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js +0 -9731
  363. package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js.map +0 -7
  364. package/docs/.vitepress/cache/deps/vue.js +0 -347
  365. package/docs/.vitepress/cache/deps/vue.js.map +0 -7
  366. package/docs/.vitepress/dist/404.html +0 -22
  367. package/docs/.vitepress/dist/assets/app.DBXoyO4w.js +0 -1
  368. package/docs/.vitepress/dist/assets/chunks/framework.I305HrzY.js +0 -19
  369. package/docs/.vitepress/dist/assets/chunks/theme.CaXH1t3X.js +0 -1
  370. package/docs/.vitepress/dist/assets/examples_cards.md.BCzaqSD6.js +0 -84
  371. package/docs/.vitepress/dist/assets/examples_cards.md.BCzaqSD6.lean.js +0 -1
  372. package/docs/.vitepress/dist/assets/examples_forms.md.DOjr9LrG.js +0 -169
  373. package/docs/.vitepress/dist/assets/examples_forms.md.DOjr9LrG.lean.js +0 -1
  374. package/docs/.vitepress/dist/assets/examples_hero.md.CAorji-Y.js +0 -118
  375. package/docs/.vitepress/dist/assets/examples_hero.md.CAorji-Y.lean.js +0 -1
  376. package/docs/.vitepress/dist/assets/examples_index.md.BjUNsTob.js +0 -52
  377. package/docs/.vitepress/dist/assets/examples_index.md.BjUNsTob.lean.js +0 -1
  378. package/docs/.vitepress/dist/assets/examples_navigation.md.DvL-Yv_5.js +0 -106
  379. package/docs/.vitepress/dist/assets/examples_navigation.md.DvL-Yv_5.lean.js +0 -1
  380. package/docs/.vitepress/dist/assets/guide_cdn.md.Bbb7-icp.js +0 -30
  381. package/docs/.vitepress/dist/assets/guide_cdn.md.Bbb7-icp.lean.js +0 -1
  382. package/docs/.vitepress/dist/assets/guide_cli.md.yLsOZ7NL.js +0 -44
  383. package/docs/.vitepress/dist/assets/guide_cli.md.yLsOZ7NL.lean.js +0 -1
  384. package/docs/.vitepress/dist/assets/guide_configuration.md.DN4FfKw4.js +0 -79
  385. package/docs/.vitepress/dist/assets/guide_configuration.md.DN4FfKw4.lean.js +0 -1
  386. package/docs/.vitepress/dist/assets/guide_dark-mode.md.D6UJvQtM.js +0 -69
  387. package/docs/.vitepress/dist/assets/guide_dark-mode.md.D6UJvQtM.lean.js +0 -1
  388. package/docs/.vitepress/dist/assets/guide_getting-started.md.K5nA8wXY.js +0 -47
  389. package/docs/.vitepress/dist/assets/guide_getting-started.md.K5nA8wXY.lean.js +0 -1
  390. package/docs/.vitepress/dist/assets/guide_index.md.B0lRU150.js +0 -3
  391. package/docs/.vitepress/dist/assets/guide_index.md.B0lRU150.lean.js +0 -1
  392. package/docs/.vitepress/dist/assets/guide_natural-scale.md.vvauT7U1.js +0 -22
  393. package/docs/.vitepress/dist/assets/guide_natural-scale.md.vvauT7U1.lean.js +0 -1
  394. package/docs/.vitepress/dist/assets/guide_philosophy.md.mOb9kp32.js +0 -7
  395. package/docs/.vitepress/dist/assets/guide_philosophy.md.mOb9kp32.lean.js +0 -1
  396. package/docs/.vitepress/dist/assets/guide_responsive.md.C7cF-4cR.js +0 -57
  397. package/docs/.vitepress/dist/assets/guide_responsive.md.C7cF-4cR.lean.js +0 -1
  398. package/docs/.vitepress/dist/assets/guide_states.md.CwtGEGHB.js +0 -77
  399. package/docs/.vitepress/dist/assets/guide_states.md.CwtGEGHB.lean.js +0 -1
  400. package/docs/.vitepress/dist/assets/guide_tri-attribute.md.CpjJLEMP.js +0 -45
  401. package/docs/.vitepress/dist/assets/guide_tri-attribute.md.CpjJLEMP.lean.js +0 -1
  402. package/docs/.vitepress/dist/assets/index.md.mYp6_S5X.js +0 -7
  403. package/docs/.vitepress/dist/assets/index.md.mYp6_S5X.lean.js +0 -1
  404. package/docs/.vitepress/dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
  405. package/docs/.vitepress/dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
  406. package/docs/.vitepress/dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
  407. package/docs/.vitepress/dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
  408. package/docs/.vitepress/dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
  409. package/docs/.vitepress/dist/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
  410. package/docs/.vitepress/dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
  411. package/docs/.vitepress/dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
  412. package/docs/.vitepress/dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
  413. package/docs/.vitepress/dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
  414. package/docs/.vitepress/dist/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
  415. package/docs/.vitepress/dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
  416. package/docs/.vitepress/dist/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
  417. package/docs/.vitepress/dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
  418. package/docs/.vitepress/dist/assets/ms_examples_cards.md.CaE5JNAs.js +0 -84
  419. package/docs/.vitepress/dist/assets/ms_examples_cards.md.CaE5JNAs.lean.js +0 -1
  420. package/docs/.vitepress/dist/assets/ms_examples_forms.md.VvDzMzxF.js +0 -169
  421. package/docs/.vitepress/dist/assets/ms_examples_forms.md.VvDzMzxF.lean.js +0 -1
  422. package/docs/.vitepress/dist/assets/ms_examples_hero.md.DC4c3kKW.js +0 -118
  423. package/docs/.vitepress/dist/assets/ms_examples_hero.md.DC4c3kKW.lean.js +0 -1
  424. package/docs/.vitepress/dist/assets/ms_examples_index.md.C13ShcjA.js +0 -52
  425. package/docs/.vitepress/dist/assets/ms_examples_index.md.C13ShcjA.lean.js +0 -1
  426. package/docs/.vitepress/dist/assets/ms_examples_navigation.md.BPtVjKbk.js +0 -106
  427. package/docs/.vitepress/dist/assets/ms_examples_navigation.md.BPtVjKbk.lean.js +0 -1
  428. package/docs/.vitepress/dist/assets/ms_guide_cdn.md.tZFpEjTS.js +0 -30
  429. package/docs/.vitepress/dist/assets/ms_guide_cdn.md.tZFpEjTS.lean.js +0 -1
  430. package/docs/.vitepress/dist/assets/ms_guide_cli.md.DBjxv3-o.js +0 -44
  431. package/docs/.vitepress/dist/assets/ms_guide_cli.md.DBjxv3-o.lean.js +0 -1
  432. package/docs/.vitepress/dist/assets/ms_guide_configuration.md.CyYNqREm.js +0 -79
  433. package/docs/.vitepress/dist/assets/ms_guide_configuration.md.CyYNqREm.lean.js +0 -1
  434. package/docs/.vitepress/dist/assets/ms_guide_dark-mode.md.DWDWvzzv.js +0 -69
  435. package/docs/.vitepress/dist/assets/ms_guide_dark-mode.md.DWDWvzzv.lean.js +0 -1
  436. package/docs/.vitepress/dist/assets/ms_guide_getting-started.md.WoQwRhlY.js +0 -47
  437. package/docs/.vitepress/dist/assets/ms_guide_getting-started.md.WoQwRhlY.lean.js +0 -1
  438. package/docs/.vitepress/dist/assets/ms_guide_index.md.pHpXZMmU.js +0 -3
  439. package/docs/.vitepress/dist/assets/ms_guide_index.md.pHpXZMmU.lean.js +0 -1
  440. package/docs/.vitepress/dist/assets/ms_guide_natural-scale.md.BiUfU-TH.js +0 -22
  441. package/docs/.vitepress/dist/assets/ms_guide_natural-scale.md.BiUfU-TH.lean.js +0 -1
  442. package/docs/.vitepress/dist/assets/ms_guide_philosophy.md.hf3SG2Ts.js +0 -7
  443. package/docs/.vitepress/dist/assets/ms_guide_philosophy.md.hf3SG2Ts.lean.js +0 -1
  444. package/docs/.vitepress/dist/assets/ms_guide_responsive.md.C4yS3zzM.js +0 -57
  445. package/docs/.vitepress/dist/assets/ms_guide_responsive.md.C4yS3zzM.lean.js +0 -1
  446. package/docs/.vitepress/dist/assets/ms_guide_states.md.DkDEjPdC.js +0 -77
  447. package/docs/.vitepress/dist/assets/ms_guide_states.md.DkDEjPdC.lean.js +0 -1
  448. package/docs/.vitepress/dist/assets/ms_guide_tri-attribute.md.C3Es_V5J.js +0 -45
  449. package/docs/.vitepress/dist/assets/ms_guide_tri-attribute.md.C3Es_V5J.lean.js +0 -1
  450. package/docs/.vitepress/dist/assets/ms_index.md.Bmo9il08.js +0 -7
  451. package/docs/.vitepress/dist/assets/ms_index.md.Bmo9il08.lean.js +0 -1
  452. package/docs/.vitepress/dist/assets/ms_reference_breakpoints.md.DR7i_--b.js +0 -48
  453. package/docs/.vitepress/dist/assets/ms_reference_breakpoints.md.DR7i_--b.lean.js +0 -1
  454. package/docs/.vitepress/dist/assets/ms_reference_colors.md.06ZYiMcJ.js +0 -17
  455. package/docs/.vitepress/dist/assets/ms_reference_colors.md.06ZYiMcJ.lean.js +0 -1
  456. package/docs/.vitepress/dist/assets/ms_reference_layout.md.NGL6A5SR.js +0 -13
  457. package/docs/.vitepress/dist/assets/ms_reference_layout.md.NGL6A5SR.lean.js +0 -1
  458. package/docs/.vitepress/dist/assets/ms_reference_space.md.BG5YQ-09.js +0 -24
  459. package/docs/.vitepress/dist/assets/ms_reference_space.md.BG5YQ-09.lean.js +0 -1
  460. package/docs/.vitepress/dist/assets/ms_reference_spacing.md.XmXLLPOZ.js +0 -32
  461. package/docs/.vitepress/dist/assets/ms_reference_spacing.md.XmXLLPOZ.lean.js +0 -1
  462. package/docs/.vitepress/dist/assets/ms_reference_visual.md.BVOlkEqc.js +0 -22
  463. package/docs/.vitepress/dist/assets/ms_reference_visual.md.BVOlkEqc.lean.js +0 -1
  464. package/docs/.vitepress/dist/assets/reference_breakpoints.md.BRbG8Fzi.js +0 -48
  465. package/docs/.vitepress/dist/assets/reference_breakpoints.md.BRbG8Fzi.lean.js +0 -1
  466. package/docs/.vitepress/dist/assets/reference_colors.md.C7j7dSO1.js +0 -17
  467. package/docs/.vitepress/dist/assets/reference_colors.md.C7j7dSO1.lean.js +0 -1
  468. package/docs/.vitepress/dist/assets/reference_layout.md.BWJ5NxSp.js +0 -13
  469. package/docs/.vitepress/dist/assets/reference_layout.md.BWJ5NxSp.lean.js +0 -1
  470. package/docs/.vitepress/dist/assets/reference_space.md.DCsqfTWb.js +0 -24
  471. package/docs/.vitepress/dist/assets/reference_space.md.DCsqfTWb.lean.js +0 -1
  472. package/docs/.vitepress/dist/assets/reference_spacing.md.BInFD8gd.js +0 -32
  473. package/docs/.vitepress/dist/assets/reference_spacing.md.BInFD8gd.lean.js +0 -1
  474. package/docs/.vitepress/dist/assets/reference_visual.md.BRK7S9T1.js +0 -22
  475. package/docs/.vitepress/dist/assets/reference_visual.md.BRK7S9T1.lean.js +0 -1
  476. package/docs/.vitepress/dist/assets/style.D82StYDI.css +0 -1
  477. package/docs/.vitepress/dist/examples/cards.html +0 -108
  478. package/docs/.vitepress/dist/examples/forms.html +0 -193
  479. package/docs/.vitepress/dist/examples/hero.html +0 -142
  480. package/docs/.vitepress/dist/examples/index.html +0 -76
  481. package/docs/.vitepress/dist/examples/navigation.html +0 -130
  482. package/docs/.vitepress/dist/guide/cdn.html +0 -54
  483. package/docs/.vitepress/dist/guide/cli.html +0 -68
  484. package/docs/.vitepress/dist/guide/configuration.html +0 -103
  485. package/docs/.vitepress/dist/guide/dark-mode.html +0 -93
  486. package/docs/.vitepress/dist/guide/getting-started.html +0 -71
  487. package/docs/.vitepress/dist/guide/index.html +0 -27
  488. package/docs/.vitepress/dist/guide/natural-scale.html +0 -46
  489. package/docs/.vitepress/dist/guide/philosophy.html +0 -31
  490. package/docs/.vitepress/dist/guide/responsive.html +0 -81
  491. package/docs/.vitepress/dist/guide/states.html +0 -101
  492. package/docs/.vitepress/dist/guide/tri-attribute.html +0 -69
  493. package/docs/.vitepress/dist/hashmap.json +0 -1
  494. package/docs/.vitepress/dist/index.html +0 -31
  495. package/docs/.vitepress/dist/ms/examples/cards.html +0 -108
  496. package/docs/.vitepress/dist/ms/examples/forms.html +0 -193
  497. package/docs/.vitepress/dist/ms/examples/hero.html +0 -142
  498. package/docs/.vitepress/dist/ms/examples/index.html +0 -76
  499. package/docs/.vitepress/dist/ms/examples/navigation.html +0 -130
  500. package/docs/.vitepress/dist/ms/guide/cdn.html +0 -54
  501. package/docs/.vitepress/dist/ms/guide/cli.html +0 -68
  502. package/docs/.vitepress/dist/ms/guide/configuration.html +0 -103
  503. package/docs/.vitepress/dist/ms/guide/dark-mode.html +0 -93
  504. package/docs/.vitepress/dist/ms/guide/getting-started.html +0 -71
  505. package/docs/.vitepress/dist/ms/guide/index.html +0 -27
  506. package/docs/.vitepress/dist/ms/guide/natural-scale.html +0 -46
  507. package/docs/.vitepress/dist/ms/guide/philosophy.html +0 -31
  508. package/docs/.vitepress/dist/ms/guide/responsive.html +0 -81
  509. package/docs/.vitepress/dist/ms/guide/states.html +0 -101
  510. package/docs/.vitepress/dist/ms/guide/tri-attribute.html +0 -69
  511. package/docs/.vitepress/dist/ms/index.html +0 -31
  512. package/docs/.vitepress/dist/ms/reference/breakpoints.html +0 -72
  513. package/docs/.vitepress/dist/ms/reference/colors.html +0 -41
  514. package/docs/.vitepress/dist/ms/reference/layout.html +0 -37
  515. package/docs/.vitepress/dist/ms/reference/space.html +0 -48
  516. package/docs/.vitepress/dist/ms/reference/spacing.html +0 -56
  517. package/docs/.vitepress/dist/ms/reference/visual.html +0 -46
  518. package/docs/.vitepress/dist/reference/breakpoints.html +0 -72
  519. package/docs/.vitepress/dist/reference/colors.html +0 -41
  520. package/docs/.vitepress/dist/reference/layout.html +0 -37
  521. package/docs/.vitepress/dist/reference/space.html +0 -48
  522. package/docs/.vitepress/dist/reference/spacing.html +0 -56
  523. package/docs/.vitepress/dist/reference/visual.html +0 -46
  524. package/docs/.vitepress/dist/vp-icons.css +0 -1
@@ -0,0 +1,244 @@
1
+ /**
2
+ * SenangStart CSS - Parser Unit Tests
3
+ */
4
+
5
+ import { describe, it, beforeEach } from 'node:test';
6
+ import assert from 'node:assert';
7
+ import { parseSource, parseMultipleSources } from '../../../src/compiler/parser.js';
8
+
9
+ describe('Parser', () => {
10
+
11
+ describe('parseSource', () => {
12
+
13
+ it('extracts layout attributes', () => {
14
+ const html = '<div layout="flex center">Test</div>';
15
+ const result = parseSource(html);
16
+
17
+ assert.ok(result.layout instanceof Set);
18
+ assert.ok(result.layout.has('flex'));
19
+ assert.ok(result.layout.has('center'));
20
+ assert.strictEqual(result.layout.size, 2);
21
+ });
22
+
23
+ it('extracts space attributes', () => {
24
+ const html = '<div space="p:medium m:small">Test</div>';
25
+ const result = parseSource(html);
26
+
27
+ assert.ok(result.space instanceof Set);
28
+ assert.ok(result.space.has('p:medium'));
29
+ assert.ok(result.space.has('m:small'));
30
+ assert.strictEqual(result.space.size, 2);
31
+ });
32
+
33
+ it('extracts visual attributes', () => {
34
+ const html = '<div visual="bg:primary text:white">Test</div>';
35
+ const result = parseSource(html);
36
+
37
+ assert.ok(result.visual instanceof Set);
38
+ assert.ok(result.visual.has('bg:primary'));
39
+ assert.ok(result.visual.has('text:white'));
40
+ assert.strictEqual(result.visual.size, 2);
41
+ });
42
+
43
+ it('handles multiple attributes in same element', () => {
44
+ const html = '<div layout="flex" space="p:big" visual="bg:success">Test</div>';
45
+ const result = parseSource(html);
46
+
47
+ assert.ok(result.layout.has('flex'));
48
+ assert.ok(result.space.has('p:big'));
49
+ assert.ok(result.visual.has('bg:success'));
50
+ });
51
+
52
+ it('handles single quotes', () => {
53
+ const html = "<div layout='grid col'>Test</div>";
54
+ const result = parseSource(html);
55
+
56
+ assert.ok(result.layout.has('grid'));
57
+ assert.ok(result.layout.has('col'));
58
+ });
59
+
60
+ it('handles double quotes', () => {
61
+ const html = '<div layout="flex row">Test</div>';
62
+ const result = parseSource(html);
63
+
64
+ assert.ok(result.layout.has('flex'));
65
+ assert.ok(result.layout.has('row'));
66
+ });
67
+
68
+ it('deduplicates repeated tokens within same attribute', () => {
69
+ const html = '<div layout="flex flex center center">Test</div>';
70
+ const result = parseSource(html);
71
+
72
+ // Set automatically deduplicates
73
+ assert.strictEqual(result.layout.size, 2);
74
+ assert.ok(result.layout.has('flex'));
75
+ assert.ok(result.layout.has('center'));
76
+ });
77
+
78
+ it('extracts tokens from multiple elements', () => {
79
+ const html = `
80
+ <div layout="flex">First</div>
81
+ <div layout="grid">Second</div>
82
+ <span space="p:tiny">Third</span>
83
+ `;
84
+ const result = parseSource(html);
85
+
86
+ assert.ok(result.layout.has('flex'));
87
+ assert.ok(result.layout.has('grid'));
88
+ assert.ok(result.space.has('p:tiny'));
89
+ });
90
+
91
+ it('handles JSX-style attributes', () => {
92
+ const jsx = '<Component layout="flex center" visual="bg:primary" />';
93
+ const result = parseSource(jsx);
94
+
95
+ assert.ok(result.layout.has('flex'));
96
+ assert.ok(result.layout.has('center'));
97
+ assert.ok(result.visual.has('bg:primary'));
98
+ });
99
+
100
+ it('handles empty attribute values gracefully', () => {
101
+ const html = '<div layout="">Test</div>';
102
+ const result = parseSource(html);
103
+
104
+ assert.strictEqual(result.layout.size, 0);
105
+ });
106
+
107
+ it('handles whitespace-only attribute values', () => {
108
+ const html = '<div layout=" ">Test</div>';
109
+ const result = parseSource(html);
110
+
111
+ // After trim and split, should have no valid tokens
112
+ assert.strictEqual(result.layout.size, 0);
113
+ });
114
+
115
+ it('ignores non-SenangStart attributes', () => {
116
+ const html = '<div class="my-class" id="my-id" data-test="value" layout="flex">Test</div>';
117
+ const result = parseSource(html);
118
+
119
+ // Only layout should be parsed
120
+ assert.strictEqual(result.layout.size, 1);
121
+ assert.ok(result.layout.has('flex'));
122
+ assert.strictEqual(result.space.size, 0);
123
+ assert.strictEqual(result.visual.size, 0);
124
+ });
125
+
126
+ it('handles responsive prefixes', () => {
127
+ const html = '<div layout="flex tab:row desk:grid">Test</div>';
128
+ const result = parseSource(html);
129
+
130
+ assert.ok(result.layout.has('flex'));
131
+ assert.ok(result.layout.has('tab:row'));
132
+ assert.ok(result.layout.has('desk:grid'));
133
+ });
134
+
135
+ it('handles state prefixes', () => {
136
+ const html = '<div visual="bg:primary hover:bg:secondary">Test</div>';
137
+ const result = parseSource(html);
138
+
139
+ assert.ok(result.visual.has('bg:primary'));
140
+ assert.ok(result.visual.has('hover:bg:secondary'));
141
+ });
142
+
143
+ it('handles arbitrary values with brackets', () => {
144
+ const html = '<div space="w:[350px] h:[100vh]">Test</div>';
145
+ const result = parseSource(html);
146
+
147
+ assert.ok(result.space.has('w:[350px]'));
148
+ assert.ok(result.space.has('h:[100vh]'));
149
+ });
150
+
151
+ it('handles complex real-world HTML', () => {
152
+ const html = `
153
+ <!DOCTYPE html>
154
+ <html>
155
+ <head><title>Test</title></head>
156
+ <body>
157
+ <header layout="flex between" space="p:medium" visual="bg:white shadow:medium">
158
+ <nav layout="flex" space="g:small">
159
+ <a visual="text:primary hover:text:secondary">Link</a>
160
+ </nav>
161
+ </header>
162
+ <main layout="grid grid-cols:3 tab:grid-cols:2 mob:col" space="p:big g:medium">
163
+ <article visual="bg:white rounded:medium shadow:small">
164
+ <h1 visual="text:big font:bold">Title</h1>
165
+ </article>
166
+ </main>
167
+ </body>
168
+ </html>
169
+ `;
170
+ const result = parseSource(html);
171
+
172
+ // Layout assertions
173
+ assert.ok(result.layout.has('flex'));
174
+ assert.ok(result.layout.has('between'));
175
+ assert.ok(result.layout.has('grid'));
176
+ assert.ok(result.layout.has('grid-cols:3'));
177
+
178
+ // Space assertions
179
+ assert.ok(result.space.has('p:medium'));
180
+ assert.ok(result.space.has('p:big'));
181
+ assert.ok(result.space.has('g:small'));
182
+ assert.ok(result.space.has('g:medium'));
183
+
184
+ // Visual assertions
185
+ assert.ok(result.visual.has('bg:white'));
186
+ assert.ok(result.visual.has('shadow:medium'));
187
+ assert.ok(result.visual.has('text:primary'));
188
+ assert.ok(result.visual.has('hover:text:secondary'));
189
+ });
190
+
191
+ });
192
+
193
+ describe('parseMultipleSources', () => {
194
+
195
+ it('combines tokens from multiple files', () => {
196
+ const files = [
197
+ { path: 'page1.html', content: '<div layout="flex">Page 1</div>' },
198
+ { path: 'page2.html', content: '<div layout="grid" visual="bg:primary">Page 2</div>' }
199
+ ];
200
+
201
+ const result = parseMultipleSources(files);
202
+
203
+ assert.ok(result.layout.has('flex'));
204
+ assert.ok(result.layout.has('grid'));
205
+ assert.ok(result.visual.has('bg:primary'));
206
+ });
207
+
208
+ it('deduplicates tokens across files', () => {
209
+ const files = [
210
+ { path: 'page1.html', content: '<div layout="flex center">Page 1</div>' },
211
+ { path: 'page2.html', content: '<div layout="flex center">Page 2</div>' }
212
+ ];
213
+
214
+ const result = parseMultipleSources(files);
215
+
216
+ // Same tokens appear in both, should only be counted once
217
+ assert.strictEqual(result.layout.size, 2);
218
+ assert.ok(result.layout.has('flex'));
219
+ assert.ok(result.layout.has('center'));
220
+ });
221
+
222
+ it('handles empty file array', () => {
223
+ const result = parseMultipleSources([]);
224
+
225
+ assert.strictEqual(result.layout.size, 0);
226
+ assert.strictEqual(result.space.size, 0);
227
+ assert.strictEqual(result.visual.size, 0);
228
+ });
229
+
230
+ it('handles files with no SenangStart attributes', () => {
231
+ const files = [
232
+ { path: 'regular.html', content: '<div class="normal">Regular HTML</div>' }
233
+ ];
234
+
235
+ const result = parseMultipleSources(files);
236
+
237
+ assert.strictEqual(result.layout.size, 0);
238
+ assert.strictEqual(result.space.size, 0);
239
+ assert.strictEqual(result.visual.size, 0);
240
+ });
241
+
242
+ });
243
+
244
+ });
@@ -0,0 +1,305 @@
1
+ /**
2
+ * SenangStart CSS - Tokenizer Unit Tests
3
+ */
4
+
5
+ import { describe, it } from 'node:test';
6
+ import assert from 'node:assert';
7
+ import { tokenize, tokenizeAll } from '../../../src/compiler/tokenizer.js';
8
+
9
+ describe('Tokenizer', () => {
10
+
11
+ describe('tokenize - Basic Syntax', () => {
12
+
13
+ it('parses simple property:value syntax', () => {
14
+ const token = tokenize('p:medium', 'space');
15
+
16
+ assert.strictEqual(token.property, 'p');
17
+ assert.strictEqual(token.value, 'medium');
18
+ assert.strictEqual(token.breakpoint, null);
19
+ assert.strictEqual(token.state, null);
20
+ assert.strictEqual(token.isArbitrary, false);
21
+ assert.strictEqual(token.attrType, 'space');
22
+ });
23
+
24
+ it('parses breakpoint:property:value syntax', () => {
25
+ const token = tokenize('tab:p:big', 'space');
26
+
27
+ assert.strictEqual(token.breakpoint, 'tab');
28
+ assert.strictEqual(token.property, 'p');
29
+ assert.strictEqual(token.value, 'big');
30
+ });
31
+
32
+ it('parses state:property:value syntax', () => {
33
+ const token = tokenize('hover:bg:primary', 'visual');
34
+
35
+ assert.strictEqual(token.state, 'hover');
36
+ assert.strictEqual(token.property, 'bg');
37
+ assert.strictEqual(token.value, 'primary');
38
+ assert.strictEqual(token.breakpoint, null);
39
+ });
40
+
41
+ it('parses full breakpoint:state:property:value syntax', () => {
42
+ const token = tokenize('tab:hover:bg:secondary', 'visual');
43
+
44
+ assert.strictEqual(token.breakpoint, 'tab');
45
+ assert.strictEqual(token.state, 'hover');
46
+ assert.strictEqual(token.property, 'bg');
47
+ assert.strictEqual(token.value, 'secondary');
48
+ });
49
+
50
+ it('handles all breakpoint prefixes', () => {
51
+ const breakpoints = ['mob', 'tab', 'lap', 'desk'];
52
+
53
+ breakpoints.forEach(bp => {
54
+ const token = tokenize(`${bp}:p:small`, 'space');
55
+ assert.strictEqual(token.breakpoint, bp, `Failed for breakpoint: ${bp}`);
56
+ });
57
+ });
58
+
59
+ it('handles all state prefixes', () => {
60
+ const states = ['hover', 'focus', 'active', 'disabled', 'dark'];
61
+
62
+ states.forEach(state => {
63
+ const token = tokenize(`${state}:bg:white`, 'visual');
64
+ assert.strictEqual(token.state, state, `Failed for state: ${state}`);
65
+ });
66
+ });
67
+
68
+ });
69
+
70
+ describe('tokenize - Layout Keywords', () => {
71
+
72
+ it('parses simple layout keywords', () => {
73
+ const keywords = ['flex', 'grid', 'block', 'inline', 'hidden'];
74
+
75
+ keywords.forEach(kw => {
76
+ const token = tokenize(kw, 'layout');
77
+ assert.strictEqual(token.property, kw);
78
+ assert.strictEqual(token.value, kw);
79
+ });
80
+ });
81
+
82
+ it('parses flex direction keywords', () => {
83
+ const directions = ['row', 'col', 'row-reverse', 'col-reverse'];
84
+
85
+ directions.forEach(dir => {
86
+ const token = tokenize(dir, 'layout');
87
+ assert.strictEqual(token.property, dir);
88
+ assert.strictEqual(token.value, dir);
89
+ });
90
+ });
91
+
92
+ it('parses alignment keywords', () => {
93
+ const alignments = ['center', 'start', 'end', 'between', 'around', 'evenly'];
94
+
95
+ alignments.forEach(align => {
96
+ const token = tokenize(align, 'layout');
97
+ assert.strictEqual(token.property, align);
98
+ assert.strictEqual(token.value, align);
99
+ });
100
+ });
101
+
102
+ it('parses wrap keywords', () => {
103
+ const wraps = ['wrap', 'nowrap'];
104
+
105
+ wraps.forEach(wrap => {
106
+ const token = tokenize(wrap, 'layout');
107
+ assert.strictEqual(token.property, wrap);
108
+ assert.strictEqual(token.value, wrap);
109
+ });
110
+ });
111
+
112
+ it('parses position keywords', () => {
113
+ const positions = ['absolute', 'relative', 'fixed', 'sticky'];
114
+
115
+ positions.forEach(pos => {
116
+ const token = tokenize(pos, 'layout');
117
+ assert.strictEqual(token.property, pos);
118
+ assert.strictEqual(token.value, pos);
119
+ });
120
+ });
121
+
122
+ it('parses responsive layout keywords (tab:row)', () => {
123
+ const token = tokenize('tab:row', 'layout');
124
+
125
+ assert.strictEqual(token.breakpoint, 'tab');
126
+ assert.strictEqual(token.property, 'row');
127
+ assert.strictEqual(token.value, 'row');
128
+ });
129
+
130
+ it('parses z-index syntax (z:top)', () => {
131
+ const token = tokenize('z:top', 'layout');
132
+
133
+ assert.strictEqual(token.property, 'z');
134
+ assert.strictEqual(token.value, 'top');
135
+ });
136
+
137
+ it('parses overflow syntax (overflow:hidden)', () => {
138
+ const token = tokenize('overflow:hidden', 'layout');
139
+
140
+ assert.strictEqual(token.property, 'overflow');
141
+ assert.strictEqual(token.value, 'hidden');
142
+ });
143
+
144
+ });
145
+
146
+ describe('tokenize - Arbitrary Values', () => {
147
+
148
+ it('extracts arbitrary values with brackets', () => {
149
+ const token = tokenize('w:[350px]', 'space');
150
+
151
+ assert.strictEqual(token.property, 'w');
152
+ assert.strictEqual(token.value, '350px');
153
+ assert.strictEqual(token.isArbitrary, true);
154
+ });
155
+
156
+ it('replaces underscores with spaces in arbitrary values', () => {
157
+ const token = tokenize('font:[Helvetica_Neue]', 'visual');
158
+
159
+ assert.strictEqual(token.value, 'Helvetica Neue');
160
+ assert.strictEqual(token.isArbitrary, true);
161
+ });
162
+
163
+ it('handles arbitrary percentages', () => {
164
+ const token = tokenize('w:[50%]', 'space');
165
+
166
+ assert.strictEqual(token.value, '50%');
167
+ assert.strictEqual(token.isArbitrary, true);
168
+ });
169
+
170
+ it('handles arbitrary viewport units', () => {
171
+ const token = tokenize('h:[100vh]', 'space');
172
+
173
+ assert.strictEqual(token.value, '100vh');
174
+ assert.strictEqual(token.isArbitrary, true);
175
+ });
176
+
177
+ it('handles arbitrary calc expressions', () => {
178
+ const token = tokenize('w:[calc(100%_-_20px)]', 'space');
179
+
180
+ assert.strictEqual(token.value, 'calc(100% - 20px)');
181
+ assert.strictEqual(token.isArbitrary, true);
182
+ });
183
+
184
+ it('handles arbitrary colors', () => {
185
+ const token = tokenize('bg:[#FF5733]', 'visual');
186
+
187
+ assert.strictEqual(token.value, '#FF5733');
188
+ assert.strictEqual(token.isArbitrary, true);
189
+ });
190
+
191
+ it('handles arbitrary rgb colors', () => {
192
+ const token = tokenize('bg:[rgb(255,87,51)]', 'visual');
193
+
194
+ assert.strictEqual(token.value, 'rgb(255,87,51)');
195
+ assert.strictEqual(token.isArbitrary, true);
196
+ });
197
+
198
+ it('handles arbitrary values with responsive prefix', () => {
199
+ const token = tokenize('tab:w:[500px]', 'space');
200
+
201
+ assert.strictEqual(token.breakpoint, 'tab');
202
+ assert.strictEqual(token.property, 'w');
203
+ assert.strictEqual(token.value, '500px');
204
+ assert.strictEqual(token.isArbitrary, true);
205
+ });
206
+
207
+ it('handles arbitrary values with state prefix', () => {
208
+ const token = tokenize('hover:bg:[#333]', 'visual');
209
+
210
+ assert.strictEqual(token.state, 'hover');
211
+ assert.strictEqual(token.property, 'bg');
212
+ assert.strictEqual(token.value, '#333');
213
+ assert.strictEqual(token.isArbitrary, true);
214
+ });
215
+
216
+ });
217
+
218
+ describe('tokenize - Edge Cases', () => {
219
+
220
+ it('handles values containing colons (URLs)', () => {
221
+ // When value contains colon, it should be preserved
222
+ const token = tokenize('bg-image:[url(https://example.com/img.png)]', 'visual');
223
+
224
+ assert.strictEqual(token.property, 'bg-image');
225
+ // Value should contain the full URL
226
+ assert.ok(token.value.includes('https'));
227
+ });
228
+
229
+ it('preserves raw token string', () => {
230
+ const raw = 'tab:hover:bg:primary';
231
+ const token = tokenize(raw, 'visual');
232
+
233
+ assert.strictEqual(token.raw, raw);
234
+ });
235
+
236
+ it('sets correct attrType', () => {
237
+ const layoutToken = tokenize('flex', 'layout');
238
+ const spaceToken = tokenize('p:medium', 'space');
239
+ const visualToken = tokenize('bg:white', 'visual');
240
+
241
+ assert.strictEqual(layoutToken.attrType, 'layout');
242
+ assert.strictEqual(spaceToken.attrType, 'space');
243
+ assert.strictEqual(visualToken.attrType, 'visual');
244
+ });
245
+
246
+ });
247
+
248
+ describe('tokenizeAll', () => {
249
+
250
+ it('tokenizes all attribute types', () => {
251
+ const parsed = {
252
+ layout: new Set(['flex', 'center']),
253
+ space: new Set(['p:medium']),
254
+ visual: new Set(['bg:primary'])
255
+ };
256
+
257
+ const tokens = tokenizeAll(parsed);
258
+
259
+ assert.strictEqual(tokens.length, 4);
260
+
261
+ const layoutTokens = tokens.filter(t => t.attrType === 'layout');
262
+ const spaceTokens = tokens.filter(t => t.attrType === 'space');
263
+ const visualTokens = tokens.filter(t => t.attrType === 'visual');
264
+
265
+ assert.strictEqual(layoutTokens.length, 2);
266
+ assert.strictEqual(spaceTokens.length, 1);
267
+ assert.strictEqual(visualTokens.length, 1);
268
+ });
269
+
270
+ it('handles empty parsed result', () => {
271
+ const parsed = {
272
+ layout: new Set(),
273
+ space: new Set(),
274
+ visual: new Set()
275
+ };
276
+
277
+ const tokens = tokenizeAll(parsed);
278
+
279
+ assert.strictEqual(tokens.length, 0);
280
+ });
281
+
282
+ it('processes complex parsed output', () => {
283
+ const parsed = {
284
+ layout: new Set(['flex', 'tab:row', 'grid-cols:3']),
285
+ space: new Set(['p:medium', 'g:small', 'm-x:auto']),
286
+ visual: new Set(['bg:primary', 'hover:bg:secondary', 'text:white'])
287
+ };
288
+
289
+ const tokens = tokenizeAll(parsed);
290
+
291
+ assert.strictEqual(tokens.length, 9);
292
+
293
+ // Verify some specific tokens
294
+ const tabRowToken = tokens.find(t => t.raw === 'tab:row');
295
+ assert.ok(tabRowToken);
296
+ assert.strictEqual(tabRowToken.breakpoint, 'tab');
297
+
298
+ const hoverBgToken = tokens.find(t => t.raw === 'hover:bg:secondary');
299
+ assert.ok(hoverBgToken);
300
+ assert.strictEqual(hoverBgToken.state, 'hover');
301
+ });
302
+
303
+ });
304
+
305
+ });