@ng-native/fabric 0.14.0 → 0.16.0
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 +47 -5
- package/dist/css.js +219 -51
- package/dist/css.js.map +1 -1
- package/dist/defer-triggers.js +2 -8
- package/dist/defer-triggers.js.map +1 -1
- package/dist/engine.d.ts +62 -17
- package/dist/engine.js +222 -51
- package/dist/engine.js.map +1 -1
- package/dist/fabric.d.ts +1 -1
- package/dist/fabric.js +25 -0
- package/dist/fabric.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/inline-derived-token.js +56 -7
- package/dist/inline-derived-token.js.map +1 -1
- package/dist/node-global.d.ts +9 -0
- package/dist/node-global.js +41 -0
- package/dist/node-global.js.map +1 -0
- package/dist/relative-colour.d.ts +2 -2
- package/dist/relative-colour.js +4 -0
- package/dist/relative-colour.js.map +1 -1
- package/package.json +1 -1
package/dist/fabric.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* fresh host function. Read each method exactly once into a plain object (this is what
|
|
4
4
|
* RN's own `FabricUIManager.js` does with its CACHED_PROPERTIES list).
|
|
5
5
|
*/
|
|
6
|
-
import type
|
|
6
|
+
import { type FabricUIManager } from './engine.ts';
|
|
7
7
|
/**
|
|
8
8
|
* Every method of `FabricUIManager`, and nothing else.
|
|
9
9
|
*
|
package/dist/fabric.js
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `global.nativeFabricUIManager` is a lazy caching proxy: every property access mints a
|
|
3
|
+
* fresh host function. Read each method exactly once into a plain object (this is what
|
|
4
|
+
* RN's own `FabricUIManager.js` does with its CACHED_PROPERTIES list).
|
|
5
|
+
*/
|
|
6
|
+
import { nativePlatform } from "./engine.js";
|
|
1
7
|
/**
|
|
2
8
|
* Every method of `FabricUIManager`, and nothing else.
|
|
3
9
|
*
|
|
@@ -40,6 +46,25 @@ export function getFabricUIManager() {
|
|
|
40
46
|
if (typeof value === 'function')
|
|
41
47
|
facade[name] = value.bind(raw);
|
|
42
48
|
}
|
|
49
|
+
// Asked for, a layout animation that is off moves nothing, and the views jump to where it ends.
|
|
50
|
+
if (!layoutAnimationsOn())
|
|
51
|
+
delete facade['configureNextLayoutAnimation'];
|
|
43
52
|
return facade;
|
|
44
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Whether native plays a layout animation on this platform. React Native turns them off on
|
|
56
|
+
* Android unless the app turns them on, and `configureNextLayoutAnimation` is there to call either
|
|
57
|
+
* way. Read from React Native's feature flags module through the two globals its own
|
|
58
|
+
* `TurboModuleRegistry` reads, so nothing of React Native is imported. Taken as on where there is
|
|
59
|
+
* no flag to read.
|
|
60
|
+
*/
|
|
61
|
+
function layoutAnimationsOn() {
|
|
62
|
+
const host = globalThis;
|
|
63
|
+
const name = 'NativeReactNativeFeatureFlagsCxx';
|
|
64
|
+
const flags = (host.__turboModuleProxy?.(name) ?? host.nativeModuleProxy?.[name]);
|
|
65
|
+
const flag = nativePlatform() === 'android'
|
|
66
|
+
? 'enableLayoutAnimationsOnAndroid'
|
|
67
|
+
: 'enableLayoutAnimationsOnIOS';
|
|
68
|
+
return flags?.[flag]?.() !== false;
|
|
69
|
+
}
|
|
45
70
|
//# sourceMappingURL=fabric.js.map
|
package/dist/fabric.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fabric.js","sourceRoot":"","sources":["../src/fabric.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fabric.js","sourceRoot":"","sources":["../src/fabric.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,cAAc,EAAwB,MAAM,aAAa,CAAC;AAEnE;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,YAAY;IACZ,0BAA0B;IAC1B,uBAAuB;IACvB,kCAAkC;IAClC,aAAa;IACb,8BAA8B;IAC9B,gBAAgB;IAChB,kBAAkB;IAClB,cAAc;IACd,sBAAsB;IACtB,kBAAkB;IAClB,iBAAiB;IACjB,iBAAiB;CACoC,CAAC;AAexD,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAAI,UAAkE;SAC5E,qBAAqB,CAAC;IAEzB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,gFAAgF;YAC9E,sDAAsD,CACzD,CAAC;IACJ,CAAC;IAED,gGAAgG;IAChG,4FAA4F;IAC5F,MAAM,MAAM,GAAqE,EAAE,CAAC;IACpF,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,OAAO,KAAK,KAAK,UAAU;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClE,CAAC;IACD,gGAAgG;IAChG,IAAI,CAAC,kBAAkB,EAAE;QAAE,OAAO,MAAM,CAAC,8BAA8B,CAAC,CAAC;IACzE,OAAO,MAAoC,CAAC;AAC9C,CAAC;AAED;;;;;;GAMG;AACH,SAAS,kBAAkB;IACzB,MAAM,IAAI,GAAG,UAGZ,CAAC;IACF,MAAM,IAAI,GAAG,kCAAkC,CAAC;IAChD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAAC,CAChB,CAAC;IACjE,MAAM,IAAI,GACR,cAAc,EAAE,KAAK,SAAS;QAC5B,CAAC,CAAC,iCAAiC;QACnC,CAAC,CAAC,6BAA6B,CAAC;IACpC,OAAO,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,KAAK,CAAC;AACrC,CAAC","sourcesContent":["/**\n * `global.nativeFabricUIManager` is a lazy caching proxy: every property access mints a\n * fresh host function. Read each method exactly once into a plain object (this is what\n * RN's own `FabricUIManager.js` does with its CACHED_PROPERTIES list).\n */\nimport { nativePlatform, type FabricUIManager } from './engine.ts';\n\n/**\n * Every method of `FabricUIManager`, and nothing else.\n *\n * A name missing here is `undefined` on device and nowhere else, because the fake the suite runs\n * against implements the interface directly - so every test passes and every device fails. That\n * is not hypothetical: `measureInWindow` was added to the interface and to the engine and left out\n * here, and the anchored overlays it was built for could never have worked.\n *\n * `AllMethodsListed` below is what makes that impossible now rather than merely tested for.\n * Exported because the facade test iterates it: there was a second copy of this list in that file,\n * which is how the two managed to be wrong in the same way at the same time.\n */\nexport const FABRIC_METHODS = [\n 'createNode',\n 'cloneNodeWithNewChildren',\n 'cloneNodeWithNewProps',\n 'cloneNodeWithNewChildrenAndProps',\n 'appendChild',\n 'configureNextLayoutAnimation',\n 'createChildSet',\n 'appendChildToSet',\n 'completeRoot',\n 'registerEventHandler',\n 'setIsJSResponder',\n 'dispatchCommand',\n 'measureInWindow',\n] as const satisfies readonly (keyof FabricUIManager)[];\n\n/**\n * A method the interface declares and the list above forgets.\n *\n * `satisfies` already checks that every name in the list is a real method. This is the other\n * direction, which is the one that bites: it resolves to `never` when the list is complete, and to\n * the missing name when it is not - so forgetting one is a compile error naming it rather than a\n * silent no-op on every phone.\n */\ntype AssertNever<T extends never> = T;\ntype AllMethodsListed = AssertNever<\n Exclude<keyof FabricUIManager, (typeof FABRIC_METHODS)[number]>\n>;\n\nexport function getFabricUIManager(): FabricUIManager {\n const raw = (globalThis as { nativeFabricUIManager?: Record<string, unknown> })\n .nativeFabricUIManager;\n\n if (!raw) {\n throw new Error(\n 'nativeFabricUIManager is not available. The New Architecture must be enabled, ' +\n 'and mount() must run inside an AppRegistry runnable.',\n );\n }\n\n // Typed with the check above, which is `never` when the list is complete and so adds nothing; a\n // check nothing refers to is an unused local to a consumer compiling with `noUnusedLocals`.\n const facade: Record<string, unknown> & { [name in AllMethodsListed]?: never } = {};\n for (const name of FABRIC_METHODS) {\n const value = raw[name];\n if (typeof value === 'function') facade[name] = value.bind(raw);\n }\n // Asked for, a layout animation that is off moves nothing, and the views jump to where it ends.\n if (!layoutAnimationsOn()) delete facade['configureNextLayoutAnimation'];\n return facade as unknown as FabricUIManager;\n}\n\n/**\n * Whether native plays a layout animation on this platform. React Native turns them off on\n * Android unless the app turns them on, and `configureNextLayoutAnimation` is there to call either\n * way. Read from React Native's feature flags module through the two globals its own\n * `TurboModuleRegistry` reads, so nothing of React Native is imported. Taken as on where there is\n * no flag to read.\n */\nfunction layoutAnimationsOn(): boolean {\n const host = globalThis as {\n __turboModuleProxy?: (name: string) => unknown;\n nativeModuleProxy?: Record<string, unknown>;\n };\n const name = 'NativeReactNativeFeatureFlagsCxx';\n const flags = (host.__turboModuleProxy?.(name) ?? host.nativeModuleProxy?.[name]) as\n Record<string, (() => boolean) | undefined> | null | undefined;\n const flag =\n nativePlatform() === 'android'\n ? 'enableLayoutAnimationsOnAndroid'\n : 'enableLayoutAnimationsOnIOS';\n return flags?.[flag]?.() !== false;\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
export { StyleResolver, matches, styleSheetOf, type AttributeTest, type Combinator, type Compound, type Conditions, type DeferredDeclaration, type GradientTemplate, type HslChannel, type MediaCondition, type NthTest, type RuleIndex, type StyleCache, type StyleRule, type StyleSheet, type StyleTarget, type TokenKind, type TokenValue, } from './css.ts';
|
|
14
14
|
export { ELEMENT_STYLES, ELEMENT_STYLES_CSS } from './element-styles.ts';
|
|
15
15
|
export { EngineIntersectionObserver, installDeferTriggers } from './defer-triggers.ts';
|
|
16
|
+
export { installNodeGlobal } from './node-global.ts';
|
|
16
17
|
export { faceName, registeredFaces } from './font-faces.ts';
|
|
17
18
|
export { firstFamily } from './inline-token.ts';
|
|
18
19
|
export { DIRECT_EVENTS, Engine, SyntheticEvent, claimHost, keepNativeView, declareNativeProps, fontsLoading, fontsRegistered, fontsSettled, markComponentHost, nativePlatform, onFontsRegistered, onFontsSettled, registerHoist, registerPlatformComponents, registerViewName, 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';
|
package/dist/index.js
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
export { StyleResolver, matches, styleSheetOf, } from "./css.js";
|
|
14
14
|
export { ELEMENT_STYLES, ELEMENT_STYLES_CSS } from "./element-styles.js";
|
|
15
15
|
export { EngineIntersectionObserver, installDeferTriggers } from "./defer-triggers.js";
|
|
16
|
+
export { installNodeGlobal } from "./node-global.js";
|
|
16
17
|
export { faceName, registeredFaces } from "./font-faces.js";
|
|
17
18
|
export { firstFamily } from "./inline-token.js";
|
|
18
19
|
export { DIRECT_EVENTS, Engine, SyntheticEvent, claimHost, keepNativeView, declareNativeProps, fontsLoading, fontsRegistered, fontsSettled, markComponentHost, nativePlatform, onFontsRegistered, onFontsSettled, registerHoist, registerPlatformComponents, registerViewName, viewNameOf, } from "./engine.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,OAAO,EACP,YAAY,GAiBb,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,QAAQ,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,aAAa,EACb,MAAM,EACN,cAAc,EACd,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,0BAA0B,EAC1B,gBAAgB,EAIhB,UAAU,GAeX,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,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 matches,\n styleSheetOf,\n type AttributeTest,\n type Combinator,\n type Compound,\n type Conditions,\n type DeferredDeclaration,\n type GradientTemplate,\n type HslChannel,\n type MediaCondition,\n type NthTest,\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 { faceName, registeredFaces } from './font-faces.ts';\nexport { firstFamily } from './inline-token.ts';\nexport {\n DIRECT_EVENTS,\n Engine,\n SyntheticEvent,\n claimHost,\n keepNativeView,\n declareNativeProps,\n fontsLoading,\n fontsRegistered,\n fontsSettled,\n markComponentHost,\n nativePlatform,\n onFontsRegistered,\n onFontsSettled,\n registerHoist,\n registerPlatformComponents,\n registerViewName,\n type PlatformViewName,\n type ViewNameOptions,\n type PostScriptNames,\n viewNameOf,\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 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"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EACL,aAAa,EACb,OAAO,EACP,YAAY,GAiBb,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,QAAQ,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,aAAa,EACb,MAAM,EACN,cAAc,EACd,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,0BAA0B,EAC1B,gBAAgB,EAIhB,UAAU,GAeX,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,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 matches,\n styleSheetOf,\n type AttributeTest,\n type Combinator,\n type Compound,\n type Conditions,\n type DeferredDeclaration,\n type GradientTemplate,\n type HslChannel,\n type MediaCondition,\n type NthTest,\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 { faceName, registeredFaces } from './font-faces.ts';\nexport { firstFamily } from './inline-token.ts';\nexport {\n DIRECT_EVENTS,\n Engine,\n SyntheticEvent,\n claimHost,\n keepNativeView,\n declareNativeProps,\n fontsLoading,\n fontsRegistered,\n fontsSettled,\n markComponentHost,\n nativePlatform,\n onFontsRegistered,\n onFontsSettled,\n registerHoist,\n registerPlatformComponents,\n registerViewName,\n type PlatformViewName,\n type ViewNameOptions,\n type PostScriptNames,\n viewNameOf,\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 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"]}
|
|
@@ -323,6 +323,8 @@ function mixColour(cursor) {
|
|
|
323
323
|
return { color: (match(cursor, WORD) ?? fail())[0] };
|
|
324
324
|
if (RELATIVE[fn] && takeWord(cursor, 'from'))
|
|
325
325
|
return relativeExpression(cursor, RELATIVE[fn]);
|
|
326
|
+
if (fn === 'color' && takeWord(cursor, 'from'))
|
|
327
|
+
return srgbExpression(cursor);
|
|
326
328
|
cursor.at = closing(cursor);
|
|
327
329
|
return functionColour(cursor.text.slice(start, cursor.at));
|
|
328
330
|
}
|
|
@@ -423,16 +425,44 @@ function relativeExpression(cursor, { space, keywords, full }) {
|
|
|
423
425
|
return { relative: { space, from, channels, ...(alpha === undefined ? {} : { alpha }) } };
|
|
424
426
|
}
|
|
425
427
|
/**
|
|
426
|
-
*
|
|
427
|
-
*
|
|
428
|
+
* The rest of `color(from <colour> srgb <channel> <channel> <channel> [/ <alpha>])` once `from` is
|
|
429
|
+
* read: what Highcharts writes for the colour a label stands out in on a colour it cannot read.
|
|
430
|
+
* Its `r g b` run from 0 to 1, as the channels it makes do: each is the same channel of `rgb()`
|
|
431
|
+
* read as a share of 255.
|
|
432
|
+
*/
|
|
433
|
+
function srgbExpression(cursor) {
|
|
434
|
+
const from = mixColour(cursor);
|
|
435
|
+
match(cursor, SPACE);
|
|
436
|
+
if (!takeWord(cursor, 'srgb'))
|
|
437
|
+
fail();
|
|
438
|
+
const names = ['r', 'g', 'b', 'alpha'];
|
|
439
|
+
const share = (channel) => typeof channel === 'string'
|
|
440
|
+
? channel === 'alpha'
|
|
441
|
+
? channel
|
|
442
|
+
: ['/', channel, 255]
|
|
443
|
+
: typeof channel === 'number'
|
|
444
|
+
? channel
|
|
445
|
+
: [channel[0], share(channel[1]), share(channel[2])];
|
|
446
|
+
const channels = [0, 1, 2].map(() => {
|
|
447
|
+
match(cursor, SPACE);
|
|
448
|
+
return ['*', share(relativeChannel(cursor, names, 1)), 255];
|
|
449
|
+
});
|
|
450
|
+
const alpha = take(cursor, '/') ? share(relativeChannel(cursor, names, 1)) : undefined;
|
|
451
|
+
expect(cursor, ')');
|
|
452
|
+
return {
|
|
453
|
+
relative: { space: 'srgb', from, channels, ...(alpha === undefined ? {} : { alpha }) },
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
/** The functions a channel is worked out with: arithmetic, and the least, the most or between. */
|
|
457
|
+
const CHANNEL_MATH = new Set(['calc', 'min', 'max', 'clamp']);
|
|
458
|
+
/**
|
|
459
|
+
* One channel: a `calc()`, `min()`, `max()` or `clamp()` of numbers and keywords, a keyword, a
|
|
460
|
+
* number, a percentage of the channel's range, or an angle for a hue.
|
|
428
461
|
*/
|
|
429
462
|
function relativeChannel(cursor, keywords, full) {
|
|
430
463
|
const fn = match(cursor, FUNCTION)?.[1]?.toLowerCase();
|
|
431
|
-
if (fn)
|
|
432
|
-
|
|
433
|
-
expect(cursor, ')');
|
|
434
|
-
return value;
|
|
435
|
-
}
|
|
464
|
+
if (fn)
|
|
465
|
+
return channelMath(cursor, fn, keywords);
|
|
436
466
|
const found = match(cursor, LITERAL);
|
|
437
467
|
if (!found)
|
|
438
468
|
return channelOperand(cursor, keywords);
|
|
@@ -462,12 +492,31 @@ function channelProduct(cursor, keywords) {
|
|
|
462
492
|
}
|
|
463
493
|
return value;
|
|
464
494
|
}
|
|
495
|
+
/** The rest of a `calc()`, `min()`, `max()` or `clamp()` of channels, once its name is read. */
|
|
496
|
+
function channelMath(cursor, fn, keywords) {
|
|
497
|
+
if (!CHANNEL_MATH.has(fn))
|
|
498
|
+
fail();
|
|
499
|
+
const sides = [channelSum(cursor, keywords)];
|
|
500
|
+
while (fn !== 'calc' && take(cursor, ','))
|
|
501
|
+
sides.push(channelSum(cursor, keywords));
|
|
502
|
+
expect(cursor, ')');
|
|
503
|
+
if (fn === 'clamp') {
|
|
504
|
+
if (sides.length !== 3)
|
|
505
|
+
fail();
|
|
506
|
+
const [least, value, most] = sides;
|
|
507
|
+
return ['max', least, ['min', value, most]];
|
|
508
|
+
}
|
|
509
|
+
return sides.reduce((a, b) => [fn, a, b]);
|
|
510
|
+
}
|
|
465
511
|
function channelFactor(cursor, keywords) {
|
|
466
512
|
if (take(cursor, '(')) {
|
|
467
513
|
const value = channelSum(cursor, keywords);
|
|
468
514
|
expect(cursor, ')');
|
|
469
515
|
return value;
|
|
470
516
|
}
|
|
517
|
+
const fn = match(cursor, FUNCTION)?.[1]?.toLowerCase();
|
|
518
|
+
if (fn)
|
|
519
|
+
return channelMath(cursor, fn, keywords);
|
|
471
520
|
const found = match(cursor, LITERAL);
|
|
472
521
|
// A percentage or an angle stands alone: inside arithmetic the keywords are numbers.
|
|
473
522
|
if (found)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inline-derived-token.js","sourceRoot":"","sources":["../src/inline-derived-token.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,UAAU,EAAiC,MAAM,gBAAgB,CAAC;AAG3E,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAiB5D,+FAA+F;AAC/F,MAAM,KAAK,GAAG,eAAe,CAAC;AAC9B,MAAM,QAAQ,GAAG,gCAAgC,CAAC;AAClD,MAAM,GAAG,GAAG,2CAA2C,CAAC;AACxD,MAAM,OAAO,GAAG,uDAAuD,CAAC;AACxE,MAAM,IAAI,GAAG,oBAAoB,CAAC;AAClC,mFAAmF;AACnF,MAAM,MAAM,GAAG,oCAAoC,CAAC;AACpD,iFAAiF;AACjF,MAAM,QAAQ,GAAqC;IACjD,EAAE,EAAE,CAAC;IACL,EAAE,EAAE,CAAC;IACL,GAAG,EAAE,EAAE;IACP,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,GAAG;IACT,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE;IAClB,IAAI,EAAE,GAAG;IACT,EAAE,EAAE,CAAC;IACL,CAAC,EAAE,IAAI;CACR,CAAC;AACF,MAAM,UAAU,GAAG,8BAA8B,CAAC;AAClD,MAAM,SAAS,GAAwB,IAAI,GAAG,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AACnF,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;AACpG,MAAM,IAAI,GAAwB,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AAClE,MAAM,MAAM,GAA4C;IACtD,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,KAAK;CACZ,CAAC;AAEF,kFAAkF;AAClF,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;AAC3D,MAAM,IAAI,GAAG,GAAU,EAAE;IACvB,MAAM,UAAU,CAAC;AACnB,CAAC,CAAC;AAEF,SAAS,KAAK,CAAC,MAAc,EAAE,OAAe;IAC5C,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,KAAK;QAAE,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IACzC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,oGAAoG;AACpG,SAAS,IAAI,CAAC,MAAc,EAAE,IAAY;IACxC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACrB,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,CAAC,EAAE,EAAE,CAAC;IACZ,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACrB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,MAAM,CAAC,MAAc,EAAE,IAAY;IAC1C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;QAAE,IAAI,EAAE,CAAC;AAClC,CAAC;AAED,iFAAiF;AACjF,SAAS,KAAK,CAAI,IAAY,EAAE,IAA2B;IACzD,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACrB,OAAO,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,KAAK,UAAU;YAAE,OAAO,SAAS,CAAC;QAC3C,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,iEAAiE;AACjE,SAAS,SAAS,CAAC,MAAc,EAAE,IAAY;IAC7C,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAClD,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpB,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC;IACxB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC;QAChE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,IAAI,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;aACrB,IAAI,IAAI,KAAK,GAAG,IAAI,KAAK,EAAE,KAAK,CAAC;YAAE,MAAM;IAChD,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACrD,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACvC,CAAC;AAED,8FAA8F;AAC9F,SAAS,aAAa,CAAC,IAAwB;IAC7C,MAAM,KAAK,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IACpE,OAAO,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AACvC,CAAC;AAED,yEAAyE;AACzE,SAAS,OAAO,CAAC,MAAc,EAAE,KAA2C;IAC1E,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;IAC/C,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,2FAA2F;AAC3F,MAAM,OAAO,GACX,CAAC,IAAoB,EAAE,EAAE,CACzB,CAAC,IAAY,EAAsB,EAAE,CACnC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAE3E,SAAS,GAAG,CAAC,MAAc,EAAE,IAAoB;IAC/C,IAAI,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAClC,KAAK,IAAI,EAAE,EAAE,CAAC,EAAE,GAAI,CAAC,GAAG,EAAE,GAAG,CAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;QAC9E,KAAK,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,OAAO,CAAC,MAAc,EAAE,IAAoB;IACnD,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACjC,KAAK,IAAI,EAAE,EAAE,CAAC,EAAE,GAAI,CAAC,GAAG,EAAE,GAAG,CAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;QAC9E,KAAK,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,MAAM,CAAC,MAAc,EAAE,IAAoB;IAClD,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACrC,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACnE,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC1F,CAAC;IACD,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,sFAAsF;IACtF,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AAC5E,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,IAAwB,EAAE,IAAoB;IAClE,IAAI,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IAC1E,CAAC;IACD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC1D,IAAI,OAAO,KAAK,EAAE,MAAM,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC;IAC3D,MAAM,GAAG,GACP,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,6CAA6C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5F,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7D,CAAC;AAED,uFAAuF;AACvF,SAAS,cAAc,CACrB,KAA6B,EAC7B,IAAoB;IAEpB,MAAM,UAAU,GACd,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,EAAE,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC;IACvF,OAAO,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,MAAO,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC;AACpE,CAAC;AAED,yFAAyF;AACzF,SAAS,IAAI,CAAC,MAAc,EAAE,EAAU,EAAE,IAAoB;IAC5D,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,IAAI,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAClC,OAAO,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAC3E,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpB,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAqB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,kGAAkG;AAClG,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,OAAO,GAAI,CAAC,QAAQ,EAAE,QAAQ,CAAW,CAAC,OAAO,CAAC,CAAC,IAAI,EAAY,EAAE;QACzE,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CACxC,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,IAAI,CAAC,CAC5D,CAAC;QACF,OAAO,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAChE,CAAC;AAKD;;;GAGG;AACH,SAAS,eAAe,CAAC,MAAc;IAKrC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;IACtF,MAAM,IAAI,GAAe,EAAE,CAAC;IAC5B,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;QAC1B,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;YAAE,MAAM,GAAG,IAAI,CAAC;aAChC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACrC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACjC,CAAC;AAED,+FAA+F;AAC/F,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,CAAU,CAAC;AAExE;;;;GAIG;AACH,SAAS,UAAU,CACjB,IAAY,EACZ,IAAgC,EAChC,MAAe;IAEf,MAAM,OAAO,GAAG,CAAC,IAAY,EAAsB,EAAE;QACnD,IAAI,IAAI,KAAK,KAAK;YAAE,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5E,IAAI,IAAI,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAC9B,IAAI,IAAI,KAAK,EAAE;YAAE,OAAO,SAAS,CAAC;QAClC,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,CAAC,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,UAAU,CAAC,GAAa,EAAE,KAAa,EAAE,MAAe;IAC/D,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAE,CAAC;IAC/B,IAAI,MAAM,IAAI,GAAG;QAAE,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IACvE,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACjG,OAAO,QAAQ,KAAK,SAAS;QAC3B,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE;QAC9B,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC;AAC7C,CAAC;AAED,mGAAmG;AACnG,SAAS,OAAO,CAAC,GAAyB;IACxC,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;QAClB,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IACnF,CAAC;IACD,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IACrD,OAAO,QAAQ,KAAK,SAAS;QAC3B,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE;QAC9B,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC;AAC7C,CAAC;AAED,0EAA0E;AAC1E,SAAS,aAAa,CACpB,QAAmB,EACnB,KAA2B,EAC3B,KAAoB;IAEpB,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC;IACxE,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/B,OAAO;QACL,cAAc,EAAE;YACd,QAAQ,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE;YACrF,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;SACrD;KACF,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,SAAS,QAAQ,CAAC,IAAyB,EAAE,MAAe;IAC1D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,IAAI,EAAE,CAAC;IACnD,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAClF,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAE,EAAE,CAAC,EAAE,CAAE,EAAE,CAAC,EAAE,CAAE,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,UAAU,EAAE,EAAE,CAAC;AACpG,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;QAC5B,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;QACxC,IAAI,QAAQ,IAAI,WAAW,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACxD,OAAO,aAAa,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,qFAAqF;AACrF,SAAS,OAAO,CAAC,MAAc;IAC7B,KAAK,IAAI,EAAE,GAAG,MAAM,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC;QAClE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,IAAI,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;aACrB,IAAI,IAAI,KAAK,GAAG,IAAI,KAAK,EAAE,KAAK,CAAC;YAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,IAAI,EAAE,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAa;IAC/D,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,IAAI,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClE,KACE,IAAI,IAAI,EACR,IAAI,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,EAC3C,IAAI,GAAG,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EACvE,CAAC;QACD,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IACD,OAAO;QACL,SAAS,EAAE,IAAI;QACf,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACtC,CAAC;AACJ,CAAC;AAED,mGAAmG;AACnG,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,KAAK,EAAE,GAAG,IAAI,KAAK,EAAE,cAAc;QAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;IACzE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,IAAI,IAAI,EAAE,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,aAAa,GAAG,CAAC,MAAc,EAAa,EAAE,CAClD,SAAS,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;AAExD;;;GAGG;AACH,SAAS,SAAS,CAAC,MAAc;IAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACrC,IAAI,IAAI;QAAE,OAAO,eAAe,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC;IACxB,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;IACvD,IAAI,EAAE,KAAK,WAAW;QAAE,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9D,IAAI,QAAQ,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAE,OAAO,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9F,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5B,OAAO,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,iGAAiG;AACjG,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACnD,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,cAAc,IAAI,IAAI,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED,+FAA+F;AAC/F,SAAS,OAAO,CAAC,MAAc;IAC7B,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACxC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACrB,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9C,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IACjC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACrB,MAAM,KAAK,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9D,MAAM,OAAO,GAAG,MAAM,IAAI,KAAK,CAAC;IAChC,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AAC9E,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,MAAc;IACnC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAC7D,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC;IACrD,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAM,CAAC,IAAI,IAAI,CAAC,MAAM;QAAE,IAAI,EAAE,CAAC;IACvE,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,GAAG,KAAK,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAAE,IAAI,EAAE,CAAC;IAChF,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1B,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpB,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1B,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpB,OAAO;QACL,GAAG,EAAE;YACH,KAAK,EAAE,KAAiB;YACxB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,CAAC,EAAE,CAAC,CAAC,MAAM;YACX,GAAG,CAAC,CAAC,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;YACpE,CAAC,EAAE,CAAC,CAAC,MAAM;YACX,GAAG,CAAC,CAAC,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;SACrE;KACF,CAAC;AACJ,CAAC;AAED,sGAAsG;AACtG,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;QAC5C,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QACjC,OAAO,KAAK,IAAI,MAAM,IAAI,UAAU,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACnE,CAAC,CAAC,CAAC;IACH,OAAO,cAAc,IAAI,EAAE,cAAc,EAAE,CAAC;AAC9C,CAAC;AASD,4FAA4F;AAC5F,MAAM,QAAQ,GAA4C;IACxD,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE;IACxE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE;IACzE,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE;IACxE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE;IACzE,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE;IACxE,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE;IACvE,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE;IACxE,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE;IACzE,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE;CAC3E,CAAC;AAEF,2FAA2F;AAC3F,SAAS,QAAQ,CAAC,MAAc,EAAE,IAAY;IAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC;IACxB,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC;QACpD,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC;IAClB,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAS,kBAAkB,CAAC,MAAc,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAiB;IAClF,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,CAAC,GAAG,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACvC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACrB,OAAO,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAE,CAAC,CAAC;IACtD,CAAC,CAAgC,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChF,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpB,OAAO,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;AAC5F,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,MAAc,EAAE,QAA2B,EAAE,IAAmB;IACvF,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;IACvD,IAAI,EAAE,EAAE,CAAC;QACP,MAAM,KAAK,GAAG,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACpE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,IAAI,CAAC,KAAK;QAAE,OAAO,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;IACpF,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACjD,CAAC;AAED,kGAAkG;AAClG,SAAS,YAAY,CAAC,IAAY,EAAE,IAAmB;IACrD,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC;IAC1D,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AACrD,CAAC;AAED,gFAAgF;AAChF,SAAS,UAAU,CAAC,MAAc,EAAE,QAA2B;IAC7D,IAAI,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7C,KAAK,IAAI,EAAE,EAAE,CAAC,EAAE,GAAI,CAAC,GAAG,EAAE,GAAG,CAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;QAC9E,KAAK,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,MAAc,EAAE,QAA2B;IACjE,IAAI,KAAK,GAAG,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC5C,KAAK,IAAI,EAAE,EAAE,CAAC,EAAE,GAAI,CAAC,GAAG,EAAE,GAAG,CAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;QAC9E,KAAK,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,MAAc,EAAE,QAA2B;IAChE,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,qFAAqF;IACrF,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,OAAO,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,cAAc,CAAC,MAAc,EAAE,QAA2B;IACjE,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACjD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC","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 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 * One channel: a `calc()` of numbers and keywords, a keyword, a number, a percentage of the\n * 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) {\n const value = fn === 'calc' ? channelSum(cursor, keywords) : fail();\n expect(cursor, ')');\n return value;\n }\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\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 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/** 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"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type Constructor = abstract new (...args: never[]) => object;
|
|
2
|
+
/**
|
|
3
|
+
* Make `target` answer `instanceof` for engine nodes as well, and for everything it did before: its
|
|
4
|
+
* own `Symbol.hasInstance` if it defines one, and the ordinary prototype walk if not. Only for
|
|
5
|
+
* `target` itself, not a subclass that inherits the check: `Text` and `Element` answer for
|
|
6
|
+
* themselves.
|
|
7
|
+
*/
|
|
8
|
+
export declare function letEngineNodesPass(target: Constructor): void;
|
|
9
|
+
export declare function installNodeGlobal(): void;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Let an engine node pass Angular's `instanceof Node` checks, whichever `Node` the app has.
|
|
3
|
+
*
|
|
4
|
+
* Angular's development build asserts that a node is a `Node` where it creates and inserts one, and
|
|
5
|
+
* the i18n runtime tests it for each node of an ICU plural or select. An engine node is not a DOM
|
|
6
|
+
* node, so the Metro preset's `animation-globals` polyfill defines a `Node` that recognises them.
|
|
7
|
+
* But a polyfill runs before `InitializeCore`, and React Native 0.8x sets up its own `Node` there,
|
|
8
|
+
* with `polyfillGlobal`, which replaces whatever is on the global. The app was left with a `Node`
|
|
9
|
+
* that no engine node is an instance of, and every plural or select threw `The provided value must
|
|
10
|
+
* be an instance of a DOM Node but got #anchor` in a development build.
|
|
11
|
+
*
|
|
12
|
+
* This runs from `mount()`, after both, and makes the `Node` that is on the global then answer for
|
|
13
|
+
* engine nodes too. Nothing else about that class changes: its own instances still pass, and so
|
|
14
|
+
* does everything its own check accepts.
|
|
15
|
+
*/
|
|
16
|
+
import { isEngineNode } from "./engine.js";
|
|
17
|
+
/**
|
|
18
|
+
* Make `target` answer `instanceof` for engine nodes as well, and for everything it did before: its
|
|
19
|
+
* own `Symbol.hasInstance` if it defines one, and the ordinary prototype walk if not. Only for
|
|
20
|
+
* `target` itself, not a subclass that inherits the check: `Text` and `Element` answer for
|
|
21
|
+
* themselves.
|
|
22
|
+
*/
|
|
23
|
+
export function letEngineNodesPass(target) {
|
|
24
|
+
const own = target[Symbol.hasInstance];
|
|
25
|
+
Object.defineProperty(target, Symbol.hasInstance, {
|
|
26
|
+
configurable: true,
|
|
27
|
+
value(value) {
|
|
28
|
+
return (this === target && isEngineNode(value)) || own.call(this, value);
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/** The classes already patched, so one `Node` is patched once however often an app is mounted. */
|
|
33
|
+
const patched = new WeakSet();
|
|
34
|
+
export function installNodeGlobal() {
|
|
35
|
+
const node = globalThis.Node;
|
|
36
|
+
if (typeof node !== 'function' || patched.has(node))
|
|
37
|
+
return;
|
|
38
|
+
patched.add(node);
|
|
39
|
+
letEngineNodesPass(node);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=node-global.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-global.js","sourceRoot":"","sources":["../src/node-global.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAmB;IACpD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE;QAChD,YAAY,EAAE,IAAI;QAClB,KAAK,CAAoB,KAAc;YACrC,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3E,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,kGAAkG;AAClG,MAAM,OAAO,GAAG,IAAI,OAAO,EAAU,CAAC;AAEtC,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAI,UAAqC,CAAC,IAAI,CAAC;IACzD,IAAI,OAAO,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO;IAC5D,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC","sourcesContent":["/**\n * Let an engine node pass Angular's `instanceof Node` checks, whichever `Node` the app has.\n *\n * Angular's development build asserts that a node is a `Node` where it creates and inserts one, and\n * the i18n runtime tests it for each node of an ICU plural or select. An engine node is not a DOM\n * node, so the Metro preset's `animation-globals` polyfill defines a `Node` that recognises them.\n * But a polyfill runs before `InitializeCore`, and React Native 0.8x sets up its own `Node` there,\n * with `polyfillGlobal`, which replaces whatever is on the global. The app was left with a `Node`\n * that no engine node is an instance of, and every plural or select threw `The provided value must\n * be an instance of a DOM Node but got #anchor` in a development build.\n *\n * This runs from `mount()`, after both, and makes the `Node` that is on the global then answer for\n * engine nodes too. Nothing else about that class changes: its own instances still pass, and so\n * does everything its own check accepts.\n */\nimport { isEngineNode } from './engine.ts';\n\nexport type Constructor = abstract new (...args: never[]) => object;\n\n/**\n * Make `target` answer `instanceof` for engine nodes as well, and for everything it did before: its\n * own `Symbol.hasInstance` if it defines one, and the ordinary prototype walk if not. Only for\n * `target` itself, not a subclass that inherits the check: `Text` and `Element` answer for\n * themselves.\n */\nexport function letEngineNodesPass(target: Constructor): void {\n const own = target[Symbol.hasInstance];\n Object.defineProperty(target, Symbol.hasInstance, {\n configurable: true,\n value(this: Constructor, value: unknown): boolean {\n return (this === target && isEngineNode(value)) || own.call(this, value);\n },\n });\n}\n\n/** The classes already patched, so one `Node` is patched once however often an app is mounted. */\nconst patched = new WeakSet<object>();\n\nexport function installNodeGlobal(): void {\n const node = (globalThis as { Node?: Constructor }).Node;\n if (typeof node !== 'function' || patched.has(node)) return;\n patched.add(node);\n letEngineNodesPass(node);\n}\n"]}
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
* the channels written make the new colour, brought back into sRGB as a mix is.
|
|
9
9
|
*/
|
|
10
10
|
import { type MixSpace } from './color-mix.ts';
|
|
11
|
-
/** A channel: a number, a keyword, or arithmetic on two channels. */
|
|
12
|
-
export type Channel = number | string | readonly [op: '+' | '-' | '*' | '/', Channel, Channel];
|
|
11
|
+
/** A channel: a number, a keyword, or arithmetic on two channels, `min()` and `max()` included. */
|
|
12
|
+
export type Channel = number | string | readonly [op: '+' | '-' | '*' | '/' | 'min' | 'max', Channel, Channel];
|
|
13
13
|
/**
|
|
14
14
|
* The colour the channels make from `origin`, as the `rgb()` or `rgba()` native reads. Undefined
|
|
15
15
|
* when the origin is not a colour this can read, such as a platform colour.
|
package/dist/relative-colour.js
CHANGED
|
@@ -66,6 +66,10 @@ function evaluate(channel, values) {
|
|
|
66
66
|
return left - right;
|
|
67
67
|
if (op === '*')
|
|
68
68
|
return left * right;
|
|
69
|
+
if (op === 'min')
|
|
70
|
+
return Math.min(left, right);
|
|
71
|
+
if (op === 'max')
|
|
72
|
+
return Math.max(left, right);
|
|
69
73
|
return left / right;
|
|
70
74
|
}
|
|
71
75
|
//# sourceMappingURL=relative-colour.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relative-colour.js","sourceRoot":"","sources":["../src/relative-colour.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,IAAI,EAAE,KAAK,EAA8B,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"relative-colour.js","sourceRoot":"","sources":["../src/relative-colour.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * A relative colour with a token in it, worked out on device: `oklch(from var(--brand) l c h /\n * 0.2)`. The compiler settles a relative colour of literals itself; one with a `var()` in it waits\n * for the token.\n *\n * The origin is converted into the function's space, each channel keyword is the number it is\n * there, on CSS Color 5's scale for it (`r g b` 0 to 255, hsl and hwb's `s l w b` 0 to 100), and\n * the channels written make the new colour, brought back into sRGB as a mix is.\n */\nimport { into, outOf, type MixSpace, type Vector } from './color-mix.ts';\nimport { parseColor } from './transition.ts';\n\n/** A channel: a number, a keyword, or arithmetic on two channels, `min()` and `max()` included. */\nexport type Channel =\n number | string | readonly [op: '+' | '-' | '*' | '/' | 'min' | 'max', Channel, Channel];\n\n/** What a keyword's number is, per unit of the space's own coordinate. */\nconst SCALES: Record<MixSpace, Vector> = {\n srgb: [255, 255, 255],\n hsl: [1, 100, 100],\n hwb: [1, 100, 100],\n lab: [1, 1, 1],\n lch: [1, 1, 1],\n oklab: [1, 1, 1],\n oklch: [1, 1, 1],\n};\n\nconst KEYWORDS: Record<MixSpace, readonly [string, string, string]> = {\n srgb: ['r', 'g', 'b'],\n hsl: ['h', 's', 'l'],\n hwb: ['h', 'w', 'b'],\n lab: ['l', 'a', 'b'],\n lch: ['l', 'c', 'h'],\n oklab: ['l', 'a', 'b'],\n oklch: ['l', 'c', 'h'],\n};\n\n/**\n * The colour the channels make from `origin`, as the `rgb()` or `rgba()` native reads. Undefined\n * when the origin is not a colour this can read, such as a platform colour.\n */\nexport function relativeColour(\n space: MixSpace,\n origin: string,\n channels: readonly [Channel, Channel, Channel],\n alpha?: Channel,\n): string | undefined {\n const parsed = parseColor(origin);\n if (!parsed) return undefined;\n const [r, g, b, originAlpha] = parsed;\n const coords = into(space, [r / 255, g / 255, b / 255]);\n const scale = SCALES[space];\n const values: Record<string, number> = { alpha: originAlpha };\n KEYWORDS[space].forEach((keyword, i) => {\n // A missing component is zero in relative syntax: a grey has no hue.\n values[keyword] = Number.isFinite(coords[i]) ? coords[i]! * scale[i]! : 0;\n });\n const made = channels.map((channel, i) => evaluate(channel, values) / scale[i]!) as Vector;\n const opacity = Math.min(\n 1,\n Math.max(0, alpha === undefined ? originAlpha : evaluate(alpha, values)),\n );\n const [red, green, blue] = outOf(space, made).map((c) => Math.round(c * 255));\n const rounded = Math.round(opacity * 1000) / 1000;\n return rounded >= 1\n ? `rgb(${red}, ${green}, ${blue})`\n : `rgba(${red}, ${green}, ${blue}, ${rounded})`;\n}\n\nfunction evaluate(channel: Channel, values: Readonly<Record<string, number>>): number {\n if (typeof channel === 'number') return channel;\n if (typeof channel === 'string') return values[channel] ?? 0;\n const [op, a, b] = channel;\n const left = evaluate(a, values);\n const right = evaluate(b, values);\n if (op === '+') return left + right;\n if (op === '-') return left - right;\n if (op === '*') return left * right;\n if (op === 'min') return Math.min(left, right);\n if (op === 'max') return Math.max(left, right);\n return left / right;\n}\n"]}
|
package/package.json
CHANGED