@ng-native/fabric 0.17.1 → 0.18.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/dist/css.d.ts +49 -2
- package/dist/css.js +206 -19
- package/dist/css.js.map +1 -1
- package/dist/engine.d.ts +283 -11
- package/dist/engine.js +1068 -56
- package/dist/engine.js.map +1 -1
- package/dist/host.d.ts +8 -0
- package/dist/host.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/inline-derived-token.js +18 -5
- package/dist/inline-derived-token.js.map +1 -1
- package/dist/inline-token.d.ts +10 -4
- package/dist/inline-token.js +48 -5
- package/dist/inline-token.js.map +1 -1
- package/dist/native-paint.d.ts +66 -0
- package/dist/native-paint.js +246 -0
- package/dist/native-paint.js.map +1 -0
- package/dist/scroll-animation.d.ts +5 -0
- package/dist/scroll-animation.js +1 -1
- package/dist/scroll-animation.js.map +1 -1
- package/dist/transition.d.ts +5 -0
- package/dist/transition.js.map +1 -1
- package/package.json +1 -1
package/dist/host.d.ts
CHANGED
|
@@ -85,6 +85,14 @@ export declare abstract class HostEngine {
|
|
|
85
85
|
abstract commit(): boolean;
|
|
86
86
|
/** The node holding focus, or null. Verified to still be attached before it is handed back. */
|
|
87
87
|
abstract get focused(): HostNode | null;
|
|
88
|
+
/**
|
|
89
|
+
* The focused node when it is a text field, which is what holds a keyboard; otherwise null. A
|
|
90
|
+
* view or a pressable takes focus from a hardware keyboard or a D-pad, and has no keyboard to
|
|
91
|
+
* put away.
|
|
92
|
+
*/
|
|
93
|
+
abstract get focusedField(): HostNode | null;
|
|
94
|
+
/** Put the keyboard away: `focusedField`, if there is one, is sent `blur`. */
|
|
95
|
+
abstract blurFocused(): void;
|
|
88
96
|
/** Turn whatever an app passed as an image source into what the host wants. */
|
|
89
97
|
abstract resolveAsset(value: unknown): unknown;
|
|
90
98
|
/** Turn a colour the app wrote into whatever the host draws with. */
|
package/dist/host.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host.js","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AA4EA;;;;;GAKG;AACH,MAAM,OAAgB,UAAU;
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AA4EA;;;;;GAKG;AACH,MAAM,OAAgB,UAAU;IAgC9B;;;;;;;;OAQG;IACH,MAAM,CAAC,MAAgB;QACrB,cAAc,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED;;;OAGG;IACH,SAAS,CAAC,KAAe,IAAS,CAAC;IAEnC;;;;;OAKG;IACH,UAAU,CAAC,KAAe,EAAE,KAAsB,IAAS,CAAC;IAS5D;;;OAGG;IACH,KAAK,CAAC,KAAe,IAAS,CAAC;IAE/B;;;OAGG;IACH,MAAM,CAAC,KAAe,EAAE,QAAsD,IAAS,CAAC;IAExF,+FAA+F;IAC/F,IAAI,YAAY;QACd,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACH,aAAa,CACX,KAAe,EACf,OAAiB,EACjB,KAAiB,EACjB,MAAmB,EACnB,QAAqC;QAErC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,YAAY,CACV,KAAe,EACf,OAAiB,EACjB,KAAgB,EAChB,SAAyB,EACzB,MAAmB,EACnB,QAAqC,EACrC,MAAsB;QAEtB,OAAO,IAAI,CAAC;IACd,CAAC;CACF","sourcesContent":["/**\n * The contract the shared packages actually depend on, rather than the Fabric implementation.\n *\n * `@ng-native/components` is meant to be renderer-agnostic: it describes a view and a press,\n * and leaves the drawing to a host. In practice they were coupled to Fabric twice over - `inject(Engine)`, which is a concrete\n * class whose constructor wants a `FabricUIManager`, and `EngineNode`, which is a Fabric tree\n * node. A web prototype could only satisfy both by casting a hand-written object through\n * `as unknown as Engine`, which typechecks and tells you nothing.\n *\n * So this is the seam, measured rather than guessed: every `engine.*` call and every `node.*`\n * field those three packages actually make, and nothing else. `Engine` implements `HostEngine` and\n * `EngineNode` extends `HostNode`, so nothing about the native path changes; a browser host\n * implements the same two and needs no cast.\n *\n * It lives in this package because everything already imports from here and importing it costs a\n * web build nothing - the Fabric bindings are reached lazily, through a global the browser does\n * not have. If that stops being true, moving these two declarations to a package of their own is\n * mechanical: nothing here refers to Fabric.\n *\n * ## What is deliberately not in it\n *\n * `tagOf` and `shadowNodeOf` hand out Fabric's own handles, for Reanimated worklets and\n * react-native-gesture-handler. The three components that use them - `worklet-style`,\n * `worklet-scroll` and `native-gesture` - inject the concrete `Engine` and are native-only by\n * nature, which is the honest place to draw that line rather than pretending a browser could\n * answer.\n */\nimport type {\n DrivenProperty,\n EventFeed,\n ScrollAxis,\n ScrollDrive,\n ScrollRange,\n StaticTransform,\n} from './native-drive.ts';\nimport type { ResponderHandlers, WindowFrame } from './engine.ts';\n\n/** What a host node has to be able to answer. `EngineNode` and a DOM element both can. */\nexport interface HostNode {\n /** `element` or `text`, so a caller can tell a node from the words inside it. */\n readonly nodeKind: string;\n /**\n * The props the host is holding for this node.\n *\n * A real bag rather than an accessor, because `ViewBase` deletes from it: an input that a\n * directive consumes has to stop being an attribute the host writes through.\n */\n props: Record<string, unknown>;\n /** The text, when `nodeKind` is `text`. Empty otherwise. */\n nodeText: string;\n childList: readonly HostNode[];\n parent: HostNode | null;\n /**\n * Set by `claimHost` from every host primitive's constructor, so a host can tell an element a\n * component owns from a bare one somebody wrote by hand.\n *\n * Part of the contract rather than a Fabric detail, because the shared packages are what set\n * it: `ViewBase`'s constructor calls `claimHost` on every element it hosts. What a host does\n * with it is its own business - Fabric warns about an unclaimed primitive name, and a browser\n * has nothing to warn about.\n */\n claimed?: true;\n /**\n * The engine that made this node, when the host can say. A primitive reads it rather than\n * injecting `HostEngine`, because that lookup walks every element injector up to the root and\n * runs once per element on screen. A host whose nodes cannot carry it leaves it out, and the\n * primitive injects as before.\n */\n readonly engine?: HostEngine;\n}\n\n/** Something that writes its node's props once it has its inputs. See `HostEngine.settle`. */\nexport interface Settling {\n settleProps(): void;\n}\n\n/**\n * What a host has to be able to do.\n *\n * An abstract class rather than an interface plus an `InjectionToken`, because Angular can inject\n * an abstract class directly and the alternative is two names for one thing.\n */\nexport abstract class HostEngine {\n /** Write a prop. `undefined` and `null` both clear it, which is how native says \"default\". */\n abstract setProp(node: HostNode, key: string, value: unknown): void;\n /** Listen for one of the host's own events. Returns its own teardown. */\n abstract setEventListener(\n node: HostNode,\n topLevelType: string,\n fn: (event: unknown) => void,\n ): () => void;\n /** Claim gestures on a node, through whatever arbitration the host has. */\n abstract setResponder(node: HostNode, handlers: ResponderHandlers): () => void;\n /** Where the node is on screen, asynchronously, because native answers on its own thread. */\n abstract measure(node: HostNode, into: (frame: WindowFrame) => void): void;\n /** Tell a native view to do something imperative: scroll, focus, blur. */\n abstract dispatchCommand(node: HostNode, name: string, args?: readonly unknown[]): void;\n /** Flush pending work. Native batches; a browser may not need to. */\n abstract commit(): boolean;\n /** The node holding focus, or null. Verified to still be attached before it is handed back. */\n abstract get focused(): HostNode | null;\n /**\n * The focused node when it is a text field, which is what holds a keyboard; otherwise null. A\n * view or a pressable takes focus from a hardware keyboard or a D-pad, and has no keyboard to\n * put away.\n */\n abstract get focusedField(): HostNode | null;\n /** Put the keyboard away: `focusedField`, if there is one, is sent `blur`. */\n abstract blurFocused(): void;\n /** Turn whatever an app passed as an image source into what the host wants. */\n abstract resolveAsset(value: unknown): unknown;\n /** Turn a colour the app wrote into whatever the host draws with. */\n abstract color(value: unknown): unknown;\n\n /**\n * Call `target.settleProps()` before the next commit, once the element's static inputs are set.\n *\n * A host primitive writes its props from `ngOnChanges` and `ngOnInit`, which run in its parent\n * view's update pass. A parent that detaches itself before its first check never has one, so\n * without this its pressables would take no press and carry no role or `testID`, where on the\n * web a listener and an attribute are there from creation. The default settles in a microtask,\n * for a host with no commit of its own to hang it on.\n */\n settle(target: Settling): void {\n queueMicrotask(() => target.settleProps());\n }\n\n /**\n * Measure a node again from what native now holds for it, in a commit of its own. For a host\n * that measures when content changes, as a browser does, there is nothing to do.\n */\n remeasure(_node: HostNode): void {}\n\n /**\n * Style `node` as an element of the template `like` is written in, rather than of the one that\n * created it, or as its own again when `like` is null: the content view a scroll view makes for\n * its children, which the app styles through a class of its own and so from its own component\n * styles.\n */\n adoptScope(_node: HostNode, _like: HostNode | null): void {}\n\n /**\n * Keep the drag now under way from the page until the last finger lifts, as a browser does for\n * a `touchmove` a listener prevented the default of. A host whose page a browser scrolls leaves\n * it out.\n */\n keepDrag?(node: HostNode): void;\n\n /**\n * Take the user to a node: a text input gets the cursor, and anything else is brought on\n * screen. What a DOM element's own `focus()` does, for code that calls it on an element.\n */\n focus(_node: HostNode): void {}\n\n /**\n * Scroll whatever the node is in just far enough to show all of it; `visibleBottom` is where in\n * the window the visible area ends, when something such as the keyboard covers its bottom.\n */\n reveal(_node: HostNode, _options?: { visibleBottom?: number; margin?: number }): void {}\n\n /** Whether `driveByScroll` moves views on the native side. A host without it moves nothing. */\n get drivesScroll(): boolean {\n return false;\n }\n\n /**\n * Move `view` by `scroll`'s offset along `axis` on the native side, through `range`, keeping\n * `statics` in its transform. Null when the host cannot, and the caller moves the view itself.\n */\n driveByScroll(\n _view: HostNode,\n _scroll: HostNode,\n _axis: ScrollAxis,\n _range: ScrollRange,\n _statics?: readonly StaticTransform[],\n ): ScrollDrive | null {\n return null;\n }\n\n /**\n * Move `view` by a value `source`'s native events carry, such as a keyboard's height, on the\n * native side, plus `shift` when one is given, which `ScrollDrive.shift` changes. Null when the\n * host cannot. See `driveByScroll`.\n */\n driveByEvent(\n _view: HostNode,\n _source: HostNode,\n _feed: EventFeed,\n _property: DrivenProperty,\n _range: ScrollRange,\n _statics?: readonly StaticTransform[],\n _shift?: number | null,\n ): ScrollDrive | null {\n return null;\n }\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -16,10 +16,10 @@ export { EngineIntersectionObserver, installDeferTriggers } from './defer-trigge
|
|
|
16
16
|
export { installNodeGlobal } from './node-global.ts';
|
|
17
17
|
export { nextFrame } from './next-frame.ts';
|
|
18
18
|
export { faceName, registeredFaces } from './font-faces.ts';
|
|
19
|
-
export { firstFamily, tokenFromValue } from './inline-token.ts';
|
|
19
|
+
export { firstFamily, platformColourOf, tokenFromValue } from './inline-token.ts';
|
|
20
20
|
export { layOutGrid, type Edges, type GridItem, type GridLayout, type Rect } from './grid.ts';
|
|
21
21
|
export { isBlockContainer, planFlow, type FlowKey, type FlowPlan, type FlowTree } from './flow.ts';
|
|
22
|
-
export { DIRECT_EVENTS, Engine, SyntheticEvent, claimHost, extendNodes, keepNativeView, declareNativeProps, fontsLoading, fontsRegistered, fontsSettled, markComponentHost, scrollsOverflow, nativePlatform, onFontsRegistered, onFontsSettled, registerHoist, registerPlatformComponents, registerViewName, registeredViewName, type PlatformViewName, type ViewNameOptions, type PostScriptNames, viewNameOf, type EngineNode, type EngineOptions, type EngineStats, type FabricNode, type FabricNodeSet, type FabricUIManager, type HoistOptions, type NativeSyntheticEvent, type NodeKind, type ResponderEvent, type ResponderHandlers, type TouchPayload, type ViewNameNode, type WindowFrame, } from './engine.ts';
|
|
22
|
+
export { DIRECT_EVENTS, Engine, SyntheticEvent, claimHost, extendNodes, keepNativeView, declareNativeProps, fontsLoading, fontsRegistered, fontsSettled, markComponentHost, markPage, scrollsOverflow, nativePlatform, onFontsRegistered, onFontsSettled, registerHoist, registerPlatformComponents, registerViewName, registeredViewName, type PlatformViewName, type ViewNameOptions, type PostScriptNames, viewNameOf, isTextInput, isTextInputView, type EngineNode, type EngineOptions, type EngineStats, type FabricNode, type FabricNodeSet, type FabricUIManager, type HoistOptions, type NativeSyntheticEvent, type NodeKind, type ResponderEvent, type ResponderHandlers, type TouchPayload, type ViewNameNode, type WindowFrame, } from './engine.ts';
|
|
23
23
|
export { reportUnboundFormsInput, type NamedHostNode } from './forms-inputs.ts';
|
|
24
24
|
export { HostEngine, type HostNode, type Settling } from './host.ts';
|
|
25
25
|
export { getFabricUIManager } from './fabric.ts';
|
package/dist/index.js
CHANGED
|
@@ -16,10 +16,10 @@ export { EngineIntersectionObserver, installDeferTriggers } from "./defer-trigge
|
|
|
16
16
|
export { installNodeGlobal } from "./node-global.js";
|
|
17
17
|
export { nextFrame } from "./next-frame.js";
|
|
18
18
|
export { faceName, registeredFaces } from "./font-faces.js";
|
|
19
|
-
export { firstFamily, tokenFromValue } from "./inline-token.js";
|
|
19
|
+
export { firstFamily, platformColourOf, tokenFromValue } from "./inline-token.js";
|
|
20
20
|
export { layOutGrid } from "./grid.js";
|
|
21
21
|
export { isBlockContainer, planFlow } from "./flow.js";
|
|
22
|
-
export { DIRECT_EVENTS, Engine, SyntheticEvent, claimHost, extendNodes, keepNativeView, declareNativeProps, fontsLoading, fontsRegistered, fontsSettled, markComponentHost, scrollsOverflow, nativePlatform, onFontsRegistered, onFontsSettled, registerHoist, registerPlatformComponents, registerViewName, registeredViewName, viewNameOf, } from "./engine.js";
|
|
22
|
+
export { DIRECT_EVENTS, Engine, SyntheticEvent, claimHost, extendNodes, keepNativeView, declareNativeProps, fontsLoading, fontsRegistered, fontsSettled, markComponentHost, markPage, scrollsOverflow, nativePlatform, onFontsRegistered, onFontsSettled, registerHoist, registerPlatformComponents, registerViewName, registeredViewName, viewNameOf, isTextInput, isTextInputView, } from "./engine.js";
|
|
23
23
|
export { reportUnboundFormsInput } from "./forms-inputs.js";
|
|
24
24
|
export { HostEngine } from "./host.js";
|
|
25
25
|
export { getFabricUIManager } from "./fabric.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,OAAO,EACP,YAAY,GAoBb,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,OAAO,EACP,YAAY,GAoBb,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAE,UAAU,EAAyD,MAAM,WAAW,CAAC;AAC9F,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAA8C,MAAM,WAAW,CAAC;AACnG,OAAO,EACL,aAAa,EACb,MAAM,EACN,cAAc,EACd,SAAS,EACT,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,QAAQ,EACR,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,0BAA0B,EAC1B,gBAAgB,EAChB,kBAAkB,EAIlB,UAAU,EACV,WAAW,EACX,eAAe,GAehB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,uBAAuB,EAAsB,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,UAAU,EAAgC,MAAM,WAAW,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACL,WAAW,GAQZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,MAAM,EACN,WAAW,EACX,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,MAAM,EACN,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,KAAK,GAMN,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAyB,MAAM,wBAAwB,CAAC","sourcesContent":["/**\n * The engine's public surface.\n *\n * Nothing here imports Angular, and nothing here may start to: the engine stays\n * framework-agnostic (see docs/ARCHITECTURE.md), which is what keeps the commit logic testable without Angular in\n * the loop and a second adapter possible later.\n *\n * The CSS runtime lives here rather than in a package of its own because the cascade is driven\n * from the commit walk - the resolver runs per node, per tick - and because it is as\n * framework-agnostic as the rest of the engine. The build-time half of CSS is a different\n * animal and lives in `@ng-native/metro`.\n */\nexport {\n StyleResolver,\n boundDeclaration,\n matches,\n styleSheetOf,\n type AttributeTest,\n type Combinator,\n type ComplexSelector,\n type Compound,\n type Conditions,\n type DeferredDeclaration,\n type GradientTemplate,\n type HasTest,\n type HslChannel,\n type MediaCondition,\n type NthTest,\n type RelativeSelector,\n type RuleIndex,\n type StyleCache,\n type StyleRule,\n type StyleSheet,\n type StyleTarget,\n type TokenKind,\n type TokenValue,\n} from './css.ts';\nexport { ELEMENT_STYLES, ELEMENT_STYLES_CSS } from './element-styles.ts';\nexport { EngineIntersectionObserver, installDeferTriggers } from './defer-triggers.ts';\nexport { installNodeGlobal } from './node-global.ts';\nexport { nextFrame } from './next-frame.ts';\nexport { faceName, registeredFaces } from './font-faces.ts';\nexport { firstFamily, platformColourOf, tokenFromValue } from './inline-token.ts';\nexport { layOutGrid, type Edges, type GridItem, type GridLayout, type Rect } from './grid.ts';\nexport { isBlockContainer, planFlow, type FlowKey, type FlowPlan, type FlowTree } from './flow.ts';\nexport {\n DIRECT_EVENTS,\n Engine,\n SyntheticEvent,\n claimHost,\n extendNodes,\n keepNativeView,\n declareNativeProps,\n fontsLoading,\n fontsRegistered,\n fontsSettled,\n markComponentHost,\n markPage,\n scrollsOverflow,\n nativePlatform,\n onFontsRegistered,\n onFontsSettled,\n registerHoist,\n registerPlatformComponents,\n registerViewName,\n registeredViewName,\n type PlatformViewName,\n type ViewNameOptions,\n type PostScriptNames,\n viewNameOf,\n isTextInput,\n isTextInputView,\n type EngineNode,\n type EngineOptions,\n type EngineStats,\n type FabricNode,\n type FabricNodeSet,\n type FabricUIManager,\n type HoistOptions,\n type NativeSyntheticEvent,\n type NodeKind,\n type ResponderEvent,\n type ResponderHandlers,\n type TouchPayload,\n type ViewNameNode,\n type WindowFrame,\n} from './engine.ts';\nexport { reportUnboundFormsInput, type NamedHostNode } from './forms-inputs.ts';\nexport { HostEngine, type HostNode, type Settling } from './host.ts';\nexport { getFabricUIManager } from './fabric.ts';\nexport {\n pinnedRange,\n type DrivenProperty,\n type EventFeed,\n type NativeAnimated,\n type ScrollAxis,\n type ScrollDrive,\n type ScrollRange,\n type StaticTransform,\n} from './native-drive.ts';\nexport {\n bezier,\n interpolate,\n isNamedColor,\n parseColor,\n redirect,\n sample,\n settled,\n step,\n tracksOf,\n tween,\n type AnimationSpec,\n type Keyframe,\n type RunningAnimation,\n type Transition,\n type TransitionSpec,\n} from './transition.ts';\nexport { backgroundLayers, type BackgroundLayers } from './background-layers.ts';\n"]}
|
|
@@ -19,6 +19,12 @@ const FUNCTION = /([a-z][a-z-]*)\([ \t\n\r\f]*/iy;
|
|
|
19
19
|
const VAR = /var\([ \t\n\r\f]*(--[\w-]+)[ \t\n\r\f]*/iy;
|
|
20
20
|
const LITERAL = /([+-]?(?:\d+\.?\d*|\.\d+)(?:e[+-]?\d+)?)(%|[a-z]+)?/iy;
|
|
21
21
|
const WORD = /[^ \t\n\r\f,/()]+/y;
|
|
22
|
+
/**
|
|
23
|
+
* A `color-mix()` or a relative colour, the only shapes `mixToken` keeps. Any other colour function
|
|
24
|
+
* is one `colourToken` has already read, or failed to: reading it again there reads the fallbacks
|
|
25
|
+
* inside it again too, twice for each one nested, `rgb(var(--c, rgb(var(--c, …), x)), x)`.
|
|
26
|
+
*/
|
|
27
|
+
const MIXED = /^(?:color-mix\(|[a-z]+\([ \t\n\r\f]*from[ \t\n\r\f])/i;
|
|
22
28
|
/** A fallback that is a `var()` or arithmetic, rather than a value written out. */
|
|
23
29
|
const NESTED = /^[ \t\n\r\f]*(var|calc|min|max)\(/i;
|
|
24
30
|
/** What one of each unit counts as: points, degrees, milliseconds, or itself. */
|
|
@@ -43,6 +49,8 @@ const SPACES = {
|
|
|
43
49
|
hsl: 'hsl',
|
|
44
50
|
hsla: 'hsl',
|
|
45
51
|
};
|
|
52
|
+
/** The space a colour function's channels are in, and none for a name every object has. */
|
|
53
|
+
const colourSpace = (fn) => Object.hasOwn(SPACES, fn) ? SPACES[fn] : undefined;
|
|
46
54
|
/** Thrown where the text stops being one of the shapes, and caught by `whole`. */
|
|
47
55
|
const UNREADABLE = new Error('not a token made of others');
|
|
48
56
|
const fail = () => {
|
|
@@ -189,7 +197,7 @@ function calcToken(text) {
|
|
|
189
197
|
* commas were what separated them.
|
|
190
198
|
*/
|
|
191
199
|
function colourArguments(cursor) {
|
|
192
|
-
const space =
|
|
200
|
+
const space = colourSpace((match(cursor, FUNCTION) ?? fail())[1].toLowerCase()) ?? fail();
|
|
193
201
|
const args = [];
|
|
194
202
|
let legacy = false;
|
|
195
203
|
while (!take(cursor, ')')) {
|
|
@@ -304,7 +312,9 @@ function colourFallback(text) {
|
|
|
304
312
|
const token = tokenFromValue(text);
|
|
305
313
|
if (token?.hsl || token?.deferredColour)
|
|
306
314
|
return { fallbackToken: token };
|
|
307
|
-
|
|
315
|
+
// A platform colour has no channels to mix: refused, as a word is.
|
|
316
|
+
const colour = token?.color;
|
|
317
|
+
return { fallback: typeof colour === 'string' ? colour : fail() };
|
|
308
318
|
}
|
|
309
319
|
const nextReference = (cursor) => reference(cursor, (match(cursor, VAR) ?? fail())[1]);
|
|
310
320
|
/**
|
|
@@ -321,8 +331,9 @@ function mixColour(cursor) {
|
|
|
321
331
|
return mixExpression(cursor);
|
|
322
332
|
if (!fn)
|
|
323
333
|
return { color: (match(cursor, WORD) ?? fail())[0] };
|
|
324
|
-
|
|
325
|
-
|
|
334
|
+
const relative = relativeSpace(fn);
|
|
335
|
+
if (relative && takeWord(cursor, 'from'))
|
|
336
|
+
return relativeExpression(cursor, relative);
|
|
326
337
|
if (fn === 'color' && takeWord(cursor, 'from'))
|
|
327
338
|
return srgbExpression(cursor);
|
|
328
339
|
cursor.at = closing(cursor);
|
|
@@ -399,6 +410,8 @@ const RELATIVE = {
|
|
|
399
410
|
oklab: { space: 'oklab', keywords: ['l', 'a', 'b'], full: [1, 0.4, 0.4] },
|
|
400
411
|
oklch: { space: 'oklch', keywords: ['l', 'c', 'h'], full: [1, 0.4, null] },
|
|
401
412
|
};
|
|
413
|
+
/** The relative colour function a name is, and none for a name every object has, `constructor`. */
|
|
414
|
+
const relativeSpace = (fn) => Object.hasOwn(RELATIVE, fn) ? RELATIVE[fn] : undefined;
|
|
402
415
|
/** Whether the next word is `word`, in any case; taken, with the space after it, if so. */
|
|
403
416
|
function takeWord(cursor, word) {
|
|
404
417
|
const start = cursor.at;
|
|
@@ -532,6 +545,6 @@ function channelOperand(cursor, keywords) {
|
|
|
532
545
|
* is no such shape.
|
|
533
546
|
*/
|
|
534
547
|
export function derivedToken(text) {
|
|
535
|
-
return calcToken(text) ?? colourToken(text) ?? mixToken(text);
|
|
548
|
+
return calcToken(text) ?? colourToken(text) ?? (MIXED.test(text) ? mixToken(text) : undefined);
|
|
536
549
|
}
|
|
537
550
|
//# sourceMappingURL=inline-derived-token.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inline-derived-token.js","sourceRoot":"","sources":["../src/inline-derived-token.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * A custom property set on an element to a value with a `var()` inside it,\n * `[style.--size]=\"'calc(var(--gap) * 2)'\"`, read into the form the same text in a stylesheet is\n * compiled to, which the cascade then works out where it is set, as it does that one\n * (`resolveAliases` in css.ts).\n *\n * The shapes are the build-time conversion's and no more (`deferCalcToken`, `deferHslToken`,\n * `deferChannelsToken` and `deferMixToken` in `@ng-native/metro/css/compile.cjs`): `calc()`,\n * `min()` or `max()` of numbers, lengths in `px` or `rem`, angles, times and `var()`, with + - * /\n * and brackets; an `hsl()` with a `var()` for a channel; `rgb()` or `hsl()` of one channels token,\n * with an alpha written or tokened; and a `color-mix()` of any of these colours, tokens and\n * colours written out. Anything else is undefined, as a stylesheet refuses it.\n */\nimport { MIX_SPACES, type HueMethod, type MixSpace } from './color-mix.ts';\nimport type { Channel } from './relative-colour.ts';\nimport type { ColourExpression, HslChannel, TokenValue } from './css.ts';\nimport { cssTrim, tokenFromValue } from './inline-token.ts';\n\ntype Marker = NonNullable<TokenValue['deferredCalc']>[number];\ntype Expression = Marker['expression'];\ntype Alpha = Extract<NonNullable<TokenValue['deferredColour']>, { channels: unknown }>['alpha'];\n\ninterface Cursor {\n readonly text: string;\n at: number;\n}\n\n/** A `var()`: the token it names, and the text of its fallback, read as its slot wants it. */\ninterface Reference {\n readonly reference: string;\n readonly fallback?: string;\n}\n\n/** CSS whitespace, and no other: a no-break space is part of a word, as it is in a browser. */\nconst SPACE = /[ \\t\\n\\r\\f]*/y;\nconst FUNCTION = /([a-z][a-z-]*)\\([ \\t\\n\\r\\f]*/iy;\nconst VAR = /var\\([ \\t\\n\\r\\f]*(--[\\w-]+)[ \\t\\n\\r\\f]*/iy;\nconst LITERAL = /([+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?)(%|[a-z]+)?/iy;\nconst WORD = /[^ \\t\\n\\r\\f,/()]+/y;\n/** A fallback that is a `var()` or arithmetic, rather than a value written out. */\nconst NESTED = /^[ \\t\\n\\r\\f]*(var|calc|min|max)\\(/i;\n/** What one of each unit counts as: points, degrees, milliseconds, or itself. */\nconst PER_UNIT: Readonly<Record<string, number>> = {\n '': 1,\n px: 1,\n rem: 16,\n deg: 1,\n grad: 0.9,\n rad: 180 / Math.PI,\n turn: 360,\n ms: 1,\n s: 1000,\n};\nconst PERCENTAGE = /([+-]?(?:\\d+\\.?\\d*|\\.\\d+))%/y;\nconst HUE_UNITS: ReadonlySet<string> = new Set(['', 'deg', 'grad', 'rad', 'turn']);\nconst HUE_METHODS: ReadonlySet<string> = new Set(['shorter', 'longer', 'increasing', 'decreasing']);\nconst MATH: ReadonlySet<string> = new Set(['calc', 'min', 'max']);\nconst SPACES: Readonly<Record<string, 'rgb' | 'hsl'>> = {\n rgb: 'rgb',\n rgba: 'rgb',\n hsl: 'hsl',\n hsla: 'hsl',\n};\n\n/** Thrown where the text stops being one of the shapes, and caught by `whole`. */\nconst UNREADABLE = new Error('not a token made of others');\nconst fail = (): never => {\n throw UNREADABLE;\n};\n\nfunction match(cursor: Cursor, pattern: RegExp): RegExpExecArray | null {\n pattern.lastIndex = cursor.at;\n const found = pattern.exec(cursor.text);\n if (found) cursor.at = pattern.lastIndex;\n return found;\n}\n\n/** Whether the next character, past any space, is `char`; taken, with the space after it, if so. */\nfunction take(cursor: Cursor, char: string): boolean {\n match(cursor, SPACE);\n if (cursor.text[cursor.at] !== char) return false;\n cursor.at++;\n match(cursor, SPACE);\n return true;\n}\n\nfunction expect(cursor: Cursor, char: string): void {\n if (!take(cursor, char)) fail();\n}\n\n/** The whole text as `read` reads it, or undefined when it is not that shape. */\nfunction whole<T>(text: string, read: (cursor: Cursor) => T): T | undefined {\n const cursor = { text, at: 0 };\n try {\n const value = read(cursor);\n match(cursor, SPACE);\n return cursor.at === text.length ? value : undefined;\n } catch (error) {\n if (error === UNREADABLE) return undefined;\n throw error;\n }\n}\n\n/** A `var()` from its name on, to the bracket that closes it. */\nfunction reference(cursor: Cursor, name: string): Reference {\n if (take(cursor, ')')) return { reference: name };\n expect(cursor, ',');\n const start = cursor.at;\n for (let depth = 0; cursor.at < cursor.text.length; cursor.at++) {\n const char = cursor.text[cursor.at];\n if (char === '(') depth++;\n else if (char === ')' && depth-- === 0) break;\n }\n const fallback = cursor.text.slice(start, cursor.at);\n expect(cursor, ')');\n return { reference: name, fallback };\n}\n\n/** A fallback's token. One that is another `var()` is refused, as the compiler refuses it. */\nfunction fallbackToken(text: string | undefined): TokenValue | undefined {\n const token = text === undefined ? undefined : tokenFromValue(text);\n return token?.alias ? fail() : token;\n}\n\n/** A number, length, angle or time, as the number its slot counts in. */\nfunction literal(cursor: Cursor, units: (unit: string) => number | undefined): number {\n const found = match(cursor, LITERAL) ?? fail();\n return Number(found[1]) * (units((found[2] ?? '').toLowerCase()) ?? fail());\n}\n\n/** A number slot takes a percentage as a fraction, which a length slot cannot work out. */\nconst unitsOf =\n (kind: Marker['kind']) =>\n (unit: string): number | undefined =>\n unit === '%' ? (kind === 'number' ? 0.01 : undefined) : PER_UNIT[unit];\n\nfunction sum(cursor: Cursor, kind: Marker['kind']): Expression {\n let value = product(cursor, kind);\n for (let op; (op = (['+', '-'] as const).find((char) => take(cursor, char)));) {\n value = [op, value, product(cursor, kind)];\n }\n return value;\n}\n\nfunction product(cursor: Cursor, kind: Marker['kind']): Expression {\n let value = factor(cursor, kind);\n for (let op; (op = (['*', '/'] as const).find((char) => take(cursor, char)));) {\n value = [op, value, factor(cursor, kind)];\n }\n return value;\n}\n\nfunction factor(cursor: Cursor, kind: Marker['kind']): Expression {\n if (take(cursor, '(')) {\n const value = sum(cursor, kind);\n expect(cursor, ')');\n return value;\n }\n const name = match(cursor, VAR)?.[1];\n if (name) {\n const value = leafFallback(reference(cursor, name).fallback, kind);\n return value === undefined ? { reference: name } : { reference: name, fallback: value };\n }\n const fn = match(cursor, FUNCTION)?.[1];\n if (fn) return math(cursor, fn, kind);\n const value = literal(cursor, unitsOf(kind));\n // A percentage, kept apart from a bare number, as `literal` in the compiler keeps it.\n return cursor.text[cursor.at - 1] === '%' ? { percentage: value } : value;\n}\n\n/**\n * A `var()` fallback in arithmetic, as its slot reads it: another `var()` or arithmetic of its\n * own, read as a tree, `var(--a, calc(var(--gap) * 2))`, as `leaf` in the compiler reads it; a\n * length in points, `rem` included as the compiler counts it; or a bare number.\n */\nfunction leafFallback(text: string | undefined, kind: Marker['kind']): Expression | undefined {\n if (text !== undefined && NESTED.test(text)) {\n return whole(cssTrim(text), (cursor) => factor(cursor, kind)) ?? fail();\n }\n const token = fallbackToken(text);\n if (kind !== 'length') return numberFallback(token, kind);\n if (typeof token?.length === 'number') return token.length;\n const rem =\n text === undefined ? undefined : /^[ \\t\\n\\r\\f]*(-?\\d*\\.?\\d+)rem[ \\t\\n\\r\\f]*$/i.exec(text);\n return rem ? Number(rem[1]) * PER_UNIT['rem']! : undefined;\n}\n\n/** A fallback where a number is wanted: a percentage kept apart from a bare number. */\nfunction numberFallback(\n token: TokenValue | undefined,\n kind: Marker['kind'],\n): Expression | undefined {\n const percentage =\n kind === 'number' && typeof token?.length === 'string' && token.number !== undefined;\n return percentage ? { percentage: token.number! } : token?.number;\n}\n\n/** The rest of a `calc()`, or of a `min()` or `max()` of sums, once its name is read. */\nfunction math(cursor: Cursor, fn: string, kind: Marker['kind']): Expression {\n const name = fn.toLowerCase();\n if (!MATH.has(name)) fail();\n const sides = [sum(cursor, kind)];\n while (name !== 'calc' && take(cursor, ',')) sides.push(sum(cursor, kind));\n expect(cursor, ')');\n return sides.reduce((a, b) => [name as 'min' | 'max', a, b]);\n}\n\n/** Arithmetic of tokens, read as a length and as a number, whichever each reading makes of it. */\nfunction calcToken(text: string): TokenValue | undefined {\n const markers = (['length', 'number'] as const).flatMap((kind): Marker[] => {\n const expression = whole(text, (cursor) =>\n math(cursor, (match(cursor, FUNCTION) ?? fail())[1]!, kind),\n );\n return expression === undefined ? [] : [{ expression, kind }];\n });\n return markers.length ? { deferredCalc: markers } : undefined;\n}\n\n/** An argument of a colour function: a `var()`, or a word read as its slot wants it. */\ntype Argument = Reference | { readonly word: string };\n\n/**\n * A colour function's arguments, with the commas and the slash between them gone, and whether\n * commas were what separated them.\n */\nfunction colourArguments(cursor: Cursor): {\n space: 'rgb' | 'hsl';\n args: Argument[];\n legacy: boolean;\n} {\n const space = SPACES[(match(cursor, FUNCTION) ?? fail())[1]!.toLowerCase()] ?? fail();\n const args: Argument[] = [];\n let legacy = false;\n while (!take(cursor, ')')) {\n if (take(cursor, ',')) legacy = true;\n else if (!take(cursor, '/')) {\n const name = match(cursor, VAR)?.[1];\n args.push(name ? reference(cursor, name) : { word: (match(cursor, WORD) ?? fail())[0] });\n }\n }\n return { space, args, legacy };\n}\n\n/** What each argument of an `hsl()` is: a hue, a saturation and a lightness, then an alpha. */\nconst HSL_SLOTS = ['hue', 'percentage', 'percentage', 'alpha'] as const;\n\n/**\n * A written `hsl()` channel as its slot reads it, as `hslLiteral` in the compiler does: a hue in\n * degrees; a saturation or a lightness as a fraction, from a percentage or, in the space syntax\n * only, a bare number of percent; an alpha as a number or a fraction.\n */\nfunction hslLiteral(\n text: string,\n slot: (typeof HSL_SLOTS)[number],\n legacy: boolean,\n): number | undefined {\n const perUnit = (unit: string): number | undefined => {\n if (slot === 'hue') return HUE_UNITS.has(unit) ? PER_UNIT[unit] : undefined;\n if (unit === '%') return 0.01;\n if (unit !== '') return undefined;\n return slot === 'alpha' ? 1 : legacy ? undefined : 0.01;\n };\n return whole(text, (cursor) => literal(cursor, perUnit));\n}\n\nfunction hslChannel(arg: Argument, index: number, legacy: boolean): HslChannel {\n const slot = HSL_SLOTS[index]!;\n if ('word' in arg) return hslLiteral(arg.word, slot, legacy) ?? fail();\n const fallback = arg.fallback === undefined ? undefined : hslLiteral(arg.fallback, slot, legacy);\n return fallback === undefined\n ? { reference: arg.reference }\n : { reference: arg.reference, fallback };\n}\n\n/** A channels colour's alpha: none, written as a number or a percentage, or a token of its own. */\nfunction alphaOf(arg: Argument | undefined): Alpha {\n if (arg === undefined) return undefined;\n if ('word' in arg) {\n return whole(arg.word, (cursor) => literal(cursor, unitsOf('number'))) ?? fail();\n }\n const fallback = fallbackToken(arg.fallback)?.number;\n return fallback === undefined\n ? { reference: arg.reference }\n : { reference: arg.reference, fallback };\n}\n\n/** `rgba(var(--channels), <alpha>)`, as `deferChannelsToken` reads it. */\nfunction channelsToken(\n channels: Reference,\n alpha: Argument | undefined,\n space: 'rgb' | 'hsl',\n): TokenValue {\n const token = fallbackToken(channels.fallback);\n const fallback = space === 'hsl' ? token?.hslChannels : token?.channels;\n const opacity = alphaOf(alpha);\n return {\n deferredColour: {\n channels: { reference: channels.reference, ...(fallback ? { fallback } : {}), space },\n ...(opacity === undefined ? {} : { alpha: opacity }),\n },\n };\n}\n\n/** `hsl(var(--h) 100% 50%)` and the like, as `deferHslToken` reads it. */\nfunction hslToken(args: readonly Argument[], legacy: boolean): TokenValue {\n if (args.length !== 3 && args.length !== 4) fail();\n const [h, s, l, alpha] = args.map((arg, index) => hslChannel(arg, index, legacy));\n const legacyFlag = legacy ? { legacy: true as const } : {};\n return { hsl: { h: h!, s: s!, l: l!, ...(alpha === undefined ? {} : { alpha }), ...legacyFlag } };\n}\n\nfunction colourToken(text: string): TokenValue | undefined {\n return whole(text, (cursor) => {\n const { space, args, legacy } = colourArguments(cursor);\n const [channels, alpha, ...rest] = args;\n if (channels && 'reference' in channels && !rest.length) {\n return channelsToken(channels, alpha, space);\n }\n return space === 'hsl' ? hslToken(args, legacy) : fail();\n });\n}\n\n/** The index just past the bracket that closes the function the cursor is inside. */\nfunction closing(cursor: Cursor): number {\n for (let at = cursor.at, depth = 0; at < cursor.text.length; at++) {\n const char = cursor.text[at];\n if (char === '(') depth++;\n else if (char === ')' && depth-- === 0) return at + 1;\n }\n return fail();\n}\n\n/**\n * A `var()` in a colour, as `reference` in the compiler's colour-expression.cjs reads it: the\n * tokens its `var()` fallbacks name, tried in turn, then a colour, or one made of other tokens.\n */\nfunction referenceColour({ reference: name, fallback }: Reference): ColourExpression {\n const alternatives: string[] = [];\n let rest = fallback === undefined ? undefined : cssTrim(fallback);\n for (\n let next;\n rest && (next = whole(rest, nextReference));\n rest = next.fallback === undefined ? undefined : cssTrim(next.fallback)\n ) {\n alternatives.push(next.reference);\n }\n return {\n reference: name,\n ...(alternatives.length ? { alternatives } : {}),\n ...(rest ? colourFallback(rest) : {}),\n };\n}\n\n/** The colour a `var()` falls back to, or one made of other tokens; refused when it is neither. */\nfunction colourFallback(text: string): { fallback: string } | { fallbackToken: TokenValue } {\n const token = tokenFromValue(text);\n if (token?.hsl || token?.deferredColour) return { fallbackToken: token };\n return { fallback: token?.color ?? fail() };\n}\n\nconst nextReference = (cursor: Cursor): Reference =>\n reference(cursor, (match(cursor, VAR) ?? fail())[1]!);\n\n/**\n * One colour in a `color-mix()`: a `var()`, another mix, an `rgb()` or `hsl()` of tokens, or a\n * colour written out, which is kept as written for the mix to read.\n */\nfunction mixColour(cursor: Cursor): ColourExpression {\n const name = match(cursor, VAR)?.[1];\n if (name) return referenceColour(reference(cursor, name));\n const start = cursor.at;\n const fn = match(cursor, FUNCTION)?.[1]?.toLowerCase();\n if (fn === 'color-mix') return mixExpression(cursor);\n if (!fn) return { color: (match(cursor, WORD) ?? fail())[0] };\n if (RELATIVE[fn] && takeWord(cursor, 'from')) return relativeExpression(cursor, RELATIVE[fn]);\n if (fn === 'color' && takeWord(cursor, 'from')) return srgbExpression(cursor);\n cursor.at = closing(cursor);\n return functionColour(cursor.text.slice(start, cursor.at));\n}\n\n/** A colour function in a mix: of tokens, as a token of it is read, or written out, as it is. */\nfunction functionColour(text: string): ColourExpression {\n if (!text.includes('var(')) return { color: text };\n const token = colourToken(text);\n return token?.hsl ? { hsl: token.hsl } : (token?.deferredColour ?? fail());\n}\n\n/** One side of a mix: its colour, and the percentage written before or after it, if one is. */\nfunction mixSide(cursor: Cursor): { colour: ColourExpression; percentage?: number } {\n const percentage = () => {\n const found = match(cursor, PERCENTAGE);\n match(cursor, SPACE);\n return found ? Number(found[1]) : undefined;\n };\n const before = percentage();\n const colour = mixColour(cursor);\n match(cursor, SPACE);\n const after = before === undefined ? percentage() : undefined;\n const written = before ?? after;\n return written === undefined ? { colour } : { colour, percentage: written };\n}\n\n/**\n * The rest of a `color-mix(in <space> [<method> hue], <colour> [p%], <colour> [q%])` once its name\n * is read, as `mixExpression` in the compiler reads it.\n */\nfunction mixExpression(cursor: Cursor): ColourExpression {\n const words: string[] = [];\n while (!take(cursor, ',')) {\n words.push((match(cursor, WORD) ?? fail())[0].toLowerCase());\n match(cursor, SPACE);\n }\n const [keyword, space, method, hue, ...rest] = words;\n if (keyword !== 'in' || !MIX_SPACES.has(space!) || rest.length) fail();\n if (method !== undefined && (hue !== 'hue' || !HUE_METHODS.has(method))) fail();\n const a = mixSide(cursor);\n expect(cursor, ',');\n const b = mixSide(cursor);\n expect(cursor, ')');\n return {\n mix: {\n space: space as MixSpace,\n ...(method ? { hue: method as HueMethod } : {}),\n a: a.colour,\n ...(a.percentage === undefined ? {} : { aPercentage: a.percentage }),\n b: b.colour,\n ...(b.percentage === undefined ? {} : { bPercentage: b.percentage }),\n },\n };\n}\n\n/** A whole `color-mix()`, worked out where it is set, as `deferMixToken` in the compiler reads it. */\nfunction mixToken(text: string): TokenValue | undefined {\n const deferredColour = whole(text, (cursor) => {\n const colour = mixColour(cursor);\n return 'mix' in colour || 'relative' in colour ? colour : fail();\n });\n return deferredColour && { deferredColour };\n}\n\ninterface RelativeSpace {\n readonly space: MixSpace;\n readonly keywords: readonly string[];\n /** What 100% of each channel is; null for a hue, which takes an angle instead. */\n readonly full: readonly (number | null)[];\n}\n\n/** Each relative colour function, as `RELATIVE` in the compiler's colour-expression.cjs. */\nconst RELATIVE: Readonly<Record<string, RelativeSpace>> = {\n rgb: { space: 'srgb', keywords: ['r', 'g', 'b'], full: [255, 255, 255] },\n rgba: { space: 'srgb', keywords: ['r', 'g', 'b'], full: [255, 255, 255] },\n hsl: { space: 'hsl', keywords: ['h', 's', 'l'], full: [null, 100, 100] },\n hsla: { space: 'hsl', keywords: ['h', 's', 'l'], full: [null, 100, 100] },\n hwb: { space: 'hwb', keywords: ['h', 'w', 'b'], full: [null, 100, 100] },\n lab: { space: 'lab', keywords: ['l', 'a', 'b'], full: [100, 125, 125] },\n lch: { space: 'lch', keywords: ['l', 'c', 'h'], full: [100, 150, null] },\n oklab: { space: 'oklab', keywords: ['l', 'a', 'b'], full: [1, 0.4, 0.4] },\n oklch: { space: 'oklch', keywords: ['l', 'c', 'h'], full: [1, 0.4, null] },\n};\n\n/** Whether the next word is `word`, in any case; taken, with the space after it, if so. */\nfunction takeWord(cursor: Cursor, word: string): boolean {\n const start = cursor.at;\n if (match(cursor, WORD)?.[0].toLowerCase() === word) {\n match(cursor, SPACE);\n return true;\n }\n cursor.at = start;\n return false;\n}\n\n/**\n * The rest of `<space>(from <colour> <channel> <channel> <channel> [/ <alpha>])` once `from` is\n * read, as `relativeExpression` in the compiler reads it.\n */\nfunction relativeExpression(cursor: Cursor, { space, keywords, full }: RelativeSpace) {\n const from = mixColour(cursor);\n const names = [...keywords, 'alpha'];\n const channels = [0, 1, 2].map((index) => {\n match(cursor, SPACE);\n return relativeChannel(cursor, names, full[index]!);\n }) as [Channel, Channel, Channel];\n const alpha = take(cursor, '/') ? relativeChannel(cursor, names, 1) : undefined;\n expect(cursor, ')');\n return { relative: { space, from, channels, ...(alpha === undefined ? {} : { alpha }) } };\n}\n\n/**\n * The rest of `color(from <colour> srgb <channel> <channel> <channel> [/ <alpha>])` once `from` is\n * read: what Highcharts writes for the colour a label stands out in on a colour it cannot read.\n * Its `r g b` run from 0 to 1, as the channels it makes do: each is the same channel of `rgb()`\n * read as a share of 255.\n */\nfunction srgbExpression(cursor: Cursor) {\n const from = mixColour(cursor);\n match(cursor, SPACE);\n if (!takeWord(cursor, 'srgb')) fail();\n const names = ['r', 'g', 'b', 'alpha'];\n const share = (channel: Channel): Channel =>\n typeof channel === 'string'\n ? channel === 'alpha'\n ? channel\n : ['/', channel, 255]\n : typeof channel === 'number'\n ? channel\n : [channel[0], share(channel[1]), share(channel[2])];\n const channels = [0, 1, 2].map((): Channel => {\n match(cursor, SPACE);\n return ['*', share(relativeChannel(cursor, names, 1)), 255];\n }) as [Channel, Channel, Channel];\n const alpha = take(cursor, '/') ? share(relativeChannel(cursor, names, 1)) : undefined;\n expect(cursor, ')');\n return {\n relative: { space: 'srgb' as const, from, channels, ...(alpha === undefined ? {} : { alpha }) },\n };\n}\n\n/** The functions a channel is worked out with: arithmetic, and the least, the most or between. */\nconst CHANNEL_MATH: ReadonlySet<string> = new Set(['calc', 'min', 'max', 'clamp']);\n\n/**\n * One channel: a `calc()`, `min()`, `max()` or `clamp()` of numbers and keywords, a keyword, a\n * number, a percentage of the channel's range, or an angle for a hue.\n */\nfunction relativeChannel(cursor: Cursor, keywords: readonly string[], full: number | null) {\n const fn = match(cursor, FUNCTION)?.[1]?.toLowerCase();\n if (fn) return channelMath(cursor, fn, keywords);\n const found = match(cursor, LITERAL);\n if (!found) return channelOperand(cursor, keywords);\n const value = Number(found[1]) * channelScale((found[2] ?? '').toLowerCase(), full);\n return Number.isFinite(value) ? value : fail();\n}\n\n/** What one of a written channel's unit is: a share of its range, degrees of a hue, or itself. */\nfunction channelScale(unit: string, full: number | null): number {\n if (unit === '%') return full === null ? NaN : full / 100;\n if (full !== null) return unit ? NaN : 1;\n return HUE_UNITS.has(unit) ? PER_UNIT[unit]! : NaN;\n}\n\n/** `a + b - c`, each side a product of numbers, keywords and bracketed sums. */\nfunction channelSum(cursor: Cursor, keywords: readonly string[]): Channel {\n let value = channelProduct(cursor, keywords);\n for (let op; (op = (['+', '-'] as const).find((char) => take(cursor, char)));) {\n value = [op, value, channelProduct(cursor, keywords)];\n }\n return value;\n}\n\nfunction channelProduct(cursor: Cursor, keywords: readonly string[]): Channel {\n let value = channelFactor(cursor, keywords);\n for (let op; (op = (['*', '/'] as const).find((char) => take(cursor, char)));) {\n value = [op, value, channelFactor(cursor, keywords)];\n }\n return value;\n}\n\n/** The rest of a `calc()`, `min()`, `max()` or `clamp()` of channels, once its name is read. */\nfunction channelMath(cursor: Cursor, fn: string, keywords: readonly string[]): Channel {\n if (!CHANNEL_MATH.has(fn)) fail();\n const sides = [channelSum(cursor, keywords)];\n while (fn !== 'calc' && take(cursor, ',')) sides.push(channelSum(cursor, keywords));\n expect(cursor, ')');\n if (fn === 'clamp') {\n if (sides.length !== 3) fail();\n const [least, value, most] = sides;\n return ['max', least!, ['min', value!, most!]];\n }\n return sides.reduce((a, b) => [fn as 'min' | 'max', a, b]);\n}\n\nfunction channelFactor(cursor: Cursor, keywords: readonly string[]): Channel {\n if (take(cursor, '(')) {\n const value = channelSum(cursor, keywords);\n expect(cursor, ')');\n return value;\n }\n const fn = match(cursor, FUNCTION)?.[1]?.toLowerCase();\n if (fn) return channelMath(cursor, fn, keywords);\n const found = match(cursor, LITERAL);\n // A percentage or an angle stands alone: inside arithmetic the keywords are numbers.\n if (found) return found[2] ? fail() : Number(found[1]);\n return channelOperand(cursor, keywords);\n}\n\nfunction channelOperand(cursor: Cursor, keywords: readonly string[]): string {\n const word = (match(cursor, WORD) ?? fail())[0];\n return keywords.includes(word) ? word : fail();\n}\n\n/**\n * A value with a `var()` inside it, or a `color-mix()`, as a token made of others; undefined if it\n * is no such shape.\n */\nexport function derivedToken(text: string): TokenValue | undefined {\n return calcToken(text) ?? colourToken(text) ?? mixToken(text);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"inline-derived-token.js","sourceRoot":"","sources":["../src/inline-derived-token.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * A custom property set on an element to a value with a `var()` inside it,\n * `[style.--size]=\"'calc(var(--gap) * 2)'\"`, read into the form the same text in a stylesheet is\n * compiled to, which the cascade then works out where it is set, as it does that one\n * (`resolveAliases` in css.ts).\n *\n * The shapes are the build-time conversion's and no more (`deferCalcToken`, `deferHslToken`,\n * `deferChannelsToken` and `deferMixToken` in `@ng-native/metro/css/compile.cjs`): `calc()`,\n * `min()` or `max()` of numbers, lengths in `px` or `rem`, angles, times and `var()`, with + - * /\n * and brackets; an `hsl()` with a `var()` for a channel; `rgb()` or `hsl()` of one channels token,\n * with an alpha written or tokened; and a `color-mix()` of any of these colours, tokens and\n * colours written out. Anything else is undefined, as a stylesheet refuses it.\n */\nimport { MIX_SPACES, type HueMethod, type MixSpace } from './color-mix.ts';\nimport type { Channel } from './relative-colour.ts';\nimport type { ColourExpression, HslChannel, TokenValue } from './css.ts';\nimport { cssTrim, tokenFromValue } from './inline-token.ts';\n\ntype Marker = NonNullable<TokenValue['deferredCalc']>[number];\ntype Expression = Marker['expression'];\ntype Alpha = Extract<NonNullable<TokenValue['deferredColour']>, { channels: unknown }>['alpha'];\n\ninterface Cursor {\n readonly text: string;\n at: number;\n}\n\n/** A `var()`: the token it names, and the text of its fallback, read as its slot wants it. */\ninterface Reference {\n readonly reference: string;\n readonly fallback?: string;\n}\n\n/** CSS whitespace, and no other: a no-break space is part of a word, as it is in a browser. */\nconst SPACE = /[ \\t\\n\\r\\f]*/y;\nconst FUNCTION = /([a-z][a-z-]*)\\([ \\t\\n\\r\\f]*/iy;\nconst VAR = /var\\([ \\t\\n\\r\\f]*(--[\\w-]+)[ \\t\\n\\r\\f]*/iy;\nconst LITERAL = /([+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?)(%|[a-z]+)?/iy;\nconst WORD = /[^ \\t\\n\\r\\f,/()]+/y;\n/**\n * A `color-mix()` or a relative colour, the only shapes `mixToken` keeps. Any other colour function\n * is one `colourToken` has already read, or failed to: reading it again there reads the fallbacks\n * inside it again too, twice for each one nested, `rgb(var(--c, rgb(var(--c, …), x)), x)`.\n */\nconst MIXED = /^(?:color-mix\\(|[a-z]+\\([ \\t\\n\\r\\f]*from[ \\t\\n\\r\\f])/i;\n/** A fallback that is a `var()` or arithmetic, rather than a value written out. */\nconst NESTED = /^[ \\t\\n\\r\\f]*(var|calc|min|max)\\(/i;\n/** What one of each unit counts as: points, degrees, milliseconds, or itself. */\nconst PER_UNIT: Readonly<Record<string, number>> = {\n '': 1,\n px: 1,\n rem: 16,\n deg: 1,\n grad: 0.9,\n rad: 180 / Math.PI,\n turn: 360,\n ms: 1,\n s: 1000,\n};\nconst PERCENTAGE = /([+-]?(?:\\d+\\.?\\d*|\\.\\d+))%/y;\nconst HUE_UNITS: ReadonlySet<string> = new Set(['', 'deg', 'grad', 'rad', 'turn']);\nconst HUE_METHODS: ReadonlySet<string> = new Set(['shorter', 'longer', 'increasing', 'decreasing']);\nconst MATH: ReadonlySet<string> = new Set(['calc', 'min', 'max']);\nconst SPACES: Readonly<Record<string, 'rgb' | 'hsl'>> = {\n rgb: 'rgb',\n rgba: 'rgb',\n hsl: 'hsl',\n hsla: 'hsl',\n};\n\n/** The space a colour function's channels are in, and none for a name every object has. */\nconst colourSpace = (fn: string): 'rgb' | 'hsl' | undefined =>\n Object.hasOwn(SPACES, fn) ? SPACES[fn] : undefined;\n\n/** Thrown where the text stops being one of the shapes, and caught by `whole`. */\nconst UNREADABLE = new Error('not a token made of others');\nconst fail = (): never => {\n throw UNREADABLE;\n};\n\nfunction match(cursor: Cursor, pattern: RegExp): RegExpExecArray | null {\n pattern.lastIndex = cursor.at;\n const found = pattern.exec(cursor.text);\n if (found) cursor.at = pattern.lastIndex;\n return found;\n}\n\n/** Whether the next character, past any space, is `char`; taken, with the space after it, if so. */\nfunction take(cursor: Cursor, char: string): boolean {\n match(cursor, SPACE);\n if (cursor.text[cursor.at] !== char) return false;\n cursor.at++;\n match(cursor, SPACE);\n return true;\n}\n\nfunction expect(cursor: Cursor, char: string): void {\n if (!take(cursor, char)) fail();\n}\n\n/** The whole text as `read` reads it, or undefined when it is not that shape. */\nfunction whole<T>(text: string, read: (cursor: Cursor) => T): T | undefined {\n const cursor = { text, at: 0 };\n try {\n const value = read(cursor);\n match(cursor, SPACE);\n return cursor.at === text.length ? value : undefined;\n } catch (error) {\n if (error === UNREADABLE) return undefined;\n throw error;\n }\n}\n\n/** A `var()` from its name on, to the bracket that closes it. */\nfunction reference(cursor: Cursor, name: string): Reference {\n if (take(cursor, ')')) return { reference: name };\n expect(cursor, ',');\n const start = cursor.at;\n for (let depth = 0; cursor.at < cursor.text.length; cursor.at++) {\n const char = cursor.text[cursor.at];\n if (char === '(') depth++;\n else if (char === ')' && depth-- === 0) break;\n }\n const fallback = cursor.text.slice(start, cursor.at);\n expect(cursor, ')');\n return { reference: name, fallback };\n}\n\n/** A fallback's token. One that is another `var()` is refused, as the compiler refuses it. */\nfunction fallbackToken(text: string | undefined): TokenValue | undefined {\n const token = text === undefined ? undefined : tokenFromValue(text);\n return token?.alias ? fail() : token;\n}\n\n/** A number, length, angle or time, as the number its slot counts in. */\nfunction literal(cursor: Cursor, units: (unit: string) => number | undefined): number {\n const found = match(cursor, LITERAL) ?? fail();\n return Number(found[1]) * (units((found[2] ?? '').toLowerCase()) ?? fail());\n}\n\n/** A number slot takes a percentage as a fraction, which a length slot cannot work out. */\nconst unitsOf =\n (kind: Marker['kind']) =>\n (unit: string): number | undefined =>\n unit === '%' ? (kind === 'number' ? 0.01 : undefined) : PER_UNIT[unit];\n\nfunction sum(cursor: Cursor, kind: Marker['kind']): Expression {\n let value = product(cursor, kind);\n for (let op; (op = (['+', '-'] as const).find((char) => take(cursor, char)));) {\n value = [op, value, product(cursor, kind)];\n }\n return value;\n}\n\nfunction product(cursor: Cursor, kind: Marker['kind']): Expression {\n let value = factor(cursor, kind);\n for (let op; (op = (['*', '/'] as const).find((char) => take(cursor, char)));) {\n value = [op, value, factor(cursor, kind)];\n }\n return value;\n}\n\nfunction factor(cursor: Cursor, kind: Marker['kind']): Expression {\n if (take(cursor, '(')) {\n const value = sum(cursor, kind);\n expect(cursor, ')');\n return value;\n }\n const name = match(cursor, VAR)?.[1];\n if (name) {\n const value = leafFallback(reference(cursor, name).fallback, kind);\n return value === undefined ? { reference: name } : { reference: name, fallback: value };\n }\n const fn = match(cursor, FUNCTION)?.[1];\n if (fn) return math(cursor, fn, kind);\n const value = literal(cursor, unitsOf(kind));\n // A percentage, kept apart from a bare number, as `literal` in the compiler keeps it.\n return cursor.text[cursor.at - 1] === '%' ? { percentage: value } : value;\n}\n\n/**\n * A `var()` fallback in arithmetic, as its slot reads it: another `var()` or arithmetic of its\n * own, read as a tree, `var(--a, calc(var(--gap) * 2))`, as `leaf` in the compiler reads it; a\n * length in points, `rem` included as the compiler counts it; or a bare number.\n */\nfunction leafFallback(text: string | undefined, kind: Marker['kind']): Expression | undefined {\n if (text !== undefined && NESTED.test(text)) {\n return whole(cssTrim(text), (cursor) => factor(cursor, kind)) ?? fail();\n }\n const token = fallbackToken(text);\n if (kind !== 'length') return numberFallback(token, kind);\n if (typeof token?.length === 'number') return token.length;\n const rem =\n text === undefined ? undefined : /^[ \\t\\n\\r\\f]*(-?\\d*\\.?\\d+)rem[ \\t\\n\\r\\f]*$/i.exec(text);\n return rem ? Number(rem[1]) * PER_UNIT['rem']! : undefined;\n}\n\n/** A fallback where a number is wanted: a percentage kept apart from a bare number. */\nfunction numberFallback(\n token: TokenValue | undefined,\n kind: Marker['kind'],\n): Expression | undefined {\n const percentage =\n kind === 'number' && typeof token?.length === 'string' && token.number !== undefined;\n return percentage ? { percentage: token.number! } : token?.number;\n}\n\n/** The rest of a `calc()`, or of a `min()` or `max()` of sums, once its name is read. */\nfunction math(cursor: Cursor, fn: string, kind: Marker['kind']): Expression {\n const name = fn.toLowerCase();\n if (!MATH.has(name)) fail();\n const sides = [sum(cursor, kind)];\n while (name !== 'calc' && take(cursor, ',')) sides.push(sum(cursor, kind));\n expect(cursor, ')');\n return sides.reduce((a, b) => [name as 'min' | 'max', a, b]);\n}\n\n/** Arithmetic of tokens, read as a length and as a number, whichever each reading makes of it. */\nfunction calcToken(text: string): TokenValue | undefined {\n const markers = (['length', 'number'] as const).flatMap((kind): Marker[] => {\n const expression = whole(text, (cursor) =>\n math(cursor, (match(cursor, FUNCTION) ?? fail())[1]!, kind),\n );\n return expression === undefined ? [] : [{ expression, kind }];\n });\n return markers.length ? { deferredCalc: markers } : undefined;\n}\n\n/** An argument of a colour function: a `var()`, or a word read as its slot wants it. */\ntype Argument = Reference | { readonly word: string };\n\n/**\n * A colour function's arguments, with the commas and the slash between them gone, and whether\n * commas were what separated them.\n */\nfunction colourArguments(cursor: Cursor): {\n space: 'rgb' | 'hsl';\n args: Argument[];\n legacy: boolean;\n} {\n const space = colourSpace((match(cursor, FUNCTION) ?? fail())[1]!.toLowerCase()) ?? fail();\n const args: Argument[] = [];\n let legacy = false;\n while (!take(cursor, ')')) {\n if (take(cursor, ',')) legacy = true;\n else if (!take(cursor, '/')) {\n const name = match(cursor, VAR)?.[1];\n args.push(name ? reference(cursor, name) : { word: (match(cursor, WORD) ?? fail())[0] });\n }\n }\n return { space, args, legacy };\n}\n\n/** What each argument of an `hsl()` is: a hue, a saturation and a lightness, then an alpha. */\nconst HSL_SLOTS = ['hue', 'percentage', 'percentage', 'alpha'] as const;\n\n/**\n * A written `hsl()` channel as its slot reads it, as `hslLiteral` in the compiler does: a hue in\n * degrees; a saturation or a lightness as a fraction, from a percentage or, in the space syntax\n * only, a bare number of percent; an alpha as a number or a fraction.\n */\nfunction hslLiteral(\n text: string,\n slot: (typeof HSL_SLOTS)[number],\n legacy: boolean,\n): number | undefined {\n const perUnit = (unit: string): number | undefined => {\n if (slot === 'hue') return HUE_UNITS.has(unit) ? PER_UNIT[unit] : undefined;\n if (unit === '%') return 0.01;\n if (unit !== '') return undefined;\n return slot === 'alpha' ? 1 : legacy ? undefined : 0.01;\n };\n return whole(text, (cursor) => literal(cursor, perUnit));\n}\n\nfunction hslChannel(arg: Argument, index: number, legacy: boolean): HslChannel {\n const slot = HSL_SLOTS[index]!;\n if ('word' in arg) return hslLiteral(arg.word, slot, legacy) ?? fail();\n const fallback = arg.fallback === undefined ? undefined : hslLiteral(arg.fallback, slot, legacy);\n return fallback === undefined\n ? { reference: arg.reference }\n : { reference: arg.reference, fallback };\n}\n\n/** A channels colour's alpha: none, written as a number or a percentage, or a token of its own. */\nfunction alphaOf(arg: Argument | undefined): Alpha {\n if (arg === undefined) return undefined;\n if ('word' in arg) {\n return whole(arg.word, (cursor) => literal(cursor, unitsOf('number'))) ?? fail();\n }\n const fallback = fallbackToken(arg.fallback)?.number;\n return fallback === undefined\n ? { reference: arg.reference }\n : { reference: arg.reference, fallback };\n}\n\n/** `rgba(var(--channels), <alpha>)`, as `deferChannelsToken` reads it. */\nfunction channelsToken(\n channels: Reference,\n alpha: Argument | undefined,\n space: 'rgb' | 'hsl',\n): TokenValue {\n const token = fallbackToken(channels.fallback);\n const fallback = space === 'hsl' ? token?.hslChannels : token?.channels;\n const opacity = alphaOf(alpha);\n return {\n deferredColour: {\n channels: { reference: channels.reference, ...(fallback ? { fallback } : {}), space },\n ...(opacity === undefined ? {} : { alpha: opacity }),\n },\n };\n}\n\n/** `hsl(var(--h) 100% 50%)` and the like, as `deferHslToken` reads it. */\nfunction hslToken(args: readonly Argument[], legacy: boolean): TokenValue {\n if (args.length !== 3 && args.length !== 4) fail();\n const [h, s, l, alpha] = args.map((arg, index) => hslChannel(arg, index, legacy));\n const legacyFlag = legacy ? { legacy: true as const } : {};\n return { hsl: { h: h!, s: s!, l: l!, ...(alpha === undefined ? {} : { alpha }), ...legacyFlag } };\n}\n\nfunction colourToken(text: string): TokenValue | undefined {\n return whole(text, (cursor) => {\n const { space, args, legacy } = colourArguments(cursor);\n const [channels, alpha, ...rest] = args;\n if (channels && 'reference' in channels && !rest.length) {\n return channelsToken(channels, alpha, space);\n }\n return space === 'hsl' ? hslToken(args, legacy) : fail();\n });\n}\n\n/** The index just past the bracket that closes the function the cursor is inside. */\nfunction closing(cursor: Cursor): number {\n for (let at = cursor.at, depth = 0; at < cursor.text.length; at++) {\n const char = cursor.text[at];\n if (char === '(') depth++;\n else if (char === ')' && depth-- === 0) return at + 1;\n }\n return fail();\n}\n\n/**\n * A `var()` in a colour, as `reference` in the compiler's colour-expression.cjs reads it: the\n * tokens its `var()` fallbacks name, tried in turn, then a colour, or one made of other tokens.\n */\nfunction referenceColour({ reference: name, fallback }: Reference): ColourExpression {\n const alternatives: string[] = [];\n let rest = fallback === undefined ? undefined : cssTrim(fallback);\n for (\n let next;\n rest && (next = whole(rest, nextReference));\n rest = next.fallback === undefined ? undefined : cssTrim(next.fallback)\n ) {\n alternatives.push(next.reference);\n }\n return {\n reference: name,\n ...(alternatives.length ? { alternatives } : {}),\n ...(rest ? colourFallback(rest) : {}),\n };\n}\n\n/** The colour a `var()` falls back to, or one made of other tokens; refused when it is neither. */\nfunction colourFallback(text: string): { fallback: string } | { fallbackToken: TokenValue } {\n const token = tokenFromValue(text);\n if (token?.hsl || token?.deferredColour) return { fallbackToken: token };\n // A platform colour has no channels to mix: refused, as a word is.\n const colour = token?.color;\n return { fallback: typeof colour === 'string' ? colour : fail() };\n}\n\nconst nextReference = (cursor: Cursor): Reference =>\n reference(cursor, (match(cursor, VAR) ?? fail())[1]!);\n\n/**\n * One colour in a `color-mix()`: a `var()`, another mix, an `rgb()` or `hsl()` of tokens, or a\n * colour written out, which is kept as written for the mix to read.\n */\nfunction mixColour(cursor: Cursor): ColourExpression {\n const name = match(cursor, VAR)?.[1];\n if (name) return referenceColour(reference(cursor, name));\n const start = cursor.at;\n const fn = match(cursor, FUNCTION)?.[1]?.toLowerCase();\n if (fn === 'color-mix') return mixExpression(cursor);\n if (!fn) return { color: (match(cursor, WORD) ?? fail())[0] };\n const relative = relativeSpace(fn);\n if (relative && takeWord(cursor, 'from')) return relativeExpression(cursor, relative);\n if (fn === 'color' && takeWord(cursor, 'from')) return srgbExpression(cursor);\n cursor.at = closing(cursor);\n return functionColour(cursor.text.slice(start, cursor.at));\n}\n\n/** A colour function in a mix: of tokens, as a token of it is read, or written out, as it is. */\nfunction functionColour(text: string): ColourExpression {\n if (!text.includes('var(')) return { color: text };\n const token = colourToken(text);\n return token?.hsl ? { hsl: token.hsl } : (token?.deferredColour ?? fail());\n}\n\n/** One side of a mix: its colour, and the percentage written before or after it, if one is. */\nfunction mixSide(cursor: Cursor): { colour: ColourExpression; percentage?: number } {\n const percentage = () => {\n const found = match(cursor, PERCENTAGE);\n match(cursor, SPACE);\n return found ? Number(found[1]) : undefined;\n };\n const before = percentage();\n const colour = mixColour(cursor);\n match(cursor, SPACE);\n const after = before === undefined ? percentage() : undefined;\n const written = before ?? after;\n return written === undefined ? { colour } : { colour, percentage: written };\n}\n\n/**\n * The rest of a `color-mix(in <space> [<method> hue], <colour> [p%], <colour> [q%])` once its name\n * is read, as `mixExpression` in the compiler reads it.\n */\nfunction mixExpression(cursor: Cursor): ColourExpression {\n const words: string[] = [];\n while (!take(cursor, ',')) {\n words.push((match(cursor, WORD) ?? fail())[0].toLowerCase());\n match(cursor, SPACE);\n }\n const [keyword, space, method, hue, ...rest] = words;\n if (keyword !== 'in' || !MIX_SPACES.has(space!) || rest.length) fail();\n if (method !== undefined && (hue !== 'hue' || !HUE_METHODS.has(method))) fail();\n const a = mixSide(cursor);\n expect(cursor, ',');\n const b = mixSide(cursor);\n expect(cursor, ')');\n return {\n mix: {\n space: space as MixSpace,\n ...(method ? { hue: method as HueMethod } : {}),\n a: a.colour,\n ...(a.percentage === undefined ? {} : { aPercentage: a.percentage }),\n b: b.colour,\n ...(b.percentage === undefined ? {} : { bPercentage: b.percentage }),\n },\n };\n}\n\n/** A whole `color-mix()`, worked out where it is set, as `deferMixToken` in the compiler reads it. */\nfunction mixToken(text: string): TokenValue | undefined {\n const deferredColour = whole(text, (cursor) => {\n const colour = mixColour(cursor);\n return 'mix' in colour || 'relative' in colour ? colour : fail();\n });\n return deferredColour && { deferredColour };\n}\n\ninterface RelativeSpace {\n readonly space: MixSpace;\n readonly keywords: readonly string[];\n /** What 100% of each channel is; null for a hue, which takes an angle instead. */\n readonly full: readonly (number | null)[];\n}\n\n/** Each relative colour function, as `RELATIVE` in the compiler's colour-expression.cjs. */\nconst RELATIVE: Readonly<Record<string, RelativeSpace>> = {\n rgb: { space: 'srgb', keywords: ['r', 'g', 'b'], full: [255, 255, 255] },\n rgba: { space: 'srgb', keywords: ['r', 'g', 'b'], full: [255, 255, 255] },\n hsl: { space: 'hsl', keywords: ['h', 's', 'l'], full: [null, 100, 100] },\n hsla: { space: 'hsl', keywords: ['h', 's', 'l'], full: [null, 100, 100] },\n hwb: { space: 'hwb', keywords: ['h', 'w', 'b'], full: [null, 100, 100] },\n lab: { space: 'lab', keywords: ['l', 'a', 'b'], full: [100, 125, 125] },\n lch: { space: 'lch', keywords: ['l', 'c', 'h'], full: [100, 150, null] },\n oklab: { space: 'oklab', keywords: ['l', 'a', 'b'], full: [1, 0.4, 0.4] },\n oklch: { space: 'oklch', keywords: ['l', 'c', 'h'], full: [1, 0.4, null] },\n};\n\n/** The relative colour function a name is, and none for a name every object has, `constructor`. */\nconst relativeSpace = (fn: string): RelativeSpace | undefined =>\n Object.hasOwn(RELATIVE, fn) ? RELATIVE[fn] : undefined;\n\n/** Whether the next word is `word`, in any case; taken, with the space after it, if so. */\nfunction takeWord(cursor: Cursor, word: string): boolean {\n const start = cursor.at;\n if (match(cursor, WORD)?.[0].toLowerCase() === word) {\n match(cursor, SPACE);\n return true;\n }\n cursor.at = start;\n return false;\n}\n\n/**\n * The rest of `<space>(from <colour> <channel> <channel> <channel> [/ <alpha>])` once `from` is\n * read, as `relativeExpression` in the compiler reads it.\n */\nfunction relativeExpression(cursor: Cursor, { space, keywords, full }: RelativeSpace) {\n const from = mixColour(cursor);\n const names = [...keywords, 'alpha'];\n const channels = [0, 1, 2].map((index) => {\n match(cursor, SPACE);\n return relativeChannel(cursor, names, full[index]!);\n }) as [Channel, Channel, Channel];\n const alpha = take(cursor, '/') ? relativeChannel(cursor, names, 1) : undefined;\n expect(cursor, ')');\n return { relative: { space, from, channels, ...(alpha === undefined ? {} : { alpha }) } };\n}\n\n/**\n * The rest of `color(from <colour> srgb <channel> <channel> <channel> [/ <alpha>])` once `from` is\n * read: what Highcharts writes for the colour a label stands out in on a colour it cannot read.\n * Its `r g b` run from 0 to 1, as the channels it makes do: each is the same channel of `rgb()`\n * read as a share of 255.\n */\nfunction srgbExpression(cursor: Cursor) {\n const from = mixColour(cursor);\n match(cursor, SPACE);\n if (!takeWord(cursor, 'srgb')) fail();\n const names = ['r', 'g', 'b', 'alpha'];\n const share = (channel: Channel): Channel =>\n typeof channel === 'string'\n ? channel === 'alpha'\n ? channel\n : ['/', channel, 255]\n : typeof channel === 'number'\n ? channel\n : [channel[0], share(channel[1]), share(channel[2])];\n const channels = [0, 1, 2].map((): Channel => {\n match(cursor, SPACE);\n return ['*', share(relativeChannel(cursor, names, 1)), 255];\n }) as [Channel, Channel, Channel];\n const alpha = take(cursor, '/') ? share(relativeChannel(cursor, names, 1)) : undefined;\n expect(cursor, ')');\n return {\n relative: { space: 'srgb' as const, from, channels, ...(alpha === undefined ? {} : { alpha }) },\n };\n}\n\n/** The functions a channel is worked out with: arithmetic, and the least, the most or between. */\nconst CHANNEL_MATH: ReadonlySet<string> = new Set(['calc', 'min', 'max', 'clamp']);\n\n/**\n * One channel: a `calc()`, `min()`, `max()` or `clamp()` of numbers and keywords, a keyword, a\n * number, a percentage of the channel's range, or an angle for a hue.\n */\nfunction relativeChannel(cursor: Cursor, keywords: readonly string[], full: number | null) {\n const fn = match(cursor, FUNCTION)?.[1]?.toLowerCase();\n if (fn) return channelMath(cursor, fn, keywords);\n const found = match(cursor, LITERAL);\n if (!found) return channelOperand(cursor, keywords);\n const value = Number(found[1]) * channelScale((found[2] ?? '').toLowerCase(), full);\n return Number.isFinite(value) ? value : fail();\n}\n\n/** What one of a written channel's unit is: a share of its range, degrees of a hue, or itself. */\nfunction channelScale(unit: string, full: number | null): number {\n if (unit === '%') return full === null ? NaN : full / 100;\n if (full !== null) return unit ? NaN : 1;\n return HUE_UNITS.has(unit) ? PER_UNIT[unit]! : NaN;\n}\n\n/** `a + b - c`, each side a product of numbers, keywords and bracketed sums. */\nfunction channelSum(cursor: Cursor, keywords: readonly string[]): Channel {\n let value = channelProduct(cursor, keywords);\n for (let op; (op = (['+', '-'] as const).find((char) => take(cursor, char)));) {\n value = [op, value, channelProduct(cursor, keywords)];\n }\n return value;\n}\n\nfunction channelProduct(cursor: Cursor, keywords: readonly string[]): Channel {\n let value = channelFactor(cursor, keywords);\n for (let op; (op = (['*', '/'] as const).find((char) => take(cursor, char)));) {\n value = [op, value, channelFactor(cursor, keywords)];\n }\n return value;\n}\n\n/** The rest of a `calc()`, `min()`, `max()` or `clamp()` of channels, once its name is read. */\nfunction channelMath(cursor: Cursor, fn: string, keywords: readonly string[]): Channel {\n if (!CHANNEL_MATH.has(fn)) fail();\n const sides = [channelSum(cursor, keywords)];\n while (fn !== 'calc' && take(cursor, ',')) sides.push(channelSum(cursor, keywords));\n expect(cursor, ')');\n if (fn === 'clamp') {\n if (sides.length !== 3) fail();\n const [least, value, most] = sides;\n return ['max', least!, ['min', value!, most!]];\n }\n return sides.reduce((a, b) => [fn as 'min' | 'max', a, b]);\n}\n\nfunction channelFactor(cursor: Cursor, keywords: readonly string[]): Channel {\n if (take(cursor, '(')) {\n const value = channelSum(cursor, keywords);\n expect(cursor, ')');\n return value;\n }\n const fn = match(cursor, FUNCTION)?.[1]?.toLowerCase();\n if (fn) return channelMath(cursor, fn, keywords);\n const found = match(cursor, LITERAL);\n // A percentage or an angle stands alone: inside arithmetic the keywords are numbers.\n if (found) return found[2] ? fail() : Number(found[1]);\n return channelOperand(cursor, keywords);\n}\n\nfunction channelOperand(cursor: Cursor, keywords: readonly string[]): string {\n const word = (match(cursor, WORD) ?? fail())[0];\n return keywords.includes(word) ? word : fail();\n}\n\n/**\n * A value with a `var()` inside it, or a `color-mix()`, as a token made of others; undefined if it\n * is no such shape.\n */\nexport function derivedToken(text: string): TokenValue | undefined {\n return calcToken(text) ?? colourToken(text) ?? (MIXED.test(text) ? mixToken(text) : undefined);\n}\n"]}
|
package/dist/inline-token.d.ts
CHANGED
|
@@ -6,13 +6,13 @@
|
|
|
6
6
|
* parser (`@ng-native/metro/css/values.cjs`). A bound one only exists here, where there is not,
|
|
7
7
|
* so this takes the shapes a binding actually holds and nothing more: a length in `px`, `%`,
|
|
8
8
|
* `rem`, `em` or a viewport unit, two to four lengths in `px`, a number, a colour as React Native
|
|
9
|
-
* writes one, a colour's three channels, a word, another token,
|
|
10
|
-
* others, `calc(var(--gap) * 2)`, `calc(10px * 2)` or a
|
|
11
|
-
* inline-derived-token.ts).
|
|
9
|
+
* writes one, a `platform-color()`, a colour's three channels, a word, another token,
|
|
10
|
+
* `var(--brand)`, and one made of others, `calc(var(--gap) * 2)`, `calc(10px * 2)` or a
|
|
11
|
+
* `color-mix()` (see inline-derived-token.ts).
|
|
12
12
|
* Anything else is kept as a word, which leaves a use site that wants a length or a colour unset,
|
|
13
13
|
* as a token of the wrong kind does.
|
|
14
14
|
*/
|
|
15
|
-
import { type TokenValue } from './css.ts';
|
|
15
|
+
import { type PlatformColour, type TokenValue } from './css.ts';
|
|
16
16
|
export declare const cssTrim: (text: string) => string;
|
|
17
17
|
/**
|
|
18
18
|
* The first family of a `font-family` stack, as a stylesheet reads it (`firstFamily` in
|
|
@@ -20,4 +20,10 @@ export declare const cssTrim: (text: string) => string;
|
|
|
20
20
|
* words. Undefined for anything that is not a stack.
|
|
21
21
|
*/
|
|
22
22
|
export declare function firstFamily(value: string): string | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* `platform-color(link, "?attr/colorAccent")`, as the stylesheet holds one (`platformColor` in
|
|
25
|
+
* compile.cjs): its names, which the platform resolves. Undefined for anything else, a call with
|
|
26
|
+
* no name in it included.
|
|
27
|
+
*/
|
|
28
|
+
export declare function platformColourOf(text: string): PlatformColour | undefined;
|
|
23
29
|
export declare function tokenFromValue(value: unknown): TokenValue | undefined;
|
package/dist/inline-token.js
CHANGED
|
@@ -6,13 +6,13 @@
|
|
|
6
6
|
* parser (`@ng-native/metro/css/values.cjs`). A bound one only exists here, where there is not,
|
|
7
7
|
* so this takes the shapes a binding actually holds and nothing more: a length in `px`, `%`,
|
|
8
8
|
* `rem`, `em` or a viewport unit, two to four lengths in `px`, a number, a colour as React Native
|
|
9
|
-
* writes one, a colour's three channels, a word, another token,
|
|
10
|
-
* others, `calc(var(--gap) * 2)`, `calc(10px * 2)` or a
|
|
11
|
-
* inline-derived-token.ts).
|
|
9
|
+
* writes one, a `platform-color()`, a colour's three channels, a word, another token,
|
|
10
|
+
* `var(--brand)`, and one made of others, `calc(var(--gap) * 2)`, `calc(10px * 2)` or a
|
|
11
|
+
* `color-mix()` (see inline-derived-token.ts).
|
|
12
12
|
* Anything else is kept as a word, which leaves a use site that wants a length or a colour unset,
|
|
13
13
|
* as a token of the wrong kind does.
|
|
14
14
|
*/
|
|
15
|
-
import { CSS_SPACE } from "./css.js";
|
|
15
|
+
import { CSS_SPACE, } from "./css.js";
|
|
16
16
|
import { derivedToken } from "./inline-derived-token.js";
|
|
17
17
|
import { HUE_DEGREES, isNamedColor } from "./transition.js";
|
|
18
18
|
const PX = /^(-?\d*\.?\d+)px$/;
|
|
@@ -108,7 +108,8 @@ function fromNumber(value) {
|
|
|
108
108
|
* it can take, as the build-time conversion gives, and a use site reads the one it needs.
|
|
109
109
|
*/
|
|
110
110
|
function fromWord(text) {
|
|
111
|
-
const
|
|
111
|
+
const lower = text.toLowerCase();
|
|
112
|
+
const weight = Object.hasOwn(WEIGHTS, lower) ? WEIGHTS[lower] : undefined;
|
|
112
113
|
return {
|
|
113
114
|
keyword: text,
|
|
114
115
|
...(isNamedColor(text) ? { color: text } : {}),
|
|
@@ -227,8 +228,47 @@ function withUnit(text) {
|
|
|
227
228
|
* not a colour native can draw.
|
|
228
229
|
*/
|
|
229
230
|
function withTokens(text) {
|
|
231
|
+
if (nestsTooDeep(text))
|
|
232
|
+
return { keyword: text };
|
|
230
233
|
return fromVar(text) ?? derivedToken(text) ?? { keyword: text };
|
|
231
234
|
}
|
|
235
|
+
/**
|
|
236
|
+
* How deep a value's brackets may nest for its tokens to be read. Each level is a call deeper in
|
|
237
|
+
* the reading, and in working the value out after, so a few thousand, in text from a server,
|
|
238
|
+
* would overflow the stack in the middle of a binding. A stylesheet's deepest is a handful.
|
|
239
|
+
*/
|
|
240
|
+
const MAX_NESTING = 32;
|
|
241
|
+
function nestsTooDeep(text) {
|
|
242
|
+
let depth = 0;
|
|
243
|
+
for (const char of text) {
|
|
244
|
+
if (char === '(' && ++depth > MAX_NESTING)
|
|
245
|
+
return true;
|
|
246
|
+
if (char === ')')
|
|
247
|
+
depth--;
|
|
248
|
+
}
|
|
249
|
+
return false;
|
|
250
|
+
}
|
|
251
|
+
const PLATFORM_COLOR = /^platform-color\(([\s\S]*)\)$/i;
|
|
252
|
+
/** A platform colour's name: a word, or a quoted string, as Android's `?attr/...` has to be. */
|
|
253
|
+
const PLATFORM_NAME = /^(?:'([^'\\]*)'|"([^"\\]*)"|([a-z_][\w-]*))$/i;
|
|
254
|
+
/**
|
|
255
|
+
* `platform-color(link, "?attr/colorAccent")`, as the stylesheet holds one (`platformColor` in
|
|
256
|
+
* compile.cjs): its names, which the platform resolves. Undefined for anything else, a call with
|
|
257
|
+
* no name in it included.
|
|
258
|
+
*/
|
|
259
|
+
export function platformColourOf(text) {
|
|
260
|
+
const inside = PLATFORM_COLOR.exec(text)?.[1];
|
|
261
|
+
if (inside === undefined)
|
|
262
|
+
return undefined;
|
|
263
|
+
const names = [];
|
|
264
|
+
for (const written of inside.split(',')) {
|
|
265
|
+
const name = PLATFORM_NAME.exec(cssTrim(written));
|
|
266
|
+
if (!name)
|
|
267
|
+
return undefined;
|
|
268
|
+
names.push(name[1] ?? name[2] ?? name[3]);
|
|
269
|
+
}
|
|
270
|
+
return { platformColor: names };
|
|
271
|
+
}
|
|
232
272
|
export function tokenFromValue(value) {
|
|
233
273
|
if (typeof value === 'number')
|
|
234
274
|
return fromNumber(value);
|
|
@@ -242,6 +282,9 @@ export function tokenFromValue(value) {
|
|
|
242
282
|
return measure;
|
|
243
283
|
if (NUMBER.test(text))
|
|
244
284
|
return fromNumber(Number(text));
|
|
285
|
+
const platform = platformColourOf(text);
|
|
286
|
+
if (platform)
|
|
287
|
+
return { color: platform };
|
|
245
288
|
if (DERIVED.test(text))
|
|
246
289
|
return withTokens(text);
|
|
247
290
|
if (COLOR_FUNCTION.test(text))
|