@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,398 @@
|
|
|
1
|
+
// Web lowering: one program becomes one contiguous block of CSS rules.
|
|
2
|
+
//
|
|
3
|
+
// See plans/dom-tailwind-flat-values.md — "The program block encoding". The
|
|
4
|
+
// invariants this file exists to hold:
|
|
5
|
+
//
|
|
6
|
+
// - every condition anchors on the subject class, Tailwind-group style, so a
|
|
7
|
+
// clause is exactly ONE selector: conditions chain as `:where()` on the
|
|
8
|
+
// subject in authored modifier order. Ancestor-scoped conditions become a
|
|
9
|
+
// descendant test inside their own `:where()` (`.t_dark *`), which makes each
|
|
10
|
+
// one independent, so nesting order between them never matters and no
|
|
11
|
+
// ancestor-permutation selectors exist;
|
|
12
|
+
// - rule order is ascending clause precedence; selector specificity encodes
|
|
13
|
+
// depth, while platform clauses receive a floor above the maximum
|
|
14
|
+
// non-platform depth. Self states contribute naturally; media/container
|
|
15
|
+
// wrappers and :where()-scoped theme/group ancestors contribute zero;
|
|
16
|
+
// - the block is inserted contiguously, so cross-program order never matters and
|
|
17
|
+
// append-at-end is always safe.
|
|
18
|
+
//
|
|
19
|
+
// Payloads are emitted verbatim. Token resolution, opacity composition, and
|
|
20
|
+
// value validation all happen upstream: this layer receives CSS-ready payloads,
|
|
21
|
+
// and the same resolved program is what the class name hashes, so a program has
|
|
22
|
+
// exactly one identity. Rule injection through a payload is structurally
|
|
23
|
+
// impossible because the parser rejects a top-level `{`, `}`, or `;`.
|
|
24
|
+
|
|
25
|
+
import { parseContainerModifier, parseGroupModifier } from './modifierRegistry'
|
|
26
|
+
import {
|
|
27
|
+
canonicalClauseModifier,
|
|
28
|
+
clauseConditionSetKey,
|
|
29
|
+
clauseSubjectClassRepetitions,
|
|
30
|
+
compareClausePrecedence,
|
|
31
|
+
createClausePrecedenceOrder,
|
|
32
|
+
getClausePrecedenceKey,
|
|
33
|
+
type ClausePrecedenceOrder,
|
|
34
|
+
} from './clausePrecedence'
|
|
35
|
+
import { transformAxisCompositions } from './transformFamily'
|
|
36
|
+
import { programClassName } from './programHash'
|
|
37
|
+
import { stateToSelector } from './states'
|
|
38
|
+
import type { LonghandProgram, ModifierRegistryView } from './valueTypes'
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Where a condition's selector fragment is matched, relative to the subject: on
|
|
42
|
+
* the subject itself, strictly above it, or either.
|
|
43
|
+
*/
|
|
44
|
+
export type ConditionScope = 'self' | 'within' | 'is-or-within'
|
|
45
|
+
|
|
46
|
+
export interface ConditionSelector {
|
|
47
|
+
/** compound selector piece, eg `:hover`, `.t_dark`, `[aria-disabled]` */
|
|
48
|
+
fragment: string
|
|
49
|
+
/** defaults to `self` */
|
|
50
|
+
scope?: ConditionScope
|
|
51
|
+
/**
|
|
52
|
+
* capability guard the rule must nest in, eg `(hover: hover)` so touch
|
|
53
|
+
* devices never sticky-trigger hover styles
|
|
54
|
+
*/
|
|
55
|
+
media?: string
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Interaction-state selector spellings: `disabled` is an attribute rather than
|
|
60
|
+
* `:disabled`, and enter matches the unmounted class on the subject or above it.
|
|
61
|
+
* Mirrored as data instead of imported because this package must not depend on
|
|
62
|
+
* @tamagui/web.
|
|
63
|
+
*
|
|
64
|
+
* Lifecycle clauses use classes supplied by createComponent. `is-or-within`
|
|
65
|
+
* lets a presence boundary carry the lifecycle state for descendants too.
|
|
66
|
+
*/
|
|
67
|
+
export const defaultStateSelectors: Readonly<Record<string, ConditionSelector>> =
|
|
68
|
+
Object.freeze({
|
|
69
|
+
hover: { fragment: ':hover', media: '(hover: hover)' },
|
|
70
|
+
// the press modifier's CSS pseudo name is `active`
|
|
71
|
+
press: { fragment: ':active' },
|
|
72
|
+
// the registered alias of press
|
|
73
|
+
active: { fragment: ':active' },
|
|
74
|
+
focus: { fragment: ':focus' },
|
|
75
|
+
'focus-visible': { fragment: ':focus-visible' },
|
|
76
|
+
'focus-within': { fragment: ':focus-within' },
|
|
77
|
+
disabled: { fragment: '[aria-disabled]' },
|
|
78
|
+
enter: { fragment: '.t_unmounted', scope: 'is-or-within' },
|
|
79
|
+
exit: { fragment: '.t_exiting', scope: 'is-or-within' },
|
|
80
|
+
// component-tier states, from the shared state vocabulary's web selectors
|
|
81
|
+
...(Object.fromEntries(
|
|
82
|
+
Object.entries(stateToSelector).map(([state, selector]) => [
|
|
83
|
+
state,
|
|
84
|
+
{ fragment: selector },
|
|
85
|
+
])
|
|
86
|
+
) as Record<string, ConditionSelector>),
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
// core writes the unnamed group's class as `t_group_true`, from the boolean
|
|
90
|
+
// `group` prop (see getSplitStyles' group class name construction)
|
|
91
|
+
const unnamedGroup = 'true'
|
|
92
|
+
|
|
93
|
+
// a capability guard (hover: hover) wraps once even when the subject and a
|
|
94
|
+
// group both carry the hover state in one clause
|
|
95
|
+
function pushCapabilityGuard(wrappers: string[], media: string): void {
|
|
96
|
+
const guard = `@media ${media}`
|
|
97
|
+
for (let index = 0; index < wrappers.length; index++) {
|
|
98
|
+
if (wrappers[index] === guard) return
|
|
99
|
+
}
|
|
100
|
+
wrappers.push(guard)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export interface LowerProgramOptions {
|
|
104
|
+
/** classifies each modifier; the same registry the value was parsed against */
|
|
105
|
+
registry: ModifierRegistryView
|
|
106
|
+
/** opaque stamp for the resolved config that produced these payloads */
|
|
107
|
+
configRevision: string
|
|
108
|
+
/** media key -> the `@media` condition text, eg `(max-width: 860px)` */
|
|
109
|
+
mediaQueries?: Readonly<Record<string, string>>
|
|
110
|
+
/**
|
|
111
|
+
* media key -> the `@container` condition text, eg `(min-width: 24rem)`. Sizes
|
|
112
|
+
* are the same keys as `mediaQueries`, but the query text differs: container
|
|
113
|
+
* queries measure the container, not the viewport, so the caller derives both
|
|
114
|
+
* from config.
|
|
115
|
+
*/
|
|
116
|
+
containerQueries?: Readonly<Record<string, string>>
|
|
117
|
+
/** modifier -> selector, defaults to `defaultStateSelectors` */
|
|
118
|
+
stateSelectors?: Readonly<Record<string, ConditionSelector>>
|
|
119
|
+
/** precomputed media declaration order; derived from mediaQueries by default */
|
|
120
|
+
precedenceOrder?: ClausePrecedenceOrder
|
|
121
|
+
/** theme class prefix; `t_` gives `.t_dark` */
|
|
122
|
+
themeClassPrefix?: string
|
|
123
|
+
/** group class prefix; `t_group_` gives `.t_group_card` */
|
|
124
|
+
groupClassPrefix?: string
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export interface LoweredProgram {
|
|
128
|
+
className: string
|
|
129
|
+
/** base rule first, then one rule per emitted clause in precedence order */
|
|
130
|
+
rules: string[]
|
|
131
|
+
/**
|
|
132
|
+
* Present when the program writes a per-axis custom property (`x`, `y`,
|
|
133
|
+
* `scaleX`, `scaleY`). The composing rule turns the axis variables into the
|
|
134
|
+
* real CSS property and is identical for every element using that axis group,
|
|
135
|
+
* so it carries its own class name and hash: the caller adds this class too and
|
|
136
|
+
* insertion dedups it to one rule per sheet. Its specificity is the same
|
|
137
|
+
* (0,1,0) as every other rule here.
|
|
138
|
+
*/
|
|
139
|
+
composition?: {
|
|
140
|
+
/** the CSS property being composed, and the classNames key to store it under */
|
|
141
|
+
property: string
|
|
142
|
+
className: string
|
|
143
|
+
rules: string[]
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function hyphenate(property: string): string {
|
|
148
|
+
let out = ''
|
|
149
|
+
for (let index = 0; index < property.length; index++) {
|
|
150
|
+
const code = property.charCodeAt(index)
|
|
151
|
+
out +=
|
|
152
|
+
code >= 65 && code <= 90 ? `-${property[index].toLowerCase()}` : property[index]
|
|
153
|
+
}
|
|
154
|
+
return out
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function conditionSelector(
|
|
158
|
+
fragment: string,
|
|
159
|
+
scope: ConditionScope,
|
|
160
|
+
zeroSpecificity: boolean
|
|
161
|
+
): string {
|
|
162
|
+
const pseudo = zeroSpecificity ? 'where' : 'is'
|
|
163
|
+
if (scope === 'within') return `:${pseudo}(${fragment} *)`
|
|
164
|
+
if (scope === 'is-or-within') {
|
|
165
|
+
return `:${pseudo}(${fragment}, ${fragment} *)`
|
|
166
|
+
}
|
|
167
|
+
return zeroSpecificity ? `:where(${fragment})` : fragment
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
type PointerEventsMode = 'auto' | 'none' | 'box-none' | 'box-only'
|
|
171
|
+
|
|
172
|
+
function isPointerEventsMode(value: string): value is PointerEventsMode {
|
|
173
|
+
return (
|
|
174
|
+
value === 'auto' || value === 'none' || value === 'box-none' || value === 'box-only'
|
|
175
|
+
)
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function pointerEventsCSS(mode: PointerEventsMode): {
|
|
179
|
+
subject: 'auto' | 'none'
|
|
180
|
+
children: 'auto' | 'none'
|
|
181
|
+
} {
|
|
182
|
+
return {
|
|
183
|
+
subject: mode === 'none' || mode === 'box-none' ? 'none' : 'auto',
|
|
184
|
+
children: mode === 'none' || mode === 'box-only' ? 'none' : 'auto',
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
export function lowerProgram(
|
|
189
|
+
program: LonghandProgram,
|
|
190
|
+
options: LowerProgramOptions
|
|
191
|
+
): LoweredProgram {
|
|
192
|
+
const {
|
|
193
|
+
registry,
|
|
194
|
+
configRevision,
|
|
195
|
+
mediaQueries,
|
|
196
|
+
containerQueries,
|
|
197
|
+
stateSelectors = defaultStateSelectors,
|
|
198
|
+
precedenceOrder = createClausePrecedenceOrder(mediaQueries),
|
|
199
|
+
themeClassPrefix = 't_',
|
|
200
|
+
groupClassPrefix = 't_group_',
|
|
201
|
+
} = options
|
|
202
|
+
|
|
203
|
+
const className = programClassName(program.property, program.value, configRevision)
|
|
204
|
+
const declaration = hyphenate(program.property)
|
|
205
|
+
const rules: string[] = []
|
|
206
|
+
|
|
207
|
+
// React Native's box-only/box-none values need a subject rule and a direct-child
|
|
208
|
+
// rule. If either appears in a program, every clause emits both halves so moving
|
|
209
|
+
// between (for example) box-none and none cannot leave the base child rule active.
|
|
210
|
+
const pointerEventsProgram =
|
|
211
|
+
program.property === 'pointerEvents' &&
|
|
212
|
+
[program.value.base, ...program.value.clauses.map((clause) => clause.payload)].some(
|
|
213
|
+
(value) => value === 'box-none' || value === 'box-only'
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
const pushRule = (selector: string, wrappers: readonly string[], value: string) => {
|
|
217
|
+
if (pointerEventsProgram && isPointerEventsMode(value)) {
|
|
218
|
+
const pointerEvents = pointerEventsCSS(value)
|
|
219
|
+
rules.push(
|
|
220
|
+
wrapAtRules(`${selector}{${declaration}:${pointerEvents.subject}}`, wrappers)
|
|
221
|
+
)
|
|
222
|
+
rules.push(
|
|
223
|
+
wrapAtRules(`${selector}>*{${declaration}:${pointerEvents.children}}`, wrappers)
|
|
224
|
+
)
|
|
225
|
+
return
|
|
226
|
+
}
|
|
227
|
+
rules.push(wrapAtRules(`${selector}{${declaration}:${value}}`, wrappers))
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (program.value.base !== null) {
|
|
231
|
+
pushRule(`.${className}`, [], program.value.base)
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
const clauseSlots = new Map<
|
|
235
|
+
string,
|
|
236
|
+
{ clause: (typeof program.value.clauses)[number]; index: number }
|
|
237
|
+
>()
|
|
238
|
+
for (let index = 0; index < program.value.clauses.length; index++) {
|
|
239
|
+
const clause = program.value.clauses[index]
|
|
240
|
+
clauseSlots.set(clauseConditionSetKey(clause.modifiers), { clause, index })
|
|
241
|
+
}
|
|
242
|
+
const clauses = [...clauseSlots.values()]
|
|
243
|
+
.map((entry) => ({
|
|
244
|
+
...entry,
|
|
245
|
+
precedence: getClausePrecedenceKey(
|
|
246
|
+
entry.clause.modifiers,
|
|
247
|
+
registry,
|
|
248
|
+
precedenceOrder
|
|
249
|
+
),
|
|
250
|
+
}))
|
|
251
|
+
.sort(
|
|
252
|
+
(left, right) =>
|
|
253
|
+
compareClausePrecedence(left.precedence, right.precedence) ||
|
|
254
|
+
left.index - right.index
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
for (const { clause, precedence } of clauses) {
|
|
258
|
+
let selectorSuffix = ''
|
|
259
|
+
let selfStateSpecificity = 0
|
|
260
|
+
// at-rule preludes wrapping this clause, outermost first in authored order
|
|
261
|
+
const wrappers: string[] = []
|
|
262
|
+
let skip = false
|
|
263
|
+
const seenModifiers = new Set<string>()
|
|
264
|
+
|
|
265
|
+
for (const authoredModifier of clause.modifiers) {
|
|
266
|
+
const modifier = canonicalClauseModifier(authoredModifier)
|
|
267
|
+
if (seenModifiers.has(modifier)) continue
|
|
268
|
+
seenModifiers.add(modifier)
|
|
269
|
+
const kind = registry.get(modifier)
|
|
270
|
+
|
|
271
|
+
if (kind === 'platform') {
|
|
272
|
+
// a web clause applies here exactly as if unconditional at its position;
|
|
273
|
+
// every other platform's clause belongs to native and is not web CSS
|
|
274
|
+
if (modifier !== 'web') skip = true
|
|
275
|
+
continue
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
if (kind === 'media') {
|
|
279
|
+
const query = mediaQueries?.[modifier]
|
|
280
|
+
if (!query) {
|
|
281
|
+
throw new Error(
|
|
282
|
+
`cannot lower "${modifier}:" — no media query was provided for media key "${modifier}"`
|
|
283
|
+
)
|
|
284
|
+
}
|
|
285
|
+
wrappers.push(`@media ${query}`)
|
|
286
|
+
continue
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
if (kind === 'container') {
|
|
290
|
+
const container = parseContainerModifier(modifier)!
|
|
291
|
+
const query = containerQueries?.[container.size]
|
|
292
|
+
if (!query) {
|
|
293
|
+
throw new Error(
|
|
294
|
+
`cannot lower "${modifier}:" — no container query was provided for size "${container.size}"`
|
|
295
|
+
)
|
|
296
|
+
}
|
|
297
|
+
wrappers.push(
|
|
298
|
+
container.container === null
|
|
299
|
+
? `@container ${query}`
|
|
300
|
+
: `@container ${container.container} ${query}`
|
|
301
|
+
)
|
|
302
|
+
continue
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
if (kind === 'state') {
|
|
306
|
+
const state = stateSelectors[modifier]
|
|
307
|
+
if (!state) {
|
|
308
|
+
throw new Error(
|
|
309
|
+
`cannot lower "${modifier}:" — the state has no web selector, so it cannot become CSS`
|
|
310
|
+
)
|
|
311
|
+
}
|
|
312
|
+
selectorSuffix += conditionSelector(state.fragment, state.scope ?? 'self', false)
|
|
313
|
+
selfStateSpecificity++
|
|
314
|
+
if (state.media) pushCapabilityGuard(wrappers, state.media)
|
|
315
|
+
continue
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
if (kind === 'theme') {
|
|
319
|
+
// the theme class is on the subject or anywhere above it
|
|
320
|
+
selectorSuffix += conditionSelector(
|
|
321
|
+
`.${themeClassPrefix}${modifier}`,
|
|
322
|
+
'is-or-within',
|
|
323
|
+
true
|
|
324
|
+
)
|
|
325
|
+
continue
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
if (kind === 'group') {
|
|
329
|
+
const group = parseGroupModifier(modifier)!
|
|
330
|
+
const state = stateSelectors[group.state]
|
|
331
|
+
if (!state) {
|
|
332
|
+
throw new Error(
|
|
333
|
+
`cannot lower "${modifier}:" — the group state "${group.state}" has no web selector`
|
|
334
|
+
)
|
|
335
|
+
}
|
|
336
|
+
// a group is always a parent, never the subject itself
|
|
337
|
+
selectorSuffix += conditionSelector(
|
|
338
|
+
`.${groupClassPrefix}${group.group ?? unnamedGroup}${state.fragment}`,
|
|
339
|
+
'within',
|
|
340
|
+
true
|
|
341
|
+
)
|
|
342
|
+
if (state.media) pushCapabilityGuard(wrappers, state.media)
|
|
343
|
+
continue
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
throw new Error(
|
|
347
|
+
`cannot lower "${modifier}:" — it is not a registered modifier, so the value was never validated`
|
|
348
|
+
)
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
if (skip) continue
|
|
352
|
+
|
|
353
|
+
const selector =
|
|
354
|
+
`.${className}`.repeat(
|
|
355
|
+
clauseSubjectClassRepetitions(precedence, selfStateSpecificity)
|
|
356
|
+
) + selectorSuffix
|
|
357
|
+
pushRule(selector, wrappers, clause.payload)
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
const composition = transformAxisCompositions[program.property]
|
|
361
|
+
if (!composition) return { className, rules }
|
|
362
|
+
|
|
363
|
+
// one shared rule per axis group: same text, same hash, inserted once
|
|
364
|
+
const compositionClassName = programClassName(
|
|
365
|
+
composition.property,
|
|
366
|
+
{ base: composition.value, clauses: [] },
|
|
367
|
+
configRevision
|
|
368
|
+
)
|
|
369
|
+
const localDefaults = Object.entries(composition.defaults)
|
|
370
|
+
.map(([property, value]) => `${property}:${value}`)
|
|
371
|
+
.join(';')
|
|
372
|
+
return {
|
|
373
|
+
className,
|
|
374
|
+
rules,
|
|
375
|
+
composition: {
|
|
376
|
+
property: composition.property,
|
|
377
|
+
className: compositionClassName,
|
|
378
|
+
rules: [
|
|
379
|
+
`:where(.${compositionClassName}){${localDefaults}}`,
|
|
380
|
+
`.${compositionClassName}{${composition.property}:${composition.value}}`,
|
|
381
|
+
],
|
|
382
|
+
},
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* Media and container conditions wrap outermost, first authored outermost, and
|
|
388
|
+
* both share one list so a chain mixing them keeps authored order. Nesting is
|
|
389
|
+
* AND for arbitrary query texts, where joining with ` and ` would break on query
|
|
390
|
+
* lists and on `screen and (…)` forms. Specificity is unmoved either way.
|
|
391
|
+
*/
|
|
392
|
+
function wrapAtRules(rule: string, wrappers: readonly string[]): string {
|
|
393
|
+
let out = rule
|
|
394
|
+
for (let index = wrappers.length - 1; index >= 0; index--) {
|
|
395
|
+
out = `${wrappers[index]} {${out}}`
|
|
396
|
+
}
|
|
397
|
+
return out
|
|
398
|
+
}
|