pagyra-js 0.0.19 → 0.0.21

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 (293) hide show
  1. package/README.md +55 -0
  2. package/dist/assets/fonts/licenses/selawik/SIL Open Font License.txt +43 -0
  3. package/dist/assets/fonts/ttf/arimo/Arimo-Bold.ttf +0 -0
  4. package/dist/assets/fonts/ttf/arimo/Arimo-BoldItalic.ttf +0 -0
  5. package/dist/assets/fonts/ttf/arimo/Arimo-Italic.ttf +0 -0
  6. package/dist/assets/fonts/ttf/arimo/Arimo-Regular.ttf +0 -0
  7. package/dist/assets/fonts/ttf/cinzeldecorative/CinzelDecorative-Black.ttf +0 -0
  8. package/dist/assets/fonts/ttf/cinzeldecorative/CinzelDecorative-Bold.ttf +0 -0
  9. package/dist/assets/fonts/ttf/cinzeldecorative/CinzelDecorative-Regular.ttf +0 -0
  10. package/dist/assets/fonts/ttf/dejavu/DejaVuSans.ttf +0 -0
  11. package/dist/assets/fonts/ttf/firecode/FiraCode-Bold.ttf +0 -0
  12. package/dist/assets/fonts/ttf/firecode/FiraCode-Light.ttf +0 -0
  13. package/dist/assets/fonts/ttf/firecode/FiraCode-Medium.ttf +0 -0
  14. package/dist/assets/fonts/ttf/firecode/FiraCode-Regular.ttf +0 -0
  15. package/dist/assets/fonts/ttf/firecode/FiraCode-SemiBold.ttf +0 -0
  16. package/dist/assets/fonts/ttf/notoemoji/NotoEmoji-Bold.ttf +0 -0
  17. package/dist/assets/fonts/ttf/notoemoji/NotoEmoji-Light.ttf +0 -0
  18. package/dist/assets/fonts/ttf/notoemoji/NotoEmoji-Medium.ttf +0 -0
  19. package/dist/assets/fonts/ttf/notoemoji/NotoEmoji-Regular.ttf +0 -0
  20. package/dist/assets/fonts/ttf/notoemoji/NotoEmoji-SemiBold.ttf +0 -0
  21. package/dist/assets/fonts/ttf/notosans/NotoSans-Regular.ttf +0 -0
  22. package/dist/assets/fonts/ttf/roboto/Roboto-Bold.ttf +0 -0
  23. package/dist/assets/fonts/ttf/roboto/Roboto-BoldItalic.ttf +0 -0
  24. package/dist/assets/fonts/ttf/roboto/Roboto-Italic.ttf +0 -0
  25. package/dist/assets/fonts/ttf/roboto/Roboto-Regular.ttf +0 -0
  26. package/dist/assets/fonts/ttf/selawik/selawk.ttf +0 -0
  27. package/dist/assets/fonts/ttf/selawik/selawkb.ttf +0 -0
  28. package/dist/assets/fonts/ttf/selawik/selawkl.ttf +0 -0
  29. package/dist/assets/fonts/ttf/selawik/selawksb.ttf +0 -0
  30. package/dist/assets/fonts/ttf/selawik/selawksl.ttf +0 -0
  31. package/dist/assets/fonts/ttf/stixtwomath/STIXTwoMath-Regular.ttf +0 -0
  32. package/dist/assets/fonts/ttf/tinos/Tinos-Bold.ttf +0 -0
  33. package/dist/assets/fonts/ttf/tinos/Tinos-BoldItalic.ttf +0 -0
  34. package/dist/assets/fonts/ttf/tinos/Tinos-Italic.ttf +0 -0
  35. package/dist/assets/fonts/ttf/tinos/Tinos-Regular.ttf +0 -0
  36. package/dist/assets/fonts/woff/lato/lato-latin-400-italic.woff +0 -0
  37. package/dist/assets/fonts/woff/lato/lato-latin-400-normal.woff +0 -0
  38. package/dist/assets/fonts/woff/lato/lato-latin-700-italic.woff +0 -0
  39. package/dist/assets/fonts/woff/lato/lato-latin-700-normal.woff +0 -0
  40. package/dist/assets/fonts/woff2/caveat/Caveat-Bold.woff2 +0 -0
  41. package/dist/assets/fonts/woff2/caveat/Caveat-Regular.woff2 +0 -0
  42. package/dist/assets/fonts/woff2/lato/lato-latin-400-italic.woff2 +0 -0
  43. package/dist/assets/fonts/woff2/lato/lato-latin-400-normal.woff2 +0 -0
  44. package/dist/assets/fonts/woff2/lato/lato-latin-700-italic.woff2 +0 -0
  45. package/dist/assets/fonts/woff2/lato/lato-latin-700-normal.woff2 +0 -0
  46. package/dist/browser/pagyra.min.js +34 -34
  47. package/dist/browser/pagyra.min.js.map +4 -4
  48. package/dist/playground/server.js +2 -0
  49. package/dist/src/css/compute-style/base-options.d.ts +7 -0
  50. package/dist/src/css/compute-style/base-options.js +24 -0
  51. package/dist/src/css/compute-style/declarations.d.ts +10 -0
  52. package/dist/src/css/compute-style/declarations.js +77 -0
  53. package/dist/src/css/compute-style/decoration.d.ts +8 -0
  54. package/dist/src/css/compute-style/decoration.js +55 -0
  55. package/dist/src/css/compute-style/defaults.d.ts +3 -0
  56. package/dist/src/css/compute-style/defaults.js +34 -0
  57. package/dist/src/css/compute-style/display.d.ts +3 -0
  58. package/dist/src/css/compute-style/display.js +85 -0
  59. package/dist/src/css/compute-style/float.d.ts +2 -0
  60. package/dist/src/css/compute-style/float.js +13 -0
  61. package/dist/src/css/compute-style/font.d.ts +12 -0
  62. package/dist/src/css/compute-style/font.js +57 -0
  63. package/dist/src/css/compute-style/overrides.d.ts +3 -0
  64. package/dist/src/css/compute-style/overrides.js +241 -0
  65. package/dist/src/css/compute-style.d.ts +2 -0
  66. package/dist/src/css/compute-style.js +34 -487
  67. package/dist/src/css/enums.d.ts +4 -0
  68. package/dist/src/css/enums.js +5 -0
  69. package/dist/src/css/layout-property-resolver.js +30 -18
  70. package/dist/src/css/length.d.ts +26 -2
  71. package/dist/src/css/length.js +48 -0
  72. package/dist/src/css/parsers/background-parser.js +1 -1
  73. package/dist/src/css/parsers/calc-parser.d.ts +2 -0
  74. package/dist/src/css/parsers/calc-parser.js +310 -0
  75. package/dist/src/css/parsers/content-parser.d.ts +2 -1
  76. package/dist/src/css/parsers/content-parser.js +7 -2
  77. package/dist/src/css/parsers/dimension-parser.js +37 -18
  78. package/dist/src/css/parsers/display-flex-parser.d.ts +4 -0
  79. package/dist/src/css/parsers/display-flex-parser.js +97 -0
  80. package/dist/src/css/parsers/filter-parser.d.ts +14 -0
  81. package/dist/src/css/parsers/filter-parser.js +255 -0
  82. package/dist/src/css/parsers/grid-parser-extended.d.ts +1 -0
  83. package/dist/src/css/parsers/grid-parser-extended.js +40 -1
  84. package/dist/src/css/parsers/grid-parser.d.ts +5 -2
  85. package/dist/src/css/parsers/grid-parser.js +71 -7
  86. package/dist/src/css/parsers/length-parser.d.ts +8 -3
  87. package/dist/src/css/parsers/length-parser.js +45 -2
  88. package/dist/src/css/parsers/margin-block-parser.js +3 -3
  89. package/dist/src/css/parsers/margin-parser.js +3 -3
  90. package/dist/src/css/parsers/padding-block-parser.js +3 -3
  91. package/dist/src/css/parsers/padding-inline-parser.js +3 -3
  92. package/dist/src/css/parsers/padding-parser.js +6 -6
  93. package/dist/src/css/parsers/position-parser.js +2 -22
  94. package/dist/src/css/parsers/register-parsers.js +29 -2
  95. package/dist/src/css/parsers/word-break-parser.d.ts +2 -0
  96. package/dist/src/css/parsers/word-break-parser.js +23 -0
  97. package/dist/src/css/properties/grid.d.ts +16 -2
  98. package/dist/src/css/properties/layout.d.ts +3 -1
  99. package/dist/src/css/properties/layout.js +1 -1
  100. package/dist/src/css/properties/misc.d.ts +5 -0
  101. package/dist/src/css/properties/typography.d.ts +3 -0
  102. package/dist/src/css/properties/visual.d.ts +36 -0
  103. package/dist/src/css/shorthands/box-shorthand.d.ts +2 -2
  104. package/dist/src/css/style-inheritance.d.ts +2 -1
  105. package/dist/src/css/style-inheritance.js +1 -0
  106. package/dist/src/css/style.d.ts +30 -10
  107. package/dist/src/css/style.js +8 -1
  108. package/dist/src/css/ua-defaults/base-defaults.d.ts +1 -0
  109. package/dist/src/css/ua-defaults/base-defaults.js +10 -1
  110. package/dist/src/css/ua-defaults/element-defaults.js +0 -2
  111. package/dist/src/html/css/parse-css.d.ts +2 -0
  112. package/dist/src/html/css/parse-css.js +32 -3
  113. package/dist/src/html/dom-converter/background-images.d.ts +3 -0
  114. package/dist/src/html/dom-converter/background-images.js +88 -0
  115. package/dist/src/html/dom-converter/convert-dom-node.d.ts +5 -0
  116. package/dist/src/html/dom-converter/convert-dom-node.js +81 -0
  117. package/dist/src/html/dom-converter/handlers/br-handler.d.ts +2 -0
  118. package/dist/src/html/dom-converter/handlers/br-handler.js +20 -0
  119. package/dist/src/html/dom-converter/handlers/form-control-handler.d.ts +2 -0
  120. package/dist/src/html/dom-converter/handlers/form-control-handler.js +28 -0
  121. package/dist/src/html/dom-converter/handlers/img-handler.d.ts +2 -0
  122. package/dist/src/html/dom-converter/handlers/img-handler.js +4 -0
  123. package/dist/src/html/dom-converter/handlers/index.d.ts +4 -0
  124. package/dist/src/html/dom-converter/handlers/index.js +19 -0
  125. package/dist/src/html/dom-converter/handlers/svg-handler.d.ts +2 -0
  126. package/dist/src/html/dom-converter/handlers/svg-handler.js +32 -0
  127. package/dist/src/html/dom-converter/handlers/types.d.ts +12 -0
  128. package/dist/src/html/dom-converter/handlers/types.js +2 -0
  129. package/dist/src/html/dom-converter/helpers.d.ts +7 -0
  130. package/dist/src/html/dom-converter/helpers.js +35 -0
  131. package/dist/src/html/dom-converter/index.d.ts +1 -0
  132. package/dist/src/html/dom-converter/index.js +1 -0
  133. package/dist/src/html/dom-converter/pseudo-elements.d.ts +6 -0
  134. package/dist/src/html/dom-converter/pseudo-elements.js +48 -0
  135. package/dist/src/html/dom-converter/text.d.ts +15 -0
  136. package/dist/src/html/dom-converter/text.js +170 -0
  137. package/dist/src/html/dom-converter.d.ts +1 -5
  138. package/dist/src/html/dom-converter.js +1 -412
  139. package/dist/src/html/image-converter.d.ts +5 -0
  140. package/dist/src/html/image-converter.js +8 -3
  141. package/dist/src/html-to-pdf/document-css.d.ts +14 -0
  142. package/dist/src/html-to-pdf/document-css.js +45 -0
  143. package/dist/src/html-to-pdf/fonts.d.ts +16 -0
  144. package/dist/src/html-to-pdf/fonts.js +74 -0
  145. package/dist/src/html-to-pdf/header-footer.d.ts +14 -0
  146. package/dist/src/html-to-pdf/header-footer.js +101 -0
  147. package/dist/src/html-to-pdf/html-parser.d.ts +6 -0
  148. package/dist/src/html-to-pdf/html-parser.js +81 -0
  149. package/dist/src/html-to-pdf/index.d.ts +3 -0
  150. package/dist/src/html-to-pdf/index.js +2 -0
  151. package/dist/src/html-to-pdf/layout-build.d.ts +37 -0
  152. package/dist/src/html-to-pdf/layout-build.js +73 -0
  153. package/dist/src/html-to-pdf/prepare-html-render.d.ts +2 -0
  154. package/dist/src/html-to-pdf/prepare-html-render.js +121 -0
  155. package/dist/src/html-to-pdf/render-finalize.d.ts +15 -0
  156. package/dist/src/html-to-pdf/render-finalize.js +27 -0
  157. package/dist/src/html-to-pdf/render-html-to-pdf.d.ts +3 -0
  158. package/dist/src/html-to-pdf/render-html-to-pdf.js +25 -0
  159. package/dist/src/html-to-pdf/resource-loader.d.ts +6 -0
  160. package/dist/src/html-to-pdf/resource-loader.js +120 -0
  161. package/dist/src/html-to-pdf/types.d.ts +38 -0
  162. package/dist/src/html-to-pdf/types.js +2 -0
  163. package/dist/src/html-to-pdf.d.ts +1 -37
  164. package/dist/src/html-to-pdf.js +1 -537
  165. package/dist/src/image/js-png-backend.d.ts +7 -0
  166. package/dist/src/image/js-png-backend.js +9 -0
  167. package/dist/src/image/png-backend.d.ts +5 -0
  168. package/dist/src/image/png-backend.js +1 -0
  169. package/dist/src/image/png-wasm-loader.d.ts +5 -0
  170. package/dist/src/image/png-wasm-loader.js +59 -0
  171. package/dist/src/image/wasm/png_decoder_wasm.d.ts +8 -0
  172. package/dist/src/image/wasm/png_decoder_wasm.js +24 -0
  173. package/dist/src/image/wasm/png_decoder_wasm_bg.js +16 -0
  174. package/dist/src/image/wasm-png-backend.d.ts +6 -0
  175. package/dist/src/image/wasm-png-backend.js +17 -0
  176. package/dist/src/layout/counter.d.ts +1 -2
  177. package/dist/src/layout/counter.js +18 -18
  178. package/dist/src/layout/inline/inline-utils.d.ts +1 -1
  179. package/dist/src/layout/inline/inline-utils.js +8 -7
  180. package/dist/src/layout/inline/layout.js +16 -3
  181. package/dist/src/layout/inline/run-placer.d.ts +1 -0
  182. package/dist/src/layout/inline/run-placer.js +2 -10
  183. package/dist/src/layout/pipeline/out-of-flow-manager.js +25 -1
  184. package/dist/src/layout/strategies/block.js +35 -24
  185. package/dist/src/layout/strategies/flex.js +305 -61
  186. package/dist/src/layout/strategies/form.d.ts +2 -0
  187. package/dist/src/layout/strategies/form.js +38 -13
  188. package/dist/src/layout/strategies/grid.js +166 -29
  189. package/dist/src/layout/strategies/image.js +53 -27
  190. package/dist/src/layout/strategies/inline.js +26 -21
  191. package/dist/src/layout/strategies/table.js +26 -18
  192. package/dist/src/layout/utils/content-measurer.d.ts +1 -1
  193. package/dist/src/layout/utils/content-measurer.js +8 -7
  194. package/dist/src/layout/utils/floats.d.ts +1 -0
  195. package/dist/src/layout/utils/floats.js +14 -12
  196. package/dist/src/layout/utils/margin.d.ts +4 -4
  197. package/dist/src/layout/utils/margin.js +20 -16
  198. package/dist/src/layout/utils/node-math.d.ts +12 -6
  199. package/dist/src/layout/utils/node-math.js +71 -41
  200. package/dist/src/layout/utils/sizing.js +2 -1
  201. package/dist/src/pdf/font-subset/font-registry.d.ts +6 -0
  202. package/dist/src/pdf/font-subset/font-registry.js +30 -2
  203. package/dist/src/pdf/header-footer-painter.d.ts +2 -0
  204. package/dist/src/pdf/header-footer-painter.js +52 -4
  205. package/dist/src/pdf/header-footer-renderer.js +12 -1
  206. package/dist/src/pdf/layout-tree-builder.js +5 -1
  207. package/dist/src/pdf/page-painter.js +13 -0
  208. package/dist/src/pdf/pagination.js +2 -2
  209. package/dist/src/pdf/renderer/box-painter.js +28 -3
  210. package/dist/src/pdf/renderer/page-paint.js +12 -3
  211. package/dist/src/pdf/renderers/radius-utils.js +31 -38
  212. package/dist/src/pdf/renderers/shape-renderer.js +1 -1
  213. package/dist/src/pdf/renderers/shape-utils.js +1 -1
  214. package/dist/src/pdf/renderers/text-renderer.d.ts +9 -1
  215. package/dist/src/pdf/renderers/text-renderer.js +36 -2
  216. package/dist/src/pdf/stacking/build-stacking-contexts.js +1 -2
  217. package/dist/src/pdf/stacking/resolve-paint-order.d.ts +5 -6
  218. package/dist/src/pdf/stacking/resolve-paint-order.js +29 -9
  219. package/dist/src/pdf/stacking/types.d.ts +14 -0
  220. package/dist/src/pdf/svg/shape-renderer.js +47 -20
  221. package/dist/src/pdf/types.d.ts +7 -1
  222. package/dist/src/pdf/utils/border-radius-utils.js +31 -38
  223. package/dist/src/pdf/utils/color-utils.js +17 -2
  224. package/dist/src/pdf/utils/filter-utils.d.ts +29 -0
  225. package/dist/src/pdf/utils/filter-utils.js +85 -0
  226. package/dist/src/pdf/utils/node-text-run-factory.js +1 -1
  227. package/dist/src/pdf/utils/text-layout-adjuster.d.ts +0 -8
  228. package/dist/src/pdf/utils/text-layout-adjuster.js +12 -9
  229. package/dist/src/shim/css-browser.d.ts +14 -9
  230. package/dist/src/shim/css-browser.js +50 -39
  231. package/dist/src/units/units.d.ts +1 -1
  232. package/dist/tests/css/box-sizing.spec.d.ts +1 -0
  233. package/dist/tests/css/box-sizing.spec.js +46 -0
  234. package/dist/tests/css/calc-parser.spec.d.ts +1 -0
  235. package/dist/tests/css/calc-parser.spec.js +68 -0
  236. package/dist/tests/css/container-query-units.spec.d.ts +1 -0
  237. package/dist/tests/css/container-query-units.spec.js +64 -0
  238. package/dist/tests/css/content-parser.spec.js +13 -0
  239. package/dist/tests/css/filter-parser.spec.d.ts +1 -0
  240. package/dist/tests/css/filter-parser.spec.js +116 -0
  241. package/dist/tests/css/flex-shorthand.spec.d.ts +1 -0
  242. package/dist/tests/css/flex-shorthand.spec.js +45 -0
  243. package/dist/tests/css/grid-clamp.spec.d.ts +1 -0
  244. package/dist/tests/css/grid-clamp.spec.js +82 -0
  245. package/dist/tests/css/parse-css-pseudo.spec.d.ts +1 -0
  246. package/dist/tests/css/parse-css-pseudo.spec.js +26 -0
  247. package/dist/tests/helpers/render-utils.d.ts +18 -2
  248. package/dist/tests/helpers/render-utils.js +25 -12
  249. package/dist/tests/html/dom-converter-pseudo-elements.spec.d.ts +1 -0
  250. package/dist/tests/html/dom-converter-pseudo-elements.spec.js +33 -0
  251. package/dist/tests/html/dom-converter-text.spec.d.ts +1 -0
  252. package/dist/tests/html/dom-converter-text.spec.js +67 -0
  253. package/dist/tests/image/png-backend.spec.d.ts +1 -0
  254. package/dist/tests/image/png-backend.spec.js +34 -0
  255. package/dist/tests/layout/box-sizing.spec.d.ts +1 -0
  256. package/dist/tests/layout/box-sizing.spec.js +75 -0
  257. package/dist/tests/layout/calc-padding.spec.d.ts +1 -0
  258. package/dist/tests/layout/calc-padding.spec.js +19 -0
  259. package/dist/tests/layout/container-query-units.spec.d.ts +1 -0
  260. package/dist/tests/layout/container-query-units.spec.js +24 -0
  261. package/dist/tests/layout/flex-auto-height.spec.d.ts +1 -0
  262. package/dist/tests/layout/flex-auto-height.spec.js +35 -0
  263. package/dist/tests/layout/flex-wrap-cards.spec.d.ts +1 -0
  264. package/dist/tests/layout/flex-wrap-cards.spec.js +16 -0
  265. package/dist/tests/layout/flex-wrap-grow-align-content.spec.d.ts +1 -0
  266. package/dist/tests/layout/flex-wrap-grow-align-content.spec.js +20 -0
  267. package/dist/tests/layout/grid-clamp-gap.spec.d.ts +1 -0
  268. package/dist/tests/layout/grid-clamp-gap.spec.js +22 -0
  269. package/dist/tests/layout/inline-fragments.spec.js +38 -0
  270. package/dist/tests/layout/paged-body-margin.spec.d.ts +1 -0
  271. package/dist/tests/layout/paged-body-margin.spec.js +92 -0
  272. package/dist/tests/layout/pseudo-counters-generated-content.spec.d.ts +1 -0
  273. package/dist/tests/layout/pseudo-counters-generated-content.spec.js +51 -0
  274. package/dist/tests/layout/responsive-clamp-grid-parity.spec.d.ts +1 -0
  275. package/dist/tests/layout/responsive-clamp-grid-parity.spec.js +75 -0
  276. package/dist/tests/layout/run-placer-baseline.spec.js +13 -11
  277. package/dist/tests/pdf/backdrop-filter-noop.spec.d.ts +1 -0
  278. package/dist/tests/pdf/backdrop-filter-noop.spec.js +140 -0
  279. package/dist/tests/pdf/filter-drop-shadow.spec.d.ts +1 -0
  280. package/dist/tests/pdf/filter-drop-shadow.spec.js +74 -0
  281. package/dist/tests/pdf/filter-opacity.spec.d.ts +1 -0
  282. package/dist/tests/pdf/filter-opacity.spec.js +30 -0
  283. package/dist/tests/pdf/font-subset-registry-key.spec.d.ts +1 -0
  284. package/dist/tests/pdf/font-subset-registry-key.spec.js +66 -0
  285. package/dist/tests/pdf/header-footer-clip-overflow.spec.d.ts +1 -0
  286. package/dist/tests/pdf/header-footer-clip-overflow.spec.js +45 -0
  287. package/dist/tests/pdf/selawik-opt-in.spec.d.ts +1 -0
  288. package/dist/tests/pdf/selawik-opt-in.spec.js +106 -0
  289. package/dist/tests/pdf/system-ui-fallback-subset-regression.spec.d.ts +1 -0
  290. package/dist/tests/pdf/system-ui-fallback-subset-regression.spec.js +39 -0
  291. package/dist/tests/pdf/text-renderer-fallback.spec.js +55 -0
  292. package/dist/tests/pdf/text-transform-matrix.spec.js +8 -7
  293. package/package.json +2 -2
@@ -0,0 +1,14 @@
1
+ import type { FilterFunction } from "../properties/visual.js";
2
+ import type { StyleAccumulator } from "../style.js";
3
+ export declare function parseFilter(value: string, target: StyleAccumulator): void;
4
+ export declare function parseBackdropFilter(value: string, target: StyleAccumulator): void;
5
+ /**
6
+ * Parseia a string completa do valor de filter/backdrop-filter.
7
+ * Retorna `undefined` para keywords de herança (inherit/revert),
8
+ * `[]` para `none`/`initial`, ou a lista de funções parseadas.
9
+ *
10
+ * A separação de funções NÃO usa splitCssCommaList — no CSS filter,
11
+ * as funções são separadas por espaço, e os parênteses delimitam
12
+ * cada função. Usamos regex para extrair cada `name(...)`.
13
+ */
14
+ export declare function parseFilterList(value: string): FilterFunction[] | undefined;
@@ -0,0 +1,255 @@
1
+ // src/css/parsers/filter-parser.ts
2
+ import { splitCssList } from "../utils.js";
3
+ import { parseLength } from "./length-parser.js";
4
+ // ── Funções expostas ao registro ────────────────────────────────────
5
+ export function parseFilter(value, target) {
6
+ const result = parseFilterList(value);
7
+ if (result !== undefined) {
8
+ target.filter = result;
9
+ }
10
+ }
11
+ export function parseBackdropFilter(value, target) {
12
+ const result = parseFilterList(value);
13
+ if (result !== undefined) {
14
+ target.backdropFilter = result;
15
+ }
16
+ }
17
+ // ── Lógica de parsing ───────────────────────────────────────────────
18
+ /**
19
+ * Parseia a string completa do valor de filter/backdrop-filter.
20
+ * Retorna `undefined` para keywords de herança (inherit/revert),
21
+ * `[]` para `none`/`initial`, ou a lista de funções parseadas.
22
+ *
23
+ * A separação de funções NÃO usa splitCssCommaList — no CSS filter,
24
+ * as funções são separadas por espaço, e os parênteses delimitam
25
+ * cada função. Usamos regex para extrair cada `name(...)`.
26
+ */
27
+ export function parseFilterList(value) {
28
+ const trimmed = value.trim();
29
+ if (!trimmed)
30
+ return undefined;
31
+ const keyword = trimmed.toLowerCase();
32
+ if (keyword === "none" || keyword === "initial")
33
+ return [];
34
+ if (keyword === "inherit" || keyword === "revert" || keyword === "revert-layer")
35
+ return undefined;
36
+ // Regex para extrair funções: captura "name(" e conteúdo até ")"
37
+ // Respeita parênteses aninhados (ex: drop-shadow com rgb(...))
38
+ const functions = extractFilterFunctions(trimmed);
39
+ if (functions.length === 0)
40
+ return undefined;
41
+ const result = [];
42
+ for (const { name, args } of functions) {
43
+ const parsed = parseSingleFilterFunction(name, args);
44
+ if (parsed) {
45
+ result.push(parsed);
46
+ }
47
+ // Funções desconhecidas são silenciosamente ignoradas (spec-compliant)
48
+ }
49
+ return result.length > 0 ? result : undefined;
50
+ }
51
+ /**
52
+ * Extrai funções CSS da string. Trata parênteses aninhados
53
+ * (necessário para `drop-shadow(2px 2px rgba(0,0,0,0.5))`).
54
+ */
55
+ function extractFilterFunctions(input) {
56
+ const results = [];
57
+ let i = 0;
58
+ const len = input.length;
59
+ while (i < len) {
60
+ // Pula espaços
61
+ while (i < len && /\s/.test(input[i]))
62
+ i++;
63
+ if (i >= len)
64
+ break;
65
+ // Lê nome da função
66
+ const nameStart = i;
67
+ while (i < len && input[i] !== "(" && !/\s/.test(input[i]))
68
+ i++;
69
+ if (i >= len || input[i] !== "(")
70
+ break;
71
+ const name = input.slice(nameStart, i).toLowerCase();
72
+ i++; // pula "("
73
+ // Lê argumentos respeitando parênteses aninhados
74
+ let depth = 1;
75
+ const argsStart = i;
76
+ while (i < len && depth > 0) {
77
+ if (input[i] === "(")
78
+ depth++;
79
+ else if (input[i] === ")")
80
+ depth--;
81
+ if (depth > 0)
82
+ i++;
83
+ }
84
+ const args = input.slice(argsStart, i).trim();
85
+ if (depth === 0)
86
+ i++; // pula ")" final
87
+ results.push({ name, args });
88
+ }
89
+ return results;
90
+ }
91
+ // ── Parsing de cada função individual ───────────────────────────────
92
+ const NUMERIC_FILTER_NAMES = new Set([
93
+ "brightness", "contrast", "grayscale", "sepia", "saturate", "invert", "opacity",
94
+ ]);
95
+ // Funções com clamp em [0, 1]
96
+ const CLAMPED_FILTER_NAMES = new Set([
97
+ "grayscale", "sepia", "invert", "opacity",
98
+ ]);
99
+ function parseSingleFilterFunction(name, args) {
100
+ if (NUMERIC_FILTER_NAMES.has(name)) {
101
+ return parseNumericFilter(name, args);
102
+ }
103
+ switch (name) {
104
+ case "blur":
105
+ return parseBlurFilter(args);
106
+ case "hue-rotate":
107
+ return parseHueRotateFilter(args);
108
+ case "drop-shadow":
109
+ return parseDropShadowFilter(args);
110
+ default:
111
+ return null; // função desconhecida
112
+ }
113
+ }
114
+ /**
115
+ * Parseia funções numéricas: `brightness(1.5)`, `opacity(50%)`, etc.
116
+ * - Sem argumento → usa default da spec (1.0 para a maioria).
117
+ * - `%` → dividido por 100.
118
+ * - Clamp para funções com domínio [0,1].
119
+ * - Clamp ≥ 0 para brightness/contrast/saturate.
120
+ */
121
+ function parseNumericFilter(kind, args) {
122
+ const trimmed = args.trim();
123
+ let value;
124
+ if (trimmed === "") {
125
+ // Spec: sem argumento usa o default (equivale a amount máximo para efeito completo)
126
+ // brightness/contrast/saturate default = 1; grayscale/sepia/invert/opacity default = 1
127
+ value = 1;
128
+ }
129
+ else if (trimmed.endsWith("%")) {
130
+ const percentStr = trimmed.slice(0, -1);
131
+ const percent = parseFloat(percentStr);
132
+ if (isNaN(percent))
133
+ return null;
134
+ value = percent / 100;
135
+ }
136
+ else {
137
+ value = parseFloat(trimmed);
138
+ if (isNaN(value))
139
+ return null;
140
+ }
141
+ // Clamp conforme domínio
142
+ if (CLAMPED_FILTER_NAMES.has(kind)) {
143
+ value = Math.max(0, Math.min(1, value));
144
+ }
145
+ else {
146
+ // brightness, contrast, saturate: ≥ 0, sem limite superior
147
+ value = Math.max(0, value);
148
+ }
149
+ return { kind, value };
150
+ }
151
+ /**
152
+ * Parseia `blur(<length>)`.
153
+ * - Sem argumento → `blur(0px)`.
154
+ * - Valor negativo → inválido (descartado).
155
+ */
156
+ function parseBlurFilter(args) {
157
+ const trimmed = args.trim();
158
+ if (trimmed === "") {
159
+ return { kind: "blur", value: 0 };
160
+ }
161
+ const length = parseLength(trimmed);
162
+ if (length === undefined)
163
+ return null;
164
+ // Blur não aceita valor negativo
165
+ if (typeof length === "number" && length < 0)
166
+ return null;
167
+ return { kind: "blur", value: length };
168
+ }
169
+ /**
170
+ * Parseia `hue-rotate(<angle>)`.
171
+ * - Sem argumento → `0deg`.
172
+ * - Suporta `deg`, `rad`, `grad`, `turn`.
173
+ * - Valores negativos são permitidos (rotação anti-horária).
174
+ */
175
+ function parseHueRotateFilter(args) {
176
+ const trimmed = args.trim();
177
+ if (trimmed === "") {
178
+ return { kind: "hue-rotate", valueDeg: 0 };
179
+ }
180
+ const deg = parseAngleToDeg(trimmed);
181
+ if (deg === null)
182
+ return null;
183
+ return { kind: "hue-rotate", valueDeg: deg };
184
+ }
185
+ function parseAngleToDeg(input) {
186
+ const lower = input.toLowerCase();
187
+ if (lower.endsWith("deg")) {
188
+ const v = parseFloat(lower.slice(0, -3));
189
+ return isNaN(v) ? null : v;
190
+ }
191
+ if (lower.endsWith("rad")) {
192
+ const v = parseFloat(lower.slice(0, -3));
193
+ return isNaN(v) ? null : v * (180 / Math.PI);
194
+ }
195
+ if (lower.endsWith("grad")) {
196
+ const v = parseFloat(lower.slice(0, -4));
197
+ return isNaN(v) ? null : v * 0.9;
198
+ }
199
+ if (lower.endsWith("turn")) {
200
+ const v = parseFloat(lower.slice(0, -4));
201
+ return isNaN(v) ? null : v * 360;
202
+ }
203
+ // Número sem unidade: a spec trata "0" como 0deg, outros são inválidos
204
+ const v = parseFloat(lower);
205
+ if (isNaN(v))
206
+ return null;
207
+ if (v === 0)
208
+ return 0;
209
+ return null; // spec exige unidade para valores != 0
210
+ }
211
+ /**
212
+ * Parseia `drop-shadow(<offset-x> <offset-y> [<blur-radius>]? [<color>]?)`.
213
+ * Mesma lógica do `parseSingleBoxShadow`, mas SEM `inset` e SEM `spread-radius`.
214
+ * Reutiliza `splitCssList` e `parseLength` do projeto.
215
+ */
216
+ function parseDropShadowFilter(args) {
217
+ const tokens = splitCssList(args);
218
+ if (tokens.length < 2)
219
+ return null;
220
+ const lengths = [];
221
+ let color;
222
+ for (const token of tokens) {
223
+ const length = parseLength(token);
224
+ if (length !== undefined) {
225
+ lengths.push(length);
226
+ continue;
227
+ }
228
+ if (color === undefined && isColorLike(token)) {
229
+ color = token;
230
+ continue;
231
+ }
232
+ // Token desconhecido ignorado
233
+ }
234
+ if (lengths.length < 2)
235
+ return null;
236
+ return {
237
+ kind: "drop-shadow",
238
+ offsetX: lengths[0],
239
+ offsetY: lengths[1],
240
+ blurRadius: lengths[2] ?? 0,
241
+ color,
242
+ };
243
+ }
244
+ function isColorLike(value) {
245
+ const lower = value.toLowerCase();
246
+ if (lower.startsWith("#") || lower.startsWith("rgb(") || lower.startsWith("rgba(") ||
247
+ lower.startsWith("hsl(") || lower.startsWith("hsla(")) {
248
+ return true;
249
+ }
250
+ const colorNames = [
251
+ "transparent", "black", "white", "red", "green", "blue",
252
+ "yellow", "gray", "grey", "currentcolor",
253
+ ];
254
+ return colorNames.includes(lower);
255
+ }
@@ -4,4 +4,5 @@ export declare function parseGridTemplateRows(value: string, target: StyleAccumu
4
4
  export declare function parseGridAutoFlow(value: string, target: StyleAccumulator): void;
5
5
  export declare function parseGap(value: string, target: StyleAccumulator): void;
6
6
  export declare function parseRowGap(value: string, target: StyleAccumulator): void;
7
+ export declare function parseGridColumn(value: string, target: StyleAccumulator): void;
7
8
  export declare function parseColumnGap(value: string, target: StyleAccumulator): void;
@@ -1,6 +1,6 @@
1
1
  // src/css/parsers/grid-parser-extended.ts
2
2
  import { parseGap as parseGapValue, parseGridTemplate } from "./grid-parser.js";
3
- import { parseLength } from "./length-parser.js";
3
+ import { parseClampArgs, parseLength } from "./length-parser.js";
4
4
  export function parseGridTemplateColumns(value, target) {
5
5
  const parsed = parseGridTemplate(value);
6
6
  if (parsed) {
@@ -37,11 +37,50 @@ export function parseRowGap(value, target) {
37
37
  const parsed = parseLength(value);
38
38
  if (parsed !== undefined) {
39
39
  target.rowGap = parsed;
40
+ return;
41
+ }
42
+ const clampArgs = parseClampArgs(value);
43
+ if (clampArgs) {
44
+ const min = parseLength(clampArgs[0]);
45
+ const preferred = parseLength(clampArgs[1]);
46
+ const max = parseLength(clampArgs[2]);
47
+ if (min !== undefined && preferred !== undefined && max !== undefined) {
48
+ const clampValue = { kind: "clamp", min, preferred, max };
49
+ target.rowGap = clampValue;
50
+ }
51
+ }
52
+ }
53
+ export function parseGridColumn(value, target) {
54
+ const trimmed = value.trim().toLowerCase();
55
+ // Handle "span N" pattern
56
+ const spanMatch = trimmed.match(/^span\s+(\d+)$/);
57
+ if (spanMatch) {
58
+ const span = Number.parseInt(spanMatch[1], 10);
59
+ if (Number.isFinite(span) && span > 0) {
60
+ target.gridColumnSpan = span;
61
+ return;
62
+ }
63
+ }
64
+ // Handle plain integer (line number, treat as span 1)
65
+ const num = Number.parseInt(trimmed, 10);
66
+ if (Number.isFinite(num) && num > 0) {
67
+ target.gridColumnSpan = 1;
40
68
  }
41
69
  }
42
70
  export function parseColumnGap(value, target) {
43
71
  const parsed = parseLength(value);
44
72
  if (parsed !== undefined) {
45
73
  target.columnGap = parsed;
74
+ return;
75
+ }
76
+ const clampArgs = parseClampArgs(value);
77
+ if (clampArgs) {
78
+ const min = parseLength(clampArgs[0]);
79
+ const preferred = parseLength(clampArgs[1]);
80
+ const max = parseLength(clampArgs[2]);
81
+ if (min !== undefined && preferred !== undefined && max !== undefined) {
82
+ const clampValue = { kind: "clamp", min, preferred, max };
83
+ target.columnGap = clampValue;
84
+ }
46
85
  }
47
86
  }
@@ -1,6 +1,9 @@
1
1
  import type { TrackDefinitionInput, NumericLength } from "../style.js";
2
+ import type { ClampNumericLength } from "../length.js";
3
+ type GapLengthInput = NumericLength | ClampNumericLength;
2
4
  export declare function parseGridTemplate(value: string): TrackDefinitionInput[] | undefined;
3
5
  export declare function parseGap(value: string): {
4
- row: NumericLength;
5
- column: NumericLength;
6
+ row: GapLengthInput;
7
+ column: GapLengthInput;
6
8
  } | undefined;
9
+ export {};
@@ -1,4 +1,4 @@
1
- import { parseLength } from "./length-parser.js";
1
+ import { parseClampArgs, parseLength } from "./length-parser.js";
2
2
  function tokenizeTrackList(value) {
3
3
  const tokens = [];
4
4
  let buffer = "";
@@ -29,6 +29,36 @@ function tokenizeTrackList(value) {
29
29
  }
30
30
  return tokens;
31
31
  }
32
+ function tokenizeSpaceSeparated(value) {
33
+ const tokens = [];
34
+ let buffer = "";
35
+ let depth = 0;
36
+ for (let i = 0; i < value.length; i++) {
37
+ const char = value[i];
38
+ if (char === "(") {
39
+ depth += 1;
40
+ buffer += char;
41
+ continue;
42
+ }
43
+ if (char === ")") {
44
+ depth = Math.max(0, depth - 1);
45
+ buffer += char;
46
+ continue;
47
+ }
48
+ if (/\s/.test(char) && depth === 0) {
49
+ if (buffer) {
50
+ tokens.push(buffer.trim());
51
+ buffer = "";
52
+ }
53
+ continue;
54
+ }
55
+ buffer += char;
56
+ }
57
+ if (buffer) {
58
+ tokens.push(buffer.trim());
59
+ }
60
+ return tokens;
61
+ }
32
62
  function splitArgs(value) {
33
63
  const args = [];
34
64
  let buffer = "";
@@ -107,6 +137,21 @@ function parseTrackSize(token) {
107
137
  if (normalized === "auto") {
108
138
  return { kind: "auto" };
109
139
  }
140
+ const clampArgs = parseClampArgs(token);
141
+ if (clampArgs) {
142
+ const min = parseLength(clampArgs[0]);
143
+ const preferred = parseLength(clampArgs[1]);
144
+ const max = parseLength(clampArgs[2]);
145
+ if (min !== undefined && preferred !== undefined && max !== undefined) {
146
+ const track = {
147
+ kind: "clamp",
148
+ min,
149
+ preferred,
150
+ max,
151
+ };
152
+ return track;
153
+ }
154
+ }
110
155
  const length = parseLength(normalized);
111
156
  if (length !== undefined) {
112
157
  return { kind: "fixed", size: length };
@@ -164,22 +209,41 @@ export function parseGridTemplate(value) {
164
209
  }
165
210
  return tracks;
166
211
  }
212
+ function parseGapLengthValue(value) {
213
+ const parsed = parseLength(value);
214
+ if (parsed !== undefined) {
215
+ return parsed;
216
+ }
217
+ const clampArgs = parseClampArgs(value);
218
+ if (!clampArgs) {
219
+ return undefined;
220
+ }
221
+ const min = parseLength(clampArgs[0]);
222
+ const preferred = parseLength(clampArgs[1]);
223
+ const max = parseLength(clampArgs[2]);
224
+ if (min === undefined || preferred === undefined || max === undefined) {
225
+ return undefined;
226
+ }
227
+ return {
228
+ kind: "clamp",
229
+ min,
230
+ preferred,
231
+ max,
232
+ };
233
+ }
167
234
  export function parseGap(value) {
168
235
  if (!value) {
169
236
  return undefined;
170
237
  }
171
- const tokens = value
172
- .split(/\s+/)
173
- .map((token) => token.trim())
174
- .filter((token) => token.length > 0);
238
+ const tokens = tokenizeSpaceSeparated(value.trim());
175
239
  if (tokens.length === 0) {
176
240
  return undefined;
177
241
  }
178
- const first = parseLength(tokens[0]);
242
+ const first = parseGapLengthValue(tokens[0]);
179
243
  if (first === undefined) {
180
244
  return undefined;
181
245
  }
182
- const second = tokens.length > 1 ? parseLength(tokens[1]) : undefined;
246
+ const second = tokens.length > 1 ? parseGapLengthValue(tokens[1]) : undefined;
183
247
  return {
184
248
  row: first,
185
249
  column: second ?? first,
@@ -1,5 +1,10 @@
1
- import { percent, type RelativeLength } from "../length.js";
1
+ import { percent, type CalcLength, type LengthInput, type RelativeLength } from "../length.js";
2
2
  export declare function parseLength(value: string): number | RelativeLength | undefined;
3
3
  export declare function parseNumeric(value: string): number | RelativeLength | undefined;
4
- export declare function parseLengthOrPercent(value: string): number | RelativeLength | ReturnType<typeof percent> | undefined;
5
- export declare function parseLengthOrAuto(value: string): number | RelativeLength | "auto" | undefined;
4
+ export declare function parseLengthOrPercent(value: string): number | RelativeLength | ReturnType<typeof percent> | CalcLength | undefined;
5
+ /**
6
+ * Extract the three arguments from a CSS clamp() function.
7
+ * Returns [min, preferred, max] strings or undefined if not a clamp value.
8
+ */
9
+ export declare function parseClampArgs(value: string): [string, string, string] | undefined;
10
+ export declare function parseLengthOrAuto(value: string): LengthInput | undefined;
@@ -2,7 +2,9 @@
2
2
  import { cmToPx, inToPx, mmToPx, pcToPx, ptToPx, qToPx } from "../../units/units.js";
3
3
  import { getViewportHeight, getViewportWidth } from "../viewport.js";
4
4
  import { percent, relativeLength } from "../length.js";
5
+ import { parseCalcLength } from "./calc-parser.js";
5
6
  const PERCENT_LENGTH_REGEX = /^(-?\d+(?:\.\d+)?)%$/;
7
+ const CONTAINER_QUERY_LENGTH_REGEX = /^(-?\d+(?:\.\d+)?)(cqw|cqh|cqi|cqb|cqmin|cqmax)$/i;
6
8
  export function parseLength(value) {
7
9
  if (!value) {
8
10
  return undefined;
@@ -69,7 +71,32 @@ export function parseLengthOrPercent(value) {
69
71
  }
70
72
  const match = PERCENT_LENGTH_REGEX.exec(value.trim());
71
73
  if (!match) {
72
- return undefined;
74
+ const cqMatch = CONTAINER_QUERY_LENGTH_REGEX.exec(value.trim());
75
+ if (cqMatch) {
76
+ const numeric = Number.parseFloat(cqMatch[1]);
77
+ if (Number.isNaN(numeric)) {
78
+ return undefined;
79
+ }
80
+ const ratio = numeric / 100;
81
+ const unit = cqMatch[2].toLowerCase();
82
+ switch (unit) {
83
+ case "cqw":
84
+ return { kind: "calc", px: 0, percent: 0, cqw: ratio };
85
+ case "cqh":
86
+ return { kind: "calc", px: 0, percent: 0, cqh: ratio };
87
+ case "cqi":
88
+ return { kind: "calc", px: 0, percent: 0, cqi: ratio };
89
+ case "cqb":
90
+ return { kind: "calc", px: 0, percent: 0, cqb: ratio };
91
+ case "cqmin":
92
+ return { kind: "calc", px: 0, percent: 0, cqmin: ratio };
93
+ case "cqmax":
94
+ return { kind: "calc", px: 0, percent: 0, cqmax: ratio };
95
+ default:
96
+ return undefined;
97
+ }
98
+ }
99
+ return parseCalcLength(value);
73
100
  }
74
101
  const numeric = Number.parseFloat(match[1]);
75
102
  if (Number.isNaN(numeric)) {
@@ -77,6 +104,22 @@ export function parseLengthOrPercent(value) {
77
104
  }
78
105
  return percent(numeric / 100);
79
106
  }
107
+ /**
108
+ * Extract the three arguments from a CSS clamp() function.
109
+ * Returns [min, preferred, max] strings or undefined if not a clamp value.
110
+ */
111
+ export function parseClampArgs(value) {
112
+ const trimmed = value.trim();
113
+ if (!trimmed.toLowerCase().startsWith("clamp(") || !trimmed.endsWith(")")) {
114
+ return undefined;
115
+ }
116
+ const inner = trimmed.slice(6, -1);
117
+ const parts = inner.split(",");
118
+ if (parts.length !== 3) {
119
+ return undefined;
120
+ }
121
+ return [parts[0].trim(), parts[1].trim(), parts[2].trim()];
122
+ }
80
123
  export function parseLengthOrAuto(value) {
81
124
  if (!value) {
82
125
  return undefined;
@@ -85,5 +128,5 @@ export function parseLengthOrAuto(value) {
85
128
  if (normalized === "auto") {
86
129
  return "auto";
87
130
  }
88
- return parseLength(normalized);
131
+ return parseLengthOrPercent(normalized);
89
132
  }
@@ -1,8 +1,8 @@
1
1
  // src/css/parsers/margin-block-parser.ts
2
- import { parseLength } from "./length-parser.js";
2
+ import { parseLengthOrAuto } from "./length-parser.js";
3
3
  export function parseMarginBlockStart(value, target) {
4
- target.marginTop = parseLength(value) ?? target.marginTop;
4
+ target.marginTop = parseLengthOrAuto(value) ?? target.marginTop;
5
5
  }
6
6
  export function parseMarginBlockEnd(value, target) {
7
- target.marginBottom = parseLength(value) ?? target.marginBottom;
7
+ target.marginBottom = parseLengthOrAuto(value) ?? target.marginBottom;
8
8
  }
@@ -1,6 +1,6 @@
1
1
  // src/css/parsers/margin-parser.ts
2
2
  import { applyBoxShorthand } from "../shorthands/box-shorthand.js";
3
- import { parseLength, parseLengthOrAuto } from "./length-parser.js";
3
+ import { parseLengthOrAuto } from "./length-parser.js";
4
4
  export function parseMargin(value, target) {
5
5
  applyBoxShorthand(value, (top, right, bottom, left) => {
6
6
  target.marginTop = top;
@@ -10,13 +10,13 @@ export function parseMargin(value, target) {
10
10
  });
11
11
  }
12
12
  export function parseMarginTop(value, target) {
13
- target.marginTop = parseLength(value) ?? target.marginTop;
13
+ target.marginTop = parseLengthOrAuto(value) ?? target.marginTop;
14
14
  }
15
15
  export function parseMarginRight(value, target) {
16
16
  target.marginRight = parseLengthOrAuto(value) ?? target.marginRight;
17
17
  }
18
18
  export function parseMarginBottom(value, target) {
19
- target.marginBottom = parseLength(value) ?? target.marginBottom;
19
+ target.marginBottom = parseLengthOrAuto(value) ?? target.marginBottom;
20
20
  }
21
21
  export function parseMarginLeft(value, target) {
22
22
  target.marginLeft = parseLengthOrAuto(value) ?? target.marginLeft;
@@ -1,8 +1,8 @@
1
1
  // src/css/parsers/padding-block-parser.ts
2
- import { parseLength } from "./length-parser.js";
2
+ import { parseLengthOrPercent } from "./length-parser.js";
3
3
  export function parsePaddingBlockStart(value, target) {
4
- target.paddingTop = parseLength(value) ?? target.paddingTop;
4
+ target.paddingTop = parseLengthOrPercent(value) ?? target.paddingTop;
5
5
  }
6
6
  export function parsePaddingBlockEnd(value, target) {
7
- target.paddingBottom = parseLength(value) ?? target.paddingBottom;
7
+ target.paddingBottom = parseLengthOrPercent(value) ?? target.paddingBottom;
8
8
  }
@@ -1,8 +1,8 @@
1
1
  // src/css/parsers/padding-inline-parser.ts
2
- import { parseLength } from "./length-parser.js";
2
+ import { parseLengthOrPercent } from "./length-parser.js";
3
3
  export function parsePaddingInlineStart(value, target) {
4
- target.paddingLeft = parseLength(value) ?? target.paddingLeft;
4
+ target.paddingLeft = parseLengthOrPercent(value) ?? target.paddingLeft;
5
5
  }
6
6
  export function parsePaddingInlineEnd(value, target) {
7
- target.paddingRight = parseLength(value) ?? target.paddingRight;
7
+ target.paddingRight = parseLengthOrPercent(value) ?? target.paddingRight;
8
8
  }
@@ -1,23 +1,23 @@
1
1
  // src/css/parsers/padding-parser.ts
2
2
  import { applyBoxShorthand } from "../shorthands/box-shorthand.js";
3
- import { parseLength } from "./length-parser.js";
3
+ import { parseLengthOrPercent } from "./length-parser.js";
4
4
  export function parsePadding(value, target) {
5
5
  applyBoxShorthand(value, (top, right, bottom, left) => {
6
6
  target.paddingTop = top;
7
7
  target.paddingRight = right;
8
8
  target.paddingBottom = bottom;
9
9
  target.paddingLeft = left;
10
- }, parseLength);
10
+ }, parseLengthOrPercent);
11
11
  }
12
12
  export function parsePaddingTop(value, target) {
13
- target.paddingTop = parseLength(value) ?? target.paddingTop;
13
+ target.paddingTop = parseLengthOrPercent(value) ?? target.paddingTop;
14
14
  }
15
15
  export function parsePaddingRight(value, target) {
16
- target.paddingRight = parseLength(value) ?? target.paddingRight;
16
+ target.paddingRight = parseLengthOrPercent(value) ?? target.paddingRight;
17
17
  }
18
18
  export function parsePaddingBottom(value, target) {
19
- target.paddingBottom = parseLength(value) ?? target.paddingBottom;
19
+ target.paddingBottom = parseLengthOrPercent(value) ?? target.paddingBottom;
20
20
  }
21
21
  export function parsePaddingLeft(value, target) {
22
- target.paddingLeft = parseLength(value) ?? target.paddingLeft;
22
+ target.paddingLeft = parseLengthOrPercent(value) ?? target.paddingLeft;
23
23
  }
@@ -1,27 +1,7 @@
1
1
  import { Position } from "../enums.js";
2
- import { percent } from "../length.js";
3
- import { parseLength } from "./length-parser.js";
4
- const PERCENT_LENGTH_REGEX = /^(-?\d+(?:\.\d+)?)%$/;
2
+ import { parseLengthOrAuto } from "./length-parser.js";
5
3
  function parseLengthLike(value) {
6
- const trimmed = value.trim();
7
- if (!trimmed) {
8
- return undefined;
9
- }
10
- if (trimmed.toLowerCase() === "auto") {
11
- return "auto";
12
- }
13
- const parsed = parseLength(trimmed);
14
- if (parsed !== undefined) {
15
- return parsed;
16
- }
17
- const percentMatch = PERCENT_LENGTH_REGEX.exec(trimmed);
18
- if (percentMatch) {
19
- const numeric = Number.parseFloat(percentMatch[1]);
20
- if (!Number.isNaN(numeric)) {
21
- return percent(numeric / 100);
22
- }
23
- }
24
- return undefined;
4
+ return parseLengthOrAuto(value);
25
5
  }
26
6
  export function parsePosition(value, target) {
27
7
  const normalized = value.trim().toLowerCase();