@ng-native/fabric 0.13.0 → 0.15.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 +63 -6
- package/dist/css.js +268 -59
- 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 +201 -21
- package/dist/engine.js +915 -125
- 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/font-faces.d.ts +19 -0
- package/dist/font-faces.js +42 -0
- package/dist/font-faces.js.map +1 -1
- package/dist/forms-inputs.d.ts +1 -1
- package/dist/forms-inputs.js +2 -2
- package/dist/forms-inputs.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +2 -1
- 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/inline-token.d.ts +4 -3
- package/dist/inline-token.js +41 -8
- package/dist/inline-token.js.map +1 -1
- package/dist/native-drive.d.ts +42 -1
- package/dist/native-drive.js +135 -9
- package/dist/native-drive.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/dist/scroll-animation.d.ts +12 -0
- package/dist/scroll-animation.js +10 -0
- package/dist/scroll-animation.js.map +1 -1
- package/dist/transition.d.ts +3 -2
- package/dist/transition.js +17 -8
- package/dist/transition.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inline-derived-token.js","sourceRoot":"","sources":["../src/inline-derived-token.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * A custom property set on an element to a value with a `var()` inside it,\n * `[style.--size]=\"'calc(var(--gap) * 2)'\"`, read into the form the same text in a stylesheet is\n * compiled to, which the cascade then works out where it is set, as it does that one\n * (`resolveAliases` in css.ts).\n *\n * The shapes are the build-time conversion's and no more (`deferCalcToken`, `deferHslToken`,\n * `deferChannelsToken` and `deferMixToken` in `@ng-native/metro/css/compile.cjs`): `calc()`,\n * `min()` or `max()` of numbers, lengths in `px` or `rem`, angles, times and `var()`, with + - * /\n * and brackets; an `hsl()` with a `var()` for a channel; `rgb()` or `hsl()` of one channels token,\n * with an alpha written or tokened; and a `color-mix()` of any of these colours, tokens and\n * colours written out. Anything else is undefined, as a stylesheet refuses it.\n */\nimport { MIX_SPACES, type HueMethod, type MixSpace } from './color-mix.ts';\nimport type { Channel } from './relative-colour.ts';\nimport type { ColourExpression, HslChannel, TokenValue } from './css.ts';\nimport { cssTrim, tokenFromValue } from './inline-token.ts';\n\ntype Marker = NonNullable<TokenValue['deferredCalc']>[number];\ntype Expression = Marker['expression'];\ntype Alpha = Extract<NonNullable<TokenValue['deferredColour']>, { channels: unknown }>['alpha'];\n\ninterface Cursor {\n readonly text: string;\n at: number;\n}\n\n/** A `var()`: the token it names, and the text of its fallback, read as its slot wants it. */\ninterface Reference {\n readonly reference: string;\n readonly fallback?: string;\n}\n\n/** CSS whitespace, and no other: a no-break space is part of a word, as it is in a browser. */\nconst SPACE = /[ \\t\\n\\r\\f]*/y;\nconst FUNCTION = /([a-z][a-z-]*)\\([ \\t\\n\\r\\f]*/iy;\nconst VAR = /var\\([ \\t\\n\\r\\f]*(--[\\w-]+)[ \\t\\n\\r\\f]*/iy;\nconst LITERAL = /([+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?)(%|[a-z]+)?/iy;\nconst WORD = /[^ \\t\\n\\r\\f,/()]+/y;\n/** A fallback that is a `var()` or arithmetic, rather than a value written out. */\nconst NESTED = /^[ \\t\\n\\r\\f]*(var|calc|min|max)\\(/i;\n/** What one of each unit counts as: points, degrees, milliseconds, or itself. */\nconst PER_UNIT: Readonly<Record<string, number>> = {\n '': 1,\n px: 1,\n rem: 16,\n deg: 1,\n grad: 0.9,\n rad: 180 / Math.PI,\n turn: 360,\n ms: 1,\n s: 1000,\n};\nconst PERCENTAGE = /([+-]?(?:\\d+\\.?\\d*|\\.\\d+))%/y;\nconst HUE_UNITS: ReadonlySet<string> = new Set(['', 'deg', 'grad', 'rad', 'turn']);\nconst HUE_METHODS: ReadonlySet<string> = new Set(['shorter', 'longer', 'increasing', 'decreasing']);\nconst MATH: ReadonlySet<string> = new Set(['calc', 'min', 'max']);\nconst SPACES: Readonly<Record<string, 'rgb' | 'hsl'>> = {\n rgb: 'rgb',\n rgba: 'rgb',\n hsl: 'hsl',\n hsla: 'hsl',\n};\n\n/** Thrown where the text stops being one of the shapes, and caught by `whole`. */\nconst UNREADABLE = new Error('not a token made of others');\nconst fail = (): never => {\n throw UNREADABLE;\n};\n\nfunction match(cursor: Cursor, pattern: RegExp): RegExpExecArray | null {\n pattern.lastIndex = cursor.at;\n const found = pattern.exec(cursor.text);\n if (found) cursor.at = pattern.lastIndex;\n return found;\n}\n\n/** Whether the next character, past any space, is `char`; taken, with the space after it, if so. */\nfunction take(cursor: Cursor, char: string): boolean {\n match(cursor, SPACE);\n if (cursor.text[cursor.at] !== char) return false;\n cursor.at++;\n match(cursor, SPACE);\n return true;\n}\n\nfunction expect(cursor: Cursor, char: string): void {\n if (!take(cursor, char)) fail();\n}\n\n/** The whole text as `read` reads it, or undefined when it is not that shape. */\nfunction whole<T>(text: string, read: (cursor: Cursor) => T): T | undefined {\n const cursor = { text, at: 0 };\n try {\n const value = read(cursor);\n match(cursor, SPACE);\n return cursor.at === text.length ? value : undefined;\n } catch (error) {\n if (error === UNREADABLE) return undefined;\n throw error;\n }\n}\n\n/** A `var()` from its name on, to the bracket that closes it. */\nfunction reference(cursor: Cursor, name: string): Reference {\n if (take(cursor, ')')) return { reference: name };\n expect(cursor, ',');\n const start = cursor.at;\n for (let depth = 0; cursor.at < cursor.text.length; cursor.at++) {\n const char = cursor.text[cursor.at];\n if (char === '(') depth++;\n else if (char === ')' && depth-- === 0) break;\n }\n const fallback = cursor.text.slice(start, cursor.at);\n expect(cursor, ')');\n return { reference: name, fallback };\n}\n\n/** A fallback's token. One that is another `var()` is refused, as the compiler refuses it. */\nfunction fallbackToken(text: string | undefined): TokenValue | undefined {\n const token = text === undefined ? undefined : tokenFromValue(text);\n return token?.alias ? fail() : token;\n}\n\n/** A number, length, angle or time, as the number its slot counts in. */\nfunction literal(cursor: Cursor, units: (unit: string) => number | undefined): number {\n const found = match(cursor, LITERAL) ?? fail();\n return Number(found[1]) * (units((found[2] ?? '').toLowerCase()) ?? fail());\n}\n\n/** A number slot takes a percentage as a fraction, which a length slot cannot work out. */\nconst unitsOf =\n (kind: Marker['kind']) =>\n (unit: string): number | undefined =>\n unit === '%' ? (kind === 'number' ? 0.01 : undefined) : PER_UNIT[unit];\n\nfunction sum(cursor: Cursor, kind: Marker['kind']): Expression {\n let value = product(cursor, kind);\n for (let op; (op = (['+', '-'] as const).find((char) => take(cursor, char)));) {\n value = [op, value, product(cursor, kind)];\n }\n return value;\n}\n\nfunction product(cursor: Cursor, kind: Marker['kind']): Expression {\n let value = factor(cursor, kind);\n for (let op; (op = (['*', '/'] as const).find((char) => take(cursor, char)));) {\n value = [op, value, factor(cursor, kind)];\n }\n return value;\n}\n\nfunction factor(cursor: Cursor, kind: Marker['kind']): Expression {\n if (take(cursor, '(')) {\n const value = sum(cursor, kind);\n expect(cursor, ')');\n return value;\n }\n const name = match(cursor, VAR)?.[1];\n if (name) {\n const value = leafFallback(reference(cursor, name).fallback, kind);\n return value === undefined ? { reference: name } : { reference: name, fallback: value };\n }\n const fn = match(cursor, FUNCTION)?.[1];\n if (fn) return math(cursor, fn, kind);\n const value = literal(cursor, unitsOf(kind));\n // A percentage, kept apart from a bare number, as `literal` in the compiler keeps it.\n return cursor.text[cursor.at - 1] === '%' ? { percentage: value } : value;\n}\n\n/**\n * A `var()` fallback in arithmetic, as its slot reads it: another `var()` or arithmetic of its\n * own, read as a tree, `var(--a, calc(var(--gap) * 2))`, as `leaf` in the compiler reads it; a\n * length in points, `rem` included as the compiler counts it; or a bare number.\n */\nfunction leafFallback(text: string | undefined, kind: Marker['kind']): Expression | undefined {\n if (text !== undefined && NESTED.test(text)) {\n return whole(cssTrim(text), (cursor) => factor(cursor, kind)) ?? fail();\n }\n const token = fallbackToken(text);\n if (kind !== 'length') return numberFallback(token, kind);\n if (typeof token?.length === 'number') return token.length;\n const rem =\n text === undefined ? undefined : /^[ \\t\\n\\r\\f]*(-?\\d*\\.?\\d+)rem[ \\t\\n\\r\\f]*$/i.exec(text);\n return rem ? Number(rem[1]) * PER_UNIT['rem']! : undefined;\n}\n\n/** A fallback where a number is wanted: a percentage kept apart from a bare number. */\nfunction numberFallback(\n token: TokenValue | undefined,\n kind: Marker['kind'],\n): Expression | undefined {\n const percentage =\n kind === 'number' && typeof token?.length === 'string' && token.number !== undefined;\n return percentage ? { percentage: token.number! } : token?.number;\n}\n\n/** The rest of a `calc()`, or of a `min()` or `max()` of sums, once its name is read. */\nfunction math(cursor: Cursor, fn: string, kind: Marker['kind']): Expression {\n const name = fn.toLowerCase();\n if (!MATH.has(name)) fail();\n const sides = [sum(cursor, kind)];\n while (name !== 'calc' && take(cursor, ',')) sides.push(sum(cursor, kind));\n expect(cursor, ')');\n return sides.reduce((a, b) => [name as 'min' | 'max', a, b]);\n}\n\n/** Arithmetic of tokens, read as a length and as a number, whichever each reading makes of it. */\nfunction calcToken(text: string): TokenValue | undefined {\n const markers = (['length', 'number'] as const).flatMap((kind): Marker[] => {\n const expression = whole(text, (cursor) =>\n math(cursor, (match(cursor, FUNCTION) ?? fail())[1]!, kind),\n );\n return expression === undefined ? [] : [{ expression, kind }];\n });\n return markers.length ? { deferredCalc: markers } : undefined;\n}\n\n/** An argument of a colour function: a `var()`, or a word read as its slot wants it. */\ntype Argument = Reference | { readonly word: string };\n\n/**\n * A colour function's arguments, with the commas and the slash between them gone, and whether\n * commas were what separated them.\n */\nfunction colourArguments(cursor: Cursor): {\n space: 'rgb' | 'hsl';\n args: Argument[];\n legacy: boolean;\n} {\n const space = SPACES[(match(cursor, FUNCTION) ?? fail())[1]!.toLowerCase()] ?? fail();\n const args: Argument[] = [];\n let legacy = false;\n while (!take(cursor, ')')) {\n if (take(cursor, ',')) legacy = true;\n else if (!take(cursor, '/')) {\n const name = match(cursor, VAR)?.[1];\n args.push(name ? reference(cursor, name) : { word: (match(cursor, WORD) ?? fail())[0] });\n }\n }\n return { space, args, legacy };\n}\n\n/** What each argument of an `hsl()` is: a hue, a saturation and a lightness, then an alpha. */\nconst HSL_SLOTS = ['hue', 'percentage', 'percentage', 'alpha'] as const;\n\n/**\n * A written `hsl()` channel as its slot reads it, as `hslLiteral` in the compiler does: a hue in\n * degrees; a saturation or a lightness as a fraction, from a percentage or, in the space syntax\n * only, a bare number of percent; an alpha as a number or a fraction.\n */\nfunction hslLiteral(\n text: string,\n slot: (typeof HSL_SLOTS)[number],\n legacy: boolean,\n): number | undefined {\n const perUnit = (unit: string): number | undefined => {\n if (slot === 'hue') return HUE_UNITS.has(unit) ? PER_UNIT[unit] : undefined;\n if (unit === '%') return 0.01;\n if (unit !== '') return undefined;\n return slot === 'alpha' ? 1 : legacy ? undefined : 0.01;\n };\n return whole(text, (cursor) => literal(cursor, perUnit));\n}\n\nfunction hslChannel(arg: Argument, index: number, legacy: boolean): HslChannel {\n const slot = HSL_SLOTS[index]!;\n if ('word' in arg) return hslLiteral(arg.word, slot, legacy) ?? fail();\n const fallback = arg.fallback === undefined ? undefined : hslLiteral(arg.fallback, slot, legacy);\n return fallback === undefined\n ? { reference: arg.reference }\n : { reference: arg.reference, fallback };\n}\n\n/** A channels colour's alpha: none, written as a number or a percentage, or a token of its own. */\nfunction alphaOf(arg: Argument | undefined): Alpha {\n if (arg === undefined) return undefined;\n if ('word' in arg) {\n return whole(arg.word, (cursor) => literal(cursor, unitsOf('number'))) ?? fail();\n }\n const fallback = fallbackToken(arg.fallback)?.number;\n return fallback === undefined\n ? { reference: arg.reference }\n : { reference: arg.reference, fallback };\n}\n\n/** `rgba(var(--channels), <alpha>)`, as `deferChannelsToken` reads it. */\nfunction channelsToken(\n channels: Reference,\n alpha: Argument | undefined,\n space: 'rgb' | 'hsl',\n): TokenValue {\n const token = fallbackToken(channels.fallback);\n const fallback = space === 'hsl' ? token?.hslChannels : token?.channels;\n const opacity = alphaOf(alpha);\n return {\n deferredColour: {\n channels: { reference: channels.reference, ...(fallback ? { fallback } : {}), space },\n ...(opacity === undefined ? {} : { alpha: opacity }),\n },\n };\n}\n\n/** `hsl(var(--h) 100% 50%)` and the like, as `deferHslToken` reads it. */\nfunction hslToken(args: readonly Argument[], legacy: boolean): TokenValue {\n if (args.length !== 3 && args.length !== 4) fail();\n const [h, s, l, alpha] = args.map((arg, index) => hslChannel(arg, index, legacy));\n const legacyFlag = legacy ? { legacy: true as const } : {};\n return { hsl: { h: h!, s: s!, l: l!, ...(alpha === undefined ? {} : { alpha }), ...legacyFlag } };\n}\n\nfunction colourToken(text: string): TokenValue | undefined {\n return whole(text, (cursor) => {\n const { space, args, legacy } = colourArguments(cursor);\n const [channels, alpha, ...rest] = args;\n if (channels && 'reference' in channels && !rest.length) {\n return channelsToken(channels, alpha, space);\n }\n return space === 'hsl' ? hslToken(args, legacy) : fail();\n });\n}\n\n/** The index just past the bracket that closes the function the cursor is inside. */\nfunction closing(cursor: Cursor): number {\n for (let at = cursor.at, depth = 0; at < cursor.text.length; at++) {\n const char = cursor.text[at];\n if (char === '(') depth++;\n else if (char === ')' && depth-- === 0) return at + 1;\n }\n return fail();\n}\n\n/**\n * A `var()` in a colour, as `reference` in the compiler's colour-expression.cjs reads it: the\n * tokens its `var()` fallbacks name, tried in turn, then a colour, or one made of other tokens.\n */\nfunction referenceColour({ reference: name, fallback }: Reference): ColourExpression {\n const alternatives: string[] = [];\n let rest = fallback === undefined ? undefined : cssTrim(fallback);\n for (\n let next;\n rest && (next = whole(rest, nextReference));\n rest = next.fallback === undefined ? undefined : cssTrim(next.fallback)\n ) {\n alternatives.push(next.reference);\n }\n return {\n reference: name,\n ...(alternatives.length ? { alternatives } : {}),\n ...(rest ? colourFallback(rest) : {}),\n };\n}\n\n/** The colour a `var()` falls back to, or one made of other tokens; refused when it is neither. */\nfunction colourFallback(text: string): { fallback: string } | { fallbackToken: TokenValue } {\n const token = tokenFromValue(text);\n if (token?.hsl || token?.deferredColour) return { fallbackToken: token };\n return { fallback: token?.color ?? fail() };\n}\n\nconst nextReference = (cursor: Cursor): Reference =>\n reference(cursor, (match(cursor, VAR) ?? fail())[1]!);\n\n/**\n * One colour in a `color-mix()`: a `var()`, another mix, an `rgb()` or `hsl()` of tokens, or a\n * colour written out, which is kept as written for the mix to read.\n */\nfunction mixColour(cursor: Cursor): ColourExpression {\n const name = match(cursor, VAR)?.[1];\n if (name) return referenceColour(reference(cursor, name));\n const start = cursor.at;\n const fn = match(cursor, FUNCTION)?.[1]?.toLowerCase();\n if (fn === 'color-mix') return mixExpression(cursor);\n if (!fn) return { color: (match(cursor, WORD) ?? fail())[0] };\n if (RELATIVE[fn] && takeWord(cursor, 'from')) return relativeExpression(cursor, RELATIVE[fn]);\n 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"]}
|
package/dist/inline-token.d.ts
CHANGED
|
@@ -4,9 +4,10 @@
|
|
|
4
4
|
*
|
|
5
5
|
* A stylesheet's custom properties are converted when the app is built, where there is a CSS
|
|
6
6
|
* parser (`@ng-native/metro/css/values.cjs`). A bound one only exists here, where there is not,
|
|
7
|
-
* so this takes the shapes a binding actually holds and nothing more: a length in `px
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* so this takes the shapes a binding actually holds and nothing more: a length in `px`, `%`,
|
|
8
|
+
* `rem`, `em` or a viewport unit, two to four lengths in `px`, a number, a colour as React Native
|
|
9
|
+
* writes one, a colour's three channels, a word, another token, `var(--brand)`, and one made of
|
|
10
|
+
* others, `calc(var(--gap) * 2)`, `calc(10px * 2)` or a `color-mix()` (see
|
|
10
11
|
* inline-derived-token.ts).
|
|
11
12
|
* Anything else is kept as a word, which leaves a use site that wants a length or a colour unset,
|
|
12
13
|
* as a token of the wrong kind does.
|
package/dist/inline-token.js
CHANGED
|
@@ -4,9 +4,10 @@
|
|
|
4
4
|
*
|
|
5
5
|
* A stylesheet's custom properties are converted when the app is built, where there is a CSS
|
|
6
6
|
* parser (`@ng-native/metro/css/values.cjs`). A bound one only exists here, where there is not,
|
|
7
|
-
* so this takes the shapes a binding actually holds and nothing more: a length in `px
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* so this takes the shapes a binding actually holds and nothing more: a length in `px`, `%`,
|
|
8
|
+
* `rem`, `em` or a viewport unit, two to four lengths in `px`, a number, a colour as React Native
|
|
9
|
+
* writes one, a colour's three channels, a word, another token, `var(--brand)`, and one made of
|
|
10
|
+
* others, `calc(var(--gap) * 2)`, `calc(10px * 2)` or a `color-mix()` (see
|
|
10
11
|
* inline-derived-token.ts).
|
|
11
12
|
* Anything else is kept as a word, which leaves a use site that wants a length or a colour unset,
|
|
12
13
|
* as a token of the wrong kind does.
|
|
@@ -16,6 +17,7 @@ import { derivedToken } from "./inline-derived-token.js";
|
|
|
16
17
|
import { HUE_DEGREES, isNamedColor } from "./transition.js";
|
|
17
18
|
const PX = /^(-?\d*\.?\d+)px$/;
|
|
18
19
|
const PERCENT = /^-?\d*\.?\d+%$/;
|
|
20
|
+
const RELATIVE = /^(-?\d*\.?\d+)(rem|em|vw|vh|vmin|vmax)$/i;
|
|
19
21
|
const NUMBER = /^-?\d*\.?\d+$/;
|
|
20
22
|
const ANGLE = /^(-?\d*\.?\d+)(deg|grad|rad|turn)$/i;
|
|
21
23
|
/** `#fff`, `rgb()`, `rgba()`, `hsl()`, `hsla()` and `hwb()`: what React Native's `processColor` reads. */
|
|
@@ -26,10 +28,10 @@ const CHANNEL = /^(-?(?:\d+\.?\d*|\.\d+))(%|deg|grad|rad|turn)?$/;
|
|
|
26
28
|
/** `var(--name)` or `var(--name, <fallback>)`, the whole value. */
|
|
27
29
|
const VAR = /^var\([ \t\n\r\f]*(--[\w-]+)[ \t\n\r\f]*(?:,([\s\S]*))?\)$/i;
|
|
28
30
|
/**
|
|
29
|
-
* A value worked out where it is set: one with a `var()` in it, a `
|
|
30
|
-
* colour, of tokens or of
|
|
31
|
+
* A value worked out where it is set: one with a `var()` in it, a `calc()`, `min()` or `max()`,
|
|
32
|
+
* a `color-mix()`, or a relative colour, of tokens or of values written out.
|
|
31
33
|
*/
|
|
32
|
-
const DERIVED = /var\(|^color-mix\(|^[a-z]+\([ \t\n\r\f]*from[ \t\n\r\f]/i;
|
|
34
|
+
const DERIVED = /var\(|^(?:calc|min|max|color-mix)\(|^[a-z]+\([ \t\n\r\f]*from[ \t\n\r\f]/i;
|
|
33
35
|
const WEIGHTS = { normal: '400', bold: '700' };
|
|
34
36
|
/**
|
|
35
37
|
* CSS whitespace at either end: a space, a tab, a newline, a carriage return or a form feed. A
|
|
@@ -93,7 +95,13 @@ function fromNumber(value) {
|
|
|
93
95
|
const weight = value >= 1 && value <= 1000
|
|
94
96
|
? { weight: String(Math.min(900, Math.max(100, Math.round(value / 100) * 100))) }
|
|
95
97
|
: {};
|
|
96
|
-
|
|
98
|
+
// And a line height, as a multiple of the font size, as the stylesheet's own reads it.
|
|
99
|
+
const lineHeight = {
|
|
100
|
+
lineHeight: { __defer: { unit: 'em', factor: value, multiple: true } },
|
|
101
|
+
};
|
|
102
|
+
return value === 0
|
|
103
|
+
? { number: 0, length: 0, ...lineHeight }
|
|
104
|
+
: { number: value, ...weight, ...lineHeight };
|
|
97
105
|
}
|
|
98
106
|
/**
|
|
99
107
|
* A word is a keyword, `row`, and may be a colour, `red`, or a weight, `bold`, as well: every form
|
|
@@ -171,6 +179,14 @@ function balanced(text) {
|
|
|
171
179
|
}
|
|
172
180
|
return depth === 0;
|
|
173
181
|
}
|
|
182
|
+
/** Two to four lengths in `px`, a padding or a margin's sides, as the stylesheet's own reads them. */
|
|
183
|
+
function fromLengths(text) {
|
|
184
|
+
const parts = text.split(/[ \t\n\r\f]+/);
|
|
185
|
+
if (parts.length < 2 || parts.length > 4)
|
|
186
|
+
return undefined;
|
|
187
|
+
const lengths = parts.map((part) => (part === '0' ? 0 : Number(PX.exec(part)?.[1] ?? NaN)));
|
|
188
|
+
return lengths.every(Number.isFinite) ? { lengths } : undefined;
|
|
189
|
+
}
|
|
174
190
|
/** A time as CSS writes one: a number of seconds or milliseconds. */
|
|
175
191
|
const TIME = /^([+-]?(?:\d+\.?\d*|\.\d+))(ms|s)$/i;
|
|
176
192
|
/** A number with a unit, as the token each is: a length, a percentage, an angle or a time. */
|
|
@@ -178,6 +194,18 @@ function withUnit(text) {
|
|
|
178
194
|
const px = PX.exec(text);
|
|
179
195
|
if (px)
|
|
180
196
|
return { length: Number(px[1]) };
|
|
197
|
+
// A `rem` is 16 points, and the others are measured where they are used, as in a stylesheet.
|
|
198
|
+
const relative = RELATIVE.exec(text);
|
|
199
|
+
if (relative) {
|
|
200
|
+
const [, factor, unit] = relative;
|
|
201
|
+
const lower = unit.toLowerCase();
|
|
202
|
+
if (lower === 'rem')
|
|
203
|
+
return { length: Number(factor) * 16 };
|
|
204
|
+
const measured = lower;
|
|
205
|
+
// The shape the stylesheet compiles one to, which `TokenValue` does not spell out.
|
|
206
|
+
const deferred = { __defer: { unit: measured, factor: Number(factor) } };
|
|
207
|
+
return { length: deferred };
|
|
208
|
+
}
|
|
181
209
|
// A percentage is a fraction as well, and an angle its degrees, as the build-time conversion
|
|
182
210
|
// reads them: an hsl() of tokens takes its saturation and its hue so.
|
|
183
211
|
if (PERCENT.test(text))
|
|
@@ -218,6 +246,11 @@ export function tokenFromValue(value) {
|
|
|
218
246
|
return withTokens(text);
|
|
219
247
|
if (COLOR_FUNCTION.test(text))
|
|
220
248
|
return { color: text };
|
|
221
|
-
|
|
249
|
+
// `0 0 0` is both, so it is kept as both, as the stylesheet's own token is.
|
|
250
|
+
const lengths = fromLengths(text);
|
|
251
|
+
const channels = fromChannels(text);
|
|
252
|
+
if (lengths)
|
|
253
|
+
return { ...channels, ...lengths };
|
|
254
|
+
return channels ?? (WORD.test(text) ? fromWord(text) : fromText(text));
|
|
222
255
|
}
|
|
223
256
|
//# sourceMappingURL=inline-token.js.map
|
package/dist/inline-token.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inline-token.js","sourceRoot":"","sources":["../src/inline-token.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * A custom property's value set on an element at run time, `[style.--tint]=\"tint()\"` or\n * `style=\"--gap: 4px\"`, as a token the cascade can read.\n *\n * A stylesheet's custom properties are converted when the app is built, where there is a CSS\n * parser (`@ng-native/metro/css/values.cjs`). A bound one only exists here, where there is not,\n * so this takes the shapes a binding actually holds and nothing more: a length in `px` or `%`, a\n * number, a colour as React Native writes one, a colour's three channels, a word, another token,\n * `var(--brand)`, and one made of others, `calc(var(--gap) * 2)` or a `color-mix()` (see\n * inline-derived-token.ts).\n * Anything else is kept as a word, which leaves a use site that wants a length or a colour unset,\n * as a token of the wrong kind does.\n */\nimport { CSS_SPACE, type TokenValue } from './css.ts';\nimport { derivedToken } from './inline-derived-token.ts';\nimport { HUE_DEGREES, isNamedColor } from './transition.ts';\n\nconst PX = /^(-?\\d*\\.?\\d+)px$/;\nconst PERCENT = /^-?\\d*\\.?\\d+%$/;\nconst NUMBER = /^-?\\d*\\.?\\d+$/;\nconst ANGLE = /^(-?\\d*\\.?\\d+)(deg|grad|rad|turn)$/i;\n/** `#fff`, `rgb()`, `rgba()`, `hsl()`, `hsla()` and `hwb()`: what React Native's `processColor` reads. */\nconst COLOR_FUNCTION = /^(#[\\da-f]{3,8}|(rgba?|hsla?|hwb)\\(.*\\))$/i;\nconst WORD = /^-?[a-z][\\w-]*$/i;\n/** One colour channel: a number, a percentage, or a hue with its unit. */\nconst CHANNEL = /^(-?(?:\\d+\\.?\\d*|\\.\\d+))(%|deg|grad|rad|turn)?$/;\n/** `var(--name)` or `var(--name, <fallback>)`, the whole value. */\nconst VAR = /^var\\([ \\t\\n\\r\\f]*(--[\\w-]+)[ \\t\\n\\r\\f]*(?:,([\\s\\S]*))?\\)$/i;\n/**\n * A value worked out where it is set: one with a `var()` in it, a `color-mix()`, or a relative\n * colour, of tokens or of colours written out.\n */\nconst DERIVED = /var\\(|^color-mix\\(|^[a-z]+\\([ \\t\\n\\r\\f]*from[ \\t\\n\\r\\f]/i;\nconst WEIGHTS: Record<string, string> = { normal: '400', bold: '700' };\n/**\n * CSS whitespace at either end: a space, a tab, a newline, a carriage return or a form feed. A\n * no-break space is part of the value, as it is in a browser, where `trim()` would drop it.\n */\nconst PADDED = new RegExp(`^${CSS_SPACE.source}|${CSS_SPACE.source}$`, 'g');\nexport const cssTrim = (text: string): string => text.replace(PADDED, '');\n/** A family name's parts: a quoted string, which may hold escapes, or a bare word. */\nconst FAMILY_PART = /^(?:'((?:[^'\\\\]|\\\\[\\s\\S])*)'|\"((?:[^\"\\\\]|\\\\[\\s\\S])*)\"|(-?[a-z_][\\w-]*))/i;\nconst LEADING_SPACE = new RegExp(`^${CSS_SPACE.source}`);\n/**\n * A CSS escape: up to six hex digits and one whitespace after them, a newline, which only joins\n * the lines either side, or any other character.\n */\nconst ESCAPE = /\\\\([\\da-f]{1,6})(?:\\r\\n|[ \\t\\n\\r\\f])?|\\\\(\\r\\n|[\\n\\r\\f])|\\\\([\\s\\S])/gi;\n\n/** A quoted string's text with its escapes decoded. One naming no character is U+FFFD. */\nconst decodeEscapes = (text: string): string =>\n text.replace(ESCAPE, (_, hex: string | undefined, newline: string | undefined, char: string) => {\n if (newline !== undefined) return '';\n if (hex === undefined) return char;\n const code = parseInt(hex, 16);\n return code && code <= 0x10ffff && (code < 0xd800 || code > 0xdfff)\n ? String.fromCodePoint(code)\n : '\\ufffd';\n });\n\n/**\n * The first family of a `font-family` stack, as a stylesheet reads it (`firstFamily` in\n * values.cjs): `'Inter Display', sans-serif` is `Inter Display`, and `Segoe UI` is one name of two\n * words. Undefined for anything that is not a stack.\n */\nexport function firstFamily(value: string): string | undefined {\n let rest = cssTrim(value);\n const words: string[] = [];\n while (rest && !rest.startsWith(',')) {\n const part = FAMILY_PART.exec(rest);\n if (!part) return undefined;\n const quoted = part[1] ?? part[2];\n words.push(quoted === undefined ? part[3]! : decodeEscapes(quoted));\n rest = rest.slice(part[0].length).replace(LEADING_SPACE, '');\n }\n return words.length ? words.join(' ') : undefined;\n}\n\n/**\n * A value kept as written, and a family too when it reads as one: `'Inter-Bold'` is the family\n * `Inter-Bold`, and a stack its first. The written word stays the keyword, so a quoted `\"none\"` is\n * still no display.\n */\nfunction fromText(text: string): TokenValue {\n const family = firstFamily(text);\n return family === undefined || family === text ? { keyword: text } : { keyword: text, family };\n}\n\n/**\n * CSS takes a bare 0 wherever it takes a length, and no other bare number. A number from 1 to 1000\n * is a weight as well, at the nearest hundred, which is every weight native draws.\n */\nfunction fromNumber(value: number): TokenValue | undefined {\n if (!Number.isFinite(value)) return undefined;\n const weight =\n value >= 1 && value <= 1000\n ? { weight: String(Math.min(900, Math.max(100, Math.round(value / 100) * 100))) }\n : {};\n return value === 0 ? { number: 0, length: 0 } : { number: value, ...weight };\n}\n\n/**\n * A word is a keyword, `row`, and may be a colour, `red`, or a weight, `bold`, as well: every form\n * it can take, as the build-time conversion gives, and a use site reads the one it needs.\n */\nfunction fromWord(text: string): TokenValue {\n const weight = WEIGHTS[text.toLowerCase()];\n return {\n keyword: text,\n ...(isNamedColor(text) ? { color: text } : {}),\n ...(weight ? { weight } : {}),\n };\n}\n\nconst clamp = (value: number, low: number, high: number) => Math.min(high, Math.max(low, value));\n\n/**\n * `13 110 253`, `13, 110, 253`, `100% 0% 0%` or `0 100% 50%`, in the forms `rgb()` and `hsl()` read\n * channels in, by the same rules the build-time conversion uses (`channelForms` in values.cjs).\n */\nfunction fromChannels(text: string): TokenValue | undefined {\n const commas = text.split(',');\n const spaced = commas.length === 1;\n const words = spaced ? text.split(CSS_SPACE) : commas.map(cssTrim);\n const parsed = words.map((word) => CHANNEL.exec(word));\n if (parsed.length !== 3 || parsed.some((match) => !match)) return undefined;\n const values = parsed.map((match) => ({ n: Number(match![1]), unit: match![2] ?? '' }));\n const channels = rgbChannels(values);\n const hslChannels = hslOf(values, spaced);\n if (!channels && !hslChannels) return undefined;\n return { ...(channels ? { channels } : {}), ...(hslChannels ? { hslChannels } : {}) };\n}\n\ninterface Channel {\n readonly n: number;\n readonly unit: string;\n}\n\n/** As `rgb()` reads them: three numbers, or three percentages of 255. */\nfunction rgbChannels(values: readonly Channel[]): number[] | undefined {\n const scale = values.every((v) => v.unit === '')\n ? 1\n : values.every((v) => v.unit === '%')\n ? 255 / 100\n : 0;\n if (!scale) return undefined;\n return values.map((v) => Math.round(clamp(v.n * scale, 0, 255) * 1000) / 1000);\n}\n\n/** As `hsl()` reads them: a hue, then two percentages, which the space syntax may write bare. */\nfunction hslOf([hue, ...rest]: readonly Channel[], spaced: boolean): number[] | undefined {\n const degrees = hue!.n * (hue!.unit === '' ? 1 : (HUE_DEGREES[hue!.unit] ?? NaN));\n const fractions = rest.map((v) =>\n v.unit === '%' || (spaced && v.unit === '') ? clamp(v.n / 100, 0, 1) : NaN,\n );\n const hsl = [degrees, ...fractions];\n return hsl.every(Number.isFinite) ? hsl : undefined;\n}\n\n/**\n * Another token, kept as an alias and resolved where it is set, as a stylesheet's `--x: var(--y)`\n * is. Undefined when the parentheses do not close where the value ends: `var(--a, 1px) var(--b)`.\n */\nfunction fromVar(text: string): TokenValue | undefined {\n const match = VAR.exec(text);\n if (!match) return undefined;\n const alias = match[1]!;\n const rest = match[2];\n if (rest === undefined) return { alias };\n if (!balanced(rest)) return undefined;\n const fallback = tokenFromValue(rest);\n return fallback ? { alias, fallback } : { alias };\n}\n\nfunction balanced(text: string): boolean {\n let depth = 0;\n for (const char of text) {\n if (char === '(') depth++;\n else if (char === ')' && --depth < 0) return false;\n }\n return depth === 0;\n}\n\n/** A time as CSS writes one: a number of seconds or milliseconds. */\nconst TIME = /^([+-]?(?:\\d+\\.?\\d*|\\.\\d+))(ms|s)$/i;\n\n/** A number with a unit, as the token each is: a length, a percentage, an angle or a time. */\nfunction withUnit(text: string): TokenValue | undefined {\n const px = PX.exec(text);\n if (px) return { length: Number(px[1]) };\n // A percentage is a fraction as well, and an angle its degrees, as the build-time conversion\n // reads them: an hsl() of tokens takes its saturation and its hue so.\n if (PERCENT.test(text)) return { length: text, number: Number(text.slice(0, -1)) / 100 };\n const angle = ANGLE.exec(text);\n if (angle) {\n const [, value, unit] = angle;\n return { angle: Number(value) * HUE_DEGREES[unit!.toLowerCase()]!, number: Number(value) };\n }\n const time = TIME.exec(text);\n // In milliseconds, as the build reads a time: what a transition or an animation takes.\n if (time) return { time: Number(time[1]) * (time[2]!.toLowerCase() === 's' ? 1000 : 1) };\n return undefined;\n}\n\n/**\n * A value with a token in it: another token, or one made of others, worked out where it is set.\n * Any other shape is a word no use site reads, as a colour function with a `var()` left in it is\n * not a colour native can draw.\n */\nfunction withTokens(text: string): TokenValue {\n return fromVar(text) ?? derivedToken(text) ?? { keyword: text };\n}\n\nexport function tokenFromValue(value: unknown): TokenValue | undefined {\n if (typeof value === 'number') return fromNumber(value);\n if (typeof value !== 'string') return undefined;\n const text = cssTrim(value);\n if (!text) return undefined;\n const measure = withUnit(text);\n if (measure) return measure;\n if (NUMBER.test(text)) return fromNumber(Number(text));\n if (DERIVED.test(text)) return withTokens(text);\n if (COLOR_FUNCTION.test(text)) return { color: text };\n return fromChannels(text) ?? (WORD.test(text) ? fromWord(text) : fromText(text));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"inline-token.js","sourceRoot":"","sources":["../src/inline-token.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * A custom property's value set on an element at run time, `[style.--tint]=\"tint()\"` or\n * `style=\"--gap: 4px\"`, as a token the cascade can read.\n *\n * A stylesheet's custom properties are converted when the app is built, where there is a CSS\n * parser (`@ng-native/metro/css/values.cjs`). A bound one only exists here, where there is not,\n * so this takes the shapes a binding actually holds and nothing more: a length in `px`, `%`,\n * `rem`, `em` or a viewport unit, two to four lengths in `px`, a number, a colour as React Native\n * writes one, a colour's three channels, a word, another token, `var(--brand)`, and one made of\n * others, `calc(var(--gap) * 2)`, `calc(10px * 2)` or a `color-mix()` (see\n * inline-derived-token.ts).\n * Anything else is kept as a word, which leaves a use site that wants a length or a colour unset,\n * as a token of the wrong kind does.\n */\nimport { CSS_SPACE, type DeferredDeclaration, type TokenValue } from './css.ts';\nimport { derivedToken } from './inline-derived-token.ts';\nimport { HUE_DEGREES, isNamedColor } from './transition.ts';\n\nconst PX = /^(-?\\d*\\.?\\d+)px$/;\nconst PERCENT = /^-?\\d*\\.?\\d+%$/;\nconst RELATIVE = /^(-?\\d*\\.?\\d+)(rem|em|vw|vh|vmin|vmax)$/i;\nconst NUMBER = /^-?\\d*\\.?\\d+$/;\nconst ANGLE = /^(-?\\d*\\.?\\d+)(deg|grad|rad|turn)$/i;\n/** `#fff`, `rgb()`, `rgba()`, `hsl()`, `hsla()` and `hwb()`: what React Native's `processColor` reads. */\nconst COLOR_FUNCTION = /^(#[\\da-f]{3,8}|(rgba?|hsla?|hwb)\\(.*\\))$/i;\nconst WORD = /^-?[a-z][\\w-]*$/i;\n/** One colour channel: a number, a percentage, or a hue with its unit. */\nconst CHANNEL = /^(-?(?:\\d+\\.?\\d*|\\.\\d+))(%|deg|grad|rad|turn)?$/;\n/** `var(--name)` or `var(--name, <fallback>)`, the whole value. */\nconst VAR = /^var\\([ \\t\\n\\r\\f]*(--[\\w-]+)[ \\t\\n\\r\\f]*(?:,([\\s\\S]*))?\\)$/i;\n/**\n * A value worked out where it is set: one with a `var()` in it, a `calc()`, `min()` or `max()`,\n * a `color-mix()`, or a relative colour, of tokens or of values written out.\n */\nconst DERIVED = /var\\(|^(?:calc|min|max|color-mix)\\(|^[a-z]+\\([ \\t\\n\\r\\f]*from[ \\t\\n\\r\\f]/i;\nconst WEIGHTS: Record<string, string> = { normal: '400', bold: '700' };\n/**\n * CSS whitespace at either end: a space, a tab, a newline, a carriage return or a form feed. A\n * no-break space is part of the value, as it is in a browser, where `trim()` would drop it.\n */\nconst PADDED = new RegExp(`^${CSS_SPACE.source}|${CSS_SPACE.source}$`, 'g');\nexport const cssTrim = (text: string): string => text.replace(PADDED, '');\n/** A family name's parts: a quoted string, which may hold escapes, or a bare word. */\nconst FAMILY_PART = /^(?:'((?:[^'\\\\]|\\\\[\\s\\S])*)'|\"((?:[^\"\\\\]|\\\\[\\s\\S])*)\"|(-?[a-z_][\\w-]*))/i;\nconst LEADING_SPACE = new RegExp(`^${CSS_SPACE.source}`);\n/**\n * A CSS escape: up to six hex digits and one whitespace after them, a newline, which only joins\n * the lines either side, or any other character.\n */\nconst ESCAPE = /\\\\([\\da-f]{1,6})(?:\\r\\n|[ \\t\\n\\r\\f])?|\\\\(\\r\\n|[\\n\\r\\f])|\\\\([\\s\\S])/gi;\n\n/** A quoted string's text with its escapes decoded. One naming no character is U+FFFD. */\nconst decodeEscapes = (text: string): string =>\n text.replace(ESCAPE, (_, hex: string | undefined, newline: string | undefined, char: string) => {\n if (newline !== undefined) return '';\n if (hex === undefined) return char;\n const code = parseInt(hex, 16);\n return code && code <= 0x10ffff && (code < 0xd800 || code > 0xdfff)\n ? String.fromCodePoint(code)\n : '\\ufffd';\n });\n\n/**\n * The first family of a `font-family` stack, as a stylesheet reads it (`firstFamily` in\n * values.cjs): `'Inter Display', sans-serif` is `Inter Display`, and `Segoe UI` is one name of two\n * words. Undefined for anything that is not a stack.\n */\nexport function firstFamily(value: string): string | undefined {\n let rest = cssTrim(value);\n const words: string[] = [];\n while (rest && !rest.startsWith(',')) {\n const part = FAMILY_PART.exec(rest);\n if (!part) return undefined;\n const quoted = part[1] ?? part[2];\n words.push(quoted === undefined ? part[3]! : decodeEscapes(quoted));\n rest = rest.slice(part[0].length).replace(LEADING_SPACE, '');\n }\n return words.length ? words.join(' ') : undefined;\n}\n\n/**\n * A value kept as written, and a family too when it reads as one: `'Inter-Bold'` is the family\n * `Inter-Bold`, and a stack its first. The written word stays the keyword, so a quoted `\"none\"` is\n * still no display.\n */\nfunction fromText(text: string): TokenValue {\n const family = firstFamily(text);\n return family === undefined || family === text ? { keyword: text } : { keyword: text, family };\n}\n\n/**\n * CSS takes a bare 0 wherever it takes a length, and no other bare number. A number from 1 to 1000\n * is a weight as well, at the nearest hundred, which is every weight native draws.\n */\nfunction fromNumber(value: number): TokenValue | undefined {\n if (!Number.isFinite(value)) return undefined;\n const weight =\n value >= 1 && value <= 1000\n ? { weight: String(Math.min(900, Math.max(100, Math.round(value / 100) * 100))) }\n : {};\n // And a line height, as a multiple of the font size, as the stylesheet's own reads it.\n const lineHeight = {\n lineHeight: { __defer: { unit: 'em' as const, factor: value, multiple: true as const } },\n };\n return value === 0\n ? { number: 0, length: 0, ...lineHeight }\n : { number: value, ...weight, ...lineHeight };\n}\n\n/**\n * A word is a keyword, `row`, and may be a colour, `red`, or a weight, `bold`, as well: every form\n * it can take, as the build-time conversion gives, and a use site reads the one it needs.\n */\nfunction fromWord(text: string): TokenValue {\n const weight = WEIGHTS[text.toLowerCase()];\n return {\n keyword: text,\n ...(isNamedColor(text) ? { color: text } : {}),\n ...(weight ? { weight } : {}),\n };\n}\n\nconst clamp = (value: number, low: number, high: number) => Math.min(high, Math.max(low, value));\n\n/**\n * `13 110 253`, `13, 110, 253`, `100% 0% 0%` or `0 100% 50%`, in the forms `rgb()` and `hsl()` read\n * channels in, by the same rules the build-time conversion uses (`channelForms` in values.cjs).\n */\nfunction fromChannels(text: string): TokenValue | undefined {\n const commas = text.split(',');\n const spaced = commas.length === 1;\n const words = spaced ? text.split(CSS_SPACE) : commas.map(cssTrim);\n const parsed = words.map((word) => CHANNEL.exec(word));\n if (parsed.length !== 3 || parsed.some((match) => !match)) return undefined;\n const values = parsed.map((match) => ({ n: Number(match![1]), unit: match![2] ?? '' }));\n const channels = rgbChannels(values);\n const hslChannels = hslOf(values, spaced);\n if (!channels && !hslChannels) return undefined;\n return { ...(channels ? { channels } : {}), ...(hslChannels ? { hslChannels } : {}) };\n}\n\ninterface Channel {\n readonly n: number;\n readonly unit: string;\n}\n\n/** As `rgb()` reads them: three numbers, or three percentages of 255. */\nfunction rgbChannels(values: readonly Channel[]): number[] | undefined {\n const scale = values.every((v) => v.unit === '')\n ? 1\n : values.every((v) => v.unit === '%')\n ? 255 / 100\n : 0;\n if (!scale) return undefined;\n return values.map((v) => Math.round(clamp(v.n * scale, 0, 255) * 1000) / 1000);\n}\n\n/** As `hsl()` reads them: a hue, then two percentages, which the space syntax may write bare. */\nfunction hslOf([hue, ...rest]: readonly Channel[], spaced: boolean): number[] | undefined {\n const degrees = hue!.n * (hue!.unit === '' ? 1 : (HUE_DEGREES[hue!.unit] ?? NaN));\n const fractions = rest.map((v) =>\n v.unit === '%' || (spaced && v.unit === '') ? clamp(v.n / 100, 0, 1) : NaN,\n );\n const hsl = [degrees, ...fractions];\n return hsl.every(Number.isFinite) ? hsl : undefined;\n}\n\n/**\n * Another token, kept as an alias and resolved where it is set, as a stylesheet's `--x: var(--y)`\n * is. Undefined when the parentheses do not close where the value ends: `var(--a, 1px) var(--b)`.\n */\nfunction fromVar(text: string): TokenValue | undefined {\n const match = VAR.exec(text);\n if (!match) return undefined;\n const alias = match[1]!;\n const rest = match[2];\n if (rest === undefined) return { alias };\n if (!balanced(rest)) return undefined;\n const fallback = tokenFromValue(rest);\n return fallback ? { alias, fallback } : { alias };\n}\n\nfunction balanced(text: string): boolean {\n let depth = 0;\n for (const char of text) {\n if (char === '(') depth++;\n else if (char === ')' && --depth < 0) return false;\n }\n return depth === 0;\n}\n\n/** Two to four lengths in `px`, a padding or a margin's sides, as the stylesheet's own reads them. */\nfunction fromLengths(text: string): TokenValue | undefined {\n const parts = text.split(/[ \\t\\n\\r\\f]+/);\n if (parts.length < 2 || parts.length > 4) return undefined;\n const lengths = parts.map((part) => (part === '0' ? 0 : Number(PX.exec(part)?.[1] ?? NaN)));\n return lengths.every(Number.isFinite) ? { lengths } : undefined;\n}\n\n/** A time as CSS writes one: a number of seconds or milliseconds. */\nconst TIME = /^([+-]?(?:\\d+\\.?\\d*|\\.\\d+))(ms|s)$/i;\n\n/** A number with a unit, as the token each is: a length, a percentage, an angle or a time. */\nfunction withUnit(text: string): TokenValue | undefined {\n const px = PX.exec(text);\n if (px) return { length: Number(px[1]) };\n // A `rem` is 16 points, and the others are measured where they are used, as in a stylesheet.\n const relative = RELATIVE.exec(text);\n if (relative) {\n const [, factor, unit] = relative;\n const lower = unit!.toLowerCase();\n if (lower === 'rem') return { length: Number(factor) * 16 };\n const measured = lower as NonNullable<DeferredDeclaration['compute']>['unit'];\n // The shape the stylesheet compiles one to, which `TokenValue` does not spell out.\n const deferred = { __defer: { unit: measured, factor: Number(factor) } };\n return { length: deferred } as unknown as TokenValue;\n }\n // A percentage is a fraction as well, and an angle its degrees, as the build-time conversion\n // reads them: an hsl() of tokens takes its saturation and its hue so.\n if (PERCENT.test(text)) return { length: text, number: Number(text.slice(0, -1)) / 100 };\n const angle = ANGLE.exec(text);\n if (angle) {\n const [, value, unit] = angle;\n return { angle: Number(value) * HUE_DEGREES[unit!.toLowerCase()]!, number: Number(value) };\n }\n const time = TIME.exec(text);\n // In milliseconds, as the build reads a time: what a transition or an animation takes.\n if (time) return { time: Number(time[1]) * (time[2]!.toLowerCase() === 's' ? 1000 : 1) };\n return undefined;\n}\n\n/**\n * A value with a token in it: another token, or one made of others, worked out where it is set.\n * Any other shape is a word no use site reads, as a colour function with a `var()` left in it is\n * not a colour native can draw.\n */\nfunction withTokens(text: string): TokenValue {\n return fromVar(text) ?? derivedToken(text) ?? { keyword: text };\n}\n\nexport function tokenFromValue(value: unknown): TokenValue | undefined {\n if (typeof value === 'number') return fromNumber(value);\n if (typeof value !== 'string') return undefined;\n const text = cssTrim(value);\n if (!text) return undefined;\n const measure = withUnit(text);\n if (measure) return measure;\n if (NUMBER.test(text)) return fromNumber(Number(text));\n if (DERIVED.test(text)) return withTokens(text);\n if (COLOR_FUNCTION.test(text)) return { color: text };\n // `0 0 0` is both, so it is kept as both, as the stylesheet's own token is.\n const lengths = fromLengths(text);\n const channels = fromChannels(text);\n if (lengths) return { ...channels, ...lengths };\n return channels ?? (WORD.test(text) ? fromWord(text) : fromText(text));\n}\n"]}
|
package/dist/native-drive.d.ts
CHANGED
|
@@ -63,12 +63,53 @@ export interface ScrollDrive {
|
|
|
63
63
|
shift(amount: number): void;
|
|
64
64
|
stop(): void;
|
|
65
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* Told of each view a graph is connected to, with the props it sets there. Once a graph has set
|
|
68
|
+
* a view's `transform` or `opacity`, React Native lets no commit change it again: iOS skips both
|
|
69
|
+
* for good (`propKeysManagedByAnimated`), and Android puts the last value set back over each
|
|
70
|
+
* commit's (`overrideBySynchronousMountPropsAtMountingAndroid`), until the view is made again.
|
|
71
|
+
*/
|
|
72
|
+
export type Touched = (view: object, viewTag: number, keys: readonly string[]) => void;
|
|
73
|
+
/**
|
|
74
|
+
* What a view is set to on native with no animation, where a graph has set it before: see
|
|
75
|
+
* `NativeScrollDriver.set`. A transform is each entry's amount: points, a factor, or an angle in
|
|
76
|
+
* radians.
|
|
77
|
+
*/
|
|
78
|
+
export interface SetValues {
|
|
79
|
+
opacity?: number;
|
|
80
|
+
transform?: readonly {
|
|
81
|
+
readonly property: string;
|
|
82
|
+
readonly value: number;
|
|
83
|
+
}[];
|
|
84
|
+
}
|
|
66
85
|
export declare class NativeScrollDriver {
|
|
67
86
|
private readonly native;
|
|
87
|
+
private readonly touched;
|
|
68
88
|
/** One value per source view and feed, by the feed's key. */
|
|
69
89
|
private readonly offsets;
|
|
70
90
|
private readonly pending;
|
|
71
|
-
|
|
91
|
+
/** The keys each graph connected to a view sets, by its props node, while it is connected. */
|
|
92
|
+
private readonly live;
|
|
93
|
+
/** The graph setting each view's values, where one does: see `set`. */
|
|
94
|
+
private readonly setters;
|
|
95
|
+
constructor(native: NativeAnimated, touched?: Touched);
|
|
96
|
+
/** The style keys a graph of this driver's playing or driving a view sets on it now. */
|
|
97
|
+
held(view: object): ReadonlySet<string>;
|
|
98
|
+
/**
|
|
99
|
+
* Set a view's values on native, where a graph that has let it go set them before and no commit
|
|
100
|
+
* can now (see `Touched`). One graph per view, connected until the view is let go or a graph
|
|
101
|
+
* that plays it is connected: a value node for each number, set where it changed.
|
|
102
|
+
*/
|
|
103
|
+
set(view: object, viewTag: number, values: SetValues): void;
|
|
104
|
+
/** Let go of a view `set` set values on: it is made again, or gone. */
|
|
105
|
+
forget(view: object): void;
|
|
106
|
+
private buildSetter;
|
|
107
|
+
/**
|
|
108
|
+
* Note a graph connected to a view, for `held`, and tell whoever asked of it. The graph that
|
|
109
|
+
* set the view's values lets go: the one that plays it sets them from here.
|
|
110
|
+
*/
|
|
111
|
+
private hold;
|
|
112
|
+
private letGo;
|
|
72
113
|
/**
|
|
73
114
|
* Move a view by a scroll. `tagOf` answers a node's view tag once it has been committed, and
|
|
74
115
|
* null before, which is why the connection may wait for a commit: `connect` is tried again by
|