@tamagui/style-grammar 0.0.0-bootstrap.0 → 3.0.0-beta.643.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/LICENSE +21 -0
- package/README.md +33 -1
- package/dist/cjs/backgroundFamily.cjs +176 -0
- package/dist/cjs/backgroundFamily.native.cjs +195 -0
- package/dist/cjs/backgroundFamily.native.js +197 -0
- package/dist/cjs/backgroundFamily.native.js.map +1 -0
- package/dist/cjs/borderFamily.cjs +169 -0
- package/dist/cjs/borderFamily.native.cjs +247 -0
- package/dist/cjs/borderFamily.native.js +249 -0
- package/dist/cjs/borderFamily.native.js.map +1 -0
- package/dist/cjs/candidate.cjs +608 -0
- package/dist/cjs/candidate.native.cjs +821 -0
- package/dist/cjs/candidate.native.js +823 -0
- package/dist/cjs/candidate.native.js.map +1 -0
- package/dist/cjs/candidateTarget.cjs +50 -0
- package/dist/cjs/candidateTarget.native.cjs +88 -0
- package/dist/cjs/candidateTarget.native.js +90 -0
- package/dist/cjs/candidateTarget.native.js.map +1 -0
- package/dist/cjs/clauseCapability.cjs +130 -0
- package/dist/cjs/clauseCapability.native.cjs +152 -0
- package/dist/cjs/clauseCapability.native.js +154 -0
- package/dist/cjs/clauseCapability.native.js.map +1 -0
- package/dist/cjs/clausePrecedence.cjs +153 -0
- package/dist/cjs/clausePrecedence.native.cjs +204 -0
- package/dist/cjs/clausePrecedence.native.js +206 -0
- package/dist/cjs/clausePrecedence.native.js.map +1 -0
- package/dist/cjs/clauseSources.cjs +47 -0
- package/dist/cjs/clauseSources.native.cjs +49 -0
- package/dist/cjs/clauseSources.native.js +51 -0
- package/dist/cjs/clauseSources.native.js.map +1 -0
- package/dist/cjs/config.cjs +130 -0
- package/dist/cjs/config.native.cjs +185 -0
- package/dist/cjs/config.native.js +187 -0
- package/dist/cjs/config.native.js.map +1 -0
- package/dist/cjs/evaluateProgram.cjs +65 -0
- package/dist/cjs/evaluateProgram.native.cjs +70 -0
- package/dist/cjs/evaluateProgram.native.js +72 -0
- package/dist/cjs/evaluateProgram.native.js.map +1 -0
- package/dist/cjs/fontShorthand.cjs +207 -0
- package/dist/cjs/fontShorthand.native.cjs +260 -0
- package/dist/cjs/fontShorthand.native.js +262 -0
- package/dist/cjs/fontShorthand.native.js.map +1 -0
- package/dist/cjs/geometricShorthand.cjs +122 -0
- package/dist/cjs/geometricShorthand.native.cjs +128 -0
- package/dist/cjs/geometricShorthand.native.js +130 -0
- package/dist/cjs/geometricShorthand.native.js.map +1 -0
- package/dist/cjs/index.cjs +19 -0
- package/dist/cjs/index.native.cjs +21 -0
- package/dist/cjs/index.native.js +23 -0
- package/dist/cjs/index.native.js.map +1 -0
- package/dist/cjs/lowerProgram.cjs +205 -0
- package/dist/cjs/lowerProgram.native.cjs +257 -0
- package/dist/cjs/lowerProgram.native.js +259 -0
- package/dist/cjs/lowerProgram.native.js.map +1 -0
- package/dist/cjs/mergeFlatValues.cjs +50 -0
- package/dist/cjs/mergeFlatValues.native.cjs +71 -0
- package/dist/cjs/mergeFlatValues.native.js +73 -0
- package/dist/cjs/mergeFlatValues.native.js.map +1 -0
- package/dist/cjs/modifierRegistry.cjs +246 -0
- package/dist/cjs/modifierRegistry.native.cjs +426 -0
- package/dist/cjs/modifierRegistry.native.js +428 -0
- package/dist/cjs/modifierRegistry.native.js.map +1 -0
- package/dist/cjs/payloadShape.cjs +69 -0
- package/dist/cjs/payloadShape.native.cjs +71 -0
- package/dist/cjs/payloadShape.native.js +73 -0
- package/dist/cjs/payloadShape.native.js.map +1 -0
- package/dist/cjs/programEligibility.cjs +46 -0
- package/dist/cjs/programEligibility.native.cjs +48 -0
- package/dist/cjs/programEligibility.native.js +50 -0
- package/dist/cjs/programEligibility.native.js.map +1 -0
- package/dist/cjs/programHash.cjs +86 -0
- package/dist/cjs/programHash.native.cjs +106 -0
- package/dist/cjs/programHash.native.js +108 -0
- package/dist/cjs/programHash.native.js.map +1 -0
- package/dist/cjs/programs.cjs +128 -0
- package/dist/cjs/programs.native.cjs +220 -0
- package/dist/cjs/programs.native.js +222 -0
- package/dist/cjs/programs.native.js.map +1 -0
- package/dist/cjs/registry.cjs +629 -0
- package/dist/cjs/registry.native.cjs +635 -0
- package/dist/cjs/registry.native.js +637 -0
- package/dist/cjs/registry.native.js.map +1 -0
- package/dist/cjs/resolvePayload.cjs +296 -0
- package/dist/cjs/resolvePayload.native.cjs +302 -0
- package/dist/cjs/resolvePayload.native.js +304 -0
- package/dist/cjs/resolvePayload.native.js.map +1 -0
- package/dist/cjs/runtime.cjs +50 -0
- package/dist/cjs/runtime.native.cjs +52 -0
- package/dist/cjs/runtime.native.js +54 -0
- package/dist/cjs/runtime.native.js.map +1 -0
- package/dist/cjs/safeAreaVariables.cjs +42 -0
- package/dist/cjs/safeAreaVariables.native.cjs +44 -0
- package/dist/cjs/safeAreaVariables.native.js +46 -0
- package/dist/cjs/safeAreaVariables.native.js.map +1 -0
- package/dist/cjs/scanFlatValue.cjs +181 -0
- package/dist/cjs/scanFlatValue.native.cjs +183 -0
- package/dist/cjs/scanFlatValue.native.js +185 -0
- package/dist/cjs/scanFlatValue.native.js.map +1 -0
- package/dist/cjs/serializePayload.cjs +149 -0
- package/dist/cjs/serializePayload.native.cjs +187 -0
- package/dist/cjs/serializePayload.native.js +189 -0
- package/dist/cjs/serializePayload.native.js.map +1 -0
- package/dist/cjs/stateModifiers.cjs +43 -0
- package/dist/cjs/stateModifiers.native.cjs +45 -0
- package/dist/cjs/stateModifiers.native.js +47 -0
- package/dist/cjs/stateModifiers.native.js.map +1 -0
- package/dist/cjs/states.cjs +97 -0
- package/dist/cjs/states.native.cjs +131 -0
- package/dist/cjs/states.native.js +133 -0
- package/dist/cjs/states.native.js.map +1 -0
- package/dist/cjs/table.cjs +54 -0
- package/dist/cjs/table.native.cjs +135 -0
- package/dist/cjs/table.native.js +137 -0
- package/dist/cjs/table.native.js.map +1 -0
- package/dist/cjs/textDecorationFamily.cjs +129 -0
- package/dist/cjs/textDecorationFamily.native.cjs +199 -0
- package/dist/cjs/textDecorationFamily.native.js +201 -0
- package/dist/cjs/textDecorationFamily.native.js.map +1 -0
- package/dist/cjs/tooling.cjs +26 -0
- package/dist/cjs/tooling.native.cjs +28 -0
- package/dist/cjs/tooling.native.js +30 -0
- package/dist/cjs/tooling.native.js.map +1 -0
- package/dist/cjs/toolingAnnotations.cjs +105 -0
- package/dist/cjs/toolingAnnotations.native.cjs +133 -0
- package/dist/cjs/toolingAnnotations.native.js +135 -0
- package/dist/cjs/toolingAnnotations.native.js.map +1 -0
- package/dist/cjs/toolingDiagnostics.cjs +459 -0
- package/dist/cjs/toolingDiagnostics.native.cjs +788 -0
- package/dist/cjs/toolingDiagnostics.native.js +790 -0
- package/dist/cjs/toolingDiagnostics.native.js.map +1 -0
- package/dist/cjs/toolingRegistry.cjs +159 -0
- package/dist/cjs/toolingRegistry.native.cjs +164 -0
- package/dist/cjs/toolingRegistry.native.js +166 -0
- package/dist/cjs/toolingRegistry.native.js.map +1 -0
- package/dist/cjs/transformFamily.cjs +425 -0
- package/dist/cjs/transformFamily.native.cjs +517 -0
- package/dist/cjs/transformFamily.native.js +519 -0
- package/dist/cjs/transformFamily.native.js.map +1 -0
- package/dist/cjs/transition.cjs +459 -0
- package/dist/cjs/transition.native.cjs +499 -0
- package/dist/cjs/transition.native.js +501 -0
- package/dist/cjs/transition.native.js.map +1 -0
- package/dist/cjs/transitionAlign.cjs +115 -0
- package/dist/cjs/transitionAlign.native.cjs +154 -0
- package/dist/cjs/transitionAlign.native.js +156 -0
- package/dist/cjs/transitionAlign.native.js.map +1 -0
- package/dist/cjs/transitionLegacy.cjs +217 -0
- package/dist/cjs/transitionLegacy.native.cjs +260 -0
- package/dist/cjs/transitionLegacy.native.js +262 -0
- package/dist/cjs/transitionLegacy.native.js.map +1 -0
- package/dist/cjs/transitionNative.cjs +281 -0
- package/dist/cjs/transitionNative.native.cjs +285 -0
- package/dist/cjs/transitionNative.native.js +287 -0
- package/dist/cjs/transitionNative.native.js.map +1 -0
- package/dist/cjs/unitlessNumbers.cjs +86 -0
- package/dist/cjs/unitlessNumbers.native.cjs +106 -0
- package/dist/cjs/unitlessNumbers.native.js +108 -0
- package/dist/cjs/unitlessNumbers.native.js.map +1 -0
- package/dist/cjs/v6ThemeNames.cjs +47 -0
- package/dist/cjs/v6ThemeNames.native.cjs +53 -0
- package/dist/cjs/v6ThemeNames.native.js +55 -0
- package/dist/cjs/v6ThemeNames.native.js.map +1 -0
- package/dist/cjs/valueParser.cjs +148 -0
- package/dist/cjs/valueParser.native.cjs +150 -0
- package/dist/cjs/valueParser.native.js +152 -0
- package/dist/cjs/valueParser.native.js.map +1 -0
- package/dist/cjs/valueTypes.cjs +38 -0
- package/dist/cjs/valueTypes.native.cjs +40 -0
- package/dist/cjs/valueTypes.native.js +42 -0
- package/dist/cjs/valueTypes.native.js.map +1 -0
- package/dist/esm/backgroundFamily.mjs +150 -0
- package/dist/esm/backgroundFamily.mjs.map +1 -0
- package/dist/esm/backgroundFamily.native.js +167 -0
- package/dist/esm/backgroundFamily.native.js.map +1 -0
- package/dist/esm/borderFamily.mjs +146 -0
- package/dist/esm/borderFamily.mjs.map +1 -0
- package/dist/esm/borderFamily.native.js +222 -0
- package/dist/esm/borderFamily.native.js.map +1 -0
- package/dist/esm/candidate.mjs +581 -0
- package/dist/esm/candidate.mjs.map +1 -0
- package/dist/esm/candidate.native.js +792 -0
- package/dist/esm/candidate.native.js.map +1 -0
- package/dist/esm/candidateTarget.mjs +29 -0
- package/dist/esm/candidateTarget.mjs.map +1 -0
- package/dist/esm/candidateTarget.native.js +65 -0
- package/dist/esm/candidateTarget.native.js.map +1 -0
- package/dist/esm/clauseCapability.mjs +107 -0
- package/dist/esm/clauseCapability.mjs.map +1 -0
- package/dist/esm/clauseCapability.native.js +127 -0
- package/dist/esm/clauseCapability.native.js.map +1 -0
- package/dist/esm/clausePrecedence.mjs +121 -0
- package/dist/esm/clausePrecedence.mjs.map +1 -0
- package/dist/esm/clausePrecedence.native.js +170 -0
- package/dist/esm/clausePrecedence.native.js.map +1 -0
- package/dist/esm/clauseSources.mjs +23 -0
- package/dist/esm/clauseSources.mjs.map +1 -0
- package/dist/esm/clauseSources.native.js +23 -0
- package/dist/esm/clauseSources.native.js.map +1 -0
- package/dist/esm/config.mjs +103 -0
- package/dist/esm/config.mjs.map +1 -0
- package/dist/esm/config.native.js +156 -0
- package/dist/esm/config.native.js.map +1 -0
- package/dist/esm/evaluateProgram.mjs +45 -0
- package/dist/esm/evaluateProgram.mjs.map +1 -0
- package/dist/esm/evaluateProgram.native.js +48 -0
- package/dist/esm/evaluateProgram.native.js.map +1 -0
- package/dist/esm/fontShorthand.mjs +184 -0
- package/dist/esm/fontShorthand.mjs.map +1 -0
- package/dist/esm/fontShorthand.native.js +235 -0
- package/dist/esm/fontShorthand.native.js.map +1 -0
- package/dist/esm/geometricShorthand.mjs +102 -0
- package/dist/esm/geometricShorthand.mjs.map +1 -0
- package/dist/esm/geometricShorthand.native.js +106 -0
- package/dist/esm/geometricShorthand.native.js.map +1 -0
- package/dist/esm/index.mjs +1 -0
- package/dist/esm/index.native.js +1 -0
- package/dist/esm/lowerProgram.mjs +182 -0
- package/dist/esm/lowerProgram.mjs.map +1 -0
- package/dist/esm/lowerProgram.native.js +232 -0
- package/dist/esm/lowerProgram.native.js.map +1 -0
- package/dist/esm/mergeFlatValues.mjs +27 -0
- package/dist/esm/mergeFlatValues.mjs.map +1 -0
- package/dist/esm/mergeFlatValues.native.js +46 -0
- package/dist/esm/mergeFlatValues.native.js.map +1 -0
- package/dist/esm/modifierRegistry.mjs +219 -0
- package/dist/esm/modifierRegistry.mjs.map +1 -0
- package/dist/esm/modifierRegistry.native.js +397 -0
- package/dist/esm/modifierRegistry.native.js.map +1 -0
- package/dist/esm/payloadShape.mjs +49 -0
- package/dist/esm/payloadShape.mjs.map +1 -0
- package/dist/esm/payloadShape.native.js +49 -0
- package/dist/esm/payloadShape.native.js.map +1 -0
- package/dist/esm/programEligibility.mjs +22 -0
- package/dist/esm/programEligibility.mjs.map +1 -0
- package/dist/esm/programEligibility.native.js +22 -0
- package/dist/esm/programEligibility.native.js.map +1 -0
- package/dist/esm/programHash.mjs +62 -0
- package/dist/esm/programHash.mjs.map +1 -0
- package/dist/esm/programHash.native.js +80 -0
- package/dist/esm/programHash.native.js.map +1 -0
- package/dist/esm/programs.mjs +103 -0
- package/dist/esm/programs.mjs.map +1 -0
- package/dist/esm/programs.native.js +193 -0
- package/dist/esm/programs.native.js.map +1 -0
- package/dist/esm/registry.mjs +595 -0
- package/dist/esm/registry.mjs.map +1 -0
- package/dist/esm/registry.native.js +599 -0
- package/dist/esm/registry.native.js.map +1 -0
- package/dist/esm/resolvePayload.mjs +273 -0
- package/dist/esm/resolvePayload.mjs.map +1 -0
- package/dist/esm/resolvePayload.native.js +277 -0
- package/dist/esm/resolvePayload.native.js.map +1 -0
- package/dist/esm/runtime.mjs +63 -0
- package/dist/esm/runtime.native.js +63 -0
- package/dist/esm/safeAreaVariables.mjs +18 -0
- package/dist/esm/safeAreaVariables.mjs.map +1 -0
- package/dist/esm/safeAreaVariables.native.js +18 -0
- package/dist/esm/safeAreaVariables.native.js.map +1 -0
- package/dist/esm/scanFlatValue.mjs +160 -0
- package/dist/esm/scanFlatValue.mjs.map +1 -0
- package/dist/esm/scanFlatValue.native.js +160 -0
- package/dist/esm/scanFlatValue.native.js.map +1 -0
- package/dist/esm/serializePayload.mjs +125 -0
- package/dist/esm/serializePayload.mjs.map +1 -0
- package/dist/esm/serializePayload.native.js +161 -0
- package/dist/esm/serializePayload.native.js.map +1 -0
- package/dist/esm/stateModifiers.mjs +19 -0
- package/dist/esm/stateModifiers.mjs.map +1 -0
- package/dist/esm/stateModifiers.native.js +19 -0
- package/dist/esm/stateModifiers.native.js.map +1 -0
- package/dist/esm/states.mjs +69 -0
- package/dist/esm/states.mjs.map +1 -0
- package/dist/esm/states.native.js +101 -0
- package/dist/esm/states.native.js.map +1 -0
- package/dist/esm/table.mjs +31 -0
- package/dist/esm/table.mjs.map +1 -0
- package/dist/esm/table.native.js +110 -0
- package/dist/esm/table.native.js.map +1 -0
- package/dist/esm/textDecorationFamily.mjs +106 -0
- package/dist/esm/textDecorationFamily.mjs.map +1 -0
- package/dist/esm/textDecorationFamily.native.js +174 -0
- package/dist/esm/textDecorationFamily.native.js.map +1 -0
- package/dist/esm/tooling.mjs +15 -0
- package/dist/esm/tooling.native.js +15 -0
- package/dist/esm/toolingAnnotations.mjs +85 -0
- package/dist/esm/toolingAnnotations.mjs.map +1 -0
- package/dist/esm/toolingAnnotations.native.js +111 -0
- package/dist/esm/toolingAnnotations.native.js.map +1 -0
- package/dist/esm/toolingDiagnostics.mjs +428 -0
- package/dist/esm/toolingDiagnostics.mjs.map +1 -0
- package/dist/esm/toolingDiagnostics.native.js +755 -0
- package/dist/esm/toolingDiagnostics.native.js.map +1 -0
- package/dist/esm/toolingRegistry.mjs +135 -0
- package/dist/esm/toolingRegistry.mjs.map +1 -0
- package/dist/esm/toolingRegistry.native.js +138 -0
- package/dist/esm/toolingRegistry.native.js.map +1 -0
- package/dist/esm/transformFamily.mjs +392 -0
- package/dist/esm/transformFamily.mjs.map +1 -0
- package/dist/esm/transformFamily.native.js +482 -0
- package/dist/esm/transformFamily.native.js.map +1 -0
- package/dist/esm/transition.mjs +434 -0
- package/dist/esm/transition.mjs.map +1 -0
- package/dist/esm/transition.native.js +472 -0
- package/dist/esm/transition.native.js.map +1 -0
- package/dist/esm/transitionAlign.mjs +95 -0
- package/dist/esm/transitionAlign.mjs.map +1 -0
- package/dist/esm/transitionAlign.native.js +132 -0
- package/dist/esm/transitionAlign.native.js.map +1 -0
- package/dist/esm/transitionLegacy.mjs +197 -0
- package/dist/esm/transitionLegacy.mjs.map +1 -0
- package/dist/esm/transitionLegacy.native.js +238 -0
- package/dist/esm/transitionLegacy.native.js.map +1 -0
- package/dist/esm/transitionNative.mjs +257 -0
- package/dist/esm/transitionNative.mjs.map +1 -0
- package/dist/esm/transitionNative.native.js +259 -0
- package/dist/esm/transitionNative.native.js.map +1 -0
- package/dist/esm/unitlessNumbers.mjs +65 -0
- package/dist/esm/unitlessNumbers.mjs.map +1 -0
- package/dist/esm/unitlessNumbers.native.js +83 -0
- package/dist/esm/unitlessNumbers.native.js.map +1 -0
- package/dist/esm/v6ThemeNames.mjs +23 -0
- package/dist/esm/v6ThemeNames.mjs.map +1 -0
- package/dist/esm/v6ThemeNames.native.js +27 -0
- package/dist/esm/v6ThemeNames.native.js.map +1 -0
- package/dist/esm/valueParser.mjs +125 -0
- package/dist/esm/valueParser.mjs.map +1 -0
- package/dist/esm/valueParser.native.js +125 -0
- package/dist/esm/valueParser.native.js.map +1 -0
- package/dist/esm/valueTypes.mjs +14 -0
- package/dist/esm/valueTypes.mjs.map +1 -0
- package/dist/esm/valueTypes.native.js +14 -0
- package/dist/esm/valueTypes.native.js.map +1 -0
- package/package.json +98 -4
- package/src/backgroundFamily.ts +182 -0
- package/src/borderFamily.ts +172 -0
- package/src/candidate.ts +691 -0
- package/src/candidateTarget.ts +67 -0
- package/src/clauseCapability.ts +209 -0
- package/src/clausePrecedence.ts +198 -0
- package/src/clauseSources.ts +29 -0
- package/src/config.ts +169 -0
- package/src/evaluateProgram.ts +91 -0
- package/src/fontShorthand.ts +177 -0
- package/src/geometricShorthand.ts +105 -0
- package/src/index.ts +1 -0
- package/src/lowerProgram.ts +398 -0
- package/src/modifierRegistry.ts +340 -0
- package/src/payloadShape.ts +92 -0
- package/src/programEligibility.ts +46 -0
- package/src/programHash.ts +128 -0
- package/src/programs.ts +95 -0
- package/src/registry.ts +367 -0
- package/src/resolvePayload.ts +480 -0
- package/src/runtime.ts +32 -0
- package/src/safeAreaVariables.ts +19 -0
- package/src/scanFlatValue.ts +327 -0
- package/src/serializePayload.ts +199 -0
- package/src/stateModifiers.ts +36 -0
- package/src/states.ts +128 -0
- package/src/table.ts +47 -0
- package/src/textDecorationFamily.ts +119 -0
- package/src/tooling.ts +8 -0
- package/src/toolingAnnotations.ts +151 -0
- package/src/toolingDiagnostics.ts +735 -0
- package/src/toolingRegistry.ts +130 -0
- package/src/transformFamily.ts +590 -0
- package/src/transition.ts +553 -0
- package/src/transitionAlign.ts +165 -0
- package/src/transitionLegacy.ts +237 -0
- package/src/transitionNative.ts +357 -0
- package/src/unitlessNumbers.ts +61 -0
- package/src/v6ThemeNames.ts +40 -0
- package/src/valueParser.ts +193 -0
- package/src/valueTypes.ts +136 -0
- package/types/backgroundFamily.d.ts +17 -0
- package/types/backgroundFamily.d.ts.map +11 -0
- package/types/borderFamily.d.ts +23 -0
- package/types/borderFamily.d.ts.map +11 -0
- package/types/candidate.d.ts +52 -0
- package/types/candidate.d.ts.map +11 -0
- package/types/candidateTarget.d.ts +32 -0
- package/types/candidateTarget.d.ts.map +11 -0
- package/types/clauseCapability.d.ts +69 -0
- package/types/clauseCapability.d.ts.map +11 -0
- package/types/clausePrecedence.d.ts +30 -0
- package/types/clausePrecedence.d.ts.map +11 -0
- package/types/clauseSources.d.ts +12 -0
- package/types/clauseSources.d.ts.map +11 -0
- package/types/config.d.ts +44 -0
- package/types/config.d.ts.map +11 -0
- package/types/evaluateProgram.d.ts +27 -0
- package/types/evaluateProgram.d.ts.map +11 -0
- package/types/fontShorthand.d.ts +25 -0
- package/types/fontShorthand.d.ts.map +11 -0
- package/types/geometricShorthand.d.ts +21 -0
- package/types/geometricShorthand.d.ts.map +11 -0
- package/types/index.d.ts +3 -0
- package/types/index.d.ts.map +11 -0
- package/types/lowerProgram.d.ts +73 -0
- package/types/lowerProgram.d.ts.map +11 -0
- package/types/mergeFlatValues.d.ts +14 -0
- package/types/mergeFlatValues.d.ts.map +11 -0
- package/types/modifierRegistry.d.ts +70 -0
- package/types/modifierRegistry.d.ts.map +11 -0
- package/types/payloadShape.d.ts +15 -0
- package/types/payloadShape.d.ts.map +11 -0
- package/types/programEligibility.d.ts +23 -0
- package/types/programEligibility.d.ts.map +11 -0
- package/types/programHash.d.ts +20 -0
- package/types/programHash.d.ts.map +11 -0
- package/types/programs.d.ts +18 -0
- package/types/programs.d.ts.map +11 -0
- package/types/registry.d.ts +24 -0
- package/types/registry.d.ts.map +11 -0
- package/types/resolvePayload.d.ts +75 -0
- package/types/resolvePayload.d.ts.map +11 -0
- package/types/runtime.d.ts +34 -0
- package/types/runtime.d.ts.map +11 -0
- package/types/safeAreaVariables.d.ts +5 -0
- package/types/safeAreaVariables.d.ts.map +11 -0
- package/types/scanFlatValue.d.ts +29 -0
- package/types/scanFlatValue.d.ts.map +11 -0
- package/types/serializePayload.d.ts +13 -0
- package/types/serializePayload.d.ts.map +11 -0
- package/types/stateModifiers.d.ts +14 -0
- package/types/stateModifiers.d.ts.map +11 -0
- package/types/states.d.ts +22 -0
- package/types/states.d.ts.map +11 -0
- package/types/table.d.ts +4 -0
- package/types/table.d.ts.map +11 -0
- package/types/textDecorationFamily.d.ts +23 -0
- package/types/textDecorationFamily.d.ts.map +11 -0
- package/types/tooling.d.ts +10 -0
- package/types/tooling.d.ts.map +11 -0
- package/types/toolingAnnotations.d.ts +29 -0
- package/types/toolingAnnotations.d.ts.map +11 -0
- package/types/toolingDiagnostics.d.ts +114 -0
- package/types/toolingDiagnostics.d.ts.map +11 -0
- package/types/toolingRegistry.d.ts +10 -0
- package/types/toolingRegistry.d.ts.map +11 -0
- package/types/transformFamily.d.ts +83 -0
- package/types/transformFamily.d.ts.map +11 -0
- package/types/transition.d.ts +65 -0
- package/types/transition.d.ts.map +11 -0
- package/types/transitionAlign.d.ts +15 -0
- package/types/transitionAlign.d.ts.map +11 -0
- package/types/transitionLegacy.d.ts +9 -0
- package/types/transitionLegacy.d.ts.map +11 -0
- package/types/transitionNative.d.ts +41 -0
- package/types/transitionNative.d.ts.map +11 -0
- package/types/unitlessNumbers.d.ts +3 -0
- package/types/unitlessNumbers.d.ts.map +11 -0
- package/types/v6ThemeNames.d.ts +7 -0
- package/types/v6ThemeNames.d.ts.map +11 -0
- package/types/valueParser.d.ts +36 -0
- package/types/valueParser.d.ts.map +11 -0
- package/types/valueTypes.d.ts +66 -0
- package/types/valueTypes.d.ts.map +11 -0
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
// Config-first identifier resolution inside one clause payload.
|
|
2
|
+
//
|
|
3
|
+
// See plans/dom-tailwind-flat-values.md — "the resolver's mechanical contract".
|
|
4
|
+
// Step 3 of the shared pipeline: the parser has already split the program, and
|
|
5
|
+
// this turns one payload into static text runs plus reference nodes, which the
|
|
6
|
+
// two serializers in ./serializePayload render for web and native. One
|
|
7
|
+
// implementation serves both platforms, so resolution never bakes in a target.
|
|
8
|
+
//
|
|
9
|
+
// What is a candidate:
|
|
10
|
+
//
|
|
11
|
+
// - ident tokens anywhere, including inside function arguments, so
|
|
12
|
+
// `linear-gradient(135deg, accent, blue)` resolves `accent`;
|
|
13
|
+
// - never inside a string, never inside an unquoted `url()` body, never a
|
|
14
|
+
// function name, never a `--*` custom-property reference;
|
|
15
|
+
// - bare numbers only when the property binds a numeric token category, and only
|
|
16
|
+
// as a whole component value: `4 8` resolves both, `0 2px` resolves neither for
|
|
17
|
+
// box-shadow because it binds no numeric category. Numbers with units are
|
|
18
|
+
// always literal.
|
|
19
|
+
//
|
|
20
|
+
// A lookup miss stays literal text. Typos in literal positions are the
|
|
21
|
+
// compiler's and language service's job, never a runtime guess — so with a
|
|
22
|
+
// lookup that resolves nothing, both serializers reproduce the input exactly.
|
|
23
|
+
|
|
24
|
+
import { reservedCssIdents } from './valueTypes'
|
|
25
|
+
|
|
26
|
+
export type ReferenceKind = 'color' | 'length' | 'number' | 'other'
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* What a lookup returns for a configured token or variable. Intentionally open:
|
|
30
|
+
* the variables unification (design item 11) can carry more here, and extra
|
|
31
|
+
* fields ride through onto the emitted reference.
|
|
32
|
+
*/
|
|
33
|
+
export interface ResolvedReference {
|
|
34
|
+
/** the resolved name, which is what the serializers key on */
|
|
35
|
+
name: string
|
|
36
|
+
kind: ReferenceKind
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** a resolved reference in a payload, with its color opacity suffix if any */
|
|
40
|
+
export type PayloadReference = ResolvedReference & {
|
|
41
|
+
/** integer 1-99; only ever present when `kind` is `color` */
|
|
42
|
+
opacity?: number
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export type PayloadSegment = string | PayloadReference
|
|
46
|
+
|
|
47
|
+
export type PayloadResolveErrorCode =
|
|
48
|
+
/** the suffix is recognized only directly after a resolved color token */
|
|
49
|
+
| 'opacity-on-non-color'
|
|
50
|
+
/** a suffix on a resolved color token that is not an integer 0 through 100 */
|
|
51
|
+
| 'opacity-out-of-range'
|
|
52
|
+
|
|
53
|
+
export interface PayloadResolveError {
|
|
54
|
+
code: PayloadResolveErrorCode
|
|
55
|
+
/** character offset of the identifier within the payload */
|
|
56
|
+
index: number
|
|
57
|
+
message: string
|
|
58
|
+
/** the identifier the suffix was applied to, without the suffix */
|
|
59
|
+
name: string
|
|
60
|
+
/** the percentage as authored, which may be out of range or fractional */
|
|
61
|
+
opacity: number
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
interface OpacitySuffix {
|
|
65
|
+
/** index just past the suffix */
|
|
66
|
+
end: number
|
|
67
|
+
/** the percentage, or null when it is not a valid integer 0 through 100 */
|
|
68
|
+
percentage: number | null
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export interface ResolvedPayload {
|
|
72
|
+
/** static text runs and references, in payload order; adjacent text collapses */
|
|
73
|
+
segments: readonly PayloadSegment[]
|
|
74
|
+
/** every reference in `segments`, same objects, in order */
|
|
75
|
+
references: readonly PayloadReference[]
|
|
76
|
+
errors: readonly PayloadResolveError[]
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export interface ResolvePayloadOptions {
|
|
80
|
+
/** the property's bound token categories first, then the variables namespace */
|
|
81
|
+
lookup(name: string): ResolvedReference | undefined
|
|
82
|
+
/**
|
|
83
|
+
* set when the property binds a numeric token category (space, size, radius,
|
|
84
|
+
* z-index). Off means bare numbers are always literal.
|
|
85
|
+
*/
|
|
86
|
+
resolveNumbers?: boolean
|
|
87
|
+
/**
|
|
88
|
+
* tooling hook: receives every top-level candidate the resolver considered —
|
|
89
|
+
* idents and hex colors always, bare numbers when `resolveNumbers` is set —
|
|
90
|
+
* with its payload offsets and resolution. Skipped positions (strings, url()
|
|
91
|
+
* bodies, function names, custom properties) never report. The runtime path
|
|
92
|
+
* never passes this.
|
|
93
|
+
*/
|
|
94
|
+
onCandidate?(
|
|
95
|
+
start: number,
|
|
96
|
+
end: number,
|
|
97
|
+
name: string,
|
|
98
|
+
resolved: PayloadReference | undefined
|
|
99
|
+
): void
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// CSS-wide keywords are case-insensitive, and the shared set spells one of them
|
|
103
|
+
// camelCase (`currentColor`), so both sides of the comparison have to fold
|
|
104
|
+
const reservedFolded: ReadonlySet<string> = new Set(
|
|
105
|
+
Array.from(reservedCssIdents, (ident) => ident.toLowerCase())
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
const noReferences: readonly PayloadReference[] = Object.freeze([])
|
|
109
|
+
const noErrors: readonly PayloadResolveError[] = Object.freeze([])
|
|
110
|
+
|
|
111
|
+
const CHAR_TAB = 9
|
|
112
|
+
const CHAR_LF = 10
|
|
113
|
+
const CHAR_FF = 12
|
|
114
|
+
const CHAR_CR = 13
|
|
115
|
+
const CHAR_SPACE = 32
|
|
116
|
+
const CHAR_PERCENT = 37
|
|
117
|
+
const CHAR_HASH = 35
|
|
118
|
+
const CHAR_DOUBLE_QUOTE = 34
|
|
119
|
+
const CHAR_SINGLE_QUOTE = 39
|
|
120
|
+
const CHAR_PAREN_OPEN = 40
|
|
121
|
+
const CHAR_PAREN_CLOSE = 41
|
|
122
|
+
const CHAR_PLUS = 43
|
|
123
|
+
const CHAR_COMMA = 44
|
|
124
|
+
const CHAR_MINUS = 45
|
|
125
|
+
const CHAR_DOT = 46
|
|
126
|
+
const CHAR_SLASH = 47
|
|
127
|
+
const CHAR_UNDERSCORE = 95
|
|
128
|
+
const CHAR_BACKSLASH = 92
|
|
129
|
+
const CHAR_E_LOWER = 101
|
|
130
|
+
const CHAR_E_UPPER = 69
|
|
131
|
+
|
|
132
|
+
function isWhitespace(code: number): boolean {
|
|
133
|
+
return (
|
|
134
|
+
code === CHAR_SPACE ||
|
|
135
|
+
code === CHAR_TAB ||
|
|
136
|
+
code === CHAR_LF ||
|
|
137
|
+
code === CHAR_CR ||
|
|
138
|
+
code === CHAR_FF
|
|
139
|
+
)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function isDigit(code: number): boolean {
|
|
143
|
+
return code >= 48 && code <= 57
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function isLetter(code: number): boolean {
|
|
147
|
+
return (code >= 97 && code <= 122) || (code >= 65 && code <= 90)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function isIdentStart(code: number): boolean {
|
|
151
|
+
return (
|
|
152
|
+
isLetter(code) ||
|
|
153
|
+
code === CHAR_UNDERSCORE ||
|
|
154
|
+
code === CHAR_MINUS ||
|
|
155
|
+
code === CHAR_BACKSLASH ||
|
|
156
|
+
// non-ascii idents are legal CSS and may name a configured token
|
|
157
|
+
code > 127
|
|
158
|
+
)
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function isIdentPart(code: number): boolean {
|
|
162
|
+
return isIdentStart(code) || isDigit(code)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/** a component-value boundary, with -1 meaning start or end of the payload */
|
|
166
|
+
function isBoundary(code: number): boolean {
|
|
167
|
+
return (
|
|
168
|
+
code === -1 ||
|
|
169
|
+
isWhitespace(code) ||
|
|
170
|
+
code === CHAR_COMMA ||
|
|
171
|
+
code === CHAR_PAREN_OPEN ||
|
|
172
|
+
code === CHAR_PAREN_CLOSE
|
|
173
|
+
)
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
export function resolvePayload(
|
|
177
|
+
payload: string,
|
|
178
|
+
options: ResolvePayloadOptions
|
|
179
|
+
): ResolvedPayload {
|
|
180
|
+
const { lookup, resolveNumbers = false, onCandidate } = options
|
|
181
|
+
const length = payload.length
|
|
182
|
+
|
|
183
|
+
const segments: PayloadSegment[] = []
|
|
184
|
+
let references: PayloadReference[] | null = null
|
|
185
|
+
let errors: PayloadResolveError[] | null = null
|
|
186
|
+
// start of the static run not yet pushed
|
|
187
|
+
let staticStart = 0
|
|
188
|
+
|
|
189
|
+
const codeAt = (index: number): number =>
|
|
190
|
+
index >= 0 && index < length ? payload.charCodeAt(index) : -1
|
|
191
|
+
|
|
192
|
+
const pushReference = (start: number, end: number, reference: PayloadReference) => {
|
|
193
|
+
if (start > staticStart) segments.push(payload.slice(staticStart, start))
|
|
194
|
+
segments.push(reference)
|
|
195
|
+
;(references ||= []).push(reference)
|
|
196
|
+
staticStart = end
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
let index = 0
|
|
200
|
+
while (index < length) {
|
|
201
|
+
const code = payload.charCodeAt(index)
|
|
202
|
+
|
|
203
|
+
// strings are verbatim, including anything ident-shaped inside them
|
|
204
|
+
if (code === CHAR_DOUBLE_QUOTE || code === CHAR_SINGLE_QUOTE) {
|
|
205
|
+
index++
|
|
206
|
+
while (index < length) {
|
|
207
|
+
const inner = payload.charCodeAt(index)
|
|
208
|
+
if (inner === CHAR_BACKSLASH) index += 2
|
|
209
|
+
else if (inner === code) {
|
|
210
|
+
index++
|
|
211
|
+
break
|
|
212
|
+
} else index++
|
|
213
|
+
}
|
|
214
|
+
continue
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// a hex color's digits are not a number token
|
|
218
|
+
if (code === CHAR_HASH) {
|
|
219
|
+
const start = index
|
|
220
|
+
index++
|
|
221
|
+
while (index < length && isIdentPart(payload.charCodeAt(index))) index++
|
|
222
|
+
onCandidate?.(start, index, payload.slice(start, index), undefined)
|
|
223
|
+
continue
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// `-` before a digit is a signed number, not an ident
|
|
227
|
+
if (isIdentStart(code) && !(code === CHAR_MINUS && isDigit(codeAt(index + 1)))) {
|
|
228
|
+
const start = index
|
|
229
|
+
let end = index
|
|
230
|
+
while (end < length && isIdentPart(payload.charCodeAt(end))) {
|
|
231
|
+
end += payload.charCodeAt(end) === CHAR_BACKSLASH ? 2 : 1
|
|
232
|
+
}
|
|
233
|
+
const name = payload.slice(start, Math.min(end, length))
|
|
234
|
+
|
|
235
|
+
// a function name is never a candidate, and an unquoted url() body never
|
|
236
|
+
// resolves, so skip the whole call
|
|
237
|
+
if (codeAt(end) === CHAR_PAREN_OPEN) {
|
|
238
|
+
index = name.toLowerCase() === 'url' ? skipParens(payload, end) : end + 1
|
|
239
|
+
continue
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// custom-property references stay literal
|
|
243
|
+
if (name.startsWith('--')) {
|
|
244
|
+
index = end
|
|
245
|
+
continue
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// CSS-wide keywords are case-insensitive, so the reserved gate is folded.
|
|
249
|
+
// Token names themselves stay case-sensitive: only the gate folds.
|
|
250
|
+
const resolved = reservedFolded.has(name.toLowerCase()) ? undefined : lookup(name)
|
|
251
|
+
|
|
252
|
+
// a numeric run directly after the ident, ending at a component boundary,
|
|
253
|
+
// is an opacity suffix attempt. `center/50%` and `center/cover` are not
|
|
254
|
+
// attempts at all, so ordinary CSS slash forms never come near this.
|
|
255
|
+
const suffix = readOpacitySuffix(payload, end, codeAt)
|
|
256
|
+
|
|
257
|
+
if (suffix !== null && resolved?.kind === 'color') {
|
|
258
|
+
if (suffix.percentage === null) {
|
|
259
|
+
// a malformed percentage on a real color token is the user reaching for
|
|
260
|
+
// opacity and missing, so it is reported rather than emitted as text
|
|
261
|
+
;(errors ||= []).push({
|
|
262
|
+
code: 'opacity-out-of-range',
|
|
263
|
+
index: start,
|
|
264
|
+
message: `"${name}${payload.slice(end, suffix.end)}" is not an opacity suffix: it must be an integer percentage from 0 through 100`,
|
|
265
|
+
name,
|
|
266
|
+
opacity: Number(payload.slice(end + 1, suffix.end)),
|
|
267
|
+
})
|
|
268
|
+
onCandidate?.(start, suffix.end, name, { ...resolved })
|
|
269
|
+
index = suffix.end
|
|
270
|
+
continue
|
|
271
|
+
}
|
|
272
|
+
const reference =
|
|
273
|
+
// 100% is the identity, so it never reaches a serializer
|
|
274
|
+
suffix.percentage === 100
|
|
275
|
+
? { ...resolved }
|
|
276
|
+
: { ...resolved, opacity: suffix.percentage }
|
|
277
|
+
pushReference(start, suffix.end, reference)
|
|
278
|
+
onCandidate?.(start, suffix.end, name, reference)
|
|
279
|
+
index = suffix.end
|
|
280
|
+
continue
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
if (suffix !== null && suffix.percentage !== null) {
|
|
284
|
+
// a well-formed suffix somewhere it cannot apply: the suffix is
|
|
285
|
+
// recognized only directly after a resolved color token. The text stays
|
|
286
|
+
// literal so the payload still round-trips.
|
|
287
|
+
;(errors ||= []).push({
|
|
288
|
+
code: 'opacity-on-non-color',
|
|
289
|
+
index: start,
|
|
290
|
+
message: resolved
|
|
291
|
+
? `"${name}" is not a color token (kind: ${resolved.kind}), so the /${suffix.percentage} opacity suffix does not apply`
|
|
292
|
+
: `"${name}" is not a resolved color token, so the /${suffix.percentage} opacity suffix does not apply`,
|
|
293
|
+
name,
|
|
294
|
+
opacity: suffix.percentage,
|
|
295
|
+
})
|
|
296
|
+
onCandidate?.(start, end, name, resolved ? { ...resolved } : undefined)
|
|
297
|
+
index = suffix.end
|
|
298
|
+
continue
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// no suffix, or a malformed one after an ident that is not a color token,
|
|
302
|
+
// which is ordinary CSS such as `font: bold small/1.2 serif`
|
|
303
|
+
if (!resolved) {
|
|
304
|
+
onCandidate?.(start, end, name, undefined)
|
|
305
|
+
index = end
|
|
306
|
+
continue
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
const reference = { ...resolved }
|
|
310
|
+
pushReference(start, end, reference)
|
|
311
|
+
onCandidate?.(start, end, name, reference)
|
|
312
|
+
index = end
|
|
313
|
+
continue
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
if (
|
|
317
|
+
isDigit(code) ||
|
|
318
|
+
code === CHAR_DOT ||
|
|
319
|
+
((code === CHAR_PLUS || code === CHAR_MINUS) && isDigit(codeAt(index + 1)))
|
|
320
|
+
) {
|
|
321
|
+
const start = index
|
|
322
|
+
let end = index
|
|
323
|
+
if (code === CHAR_PLUS || code === CHAR_MINUS) end++
|
|
324
|
+
while (end < length) {
|
|
325
|
+
const digit = payload.charCodeAt(end)
|
|
326
|
+
if (isDigit(digit) || digit === CHAR_DOT) end++
|
|
327
|
+
else break
|
|
328
|
+
}
|
|
329
|
+
// scientific notation stays part of the number token
|
|
330
|
+
if (codeAt(end) === CHAR_E_LOWER || codeAt(end) === CHAR_E_UPPER) {
|
|
331
|
+
let exponent = end + 1
|
|
332
|
+
if (codeAt(exponent) === CHAR_PLUS || codeAt(exponent) === CHAR_MINUS) exponent++
|
|
333
|
+
if (isDigit(codeAt(exponent))) {
|
|
334
|
+
exponent++
|
|
335
|
+
while (exponent < length && isDigit(payload.charCodeAt(exponent))) exponent++
|
|
336
|
+
end = exponent
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
const numberEnd = end
|
|
340
|
+
|
|
341
|
+
// a unit or percent sign makes it literal
|
|
342
|
+
let unitEnd = numberEnd
|
|
343
|
+
if (codeAt(unitEnd) === CHAR_PERCENT) unitEnd++
|
|
344
|
+
else while (unitEnd < length && isIdentPart(payload.charCodeAt(unitEnd))) unitEnd++
|
|
345
|
+
if (unitEnd > numberEnd) {
|
|
346
|
+
index = unitEnd
|
|
347
|
+
continue
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
// a number resolves only as a WHOLE component value, so it must be
|
|
351
|
+
// bounded on both sides: `4 8` resolves both, `4/8` and `12px/4` neither
|
|
352
|
+
if (
|
|
353
|
+
!resolveNumbers ||
|
|
354
|
+
!isBoundary(codeAt(start - 1)) ||
|
|
355
|
+
!isBoundary(codeAt(numberEnd))
|
|
356
|
+
) {
|
|
357
|
+
index = numberEnd
|
|
358
|
+
continue
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
const name = payload.slice(start, numberEnd)
|
|
362
|
+
const resolved = lookup(name)
|
|
363
|
+
if (resolved) {
|
|
364
|
+
const reference = { ...resolved }
|
|
365
|
+
pushReference(start, numberEnd, reference)
|
|
366
|
+
onCandidate?.(start, numberEnd, name, reference)
|
|
367
|
+
} else {
|
|
368
|
+
onCandidate?.(start, numberEnd, name, undefined)
|
|
369
|
+
}
|
|
370
|
+
index = numberEnd
|
|
371
|
+
continue
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
index++
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
if (staticStart < length) segments.push(payload.slice(staticStart))
|
|
378
|
+
|
|
379
|
+
return {
|
|
380
|
+
segments,
|
|
381
|
+
references: references ?? noReferences,
|
|
382
|
+
errors: errors ?? noErrors,
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
export type ColorOpacitySuffix =
|
|
387
|
+
/** no suffix attempt: `center/cover` and `x/50%` are ordinary CSS */
|
|
388
|
+
| { kind: 'none' }
|
|
389
|
+
/** a valid suffix: unsigned integer 0 through 100 */
|
|
390
|
+
| { kind: 'valid'; name: string; opacity: number }
|
|
391
|
+
/** an attempt that is signed, fractional, or out of range — a diagnostic, never a clamp */
|
|
392
|
+
| { kind: 'invalid'; name: string; raw: string }
|
|
393
|
+
|
|
394
|
+
const opacityAttempt = /^[+-]?\d+(?:\.\d+)?$/
|
|
395
|
+
const opacityValid = /^\d+$/
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* The one owner of the color opacity suffix rule for WHOLE names
|
|
399
|
+
* (`slate-500/50`). Every layer — flat payloads (via `readOpacitySuffix`
|
|
400
|
+
* below, same rules anchored mid-payload), Tailwind candidates, and whole
|
|
401
|
+
* color token values must agree: valid means an unsigned integer 0 through
|
|
402
|
+
* 100; an invalid attempt is a diagnostic and is never clamped or partially
|
|
403
|
+
* applied (review divergence 2).
|
|
404
|
+
*/
|
|
405
|
+
export function splitColorOpacitySuffix(value: string): ColorOpacitySuffix {
|
|
406
|
+
const slash = value.lastIndexOf('/')
|
|
407
|
+
if (slash <= 0 || slash === value.length - 1) return { kind: 'none' }
|
|
408
|
+
const raw = value.slice(slash + 1)
|
|
409
|
+
if (!opacityAttempt.test(raw)) return { kind: 'none' }
|
|
410
|
+
const name = value.slice(0, slash)
|
|
411
|
+
if (opacityValid.test(raw) && Number(raw) <= 100) {
|
|
412
|
+
return { kind: 'valid', name, opacity: Number(raw) }
|
|
413
|
+
}
|
|
414
|
+
return { kind: 'invalid', name, raw }
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/**
|
|
418
|
+
* Reads a `/NN` opacity suffix attempt sitting directly on an ident. An attempt
|
|
419
|
+
* is a numeric run that ends at a component boundary, so `center/cover` and
|
|
420
|
+
* `center/50%` are not attempts and stay ordinary CSS. `percentage` is null when
|
|
421
|
+
* the number is signed, fractional, or outside 0 through 100.
|
|
422
|
+
*/
|
|
423
|
+
function readOpacitySuffix(
|
|
424
|
+
payload: string,
|
|
425
|
+
identEnd: number,
|
|
426
|
+
codeAt: (index: number) => number
|
|
427
|
+
): OpacitySuffix | null {
|
|
428
|
+
if (codeAt(identEnd) !== CHAR_SLASH) return null
|
|
429
|
+
let cursor = identEnd + 1
|
|
430
|
+
let signed = false
|
|
431
|
+
if (codeAt(cursor) === CHAR_MINUS || codeAt(cursor) === CHAR_PLUS) {
|
|
432
|
+
signed = true
|
|
433
|
+
cursor++
|
|
434
|
+
}
|
|
435
|
+
const digitsStart = cursor
|
|
436
|
+
while (isDigit(codeAt(cursor))) cursor++
|
|
437
|
+
if (cursor === digitsStart) return null
|
|
438
|
+
let fractional = false
|
|
439
|
+
if (codeAt(cursor) === CHAR_DOT && isDigit(codeAt(cursor + 1))) {
|
|
440
|
+
fractional = true
|
|
441
|
+
cursor++
|
|
442
|
+
while (isDigit(codeAt(cursor))) cursor++
|
|
443
|
+
}
|
|
444
|
+
if (!isBoundary(codeAt(cursor))) return null
|
|
445
|
+
const value = Number(payload.slice(identEnd + 1, cursor))
|
|
446
|
+
const valid = !signed && !fractional && value >= 0 && value <= 100
|
|
447
|
+
return { end: cursor, percentage: valid ? value : null }
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/** index just past the `)` matching the `(` at `open` */
|
|
451
|
+
function skipParens(payload: string, open: number): number {
|
|
452
|
+
let depth = 0
|
|
453
|
+
let index = open
|
|
454
|
+
while (index < payload.length) {
|
|
455
|
+
const code = payload.charCodeAt(index)
|
|
456
|
+
if (code === CHAR_BACKSLASH) {
|
|
457
|
+
index += 2
|
|
458
|
+
continue
|
|
459
|
+
}
|
|
460
|
+
if (code === CHAR_DOUBLE_QUOTE || code === CHAR_SINGLE_QUOTE) {
|
|
461
|
+
index++
|
|
462
|
+
while (index < payload.length) {
|
|
463
|
+
const inner = payload.charCodeAt(index)
|
|
464
|
+
if (inner === CHAR_BACKSLASH) index += 2
|
|
465
|
+
else if (inner === code) {
|
|
466
|
+
index++
|
|
467
|
+
break
|
|
468
|
+
} else index++
|
|
469
|
+
}
|
|
470
|
+
continue
|
|
471
|
+
}
|
|
472
|
+
if (code === CHAR_PAREN_OPEN) depth++
|
|
473
|
+
else if (code === CHAR_PAREN_CLOSE) {
|
|
474
|
+
depth--
|
|
475
|
+
if (depth === 0) return index + 1
|
|
476
|
+
}
|
|
477
|
+
index++
|
|
478
|
+
}
|
|
479
|
+
return payload.length
|
|
480
|
+
}
|
package/src/runtime.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export * from './backgroundFamily'
|
|
2
|
+
export * from './borderFamily'
|
|
3
|
+
export * from './candidate'
|
|
4
|
+
export * from './candidateTarget'
|
|
5
|
+
export * from './clausePrecedence'
|
|
6
|
+
export * from './clauseSources'
|
|
7
|
+
export * from './config'
|
|
8
|
+
export * from './evaluateProgram'
|
|
9
|
+
export * from './fontShorthand'
|
|
10
|
+
export * from './geometricShorthand'
|
|
11
|
+
export * from './lowerProgram'
|
|
12
|
+
export * from './mergeFlatValues'
|
|
13
|
+
export * from './modifierRegistry'
|
|
14
|
+
export * from './payloadShape'
|
|
15
|
+
export * from './programEligibility'
|
|
16
|
+
export * from './programHash'
|
|
17
|
+
export * from './programs'
|
|
18
|
+
export * from './registry'
|
|
19
|
+
export * from './resolvePayload'
|
|
20
|
+
export * from './safeAreaVariables'
|
|
21
|
+
export * from './scanFlatValue'
|
|
22
|
+
export * from './stateModifiers'
|
|
23
|
+
export * from './serializePayload'
|
|
24
|
+
export * from './states'
|
|
25
|
+
export * from './textDecorationFamily'
|
|
26
|
+
export * from './transformFamily'
|
|
27
|
+
export * from './transition'
|
|
28
|
+
export * from './transitionAlign'
|
|
29
|
+
export * from './transitionNative'
|
|
30
|
+
export * from './valueParser'
|
|
31
|
+
export * from './valueTypes'
|
|
32
|
+
export * from './unitlessNumbers'
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type SafeAreaEdge = 'top' | 'right' | 'bottom' | 'left'
|
|
2
|
+
|
|
3
|
+
export const safeAreaVariableNames: Readonly<Record<SafeAreaEdge, string>> = {
|
|
4
|
+
top: 'safe-area-top',
|
|
5
|
+
right: 'safe-area-right',
|
|
6
|
+
bottom: 'safe-area-bottom',
|
|
7
|
+
left: 'safe-area-left',
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const safeAreaEdges: Readonly<Record<string, SafeAreaEdge>> = {
|
|
11
|
+
[safeAreaVariableNames.top]: 'top',
|
|
12
|
+
[safeAreaVariableNames.right]: 'right',
|
|
13
|
+
[safeAreaVariableNames.bottom]: 'bottom',
|
|
14
|
+
[safeAreaVariableNames.left]: 'left',
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function getSafeAreaEdge(name: string): SafeAreaEdge | undefined {
|
|
18
|
+
return safeAreaEdges[name]
|
|
19
|
+
}
|