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.
- package/.eslintrc.json +30 -0
- package/CHANGELOG.md +13 -0
- package/README.md +275 -0
- package/UA_Styles_Chromium.md +93 -0
- package/_ext/woff2_conversion/brotli-decode.d.ts +139 -0
- package/_ext/woff2_conversion/brotli-encode.d.ts +129 -0
- package/_ext/woff2_conversion/brotli-port.d.ts +12 -0
- package/_ext/woff2_conversion/brotli-shared-dictionary.d.ts +25 -0
- package/_ext/woff2_conversion/brotli-types.d.ts +15 -0
- package/_ext/woff2_conversion/woff2-common.d.ts +37 -0
- package/_ext/woff2_conversion/woff2-decode.d.ts +32 -0
- package/_ext/woff2_conversion/woff2-encode.d.ts +31 -0
- package/_ext/woff2_conversion/woff2-output.d.ts +39 -0
- package/_ext/woff2_original_cpp/brotli/brotli.c +1559 -0
- package/_ext/woff2_original_cpp/brotli/brotli.md +116 -0
- package/_ext/woff2_original_cpp/brotli/decode.h +409 -0
- package/_ext/woff2_original_cpp/brotli/encode.h +505 -0
- package/_ext/woff2_original_cpp/brotli/port.h +302 -0
- package/_ext/woff2_original_cpp/brotli/shared_dictionary.h +100 -0
- package/_ext/woff2_original_cpp/brotli/types.h +83 -0
- package/_ext/woff2_original_cpp/cmake/FindBrotliDec.cmake +35 -0
- package/_ext/woff2_original_cpp/cmake/FindBrotliEnc.cmake +35 -0
- package/_ext/woff2_original_cpp/include/woff2/decode.h +36 -0
- package/_ext/woff2_original_cpp/include/woff2/encode.h +43 -0
- package/_ext/woff2_original_cpp/include/woff2/output.h +86 -0
- package/_ext/woff2_original_cpp/src/buffer.h +164 -0
- package/_ext/woff2_original_cpp/src/convert_woff2ttf_fuzzer.cc +13 -0
- package/_ext/woff2_original_cpp/src/convert_woff2ttf_fuzzer_new_entry.cc +12 -0
- package/_ext/woff2_original_cpp/src/file.h +30 -0
- package/_ext/woff2_original_cpp/src/font.cc +400 -0
- package/_ext/woff2_original_cpp/src/font.h +105 -0
- package/_ext/woff2_original_cpp/src/glyph.cc +383 -0
- package/_ext/woff2_original_cpp/src/glyph.h +71 -0
- package/_ext/woff2_original_cpp/src/normalize.cc +314 -0
- package/_ext/woff2_original_cpp/src/normalize.h +39 -0
- package/_ext/woff2_original_cpp/src/port.h +66 -0
- package/_ext/woff2_original_cpp/src/round.h +27 -0
- package/_ext/woff2_original_cpp/src/store_bytes.h +55 -0
- package/_ext/woff2_original_cpp/src/table_tags.cc +82 -0
- package/_ext/woff2_original_cpp/src/table_tags.h +30 -0
- package/_ext/woff2_original_cpp/src/transform.cc +430 -0
- package/_ext/woff2_original_cpp/src/transform.h +26 -0
- package/_ext/woff2_original_cpp/src/variable_length.cc +129 -0
- package/_ext/woff2_original_cpp/src/variable_length.h +30 -0
- package/_ext/woff2_original_cpp/src/woff2_common.cc +50 -0
- package/_ext/woff2_original_cpp/src/woff2_common.h +64 -0
- package/_ext/woff2_original_cpp/src/woff2_compress.cc +43 -0
- package/_ext/woff2_original_cpp/src/woff2_dec.cc +1398 -0
- package/_ext/woff2_original_cpp/src/woff2_decompress.cc +41 -0
- package/_ext/woff2_original_cpp/src/woff2_enc.cc +458 -0
- package/_ext/woff2_original_cpp/src/woff2_info.cc +142 -0
- package/_ext/woff2_original_cpp/src/woff2_out.cc +63 -0
- package/assets/fonts/ttf/arimo/Arimo-Bold.ttf +0 -0
- package/assets/fonts/ttf/arimo/Arimo-BoldItalic.ttf +0 -0
- package/assets/fonts/ttf/arimo/Arimo-Italic.ttf +0 -0
- package/assets/fonts/ttf/arimo/Arimo-Regular.ttf +0 -0
- package/assets/fonts/ttf/cinzeldecorative/CinzelDecorative-Black.ttf +0 -0
- package/assets/fonts/ttf/cinzeldecorative/CinzelDecorative-Bold.ttf +0 -0
- package/assets/fonts/ttf/cinzeldecorative/CinzelDecorative-Regular.ttf +0 -0
- package/assets/fonts/ttf/dejavu/DejaVuSans.ttf +0 -0
- package/assets/fonts/ttf/firecode/FiraCode-Bold.ttf +0 -0
- package/assets/fonts/ttf/firecode/FiraCode-Light.ttf +0 -0
- package/assets/fonts/ttf/firecode/FiraCode-Medium.ttf +0 -0
- package/assets/fonts/ttf/firecode/FiraCode-Regular.ttf +0 -0
- package/assets/fonts/ttf/firecode/FiraCode-SemiBold.ttf +0 -0
- package/assets/fonts/ttf/notoemoji/NotoEmoji-Bold.ttf +0 -0
- package/assets/fonts/ttf/notoemoji/NotoEmoji-Light.ttf +0 -0
- package/assets/fonts/ttf/notoemoji/NotoEmoji-Medium.ttf +0 -0
- package/assets/fonts/ttf/notoemoji/NotoEmoji-Regular.ttf +0 -0
- package/assets/fonts/ttf/notoemoji/NotoEmoji-SemiBold.ttf +0 -0
- package/assets/fonts/ttf/notosans/NotoSans-Regular.ttf +0 -0
- package/assets/fonts/ttf/roboto/Roboto-Bold.ttf +0 -0
- package/assets/fonts/ttf/roboto/Roboto-BoldItalic.ttf +0 -0
- package/assets/fonts/ttf/roboto/Roboto-Italic.ttf +0 -0
- package/assets/fonts/ttf/roboto/Roboto-Regular.ttf +0 -0
- package/assets/fonts/ttf/stixtwomath/STIXTwoMath-Regular.ttf +0 -0
- package/assets/fonts/ttf/tinos/Tinos-Bold.ttf +0 -0
- package/assets/fonts/ttf/tinos/Tinos-BoldItalic.ttf +0 -0
- package/assets/fonts/ttf/tinos/Tinos-Italic.ttf +0 -0
- package/assets/fonts/ttf/tinos/Tinos-Regular.ttf +0 -0
- package/assets/fonts/woff/lato/lato-latin-400-italic.woff +0 -0
- package/assets/fonts/woff/lato/lato-latin-400-normal.woff +0 -0
- package/assets/fonts/woff/lato/lato-latin-700-italic.woff +0 -0
- package/assets/fonts/woff/lato/lato-latin-700-normal.woff +0 -0
- package/assets/fonts/woff2/caveat/Caveat-Bold.woff2 +0 -0
- package/assets/fonts/woff2/caveat/Caveat-Regular.woff2 +0 -0
- package/assets/fonts/woff2/lato/lato-latin-400-italic.woff2 +0 -0
- package/assets/fonts/woff2/lato/lato-latin-400-normal.woff2 +0 -0
- package/assets/fonts/woff2/lato/lato-latin-700-italic.woff2 +0 -0
- package/assets/fonts/woff2/lato/lato-latin-700-normal.woff2 +0 -0
- package/docs/AGENTS.md +288 -0
- package/docs/BACKGROUND-REPEAT-IMPLEMENTATION.md +127 -0
- package/docs/BACKGROUND-REPEAT-REFERENCE.md +127 -0
- package/docs/BACKGROUND-REPEAT-SPACE-ROUND.md +164 -0
- package/docs/css-properties-support.md +256 -0
- package/docs/src_modules_table.md +172 -0
- package/docs/text-overlap-fix.md +85 -0
- package/docs/text-overlap-investigation.md +27 -0
- package/eslint.config.js +36 -0
- package/glyph_measure.htm +1458 -0
- package/package.json +50 -0
- package/playground/browser-entry.ts +2 -0
- package/playground/exports/background-text-debug.pdf +0 -0
- package/playground/public/app.js +875 -0
- package/playground/public/assets/1.webp +0 -0
- package/playground/public/examples/accents-test.html +24 -0
- package/playground/public/examples/advanced-selectors-demo.html +118 -0
- package/playground/public/examples/background-advanced-showcase.html +82 -0
- package/playground/public/examples/background-clip-text.html +36 -0
- package/playground/public/examples/background-origin-showcase.html +137 -0
- package/playground/public/examples/background-position-showcase.html +83 -0
- package/playground/public/examples/background-repeat-showcase.html +83 -0
- package/playground/public/examples/background-repeat-space-round.html +348 -0
- package/playground/public/examples/background-size-showcase.html +82 -0
- package/playground/public/examples/background-text-debug.html +18 -0
- package/playground/public/examples/baseline-test.html +24 -0
- package/playground/public/examples/bold-showcase.html +150 -0
- package/playground/public/examples/bold-strike-example.html +12 -0
- package/playground/public/examples/border-collapse-test.html +23 -0
- package/playground/public/examples/centered-shadow-div.html +72 -0
- package/playground/public/examples/css-variables.html +50 -0
- package/playground/public/examples/debug-accents.html +11 -0
- package/playground/public/examples/debug-text-overlap.html +46 -0
- package/playground/public/examples/flex-gap-column.html +130 -0
- package/playground/public/examples/flex-gap-row.html +137 -0
- package/playground/public/examples/flex-padding-test.html +29 -0
- package/playground/public/examples/flexbox-text-test.html +193 -0
- package/playground/public/examples/fonts-demo.html +126 -0
- package/playground/public/examples/footer-example.html +4 -0
- package/playground/public/examples/gradient-text.html +54 -0
- package/playground/public/examples/grid-gap-demo.html +156 -0
- package/playground/public/examples/header-example.html +4 -0
- package/playground/public/examples/header-footer-example.html +27 -0
- package/playground/public/examples/image-showcase.html +33 -0
- package/playground/public/examples/justify-text.html +22 -0
- package/playground/public/examples/linear-gradient-example.html +38 -0
- package/playground/public/examples/lorem-span.html +14 -0
- package/playground/public/examples/margin-block-showcase.html +21 -0
- package/playground/public/examples/margin-inline-showcase.html +21 -0
- package/playground/public/examples/monthly-summary.html +95 -0
- package/playground/public/examples/multi-page-lorem.html +190 -0
- package/playground/public/examples/opacity-debug.html +39 -0
- package/playground/public/examples/opacity-example.html +70 -0
- package/playground/public/examples/png-image-example.html +13 -0
- package/playground/public/examples/red-rectangle.html +18 -0
- package/playground/public/examples/repro.html +24 -0
- package/playground/public/examples/rounded-borders-test.html +24 -0
- package/playground/public/examples/simple-list.html +89 -0
- package/playground/public/examples/simple-svg.html +37 -0
- package/playground/public/examples/simple-table.html +52 -0
- package/playground/public/examples/skew-div.html +138 -0
- package/playground/public/examples/skew-text.html +21 -0
- package/playground/public/examples/starter-report.css +51 -0
- package/playground/public/examples/starter-report.html +23 -0
- package/playground/public/examples/svg-aspect-ratio-showcase.html +116 -0
- package/playground/public/examples/svg-gradients-linear.html +28 -0
- package/playground/public/examples/svg-gradients-radial.html +29 -0
- package/playground/public/examples/svg-gradients-showcase.html +66 -0
- package/playground/public/examples/svg-image-path-test.html +43 -0
- package/playground/public/examples/svg-images-clipping.html +27 -0
- package/playground/public/examples/svg-path-gallery.html +118 -0
- package/playground/public/examples/svg-radial-transform-demo.html +78 -0
- package/playground/public/examples/svg-transform-stack.html +103 -0
- package/playground/public/examples/svg-transforms-demo.html +127 -0
- package/playground/public/examples/table-merge-test.html +34 -0
- package/playground/public/examples/text-decoration-showcase.html +138 -0
- package/playground/public/examples/text-indent-showcase.html +137 -0
- package/playground/public/examples/text-shadow-example.html +29 -0
- package/playground/public/examples/very-complex-css.html +293 -0
- package/playground/public/examples/webp-example.html +13 -0
- package/playground/public/examples/z-index-demo.html +93 -0
- package/playground/public/examples.json +240 -0
- package/playground/public/images/dice.png +0 -0
- package/playground/public/images/duck.jpg +0 -0
- package/playground/public/index.html +149 -0
- package/playground/public/mode.js +1 -0
- package/playground/public/styles.css +382 -0
- package/playground/public/tmp-h2-debug.html +33 -0
- package/playground/public/tmp-italic-debug.html +32 -0
- package/playground/public/vendor/codemirror/codemirror.min.css +1 -0
- package/playground/public/vendor/codemirror/codemirror.min.js +1 -0
- package/playground/public/vendor/codemirror/css.min.js +1 -0
- package/playground/public/vendor/codemirror/darcula.min.css +1 -0
- package/playground/public/vendor/codemirror/htmlmixed.min.js +1 -0
- package/playground/public/vendor/codemirror/javascript.min.js +1 -0
- package/playground/public/vendor/codemirror/xml.min.js +1 -0
- package/playground/public/vendor/pagyra-playground-browser.js +165966 -0
- package/playground/public/vendor/pagyra-playground-browser.js.map +7 -0
- package/playground/server.d.ts +1 -0
- package/playground/server.js +68 -0
- package/playground/server.ts +128 -0
- package/scripts/browser-build.ts +101 -0
- package/scripts/build-browser-bundle.ts +52 -0
- package/scripts/glyph-comparison/simulate.ts +744 -0
- package/scripts/playground-browser-server.ts +57 -0
- package/scripts/probe-roboto.ts +6 -0
- package/scripts/render-playground-example.ts +121 -0
- package/scripts/run-glyph-atlas-tuner-runner.mjs +113 -0
- package/scripts/run-glyph-atlas-tuner.ts +141 -0
- package/scripts/top-ts-files.ps1 +39 -0
- package/scripts/top-ts-files.sh +37 -0
- package/scripts/woff2_info.ps1 +132 -0
- package/src/browser-entry.ts +14 -0
- package/src/compression/adler32.ts +45 -0
- package/src/compression/brotli/brotli.ts +463 -0
- package/src/compression/brotli/index.ts +15 -0
- package/src/compression/brotli/transform.ts +184 -0
- package/src/compression/brotli/types.ts +58 -0
- package/src/compression/brotli/utils.ts +157 -0
- package/src/compression/brotli/vendor/bit_reader.js +124 -0
- package/src/compression/brotli/vendor/context.js +250 -0
- package/src/compression/brotli/vendor/decode.d.ts +2 -0
- package/src/compression/brotli/vendor/decode.js +938 -0
- package/src/compression/brotli/vendor/dictionary-data.js +9469 -0
- package/src/compression/brotli/vendor/dictionary.js +36 -0
- package/src/compression/brotli/vendor/huffman.js +123 -0
- package/src/compression/brotli/vendor/package.json +3 -0
- package/src/compression/brotli/vendor/prefix.js +60 -0
- package/src/compression/brotli/vendor/streams.js +31 -0
- package/src/compression/brotli/vendor/transform.js +247 -0
- package/src/compression/brotli/vendor-decode.d.ts +4 -0
- package/src/compression/brotli/woff2-glyf-transform.ts +623 -0
- package/src/compression/decompress.ts +16 -0
- package/src/compression/deflate.ts +295 -0
- package/src/compression/index.ts +4 -0
- package/src/compression/types.ts +26 -0
- package/src/compression/utils.ts +107 -0
- package/src/core.ts +18 -0
- package/src/css/apply-declarations.ts +86 -0
- package/src/css/background-types.ts +65 -0
- package/src/css/browser-defaults.ts +16 -0
- package/src/css/clip-path-types.ts +13 -0
- package/src/css/compute-style.ts +494 -0
- package/src/css/css-unit-resolver.ts +65 -0
- package/src/css/custom-properties.ts +215 -0
- package/src/css/enums.ts +127 -0
- package/src/css/font-face-parser.ts +233 -0
- package/src/css/font-weight.ts +65 -0
- package/src/css/inline-style-parser.ts +27 -0
- package/src/css/layout-property-resolver.ts +75 -0
- package/src/css/length.ts +141 -0
- package/src/css/line-height.ts +96 -0
- package/src/css/named-colors.ts +150 -0
- package/src/css/parsers/background-parser-extended.ts +111 -0
- package/src/css/parsers/background-parser.ts +456 -0
- package/src/css/parsers/border-block-parser.ts +26 -0
- package/src/css/parsers/border-inline-parser.ts +26 -0
- package/src/css/parsers/border-parser-extended.ts +256 -0
- package/src/css/parsers/border-parser.ts +175 -0
- package/src/css/parsers/box-shadow-parser.ts +106 -0
- package/src/css/parsers/clip-path-parser.ts +92 -0
- package/src/css/parsers/color-parser.ts +14 -0
- package/src/css/parsers/dimension-parser.ts +117 -0
- package/src/css/parsers/display-flex-parser.ts +59 -0
- package/src/css/parsers/flex-parser.ts +144 -0
- package/src/css/parsers/font-parser.ts +40 -0
- package/src/css/parsers/gradient-parser.ts +366 -0
- package/src/css/parsers/grid-parser-extended.ts +55 -0
- package/src/css/parsers/grid-parser.ts +218 -0
- package/src/css/parsers/length-parser.ts +95 -0
- package/src/css/parsers/list-style-parser.ts +39 -0
- package/src/css/parsers/margin-block-parser.ts +12 -0
- package/src/css/parsers/margin-inline-parser.ts +12 -0
- package/src/css/parsers/margin-parser.ts +30 -0
- package/src/css/parsers/opacity-parser.ts +32 -0
- package/src/css/parsers/overflow-wrap-parser.ts +38 -0
- package/src/css/parsers/padding-block-parser.ts +12 -0
- package/src/css/parsers/padding-inline-parser.ts +12 -0
- package/src/css/parsers/padding-parser.ts +30 -0
- package/src/css/parsers/position-parser.ts +75 -0
- package/src/css/parsers/register-parsers.ts +302 -0
- package/src/css/parsers/registry.ts +18 -0
- package/src/css/parsers/text-parser-extended.ts +144 -0
- package/src/css/parsers/text-parser.ts +25 -0
- package/src/css/parsers/text-shadow-parser.ts +94 -0
- package/src/css/properties/box-model.ts +82 -0
- package/src/css/properties/flexbox.ts +44 -0
- package/src/css/properties/gap.ts +14 -0
- package/src/css/properties/grid.ts +94 -0
- package/src/css/properties/layout.ts +59 -0
- package/src/css/properties/misc.ts +44 -0
- package/src/css/properties/typography.ts +71 -0
- package/src/css/properties/visual.ts +68 -0
- package/src/css/selectors/matcher.ts +219 -0
- package/src/css/selectors/parser.ts +163 -0
- package/src/css/selectors/simple-key.ts +31 -0
- package/src/css/selectors/specificity.ts +41 -0
- package/src/css/selectors/types.ts +31 -0
- package/src/css/shorthands/border-shorthand.ts +68 -0
- package/src/css/shorthands/box-shorthand.ts +33 -0
- package/src/css/style-inheritance.ts +50 -0
- package/src/css/style.ts +402 -0
- package/src/css/ua-defaults/base-defaults.ts +266 -0
- package/src/css/ua-defaults/browser-defaults.ts +134 -0
- package/src/css/ua-defaults/element-defaults.ts +374 -0
- package/src/css/ua-defaults/types.ts +43 -0
- package/src/css/unit-conversion.ts +24 -0
- package/src/css/utils.ts +108 -0
- package/src/css/viewport.ts +17 -0
- package/src/debug/audit.ts +20 -0
- package/src/debug/ids.ts +13 -0
- package/src/debug/log.js +28 -0
- package/src/debug/log.ts +52 -0
- package/src/debug/tree.ts +57 -0
- package/src/dom/node.ts +133 -0
- package/src/environment/browser-environment.ts +78 -0
- package/src/environment/environment.ts +35 -0
- package/src/environment/global.ts +13 -0
- package/src/environment/node-environment.browser.ts +28 -0
- package/src/environment/node-environment.ts +64 -0
- package/src/fonts/detector.ts +28 -0
- package/src/fonts/engines/ttf-engine.ts +28 -0
- package/src/fonts/engines/woff-engine.ts +38 -0
- package/src/fonts/engines/woff2-engine.ts +41 -0
- package/src/fonts/extractors/metrics-extractor.ts +362 -0
- package/src/fonts/font-registry-resolver.ts +132 -0
- package/src/fonts/index.ts +3 -0
- package/src/fonts/orchestrator.ts +92 -0
- package/src/fonts/parsers/base-parser.ts +23 -0
- package/src/fonts/types.ts +85 -0
- package/src/fonts/utils/ttf-reconstructor.ts +120 -0
- package/src/fonts/woff/decoder.ts +105 -0
- package/src/fonts/woff2/buffer.ts +106 -0
- package/src/fonts/woff2/decoder.ts +981 -0
- package/src/geometry/box.ts +48 -0
- package/src/geometry/matrix.ts +59 -0
- package/src/html/css/parse-css.ts +85 -0
- package/src/html/dom-converter.ts +433 -0
- package/src/html/image-converter.ts +200 -0
- package/src/html-to-pdf.ts +410 -0
- package/src/image/base-decoder.ts +149 -0
- package/src/image/image-service.ts +188 -0
- package/src/image/jpeg-decoder.ts +73 -0
- package/src/image/png-decoder.ts +550 -0
- package/src/image/types.ts +20 -0
- package/src/image/webp-decoder.ts +242 -0
- package/src/image/webp-huffman.ts +218 -0
- package/src/image/webp-riff-parser.ts +54 -0
- package/src/image/webp-vp8l-decoder.ts +199 -0
- package/src/index.ts +35 -0
- package/src/layout/context/float-context.ts +62 -0
- package/src/layout/context/layout-environment.ts +29 -0
- package/src/layout/debug.ts +18 -0
- package/src/layout/inline/bounding-box-calculator.ts +132 -0
- package/src/layout/inline/font-baseline-calculator.ts +76 -0
- package/src/layout/inline/inline-utils.ts +94 -0
- package/src/layout/inline/layout.ts +285 -0
- package/src/layout/inline/line_breaker.ts +109 -0
- package/src/layout/inline/measurement.ts +144 -0
- package/src/layout/inline/run-placer.ts +139 -0
- package/src/layout/inline/text-alignment.ts +70 -0
- package/src/layout/inline/tokenizer.ts +195 -0
- package/src/layout/inline/types.ts +76 -0
- package/src/layout/pipeline/context-factory.ts +16 -0
- package/src/layout/pipeline/default-engine.ts +24 -0
- package/src/layout/pipeline/engine.ts +59 -0
- package/src/layout/pipeline/layout-tree.ts +13 -0
- package/src/layout/pipeline/out-of-flow-manager.ts +73 -0
- package/src/layout/pipeline/strategy.ts +12 -0
- package/src/layout/pipeline/text-metrics-initializer.ts +13 -0
- package/src/layout/strategies/block.ts +236 -0
- package/src/layout/strategies/display-none.ts +14 -0
- package/src/layout/strategies/fallback.ts +15 -0
- package/src/layout/strategies/flex.ts +477 -0
- package/src/layout/strategies/fragmentation.ts +17 -0
- package/src/layout/strategies/grid.ts +247 -0
- package/src/layout/strategies/image.ts +342 -0
- package/src/layout/strategies/inline.ts +128 -0
- package/src/layout/strategies/table.ts +595 -0
- package/src/layout/table/cell_layout.ts +31 -0
- package/src/layout/table/diagnostics.ts +19 -0
- package/src/layout/text-run.ts +42 -0
- package/src/layout/utils/content-measurer.ts +117 -0
- package/src/layout/utils/display-utils.ts +24 -0
- package/src/layout/utils/floats.ts +98 -0
- package/src/layout/utils/gap-calculator.ts +167 -0
- package/src/layout/utils/inline-formatter.ts +31 -0
- package/src/layout/utils/inline-formatting.ts +9 -0
- package/src/layout/utils/margin.ts +140 -0
- package/src/layout/utils/node-math.ts +237 -0
- package/src/layout/utils/overflow.ts +14 -0
- package/src/layout/utils/sizing.ts +12 -0
- package/src/layout/utils/text-metrics.ts +361 -0
- package/src/logging/debug.ts +58 -0
- package/src/pdf/font/base14/widths-courier-bold.ts +159 -0
- package/src/pdf/font/base14/widths-courier.ts +159 -0
- package/src/pdf/font/base14/widths-helvetica-bold.ts +158 -0
- package/src/pdf/font/base14/widths-helvetica.ts +158 -0
- package/src/pdf/font/base14/widths-times-bold.ts +158 -0
- package/src/pdf/font/base14/widths-times-roman.ts +158 -0
- package/src/pdf/font/base14/widths-types.ts +25 -0
- package/src/pdf/font/base14-widths.ts +32 -0
- package/src/pdf/font/blur.ts +81 -0
- package/src/pdf/font/builtin-fonts.browser.ts +262 -0
- package/src/pdf/font/builtin-fonts.ts +126 -0
- package/src/pdf/font/composite-glyph-parser.ts +242 -0
- package/src/pdf/font/embedder.ts +395 -0
- package/src/pdf/font/font-config.ts +190 -0
- package/src/pdf/font/font-registry.ts +263 -0
- package/src/pdf/font/font-subset.ts +258 -0
- package/src/pdf/font/glyph-atlas-maxrects.ts +305 -0
- package/src/pdf/font/glyph-atlas-tuner.ts +98 -0
- package/src/pdf/font/glyph-atlas.ts +226 -0
- package/src/pdf/font/glyph-cache.ts +127 -0
- package/src/pdf/font/loca-reader.ts +109 -0
- package/src/pdf/font/managers/font-resource-manager.ts +73 -0
- package/src/pdf/font/managers/subset-resource-manager.ts +164 -0
- package/src/pdf/font/rasterizer.ts +270 -0
- package/src/pdf/font/resolvers/base-font-mapper.ts +77 -0
- package/src/pdf/font/resolvers/family-resolver.ts +33 -0
- package/src/pdf/font/resolvers/weight-style-applicator.ts +63 -0
- package/src/pdf/font/simple-glyph-parser.ts +289 -0
- package/src/pdf/font/to-unicode.ts +109 -0
- package/src/pdf/font/transformation-matrix.ts +136 -0
- package/src/pdf/font/ttf-cmap.ts +180 -0
- package/src/pdf/font/ttf-global-metrics.ts +58 -0
- package/src/pdf/font/ttf-glyf.ts +125 -0
- package/src/pdf/font/ttf-glyph-metrics.ts +43 -0
- package/src/pdf/font/ttf-lite.ts +269 -0
- package/src/pdf/font/ttf-table-parser.ts +132 -0
- package/src/pdf/font/ttf-table-provider.ts +61 -0
- package/src/pdf/font/widths.ts +79 -0
- package/src/pdf/font-subset/font-registry.ts +127 -0
- package/src/pdf/header-footer-layout.ts +153 -0
- package/src/pdf/header-footer-painter.ts +209 -0
- package/src/pdf/header-footer-renderer.ts +357 -0
- package/src/pdf/header-footer-tokens.ts +55 -0
- package/src/pdf/header-footer.ts +25 -0
- package/src/pdf/layout-tree-builder.ts +261 -0
- package/src/pdf/page-painter.ts +241 -0
- package/src/pdf/pagination.ts +155 -0
- package/src/pdf/primitives/pdf-builder.ts +378 -0
- package/src/pdf/primitives/pdf-bytes.ts +40 -0
- package/src/pdf/primitives/pdf-document.ts +108 -0
- package/src/pdf/primitives/pdf-reference-manager.ts +47 -0
- package/src/pdf/primitives/pdf-resource-registries.ts +255 -0
- package/src/pdf/primitives/pdf-serializers.ts +194 -0
- package/src/pdf/primitives/pdf-types.ts +73 -0
- package/src/pdf/render.ts +210 -0
- package/src/pdf/renderer/box-painter.ts +236 -0
- package/src/pdf/renderer/page-paint.ts +102 -0
- package/src/pdf/renderer/paint-box-shadows.ts +218 -0
- package/src/pdf/renderer/radius.ts +58 -0
- package/src/pdf/renderers/graphics-state-manager.ts +40 -0
- package/src/pdf/renderers/image-renderer.ts +127 -0
- package/src/pdf/renderers/radius-utils.ts +80 -0
- package/src/pdf/renderers/rectangle-renderer.ts +129 -0
- package/src/pdf/renderers/rounded-rect-path.ts +120 -0
- package/src/pdf/renderers/shape-renderer.ts +563 -0
- package/src/pdf/renderers/shape-utils.ts +194 -0
- package/src/pdf/renderers/text-decoration-renderer.ts +313 -0
- package/src/pdf/renderers/text-encoder.ts +41 -0
- package/src/pdf/renderers/text-font-resolver.ts +75 -0
- package/src/pdf/renderers/text-renderer-utils.ts +28 -0
- package/src/pdf/renderers/text-renderer.ts +391 -0
- package/src/pdf/renderers/text-shadow-renderer.ts +300 -0
- package/src/pdf/shading/gradient-service.ts +525 -0
- package/src/pdf/shading/index.ts +1 -0
- package/src/pdf/stacking/build-stacking-contexts.ts +93 -0
- package/src/pdf/stacking/resolve-paint-order.ts +157 -0
- package/src/pdf/stacking/types.ts +40 -0
- package/src/pdf/svg/aspect-ratio.ts +81 -0
- package/src/pdf/svg/coordinate-mapper.ts +81 -0
- package/src/pdf/svg/geometry-builder.ts +45 -0
- package/src/pdf/svg/render-svg.ts +296 -0
- package/src/pdf/svg/shape-renderer.ts +463 -0
- package/src/pdf/svg/style-computer.ts +246 -0
- package/src/pdf/transform-adapter.ts +26 -0
- package/src/pdf/types.ts +377 -0
- package/src/pdf/utils/background-layer-resolver.ts +439 -0
- package/src/pdf/utils/background-tiles.ts +192 -0
- package/src/pdf/utils/border-dashes.ts +109 -0
- package/src/pdf/utils/border-radius-utils.ts +86 -0
- package/src/pdf/utils/box-dimensions-utils.ts +47 -0
- package/src/pdf/utils/clip-path-resolver.ts +50 -0
- package/src/pdf/utils/clipping-path-builder.ts +190 -0
- package/src/pdf/utils/color-utils.ts +102 -0
- package/src/pdf/utils/coordinate-transformer.ts +30 -0
- package/src/pdf/utils/drop-shadow-raster.ts +233 -0
- package/src/pdf/utils/encoding.ts +98 -0
- package/src/pdf/utils/glyph-atlas-registrar.ts +13 -0
- package/src/pdf/utils/glyph-run-renderer.ts +129 -0
- package/src/pdf/utils/image-command-partitioner.ts +28 -0
- package/src/pdf/utils/image-matrix-builder.ts +31 -0
- package/src/pdf/utils/image-utils.ts +26 -0
- package/src/pdf/utils/list-utils.ts +194 -0
- package/src/pdf/utils/node-text-run-factory.ts +202 -0
- package/src/pdf/utils/page-resource-registrar.ts +46 -0
- package/src/pdf/utils/result-combiner.ts +102 -0
- package/src/pdf/utils/shadow-utils.ts +127 -0
- package/src/pdf/utils/text-alignment-resolver.ts +76 -0
- package/src/pdf/utils/text-decoration-utils.ts +64 -0
- package/src/pdf/utils/text-layout-adjuster.ts +185 -0
- package/src/pdf/utils/text-utils.ts +193 -0
- package/src/pdf/utils/transform-scope-manager.ts +69 -0
- package/src/render/offset.ts +170 -0
- package/src/shim/empty.ts +2 -0
- package/src/shim/fs-empty.ts +5 -0
- package/src/shim/url-empty.ts +7 -0
- package/src/shim/zlib-empty.ts +9 -0
- package/src/style/shorthands/index.ts +19 -0
- package/src/style/ua/defaults.ts +69 -0
- package/src/svg/index.ts +4 -0
- package/src/svg/parser-registry.ts +71 -0
- package/src/svg/parser.ts +486 -0
- package/src/svg/path-data.ts +515 -0
- package/src/svg/types.ts +194 -0
- package/src/text/line-breaker.ts +321 -0
- package/src/text/text-transform.ts +43 -0
- package/src/text/text.ts +33 -0
- package/src/transform/css-parser.ts +95 -0
- package/src/types/fonts.ts +62 -0
- package/src/types/public.ts +19 -0
- package/src/units/page-utils.ts +58 -0
- package/src/units/units.ts +50 -0
- package/src/utils/base64.ts +24 -0
- package/test-output.txt +79 -0
- package/tests/css/background-parser.spec.ts +14 -0
- package/tests/css/clip-path-parser.spec.ts +66 -0
- package/tests/environment/path-resolution.spec.ts +104 -0
- package/tests/helpers/ai-layout-diagnostics.ts +141 -0
- package/tests/helpers/render-utils.ts +52 -0
- package/tests/helpers/text-geometry.ts +56 -0
- package/tests/layout/custom-properties.test.ts +38 -0
- package/tests/layout/gap-calculator.spec.ts +196 -0
- package/tests/layout/inline-background-alignment.spec.ts +93 -0
- package/tests/layout/inline-fragments.spec.ts +26 -0
- package/tests/layout/run-placer-baseline.spec.ts +108 -0
- package/tests/pdf/alignments.spec.ts +26 -0
- package/tests/pdf/background-clip.spec.ts +57 -0
- package/tests/pdf/background-repeat-space-round.spec.ts +35 -0
- package/tests/pdf/background-repeat.spec.ts +137 -0
- package/tests/pdf/border-radius.spec.ts +151 -0
- package/tests/pdf/clip-path.spec.ts +92 -0
- package/tests/pdf/radial-gradient.spec.ts +50 -0
- package/tests/pdf/svg-stroke-dash.spec.ts +81 -0
- package/tests/pdf/text-transform-matrix.spec.ts +43 -0
- package/tsconfig.json +17 -0
- package/types/fonts.js +10 -0
- package/vitest.config.ts +9 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { LengthLike } from "../length.js";
|
|
2
|
+
import { AlignItems, AlignContent, JustifyContent } from "../enums.js";
|
|
3
|
+
import type { GapProperties } from "./gap.js";
|
|
4
|
+
|
|
5
|
+
export type FlexDirection = "row" | "row-reverse" | "column" | "column-reverse";
|
|
6
|
+
export type AlignSelfValue = AlignItems | "auto";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Flexbox layout CSS properties.
|
|
10
|
+
* Handles flex container and flex item properties.
|
|
11
|
+
*
|
|
12
|
+
* Extends GapProperties to inherit rowGap and columnGap,
|
|
13
|
+
* enabling proper gap support in flex layouts as per modern CSS Flexbox spec.
|
|
14
|
+
*/
|
|
15
|
+
export interface FlexboxProperties extends GapProperties {
|
|
16
|
+
/** Flex container direction */
|
|
17
|
+
flexDirection: FlexDirection;
|
|
18
|
+
|
|
19
|
+
/** Whether flex items wrap */
|
|
20
|
+
flexWrap: boolean;
|
|
21
|
+
|
|
22
|
+
/** Flex grow factor */
|
|
23
|
+
flexGrow: number;
|
|
24
|
+
|
|
25
|
+
/** Flex shrink factor */
|
|
26
|
+
flexShrink: number;
|
|
27
|
+
|
|
28
|
+
/** Flex basis (initial size) */
|
|
29
|
+
flexBasis: LengthLike;
|
|
30
|
+
|
|
31
|
+
/** Main axis alignment */
|
|
32
|
+
justifyContent: JustifyContent;
|
|
33
|
+
|
|
34
|
+
/** Cross axis alignment for items */
|
|
35
|
+
alignItems: AlignItems;
|
|
36
|
+
|
|
37
|
+
/** Cross axis alignment for lines */
|
|
38
|
+
alignContent: AlignContent;
|
|
39
|
+
|
|
40
|
+
/** Individual item alignment override */
|
|
41
|
+
alignSelf: AlignSelfValue;
|
|
42
|
+
|
|
43
|
+
// rowGap and columnGap are inherited from GapProperties
|
|
44
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gap properties for layout containers (Grid, Flex, etc.)
|
|
3
|
+
* Defines spacing between child items in a container.
|
|
4
|
+
*
|
|
5
|
+
* These properties are shared across multiple layout modes to follow
|
|
6
|
+
* the DRY principle and maintain consistency.
|
|
7
|
+
*/
|
|
8
|
+
export interface GapProperties {
|
|
9
|
+
/** Gap between rows (in pixels) */
|
|
10
|
+
rowGap: number;
|
|
11
|
+
|
|
12
|
+
/** Gap between columns or items in row direction (in pixels) */
|
|
13
|
+
columnGap: number;
|
|
14
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type { NumericLength } from "../length.js";
|
|
2
|
+
import type { GapProperties } from "./gap.js";
|
|
3
|
+
|
|
4
|
+
export type GridAutoFlow = "row" | "column" | "row dense" | "column dense";
|
|
5
|
+
|
|
6
|
+
// Track size types (resolved, in pixels)
|
|
7
|
+
export interface FixedTrackSize {
|
|
8
|
+
kind: "fixed";
|
|
9
|
+
size: number;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface FlexTrackSize {
|
|
13
|
+
kind: "flex";
|
|
14
|
+
flex: number;
|
|
15
|
+
min?: number;
|
|
16
|
+
max?: number;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface AutoTrackSize {
|
|
20
|
+
kind: "auto";
|
|
21
|
+
min?: number;
|
|
22
|
+
max?: number;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export type TrackSize = FixedTrackSize | FlexTrackSize | AutoTrackSize;
|
|
26
|
+
|
|
27
|
+
export interface RepeatTrackDefinition {
|
|
28
|
+
kind: "repeat";
|
|
29
|
+
count: number;
|
|
30
|
+
track: TrackSize;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface AutoRepeatTrackDefinition {
|
|
34
|
+
kind: "repeat-auto";
|
|
35
|
+
mode: "auto-fit" | "auto-fill";
|
|
36
|
+
track: TrackSize;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export type TrackDefinition = TrackSize | RepeatTrackDefinition | AutoRepeatTrackDefinition;
|
|
40
|
+
|
|
41
|
+
// Track size input types (with length units)
|
|
42
|
+
export interface FixedTrackSizeInput {
|
|
43
|
+
kind: "fixed";
|
|
44
|
+
size: NumericLength;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface FlexTrackSizeInput {
|
|
48
|
+
kind: "flex";
|
|
49
|
+
flex: number;
|
|
50
|
+
min?: NumericLength;
|
|
51
|
+
max?: NumericLength;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface AutoTrackSizeInput {
|
|
55
|
+
kind: "auto";
|
|
56
|
+
min?: NumericLength;
|
|
57
|
+
max?: NumericLength;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export type TrackSizeInput = FixedTrackSizeInput | FlexTrackSizeInput | AutoTrackSizeInput;
|
|
61
|
+
|
|
62
|
+
export interface RepeatTrackDefinitionInput {
|
|
63
|
+
kind: "repeat";
|
|
64
|
+
count: number;
|
|
65
|
+
track: TrackSizeInput;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export interface AutoRepeatTrackDefinitionInput {
|
|
69
|
+
kind: "repeat-auto";
|
|
70
|
+
mode: "auto-fit" | "auto-fill";
|
|
71
|
+
track: TrackSizeInput;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export type TrackDefinitionInput = TrackSizeInput | RepeatTrackDefinitionInput | AutoRepeatTrackDefinitionInput;
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Grid layout CSS properties.
|
|
78
|
+
* Handles CSS Grid container and item properties.
|
|
79
|
+
*
|
|
80
|
+
* Extends GapProperties to inherit rowGap and columnGap,
|
|
81
|
+
* following the DRY principle and enabling shared gap utilities.
|
|
82
|
+
*/
|
|
83
|
+
export interface GridProperties extends GapProperties {
|
|
84
|
+
/** Column track definitions */
|
|
85
|
+
trackListColumns: TrackDefinition[];
|
|
86
|
+
|
|
87
|
+
/** Row track definitions */
|
|
88
|
+
trackListRows: TrackDefinition[];
|
|
89
|
+
|
|
90
|
+
/** Auto-placement flow direction */
|
|
91
|
+
autoFlow: GridAutoFlow;
|
|
92
|
+
|
|
93
|
+
// rowGap and columnGap are inherited from GapProperties
|
|
94
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { LengthLike } from "../length.js";
|
|
2
|
+
import { Display, Position } from "../enums.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Layout-related CSS properties.
|
|
6
|
+
* Handles positioning, sizing, and display modes.
|
|
7
|
+
*/
|
|
8
|
+
export interface LayoutProperties {
|
|
9
|
+
/** Display mode (block, inline, flex, grid, etc.) */
|
|
10
|
+
display: Display;
|
|
11
|
+
|
|
12
|
+
/** Positioning mode (static, relative, absolute, fixed) */
|
|
13
|
+
position: Position;
|
|
14
|
+
|
|
15
|
+
/** Stacking order */
|
|
16
|
+
zIndex: number | "auto";
|
|
17
|
+
|
|
18
|
+
/** Element width */
|
|
19
|
+
width: LengthLike;
|
|
20
|
+
|
|
21
|
+
/** Element height */
|
|
22
|
+
height: LengthLike;
|
|
23
|
+
|
|
24
|
+
/** Minimum width constraint */
|
|
25
|
+
minWidth?: LengthLike;
|
|
26
|
+
|
|
27
|
+
/** Maximum width constraint */
|
|
28
|
+
maxWidth?: LengthLike;
|
|
29
|
+
|
|
30
|
+
/** Minimum height constraint */
|
|
31
|
+
minHeight?: LengthLike;
|
|
32
|
+
|
|
33
|
+
/** Maximum height constraint */
|
|
34
|
+
maxHeight?: LengthLike;
|
|
35
|
+
|
|
36
|
+
/** Top offset for positioned elements */
|
|
37
|
+
top?: LengthLike;
|
|
38
|
+
|
|
39
|
+
/** Right offset for positioned elements */
|
|
40
|
+
right?: LengthLike;
|
|
41
|
+
|
|
42
|
+
/** Bottom offset for positioned elements */
|
|
43
|
+
bottom?: LengthLike;
|
|
44
|
+
|
|
45
|
+
/** Left offset for positioned elements */
|
|
46
|
+
left?: LengthLike;
|
|
47
|
+
|
|
48
|
+
/** Logical inline-start inset (for writing modes) */
|
|
49
|
+
insetInlineStart?: LengthLike;
|
|
50
|
+
|
|
51
|
+
/** Logical inline-end inset (for writing modes) */
|
|
52
|
+
insetInlineEnd?: LengthLike;
|
|
53
|
+
|
|
54
|
+
/** Logical block-start inset (for writing modes) */
|
|
55
|
+
insetBlockStart?: LengthLike;
|
|
56
|
+
|
|
57
|
+
/** Logical block-end inset (for writing modes) */
|
|
58
|
+
insetBlockEnd?: LengthLike;
|
|
59
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { FloatMode, ClearMode, TableLayoutMode, BorderModel } from "../enums.js";
|
|
2
|
+
import { CustomPropertiesMap } from "../custom-properties.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Miscellaneous CSS properties.
|
|
6
|
+
* Handles specialized properties like float, list styling, table layout, and page breaks.
|
|
7
|
+
*/
|
|
8
|
+
export interface MiscProperties {
|
|
9
|
+
/** Float positioning */
|
|
10
|
+
float: FloatMode;
|
|
11
|
+
|
|
12
|
+
/** Clear float behavior */
|
|
13
|
+
clear: ClearMode;
|
|
14
|
+
|
|
15
|
+
/** List item marker type */
|
|
16
|
+
listStyleType: string;
|
|
17
|
+
|
|
18
|
+
/** Image/video object-fit mode */
|
|
19
|
+
objectFit?: "contain" | "cover" | "fill" | "none" | "scale-down";
|
|
20
|
+
|
|
21
|
+
/** Table layout algorithm */
|
|
22
|
+
tableLayout: TableLayoutMode;
|
|
23
|
+
|
|
24
|
+
/** Table border model (separate or collapse) */
|
|
25
|
+
borderModel: BorderModel;
|
|
26
|
+
|
|
27
|
+
/** Page break before element */
|
|
28
|
+
breakBefore: string;
|
|
29
|
+
|
|
30
|
+
/** Page break after element */
|
|
31
|
+
breakAfter: string;
|
|
32
|
+
|
|
33
|
+
/** Page break inside element */
|
|
34
|
+
breakInside: string;
|
|
35
|
+
|
|
36
|
+
/** Minimum lines at bottom of page/column */
|
|
37
|
+
widows: number;
|
|
38
|
+
|
|
39
|
+
/** Minimum lines at top of page/column */
|
|
40
|
+
orphans: number;
|
|
41
|
+
|
|
42
|
+
/** CSS Custom Properties (Variables) */
|
|
43
|
+
customProperties?: CustomPropertiesMap;
|
|
44
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { LineHeightValue } from "../line-height.js";
|
|
2
|
+
import type { WhiteSpace, TextWrap, WritingMode } from "../enums.js";
|
|
3
|
+
|
|
4
|
+
export type TextTransform = "none" | "uppercase" | "lowercase" | "capitalize";
|
|
5
|
+
export type OverflowWrap = "normal" | "break-word" | "anywhere";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Typography and text-related CSS properties.
|
|
9
|
+
* Handles font styling, text formatting, and text layout.
|
|
10
|
+
*/
|
|
11
|
+
export interface TypographyProperties {
|
|
12
|
+
/** Font size in pixels */
|
|
13
|
+
fontSize: number;
|
|
14
|
+
|
|
15
|
+
/** Font family name or stack */
|
|
16
|
+
fontFamily?: string;
|
|
17
|
+
|
|
18
|
+
/** Font weight (100-900) */
|
|
19
|
+
fontWeight?: number;
|
|
20
|
+
|
|
21
|
+
/** Font style (normal, italic, oblique) */
|
|
22
|
+
fontStyle?: string;
|
|
23
|
+
|
|
24
|
+
/** Font variant (normal, small-caps) */
|
|
25
|
+
fontVariant?: string;
|
|
26
|
+
|
|
27
|
+
/** Line height (absolute or relative) */
|
|
28
|
+
lineHeight: LineHeightValue;
|
|
29
|
+
|
|
30
|
+
/** Letter spacing in pixels */
|
|
31
|
+
letterSpacing: number;
|
|
32
|
+
|
|
33
|
+
/** Word spacing in pixels */
|
|
34
|
+
wordSpacing: number;
|
|
35
|
+
|
|
36
|
+
/** Horizontal text alignment */
|
|
37
|
+
textAlign?: string;
|
|
38
|
+
|
|
39
|
+
/** Text indentation */
|
|
40
|
+
textIndent: import("../length.js").LengthLike;
|
|
41
|
+
|
|
42
|
+
/** Text transformation (uppercase, lowercase, etc.) */
|
|
43
|
+
textTransform: TextTransform;
|
|
44
|
+
|
|
45
|
+
/** Text decoration line (underline, line-through, etc.) */
|
|
46
|
+
textDecorationLine?: string;
|
|
47
|
+
|
|
48
|
+
/** Text decoration color */
|
|
49
|
+
textDecorationColor?: string;
|
|
50
|
+
|
|
51
|
+
/** Text decoration style (solid, dashed, etc.) */
|
|
52
|
+
textDecorationStyle?: string;
|
|
53
|
+
|
|
54
|
+
/** Vertical alignment */
|
|
55
|
+
verticalAlign?: string;
|
|
56
|
+
|
|
57
|
+
/** White space handling */
|
|
58
|
+
whiteSpace: WhiteSpace;
|
|
59
|
+
|
|
60
|
+
/** Text wrapping mode */
|
|
61
|
+
textWrap: TextWrap;
|
|
62
|
+
|
|
63
|
+
/** Overflow wrap behavior */
|
|
64
|
+
overflowWrap: OverflowWrap;
|
|
65
|
+
|
|
66
|
+
/** Writing mode (horizontal-tb, vertical-rl, etc.) */
|
|
67
|
+
writingMode: WritingMode;
|
|
68
|
+
|
|
69
|
+
/** Text color */
|
|
70
|
+
color?: string;
|
|
71
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { NumericLength } from "../length.js";
|
|
2
|
+
import type { BackgroundLayer } from "../background-types.js";
|
|
3
|
+
import { OverflowMode } from "../enums.js";
|
|
4
|
+
import type { ClipPath } from "../clip-path-types.js";
|
|
5
|
+
|
|
6
|
+
// Box shadow types
|
|
7
|
+
export interface BoxShadow {
|
|
8
|
+
inset: boolean;
|
|
9
|
+
offsetX: number;
|
|
10
|
+
offsetY: number;
|
|
11
|
+
blurRadius: number;
|
|
12
|
+
spreadRadius: number;
|
|
13
|
+
color?: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface BoxShadowInput {
|
|
17
|
+
inset: boolean;
|
|
18
|
+
offsetX: NumericLength;
|
|
19
|
+
offsetY: NumericLength;
|
|
20
|
+
blurRadius: NumericLength;
|
|
21
|
+
spreadRadius: NumericLength;
|
|
22
|
+
color?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Text shadow types
|
|
26
|
+
export interface TextShadow {
|
|
27
|
+
offsetX: number;
|
|
28
|
+
offsetY: number;
|
|
29
|
+
blurRadius: number;
|
|
30
|
+
color?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface TextShadowInput {
|
|
34
|
+
offsetX: NumericLength;
|
|
35
|
+
offsetY: NumericLength;
|
|
36
|
+
blurRadius?: NumericLength;
|
|
37
|
+
color?: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Visual effects and rendering CSS properties.
|
|
42
|
+
* Handles backgrounds, shadows, opacity, transforms, and overflow.
|
|
43
|
+
*/
|
|
44
|
+
export interface VisualProperties {
|
|
45
|
+
/** Background layers (colors, images, gradients) */
|
|
46
|
+
backgroundLayers?: BackgroundLayer[];
|
|
47
|
+
|
|
48
|
+
/** Box shadows */
|
|
49
|
+
boxShadows: BoxShadow[];
|
|
50
|
+
|
|
51
|
+
/** Text shadows */
|
|
52
|
+
textShadows: TextShadow[];
|
|
53
|
+
|
|
54
|
+
/** Element opacity (0-1) */
|
|
55
|
+
opacity: number;
|
|
56
|
+
|
|
57
|
+
/** CSS transform */
|
|
58
|
+
transform?: string;
|
|
59
|
+
|
|
60
|
+
/** Horizontal overflow behavior */
|
|
61
|
+
overflowX: OverflowMode;
|
|
62
|
+
|
|
63
|
+
/** Vertical overflow behavior */
|
|
64
|
+
overflowY: OverflowMode;
|
|
65
|
+
|
|
66
|
+
/** Clipping path applied to the element */
|
|
67
|
+
clipPath?: ClipPath;
|
|
68
|
+
}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import type { Simple, AttrCond, Pseudo, Combinator } from "./types.js";
|
|
2
|
+
import { parseSelector } from "./parser.js";
|
|
3
|
+
import { simpleKey } from "./simple-key.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Cria um predicado (el)=>boolean que testa o seletor.
|
|
7
|
+
* - Avaliação right-to-left
|
|
8
|
+
* - Suporte a combinadores: ', '>', '+', '~'
|
|
9
|
+
* - Suporte a tag/#id/.classe/[attr]/:first/last/nth-child/:not(simple)
|
|
10
|
+
* - Memoização por nó para matches de "Simple"
|
|
11
|
+
*/
|
|
12
|
+
export function createSelectorMatcher(selector: string): ((el: Element) => boolean) | null {
|
|
13
|
+
const chain = parseSelector(selector);
|
|
14
|
+
if (!chain) return null;
|
|
15
|
+
|
|
16
|
+
// Cache: (el) -> (simpleKey -> boolean)
|
|
17
|
+
type MatchCache = WeakMap<Element, Map<string, boolean>>;
|
|
18
|
+
const cache: MatchCache = new WeakMap();
|
|
19
|
+
|
|
20
|
+
function memo(el: Element, s: Simple, raw: (e: Element, s: Simple) => boolean): boolean {
|
|
21
|
+
let m = cache.get(el);
|
|
22
|
+
if (!m) { m = new Map(); cache.set(el, m); }
|
|
23
|
+
const k = simpleKey(s);
|
|
24
|
+
if (m.has(k)) return m.get(k)!;
|
|
25
|
+
const ok = raw(el, s);
|
|
26
|
+
m.set(k, ok);
|
|
27
|
+
return ok;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Helpers DOM (assumem DOM-like API; adapte se teu DOM for custom)
|
|
31
|
+
function getAttr(el: Element, name: string): string | null {
|
|
32
|
+
const value = (el as any).getAttribute ? (el as any).getAttribute(name) : null;
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function matchAttr(el: Element, cond: AttrCond): boolean {
|
|
37
|
+
const v = getAttr(el, cond.name);
|
|
38
|
+
if (cond.op === 'exists') {
|
|
39
|
+
const result = v !== null;
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
if (v === null) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
let result: boolean;
|
|
46
|
+
switch (cond.op) {
|
|
47
|
+
case '=': result = v === cond.value!; break;
|
|
48
|
+
case '~=': result = v.split(/\s+/).includes(cond.value!); break;
|
|
49
|
+
case '|=': result = v === cond.value! || v.startsWith(cond.value! + '-'); break;
|
|
50
|
+
case '^=': result = v.startsWith(cond.value!); break;
|
|
51
|
+
case '$=': result = v.endsWith(cond.value!); break;
|
|
52
|
+
case '*=': result = v.includes(cond.value!); break;
|
|
53
|
+
default: result = false; break;
|
|
54
|
+
}
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function indexInParent(el: Element): number {
|
|
59
|
+
const p = el.parentElement;
|
|
60
|
+
if (!p) {
|
|
61
|
+
return -1;
|
|
62
|
+
}
|
|
63
|
+
let idx = 0;
|
|
64
|
+
for (let n = p.firstElementChild; n; n = n.nextElementSibling) {
|
|
65
|
+
idx++;
|
|
66
|
+
if (n === el) {
|
|
67
|
+
return idx;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return -1;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function matchesPseudo(el: Element, p: Pseudo): boolean {
|
|
74
|
+
if (p.kind === 'first-child') {
|
|
75
|
+
const result = indexInParent(el) === 1;
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
if (p.kind === 'last-child') {
|
|
79
|
+
const parent = el.parentElement;
|
|
80
|
+
if (!parent) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
const result = parent.lastElementChild === el;
|
|
84
|
+
return result;
|
|
85
|
+
}
|
|
86
|
+
if (p.kind === 'nth-child') {
|
|
87
|
+
const k = indexInParent(el);
|
|
88
|
+
if (k < 1) {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
const { a, b } = p;
|
|
92
|
+
let result: boolean;
|
|
93
|
+
if (a === 0) {
|
|
94
|
+
result = k === b;
|
|
95
|
+
} else {
|
|
96
|
+
result = (k - b) % a === 0 && (k - b) / a >= 0;
|
|
97
|
+
}
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
if (p.kind === 'not') {
|
|
101
|
+
const result = !matchesSimple(el, p.inner);
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
if (p.kind === 'root') {
|
|
105
|
+
const doc = (el as any).ownerDocument;
|
|
106
|
+
if (!doc || !doc.documentElement) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
return doc.documentElement === el;
|
|
110
|
+
}
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function matchesSimple(el: Element, s: Simple): boolean {
|
|
115
|
+
if (s.tag && el.tagName.toLowerCase() !== s.tag) {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
if (s.id && (el as any).id !== s.id) {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
const cl: DOMTokenList | undefined = (el as any).classList;
|
|
122
|
+
for (const cls of s.classes) {
|
|
123
|
+
if (!cl?.contains?.(cls)) {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
for (const a of s.attrs) {
|
|
128
|
+
if (!matchAttr(el, a)) {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
for (const z of s.pseudos) {
|
|
133
|
+
if (!matchesPseudo(el, z)) {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Matcher right-to-left
|
|
141
|
+
return function match(el: Element): boolean {
|
|
142
|
+
let current: Element | null = el;
|
|
143
|
+
let i = chain.length - 1;
|
|
144
|
+
|
|
145
|
+
if (!current) {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
if (!memo(current, chain[i].simple, matchesSimple)) {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
i--;
|
|
152
|
+
|
|
153
|
+
while (i >= 0) {
|
|
154
|
+
const needed = chain[i];
|
|
155
|
+
const comb = chain[i + 1].combinatorToLeft as Combinator | undefined;
|
|
156
|
+
|
|
157
|
+
if (comb === '>') {
|
|
158
|
+
current = current!.parentElement;
|
|
159
|
+
if (!current) {
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
if (!memo(current, needed.simple, matchesSimple)) {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
i--; continue;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (comb === ' ') {
|
|
169
|
+
let anc: Element | null = current!.parentElement, found = false;
|
|
170
|
+
while (anc) {
|
|
171
|
+
if (memo(anc, needed.simple, matchesSimple)) {
|
|
172
|
+
current = anc;
|
|
173
|
+
found = true;
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
anc = anc.parentElement;
|
|
177
|
+
}
|
|
178
|
+
if (!found) {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
i--; continue;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
if (comb === '+') {
|
|
185
|
+
const sib = current!.previousElementSibling as Element | null;
|
|
186
|
+
if (!sib) {
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
if (!memo(sib, needed.simple, matchesSimple)) {
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
current = sib; i--; continue;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (comb === '~') {
|
|
196
|
+
let sib = current!.previousElementSibling as Element | null, found = false;
|
|
197
|
+
while (sib) {
|
|
198
|
+
if (memo(sib, needed.simple, matchesSimple)) {
|
|
199
|
+
current = sib;
|
|
200
|
+
found = true;
|
|
201
|
+
break;
|
|
202
|
+
}
|
|
203
|
+
sib = sib.previousElementSibling as Element | null;
|
|
204
|
+
}
|
|
205
|
+
if (!found) {
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
i--; continue;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// sem combinador à esquerda (primeiro item, raro cair aqui)
|
|
212
|
+
if (!memo(current!, needed.simple, matchesSimple)) {
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
i--;
|
|
216
|
+
}
|
|
217
|
+
return true;
|
|
218
|
+
};
|
|
219
|
+
}
|