pagyra-js 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (540) hide show
  1. package/.eslintrc.json +30 -0
  2. package/CHANGELOG.md +13 -0
  3. package/README.md +275 -0
  4. package/UA_Styles_Chromium.md +93 -0
  5. package/_ext/woff2_conversion/brotli-decode.d.ts +139 -0
  6. package/_ext/woff2_conversion/brotli-encode.d.ts +129 -0
  7. package/_ext/woff2_conversion/brotli-port.d.ts +12 -0
  8. package/_ext/woff2_conversion/brotli-shared-dictionary.d.ts +25 -0
  9. package/_ext/woff2_conversion/brotli-types.d.ts +15 -0
  10. package/_ext/woff2_conversion/woff2-common.d.ts +37 -0
  11. package/_ext/woff2_conversion/woff2-decode.d.ts +32 -0
  12. package/_ext/woff2_conversion/woff2-encode.d.ts +31 -0
  13. package/_ext/woff2_conversion/woff2-output.d.ts +39 -0
  14. package/_ext/woff2_original_cpp/brotli/brotli.c +1559 -0
  15. package/_ext/woff2_original_cpp/brotli/brotli.md +116 -0
  16. package/_ext/woff2_original_cpp/brotli/decode.h +409 -0
  17. package/_ext/woff2_original_cpp/brotli/encode.h +505 -0
  18. package/_ext/woff2_original_cpp/brotli/port.h +302 -0
  19. package/_ext/woff2_original_cpp/brotli/shared_dictionary.h +100 -0
  20. package/_ext/woff2_original_cpp/brotli/types.h +83 -0
  21. package/_ext/woff2_original_cpp/cmake/FindBrotliDec.cmake +35 -0
  22. package/_ext/woff2_original_cpp/cmake/FindBrotliEnc.cmake +35 -0
  23. package/_ext/woff2_original_cpp/include/woff2/decode.h +36 -0
  24. package/_ext/woff2_original_cpp/include/woff2/encode.h +43 -0
  25. package/_ext/woff2_original_cpp/include/woff2/output.h +86 -0
  26. package/_ext/woff2_original_cpp/src/buffer.h +164 -0
  27. package/_ext/woff2_original_cpp/src/convert_woff2ttf_fuzzer.cc +13 -0
  28. package/_ext/woff2_original_cpp/src/convert_woff2ttf_fuzzer_new_entry.cc +12 -0
  29. package/_ext/woff2_original_cpp/src/file.h +30 -0
  30. package/_ext/woff2_original_cpp/src/font.cc +400 -0
  31. package/_ext/woff2_original_cpp/src/font.h +105 -0
  32. package/_ext/woff2_original_cpp/src/glyph.cc +383 -0
  33. package/_ext/woff2_original_cpp/src/glyph.h +71 -0
  34. package/_ext/woff2_original_cpp/src/normalize.cc +314 -0
  35. package/_ext/woff2_original_cpp/src/normalize.h +39 -0
  36. package/_ext/woff2_original_cpp/src/port.h +66 -0
  37. package/_ext/woff2_original_cpp/src/round.h +27 -0
  38. package/_ext/woff2_original_cpp/src/store_bytes.h +55 -0
  39. package/_ext/woff2_original_cpp/src/table_tags.cc +82 -0
  40. package/_ext/woff2_original_cpp/src/table_tags.h +30 -0
  41. package/_ext/woff2_original_cpp/src/transform.cc +430 -0
  42. package/_ext/woff2_original_cpp/src/transform.h +26 -0
  43. package/_ext/woff2_original_cpp/src/variable_length.cc +129 -0
  44. package/_ext/woff2_original_cpp/src/variable_length.h +30 -0
  45. package/_ext/woff2_original_cpp/src/woff2_common.cc +50 -0
  46. package/_ext/woff2_original_cpp/src/woff2_common.h +64 -0
  47. package/_ext/woff2_original_cpp/src/woff2_compress.cc +43 -0
  48. package/_ext/woff2_original_cpp/src/woff2_dec.cc +1398 -0
  49. package/_ext/woff2_original_cpp/src/woff2_decompress.cc +41 -0
  50. package/_ext/woff2_original_cpp/src/woff2_enc.cc +458 -0
  51. package/_ext/woff2_original_cpp/src/woff2_info.cc +142 -0
  52. package/_ext/woff2_original_cpp/src/woff2_out.cc +63 -0
  53. package/assets/fonts/ttf/arimo/Arimo-Bold.ttf +0 -0
  54. package/assets/fonts/ttf/arimo/Arimo-BoldItalic.ttf +0 -0
  55. package/assets/fonts/ttf/arimo/Arimo-Italic.ttf +0 -0
  56. package/assets/fonts/ttf/arimo/Arimo-Regular.ttf +0 -0
  57. package/assets/fonts/ttf/cinzeldecorative/CinzelDecorative-Black.ttf +0 -0
  58. package/assets/fonts/ttf/cinzeldecorative/CinzelDecorative-Bold.ttf +0 -0
  59. package/assets/fonts/ttf/cinzeldecorative/CinzelDecorative-Regular.ttf +0 -0
  60. package/assets/fonts/ttf/dejavu/DejaVuSans.ttf +0 -0
  61. package/assets/fonts/ttf/firecode/FiraCode-Bold.ttf +0 -0
  62. package/assets/fonts/ttf/firecode/FiraCode-Light.ttf +0 -0
  63. package/assets/fonts/ttf/firecode/FiraCode-Medium.ttf +0 -0
  64. package/assets/fonts/ttf/firecode/FiraCode-Regular.ttf +0 -0
  65. package/assets/fonts/ttf/firecode/FiraCode-SemiBold.ttf +0 -0
  66. package/assets/fonts/ttf/notoemoji/NotoEmoji-Bold.ttf +0 -0
  67. package/assets/fonts/ttf/notoemoji/NotoEmoji-Light.ttf +0 -0
  68. package/assets/fonts/ttf/notoemoji/NotoEmoji-Medium.ttf +0 -0
  69. package/assets/fonts/ttf/notoemoji/NotoEmoji-Regular.ttf +0 -0
  70. package/assets/fonts/ttf/notoemoji/NotoEmoji-SemiBold.ttf +0 -0
  71. package/assets/fonts/ttf/notosans/NotoSans-Regular.ttf +0 -0
  72. package/assets/fonts/ttf/roboto/Roboto-Bold.ttf +0 -0
  73. package/assets/fonts/ttf/roboto/Roboto-BoldItalic.ttf +0 -0
  74. package/assets/fonts/ttf/roboto/Roboto-Italic.ttf +0 -0
  75. package/assets/fonts/ttf/roboto/Roboto-Regular.ttf +0 -0
  76. package/assets/fonts/ttf/stixtwomath/STIXTwoMath-Regular.ttf +0 -0
  77. package/assets/fonts/ttf/tinos/Tinos-Bold.ttf +0 -0
  78. package/assets/fonts/ttf/tinos/Tinos-BoldItalic.ttf +0 -0
  79. package/assets/fonts/ttf/tinos/Tinos-Italic.ttf +0 -0
  80. package/assets/fonts/ttf/tinos/Tinos-Regular.ttf +0 -0
  81. package/assets/fonts/woff/lato/lato-latin-400-italic.woff +0 -0
  82. package/assets/fonts/woff/lato/lato-latin-400-normal.woff +0 -0
  83. package/assets/fonts/woff/lato/lato-latin-700-italic.woff +0 -0
  84. package/assets/fonts/woff/lato/lato-latin-700-normal.woff +0 -0
  85. package/assets/fonts/woff2/caveat/Caveat-Bold.woff2 +0 -0
  86. package/assets/fonts/woff2/caveat/Caveat-Regular.woff2 +0 -0
  87. package/assets/fonts/woff2/lato/lato-latin-400-italic.woff2 +0 -0
  88. package/assets/fonts/woff2/lato/lato-latin-400-normal.woff2 +0 -0
  89. package/assets/fonts/woff2/lato/lato-latin-700-italic.woff2 +0 -0
  90. package/assets/fonts/woff2/lato/lato-latin-700-normal.woff2 +0 -0
  91. package/docs/AGENTS.md +288 -0
  92. package/docs/BACKGROUND-REPEAT-IMPLEMENTATION.md +127 -0
  93. package/docs/BACKGROUND-REPEAT-REFERENCE.md +127 -0
  94. package/docs/BACKGROUND-REPEAT-SPACE-ROUND.md +164 -0
  95. package/docs/css-properties-support.md +256 -0
  96. package/docs/src_modules_table.md +172 -0
  97. package/docs/text-overlap-fix.md +85 -0
  98. package/docs/text-overlap-investigation.md +27 -0
  99. package/eslint.config.js +36 -0
  100. package/glyph_measure.htm +1458 -0
  101. package/package.json +50 -0
  102. package/playground/browser-entry.ts +2 -0
  103. package/playground/exports/background-text-debug.pdf +0 -0
  104. package/playground/public/app.js +875 -0
  105. package/playground/public/assets/1.webp +0 -0
  106. package/playground/public/examples/accents-test.html +24 -0
  107. package/playground/public/examples/advanced-selectors-demo.html +118 -0
  108. package/playground/public/examples/background-advanced-showcase.html +82 -0
  109. package/playground/public/examples/background-clip-text.html +36 -0
  110. package/playground/public/examples/background-origin-showcase.html +137 -0
  111. package/playground/public/examples/background-position-showcase.html +83 -0
  112. package/playground/public/examples/background-repeat-showcase.html +83 -0
  113. package/playground/public/examples/background-repeat-space-round.html +348 -0
  114. package/playground/public/examples/background-size-showcase.html +82 -0
  115. package/playground/public/examples/background-text-debug.html +18 -0
  116. package/playground/public/examples/baseline-test.html +24 -0
  117. package/playground/public/examples/bold-showcase.html +150 -0
  118. package/playground/public/examples/bold-strike-example.html +12 -0
  119. package/playground/public/examples/border-collapse-test.html +23 -0
  120. package/playground/public/examples/centered-shadow-div.html +72 -0
  121. package/playground/public/examples/css-variables.html +50 -0
  122. package/playground/public/examples/debug-accents.html +11 -0
  123. package/playground/public/examples/debug-text-overlap.html +46 -0
  124. package/playground/public/examples/flex-gap-column.html +130 -0
  125. package/playground/public/examples/flex-gap-row.html +137 -0
  126. package/playground/public/examples/flex-padding-test.html +29 -0
  127. package/playground/public/examples/flexbox-text-test.html +193 -0
  128. package/playground/public/examples/fonts-demo.html +126 -0
  129. package/playground/public/examples/footer-example.html +4 -0
  130. package/playground/public/examples/gradient-text.html +54 -0
  131. package/playground/public/examples/grid-gap-demo.html +156 -0
  132. package/playground/public/examples/header-example.html +4 -0
  133. package/playground/public/examples/header-footer-example.html +27 -0
  134. package/playground/public/examples/image-showcase.html +33 -0
  135. package/playground/public/examples/justify-text.html +22 -0
  136. package/playground/public/examples/linear-gradient-example.html +38 -0
  137. package/playground/public/examples/lorem-span.html +14 -0
  138. package/playground/public/examples/margin-block-showcase.html +21 -0
  139. package/playground/public/examples/margin-inline-showcase.html +21 -0
  140. package/playground/public/examples/monthly-summary.html +95 -0
  141. package/playground/public/examples/multi-page-lorem.html +190 -0
  142. package/playground/public/examples/opacity-debug.html +39 -0
  143. package/playground/public/examples/opacity-example.html +70 -0
  144. package/playground/public/examples/png-image-example.html +13 -0
  145. package/playground/public/examples/red-rectangle.html +18 -0
  146. package/playground/public/examples/repro.html +24 -0
  147. package/playground/public/examples/rounded-borders-test.html +24 -0
  148. package/playground/public/examples/simple-list.html +89 -0
  149. package/playground/public/examples/simple-svg.html +37 -0
  150. package/playground/public/examples/simple-table.html +52 -0
  151. package/playground/public/examples/skew-div.html +138 -0
  152. package/playground/public/examples/skew-text.html +21 -0
  153. package/playground/public/examples/starter-report.css +51 -0
  154. package/playground/public/examples/starter-report.html +23 -0
  155. package/playground/public/examples/svg-aspect-ratio-showcase.html +116 -0
  156. package/playground/public/examples/svg-gradients-linear.html +28 -0
  157. package/playground/public/examples/svg-gradients-radial.html +29 -0
  158. package/playground/public/examples/svg-gradients-showcase.html +66 -0
  159. package/playground/public/examples/svg-image-path-test.html +43 -0
  160. package/playground/public/examples/svg-images-clipping.html +27 -0
  161. package/playground/public/examples/svg-path-gallery.html +118 -0
  162. package/playground/public/examples/svg-radial-transform-demo.html +78 -0
  163. package/playground/public/examples/svg-transform-stack.html +103 -0
  164. package/playground/public/examples/svg-transforms-demo.html +127 -0
  165. package/playground/public/examples/table-merge-test.html +34 -0
  166. package/playground/public/examples/text-decoration-showcase.html +138 -0
  167. package/playground/public/examples/text-indent-showcase.html +137 -0
  168. package/playground/public/examples/text-shadow-example.html +29 -0
  169. package/playground/public/examples/very-complex-css.html +293 -0
  170. package/playground/public/examples/webp-example.html +13 -0
  171. package/playground/public/examples/z-index-demo.html +93 -0
  172. package/playground/public/examples.json +240 -0
  173. package/playground/public/images/dice.png +0 -0
  174. package/playground/public/images/duck.jpg +0 -0
  175. package/playground/public/index.html +149 -0
  176. package/playground/public/mode.js +1 -0
  177. package/playground/public/styles.css +382 -0
  178. package/playground/public/tmp-h2-debug.html +33 -0
  179. package/playground/public/tmp-italic-debug.html +32 -0
  180. package/playground/public/vendor/codemirror/codemirror.min.css +1 -0
  181. package/playground/public/vendor/codemirror/codemirror.min.js +1 -0
  182. package/playground/public/vendor/codemirror/css.min.js +1 -0
  183. package/playground/public/vendor/codemirror/darcula.min.css +1 -0
  184. package/playground/public/vendor/codemirror/htmlmixed.min.js +1 -0
  185. package/playground/public/vendor/codemirror/javascript.min.js +1 -0
  186. package/playground/public/vendor/codemirror/xml.min.js +1 -0
  187. package/playground/public/vendor/pagyra-playground-browser.js +165966 -0
  188. package/playground/public/vendor/pagyra-playground-browser.js.map +7 -0
  189. package/playground/server.d.ts +1 -0
  190. package/playground/server.js +68 -0
  191. package/playground/server.ts +128 -0
  192. package/scripts/browser-build.ts +101 -0
  193. package/scripts/build-browser-bundle.ts +52 -0
  194. package/scripts/glyph-comparison/simulate.ts +744 -0
  195. package/scripts/playground-browser-server.ts +57 -0
  196. package/scripts/probe-roboto.ts +6 -0
  197. package/scripts/render-playground-example.ts +121 -0
  198. package/scripts/run-glyph-atlas-tuner-runner.mjs +113 -0
  199. package/scripts/run-glyph-atlas-tuner.ts +141 -0
  200. package/scripts/top-ts-files.ps1 +39 -0
  201. package/scripts/top-ts-files.sh +37 -0
  202. package/scripts/woff2_info.ps1 +132 -0
  203. package/src/browser-entry.ts +14 -0
  204. package/src/compression/adler32.ts +45 -0
  205. package/src/compression/brotli/brotli.ts +463 -0
  206. package/src/compression/brotli/index.ts +15 -0
  207. package/src/compression/brotli/transform.ts +184 -0
  208. package/src/compression/brotli/types.ts +58 -0
  209. package/src/compression/brotli/utils.ts +157 -0
  210. package/src/compression/brotli/vendor/bit_reader.js +124 -0
  211. package/src/compression/brotli/vendor/context.js +250 -0
  212. package/src/compression/brotli/vendor/decode.d.ts +2 -0
  213. package/src/compression/brotli/vendor/decode.js +938 -0
  214. package/src/compression/brotli/vendor/dictionary-data.js +9469 -0
  215. package/src/compression/brotli/vendor/dictionary.js +36 -0
  216. package/src/compression/brotli/vendor/huffman.js +123 -0
  217. package/src/compression/brotli/vendor/package.json +3 -0
  218. package/src/compression/brotli/vendor/prefix.js +60 -0
  219. package/src/compression/brotli/vendor/streams.js +31 -0
  220. package/src/compression/brotli/vendor/transform.js +247 -0
  221. package/src/compression/brotli/vendor-decode.d.ts +4 -0
  222. package/src/compression/brotli/woff2-glyf-transform.ts +623 -0
  223. package/src/compression/decompress.ts +16 -0
  224. package/src/compression/deflate.ts +295 -0
  225. package/src/compression/index.ts +4 -0
  226. package/src/compression/types.ts +26 -0
  227. package/src/compression/utils.ts +107 -0
  228. package/src/core.ts +18 -0
  229. package/src/css/apply-declarations.ts +86 -0
  230. package/src/css/background-types.ts +65 -0
  231. package/src/css/browser-defaults.ts +16 -0
  232. package/src/css/clip-path-types.ts +13 -0
  233. package/src/css/compute-style.ts +494 -0
  234. package/src/css/css-unit-resolver.ts +65 -0
  235. package/src/css/custom-properties.ts +215 -0
  236. package/src/css/enums.ts +127 -0
  237. package/src/css/font-face-parser.ts +233 -0
  238. package/src/css/font-weight.ts +65 -0
  239. package/src/css/inline-style-parser.ts +27 -0
  240. package/src/css/layout-property-resolver.ts +75 -0
  241. package/src/css/length.ts +141 -0
  242. package/src/css/line-height.ts +96 -0
  243. package/src/css/named-colors.ts +150 -0
  244. package/src/css/parsers/background-parser-extended.ts +111 -0
  245. package/src/css/parsers/background-parser.ts +456 -0
  246. package/src/css/parsers/border-block-parser.ts +26 -0
  247. package/src/css/parsers/border-inline-parser.ts +26 -0
  248. package/src/css/parsers/border-parser-extended.ts +256 -0
  249. package/src/css/parsers/border-parser.ts +175 -0
  250. package/src/css/parsers/box-shadow-parser.ts +106 -0
  251. package/src/css/parsers/clip-path-parser.ts +92 -0
  252. package/src/css/parsers/color-parser.ts +14 -0
  253. package/src/css/parsers/dimension-parser.ts +117 -0
  254. package/src/css/parsers/display-flex-parser.ts +59 -0
  255. package/src/css/parsers/flex-parser.ts +144 -0
  256. package/src/css/parsers/font-parser.ts +40 -0
  257. package/src/css/parsers/gradient-parser.ts +366 -0
  258. package/src/css/parsers/grid-parser-extended.ts +55 -0
  259. package/src/css/parsers/grid-parser.ts +218 -0
  260. package/src/css/parsers/length-parser.ts +95 -0
  261. package/src/css/parsers/list-style-parser.ts +39 -0
  262. package/src/css/parsers/margin-block-parser.ts +12 -0
  263. package/src/css/parsers/margin-inline-parser.ts +12 -0
  264. package/src/css/parsers/margin-parser.ts +30 -0
  265. package/src/css/parsers/opacity-parser.ts +32 -0
  266. package/src/css/parsers/overflow-wrap-parser.ts +38 -0
  267. package/src/css/parsers/padding-block-parser.ts +12 -0
  268. package/src/css/parsers/padding-inline-parser.ts +12 -0
  269. package/src/css/parsers/padding-parser.ts +30 -0
  270. package/src/css/parsers/position-parser.ts +75 -0
  271. package/src/css/parsers/register-parsers.ts +302 -0
  272. package/src/css/parsers/registry.ts +18 -0
  273. package/src/css/parsers/text-parser-extended.ts +144 -0
  274. package/src/css/parsers/text-parser.ts +25 -0
  275. package/src/css/parsers/text-shadow-parser.ts +94 -0
  276. package/src/css/properties/box-model.ts +82 -0
  277. package/src/css/properties/flexbox.ts +44 -0
  278. package/src/css/properties/gap.ts +14 -0
  279. package/src/css/properties/grid.ts +94 -0
  280. package/src/css/properties/layout.ts +59 -0
  281. package/src/css/properties/misc.ts +44 -0
  282. package/src/css/properties/typography.ts +71 -0
  283. package/src/css/properties/visual.ts +68 -0
  284. package/src/css/selectors/matcher.ts +219 -0
  285. package/src/css/selectors/parser.ts +163 -0
  286. package/src/css/selectors/simple-key.ts +31 -0
  287. package/src/css/selectors/specificity.ts +41 -0
  288. package/src/css/selectors/types.ts +31 -0
  289. package/src/css/shorthands/border-shorthand.ts +68 -0
  290. package/src/css/shorthands/box-shorthand.ts +33 -0
  291. package/src/css/style-inheritance.ts +50 -0
  292. package/src/css/style.ts +402 -0
  293. package/src/css/ua-defaults/base-defaults.ts +266 -0
  294. package/src/css/ua-defaults/browser-defaults.ts +134 -0
  295. package/src/css/ua-defaults/element-defaults.ts +374 -0
  296. package/src/css/ua-defaults/types.ts +43 -0
  297. package/src/css/unit-conversion.ts +24 -0
  298. package/src/css/utils.ts +108 -0
  299. package/src/css/viewport.ts +17 -0
  300. package/src/debug/audit.ts +20 -0
  301. package/src/debug/ids.ts +13 -0
  302. package/src/debug/log.js +28 -0
  303. package/src/debug/log.ts +52 -0
  304. package/src/debug/tree.ts +57 -0
  305. package/src/dom/node.ts +133 -0
  306. package/src/environment/browser-environment.ts +78 -0
  307. package/src/environment/environment.ts +35 -0
  308. package/src/environment/global.ts +13 -0
  309. package/src/environment/node-environment.browser.ts +28 -0
  310. package/src/environment/node-environment.ts +64 -0
  311. package/src/fonts/detector.ts +28 -0
  312. package/src/fonts/engines/ttf-engine.ts +28 -0
  313. package/src/fonts/engines/woff-engine.ts +38 -0
  314. package/src/fonts/engines/woff2-engine.ts +41 -0
  315. package/src/fonts/extractors/metrics-extractor.ts +362 -0
  316. package/src/fonts/font-registry-resolver.ts +132 -0
  317. package/src/fonts/index.ts +3 -0
  318. package/src/fonts/orchestrator.ts +92 -0
  319. package/src/fonts/parsers/base-parser.ts +23 -0
  320. package/src/fonts/types.ts +85 -0
  321. package/src/fonts/utils/ttf-reconstructor.ts +120 -0
  322. package/src/fonts/woff/decoder.ts +105 -0
  323. package/src/fonts/woff2/buffer.ts +106 -0
  324. package/src/fonts/woff2/decoder.ts +981 -0
  325. package/src/geometry/box.ts +48 -0
  326. package/src/geometry/matrix.ts +59 -0
  327. package/src/html/css/parse-css.ts +85 -0
  328. package/src/html/dom-converter.ts +433 -0
  329. package/src/html/image-converter.ts +200 -0
  330. package/src/html-to-pdf.ts +410 -0
  331. package/src/image/base-decoder.ts +149 -0
  332. package/src/image/image-service.ts +188 -0
  333. package/src/image/jpeg-decoder.ts +73 -0
  334. package/src/image/png-decoder.ts +550 -0
  335. package/src/image/types.ts +20 -0
  336. package/src/image/webp-decoder.ts +242 -0
  337. package/src/image/webp-huffman.ts +218 -0
  338. package/src/image/webp-riff-parser.ts +54 -0
  339. package/src/image/webp-vp8l-decoder.ts +199 -0
  340. package/src/index.ts +35 -0
  341. package/src/layout/context/float-context.ts +62 -0
  342. package/src/layout/context/layout-environment.ts +29 -0
  343. package/src/layout/debug.ts +18 -0
  344. package/src/layout/inline/bounding-box-calculator.ts +132 -0
  345. package/src/layout/inline/font-baseline-calculator.ts +76 -0
  346. package/src/layout/inline/inline-utils.ts +94 -0
  347. package/src/layout/inline/layout.ts +285 -0
  348. package/src/layout/inline/line_breaker.ts +109 -0
  349. package/src/layout/inline/measurement.ts +144 -0
  350. package/src/layout/inline/run-placer.ts +139 -0
  351. package/src/layout/inline/text-alignment.ts +70 -0
  352. package/src/layout/inline/tokenizer.ts +195 -0
  353. package/src/layout/inline/types.ts +76 -0
  354. package/src/layout/pipeline/context-factory.ts +16 -0
  355. package/src/layout/pipeline/default-engine.ts +24 -0
  356. package/src/layout/pipeline/engine.ts +59 -0
  357. package/src/layout/pipeline/layout-tree.ts +13 -0
  358. package/src/layout/pipeline/out-of-flow-manager.ts +73 -0
  359. package/src/layout/pipeline/strategy.ts +12 -0
  360. package/src/layout/pipeline/text-metrics-initializer.ts +13 -0
  361. package/src/layout/strategies/block.ts +236 -0
  362. package/src/layout/strategies/display-none.ts +14 -0
  363. package/src/layout/strategies/fallback.ts +15 -0
  364. package/src/layout/strategies/flex.ts +477 -0
  365. package/src/layout/strategies/fragmentation.ts +17 -0
  366. package/src/layout/strategies/grid.ts +247 -0
  367. package/src/layout/strategies/image.ts +342 -0
  368. package/src/layout/strategies/inline.ts +128 -0
  369. package/src/layout/strategies/table.ts +595 -0
  370. package/src/layout/table/cell_layout.ts +31 -0
  371. package/src/layout/table/diagnostics.ts +19 -0
  372. package/src/layout/text-run.ts +42 -0
  373. package/src/layout/utils/content-measurer.ts +117 -0
  374. package/src/layout/utils/display-utils.ts +24 -0
  375. package/src/layout/utils/floats.ts +98 -0
  376. package/src/layout/utils/gap-calculator.ts +167 -0
  377. package/src/layout/utils/inline-formatter.ts +31 -0
  378. package/src/layout/utils/inline-formatting.ts +9 -0
  379. package/src/layout/utils/margin.ts +140 -0
  380. package/src/layout/utils/node-math.ts +237 -0
  381. package/src/layout/utils/overflow.ts +14 -0
  382. package/src/layout/utils/sizing.ts +12 -0
  383. package/src/layout/utils/text-metrics.ts +361 -0
  384. package/src/logging/debug.ts +58 -0
  385. package/src/pdf/font/base14/widths-courier-bold.ts +159 -0
  386. package/src/pdf/font/base14/widths-courier.ts +159 -0
  387. package/src/pdf/font/base14/widths-helvetica-bold.ts +158 -0
  388. package/src/pdf/font/base14/widths-helvetica.ts +158 -0
  389. package/src/pdf/font/base14/widths-times-bold.ts +158 -0
  390. package/src/pdf/font/base14/widths-times-roman.ts +158 -0
  391. package/src/pdf/font/base14/widths-types.ts +25 -0
  392. package/src/pdf/font/base14-widths.ts +32 -0
  393. package/src/pdf/font/blur.ts +81 -0
  394. package/src/pdf/font/builtin-fonts.browser.ts +262 -0
  395. package/src/pdf/font/builtin-fonts.ts +126 -0
  396. package/src/pdf/font/composite-glyph-parser.ts +242 -0
  397. package/src/pdf/font/embedder.ts +395 -0
  398. package/src/pdf/font/font-config.ts +190 -0
  399. package/src/pdf/font/font-registry.ts +263 -0
  400. package/src/pdf/font/font-subset.ts +258 -0
  401. package/src/pdf/font/glyph-atlas-maxrects.ts +305 -0
  402. package/src/pdf/font/glyph-atlas-tuner.ts +98 -0
  403. package/src/pdf/font/glyph-atlas.ts +226 -0
  404. package/src/pdf/font/glyph-cache.ts +127 -0
  405. package/src/pdf/font/loca-reader.ts +109 -0
  406. package/src/pdf/font/managers/font-resource-manager.ts +73 -0
  407. package/src/pdf/font/managers/subset-resource-manager.ts +164 -0
  408. package/src/pdf/font/rasterizer.ts +270 -0
  409. package/src/pdf/font/resolvers/base-font-mapper.ts +77 -0
  410. package/src/pdf/font/resolvers/family-resolver.ts +33 -0
  411. package/src/pdf/font/resolvers/weight-style-applicator.ts +63 -0
  412. package/src/pdf/font/simple-glyph-parser.ts +289 -0
  413. package/src/pdf/font/to-unicode.ts +109 -0
  414. package/src/pdf/font/transformation-matrix.ts +136 -0
  415. package/src/pdf/font/ttf-cmap.ts +180 -0
  416. package/src/pdf/font/ttf-global-metrics.ts +58 -0
  417. package/src/pdf/font/ttf-glyf.ts +125 -0
  418. package/src/pdf/font/ttf-glyph-metrics.ts +43 -0
  419. package/src/pdf/font/ttf-lite.ts +269 -0
  420. package/src/pdf/font/ttf-table-parser.ts +132 -0
  421. package/src/pdf/font/ttf-table-provider.ts +61 -0
  422. package/src/pdf/font/widths.ts +79 -0
  423. package/src/pdf/font-subset/font-registry.ts +127 -0
  424. package/src/pdf/header-footer-layout.ts +153 -0
  425. package/src/pdf/header-footer-painter.ts +209 -0
  426. package/src/pdf/header-footer-renderer.ts +357 -0
  427. package/src/pdf/header-footer-tokens.ts +55 -0
  428. package/src/pdf/header-footer.ts +25 -0
  429. package/src/pdf/layout-tree-builder.ts +261 -0
  430. package/src/pdf/page-painter.ts +241 -0
  431. package/src/pdf/pagination.ts +155 -0
  432. package/src/pdf/primitives/pdf-builder.ts +378 -0
  433. package/src/pdf/primitives/pdf-bytes.ts +40 -0
  434. package/src/pdf/primitives/pdf-document.ts +108 -0
  435. package/src/pdf/primitives/pdf-reference-manager.ts +47 -0
  436. package/src/pdf/primitives/pdf-resource-registries.ts +255 -0
  437. package/src/pdf/primitives/pdf-serializers.ts +194 -0
  438. package/src/pdf/primitives/pdf-types.ts +73 -0
  439. package/src/pdf/render.ts +210 -0
  440. package/src/pdf/renderer/box-painter.ts +236 -0
  441. package/src/pdf/renderer/page-paint.ts +102 -0
  442. package/src/pdf/renderer/paint-box-shadows.ts +218 -0
  443. package/src/pdf/renderer/radius.ts +58 -0
  444. package/src/pdf/renderers/graphics-state-manager.ts +40 -0
  445. package/src/pdf/renderers/image-renderer.ts +127 -0
  446. package/src/pdf/renderers/radius-utils.ts +80 -0
  447. package/src/pdf/renderers/rectangle-renderer.ts +129 -0
  448. package/src/pdf/renderers/rounded-rect-path.ts +120 -0
  449. package/src/pdf/renderers/shape-renderer.ts +563 -0
  450. package/src/pdf/renderers/shape-utils.ts +194 -0
  451. package/src/pdf/renderers/text-decoration-renderer.ts +313 -0
  452. package/src/pdf/renderers/text-encoder.ts +41 -0
  453. package/src/pdf/renderers/text-font-resolver.ts +75 -0
  454. package/src/pdf/renderers/text-renderer-utils.ts +28 -0
  455. package/src/pdf/renderers/text-renderer.ts +391 -0
  456. package/src/pdf/renderers/text-shadow-renderer.ts +300 -0
  457. package/src/pdf/shading/gradient-service.ts +525 -0
  458. package/src/pdf/shading/index.ts +1 -0
  459. package/src/pdf/stacking/build-stacking-contexts.ts +93 -0
  460. package/src/pdf/stacking/resolve-paint-order.ts +157 -0
  461. package/src/pdf/stacking/types.ts +40 -0
  462. package/src/pdf/svg/aspect-ratio.ts +81 -0
  463. package/src/pdf/svg/coordinate-mapper.ts +81 -0
  464. package/src/pdf/svg/geometry-builder.ts +45 -0
  465. package/src/pdf/svg/render-svg.ts +296 -0
  466. package/src/pdf/svg/shape-renderer.ts +463 -0
  467. package/src/pdf/svg/style-computer.ts +246 -0
  468. package/src/pdf/transform-adapter.ts +26 -0
  469. package/src/pdf/types.ts +377 -0
  470. package/src/pdf/utils/background-layer-resolver.ts +439 -0
  471. package/src/pdf/utils/background-tiles.ts +192 -0
  472. package/src/pdf/utils/border-dashes.ts +109 -0
  473. package/src/pdf/utils/border-radius-utils.ts +86 -0
  474. package/src/pdf/utils/box-dimensions-utils.ts +47 -0
  475. package/src/pdf/utils/clip-path-resolver.ts +50 -0
  476. package/src/pdf/utils/clipping-path-builder.ts +190 -0
  477. package/src/pdf/utils/color-utils.ts +102 -0
  478. package/src/pdf/utils/coordinate-transformer.ts +30 -0
  479. package/src/pdf/utils/drop-shadow-raster.ts +233 -0
  480. package/src/pdf/utils/encoding.ts +98 -0
  481. package/src/pdf/utils/glyph-atlas-registrar.ts +13 -0
  482. package/src/pdf/utils/glyph-run-renderer.ts +129 -0
  483. package/src/pdf/utils/image-command-partitioner.ts +28 -0
  484. package/src/pdf/utils/image-matrix-builder.ts +31 -0
  485. package/src/pdf/utils/image-utils.ts +26 -0
  486. package/src/pdf/utils/list-utils.ts +194 -0
  487. package/src/pdf/utils/node-text-run-factory.ts +202 -0
  488. package/src/pdf/utils/page-resource-registrar.ts +46 -0
  489. package/src/pdf/utils/result-combiner.ts +102 -0
  490. package/src/pdf/utils/shadow-utils.ts +127 -0
  491. package/src/pdf/utils/text-alignment-resolver.ts +76 -0
  492. package/src/pdf/utils/text-decoration-utils.ts +64 -0
  493. package/src/pdf/utils/text-layout-adjuster.ts +185 -0
  494. package/src/pdf/utils/text-utils.ts +193 -0
  495. package/src/pdf/utils/transform-scope-manager.ts +69 -0
  496. package/src/render/offset.ts +170 -0
  497. package/src/shim/empty.ts +2 -0
  498. package/src/shim/fs-empty.ts +5 -0
  499. package/src/shim/url-empty.ts +7 -0
  500. package/src/shim/zlib-empty.ts +9 -0
  501. package/src/style/shorthands/index.ts +19 -0
  502. package/src/style/ua/defaults.ts +69 -0
  503. package/src/svg/index.ts +4 -0
  504. package/src/svg/parser-registry.ts +71 -0
  505. package/src/svg/parser.ts +486 -0
  506. package/src/svg/path-data.ts +515 -0
  507. package/src/svg/types.ts +194 -0
  508. package/src/text/line-breaker.ts +321 -0
  509. package/src/text/text-transform.ts +43 -0
  510. package/src/text/text.ts +33 -0
  511. package/src/transform/css-parser.ts +95 -0
  512. package/src/types/fonts.ts +62 -0
  513. package/src/types/public.ts +19 -0
  514. package/src/units/page-utils.ts +58 -0
  515. package/src/units/units.ts +50 -0
  516. package/src/utils/base64.ts +24 -0
  517. package/test-output.txt +79 -0
  518. package/tests/css/background-parser.spec.ts +14 -0
  519. package/tests/css/clip-path-parser.spec.ts +66 -0
  520. package/tests/environment/path-resolution.spec.ts +104 -0
  521. package/tests/helpers/ai-layout-diagnostics.ts +141 -0
  522. package/tests/helpers/render-utils.ts +52 -0
  523. package/tests/helpers/text-geometry.ts +56 -0
  524. package/tests/layout/custom-properties.test.ts +38 -0
  525. package/tests/layout/gap-calculator.spec.ts +196 -0
  526. package/tests/layout/inline-background-alignment.spec.ts +93 -0
  527. package/tests/layout/inline-fragments.spec.ts +26 -0
  528. package/tests/layout/run-placer-baseline.spec.ts +108 -0
  529. package/tests/pdf/alignments.spec.ts +26 -0
  530. package/tests/pdf/background-clip.spec.ts +57 -0
  531. package/tests/pdf/background-repeat-space-round.spec.ts +35 -0
  532. package/tests/pdf/background-repeat.spec.ts +137 -0
  533. package/tests/pdf/border-radius.spec.ts +151 -0
  534. package/tests/pdf/clip-path.spec.ts +92 -0
  535. package/tests/pdf/radial-gradient.spec.ts +50 -0
  536. package/tests/pdf/svg-stroke-dash.spec.ts +81 -0
  537. package/tests/pdf/text-transform-matrix.spec.ts +43 -0
  538. package/tsconfig.json +17 -0
  539. package/types/fonts.js +10 -0
  540. package/vitest.config.ts +9 -0
package/.eslintrc.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "env": {
3
+ "browser": true,
4
+ "node": true,
5
+ "es2021": true,
6
+ "jest": true
7
+ },
8
+ "parser": "@typescript-eslint/parser",
9
+ "parserOptions": {
10
+ "ecmaVersion": "latest",
11
+ "sourceType": "module"
12
+ },
13
+ "plugins": [
14
+ "@typescript-eslint"
15
+ ],
16
+ "extends": [
17
+ "eslint:recommended",
18
+ "plugin:@typescript-eslint/recommended"
19
+ ],
20
+ "rules": {
21
+ "no-undef": "off",
22
+ "@typescript-eslint/no-unused-vars": [
23
+ "error",
24
+ {
25
+ "argsIgnorePattern": "^_"
26
+ }
27
+ ],
28
+ "@typescript-eslint/no-explicit-any": "warn"
29
+ }
30
+ }
package/CHANGELOG.md ADDED
@@ -0,0 +1,13 @@
1
+ # Changelog
2
+
3
+ ## Unreleased
4
+
5
+ ### Added
6
+ - Full `overflow-wrap` / `word-wrap` parsing, inheritance, and layout support so long tokens wrap deterministically in PDF output.
7
+ - Support for resolving `em`/`rem` units (font-size, spacing, borders, shadows, grids) using inherited/root font sizes to keep layout deterministic.
8
+ - `text-transform` parsing plus layout/PDF rendering so uppercase/lowercase/capitalize behave deterministically across the pipeline.
9
+ - Support for SVG `stroke-dasharray` and `stroke-dashoffset` attributes for dashed line rendering.
10
+ - Support for CSS custom properties (variables) with inheritance, fallback values, and `var()` function resolution.
11
+
12
+ ### Fixed
13
+ - Apply justified spacing consistently across all inline fragments by marking the last line during inline layout and reusing it in PDF text-run generation.
package/README.md ADDED
@@ -0,0 +1,275 @@
1
+ # Pagyra-js
2
+
3
+ A TypeScript-based HTML to PDF converter library with comprehensive CSS support and advanced layout capabilities.
4
+
5
+ ## Features
6
+
7
+ ### Core Capabilities
8
+ - **HTML to PDF Conversion**: Convert HTML content to PDF with precise layout control
9
+ - **Comprehensive CSS Support**: Full CSS parsing, inheritance, and layout support
10
+ - **Advanced Text Handling**: Complete text layout with overflow wrapping, justification, and text transformation
11
+ - **Font Management**: Built-in font support with custom font embedding via `@font-face`
12
+ - **Cross-Platform**: Works in both Node.js and browser environments
13
+
14
+ ### Recent Additions (from CHANGELOG)
15
+ - **Overflow Wrapping**: Full `overflow-wrap` / `word-wrap` parsing and layout support
16
+ - **Relative Units**: Support for `em`/`rem` units using inherited/root font sizes
17
+ - **Text Transformation**: `text-transform` parsing and rendering (uppercase/lowercase/capitalize)
18
+ - **SVG Stroke Support**: `stroke-dasharray` and `stroke-dashoffset` for dashed line rendering
19
+ - **CSS Variables**: Custom properties with inheritance and `var()` function resolution
20
+ - **Justified Text**: Consistent justified spacing across all inline fragments
21
+
22
+ ## Installation
23
+
24
+ ```bash
25
+ npm install pagyra-js
26
+ ```
27
+
28
+ ## Usage
29
+
30
+ ### Minimal Example (HTML only)
31
+
32
+ ```typescript
33
+ import { renderHtmlToPdf } from 'pagyra-js';
34
+
35
+ // Minimal usage - only HTML is required
36
+ // Other parameters will use sensible defaults (A4 size, standard margins)
37
+ const pdfBytes = await renderHtmlToPdf({
38
+ html: '<h1>Hello World</h1><p>This is a PDF generated from HTML!</p>'
39
+ });
40
+ ```
41
+
42
+ ### Basic Example with Full Control
43
+
44
+ ```typescript
45
+ import { renderHtmlToPdf } from 'pagyra-js';
46
+
47
+ const pdfBytes = await renderHtmlToPdf({
48
+ html: '<h1>Hello World</h1><p>This is a PDF generated from HTML!</p>',
49
+ css: 'body { font-family: Arial; } h1 { color: blue; }',
50
+ viewportWidth: 800,
51
+ viewportHeight: 600,
52
+ pageWidth: 800,
53
+ pageHeight: 1100,
54
+ margins: { top: 20, right: 20, bottom: 20, left: 20 }
55
+ });
56
+
57
+ // Save or use the PDF bytes
58
+ fs.writeFileSync('output.pdf', Buffer.from(pdfBytes));
59
+ ```
60
+
61
+ ### Advanced Example with Custom Fonts
62
+
63
+ ```typescript
64
+ import { renderHtmlToPdf } from 'pagyra-js';
65
+
66
+ const pdfBytes = await renderHtmlToPdf({
67
+ html: `
68
+ <div class="container">
69
+ <h1>Advanced PDF Example</h1>
70
+ <p class="justified">This text will be justified and use custom fonts.</p>
71
+ <div class="box">Styled box with border-radius</div>
72
+ </div>
73
+ `,
74
+ css: `
75
+ @font-face {
76
+ font-family: 'CustomFont';
77
+ src: url('/path/to/font.woff2') format('woff2');
78
+ font-weight: normal;
79
+ }
80
+ body {
81
+ font-family: 'CustomFont', Arial;
82
+ font-size: 14px;
83
+ }
84
+ .justified {
85
+ text-align: justify;
86
+ overflow-wrap: break-word;
87
+ }
88
+ .box {
89
+ width: 200px;
90
+ height: 100px;
91
+ background-color: #f0f0f0;
92
+ border-radius: 8px;
93
+ border: 1px solid #ccc;
94
+ }
95
+ `,
96
+ viewportWidth: 1000,
97
+ viewportHeight: 800,
98
+ pageWidth: 1000,
99
+ pageHeight: 1400,
100
+ margins: { top: 30, right: 30, bottom: 30, left: 30 },
101
+ fontConfig: {
102
+ fontFaceDefs: [
103
+ {
104
+ name: 'CustomFont',
105
+ family: 'CustomFont',
106
+ src: '/path/to/font.woff2',
107
+ weight: 400,
108
+ style: 'normal'
109
+ }
110
+ ]
111
+ }
112
+ });
113
+ ```
114
+
115
+ ## API Reference
116
+
117
+ ### Main Functions
118
+
119
+ #### `renderHtmlToPdf(options: RenderHtmlOptions): Promise<Uint8Array>`
120
+
121
+ Converts HTML to PDF and returns the PDF as a Uint8Array.
122
+
123
+ **Parameters:**
124
+
125
+ **Mandatory Parameters:**
126
+ - `html`: HTML content string (the only truly required parameter)
127
+
128
+ **Optional Parameters (with sensible defaults available):**
129
+ - `css`: CSS styles string (defaults to empty string)
130
+ - `viewportWidth`: Viewport width in pixels (can be calculated from page size)
131
+ - `viewportHeight`: Viewport height in pixels (can be calculated from page size)
132
+ - `pageWidth`: Page width in pixels (defaults to A4 width: ~595pt/8.27in)
133
+ - `pageHeight`: Page height in pixels (defaults to A4 height: ~841pt/11.69in)
134
+ - `margins`: Page margins in pixels (defaults to standard A4 margins: ~36pt/0.5in all sides)
135
+ - `debug`: Enable debug logging (optional, defaults to false)
136
+ - `debugLevel`: Debug log level (optional)
137
+ - `debugCats`: Debug categories (optional)
138
+ - `fontConfig`: Font configuration (optional, loads built-in fonts by default)
139
+ - `resourceBaseDir`: Base directory for resource resolution (optional)
140
+ - `assetRootDir`: Asset root directory (optional)
141
+ - `headerFooter`: Header/footer configuration (optional)
142
+ - `environment`: Environment abstraction (Node/browser, optional - defaults to Node environment)
143
+
144
+ **Note:** While the TypeScript interface requires all parameters, in practice only `html` is truly mandatory. The playground server demonstrates how to compute reasonable defaults for other parameters using helper functions like `sanitizeDimension()` and `resolvePageMarginsPx()`.
145
+
146
+ #### `prepareHtmlRender(options: RenderHtmlOptions): Promise<PreparedRender>`
147
+
148
+ Prepares HTML for rendering without generating the final PDF. Useful for debugging layout.
149
+
150
+ **Returns:**
151
+ - `layoutRoot`: Root layout node
152
+ - `renderTree`: Render tree structure
153
+ - `pageSize`: Page dimensions in points
154
+ - `margins`: Applied margins
155
+
156
+ ### CSS Support
157
+
158
+ Pagyra-js supports a comprehensive set of CSS properties:
159
+
160
+ - **Layout**: `display`, `position`, `float`, `clear`, `z-index`
161
+ - **Box Model**: `width`, `height`, `margin`, `padding`, `border`, `box-sizing`
162
+ - **Flexbox**: `flex-direction`, `flex-wrap`, `justify-content`, `align-items`, etc.
163
+ - **Grid**: `grid-template`, `grid-gap`, `grid-auto-flow`
164
+ - **Text**: `font-family`, `font-size`, `font-weight`, `line-height`, `text-align`, `text-transform`, `overflow-wrap`
165
+ - **Colors**: `color`, `background-color`, `opacity`
166
+ - **Spacing**: `gap`, `margin-block`, `margin-inline`
167
+ - **Units**: `px`, `em`, `rem`, `pt`, `mm`, `cm`, `in`, `%`
168
+ - **Custom Properties**: CSS variables with `var()`
169
+
170
+ ### Font Configuration
171
+
172
+ ```typescript
173
+ interface FontConfig {
174
+ fontFaceDefs: Array<{
175
+ name: string;
176
+ family: string;
177
+ src: string;
178
+ data?: ArrayBuffer; // Font data (required for browser environment)
179
+ weight: number;
180
+ style: 'normal' | 'italic';
181
+ }>;
182
+ }
183
+ ```
184
+
185
+ ## Development
186
+
187
+ ### Project Structure
188
+
189
+ ```
190
+ src/
191
+ ├── core.ts # Core exports and types
192
+ ├── html-to-pdf.ts # Main HTML to PDF conversion logic
193
+ ├── index.ts # Main entry point
194
+ ├── browser-entry.ts # Browser-specific entry point
195
+ ├── css/ # CSS parsing and styling
196
+ ├── dom/ # DOM node handling
197
+ ├── html/ # HTML parsing and conversion
198
+ ├── layout/ # Layout calculation engine
199
+ ├── pdf/ # PDF generation and rendering
200
+ ├── svg/ # SVG support
201
+ ├── units/ # Unit conversion utilities
202
+ └── ... (other modules)
203
+ ```
204
+
205
+ ### Build Process
206
+
207
+ ```bash
208
+ # Install dependencies
209
+ npm install
210
+
211
+ # Build the project
212
+ npm run build
213
+
214
+ # Run tests
215
+ npm test
216
+
217
+ # Run linter
218
+ npm run lint
219
+
220
+ # Run playground (Node environment)
221
+ npm run playground
222
+
223
+ # Run browser playground
224
+ npm run playground:browser
225
+ ```
226
+
227
+ ### Development Scripts
228
+
229
+ - `npm run build`: Compile TypeScript to JavaScript
230
+ - `npm run clean`: Remove build artifacts
231
+ - `npm run test`: Run test suite
232
+ - `npm run lint`: Run ESLint
233
+ - `npm run playground`: Interactive development environment
234
+ - `npm run playground:browser`: Browser-based playground
235
+ - `npm run build:browser`: Build browser bundle
236
+
237
+ ## Browser Support
238
+
239
+ Pagyra-js can run in browser environments with some configuration:
240
+
241
+ ```typescript
242
+ import { renderHtmlToPdfBrowser } from 'pagyra-js/browser-entry';
243
+
244
+ // Use the browser-specific entry point
245
+ const pdfBytes = await renderHtmlToPdfBrowser({
246
+ html: '<p>Browser PDF generation</p>',
247
+ css: 'body { font-family: Arial; }',
248
+ // ... other options
249
+ environment: new BrowserEnvironment() // Provide browser environment
250
+ });
251
+ ```
252
+
253
+ ## Examples
254
+
255
+ Check the `playground/public/examples/` directory for various usage examples:
256
+ - Basic HTML to PDF conversion
257
+ - CSS layout demonstrations
258
+ - SVG rendering examples
259
+ - Advanced text formatting
260
+ - Custom font usage
261
+
262
+ ## Contributing
263
+
264
+ Contributions are welcome! Please follow these guidelines:
265
+
266
+ 1. Fork the repository
267
+ 2. Create a feature branch
268
+ 3. Implement your changes
269
+ 4. Add tests for new functionality
270
+ 5. Run `npm run lint` and `npm test`
271
+ 6. Submit a pull request
272
+
273
+ ## License
274
+
275
+ MIT License
@@ -0,0 +1,93 @@
1
+ # UA styles do Chromium/Blink — Tabelas Markdown
2
+
3
+ ## Blocos básicos
4
+ | Seletor | display | margin (block) | margin (inline) | Outros |
5
+ |---|---|---:|---:|---|
6
+ | `html` | block | – | – | – |
7
+ | `body` | block | `8px` (todas as direções) | – | – |
8
+ | `p` | block | `1em` topo/baixo | `0` esq/dir | – |
9
+ | `div` | block | – | – | – |
10
+ | `blockquote` | block | `1em` top/`1em` bottom | `40px` esq/dir | – |
11
+ | `figure` | block | `1em` top/`1em` bottom | `40px` esq/dir | – |
12
+ | `hr` | block | `0.5em` top/bottom | auto | `border: 1px inset; color: gray; overflow: hidden` |
13
+
14
+ ## Cabeçalhos
15
+ | Seletor | display | font-size | margin-block | font-weight | Notas |
16
+ |---|---|---|---|---|---|
17
+ | `h1` | block | `2em` | `0.67em` / `0.67em` | bold | – |
18
+ | `h2` | block | `1.5em` | `0.83em` / `0.83em` | bold | – |
19
+ | `h3` | block | `1.17em` | `1em` / `1em` | bold | – |
20
+ | `h4` | block | `1em` aprox. | `1.33em` / `1.33em` | bold | – |
21
+ | `h5` | block | `.83em` | `1.67em` / `1.67em` | bold | – |
22
+ | `h6` | block | `.67em` | `2.33em` / `2.33em` | bold | – |
23
+
24
+ ## Listas
25
+ | Seletor | display | list-style | margin-block | padding-inline-start |
26
+ |---|---|---|---|---|
27
+ | `ul, menu, dir` | block | disc | `1em` / `1em` | `40px` |
28
+ | `ol` | block | decimal | `1em` / `1em` | `40px` |
29
+ | `li` | list-item | – | – | `text-align: match-parent` |
30
+ | `dl` | block | – | `1em` / `1em` | – |
31
+ | `dt` | block | – | – | – |
32
+ | `dd` | block | – | – | `margin-inline-start: 40px` |
33
+
34
+ ## Tabelas
35
+ | Seletor | display | border | spacing | vertical-align | Outros |
36
+ |---|---|---|---|---|---|
37
+ | `table` | table | `border-collapse: separate` | `2px` | – | `box-sizing: border-box; text-indent: initial; border-color: gray` |
38
+ | `thead` | table-header-group | – | – | middle | – |
39
+ | `tbody` | table-row-group | – | – | middle | – |
40
+ | `tfoot` | table-footer-group | – | – | middle | – |
41
+ | `tr` | table-row | – | – | inherit | – |
42
+ | `td, th` | table-cell | – | – | inherit | `padding: 1px` |
43
+ | `th` | table-cell | – | – | inherit | `font-weight: bold; text-align: center` |
44
+ | `caption` | table-caption | – | – | – | `text-align: center` |
45
+
46
+ ## Links
47
+ | Seletor | Cor | Decoração | Cursor | Foco |
48
+ |---|---|---|---|---|
49
+ | `a:-webkit-any-link` | `-webkit-link` | underline | pointer | `:focus-visible { outline-offset: 1px }` |
50
+ | `a:-webkit-any-link:active` | `-webkit-activelink` | – | – | – |
51
+ | `a:-webkit-any-link:read-write` | – | – | text | – |
52
+
53
+ ## Formulários (núcleo)
54
+ | Seletor | display | margin | font | Outros |
55
+ |---|---|---|---|---|
56
+ | `form` | block | `margin-top: 0` | – | – |
57
+ | `fieldset` | block | `margin-inline: 2px` | – | `border: groove 2px ThreeDFace; padding-block: .35em .625em; padding-inline: .75em; min-inline-size: min-content` |
58
+ | `legend` | block | – | – | `padding-inline: 2px` |
59
+ | `input, textarea, select, button` | inline-block | `0` | `-webkit-small-control` | `text-align: start` |
60
+
61
+ ## Mídia e conteúdo substituído
62
+ | Seletor | display/overflow | Dimensões | Outros |
63
+ |---|---|---|---|
64
+ | `audio:not([controls])` | `display: none !important` | – | – |
65
+ | `audio` | – | `width: 300px; height: 54px` | – |
66
+ | `video, canvas, img` | `overflow: clip` | – | `overflow-clip-margin: content-box` |
67
+ | `video` | – | – | `object-fit: contain` |
68
+
69
+ ## Ruby
70
+ | Seletor | display | font-size | alinhamento |
71
+ |---|---|---|---|
72
+ | `ruby` | ruby | – | – |
73
+ | `ruby > rt` | ruby-text | 50% | `text-align: start` |
74
+
75
+ ## Dialog & Popover
76
+ | Seletor | display/posicionamento | caixa | Cores |
77
+ |---|---|---|---|
78
+ | `dialog` | `position: absolute; inset-inline-start:0; inset-inline-end:0; margin:auto` | `width/height: fit-content; border: solid; padding: 1em` | `background: Canvas; color: CanvasText` |
79
+ | `dialog:not([open])`, `[popover]:not(:popover-open)` | `display: none` | – | – |
80
+ | `dialog[open]`, `[popover]:popover-open` | `display: block` | – | – |
81
+
82
+ ## Quirks Mode (diferenças comuns)
83
+ | Item | Efeito |
84
+ |---|---|
85
+ | `img[align=left|right]` | margens laterais `3px` |
86
+ | `table` | reseta `white-space`, `line-height`, `font-*`, `color`, `text-align` |
87
+ | `input` (exceto `type=image`) e `textarea` | `box-sizing: border-box` |
88
+ | `form` | `margin-block-end: 1em` |
89
+ | `li` | `list-style-position: inside` |
90
+
91
+ > Observações
92
+ > - O UA pode variar por SO e por *quirks mode*.
93
+ > - Em resets, costuma-se zerar `body { margin: 8px }` e ajustar listas/tabelas conforme o design.
@@ -0,0 +1,139 @@
1
+ import type { BrotliAllocFunc, BrotliFreeFunc, BrotliBool } from "./brotli-types";
2
+ import type { BrotliSharedDictionaryType } from "./brotli-shared-dictionary";
3
+
4
+ export interface BrotliDecoderState {} // opaque
5
+
6
+ export enum BrotliDecoderResult {
7
+ BROTLI_DECODER_RESULT_ERROR = 0,
8
+ BROTLI_DECODER_RESULT_SUCCESS = 1,
9
+ BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT = 2,
10
+ BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT = 3,
11
+ }
12
+
13
+ export enum BrotliDecoderErrorCode {
14
+ BROTLI_DECODER_NO_ERROR = 0,
15
+ BROTLI_DECODER_SUCCESS = 1,
16
+ BROTLI_DECODER_NEEDS_MORE_INPUT = 2,
17
+ BROTLI_DECODER_NEEDS_MORE_OUTPUT = 3,
18
+
19
+ BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE = -1,
20
+ BROTLI_DECODER_ERROR_FORMAT_RESERVED = -2,
21
+ BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE = -3,
22
+ BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET = -4,
23
+ BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME = -5,
24
+ BROTLI_DECODER_ERROR_FORMAT_CL_SPACE = -6,
25
+ BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE = -7,
26
+ BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT = -8,
27
+ BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1 = -9,
28
+ BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2 = -10,
29
+ BROTLI_DECODER_ERROR_FORMAT_TRANSFORM = -11,
30
+ BROTLI_DECODER_ERROR_FORMAT_DICTIONARY = -12,
31
+ BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS = -13,
32
+ BROTLI_DECODER_ERROR_FORMAT_PADDING_1 = -14,
33
+ BROTLI_DECODER_ERROR_FORMAT_PADDING_2 = -15,
34
+ BROTLI_DECODER_ERROR_FORMAT_DISTANCE = -16,
35
+
36
+ BROTLI_DECODER_ERROR_COMPOUND_DICTIONARY = -18,
37
+ BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET = -19,
38
+ BROTLI_DECODER_ERROR_INVALID_ARGUMENTS = -20,
39
+
40
+ BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES = -21,
41
+ BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS = -22,
42
+ BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP = -25,
43
+ BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1 = -26,
44
+ BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2 = -27,
45
+ BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES = -30,
46
+
47
+ BROTLI_DECODER_ERROR_UNREACHABLE = -31,
48
+ }
49
+
50
+ export const BROTLI_LAST_ERROR_CODE: BrotliDecoderErrorCode;
51
+
52
+ export enum BrotliDecoderParameter {
53
+ BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION = 0,
54
+ BROTLI_DECODER_PARAM_LARGE_WINDOW = 1,
55
+ }
56
+
57
+ export declare function BrotliDecoderSetParameter(
58
+ state: BrotliDecoderState,
59
+ param: BrotliDecoderParameter,
60
+ value: number,
61
+ ): BrotliBool;
62
+
63
+ export declare function BrotliDecoderAttachDictionary(
64
+ state: BrotliDecoderState,
65
+ type: BrotliSharedDictionaryType,
66
+ dataSize: number,
67
+ data: Uint8Array,
68
+ ): BrotliBool;
69
+
70
+ export declare function BrotliDecoderCreateInstance(
71
+ allocFunc: BrotliAllocFunc | null,
72
+ freeFunc: BrotliFreeFunc | null,
73
+ opaque: unknown,
74
+ ): BrotliDecoderState;
75
+
76
+ export declare function BrotliDecoderDestroyInstance(
77
+ state: BrotliDecoderState | null,
78
+ ): void;
79
+
80
+ export declare function BrotliDecoderDecompress(
81
+ encodedSize: number,
82
+ encodedBuffer: Uint8Array,
83
+ decodedSizeRef: { value: number },
84
+ decodedBuffer: Uint8Array,
85
+ ): BrotliDecoderResult;
86
+
87
+ export declare function BrotliDecoderDecompressStream(
88
+ state: BrotliDecoderState,
89
+ availableIn: { value: number },
90
+ nextIn: { value: Uint8Array | null },
91
+ availableOut: { value: number },
92
+ nextOut: { value: Uint8Array | null },
93
+ totalOut: { value: number },
94
+ ): BrotliDecoderResult;
95
+
96
+ export declare function BrotliDecoderHasMoreOutput(
97
+ state: BrotliDecoderState,
98
+ ): BrotliBool;
99
+
100
+ export declare function BrotliDecoderTakeOutput(
101
+ state: BrotliDecoderState,
102
+ sizeOut: { value: number },
103
+ ): Uint8Array | null;
104
+
105
+ export declare function BrotliDecoderIsUsed(
106
+ state: BrotliDecoderState,
107
+ ): BrotliBool;
108
+
109
+ export declare function BrotliDecoderIsFinished(
110
+ state: BrotliDecoderState,
111
+ ): BrotliBool;
112
+
113
+ export declare function BrotliDecoderGetErrorCode(
114
+ state: BrotliDecoderState,
115
+ ): BrotliDecoderErrorCode;
116
+
117
+ export declare function BrotliDecoderErrorString(
118
+ code: BrotliDecoderErrorCode,
119
+ ): string;
120
+
121
+ export declare function BrotliDecoderVersion(): number;
122
+
123
+ export type BrotliDecoderMetadataStartFunc = (
124
+ opaque: unknown,
125
+ size: number,
126
+ ) => void;
127
+
128
+ export type BrotliDecoderMetadataChunkFunc = (
129
+ opaque: unknown,
130
+ data: Uint8Array,
131
+ size: number,
132
+ ) => void;
133
+
134
+ export declare function BrotliDecoderSetMetadataCallbacks(
135
+ state: BrotliDecoderState,
136
+ startFunc: BrotliDecoderMetadataStartFunc | null,
137
+ chunkFunc: BrotliDecoderMetadataChunkFunc | null,
138
+ opaque: unknown,
139
+ ): void;
@@ -0,0 +1,129 @@
1
+ import type { BrotliAllocFunc, BrotliFreeFunc, BrotliBool } from "./brotli-types";
2
+ import type { BrotliSharedDictionaryType } from "./brotli-shared-dictionary";
3
+
4
+ export const BROTLI_MIN_WINDOW_BITS = 10;
5
+ export const BROTLI_MAX_WINDOW_BITS = 24;
6
+ export const BROTLI_LARGE_MAX_WINDOW_BITS = 30;
7
+
8
+ export const BROTLI_MIN_INPUT_BLOCK_BITS = 16;
9
+ export const BROTLI_MAX_INPUT_BLOCK_BITS = 24;
10
+
11
+ export const BROTLI_MIN_QUALITY = 0;
12
+ export const BROTLI_MAX_QUALITY = 11;
13
+
14
+ export enum BrotliEncoderMode {
15
+ BROTLI_MODE_GENERIC = 0,
16
+ BROTLI_MODE_TEXT = 1,
17
+ BROTLI_MODE_FONT = 2,
18
+ }
19
+
20
+ export const BROTLI_DEFAULT_QUALITY: number;
21
+ export const BROTLI_DEFAULT_WINDOW: number;
22
+ export const BROTLI_DEFAULT_MODE: BrotliEncoderMode;
23
+
24
+ export enum BrotliEncoderOperation {
25
+ BROTLI_OPERATION_PROCESS = 0,
26
+ BROTLI_OPERATION_FLUSH = 1,
27
+ BROTLI_OPERATION_FINISH = 2,
28
+ BROTLI_OPERATION_EMIT_METADATA = 3,
29
+ }
30
+
31
+ export enum BrotliEncoderParameter {
32
+ BROTLI_PARAM_MODE = 0,
33
+ BROTLI_PARAM_QUALITY = 1,
34
+ BROTLI_PARAM_LGWIN = 2,
35
+ BROTLI_PARAM_LGBLOCK = 3,
36
+ BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING = 4,
37
+ BROTLI_PARAM_SIZE_HINT = 5,
38
+ BROTLI_PARAM_LARGE_WINDOW = 6,
39
+ BROTLI_PARAM_NPOSTFIX = 7,
40
+ BROTLI_PARAM_NDIRECT = 8,
41
+ BROTLI_PARAM_STREAM_OFFSET = 9,
42
+ }
43
+
44
+ export interface BrotliEncoderState {} // opaque
45
+ export interface BrotliEncoderPreparedDictionary {} // opaque
46
+
47
+ export declare function BrotliEncoderSetParameter(
48
+ state: BrotliEncoderState,
49
+ param: BrotliEncoderParameter,
50
+ value: number,
51
+ ): BrotliBool;
52
+
53
+ export declare function BrotliEncoderCreateInstance(
54
+ allocFunc: BrotliAllocFunc | null,
55
+ freeFunc: BrotliFreeFunc | null,
56
+ opaque: unknown,
57
+ ): BrotliEncoderState;
58
+
59
+ export declare function BrotliEncoderDestroyInstance(
60
+ state: BrotliEncoderState | null,
61
+ ): void;
62
+
63
+ export declare function BrotliEncoderPrepareDictionary(
64
+ type: BrotliSharedDictionaryType,
65
+ dataSize: number,
66
+ data: Uint8Array,
67
+ quality: number,
68
+ allocFunc: BrotliAllocFunc | null,
69
+ freeFunc: BrotliFreeFunc | null,
70
+ opaque: unknown,
71
+ ): BrotliEncoderPreparedDictionary | null;
72
+
73
+ export declare function BrotliEncoderDestroyPreparedDictionary(
74
+ dict: BrotliEncoderPreparedDictionary | null,
75
+ ): void;
76
+
77
+ export declare function BrotliEncoderAttachPreparedDictionary(
78
+ state: BrotliEncoderState,
79
+ dict: BrotliEncoderPreparedDictionary,
80
+ ): BrotliBool;
81
+
82
+ export declare function BrotliEncoderMaxCompressedSize(
83
+ inputSize: number,
84
+ ): number;
85
+
86
+ export declare function BrotliEncoderCompress(
87
+ quality: number,
88
+ lgwin: number,
89
+ mode: BrotliEncoderMode,
90
+ inputSize: number,
91
+ inputBuffer: Uint8Array,
92
+ encodedSizeRef: { value: number },
93
+ encodedBuffer: Uint8Array,
94
+ ): BrotliBool;
95
+
96
+ export declare function BrotliEncoderCompressStream(
97
+ state: BrotliEncoderState,
98
+ op: BrotliEncoderOperation,
99
+ availableIn: { value: number },
100
+ nextIn: { value: Uint8Array | null },
101
+ availableOut: { value: number },
102
+ nextOut: { value: Uint8Array | null },
103
+ totalOut: { value: number },
104
+ ): BrotliBool;
105
+
106
+ export declare function BrotliEncoderIsFinished(
107
+ state: BrotliEncoderState,
108
+ ): BrotliBool;
109
+
110
+ export declare function BrotliEncoderHasMoreOutput(
111
+ state: BrotliEncoderState,
112
+ ): BrotliBool;
113
+
114
+ export declare function BrotliEncoderTakeOutput(
115
+ state: BrotliEncoderState,
116
+ sizeOut: { value: number },
117
+ ): Uint8Array | null;
118
+
119
+ export declare function BrotliEncoderEstimatePeakMemoryUsage(
120
+ quality: number,
121
+ lgwin: number,
122
+ inputSize: number,
123
+ ): number;
124
+
125
+ export declare function BrotliEncoderGetPreparedDictionarySize(
126
+ dict: BrotliEncoderPreparedDictionary,
127
+ ): number;
128
+
129
+ export declare function BrotliEncoderVersion(): number;
@@ -0,0 +1,12 @@
1
+ /** Build version number used by Brotli (major*1e6 + minor*1e3 + revision). */
2
+ export function BROTLI_MAKE_VERSION(
3
+ major: number,
4
+ minor: number,
5
+ revision: number,
6
+ ): number;
7
+
8
+ /** Visibility / attribute markers; no effect in TS, kept for parity. */
9
+ export const BROTLI_COMMON_API: string;
10
+ export const BROTLI_DEC_API: string;
11
+ export const BROTLI_ENC_API: string;
12
+ export const BROTLI_ENC_EXTRA_API: string;