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