@pyreon/unistyle 0.12.12 → 0.12.14
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/lib/index.js +65 -46
- package/lib/index.js.map +1 -1
- package/package.json +9 -6
- package/src/__tests__/processDescriptor.test.ts +3 -1
- package/src/__tests__/responsive.test.ts +17 -12
- package/src/__tests__/styles.test.ts +5 -2
- package/src/__tests__/unistyle.browser.test.tsx +169 -0
- package/src/responsive/optimizeTheme.ts +29 -55
- package/src/styles/styles/processDescriptor.ts +46 -10
package/lib/index.js
CHANGED
|
@@ -72,54 +72,38 @@ const normalizeTheme = ({ theme, breakpoints }) => {
|
|
|
72
72
|
|
|
73
73
|
//#endregion
|
|
74
74
|
//#region src/responsive/optimizeTheme.ts
|
|
75
|
+
const shallowEqual = (a, b) => {
|
|
76
|
+
if (a === b) return true;
|
|
77
|
+
if (!a || !b) return false;
|
|
78
|
+
const keysA = Object.keys(a);
|
|
79
|
+
const keysB = Object.keys(b);
|
|
80
|
+
if (keysA.length !== keysB.length) return false;
|
|
81
|
+
for (const key of keysA) if (a[key] !== b[key]) return false;
|
|
82
|
+
return true;
|
|
83
|
+
};
|
|
75
84
|
/**
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
* the previous breakpoint.
|
|
80
|
-
*
|
|
81
|
-
* This minimizes generated CSS — a Container with 4 breakpoints where
|
|
82
|
-
* only `maxWidth` changes emits `maxWidth` in each media query rather
|
|
83
|
-
* than the full property set.
|
|
85
|
+
* Removes breakpoints whose full-object styles are identical to the
|
|
86
|
+
* previous one. Simple all-or-nothing: if ANY property differs from
|
|
87
|
+
* the previous breakpoint, emit the ENTIRE current breakpoint.
|
|
84
88
|
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
89
|
+
* This matches the reference implementation (vitus-labs/ui-system) and
|
|
90
|
+
* the original monorepo-migration version (commit 2b7c5876). Previous
|
|
91
|
+
* "optimizations" (PRs #159, #208) that tried per-property diffing
|
|
92
|
+
* broke responsive styles in subtle ways — shorthand/longhand CSS
|
|
93
|
+
* property interactions, properties that depend on each other,
|
|
94
|
+
* properties that need to be emitted together to cascade correctly.
|
|
90
95
|
*
|
|
91
|
-
*
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
* sm: { maxWidth: '33.75rem' } // only maxWidth changed
|
|
95
|
-
* ```
|
|
96
|
+
* The all-or-nothing approach is the correct level of deduplication —
|
|
97
|
+
* we skip the breakpoint when it's entirely redundant, and let the
|
|
98
|
+
* browser's CSS cascade handle the rest.
|
|
96
99
|
*/
|
|
97
100
|
const optimizeTheme = ({ theme, breakpoints }) => {
|
|
98
101
|
const result = {};
|
|
99
102
|
for (let i = 0; i < breakpoints.length; i++) {
|
|
100
103
|
const key = breakpoints[i];
|
|
104
|
+
const previousBreakpoint = breakpoints[i - 1];
|
|
101
105
|
const current = theme[key];
|
|
102
|
-
if (!current)
|
|
103
|
-
if (i === 0) {
|
|
104
|
-
result[key] = current;
|
|
105
|
-
continue;
|
|
106
|
-
}
|
|
107
|
-
const prev = theme[breakpoints[i - 1]];
|
|
108
|
-
if (!prev) {
|
|
109
|
-
result[key] = current;
|
|
110
|
-
continue;
|
|
111
|
-
}
|
|
112
|
-
const diff = {};
|
|
113
|
-
let hasDiff = false;
|
|
114
|
-
for (const prop of Object.keys(current)) {
|
|
115
|
-
const currVal = current[prop];
|
|
116
|
-
if (currVal !== prev[prop]) {
|
|
117
|
-
diff[prop] = currVal;
|
|
118
|
-
hasDiff = true;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
if (Object.keys(current).length !== Object.keys(prev).length) result[key] = current;
|
|
122
|
-
else if (hasDiff) result[key] = diff;
|
|
106
|
+
if (current && (i === 0 || !shallowEqual(theme[previousBreakpoint], current))) result[key] = current;
|
|
123
107
|
}
|
|
124
108
|
return result;
|
|
125
109
|
};
|
|
@@ -484,29 +468,64 @@ const edge = (rootSize = 16) => (property, values) => {
|
|
|
484
468
|
//#endregion
|
|
485
469
|
//#region src/styles/styles/processDescriptor.ts
|
|
486
470
|
const toCssDecl = (css, v) => v == null ? "" : `${css}: ${v};`;
|
|
487
|
-
|
|
471
|
+
/**
|
|
472
|
+
* Converts a single property descriptor + theme values into a CSS fragment.
|
|
473
|
+
*
|
|
474
|
+
* - `simple` — pass-through (no unit conversion)
|
|
475
|
+
* - `convert` — number→rem via `calc()`
|
|
476
|
+
* - `convert_fallback` — picks first non-null from multiple theme keys, then converts
|
|
477
|
+
* - `edge` — delegates to the edge shorthand (margin, padding, inset, border-*)
|
|
478
|
+
* - `border_radius` — delegates to the border-radius shorthand
|
|
479
|
+
* - `special` — one-off logic (fullScreen, backgroundImage url wrapping, animation combo, etc.)
|
|
480
|
+
*
|
|
481
|
+
* IMPORTANT: special cases MUST return `css` tagged-template results,
|
|
482
|
+
* NOT plain strings. The caller (styles/index.ts) embeds these in another
|
|
483
|
+
* `css` template, and the interpolation chain requires template results
|
|
484
|
+
* for correct nesting of pseudo-selectors, media queries, and @layer
|
|
485
|
+
* wrapping. A previous "optimization" returned plain strings which broke
|
|
486
|
+
* responsive styles, hover states, and media-query generation.
|
|
487
|
+
*/
|
|
488
|
+
const processSpecial = (d, t, css) => {
|
|
488
489
|
switch (d.id) {
|
|
489
490
|
case "fullScreen":
|
|
490
491
|
if (!t.fullScreen) return "";
|
|
491
|
-
return
|
|
492
|
+
return css`
|
|
493
|
+
position: fixed;
|
|
494
|
+
top: 0;
|
|
495
|
+
left: 0;
|
|
496
|
+
right: 0;
|
|
497
|
+
bottom: 0;
|
|
498
|
+
`;
|
|
492
499
|
case "backgroundImage":
|
|
493
500
|
if (!t.backgroundImage) return "";
|
|
494
|
-
return `
|
|
501
|
+
return css`
|
|
502
|
+
background-image: url(${t.backgroundImage});
|
|
503
|
+
`;
|
|
495
504
|
case "animation": {
|
|
496
505
|
const parts = [t.keyframe, t.animation].filter(Boolean).join(" ");
|
|
497
506
|
return parts ? `animation: ${parts};` : "";
|
|
498
507
|
}
|
|
499
508
|
case "hideEmpty":
|
|
500
509
|
if (!t.hideEmpty) return "";
|
|
501
|
-
return
|
|
510
|
+
return css`
|
|
511
|
+
&:empty {
|
|
512
|
+
display: none;
|
|
513
|
+
}
|
|
514
|
+
`;
|
|
502
515
|
case "clearFix":
|
|
503
516
|
if (!t.clearFix) return "";
|
|
504
|
-
return
|
|
517
|
+
return css`
|
|
518
|
+
&::after {
|
|
519
|
+
clear: both;
|
|
520
|
+
content: '';
|
|
521
|
+
display: table;
|
|
522
|
+
}
|
|
523
|
+
`;
|
|
505
524
|
case "extendCss": return t.extendCss ?? "";
|
|
506
525
|
default: return "";
|
|
507
526
|
}
|
|
508
527
|
};
|
|
509
|
-
const processDescriptor = (d, t,
|
|
528
|
+
const processDescriptor = (d, t, css, calc, shorthand, borderRadiusFn) => {
|
|
510
529
|
switch (d.kind) {
|
|
511
530
|
case "simple": return toCssDecl(d.css, t[d.key]);
|
|
512
531
|
case "convert": return toCssDecl(d.css, calc(t[d.key]));
|
|
@@ -531,7 +550,7 @@ const processDescriptor = (d, t, _css, calc, shorthand, borderRadiusFn) => {
|
|
|
531
550
|
bottomLeft: t[d.keys.bottomLeft],
|
|
532
551
|
bottomRight: t[d.keys.bottomRight]
|
|
533
552
|
}) ?? "";
|
|
534
|
-
case "special": return processSpecial(d, t);
|
|
553
|
+
case "special": return processSpecial(d, t, css);
|
|
535
554
|
}
|
|
536
555
|
};
|
|
537
556
|
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["CoreProvider","isValidValue","hasAnyValue","formatShorthand","formatIndividual"],"sources":["../src/responsive/breakpoints.ts","../src/responsive/createMediaQueries.ts","../src/responsive/normalizeTheme.ts","../src/responsive/optimizeTheme.ts","../src/responsive/transformTheme.ts","../src/responsive/makeItResponsive.ts","../src/responsive/sortBreakpoints.ts","../src/enrichTheme.ts","../src/context.tsx","../src/styles/alignContent.ts","../src/styles/extendCss.ts","../src/units/stripUnit.ts","../src/units/value.ts","../src/units/values.ts","../src/styles/shorthands/borderRadius.ts","../src/styles/shorthands/edge.ts","../src/styles/styles/processDescriptor.ts","../src/styles/styles/propertyMap.ts","../src/styles/styles/index.ts"],"sourcesContent":["const breakpoints = {\n rootSize: 16,\n breakpoints: {\n xs: 0,\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1440,\n },\n} as const\n\nexport type Breakpoints = typeof breakpoints\n\nexport default breakpoints\n","type Css = (strings: TemplateStringsArray, ...values: any[]) => any\n\nexport type CreateMediaQueries = <\n B extends Record<string, number>,\n R extends number,\n C extends Css,\n>(props: {\n breakpoints: B\n rootSize: R\n css: C\n}) => Record<keyof B, (...args: any[]) => string>\n\n// Implementation uses Record<string, ...> which is widened from Record<keyof B, ...>;\n// the generic constraint on CreateMediaQueries ensures callers get the narrower type.\nconst createMediaQueries: CreateMediaQueries = ((props: {\n breakpoints: Record<string, number>\n rootSize: number\n css: Css\n}) => {\n const { breakpoints, rootSize, css } = props\n\n return Object.keys(breakpoints).reduce<\n Record<string, (...args: [TemplateStringsArray, ...any[]]) => string>\n >((acc, key) => {\n const breakpointValue = breakpoints[key]\n\n if (breakpointValue === 0) {\n acc[key] = (...args: [TemplateStringsArray, ...any[]]) => css(...args)\n } else if (breakpointValue != null) {\n const emSize = breakpointValue / rootSize\n\n acc[key] = (...args: [TemplateStringsArray, ...any[]]) => css`\n @media only screen and (min-width: ${emSize}em) {\n ${css(...args)};\n }\n `\n }\n\n return acc\n }, {})\n}) as CreateMediaQueries\n\nexport default createMediaQueries\n","type AssignToBreakpointKey = (\n breakpoints: string[],\n) => (\n valueFn: (breakpoint: string, i: number, bps: string[], result: Record<string, unknown>) => void,\n) => Record<string, unknown>\n\nconst assignToBreakpointKey: AssignToBreakpointKey = (breakpoints) => (valueFn) => {\n const result: Record<string, unknown> = {}\n breakpoints.forEach((item, i) => {\n result[item] = valueFn(item, i, breakpoints, result)\n })\n return result\n}\n\nconst handleArrayCb = (arr: (string | number)[]) => (_: unknown, i: number) => {\n const currentValue = arr[i]\n const lastValue = arr[arr.length - 1]\n return currentValue ?? lastValue\n}\n\nconst handleObjectCb =\n (obj: Record<string, unknown>) =>\n (bp: string, i: number, bps: string[], res: Record<string, unknown>) => {\n const currentValue = obj[bp]\n const prevBp = bps[i - 1]\n const previousValue = prevBp != null ? res[prevBp] : undefined\n if (currentValue != null) return currentValue\n return previousValue\n }\n\nconst handleValueCb = (value: unknown) => () => value\n\nconst shouldNormalize = (props: Record<string, any>) =>\n Object.values(props).some((item) => typeof item === 'object' || Array.isArray(item))\n\nexport type NormalizeTheme = ({\n theme,\n breakpoints,\n}: {\n theme: Record<string, unknown>\n breakpoints: string[]\n}) => Record<string, unknown>\n\nconst normalizeTheme: NormalizeTheme = ({ theme, breakpoints }) => {\n if (!shouldNormalize(theme)) return theme\n\n const getBpValues = assignToBreakpointKey(breakpoints)\n const result: Record<string, unknown> = {}\n\n Object.entries(theme).forEach(([key, value]) => {\n if (value == null) return\n\n if (Array.isArray(value)) {\n result[key] = getBpValues(handleArrayCb(value as (string | number)[]))\n } else if (typeof value === 'object') {\n result[key] = getBpValues(handleObjectCb(value as Record<string, any>))\n } else {\n result[key] = getBpValues(handleValueCb(value))\n }\n })\n\n return result\n}\n\nexport default normalizeTheme\n","export type OptimizeTheme = ({\n theme,\n breakpoints,\n}: {\n theme: Record<string, Record<string, unknown>>\n breakpoints: string[]\n}) => Record<string, Record<string, unknown>>\n\n/**\n * Optimizes responsive theme by emitting only CHANGED properties per\n * breakpoint. The first breakpoint always gets the full property set.\n * Higher breakpoints only include properties whose values differ from\n * the previous breakpoint.\n *\n * This minimizes generated CSS — a Container with 4 breakpoints where\n * only `maxWidth` changes emits `maxWidth` in each media query rather\n * than the full property set.\n *\n * Input:\n * ```\n * xs: { maxWidth: '90%', height: '100%' }\n * sm: { maxWidth: '33.75rem', height: '100%' }\n * ```\n *\n * Output:\n * ```\n * xs: { maxWidth: '90%', height: '100%' } // full (first breakpoint)\n * sm: { maxWidth: '33.75rem' } // only maxWidth changed\n * ```\n */\nconst optimizeTheme: OptimizeTheme = ({ theme, breakpoints }) => {\n const result: Record<string, Record<string, unknown>> = {}\n\n for (let i = 0; i < breakpoints.length; i++) {\n const key = breakpoints[i] as string\n const current = theme[key]\n if (!current) continue\n\n if (i === 0) {\n // First breakpoint: emit all properties (baseline)\n result[key] = current\n continue\n }\n\n // Higher breakpoints: only emit properties that changed from previous.\n const prev = theme[breakpoints[i - 1] as string]\n if (!prev) {\n // No previous breakpoint data — emit all\n result[key] = current\n continue\n }\n\n const diff: Record<string, unknown> = {}\n let hasDiff = false\n\n for (const prop of Object.keys(current)) {\n const currVal = current[prop]\n const prevVal = prev[prop]\n\n if (currVal !== prevVal) {\n diff[prop] = currVal\n hasDiff = true\n }\n }\n\n // Also check for properties that were in previous but removed in current\n // (key count difference means something was added or removed)\n if (Object.keys(current).length !== Object.keys(prev).length) {\n // Different number of keys — emit the full current set since\n // properties may have been added or removed\n result[key] = current\n } else if (hasDiff) {\n result[key] = diff\n }\n // else: identical to previous — skip (no media query needed)\n }\n\n return result\n}\n\nexport default optimizeTheme\n","import { isEmpty, set } from '@pyreon/ui-core'\n\nconst removeUnexpectedKeys = (obj: Record<string, unknown>, keys: string[]) => {\n const result: Record<string, unknown> = {}\n keys.forEach((bp) => {\n const value = obj[bp]\n if (value) {\n result[bp] = value\n }\n })\n return result\n}\n\nexport type TransformTheme = ({\n theme,\n breakpoints,\n}: {\n theme: Record<string, unknown>\n breakpoints: string[]\n}) => any\n\nconst transformTheme: TransformTheme = ({ theme, breakpoints }) => {\n const result = {}\n\n if (isEmpty(theme) || isEmpty(breakpoints)) return result\n\n Object.entries(theme).forEach(([key, value]) => {\n if (Array.isArray(value) && value.length > 0) {\n value.forEach((child, i) => {\n const indexBreakpoint = breakpoints[i]\n if (indexBreakpoint == null) return\n set(result, [indexBreakpoint, key], child)\n })\n } else if (typeof value === 'object' && value !== null) {\n Object.entries(value).forEach(([childKey, childValue]) => {\n set(result, [childKey, key], childValue)\n })\n } else if (value != null) {\n const firstBreakpoint = breakpoints[0]\n if (firstBreakpoint == null) return\n set(result, [firstBreakpoint, key], value)\n }\n })\n\n return removeUnexpectedKeys(result, breakpoints)\n}\n\nexport default transformTheme\n","import { isEmpty } from '@pyreon/ui-core'\nimport type createMediaQueries from './createMediaQueries'\nimport normalizeTheme from './normalizeTheme'\nimport optimizeTheme from './optimizeTheme'\nimport type sortBreakpoints from './sortBreakpoints'\nimport transformTheme from './transformTheme'\n\ntype Css = (strings: TemplateStringsArray, ...values: any[]) => any\n\ntype CustomTheme = Record<string, unknown>\n\ntype Theme = Partial<{\n rootSize: number\n breakpoints: Record<string, number>\n __PYREON__: Partial<{\n media: ReturnType<typeof createMediaQueries>\n sortedBreakpoints: ReturnType<typeof sortBreakpoints>\n }>\n}> &\n CustomTheme\n\nexport type MakeItResponsiveStyles<T extends Partial<Record<string, any>> = any> = ({\n theme,\n css,\n rootSize,\n globalTheme,\n}: {\n theme: T\n css: Css\n rootSize?: number | undefined\n globalTheme?: Record<string, any> | undefined\n}) => ReturnType<typeof css> | string | any\n\nexport type MakeItResponsive = ({\n theme,\n key,\n css,\n styles,\n normalize,\n}: {\n theme?: CustomTheme\n key?: string\n css: any\n styles: MakeItResponsiveStyles\n normalize?: boolean\n}) => (props: { theme?: Theme; [prop: string]: any }) => any\n\nconst themeCache = new WeakMap<\n object,\n { breakpoints: unknown; optimized: Record<string, Record<string, unknown>> }\n>()\n\nconst makeItResponsive: MakeItResponsive =\n ({ theme: customTheme, key = '', css, styles, normalize = true }) =>\n ({ theme = {}, ...props }) => {\n const internalTheme = customTheme || props[key]\n\n if (isEmpty(internalTheme)) return ''\n\n const { rootSize, breakpoints, __PYREON__, ...restTheme } = theme as Theme\n\n const renderStyles = (styleTheme: Record<string, unknown>): ReturnType<typeof styles> =>\n styles({ theme: styleTheme, css, rootSize, globalTheme: restTheme })\n\n if (isEmpty(breakpoints) || isEmpty(__PYREON__)) {\n return css`\n ${renderStyles(internalTheme)}\n `\n }\n\n // isEmpty guard above ensures __PYREON__ is defined here\n const { media, sortedBreakpoints } = __PYREON__ as NonNullable<typeof __PYREON__>\n\n let optimizedTheme: Record<string, Record<string, unknown>>\n\n const cached = themeCache.get(internalTheme)\n if (cached && cached.breakpoints === sortedBreakpoints) {\n optimizedTheme = cached.optimized\n } else {\n let helperTheme = internalTheme\n\n if (normalize) {\n helperTheme = normalizeTheme({\n theme: internalTheme,\n breakpoints: sortedBreakpoints,\n })\n }\n\n const transformedTheme = transformTheme({\n theme: helperTheme,\n breakpoints: sortedBreakpoints,\n })\n\n optimizedTheme = optimizeTheme({\n theme: transformedTheme,\n breakpoints: sortedBreakpoints,\n })\n\n themeCache.set(internalTheme, {\n breakpoints: sortedBreakpoints,\n optimized: optimizedTheme,\n })\n }\n\n return sortedBreakpoints.map((item: string) => {\n const breakpointTheme = optimizedTheme[item]\n\n if (!breakpointTheme || !media) return ''\n\n const result = renderStyles(breakpointTheme)\n\n return (media as Record<string, any>)[item]`\n ${result};\n `\n })\n }\n\nexport default makeItResponsive\n","export type SortBreakpoints = <T extends Record<string, number>>(breakpoints: T) => (keyof T)[]\n\nconst sortBreakpoints: SortBreakpoints = (breakpoints) => {\n const result = Object.keys(breakpoints).sort(\n (a, b) => (breakpoints[a] ?? 0) - (breakpoints[b] ?? 0),\n )\n return result\n}\n\nexport default sortBreakpoints\n","import { config, isEmpty } from '@pyreon/ui-core'\nimport { createMediaQueries, sortBreakpoints } from './responsive'\n\nexport type PyreonTheme = {\n rootSize?: number\n breakpoints?: Record<string, number>\n __PYREON__?: {\n sortedBreakpoints: string[] | undefined\n media: Record<string, (...args: any[]) => any> | undefined\n }\n} & Record<string, unknown>\n\n/**\n * Enrich a theme with pre-computed responsive utilities.\n * Adds sorted breakpoints and media-query tagged-template helpers\n * to `theme.__PYREON__` for consumption by `makeItResponsive`.\n *\n * This is a pure function — safe to call outside of component context.\n *\n * @example\n * const enriched = enrichTheme({ rootSize: 16, breakpoints: { xs: 0, sm: 576, md: 768 } })\n * enriched.__PYREON__.sortedBreakpoints // ['xs', 'sm', 'md']\n * enriched.__PYREON__.media.sm // tagged-template for @media (min-width: 36em)\n */\nexport function enrichTheme<T extends PyreonTheme>(\n theme: T,\n): T & Required<Pick<PyreonTheme, '__PYREON__'>> {\n const { breakpoints, rootSize = 16 } = theme\n\n const sortedBreakpoints =\n breakpoints && !isEmpty(breakpoints) ? sortBreakpoints(breakpoints) : undefined\n\n const media =\n breakpoints && !isEmpty(breakpoints)\n ? createMediaQueries({ breakpoints, css: config.css, rootSize })\n : undefined\n\n return {\n ...theme,\n __PYREON__: { sortedBreakpoints, media },\n }\n}\n","import type { VNode } from '@pyreon/core'\nimport { provide } from '@pyreon/core'\nimport { ThemeContext } from '@pyreon/styler'\nimport { Provider as CoreProvider, context } from '@pyreon/ui-core'\nimport type { PyreonTheme } from './enrichTheme'\nimport { enrichTheme } from './enrichTheme'\n\nexport type TProvider = {\n theme: PyreonTheme\n children?: VNode | null\n}\n\n/**\n * @internal Low-level provider — use `PyreonUI` from `@pyreon/ui-core` instead.\n *\n * Unistyle Provider — wraps the core Provider and enriches the theme\n * with pre-computed sorted breakpoints and media-query tagged-template\n * helpers consumed by `makeItResponsive`.\n *\n * @deprecated Prefer `<PyreonUI theme={theme} mode=\"light\">` which handles\n * all three context layers (styler, core, mode) in one component.\n */\nfunction Provider(props: TProvider): VNode | null {\n const { theme, children } = props\n\n const enrichedTheme = enrichTheme(theme)\n\n // Provide enriched theme to both the ui-core context (for rocketstyle/elements)\n // AND the styler ThemeContext (for styled() components and makeItResponsive).\n // Without this, styled() components receive an empty theme and all responsive\n // styles are skipped (@media queries produce NaN values).\n provide(ThemeContext, enrichedTheme)\n\n return CoreProvider({ theme: enrichedTheme, children }) as VNode | null\n}\n\nexport { context }\n\nexport default Provider\n","import { isEmpty } from '@pyreon/ui-core'\n\nexport type AlignContentDirectionKeys = keyof typeof ALIGN_CONTENT_DIRECTION\nexport type AlignContentAlignXKeys = keyof typeof ALIGN_CONTENT_MAP_X\nexport type AlignContentAlignYKeys = keyof typeof ALIGN_CONTENT_MAP_Y\n\nconst ALIGN_CONTENT_MAP_SHARED = {\n center: 'center',\n spaceBetween: 'space-between',\n spaceAround: 'space-around',\n block: 'stretch',\n}\n\nexport const ALIGN_CONTENT_MAP_X = {\n left: 'flex-start',\n right: 'flex-end',\n ...ALIGN_CONTENT_MAP_SHARED,\n} as const\n\nexport const ALIGN_CONTENT_MAP_Y = {\n top: 'flex-start',\n bottom: 'flex-end',\n ...ALIGN_CONTENT_MAP_SHARED,\n} as const\n\nexport const ALIGN_CONTENT_DIRECTION = {\n inline: 'row',\n reverseInline: 'row-reverse',\n rows: 'column',\n reverseRows: 'column-reverse',\n} as const\n\nexport type AlignContent = ({\n direction,\n alignX,\n alignY,\n}: {\n direction: AlignContentDirectionKeys\n alignX: AlignContentAlignXKeys\n alignY: AlignContentAlignYKeys\n}) => string | null\n\nconst alignContent: AlignContent = (attrs) => {\n const { direction, alignX, alignY } = attrs\n\n if (isEmpty(attrs) || !direction || !alignX || !alignY) {\n return null\n }\n\n const isReverted = ['inline', 'reverseInline'].includes(direction)\n const dir = ALIGN_CONTENT_DIRECTION[direction]\n const x = ALIGN_CONTENT_MAP_X[alignX]\n const y = ALIGN_CONTENT_MAP_Y[alignY]\n\n return `flex-direction: ${dir}; align-items: ${isReverted ? y : x}; justify-content: ${isReverted ? x : y};`\n}\n\nexport default alignContent\n","export type ExtendCss = (\n styles:\n | ((css: (strings: TemplateStringsArray, ...values: any[]) => string) => string)\n | string\n | null\n | undefined,\n) => string\n\nconst simpleCss = (strings: TemplateStringsArray, ...values: any[]): string => {\n let result = ''\n for (let i = 0; i < strings.length; i++) {\n result += strings[i]\n if (i < values.length) result += String(values[i] ?? '')\n }\n return result\n}\n\nconst extendCss: ExtendCss = (styles) => {\n if (!styles) return ''\n if (typeof styles === 'function') {\n return styles(simpleCss)\n }\n return styles\n}\n\nexport default extendCss\n","type Value<V> = V extends string ? number : V\ntype Unit<V> = V extends string ? string : undefined\n\nexport type StripUnit = <V extends string | number, UR extends boolean = false>(\n value: V,\n unitReturn?: UR,\n) => UR extends true ? [Value<V>, Unit<V>] : Value<V>\n\nconst stripUnit = ((value: string | number, unitReturn?: boolean) => {\n const cssRegex = /^([+-]?(?:\\d+|\\d*\\.\\d+))([a-z]*|%)$/\n\n if (typeof value !== 'string') return unitReturn ? [value, undefined] : value\n\n const matchedValue = value.match(cssRegex)\n\n if (unitReturn) {\n if (matchedValue) return [parseFloat(value), matchedValue[2]]\n return [value, undefined]\n }\n\n if (matchedValue) return parseFloat(value)\n return value\n}) as StripUnit\n\nexport default stripUnit\n","import stripUnit from './stripUnit'\n\ntype CssUnits =\n | 'px'\n | 'rem'\n | '%'\n | 'em'\n | 'ex'\n | 'cm'\n | 'mm'\n | 'in'\n | 'pt'\n | 'pc'\n | 'ch'\n | 'vh'\n | 'vw'\n | 'vmin'\n | 'vmax'\n\nconst isNotValue = (val: unknown) => !val && val !== 0\n\nexport type Value = (\n param: string | number | null | undefined,\n rootSize?: number,\n outputUnit?: CssUnits,\n) => string | number | null\n\nconst value: Value = (param, rootSize = 16, outputUnit = 'rem'): string | number | null => {\n if (isNotValue(param)) return null\n\n // After the guard above, param is guaranteed to be string | number (non-null)\n const p = param as string | number\n\n const [val, unit] = stripUnit(p as string, true)\n if (isNotValue(val)) return null\n if (val === 0 || typeof val === 'string') return p\n\n const canConvert = rootSize && !Number.isNaN(val)\n if (canConvert && !unit && outputUnit === 'px') return `${val}${outputUnit}`\n if (canConvert && !unit) return `${val / rootSize}rem`\n if (canConvert && unit === 'px' && outputUnit === 'rem') return `${val / rootSize}rem`\n if (unit) return p\n\n return `${val}${outputUnit}`\n}\n\nexport default value\n","import value from './value'\n\ntype CssUnits =\n | 'px'\n | 'rem'\n | '%'\n | 'em'\n | 'ex'\n | 'cm'\n | 'mm'\n | 'in'\n | 'pt'\n | 'pc'\n | 'ch'\n | 'vh'\n | 'vw'\n | 'vmin'\n | 'vmax'\n\ntype GetValueOf = (...args: unknown[]) => number | string\nconst getValueOf: GetValueOf = (...args: any[]) =>\n args.find((v) => typeof v !== 'undefined' && v !== null)\n\nexport type Values = (\n items: unknown[],\n rootSize?: number,\n outputUnit?: CssUnits,\n) => string | number | null\n\nconst values: Values = (items, rootSize, outputUnit) => {\n const param = getValueOf(...items)\n\n if (Array.isArray(param)) {\n return param.map((item) => value(item, rootSize, outputUnit)).join(' ')\n }\n\n return value(param, rootSize, outputUnit)\n}\n\nexport default values\n","import { value } from '../../units'\n\ntype PropertyValue = string | number | null | undefined\ntype PV = PropertyValue\n\nconst isValidValue = (v: unknown) => !!v || v === 0\n\ntype CornerValues = {\n full: PV\n top: PV\n bottom: PV\n left: PV\n right: PV\n topLeft: PV\n topRight: PV\n bottomLeft: PV\n bottomRight: PV\n}\n\nconst hasAnyValue = (v: CornerValues) =>\n isValidValue(v.full) ||\n isValidValue(v.top) ||\n isValidValue(v.bottom) ||\n isValidValue(v.left) ||\n isValidValue(v.right) ||\n isValidValue(v.topLeft) ||\n isValidValue(v.topRight) ||\n isValidValue(v.bottomLeft) ||\n isValidValue(v.bottomRight)\n\nconst resolveCorners = (v: CornerValues) => {\n const corners: PV[] = [v.full, v.full, v.full, v.full]\n if (isValidValue(v.top)) {\n corners[0] = v.top\n corners[1] = v.top\n }\n if (isValidValue(v.bottom)) {\n corners[2] = v.bottom\n corners[3] = v.bottom\n }\n if (isValidValue(v.left)) {\n corners[0] = v.left\n corners[3] = v.left\n }\n if (isValidValue(v.right)) {\n corners[1] = v.right\n corners[2] = v.right\n }\n if (isValidValue(v.topLeft)) corners[0] = v.topLeft\n if (isValidValue(v.topRight)) corners[1] = v.topRight\n if (isValidValue(v.bottomRight)) corners[2] = v.bottomRight\n if (isValidValue(v.bottomLeft)) corners[3] = v.bottomLeft\n return corners\n}\n\nconst formatShorthand = (corners: PV[], calc: (p: PV) => any) => {\n const [tl, tr, br, bl] = corners\n if (corners.every((val, _, arr) => val === arr[0])) return `border-radius: ${calc(tl)};`\n if (tl === br && tr === bl) return `border-radius: ${calc(tl)} ${calc(tr)};`\n if (tl && tr === bl && br) return `border-radius: ${calc(tl)} ${calc(tr)} ${calc(br)};`\n return `border-radius: ${calc(tl)} ${calc(tr)} ${calc(br)} ${calc(bl)};`\n}\n\nconst CORNER_CSS = [\n 'border-top-left-radius',\n 'border-top-right-radius',\n 'border-bottom-right-radius',\n 'border-bottom-left-radius',\n] as const\n\nconst formatIndividual = (corners: PV[], calc: (p: PV) => any) => {\n let output = ''\n for (let i = 0; i < corners.length; i++) {\n if (isValidValue(corners[i])) output += `${CORNER_CSS[i]}: ${calc(corners[i])};`\n }\n return output\n}\n\nexport type BorderRadius = (rootSize?: number) => (props: CornerValues) => string | null\n\nconst borderRadius: BorderRadius = (rootSize) => (props) => {\n if (!hasAnyValue(props)) return null\n const calc = (param: PV) => value(param, rootSize)\n const corners = resolveCorners(props)\n if (corners.every((val) => isValidValue(val))) return formatShorthand(corners, calc)\n return formatIndividual(corners, calc)\n}\n\nexport default borderRadius\n","import { value } from '../../units'\n\ntype CssUnits =\n | 'px'\n | 'rem'\n | '%'\n | 'em'\n | 'ex'\n | 'cm'\n | 'mm'\n | 'in'\n | 'pt'\n | 'pc'\n | 'ch'\n | 'vh'\n | 'vw'\n | 'vmin'\n | 'vmax'\n\nconst isValidValue = (v: unknown) => !!v || v === 0\n\ntype Property = 'inset' | 'margin' | 'padding' | 'border-width' | 'border-style' | 'border-color'\ntype Value = string | number | null | undefined\ntype Side = 'top' | 'bottom' | 'left' | 'right'\n\ntype EdgeValues = {\n full: Value\n x: Value\n y: Value\n top: Value\n left: Value\n right: Value\n bottom: Value\n}\n\ntype Definitions = Record<Property, { unit?: CssUnits; edgeCss: (side: Side) => string }>\n\nconst definitions: Definitions = {\n inset: { unit: 'rem', edgeCss: (side) => side },\n margin: { unit: 'rem', edgeCss: (side) => `margin-${side}` },\n padding: { unit: 'rem', edgeCss: (side) => `padding-${side}` },\n 'border-width': { unit: 'px', edgeCss: (side) => `border-${side}-width` },\n 'border-style': { edgeCss: (side) => `border-${side}-style` },\n 'border-color': { edgeCss: (side) => `border-${side}-color` },\n}\n\nconst hasAnyValue = (vals: EdgeValues) =>\n isValidValue(vals.top) ||\n isValidValue(vals.bottom) ||\n isValidValue(vals.left) ||\n isValidValue(vals.right) ||\n isValidValue(vals.x) ||\n isValidValue(vals.y) ||\n isValidValue(vals.full)\n\nconst resolveSides = ({ full, x, y, top, left, right, bottom }: EdgeValues) => {\n const sides: Value[] = [full, full, full, full]\n if (isValidValue(x)) {\n sides[1] = x\n sides[3] = x\n }\n if (isValidValue(y)) {\n sides[0] = y\n sides[2] = y\n }\n if (isValidValue(top)) sides[0] = top\n if (isValidValue(right)) sides[1] = right\n if (isValidValue(bottom)) sides[2] = bottom\n if (isValidValue(left)) sides[3] = left\n return sides\n}\n\nconst formatShorthand = (property: Property, sides: Value[], calc: (v: Value) => Value) => {\n const [t, r, b, l] = sides\n if (sides.every((val, _, arr) => val === arr[0])) return `${property}: ${calc(t)};`\n if (t === b && r === l) return `${property}: ${calc(t)} ${calc(r)};`\n if (t && r === l && b) return `${property}: ${calc(t)} ${calc(r)} ${calc(b)};`\n return `${property}: ${calc(t)} ${calc(r)} ${calc(b)} ${calc(l)};`\n}\n\nconst formatIndividual = (\n sides: Value[],\n edgeCss: (side: Side) => string,\n calc: (v: Value) => Value,\n) => {\n const [t, r, b, l] = sides\n let output = ''\n if (isValidValue(t)) output += `${edgeCss('top')}: ${calc(t)};`\n if (isValidValue(b)) output += `${edgeCss('bottom')}: ${calc(b)};`\n if (isValidValue(l)) output += `${edgeCss('left')}: ${calc(l)};`\n if (isValidValue(r)) output += `${edgeCss('right')}: ${calc(r)};`\n return output\n}\n\nexport type Edge = (rootSize?: number) => (property: Property, values: EdgeValues) => string | null\n\nconst edge: Edge =\n (rootSize = 16) =>\n (property, values) => {\n if (!hasAnyValue(values)) return null\n const { unit, edgeCss } = definitions[property]\n const calc = (param: Value) => (unit ? value(param, rootSize, unit) : param)\n const sides = resolveSides(values)\n if (sides.every((val) => isValidValue(val))) return formatShorthand(property, sides, calc)\n return formatIndividual(sides, edgeCss, calc)\n }\n\nexport default edge\n","import type { Values } from '../../units/values'\nimport type { BorderRadius } from '../shorthands/borderRadius'\nimport type { Edge } from '../shorthands/edge'\nimport type { PropertyDescriptor } from './propertyMap'\nimport type { InnerTheme } from './types'\n\ntype Css = (strings: TemplateStringsArray, ...values: any[]) => string\ntype Calc = (...params: any[]) => ReturnType<Values>\n\n/** Mirrors the Value / PropertyValue types used by edge and borderRadius shorthands. */\ntype Value = string | number | null | undefined\n\nconst toCssDecl = (css: string, v: unknown) => (v == null ? '' : `${css}: ${v};`)\n\nconst processSpecial = (\n d: Extract<PropertyDescriptor, { kind: 'special' }>,\n t: InnerTheme,\n): string => {\n switch (d.id) {\n case 'fullScreen':\n if (!t.fullScreen) return ''\n return 'position: fixed; top: 0; left: 0; right: 0; bottom: 0;'\n\n case 'backgroundImage':\n if (!t.backgroundImage) return ''\n return `background-image: url(${t.backgroundImage});`\n\n case 'animation': {\n const parts = [t.keyframe, t.animation].filter(Boolean).join(' ')\n return parts ? `animation: ${parts};` : ''\n }\n\n case 'hideEmpty':\n if (!t.hideEmpty) return ''\n return '&:empty { display: none; }'\n\n case 'clearFix':\n if (!t.clearFix) return ''\n return '&::after { clear: both; content: \"\"; display: table; }'\n\n case 'extendCss':\n return (t.extendCss as string) ?? ''\n\n default:\n return ''\n }\n}\n\nconst processDescriptor = (\n d: PropertyDescriptor,\n t: InnerTheme,\n _css: Css,\n calc: Calc,\n shorthand: ReturnType<Edge>,\n borderRadiusFn: ReturnType<BorderRadius>,\n): string => {\n switch (d.kind) {\n case 'simple':\n return toCssDecl(d.css, t[d.key])\n\n case 'convert':\n return toCssDecl(d.css, calc(t[d.key]))\n\n case 'convert_fallback':\n return toCssDecl(d.css, calc(...d.keys.map((k) => t[k])))\n\n case 'edge':\n return (\n shorthand(d.property, {\n full: t[d.keys.full] as Value,\n x: t[d.keys.x] as Value,\n y: t[d.keys.y] as Value,\n top: t[d.keys.top] as Value,\n left: t[d.keys.left] as Value,\n bottom: t[d.keys.bottom] as Value,\n right: t[d.keys.right] as Value,\n }) ?? ''\n )\n\n case 'border_radius':\n return (\n borderRadiusFn({\n full: t[d.keys.full] as Value,\n top: t[d.keys.top] as Value,\n bottom: t[d.keys.bottom] as Value,\n left: t[d.keys.left] as Value,\n right: t[d.keys.right] as Value,\n topLeft: t[d.keys.topLeft] as Value,\n topRight: t[d.keys.topRight] as Value,\n bottomLeft: t[d.keys.bottomLeft] as Value,\n bottomRight: t[d.keys.bottomRight] as Value,\n }) ?? ''\n )\n\n case 'special':\n return processSpecial(d, t)\n }\n}\n\nexport default processDescriptor\n","import type { InnerTheme } from './types'\n\ntype EdgeProperty =\n | 'inset'\n | 'margin'\n | 'padding'\n | 'border-width'\n | 'border-style'\n | 'border-color'\n\ntype EdgeKeys = {\n full: keyof InnerTheme\n x: keyof InnerTheme\n y: keyof InnerTheme\n top: keyof InnerTheme\n left: keyof InnerTheme\n bottom: keyof InnerTheme\n right: keyof InnerTheme\n}\n\ntype BorderRadiusKeys = {\n full: keyof InnerTheme\n top: keyof InnerTheme\n bottom: keyof InnerTheme\n left: keyof InnerTheme\n right: keyof InnerTheme\n topLeft: keyof InnerTheme\n topRight: keyof InnerTheme\n bottomLeft: keyof InnerTheme\n bottomRight: keyof InnerTheme\n}\n\nexport type PropertyDescriptor =\n | { kind: 'simple'; css: string; key: keyof InnerTheme }\n | { kind: 'convert'; css: string; key: keyof InnerTheme }\n | { kind: 'convert_fallback'; css: string; keys: (keyof InnerTheme)[] }\n | { kind: 'edge'; property: EdgeProperty; keys: EdgeKeys }\n | { kind: 'border_radius'; keys: BorderRadiusKeys }\n | { kind: 'special'; id: string }\n\nconst propertyMap: PropertyDescriptor[] = [\n // SPECIAL: fullScreen\n { kind: 'special', id: 'fullScreen' },\n\n // POSITION\n { kind: 'simple', css: 'all', key: 'all' },\n { kind: 'simple', css: 'display', key: 'display' },\n { kind: 'simple', css: 'position', key: 'position' },\n { kind: 'simple', css: 'box-sizing', key: 'boxSizing' },\n { kind: 'simple', css: 'float', key: 'float' },\n\n // INSET\n {\n kind: 'edge',\n property: 'inset',\n keys: {\n full: 'inset',\n x: 'insetX',\n y: 'insetY',\n top: 'top',\n left: 'left',\n bottom: 'bottom',\n right: 'right',\n },\n },\n\n // SIZING\n { kind: 'convert_fallback', css: 'width', keys: ['width', 'size'] },\n { kind: 'convert_fallback', css: 'min-width', keys: ['minWidth', 'minSize'] },\n { kind: 'convert_fallback', css: 'max-width', keys: ['maxWidth', 'maxSize'] },\n { kind: 'convert_fallback', css: 'height', keys: ['height', 'size'] },\n { kind: 'convert_fallback', css: 'min-height', keys: ['minHeight', 'minSize'] },\n { kind: 'convert_fallback', css: 'max-height', keys: ['maxHeight', 'maxSize'] },\n { kind: 'convert', css: 'gap', key: 'gap' },\n { kind: 'simple', css: 'aspect-ratio', key: 'aspectRatio' },\n { kind: 'simple', css: 'contain', key: 'contain' },\n { kind: 'simple', css: 'container-type', key: 'containerType' },\n { kind: 'simple', css: 'container-name', key: 'containerName' },\n { kind: 'simple', css: 'container', key: 'container' },\n { kind: 'convert', css: 'inline-size', key: 'inlineSize' },\n { kind: 'convert', css: 'block-size', key: 'blockSize' },\n { kind: 'convert', css: 'min-inline-size', key: 'minInlineSize' },\n { kind: 'convert', css: 'min-block-size', key: 'minBlockSize' },\n { kind: 'convert', css: 'max-inline-size', key: 'maxInlineSize' },\n { kind: 'convert', css: 'max-block-size', key: 'maxBlockSize' },\n\n // SPACING\n {\n kind: 'edge',\n property: 'margin',\n keys: {\n full: 'margin',\n x: 'marginX',\n y: 'marginY',\n top: 'marginTop',\n left: 'marginLeft',\n bottom: 'marginBottom',\n right: 'marginRight',\n },\n },\n {\n kind: 'edge',\n property: 'padding',\n keys: {\n full: 'padding',\n x: 'paddingX',\n y: 'paddingY',\n top: 'paddingTop',\n left: 'paddingLeft',\n bottom: 'paddingBottom',\n right: 'paddingRight',\n },\n },\n\n // Logical spacing\n { kind: 'convert', css: 'margin-inline', key: 'marginInline' },\n { kind: 'convert', css: 'margin-inline-start', key: 'marginInlineStart' },\n { kind: 'convert', css: 'margin-inline-end', key: 'marginInlineEnd' },\n { kind: 'convert', css: 'margin-block', key: 'marginBlock' },\n { kind: 'convert', css: 'margin-block-start', key: 'marginBlockStart' },\n { kind: 'convert', css: 'margin-block-end', key: 'marginBlockEnd' },\n { kind: 'convert', css: 'padding-inline', key: 'paddingInline' },\n { kind: 'convert', css: 'padding-inline-start', key: 'paddingInlineStart' },\n { kind: 'convert', css: 'padding-inline-end', key: 'paddingInlineEnd' },\n { kind: 'convert', css: 'padding-block', key: 'paddingBlock' },\n { kind: 'convert', css: 'padding-block-start', key: 'paddingBlockStart' },\n { kind: 'convert', css: 'padding-block-end', key: 'paddingBlockEnd' },\n\n // Logical inset\n { kind: 'convert', css: 'inset-inline', key: 'insetInline' },\n { kind: 'convert', css: 'inset-inline-start', key: 'insetInlineStart' },\n { kind: 'convert', css: 'inset-inline-end', key: 'insetInlineEnd' },\n { kind: 'convert', css: 'inset-block', key: 'insetBlock' },\n { kind: 'convert', css: 'inset-block-start', key: 'insetBlockStart' },\n { kind: 'convert', css: 'inset-block-end', key: 'insetBlockEnd' },\n\n // FLEX\n { kind: 'simple', css: 'align-content', key: 'alignContent' },\n { kind: 'simple', css: 'align-items', key: 'alignItems' },\n { kind: 'simple', css: 'align-self', key: 'alignSelf' },\n { kind: 'simple', css: 'flex', key: 'flex' },\n { kind: 'simple', css: 'flex-basis', key: 'flexBasis' },\n { kind: 'simple', css: 'flex-direction', key: 'flexDirection' },\n { kind: 'simple', css: 'flex-flow', key: 'flexFlow' },\n { kind: 'simple', css: 'flex-grow', key: 'flexGrow' },\n { kind: 'simple', css: 'flex-shrink', key: 'flexShrink' },\n { kind: 'simple', css: 'flex-wrap', key: 'flexWrap' },\n { kind: 'simple', css: 'justify-content', key: 'justifyContent' },\n { kind: 'simple', css: 'justify-items', key: 'justifyItems' },\n { kind: 'simple', css: 'justify-self', key: 'justifySelf' },\n { kind: 'simple', css: 'place-items', key: 'placeItems' },\n { kind: 'simple', css: 'place-content', key: 'placeContent' },\n { kind: 'simple', css: 'place-self', key: 'placeSelf' },\n { kind: 'convert', css: 'row-gap', key: 'rowGap' },\n { kind: 'convert', css: 'column-gap', key: 'columnGap' },\n\n // GRID\n { kind: 'simple', css: 'grid', key: 'grid' },\n { kind: 'simple', css: 'grid-area', key: 'gridArea' },\n { kind: 'convert', css: 'grid-auto-columns', key: 'gridAutoColumns' },\n { kind: 'simple', css: 'grid-auto-flow', key: 'gridAutoFlow' },\n { kind: 'convert', css: 'grid-auto-rows', key: 'gridAutoRows' },\n { kind: 'simple', css: 'grid-column', key: 'gridColumn' },\n { kind: 'simple', css: 'grid-column-end', key: 'gridColumnEnd' },\n { kind: 'convert', css: 'grid-column-gap', key: 'gridColumnGap' },\n { kind: 'convert', css: 'grid-column-start', key: 'gridColumnStart' },\n { kind: 'convert', css: 'grid-gap', key: 'gridGap' },\n { kind: 'simple', css: 'grid-row', key: 'gridRow' },\n { kind: 'simple', css: 'grid-row-start', key: 'gridRowStart' },\n { kind: 'simple', css: 'grid-row-end', key: 'gridRowEnd' },\n { kind: 'convert', css: 'grid-row-gap', key: 'gridRowGap' },\n { kind: 'simple', css: 'grid-template', key: 'gridTemplate' },\n { kind: 'simple', css: 'grid-template-areas', key: 'gridTemplateAreas' },\n { kind: 'simple', css: 'grid-template-columns', key: 'gridTemplateColumns' },\n { kind: 'simple', css: 'grid-template-rows', key: 'gridTemplateRows' },\n\n // POSITIONING\n { kind: 'simple', css: 'object-fit', key: 'objectFit' },\n { kind: 'simple', css: 'object-position', key: 'objectPosition' },\n { kind: 'simple', css: 'order', key: 'order' },\n { kind: 'simple', css: 'opacity', key: 'opacity' },\n { kind: 'simple', css: 'resize', key: 'resize' },\n { kind: 'simple', css: 'vertical-align', key: 'verticalAlign' },\n\n // FONT & TEXT\n { kind: 'simple', css: 'line-height', key: 'lineHeight' },\n { kind: 'simple', css: 'font', key: 'font' },\n { kind: 'simple', css: 'font-family', key: 'fontFamily' },\n { kind: 'convert', css: 'font-size', key: 'fontSize' },\n { kind: 'convert', css: 'font-size-adjust', key: 'fontSizeAdjust' },\n { kind: 'convert', css: 'font-stretch', key: 'fontStretch' },\n { kind: 'simple', css: 'font-style', key: 'fontStyle' },\n { kind: 'simple', css: 'font-variant', key: 'fontVariant' },\n { kind: 'simple', css: 'font-weight', key: 'fontWeight' },\n { kind: 'simple', css: 'font-kerning', key: 'fontKerning' },\n { kind: 'simple', css: 'font-feature-settings', key: 'fontFeatureSettings' },\n { kind: 'simple', css: 'font-variation-settings', key: 'fontVariationSettings' },\n { kind: 'simple', css: 'font-optical-sizing', key: 'fontOpticalSizing' },\n { kind: 'simple', css: 'text-align', key: 'textAlign' },\n { kind: 'simple', css: 'text-align-last', key: 'textAlignLast' },\n { kind: 'simple', css: 'text-transform', key: 'textTransform' },\n { kind: 'simple', css: 'text-decoration', key: 'textDecoration' },\n { kind: 'simple', css: 'text-decoration-color', key: 'textDecorationColor' },\n { kind: 'simple', css: 'text-decoration-line', key: 'textDecorationLine' },\n { kind: 'simple', css: 'text-decoration-style', key: 'textDecorationStyle' },\n { kind: 'simple', css: 'text-decoration-thickness', key: 'textDecorationThickness' },\n { kind: 'simple', css: 'text-underline-offset', key: 'textUnderlineOffset' },\n { kind: 'simple', css: 'text-emphasis', key: 'textEmphasis' },\n { kind: 'simple', css: 'text-emphasis-color', key: 'textEmphasisColor' },\n { kind: 'simple', css: 'text-emphasis-style', key: 'textEmphasisStyle' },\n { kind: 'simple', css: 'letter-spacing', key: 'letterSpacing' },\n { kind: 'simple', css: 'word-spacing', key: 'wordSpacing' },\n { kind: 'simple', css: 'text-indent', key: 'textIndent' },\n { kind: 'simple', css: 'text-justify', key: 'textJustify' },\n { kind: 'simple', css: 'text-overflow', key: 'textOverflow' },\n { kind: 'simple', css: 'text-shadow', key: 'textShadow' },\n { kind: 'simple', css: 'text-wrap', key: 'textWrap' },\n { kind: 'simple', css: 'text-rendering', key: 'textRendering' },\n { kind: 'simple', css: 'white-space', key: 'whiteSpace' },\n { kind: 'simple', css: 'word-break', key: 'wordBreak' },\n { kind: 'simple', css: 'word-wrap', key: 'wordWrap' },\n { kind: 'simple', css: 'writing-mode', key: 'writingMode' },\n { kind: 'simple', css: 'direction', key: 'direction' },\n { kind: 'simple', css: 'hyphens', key: 'hyphens' },\n\n // LIST\n { kind: 'simple', css: 'list-style', key: 'listStyle' },\n { kind: 'simple', css: 'list-style-image', key: 'listStyleImage' },\n { kind: 'simple', css: 'list-style-position', key: 'listStylePosition' },\n { kind: 'simple', css: 'list-style-type', key: 'listStyleType' },\n\n // BACKGROUND & COLORS\n { kind: 'simple', css: 'color', key: 'color' },\n { kind: 'simple', css: 'background', key: 'background' },\n { kind: 'simple', css: 'background-color', key: 'backgroundColor' },\n { kind: 'special', id: 'backgroundImage' },\n { kind: 'simple', css: 'background-attachment', key: 'backgroundAttachment' },\n { kind: 'simple', css: 'background-clip', key: 'backgroundClip' },\n { kind: 'simple', css: 'background-origin', key: 'backgroundOrigin' },\n { kind: 'simple', css: 'background-position', key: 'backgroundPosition' },\n { kind: 'simple', css: 'background-repeat', key: 'backgroundRepeat' },\n { kind: 'simple', css: 'background-size', key: 'backgroundSize' },\n\n // BORDERS\n {\n kind: 'border_radius',\n keys: {\n full: 'borderRadius',\n top: 'borderRadiusTop',\n bottom: 'borderRadiusBottom',\n left: 'borderRadiusLeft',\n right: 'borderRadiusRight',\n topLeft: 'borderRadiusTopLeft',\n topRight: 'borderRadiusTopRight',\n bottomLeft: 'borderRadiusBottomLeft',\n bottomRight: 'borderRadiusBottomRight',\n },\n },\n { kind: 'simple', css: 'border', key: 'border' },\n { kind: 'simple', css: 'border-top', key: 'borderTop' },\n { kind: 'simple', css: 'border-bottom', key: 'borderBottom' },\n { kind: 'simple', css: 'border-left', key: 'borderLeft' },\n { kind: 'simple', css: 'border-right', key: 'borderRight' },\n {\n kind: 'edge',\n property: 'border-width',\n keys: {\n full: 'borderWidth',\n x: 'borderWidthX',\n y: 'borderWidthY',\n top: 'borderWidthTop',\n left: 'borderWidthLeft',\n bottom: 'borderWidthBottom',\n right: 'borderWidthRight',\n },\n },\n {\n kind: 'edge',\n property: 'border-style',\n keys: {\n full: 'borderStyle',\n x: 'borderStyleX',\n y: 'borderStyleY',\n top: 'borderStyleTop',\n left: 'borderStyleLeft',\n bottom: 'borderStyleBottom',\n right: 'borderStyleRight',\n },\n },\n {\n kind: 'edge',\n property: 'border-color',\n keys: {\n full: 'borderColor',\n x: 'borderColorX',\n y: 'borderColorY',\n top: 'borderColorTop',\n left: 'borderColorLeft',\n bottom: 'borderColorBottom',\n right: 'borderColorRight',\n },\n },\n { kind: 'simple', css: 'border-image', key: 'borderImage' },\n { kind: 'simple', css: 'border-image-outset', key: 'borderImageOutset' },\n { kind: 'simple', css: 'border-image-repeat', key: 'borderImageRepeat' },\n { kind: 'simple', css: 'border-image-slice', key: 'borderImageSlice' },\n { kind: 'simple', css: 'border-image-source', key: 'borderImageSource' },\n { kind: 'simple', css: 'border-image-width', key: 'borderImageWidth' },\n { kind: 'simple', css: 'border-spacing', key: 'borderSpacing' },\n\n { kind: 'simple', css: 'border-collapse', key: 'borderCollapse' },\n\n // Logical borders\n { kind: 'simple', css: 'border-inline', key: 'borderInline' },\n { kind: 'simple', css: 'border-block', key: 'borderBlock' },\n { kind: 'simple', css: 'border-inline-start', key: 'borderInlineStart' },\n { kind: 'simple', css: 'border-inline-end', key: 'borderInlineEnd' },\n { kind: 'simple', css: 'border-block-start', key: 'borderBlockStart' },\n { kind: 'simple', css: 'border-block-end', key: 'borderBlockEnd' },\n\n // VISUAL EFFECTS\n { kind: 'simple', css: 'backface-visibility', key: 'backfaceVisibility' },\n { kind: 'simple', css: 'box-shadow', key: 'boxShadow' },\n { kind: 'simple', css: 'filter', key: 'filter' },\n { kind: 'simple', css: 'backdrop-filter', key: 'backdropFilter' },\n { kind: 'simple', css: 'mix-blend-mode', key: 'mixBlendMode' },\n { kind: 'simple', css: 'background-blend-mode', key: 'backgroundBlendMode' },\n { kind: 'simple', css: 'isolation', key: 'isolation' },\n { kind: 'simple', css: 'outline', key: 'outline' },\n { kind: 'simple', css: 'outline-color', key: 'outlineColor' },\n { kind: 'simple', css: 'outline-offset', key: 'outlineOffset' },\n { kind: 'simple', css: 'outline-style', key: 'outlineStyle' },\n { kind: 'simple', css: 'outline-width', key: 'outlineWidth' },\n\n // ANIMATIONS\n { kind: 'special', id: 'animation' },\n { kind: 'simple', css: 'animation-name', key: 'animationName' },\n { kind: 'simple', css: 'animation-duration', key: 'animationDuration' },\n { kind: 'simple', css: 'animation-timing-function', key: 'animationTimingFunction' },\n { kind: 'simple', css: 'animation-delay', key: 'animationDelay' },\n { kind: 'simple', css: 'animation-iteration-count', key: 'animationIterationCount' },\n { kind: 'simple', css: 'animation-direction', key: 'animationDirection' },\n { kind: 'simple', css: 'animation-fill-mode', key: 'animationFillMode' },\n { kind: 'simple', css: 'animation-play-state', key: 'animationPlayState' },\n { kind: 'simple', css: 'transition', key: 'transition' },\n { kind: 'simple', css: 'transition-delay', key: 'transitionDelay' },\n { kind: 'simple', css: 'transition-duration', key: 'transitionDuration' },\n { kind: 'simple', css: 'transition-property', key: 'transitionProperty' },\n { kind: 'simple', css: 'transition-timing-function', key: 'transitionTimingFunction' },\n\n // TRANSFORM\n { kind: 'simple', css: 'transform', key: 'transform' },\n { kind: 'simple', css: 'transform-origin', key: 'transformOrigin' },\n { kind: 'simple', css: 'transform-style', key: 'transformStyle' },\n { kind: 'simple', css: 'translate', key: 'translate' },\n { kind: 'simple', css: 'rotate', key: 'rotate' },\n { kind: 'simple', css: 'scale', key: 'scale' },\n { kind: 'simple', css: 'will-change', key: 'willChange' },\n\n // SCROLL\n { kind: 'simple', css: 'scroll-behavior', key: 'scrollBehavior' },\n { kind: 'simple', css: 'scroll-snap-type', key: 'scrollSnapType' },\n { kind: 'simple', css: 'scroll-snap-align', key: 'scrollSnapAlign' },\n { kind: 'simple', css: 'scroll-snap-stop', key: 'scrollSnapStop' },\n { kind: 'simple', css: 'scroll-margin', key: 'scrollMargin' },\n { kind: 'simple', css: 'scroll-padding', key: 'scrollPadding' },\n { kind: 'simple', css: 'overscroll-behavior', key: 'overscrollBehavior' },\n { kind: 'simple', css: 'overscroll-behavior-x', key: 'overscrollBehaviorX' },\n { kind: 'simple', css: 'overscroll-behavior-y', key: 'overscrollBehaviorY' },\n\n // INTERACTION\n { kind: 'simple', css: 'cursor', key: 'cursor' },\n { kind: 'simple', css: 'pointer-events', key: 'pointerEvents' },\n { kind: 'simple', css: 'user-select', key: 'userSelect' },\n { kind: 'simple', css: 'touch-action', key: 'touchAction' },\n { kind: 'simple', css: 'scrollbar-width', key: 'scrollbarWidth' },\n { kind: 'simple', css: 'scrollbar-color', key: 'scrollbarColor' },\n { kind: 'simple', css: 'scrollbar-gutter', key: 'scrollbarGutter' },\n { kind: 'simple', css: 'caret-color', key: 'caretColor' },\n { kind: 'simple', css: 'accent-color', key: 'accentColor' },\n { kind: 'simple', css: 'color-scheme', key: 'colorScheme' },\n\n // OTHER\n { kind: 'simple', css: 'caption-side', key: 'captionSide' },\n { kind: 'simple', css: 'clear', key: 'clear' },\n { kind: 'simple', css: 'clip', key: 'clip' },\n { kind: 'simple', css: 'clip-path', key: 'clipPath' },\n { kind: 'simple', css: 'content', key: 'content' },\n { kind: 'simple', css: 'content-visibility', key: 'contentVisibility' },\n { kind: 'simple', css: 'counter-increment', key: 'counterIncrement' },\n { kind: 'simple', css: 'counter-reset', key: 'counterReset' },\n { kind: 'simple', css: 'empty-cells', key: 'emptyCells' },\n { kind: 'simple', css: 'z-index', key: 'zIndex' },\n { kind: 'simple', css: 'overflow', key: 'overflow' },\n { kind: 'simple', css: 'overflow-wrap', key: 'overflowWrap' },\n { kind: 'simple', css: 'overflow-x', key: 'overflowX' },\n { kind: 'simple', css: 'overflow-y', key: 'overflowY' },\n { kind: 'simple', css: 'perspective', key: 'perspective' },\n { kind: 'simple', css: 'perspective-origin', key: 'perspectiveOrigin' },\n { kind: 'simple', css: 'quotes', key: 'quotes' },\n { kind: 'simple', css: 'tab-size', key: 'tabSize' },\n { kind: 'simple', css: 'table-layout', key: 'tableLayout' },\n { kind: 'simple', css: 'visibility', key: 'visibility' },\n { kind: 'simple', css: 'appearance', key: 'appearance' },\n { kind: 'simple', css: 'image-rendering', key: 'imageRendering' },\n\n // Masks\n { kind: 'simple', css: 'mask-image', key: 'maskImage' },\n { kind: 'simple', css: 'mask-size', key: 'maskSize' },\n { kind: 'simple', css: 'mask-position', key: 'maskPosition' },\n { kind: 'simple', css: 'mask-repeat', key: 'maskRepeat' },\n\n // Shapes\n { kind: 'simple', css: 'shape-outside', key: 'shapeOutside' },\n { kind: 'simple', css: 'shape-margin', key: 'shapeMargin' },\n { kind: 'simple', css: 'shape-image-threshold', key: 'shapeImageThreshold' },\n\n // Columns\n { kind: 'simple', css: 'column-count', key: 'columnCount' },\n { kind: 'simple', css: 'column-width', key: 'columnWidth' },\n { kind: 'simple', css: 'column-rule', key: 'columnRule' },\n { kind: 'simple', css: 'columns', key: 'columns' },\n\n // Fragmentation\n { kind: 'simple', css: 'break-before', key: 'breakBefore' },\n { kind: 'simple', css: 'break-after', key: 'breakAfter' },\n { kind: 'simple', css: 'break-inside', key: 'breakInside' },\n { kind: 'simple', css: 'orphans', key: 'orphans' },\n { kind: 'simple', css: 'widows', key: 'widows' },\n { kind: 'simple', css: 'print-color-adjust', key: 'printColorAdjust' },\n\n // CUSTOM ATTRIBUTES\n { kind: 'special', id: 'hideEmpty' },\n { kind: 'special', id: 'clearFix' },\n { kind: 'special', id: 'extendCss' },\n]\n\nexport default propertyMap\n","import { values } from '../../units'\nimport { borderRadius, edge } from '../shorthands'\nimport processDescriptor from './processDescriptor'\nimport propertyMap from './propertyMap'\nimport type { ITheme, InnerTheme, Theme } from './types'\n\nexport type { ITheme, Theme as StylesTheme }\n\ntype Css = (strings: TemplateStringsArray, ...args: any[]) => any\n\nexport type Styles = ({\n theme,\n css,\n rootSize,\n globalTheme,\n}: {\n theme: InnerTheme\n css: Css\n rootSize?: number | undefined\n globalTheme?: Record<string, any> | undefined\n}) => ReturnType<Css>\n\n/**\n * Data-driven style processor. Iterates the `propertyMap` descriptors\n * and delegates each to `processDescriptor`, which maps theme values\n * to CSS strings. The result is a single `css` tagged-template literal\n * containing all non-null property outputs.\n *\n * IMPORTANT: the return MUST be wrapped in `css\\`...\\`` — NOT a plain\n * string join. makeItResponsive embeds this result in another template\n * literal, and the CSS interpolation chain requires a css template\n * result (not a raw string) for correct nesting of media queries,\n * pseudo-selectors, and @layer wrapping. A previous version returned\n * `fragments.filter(Boolean).join(' ')` which broke responsive styles,\n * hover states, and layer cascade ordering.\n */\nconst styles: Styles = ({ theme: t, css, rootSize }) => {\n const calc = (...params: any[]) => values(params, rootSize)\n const shorthand = edge(rootSize)\n const borderRadiusFn = borderRadius(rootSize)\n\n const fragments = propertyMap.map((d) =>\n processDescriptor(d, t, css, calc, shorthand, borderRadiusFn),\n )\n\n return css`\n ${fragments}\n `\n}\n\nexport default styles\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["CoreProvider","isValidValue","hasAnyValue","formatShorthand","formatIndividual"],"sources":["../src/responsive/breakpoints.ts","../src/responsive/createMediaQueries.ts","../src/responsive/normalizeTheme.ts","../src/responsive/optimizeTheme.ts","../src/responsive/transformTheme.ts","../src/responsive/makeItResponsive.ts","../src/responsive/sortBreakpoints.ts","../src/enrichTheme.ts","../src/context.tsx","../src/styles/alignContent.ts","../src/styles/extendCss.ts","../src/units/stripUnit.ts","../src/units/value.ts","../src/units/values.ts","../src/styles/shorthands/borderRadius.ts","../src/styles/shorthands/edge.ts","../src/styles/styles/processDescriptor.ts","../src/styles/styles/propertyMap.ts","../src/styles/styles/index.ts"],"sourcesContent":["const breakpoints = {\n rootSize: 16,\n breakpoints: {\n xs: 0,\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1440,\n },\n} as const\n\nexport type Breakpoints = typeof breakpoints\n\nexport default breakpoints\n","type Css = (strings: TemplateStringsArray, ...values: any[]) => any\n\nexport type CreateMediaQueries = <\n B extends Record<string, number>,\n R extends number,\n C extends Css,\n>(props: {\n breakpoints: B\n rootSize: R\n css: C\n}) => Record<keyof B, (...args: any[]) => string>\n\n// Implementation uses Record<string, ...> which is widened from Record<keyof B, ...>;\n// the generic constraint on CreateMediaQueries ensures callers get the narrower type.\nconst createMediaQueries: CreateMediaQueries = ((props: {\n breakpoints: Record<string, number>\n rootSize: number\n css: Css\n}) => {\n const { breakpoints, rootSize, css } = props\n\n return Object.keys(breakpoints).reduce<\n Record<string, (...args: [TemplateStringsArray, ...any[]]) => string>\n >((acc, key) => {\n const breakpointValue = breakpoints[key]\n\n if (breakpointValue === 0) {\n acc[key] = (...args: [TemplateStringsArray, ...any[]]) => css(...args)\n } else if (breakpointValue != null) {\n const emSize = breakpointValue / rootSize\n\n acc[key] = (...args: [TemplateStringsArray, ...any[]]) => css`\n @media only screen and (min-width: ${emSize}em) {\n ${css(...args)};\n }\n `\n }\n\n return acc\n }, {})\n}) as CreateMediaQueries\n\nexport default createMediaQueries\n","type AssignToBreakpointKey = (\n breakpoints: string[],\n) => (\n valueFn: (breakpoint: string, i: number, bps: string[], result: Record<string, unknown>) => void,\n) => Record<string, unknown>\n\nconst assignToBreakpointKey: AssignToBreakpointKey = (breakpoints) => (valueFn) => {\n const result: Record<string, unknown> = {}\n breakpoints.forEach((item, i) => {\n result[item] = valueFn(item, i, breakpoints, result)\n })\n return result\n}\n\nconst handleArrayCb = (arr: (string | number)[]) => (_: unknown, i: number) => {\n const currentValue = arr[i]\n const lastValue = arr[arr.length - 1]\n return currentValue ?? lastValue\n}\n\nconst handleObjectCb =\n (obj: Record<string, unknown>) =>\n (bp: string, i: number, bps: string[], res: Record<string, unknown>) => {\n const currentValue = obj[bp]\n const prevBp = bps[i - 1]\n const previousValue = prevBp != null ? res[prevBp] : undefined\n if (currentValue != null) return currentValue\n return previousValue\n }\n\nconst handleValueCb = (value: unknown) => () => value\n\nconst shouldNormalize = (props: Record<string, any>) =>\n Object.values(props).some((item) => typeof item === 'object' || Array.isArray(item))\n\nexport type NormalizeTheme = ({\n theme,\n breakpoints,\n}: {\n theme: Record<string, unknown>\n breakpoints: string[]\n}) => Record<string, unknown>\n\nconst normalizeTheme: NormalizeTheme = ({ theme, breakpoints }) => {\n if (!shouldNormalize(theme)) return theme\n\n const getBpValues = assignToBreakpointKey(breakpoints)\n const result: Record<string, unknown> = {}\n\n Object.entries(theme).forEach(([key, value]) => {\n if (value == null) return\n\n if (Array.isArray(value)) {\n result[key] = getBpValues(handleArrayCb(value as (string | number)[]))\n } else if (typeof value === 'object') {\n result[key] = getBpValues(handleObjectCb(value as Record<string, any>))\n } else {\n result[key] = getBpValues(handleValueCb(value))\n }\n })\n\n return result\n}\n\nexport default normalizeTheme\n","export type OptimizeTheme = ({\n theme,\n breakpoints,\n}: {\n theme: Record<string, Record<string, unknown>>\n breakpoints: string[]\n}) => Record<string, Record<string, unknown>>\n\nconst shallowEqual = (\n a: Record<string, unknown> | undefined,\n b: Record<string, unknown> | undefined,\n): boolean => {\n if (a === b) return true\n if (!a || !b) return false\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n if (keysA.length !== keysB.length) return false\n for (const key of keysA) {\n if (a[key] !== b[key]) return false\n }\n return true\n}\n\n/**\n * Removes breakpoints whose full-object styles are identical to the\n * previous one. Simple all-or-nothing: if ANY property differs from\n * the previous breakpoint, emit the ENTIRE current breakpoint.\n *\n * This matches the reference implementation (vitus-labs/ui-system) and\n * the original monorepo-migration version (commit 2b7c5876). Previous\n * \"optimizations\" (PRs #159, #208) that tried per-property diffing\n * broke responsive styles in subtle ways — shorthand/longhand CSS\n * property interactions, properties that depend on each other,\n * properties that need to be emitted together to cascade correctly.\n *\n * The all-or-nothing approach is the correct level of deduplication —\n * we skip the breakpoint when it's entirely redundant, and let the\n * browser's CSS cascade handle the rest.\n */\nconst optimizeTheme: OptimizeTheme = ({ theme, breakpoints }) => {\n const result: Record<string, Record<string, unknown>> = {}\n\n for (let i = 0; i < breakpoints.length; i++) {\n const key = breakpoints[i] as string\n const previousBreakpoint = breakpoints[i - 1] as string\n const current = theme[key]\n if (current && (i === 0 || !shallowEqual(theme[previousBreakpoint], current))) {\n result[key] = current\n }\n }\n\n return result\n}\n\nexport default optimizeTheme\n","import { isEmpty, set } from '@pyreon/ui-core'\n\nconst removeUnexpectedKeys = (obj: Record<string, unknown>, keys: string[]) => {\n const result: Record<string, unknown> = {}\n keys.forEach((bp) => {\n const value = obj[bp]\n if (value) {\n result[bp] = value\n }\n })\n return result\n}\n\nexport type TransformTheme = ({\n theme,\n breakpoints,\n}: {\n theme: Record<string, unknown>\n breakpoints: string[]\n}) => any\n\nconst transformTheme: TransformTheme = ({ theme, breakpoints }) => {\n const result = {}\n\n if (isEmpty(theme) || isEmpty(breakpoints)) return result\n\n Object.entries(theme).forEach(([key, value]) => {\n if (Array.isArray(value) && value.length > 0) {\n value.forEach((child, i) => {\n const indexBreakpoint = breakpoints[i]\n if (indexBreakpoint == null) return\n set(result, [indexBreakpoint, key], child)\n })\n } else if (typeof value === 'object' && value !== null) {\n Object.entries(value).forEach(([childKey, childValue]) => {\n set(result, [childKey, key], childValue)\n })\n } else if (value != null) {\n const firstBreakpoint = breakpoints[0]\n if (firstBreakpoint == null) return\n set(result, [firstBreakpoint, key], value)\n }\n })\n\n return removeUnexpectedKeys(result, breakpoints)\n}\n\nexport default transformTheme\n","import { isEmpty } from '@pyreon/ui-core'\nimport type createMediaQueries from './createMediaQueries'\nimport normalizeTheme from './normalizeTheme'\nimport optimizeTheme from './optimizeTheme'\nimport type sortBreakpoints from './sortBreakpoints'\nimport transformTheme from './transformTheme'\n\ntype Css = (strings: TemplateStringsArray, ...values: any[]) => any\n\ntype CustomTheme = Record<string, unknown>\n\ntype Theme = Partial<{\n rootSize: number\n breakpoints: Record<string, number>\n __PYREON__: Partial<{\n media: ReturnType<typeof createMediaQueries>\n sortedBreakpoints: ReturnType<typeof sortBreakpoints>\n }>\n}> &\n CustomTheme\n\nexport type MakeItResponsiveStyles<T extends Partial<Record<string, any>> = any> = ({\n theme,\n css,\n rootSize,\n globalTheme,\n}: {\n theme: T\n css: Css\n rootSize?: number | undefined\n globalTheme?: Record<string, any> | undefined\n}) => ReturnType<typeof css> | string | any\n\nexport type MakeItResponsive = ({\n theme,\n key,\n css,\n styles,\n normalize,\n}: {\n theme?: CustomTheme\n key?: string\n css: any\n styles: MakeItResponsiveStyles\n normalize?: boolean\n}) => (props: { theme?: Theme; [prop: string]: any }) => any\n\nconst themeCache = new WeakMap<\n object,\n { breakpoints: unknown; optimized: Record<string, Record<string, unknown>> }\n>()\n\nconst makeItResponsive: MakeItResponsive =\n ({ theme: customTheme, key = '', css, styles, normalize = true }) =>\n ({ theme = {}, ...props }) => {\n const internalTheme = customTheme || props[key]\n\n if (isEmpty(internalTheme)) return ''\n\n const { rootSize, breakpoints, __PYREON__, ...restTheme } = theme as Theme\n\n const renderStyles = (styleTheme: Record<string, unknown>): ReturnType<typeof styles> =>\n styles({ theme: styleTheme, css, rootSize, globalTheme: restTheme })\n\n if (isEmpty(breakpoints) || isEmpty(__PYREON__)) {\n return css`\n ${renderStyles(internalTheme)}\n `\n }\n\n // isEmpty guard above ensures __PYREON__ is defined here\n const { media, sortedBreakpoints } = __PYREON__ as NonNullable<typeof __PYREON__>\n\n let optimizedTheme: Record<string, Record<string, unknown>>\n\n const cached = themeCache.get(internalTheme)\n if (cached && cached.breakpoints === sortedBreakpoints) {\n optimizedTheme = cached.optimized\n } else {\n let helperTheme = internalTheme\n\n if (normalize) {\n helperTheme = normalizeTheme({\n theme: internalTheme,\n breakpoints: sortedBreakpoints,\n })\n }\n\n const transformedTheme = transformTheme({\n theme: helperTheme,\n breakpoints: sortedBreakpoints,\n })\n\n optimizedTheme = optimizeTheme({\n theme: transformedTheme,\n breakpoints: sortedBreakpoints,\n })\n\n themeCache.set(internalTheme, {\n breakpoints: sortedBreakpoints,\n optimized: optimizedTheme,\n })\n }\n\n return sortedBreakpoints.map((item: string) => {\n const breakpointTheme = optimizedTheme[item]\n\n if (!breakpointTheme || !media) return ''\n\n const result = renderStyles(breakpointTheme)\n\n return (media as Record<string, any>)[item]`\n ${result};\n `\n })\n }\n\nexport default makeItResponsive\n","export type SortBreakpoints = <T extends Record<string, number>>(breakpoints: T) => (keyof T)[]\n\nconst sortBreakpoints: SortBreakpoints = (breakpoints) => {\n const result = Object.keys(breakpoints).sort(\n (a, b) => (breakpoints[a] ?? 0) - (breakpoints[b] ?? 0),\n )\n return result\n}\n\nexport default sortBreakpoints\n","import { config, isEmpty } from '@pyreon/ui-core'\nimport { createMediaQueries, sortBreakpoints } from './responsive'\n\nexport type PyreonTheme = {\n rootSize?: number\n breakpoints?: Record<string, number>\n __PYREON__?: {\n sortedBreakpoints: string[] | undefined\n media: Record<string, (...args: any[]) => any> | undefined\n }\n} & Record<string, unknown>\n\n/**\n * Enrich a theme with pre-computed responsive utilities.\n * Adds sorted breakpoints and media-query tagged-template helpers\n * to `theme.__PYREON__` for consumption by `makeItResponsive`.\n *\n * This is a pure function — safe to call outside of component context.\n *\n * @example\n * const enriched = enrichTheme({ rootSize: 16, breakpoints: { xs: 0, sm: 576, md: 768 } })\n * enriched.__PYREON__.sortedBreakpoints // ['xs', 'sm', 'md']\n * enriched.__PYREON__.media.sm // tagged-template for @media (min-width: 36em)\n */\nexport function enrichTheme<T extends PyreonTheme>(\n theme: T,\n): T & Required<Pick<PyreonTheme, '__PYREON__'>> {\n const { breakpoints, rootSize = 16 } = theme\n\n const sortedBreakpoints =\n breakpoints && !isEmpty(breakpoints) ? sortBreakpoints(breakpoints) : undefined\n\n const media =\n breakpoints && !isEmpty(breakpoints)\n ? createMediaQueries({ breakpoints, css: config.css, rootSize })\n : undefined\n\n return {\n ...theme,\n __PYREON__: { sortedBreakpoints, media },\n }\n}\n","import type { VNode } from '@pyreon/core'\nimport { provide } from '@pyreon/core'\nimport { ThemeContext } from '@pyreon/styler'\nimport { Provider as CoreProvider, context } from '@pyreon/ui-core'\nimport type { PyreonTheme } from './enrichTheme'\nimport { enrichTheme } from './enrichTheme'\n\nexport type TProvider = {\n theme: PyreonTheme\n children?: VNode | null\n}\n\n/**\n * @internal Low-level provider — use `PyreonUI` from `@pyreon/ui-core` instead.\n *\n * Unistyle Provider — wraps the core Provider and enriches the theme\n * with pre-computed sorted breakpoints and media-query tagged-template\n * helpers consumed by `makeItResponsive`.\n *\n * @deprecated Prefer `<PyreonUI theme={theme} mode=\"light\">` which handles\n * all three context layers (styler, core, mode) in one component.\n */\nfunction Provider(props: TProvider): VNode | null {\n const { theme, children } = props\n\n const enrichedTheme = enrichTheme(theme)\n\n // Provide enriched theme to both the ui-core context (for rocketstyle/elements)\n // AND the styler ThemeContext (for styled() components and makeItResponsive).\n // Without this, styled() components receive an empty theme and all responsive\n // styles are skipped (@media queries produce NaN values).\n provide(ThemeContext, enrichedTheme)\n\n return CoreProvider({ theme: enrichedTheme, children }) as VNode | null\n}\n\nexport { context }\n\nexport default Provider\n","import { isEmpty } from '@pyreon/ui-core'\n\nexport type AlignContentDirectionKeys = keyof typeof ALIGN_CONTENT_DIRECTION\nexport type AlignContentAlignXKeys = keyof typeof ALIGN_CONTENT_MAP_X\nexport type AlignContentAlignYKeys = keyof typeof ALIGN_CONTENT_MAP_Y\n\nconst ALIGN_CONTENT_MAP_SHARED = {\n center: 'center',\n spaceBetween: 'space-between',\n spaceAround: 'space-around',\n block: 'stretch',\n}\n\nexport const ALIGN_CONTENT_MAP_X = {\n left: 'flex-start',\n right: 'flex-end',\n ...ALIGN_CONTENT_MAP_SHARED,\n} as const\n\nexport const ALIGN_CONTENT_MAP_Y = {\n top: 'flex-start',\n bottom: 'flex-end',\n ...ALIGN_CONTENT_MAP_SHARED,\n} as const\n\nexport const ALIGN_CONTENT_DIRECTION = {\n inline: 'row',\n reverseInline: 'row-reverse',\n rows: 'column',\n reverseRows: 'column-reverse',\n} as const\n\nexport type AlignContent = ({\n direction,\n alignX,\n alignY,\n}: {\n direction: AlignContentDirectionKeys\n alignX: AlignContentAlignXKeys\n alignY: AlignContentAlignYKeys\n}) => string | null\n\nconst alignContent: AlignContent = (attrs) => {\n const { direction, alignX, alignY } = attrs\n\n if (isEmpty(attrs) || !direction || !alignX || !alignY) {\n return null\n }\n\n const isReverted = ['inline', 'reverseInline'].includes(direction)\n const dir = ALIGN_CONTENT_DIRECTION[direction]\n const x = ALIGN_CONTENT_MAP_X[alignX]\n const y = ALIGN_CONTENT_MAP_Y[alignY]\n\n return `flex-direction: ${dir}; align-items: ${isReverted ? y : x}; justify-content: ${isReverted ? x : y};`\n}\n\nexport default alignContent\n","export type ExtendCss = (\n styles:\n | ((css: (strings: TemplateStringsArray, ...values: any[]) => string) => string)\n | string\n | null\n | undefined,\n) => string\n\nconst simpleCss = (strings: TemplateStringsArray, ...values: any[]): string => {\n let result = ''\n for (let i = 0; i < strings.length; i++) {\n result += strings[i]\n if (i < values.length) result += String(values[i] ?? '')\n }\n return result\n}\n\nconst extendCss: ExtendCss = (styles) => {\n if (!styles) return ''\n if (typeof styles === 'function') {\n return styles(simpleCss)\n }\n return styles\n}\n\nexport default extendCss\n","type Value<V> = V extends string ? number : V\ntype Unit<V> = V extends string ? string : undefined\n\nexport type StripUnit = <V extends string | number, UR extends boolean = false>(\n value: V,\n unitReturn?: UR,\n) => UR extends true ? [Value<V>, Unit<V>] : Value<V>\n\nconst stripUnit = ((value: string | number, unitReturn?: boolean) => {\n const cssRegex = /^([+-]?(?:\\d+|\\d*\\.\\d+))([a-z]*|%)$/\n\n if (typeof value !== 'string') return unitReturn ? [value, undefined] : value\n\n const matchedValue = value.match(cssRegex)\n\n if (unitReturn) {\n if (matchedValue) return [parseFloat(value), matchedValue[2]]\n return [value, undefined]\n }\n\n if (matchedValue) return parseFloat(value)\n return value\n}) as StripUnit\n\nexport default stripUnit\n","import stripUnit from './stripUnit'\n\ntype CssUnits =\n | 'px'\n | 'rem'\n | '%'\n | 'em'\n | 'ex'\n | 'cm'\n | 'mm'\n | 'in'\n | 'pt'\n | 'pc'\n | 'ch'\n | 'vh'\n | 'vw'\n | 'vmin'\n | 'vmax'\n\nconst isNotValue = (val: unknown) => !val && val !== 0\n\nexport type Value = (\n param: string | number | null | undefined,\n rootSize?: number,\n outputUnit?: CssUnits,\n) => string | number | null\n\nconst value: Value = (param, rootSize = 16, outputUnit = 'rem'): string | number | null => {\n if (isNotValue(param)) return null\n\n // After the guard above, param is guaranteed to be string | number (non-null)\n const p = param as string | number\n\n const [val, unit] = stripUnit(p as string, true)\n if (isNotValue(val)) return null\n if (val === 0 || typeof val === 'string') return p\n\n const canConvert = rootSize && !Number.isNaN(val)\n if (canConvert && !unit && outputUnit === 'px') return `${val}${outputUnit}`\n if (canConvert && !unit) return `${val / rootSize}rem`\n if (canConvert && unit === 'px' && outputUnit === 'rem') return `${val / rootSize}rem`\n if (unit) return p\n\n return `${val}${outputUnit}`\n}\n\nexport default value\n","import value from './value'\n\ntype CssUnits =\n | 'px'\n | 'rem'\n | '%'\n | 'em'\n | 'ex'\n | 'cm'\n | 'mm'\n | 'in'\n | 'pt'\n | 'pc'\n | 'ch'\n | 'vh'\n | 'vw'\n | 'vmin'\n | 'vmax'\n\ntype GetValueOf = (...args: unknown[]) => number | string\nconst getValueOf: GetValueOf = (...args: any[]) =>\n args.find((v) => typeof v !== 'undefined' && v !== null)\n\nexport type Values = (\n items: unknown[],\n rootSize?: number,\n outputUnit?: CssUnits,\n) => string | number | null\n\nconst values: Values = (items, rootSize, outputUnit) => {\n const param = getValueOf(...items)\n\n if (Array.isArray(param)) {\n return param.map((item) => value(item, rootSize, outputUnit)).join(' ')\n }\n\n return value(param, rootSize, outputUnit)\n}\n\nexport default values\n","import { value } from '../../units'\n\ntype PropertyValue = string | number | null | undefined\ntype PV = PropertyValue\n\nconst isValidValue = (v: unknown) => !!v || v === 0\n\ntype CornerValues = {\n full: PV\n top: PV\n bottom: PV\n left: PV\n right: PV\n topLeft: PV\n topRight: PV\n bottomLeft: PV\n bottomRight: PV\n}\n\nconst hasAnyValue = (v: CornerValues) =>\n isValidValue(v.full) ||\n isValidValue(v.top) ||\n isValidValue(v.bottom) ||\n isValidValue(v.left) ||\n isValidValue(v.right) ||\n isValidValue(v.topLeft) ||\n isValidValue(v.topRight) ||\n isValidValue(v.bottomLeft) ||\n isValidValue(v.bottomRight)\n\nconst resolveCorners = (v: CornerValues) => {\n const corners: PV[] = [v.full, v.full, v.full, v.full]\n if (isValidValue(v.top)) {\n corners[0] = v.top\n corners[1] = v.top\n }\n if (isValidValue(v.bottom)) {\n corners[2] = v.bottom\n corners[3] = v.bottom\n }\n if (isValidValue(v.left)) {\n corners[0] = v.left\n corners[3] = v.left\n }\n if (isValidValue(v.right)) {\n corners[1] = v.right\n corners[2] = v.right\n }\n if (isValidValue(v.topLeft)) corners[0] = v.topLeft\n if (isValidValue(v.topRight)) corners[1] = v.topRight\n if (isValidValue(v.bottomRight)) corners[2] = v.bottomRight\n if (isValidValue(v.bottomLeft)) corners[3] = v.bottomLeft\n return corners\n}\n\nconst formatShorthand = (corners: PV[], calc: (p: PV) => any) => {\n const [tl, tr, br, bl] = corners\n if (corners.every((val, _, arr) => val === arr[0])) return `border-radius: ${calc(tl)};`\n if (tl === br && tr === bl) return `border-radius: ${calc(tl)} ${calc(tr)};`\n if (tl && tr === bl && br) return `border-radius: ${calc(tl)} ${calc(tr)} ${calc(br)};`\n return `border-radius: ${calc(tl)} ${calc(tr)} ${calc(br)} ${calc(bl)};`\n}\n\nconst CORNER_CSS = [\n 'border-top-left-radius',\n 'border-top-right-radius',\n 'border-bottom-right-radius',\n 'border-bottom-left-radius',\n] as const\n\nconst formatIndividual = (corners: PV[], calc: (p: PV) => any) => {\n let output = ''\n for (let i = 0; i < corners.length; i++) {\n if (isValidValue(corners[i])) output += `${CORNER_CSS[i]}: ${calc(corners[i])};`\n }\n return output\n}\n\nexport type BorderRadius = (rootSize?: number) => (props: CornerValues) => string | null\n\nconst borderRadius: BorderRadius = (rootSize) => (props) => {\n if (!hasAnyValue(props)) return null\n const calc = (param: PV) => value(param, rootSize)\n const corners = resolveCorners(props)\n if (corners.every((val) => isValidValue(val))) return formatShorthand(corners, calc)\n return formatIndividual(corners, calc)\n}\n\nexport default borderRadius\n","import { value } from '../../units'\n\ntype CssUnits =\n | 'px'\n | 'rem'\n | '%'\n | 'em'\n | 'ex'\n | 'cm'\n | 'mm'\n | 'in'\n | 'pt'\n | 'pc'\n | 'ch'\n | 'vh'\n | 'vw'\n | 'vmin'\n | 'vmax'\n\nconst isValidValue = (v: unknown) => !!v || v === 0\n\ntype Property = 'inset' | 'margin' | 'padding' | 'border-width' | 'border-style' | 'border-color'\ntype Value = string | number | null | undefined\ntype Side = 'top' | 'bottom' | 'left' | 'right'\n\ntype EdgeValues = {\n full: Value\n x: Value\n y: Value\n top: Value\n left: Value\n right: Value\n bottom: Value\n}\n\ntype Definitions = Record<Property, { unit?: CssUnits; edgeCss: (side: Side) => string }>\n\nconst definitions: Definitions = {\n inset: { unit: 'rem', edgeCss: (side) => side },\n margin: { unit: 'rem', edgeCss: (side) => `margin-${side}` },\n padding: { unit: 'rem', edgeCss: (side) => `padding-${side}` },\n 'border-width': { unit: 'px', edgeCss: (side) => `border-${side}-width` },\n 'border-style': { edgeCss: (side) => `border-${side}-style` },\n 'border-color': { edgeCss: (side) => `border-${side}-color` },\n}\n\nconst hasAnyValue = (vals: EdgeValues) =>\n isValidValue(vals.top) ||\n isValidValue(vals.bottom) ||\n isValidValue(vals.left) ||\n isValidValue(vals.right) ||\n isValidValue(vals.x) ||\n isValidValue(vals.y) ||\n isValidValue(vals.full)\n\nconst resolveSides = ({ full, x, y, top, left, right, bottom }: EdgeValues) => {\n const sides: Value[] = [full, full, full, full]\n if (isValidValue(x)) {\n sides[1] = x\n sides[3] = x\n }\n if (isValidValue(y)) {\n sides[0] = y\n sides[2] = y\n }\n if (isValidValue(top)) sides[0] = top\n if (isValidValue(right)) sides[1] = right\n if (isValidValue(bottom)) sides[2] = bottom\n if (isValidValue(left)) sides[3] = left\n return sides\n}\n\nconst formatShorthand = (property: Property, sides: Value[], calc: (v: Value) => Value) => {\n const [t, r, b, l] = sides\n if (sides.every((val, _, arr) => val === arr[0])) return `${property}: ${calc(t)};`\n if (t === b && r === l) return `${property}: ${calc(t)} ${calc(r)};`\n if (t && r === l && b) return `${property}: ${calc(t)} ${calc(r)} ${calc(b)};`\n return `${property}: ${calc(t)} ${calc(r)} ${calc(b)} ${calc(l)};`\n}\n\nconst formatIndividual = (\n sides: Value[],\n edgeCss: (side: Side) => string,\n calc: (v: Value) => Value,\n) => {\n const [t, r, b, l] = sides\n let output = ''\n if (isValidValue(t)) output += `${edgeCss('top')}: ${calc(t)};`\n if (isValidValue(b)) output += `${edgeCss('bottom')}: ${calc(b)};`\n if (isValidValue(l)) output += `${edgeCss('left')}: ${calc(l)};`\n if (isValidValue(r)) output += `${edgeCss('right')}: ${calc(r)};`\n return output\n}\n\nexport type Edge = (rootSize?: number) => (property: Property, values: EdgeValues) => string | null\n\nconst edge: Edge =\n (rootSize = 16) =>\n (property, values) => {\n if (!hasAnyValue(values)) return null\n const { unit, edgeCss } = definitions[property]\n const calc = (param: Value) => (unit ? value(param, rootSize, unit) : param)\n const sides = resolveSides(values)\n if (sides.every((val) => isValidValue(val))) return formatShorthand(property, sides, calc)\n return formatIndividual(sides, edgeCss, calc)\n }\n\nexport default edge\n","import type { Values } from '../../units/values'\nimport type { BorderRadius } from '../shorthands/borderRadius'\nimport type { Edge } from '../shorthands/edge'\nimport type { PropertyDescriptor } from './propertyMap'\nimport type { InnerTheme } from './types'\n\ntype Css = (strings: TemplateStringsArray, ...values: any[]) => any\ntype Calc = (...params: any[]) => ReturnType<Values>\n\n/** Mirrors the Value / PropertyValue types used by edge and borderRadius shorthands. */\ntype Value = string | number | null | undefined\n\nconst toCssDecl = (css: string, v: unknown) => (v == null ? '' : `${css}: ${v};`)\n\n/**\n * Converts a single property descriptor + theme values into a CSS fragment.\n *\n * - `simple` — pass-through (no unit conversion)\n * - `convert` — number→rem via `calc()`\n * - `convert_fallback` — picks first non-null from multiple theme keys, then converts\n * - `edge` — delegates to the edge shorthand (margin, padding, inset, border-*)\n * - `border_radius` — delegates to the border-radius shorthand\n * - `special` — one-off logic (fullScreen, backgroundImage url wrapping, animation combo, etc.)\n *\n * IMPORTANT: special cases MUST return `css` tagged-template results,\n * NOT plain strings. The caller (styles/index.ts) embeds these in another\n * `css` template, and the interpolation chain requires template results\n * for correct nesting of pseudo-selectors, media queries, and @layer\n * wrapping. A previous \"optimization\" returned plain strings which broke\n * responsive styles, hover states, and media-query generation.\n */\nconst processSpecial = (\n d: Extract<PropertyDescriptor, { kind: 'special' }>,\n t: InnerTheme,\n css: Css,\n): string | ReturnType<typeof css> => {\n switch (d.id) {\n case 'fullScreen':\n if (!t.fullScreen) return ''\n return css`\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n `\n\n case 'backgroundImage':\n if (!t.backgroundImage) return ''\n return css`\n background-image: url(${t.backgroundImage});\n `\n\n case 'animation': {\n const parts = [t.keyframe, t.animation].filter(Boolean).join(' ')\n return parts ? `animation: ${parts};` : ''\n }\n\n case 'hideEmpty':\n if (!t.hideEmpty) return ''\n return css`\n &:empty {\n display: none;\n }\n `\n\n case 'clearFix':\n if (!t.clearFix) return ''\n return css`\n &::after {\n clear: both;\n content: '';\n display: table;\n }\n `\n\n case 'extendCss':\n return (t.extendCss as string | undefined) ?? ''\n\n default:\n return ''\n }\n}\n\nconst processDescriptor = (\n d: PropertyDescriptor,\n t: InnerTheme,\n css: Css,\n calc: Calc,\n shorthand: ReturnType<Edge>,\n borderRadiusFn: ReturnType<BorderRadius>,\n): string | ReturnType<typeof css> => {\n switch (d.kind) {\n case 'simple':\n return toCssDecl(d.css, t[d.key])\n\n case 'convert':\n return toCssDecl(d.css, calc(t[d.key]))\n\n case 'convert_fallback':\n return toCssDecl(d.css, calc(...d.keys.map((k) => t[k])))\n\n case 'edge':\n return (\n shorthand(d.property, {\n full: t[d.keys.full] as Value,\n x: t[d.keys.x] as Value,\n y: t[d.keys.y] as Value,\n top: t[d.keys.top] as Value,\n left: t[d.keys.left] as Value,\n bottom: t[d.keys.bottom] as Value,\n right: t[d.keys.right] as Value,\n }) ?? ''\n )\n\n case 'border_radius':\n return (\n borderRadiusFn({\n full: t[d.keys.full] as Value,\n top: t[d.keys.top] as Value,\n bottom: t[d.keys.bottom] as Value,\n left: t[d.keys.left] as Value,\n right: t[d.keys.right] as Value,\n topLeft: t[d.keys.topLeft] as Value,\n topRight: t[d.keys.topRight] as Value,\n bottomLeft: t[d.keys.bottomLeft] as Value,\n bottomRight: t[d.keys.bottomRight] as Value,\n }) ?? ''\n )\n\n case 'special':\n return processSpecial(d, t, css)\n }\n}\n\nexport default processDescriptor\n","import type { InnerTheme } from './types'\n\ntype EdgeProperty =\n | 'inset'\n | 'margin'\n | 'padding'\n | 'border-width'\n | 'border-style'\n | 'border-color'\n\ntype EdgeKeys = {\n full: keyof InnerTheme\n x: keyof InnerTheme\n y: keyof InnerTheme\n top: keyof InnerTheme\n left: keyof InnerTheme\n bottom: keyof InnerTheme\n right: keyof InnerTheme\n}\n\ntype BorderRadiusKeys = {\n full: keyof InnerTheme\n top: keyof InnerTheme\n bottom: keyof InnerTheme\n left: keyof InnerTheme\n right: keyof InnerTheme\n topLeft: keyof InnerTheme\n topRight: keyof InnerTheme\n bottomLeft: keyof InnerTheme\n bottomRight: keyof InnerTheme\n}\n\nexport type PropertyDescriptor =\n | { kind: 'simple'; css: string; key: keyof InnerTheme }\n | { kind: 'convert'; css: string; key: keyof InnerTheme }\n | { kind: 'convert_fallback'; css: string; keys: (keyof InnerTheme)[] }\n | { kind: 'edge'; property: EdgeProperty; keys: EdgeKeys }\n | { kind: 'border_radius'; keys: BorderRadiusKeys }\n | { kind: 'special'; id: string }\n\nconst propertyMap: PropertyDescriptor[] = [\n // SPECIAL: fullScreen\n { kind: 'special', id: 'fullScreen' },\n\n // POSITION\n { kind: 'simple', css: 'all', key: 'all' },\n { kind: 'simple', css: 'display', key: 'display' },\n { kind: 'simple', css: 'position', key: 'position' },\n { kind: 'simple', css: 'box-sizing', key: 'boxSizing' },\n { kind: 'simple', css: 'float', key: 'float' },\n\n // INSET\n {\n kind: 'edge',\n property: 'inset',\n keys: {\n full: 'inset',\n x: 'insetX',\n y: 'insetY',\n top: 'top',\n left: 'left',\n bottom: 'bottom',\n right: 'right',\n },\n },\n\n // SIZING\n { kind: 'convert_fallback', css: 'width', keys: ['width', 'size'] },\n { kind: 'convert_fallback', css: 'min-width', keys: ['minWidth', 'minSize'] },\n { kind: 'convert_fallback', css: 'max-width', keys: ['maxWidth', 'maxSize'] },\n { kind: 'convert_fallback', css: 'height', keys: ['height', 'size'] },\n { kind: 'convert_fallback', css: 'min-height', keys: ['minHeight', 'minSize'] },\n { kind: 'convert_fallback', css: 'max-height', keys: ['maxHeight', 'maxSize'] },\n { kind: 'convert', css: 'gap', key: 'gap' },\n { kind: 'simple', css: 'aspect-ratio', key: 'aspectRatio' },\n { kind: 'simple', css: 'contain', key: 'contain' },\n { kind: 'simple', css: 'container-type', key: 'containerType' },\n { kind: 'simple', css: 'container-name', key: 'containerName' },\n { kind: 'simple', css: 'container', key: 'container' },\n { kind: 'convert', css: 'inline-size', key: 'inlineSize' },\n { kind: 'convert', css: 'block-size', key: 'blockSize' },\n { kind: 'convert', css: 'min-inline-size', key: 'minInlineSize' },\n { kind: 'convert', css: 'min-block-size', key: 'minBlockSize' },\n { kind: 'convert', css: 'max-inline-size', key: 'maxInlineSize' },\n { kind: 'convert', css: 'max-block-size', key: 'maxBlockSize' },\n\n // SPACING\n {\n kind: 'edge',\n property: 'margin',\n keys: {\n full: 'margin',\n x: 'marginX',\n y: 'marginY',\n top: 'marginTop',\n left: 'marginLeft',\n bottom: 'marginBottom',\n right: 'marginRight',\n },\n },\n {\n kind: 'edge',\n property: 'padding',\n keys: {\n full: 'padding',\n x: 'paddingX',\n y: 'paddingY',\n top: 'paddingTop',\n left: 'paddingLeft',\n bottom: 'paddingBottom',\n right: 'paddingRight',\n },\n },\n\n // Logical spacing\n { kind: 'convert', css: 'margin-inline', key: 'marginInline' },\n { kind: 'convert', css: 'margin-inline-start', key: 'marginInlineStart' },\n { kind: 'convert', css: 'margin-inline-end', key: 'marginInlineEnd' },\n { kind: 'convert', css: 'margin-block', key: 'marginBlock' },\n { kind: 'convert', css: 'margin-block-start', key: 'marginBlockStart' },\n { kind: 'convert', css: 'margin-block-end', key: 'marginBlockEnd' },\n { kind: 'convert', css: 'padding-inline', key: 'paddingInline' },\n { kind: 'convert', css: 'padding-inline-start', key: 'paddingInlineStart' },\n { kind: 'convert', css: 'padding-inline-end', key: 'paddingInlineEnd' },\n { kind: 'convert', css: 'padding-block', key: 'paddingBlock' },\n { kind: 'convert', css: 'padding-block-start', key: 'paddingBlockStart' },\n { kind: 'convert', css: 'padding-block-end', key: 'paddingBlockEnd' },\n\n // Logical inset\n { kind: 'convert', css: 'inset-inline', key: 'insetInline' },\n { kind: 'convert', css: 'inset-inline-start', key: 'insetInlineStart' },\n { kind: 'convert', css: 'inset-inline-end', key: 'insetInlineEnd' },\n { kind: 'convert', css: 'inset-block', key: 'insetBlock' },\n { kind: 'convert', css: 'inset-block-start', key: 'insetBlockStart' },\n { kind: 'convert', css: 'inset-block-end', key: 'insetBlockEnd' },\n\n // FLEX\n { kind: 'simple', css: 'align-content', key: 'alignContent' },\n { kind: 'simple', css: 'align-items', key: 'alignItems' },\n { kind: 'simple', css: 'align-self', key: 'alignSelf' },\n { kind: 'simple', css: 'flex', key: 'flex' },\n { kind: 'simple', css: 'flex-basis', key: 'flexBasis' },\n { kind: 'simple', css: 'flex-direction', key: 'flexDirection' },\n { kind: 'simple', css: 'flex-flow', key: 'flexFlow' },\n { kind: 'simple', css: 'flex-grow', key: 'flexGrow' },\n { kind: 'simple', css: 'flex-shrink', key: 'flexShrink' },\n { kind: 'simple', css: 'flex-wrap', key: 'flexWrap' },\n { kind: 'simple', css: 'justify-content', key: 'justifyContent' },\n { kind: 'simple', css: 'justify-items', key: 'justifyItems' },\n { kind: 'simple', css: 'justify-self', key: 'justifySelf' },\n { kind: 'simple', css: 'place-items', key: 'placeItems' },\n { kind: 'simple', css: 'place-content', key: 'placeContent' },\n { kind: 'simple', css: 'place-self', key: 'placeSelf' },\n { kind: 'convert', css: 'row-gap', key: 'rowGap' },\n { kind: 'convert', css: 'column-gap', key: 'columnGap' },\n\n // GRID\n { kind: 'simple', css: 'grid', key: 'grid' },\n { kind: 'simple', css: 'grid-area', key: 'gridArea' },\n { kind: 'convert', css: 'grid-auto-columns', key: 'gridAutoColumns' },\n { kind: 'simple', css: 'grid-auto-flow', key: 'gridAutoFlow' },\n { kind: 'convert', css: 'grid-auto-rows', key: 'gridAutoRows' },\n { kind: 'simple', css: 'grid-column', key: 'gridColumn' },\n { kind: 'simple', css: 'grid-column-end', key: 'gridColumnEnd' },\n { kind: 'convert', css: 'grid-column-gap', key: 'gridColumnGap' },\n { kind: 'convert', css: 'grid-column-start', key: 'gridColumnStart' },\n { kind: 'convert', css: 'grid-gap', key: 'gridGap' },\n { kind: 'simple', css: 'grid-row', key: 'gridRow' },\n { kind: 'simple', css: 'grid-row-start', key: 'gridRowStart' },\n { kind: 'simple', css: 'grid-row-end', key: 'gridRowEnd' },\n { kind: 'convert', css: 'grid-row-gap', key: 'gridRowGap' },\n { kind: 'simple', css: 'grid-template', key: 'gridTemplate' },\n { kind: 'simple', css: 'grid-template-areas', key: 'gridTemplateAreas' },\n { kind: 'simple', css: 'grid-template-columns', key: 'gridTemplateColumns' },\n { kind: 'simple', css: 'grid-template-rows', key: 'gridTemplateRows' },\n\n // POSITIONING\n { kind: 'simple', css: 'object-fit', key: 'objectFit' },\n { kind: 'simple', css: 'object-position', key: 'objectPosition' },\n { kind: 'simple', css: 'order', key: 'order' },\n { kind: 'simple', css: 'opacity', key: 'opacity' },\n { kind: 'simple', css: 'resize', key: 'resize' },\n { kind: 'simple', css: 'vertical-align', key: 'verticalAlign' },\n\n // FONT & TEXT\n { kind: 'simple', css: 'line-height', key: 'lineHeight' },\n { kind: 'simple', css: 'font', key: 'font' },\n { kind: 'simple', css: 'font-family', key: 'fontFamily' },\n { kind: 'convert', css: 'font-size', key: 'fontSize' },\n { kind: 'convert', css: 'font-size-adjust', key: 'fontSizeAdjust' },\n { kind: 'convert', css: 'font-stretch', key: 'fontStretch' },\n { kind: 'simple', css: 'font-style', key: 'fontStyle' },\n { kind: 'simple', css: 'font-variant', key: 'fontVariant' },\n { kind: 'simple', css: 'font-weight', key: 'fontWeight' },\n { kind: 'simple', css: 'font-kerning', key: 'fontKerning' },\n { kind: 'simple', css: 'font-feature-settings', key: 'fontFeatureSettings' },\n { kind: 'simple', css: 'font-variation-settings', key: 'fontVariationSettings' },\n { kind: 'simple', css: 'font-optical-sizing', key: 'fontOpticalSizing' },\n { kind: 'simple', css: 'text-align', key: 'textAlign' },\n { kind: 'simple', css: 'text-align-last', key: 'textAlignLast' },\n { kind: 'simple', css: 'text-transform', key: 'textTransform' },\n { kind: 'simple', css: 'text-decoration', key: 'textDecoration' },\n { kind: 'simple', css: 'text-decoration-color', key: 'textDecorationColor' },\n { kind: 'simple', css: 'text-decoration-line', key: 'textDecorationLine' },\n { kind: 'simple', css: 'text-decoration-style', key: 'textDecorationStyle' },\n { kind: 'simple', css: 'text-decoration-thickness', key: 'textDecorationThickness' },\n { kind: 'simple', css: 'text-underline-offset', key: 'textUnderlineOffset' },\n { kind: 'simple', css: 'text-emphasis', key: 'textEmphasis' },\n { kind: 'simple', css: 'text-emphasis-color', key: 'textEmphasisColor' },\n { kind: 'simple', css: 'text-emphasis-style', key: 'textEmphasisStyle' },\n { kind: 'simple', css: 'letter-spacing', key: 'letterSpacing' },\n { kind: 'simple', css: 'word-spacing', key: 'wordSpacing' },\n { kind: 'simple', css: 'text-indent', key: 'textIndent' },\n { kind: 'simple', css: 'text-justify', key: 'textJustify' },\n { kind: 'simple', css: 'text-overflow', key: 'textOverflow' },\n { kind: 'simple', css: 'text-shadow', key: 'textShadow' },\n { kind: 'simple', css: 'text-wrap', key: 'textWrap' },\n { kind: 'simple', css: 'text-rendering', key: 'textRendering' },\n { kind: 'simple', css: 'white-space', key: 'whiteSpace' },\n { kind: 'simple', css: 'word-break', key: 'wordBreak' },\n { kind: 'simple', css: 'word-wrap', key: 'wordWrap' },\n { kind: 'simple', css: 'writing-mode', key: 'writingMode' },\n { kind: 'simple', css: 'direction', key: 'direction' },\n { kind: 'simple', css: 'hyphens', key: 'hyphens' },\n\n // LIST\n { kind: 'simple', css: 'list-style', key: 'listStyle' },\n { kind: 'simple', css: 'list-style-image', key: 'listStyleImage' },\n { kind: 'simple', css: 'list-style-position', key: 'listStylePosition' },\n { kind: 'simple', css: 'list-style-type', key: 'listStyleType' },\n\n // BACKGROUND & COLORS\n { kind: 'simple', css: 'color', key: 'color' },\n { kind: 'simple', css: 'background', key: 'background' },\n { kind: 'simple', css: 'background-color', key: 'backgroundColor' },\n { kind: 'special', id: 'backgroundImage' },\n { kind: 'simple', css: 'background-attachment', key: 'backgroundAttachment' },\n { kind: 'simple', css: 'background-clip', key: 'backgroundClip' },\n { kind: 'simple', css: 'background-origin', key: 'backgroundOrigin' },\n { kind: 'simple', css: 'background-position', key: 'backgroundPosition' },\n { kind: 'simple', css: 'background-repeat', key: 'backgroundRepeat' },\n { kind: 'simple', css: 'background-size', key: 'backgroundSize' },\n\n // BORDERS\n {\n kind: 'border_radius',\n keys: {\n full: 'borderRadius',\n top: 'borderRadiusTop',\n bottom: 'borderRadiusBottom',\n left: 'borderRadiusLeft',\n right: 'borderRadiusRight',\n topLeft: 'borderRadiusTopLeft',\n topRight: 'borderRadiusTopRight',\n bottomLeft: 'borderRadiusBottomLeft',\n bottomRight: 'borderRadiusBottomRight',\n },\n },\n { kind: 'simple', css: 'border', key: 'border' },\n { kind: 'simple', css: 'border-top', key: 'borderTop' },\n { kind: 'simple', css: 'border-bottom', key: 'borderBottom' },\n { kind: 'simple', css: 'border-left', key: 'borderLeft' },\n { kind: 'simple', css: 'border-right', key: 'borderRight' },\n {\n kind: 'edge',\n property: 'border-width',\n keys: {\n full: 'borderWidth',\n x: 'borderWidthX',\n y: 'borderWidthY',\n top: 'borderWidthTop',\n left: 'borderWidthLeft',\n bottom: 'borderWidthBottom',\n right: 'borderWidthRight',\n },\n },\n {\n kind: 'edge',\n property: 'border-style',\n keys: {\n full: 'borderStyle',\n x: 'borderStyleX',\n y: 'borderStyleY',\n top: 'borderStyleTop',\n left: 'borderStyleLeft',\n bottom: 'borderStyleBottom',\n right: 'borderStyleRight',\n },\n },\n {\n kind: 'edge',\n property: 'border-color',\n keys: {\n full: 'borderColor',\n x: 'borderColorX',\n y: 'borderColorY',\n top: 'borderColorTop',\n left: 'borderColorLeft',\n bottom: 'borderColorBottom',\n right: 'borderColorRight',\n },\n },\n { kind: 'simple', css: 'border-image', key: 'borderImage' },\n { kind: 'simple', css: 'border-image-outset', key: 'borderImageOutset' },\n { kind: 'simple', css: 'border-image-repeat', key: 'borderImageRepeat' },\n { kind: 'simple', css: 'border-image-slice', key: 'borderImageSlice' },\n { kind: 'simple', css: 'border-image-source', key: 'borderImageSource' },\n { kind: 'simple', css: 'border-image-width', key: 'borderImageWidth' },\n { kind: 'simple', css: 'border-spacing', key: 'borderSpacing' },\n\n { kind: 'simple', css: 'border-collapse', key: 'borderCollapse' },\n\n // Logical borders\n { kind: 'simple', css: 'border-inline', key: 'borderInline' },\n { kind: 'simple', css: 'border-block', key: 'borderBlock' },\n { kind: 'simple', css: 'border-inline-start', key: 'borderInlineStart' },\n { kind: 'simple', css: 'border-inline-end', key: 'borderInlineEnd' },\n { kind: 'simple', css: 'border-block-start', key: 'borderBlockStart' },\n { kind: 'simple', css: 'border-block-end', key: 'borderBlockEnd' },\n\n // VISUAL EFFECTS\n { kind: 'simple', css: 'backface-visibility', key: 'backfaceVisibility' },\n { kind: 'simple', css: 'box-shadow', key: 'boxShadow' },\n { kind: 'simple', css: 'filter', key: 'filter' },\n { kind: 'simple', css: 'backdrop-filter', key: 'backdropFilter' },\n { kind: 'simple', css: 'mix-blend-mode', key: 'mixBlendMode' },\n { kind: 'simple', css: 'background-blend-mode', key: 'backgroundBlendMode' },\n { kind: 'simple', css: 'isolation', key: 'isolation' },\n { kind: 'simple', css: 'outline', key: 'outline' },\n { kind: 'simple', css: 'outline-color', key: 'outlineColor' },\n { kind: 'simple', css: 'outline-offset', key: 'outlineOffset' },\n { kind: 'simple', css: 'outline-style', key: 'outlineStyle' },\n { kind: 'simple', css: 'outline-width', key: 'outlineWidth' },\n\n // ANIMATIONS\n { kind: 'special', id: 'animation' },\n { kind: 'simple', css: 'animation-name', key: 'animationName' },\n { kind: 'simple', css: 'animation-duration', key: 'animationDuration' },\n { kind: 'simple', css: 'animation-timing-function', key: 'animationTimingFunction' },\n { kind: 'simple', css: 'animation-delay', key: 'animationDelay' },\n { kind: 'simple', css: 'animation-iteration-count', key: 'animationIterationCount' },\n { kind: 'simple', css: 'animation-direction', key: 'animationDirection' },\n { kind: 'simple', css: 'animation-fill-mode', key: 'animationFillMode' },\n { kind: 'simple', css: 'animation-play-state', key: 'animationPlayState' },\n { kind: 'simple', css: 'transition', key: 'transition' },\n { kind: 'simple', css: 'transition-delay', key: 'transitionDelay' },\n { kind: 'simple', css: 'transition-duration', key: 'transitionDuration' },\n { kind: 'simple', css: 'transition-property', key: 'transitionProperty' },\n { kind: 'simple', css: 'transition-timing-function', key: 'transitionTimingFunction' },\n\n // TRANSFORM\n { kind: 'simple', css: 'transform', key: 'transform' },\n { kind: 'simple', css: 'transform-origin', key: 'transformOrigin' },\n { kind: 'simple', css: 'transform-style', key: 'transformStyle' },\n { kind: 'simple', css: 'translate', key: 'translate' },\n { kind: 'simple', css: 'rotate', key: 'rotate' },\n { kind: 'simple', css: 'scale', key: 'scale' },\n { kind: 'simple', css: 'will-change', key: 'willChange' },\n\n // SCROLL\n { kind: 'simple', css: 'scroll-behavior', key: 'scrollBehavior' },\n { kind: 'simple', css: 'scroll-snap-type', key: 'scrollSnapType' },\n { kind: 'simple', css: 'scroll-snap-align', key: 'scrollSnapAlign' },\n { kind: 'simple', css: 'scroll-snap-stop', key: 'scrollSnapStop' },\n { kind: 'simple', css: 'scroll-margin', key: 'scrollMargin' },\n { kind: 'simple', css: 'scroll-padding', key: 'scrollPadding' },\n { kind: 'simple', css: 'overscroll-behavior', key: 'overscrollBehavior' },\n { kind: 'simple', css: 'overscroll-behavior-x', key: 'overscrollBehaviorX' },\n { kind: 'simple', css: 'overscroll-behavior-y', key: 'overscrollBehaviorY' },\n\n // INTERACTION\n { kind: 'simple', css: 'cursor', key: 'cursor' },\n { kind: 'simple', css: 'pointer-events', key: 'pointerEvents' },\n { kind: 'simple', css: 'user-select', key: 'userSelect' },\n { kind: 'simple', css: 'touch-action', key: 'touchAction' },\n { kind: 'simple', css: 'scrollbar-width', key: 'scrollbarWidth' },\n { kind: 'simple', css: 'scrollbar-color', key: 'scrollbarColor' },\n { kind: 'simple', css: 'scrollbar-gutter', key: 'scrollbarGutter' },\n { kind: 'simple', css: 'caret-color', key: 'caretColor' },\n { kind: 'simple', css: 'accent-color', key: 'accentColor' },\n { kind: 'simple', css: 'color-scheme', key: 'colorScheme' },\n\n // OTHER\n { kind: 'simple', css: 'caption-side', key: 'captionSide' },\n { kind: 'simple', css: 'clear', key: 'clear' },\n { kind: 'simple', css: 'clip', key: 'clip' },\n { kind: 'simple', css: 'clip-path', key: 'clipPath' },\n { kind: 'simple', css: 'content', key: 'content' },\n { kind: 'simple', css: 'content-visibility', key: 'contentVisibility' },\n { kind: 'simple', css: 'counter-increment', key: 'counterIncrement' },\n { kind: 'simple', css: 'counter-reset', key: 'counterReset' },\n { kind: 'simple', css: 'empty-cells', key: 'emptyCells' },\n { kind: 'simple', css: 'z-index', key: 'zIndex' },\n { kind: 'simple', css: 'overflow', key: 'overflow' },\n { kind: 'simple', css: 'overflow-wrap', key: 'overflowWrap' },\n { kind: 'simple', css: 'overflow-x', key: 'overflowX' },\n { kind: 'simple', css: 'overflow-y', key: 'overflowY' },\n { kind: 'simple', css: 'perspective', key: 'perspective' },\n { kind: 'simple', css: 'perspective-origin', key: 'perspectiveOrigin' },\n { kind: 'simple', css: 'quotes', key: 'quotes' },\n { kind: 'simple', css: 'tab-size', key: 'tabSize' },\n { kind: 'simple', css: 'table-layout', key: 'tableLayout' },\n { kind: 'simple', css: 'visibility', key: 'visibility' },\n { kind: 'simple', css: 'appearance', key: 'appearance' },\n { kind: 'simple', css: 'image-rendering', key: 'imageRendering' },\n\n // Masks\n { kind: 'simple', css: 'mask-image', key: 'maskImage' },\n { kind: 'simple', css: 'mask-size', key: 'maskSize' },\n { kind: 'simple', css: 'mask-position', key: 'maskPosition' },\n { kind: 'simple', css: 'mask-repeat', key: 'maskRepeat' },\n\n // Shapes\n { kind: 'simple', css: 'shape-outside', key: 'shapeOutside' },\n { kind: 'simple', css: 'shape-margin', key: 'shapeMargin' },\n { kind: 'simple', css: 'shape-image-threshold', key: 'shapeImageThreshold' },\n\n // Columns\n { kind: 'simple', css: 'column-count', key: 'columnCount' },\n { kind: 'simple', css: 'column-width', key: 'columnWidth' },\n { kind: 'simple', css: 'column-rule', key: 'columnRule' },\n { kind: 'simple', css: 'columns', key: 'columns' },\n\n // Fragmentation\n { kind: 'simple', css: 'break-before', key: 'breakBefore' },\n { kind: 'simple', css: 'break-after', key: 'breakAfter' },\n { kind: 'simple', css: 'break-inside', key: 'breakInside' },\n { kind: 'simple', css: 'orphans', key: 'orphans' },\n { kind: 'simple', css: 'widows', key: 'widows' },\n { kind: 'simple', css: 'print-color-adjust', key: 'printColorAdjust' },\n\n // CUSTOM ATTRIBUTES\n { kind: 'special', id: 'hideEmpty' },\n { kind: 'special', id: 'clearFix' },\n { kind: 'special', id: 'extendCss' },\n]\n\nexport default propertyMap\n","import { values } from '../../units'\nimport { borderRadius, edge } from '../shorthands'\nimport processDescriptor from './processDescriptor'\nimport propertyMap from './propertyMap'\nimport type { ITheme, InnerTheme, Theme } from './types'\n\nexport type { ITheme, Theme as StylesTheme }\n\ntype Css = (strings: TemplateStringsArray, ...args: any[]) => any\n\nexport type Styles = ({\n theme,\n css,\n rootSize,\n globalTheme,\n}: {\n theme: InnerTheme\n css: Css\n rootSize?: number | undefined\n globalTheme?: Record<string, any> | undefined\n}) => ReturnType<Css>\n\n/**\n * Data-driven style processor. Iterates the `propertyMap` descriptors\n * and delegates each to `processDescriptor`, which maps theme values\n * to CSS strings. The result is a single `css` tagged-template literal\n * containing all non-null property outputs.\n *\n * IMPORTANT: the return MUST be wrapped in `css\\`...\\`` — NOT a plain\n * string join. makeItResponsive embeds this result in another template\n * literal, and the CSS interpolation chain requires a css template\n * result (not a raw string) for correct nesting of media queries,\n * pseudo-selectors, and @layer wrapping. A previous version returned\n * `fragments.filter(Boolean).join(' ')` which broke responsive styles,\n * hover states, and layer cascade ordering.\n */\nconst styles: Styles = ({ theme: t, css, rootSize }) => {\n const calc = (...params: any[]) => values(params, rootSize)\n const shorthand = edge(rootSize)\n const borderRadiusFn = borderRadius(rootSize)\n\n const fragments = propertyMap.map((d) =>\n processDescriptor(d, t, css, calc, shorthand, borderRadiusFn),\n )\n\n return css`\n ${fragments}\n `\n}\n\nexport default styles\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pyreon/unistyle",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.14",
|
|
4
4
|
"description": "Responsive theming and breakpoint utilities for Pyreon",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -35,19 +35,22 @@
|
|
|
35
35
|
"build:watch": "bun run vl_rolldown_build-watch",
|
|
36
36
|
"lint": "oxlint .",
|
|
37
37
|
"test": "vitest run",
|
|
38
|
+
"test:browser": "vitest run --config ./vitest.browser.config.ts",
|
|
38
39
|
"test:coverage": "vitest run --coverage",
|
|
39
40
|
"test:watch": "vitest",
|
|
40
41
|
"typecheck": "tsc --noEmit"
|
|
41
42
|
},
|
|
42
43
|
"devDependencies": {
|
|
43
|
-
"@pyreon/
|
|
44
|
+
"@pyreon/test-utils": "^0.12.10",
|
|
45
|
+
"@pyreon/typescript": "^0.12.14",
|
|
46
|
+
"@vitest/browser-playwright": "^4.1.4",
|
|
44
47
|
"@vitus-labs/tools-rolldown": "^1.15.3"
|
|
45
48
|
},
|
|
46
49
|
"peerDependencies": {
|
|
47
|
-
"@pyreon/core": "^0.12.
|
|
48
|
-
"@pyreon/reactivity": "^0.12.
|
|
49
|
-
"@pyreon/styler": "^0.12.
|
|
50
|
-
"@pyreon/ui-core": "^0.12.
|
|
50
|
+
"@pyreon/core": "^0.12.14",
|
|
51
|
+
"@pyreon/reactivity": "^0.12.14",
|
|
52
|
+
"@pyreon/styler": "^0.12.14",
|
|
53
|
+
"@pyreon/ui-core": "^0.12.14"
|
|
51
54
|
},
|
|
52
55
|
"engines": {
|
|
53
56
|
"node": ">= 22"
|
|
@@ -152,7 +152,9 @@ describe('processDescriptor', () => {
|
|
|
152
152
|
mockEdge as any,
|
|
153
153
|
mockBorderRadius as any,
|
|
154
154
|
)
|
|
155
|
-
|
|
155
|
+
// Result is a css`` template result — normalize whitespace
|
|
156
|
+
const normalized = String(result).replace(/\s+/g, ' ').trim()
|
|
157
|
+
expect(normalized).toContain('background-image: url(url.png);')
|
|
156
158
|
})
|
|
157
159
|
|
|
158
160
|
it('returns animation CSS when keyframe is set', () => {
|
|
@@ -175,7 +175,12 @@ describe('optimizeTheme', () => {
|
|
|
175
175
|
expect(optimizeTheme({ theme: {}, breakpoints: bpKeys })).toEqual({})
|
|
176
176
|
})
|
|
177
177
|
|
|
178
|
-
it('
|
|
178
|
+
it('keeps entire breakpoint when ANY property differs from previous (all-or-nothing)', () => {
|
|
179
|
+
// Simple all-or-nothing: if the breakpoint differs from the previous
|
|
180
|
+
// one AT ALL (via shallow comparison), emit the ENTIRE breakpoint.
|
|
181
|
+
// Matches reference implementation and original monorepo-migration
|
|
182
|
+
// version. Previous per-property "optimizations" broke shorthand/
|
|
183
|
+
// longhand interactions and property ordering guarantees.
|
|
179
184
|
const theme = {
|
|
180
185
|
xs: { maxWidth: '90%', height: '100%' },
|
|
181
186
|
sm: { maxWidth: '33.75rem', height: '100%' },
|
|
@@ -183,24 +188,25 @@ describe('optimizeTheme', () => {
|
|
|
183
188
|
lg: { maxWidth: '58.75rem', height: '100%' },
|
|
184
189
|
}
|
|
185
190
|
const result = optimizeTheme({ theme, breakpoints: bpKeys })
|
|
186
|
-
// xs: full object (first breakpoint — baseline)
|
|
187
191
|
expect(result.xs).toEqual({ maxWidth: '90%', height: '100%' })
|
|
188
|
-
//
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
expect(result.
|
|
192
|
+
// Full breakpoints kept — height IS duplicated but that's correct:
|
|
193
|
+
// the browser cascades one media query's properties independently,
|
|
194
|
+
// and partial property emission breaks shorthand/longhand ordering.
|
|
195
|
+
expect(result.sm).toEqual({ maxWidth: '33.75rem', height: '100%' })
|
|
196
|
+
expect(result.md).toEqual({ maxWidth: '43.75rem', height: '100%' })
|
|
197
|
+
expect(result.lg).toEqual({ maxWidth: '58.75rem', height: '100%' })
|
|
192
198
|
})
|
|
193
199
|
|
|
194
|
-
it('drops breakpoint when
|
|
200
|
+
it('drops breakpoint when FULLY identical to previous (shallowEqual)', () => {
|
|
195
201
|
const theme = {
|
|
196
202
|
xs: { color: 'red', size: 12 },
|
|
197
|
-
sm: { color: 'red', size: 12 },
|
|
198
|
-
md: { color: 'blue', size: 12 },
|
|
203
|
+
sm: { color: 'red', size: 12 }, // identical to xs — dropped
|
|
204
|
+
md: { color: 'blue', size: 12 }, // differs → full breakpoint kept
|
|
199
205
|
}
|
|
200
206
|
const result = optimizeTheme({ theme, breakpoints: bpKeys })
|
|
201
207
|
expect(result.xs).toEqual({ color: 'red', size: 12 })
|
|
202
|
-
expect(result.sm).toBeUndefined()
|
|
203
|
-
expect(result.md).toEqual({ color: 'blue' })
|
|
208
|
+
expect(result.sm).toBeUndefined()
|
|
209
|
+
expect(result.md).toEqual({ color: 'blue', size: 12 })
|
|
204
210
|
})
|
|
205
211
|
|
|
206
212
|
it('emits full breakpoint when keys differ (property added/removed)', () => {
|
|
@@ -210,7 +216,6 @@ describe('optimizeTheme', () => {
|
|
|
210
216
|
}
|
|
211
217
|
const result = optimizeTheme({ theme, breakpoints: bpKeys })
|
|
212
218
|
expect(result.xs).toEqual({ color: 'red' })
|
|
213
|
-
// Different key count → full set emitted (can't just diff values)
|
|
214
219
|
expect(result.sm).toEqual({ color: 'red', padding: 10 })
|
|
215
220
|
})
|
|
216
221
|
})
|
|
@@ -101,12 +101,15 @@ describe('styles', () => {
|
|
|
101
101
|
|
|
102
102
|
it('special property: hideEmpty', () => {
|
|
103
103
|
const result = styles({ theme: { hideEmpty: true }, css: mockCss, rootSize: 16 })
|
|
104
|
-
|
|
104
|
+
// CSS template output — normalize whitespace for comparison
|
|
105
|
+
const normalized = String(result).replace(/\s+/g, ' ')
|
|
106
|
+
expect(normalized).toContain('&:empty { display: none; }')
|
|
105
107
|
})
|
|
106
108
|
|
|
107
109
|
it('special property: clearFix', () => {
|
|
108
110
|
const result = styles({ theme: { clearFix: true }, css: mockCss, rootSize: 16 })
|
|
109
|
-
|
|
111
|
+
const normalized = String(result).replace(/\s+/g, ' ')
|
|
112
|
+
expect(normalized).toContain("&::after { clear: both; content: ''; display: table; }")
|
|
110
113
|
})
|
|
111
114
|
|
|
112
115
|
it('string values for convert properties pass through', () => {
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/** @jsxImportSource @pyreon/core */
|
|
2
|
+
import { h } from '@pyreon/core'
|
|
3
|
+
import { css, sheet, styled } from '@pyreon/styler'
|
|
4
|
+
import { mountInBrowser } from '@pyreon/test-utils/browser'
|
|
5
|
+
import { afterEach, describe, expect, it } from 'vitest'
|
|
6
|
+
import { enrichTheme } from '../enrichTheme'
|
|
7
|
+
import Provider from '../context'
|
|
8
|
+
import { makeItResponsive } from '../responsive'
|
|
9
|
+
import { stripUnit, value } from '../units'
|
|
10
|
+
|
|
11
|
+
// Real-Chromium smoke for @pyreon/unistyle.
|
|
12
|
+
//
|
|
13
|
+
// These tests assert real browser behavior for responsive utilities —
|
|
14
|
+
// things that happy-dom cannot observe because it does not resolve
|
|
15
|
+
// @media queries or compute styles.
|
|
16
|
+
//
|
|
17
|
+
// What the suite locks in:
|
|
18
|
+
// 1. `enrichTheme` attaches sorted breakpoints + media helpers to
|
|
19
|
+
// `theme.__PYREON__`.
|
|
20
|
+
// 2. The generated media-query helper emits `@media (min-width: XXem)`
|
|
21
|
+
// CSS that Chromium resolves — a breakpoint under the current
|
|
22
|
+
// viewport applies, one above does not.
|
|
23
|
+
// 3. `<Provider>` provides the enriched theme so `styled()` components
|
|
24
|
+
// resolve `p.theme` and interpolation functions see breakpoint data.
|
|
25
|
+
// 4. `value()` and `stripUnit()` produce the same strings in Node and
|
|
26
|
+
// the browser (pure math, but we lock parity).
|
|
27
|
+
|
|
28
|
+
describe('@pyreon/unistyle in real browser', () => {
|
|
29
|
+
afterEach(() => {
|
|
30
|
+
sheet.clearCache()
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
it('enrichTheme attaches sortedBreakpoints and media helpers', () => {
|
|
34
|
+
const enriched = enrichTheme({
|
|
35
|
+
rootSize: 16,
|
|
36
|
+
breakpoints: { xs: 0, sm: 576, md: 768 },
|
|
37
|
+
})
|
|
38
|
+
expect(enriched.__PYREON__.sortedBreakpoints).toEqual(['xs', 'sm', 'md'])
|
|
39
|
+
expect(typeof enriched.__PYREON__.media?.xs).toBe('function')
|
|
40
|
+
expect(typeof enriched.__PYREON__.media?.sm).toBe('function')
|
|
41
|
+
expect(typeof enriched.__PYREON__.media?.md).toBe('function')
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
it('media helper emits @media rule that Chromium resolves at the current viewport', () => {
|
|
45
|
+
// Viewport is ~1280px in chromium headless — use a tiny breakpoint
|
|
46
|
+
// that is definitely below, and a huge one definitely above.
|
|
47
|
+
const w = window.innerWidth
|
|
48
|
+
expect(w).toBeGreaterThan(100)
|
|
49
|
+
|
|
50
|
+
const Under = styled('div')`
|
|
51
|
+
color: rgb(0, 0, 0);
|
|
52
|
+
@media (min-width: 50px) {
|
|
53
|
+
color: rgb(255, 0, 0);
|
|
54
|
+
}
|
|
55
|
+
`
|
|
56
|
+
const Over = styled('div')`
|
|
57
|
+
color: rgb(0, 0, 0);
|
|
58
|
+
@media (min-width: 99999px) {
|
|
59
|
+
color: rgb(0, 0, 255);
|
|
60
|
+
}
|
|
61
|
+
`
|
|
62
|
+
const u = mountInBrowser(h(Under, { id: 'u' }))
|
|
63
|
+
const o = mountInBrowser(h(Over, { id: 'o' }))
|
|
64
|
+
expect(getComputedStyle(u.container.querySelector<HTMLElement>('#u')!).color).toBe(
|
|
65
|
+
'rgb(255, 0, 0)',
|
|
66
|
+
)
|
|
67
|
+
expect(getComputedStyle(o.container.querySelector<HTMLElement>('#o')!).color).toBe(
|
|
68
|
+
'rgb(0, 0, 0)',
|
|
69
|
+
)
|
|
70
|
+
u.unmount()
|
|
71
|
+
o.unmount()
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
it('Provider enriches theme and styled() reads it via theme prop (no fallback — breaks loudly)', () => {
|
|
75
|
+
// Use a non-default sentinel color: if Provider/styler integration is
|
|
76
|
+
// broken, the interpolation receives `undefined`, the rule becomes
|
|
77
|
+
// `color: undefined;` (invalid), and Chromium computes the default
|
|
78
|
+
// black (rgb(0, 0, 0)) — the assertion fails immediately. No silent
|
|
79
|
+
// fallback hides a regression.
|
|
80
|
+
const theme = { rootSize: 16, breakpoints: { xs: 0, md: 768 }, tint: 'rgb(0, 200, 0)' }
|
|
81
|
+
|
|
82
|
+
const Themed = styled('div')<{ theme?: typeof theme }>`
|
|
83
|
+
${(p) => css`
|
|
84
|
+
color: ${(p.theme as typeof theme).tint};
|
|
85
|
+
`}
|
|
86
|
+
`
|
|
87
|
+
const { container, unmount } = mountInBrowser(
|
|
88
|
+
h(Provider, { theme }, h(Themed, { id: 'p' })),
|
|
89
|
+
)
|
|
90
|
+
const el = container.querySelector<HTMLElement>('#p')!
|
|
91
|
+
expect(getComputedStyle(el).color).toBe('rgb(0, 200, 0)')
|
|
92
|
+
unmount()
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
it('makeItResponsive resolves a breakpoint-object responsive prop via @media at the current viewport', () => {
|
|
96
|
+
// The actual unistyle hot path: array/object responsive values flow
|
|
97
|
+
// through normalizeTheme → transformTheme → optimizeTheme and emit
|
|
98
|
+
// one `@media (min-width: …em)` rule per breakpoint. This test
|
|
99
|
+
// exercises that pipeline end-to-end against real Chromium.
|
|
100
|
+
const theme = enrichTheme({
|
|
101
|
+
rootSize: 16,
|
|
102
|
+
// xs=0 always applies; xl=99999 never applies at chromium default
|
|
103
|
+
// viewport (~1280). We expect xs to win, xl to be ignored.
|
|
104
|
+
breakpoints: { xs: 0, xl: 99999 },
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
const styles = ({ css: cssFn, theme: t }: { css: typeof css; theme: any }) => cssFn`
|
|
108
|
+
color: ${t.tone};
|
|
109
|
+
`
|
|
110
|
+
const responsive = makeItResponsive({ key: '$colors', styles, css })
|
|
111
|
+
|
|
112
|
+
const ResponsiveBox = styled('div')<{ $colors: Record<string, string>; theme?: typeof theme }>`
|
|
113
|
+
${(p) => responsive(p as any)};
|
|
114
|
+
`
|
|
115
|
+
|
|
116
|
+
const { container, unmount } = mountInBrowser(
|
|
117
|
+
h(
|
|
118
|
+
Provider,
|
|
119
|
+
{ theme },
|
|
120
|
+
h(ResponsiveBox, {
|
|
121
|
+
id: 'r',
|
|
122
|
+
// Outer keys are property names; inner keys are breakpoints.
|
|
123
|
+
$colors: { tone: { xs: 'rgb(255, 0, 0)', xl: 'rgb(0, 0, 255)' } },
|
|
124
|
+
}),
|
|
125
|
+
),
|
|
126
|
+
)
|
|
127
|
+
const el = container.querySelector<HTMLElement>('#r')!
|
|
128
|
+
expect(window.innerWidth).toBeLessThan(99999)
|
|
129
|
+
expect(getComputedStyle(el).color).toBe('rgb(255, 0, 0)')
|
|
130
|
+
unmount()
|
|
131
|
+
})
|
|
132
|
+
|
|
133
|
+
it('makeItResponsive resolves a breakpoint-array responsive prop (mobile-first cascade)', () => {
|
|
134
|
+
const theme = enrichTheme({
|
|
135
|
+
rootSize: 16,
|
|
136
|
+
breakpoints: { xs: 0, sm: 99999 },
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
const styles = ({ css: cssFn, theme: t }: { css: typeof css; theme: any }) => cssFn`
|
|
140
|
+
padding: ${t.pad};
|
|
141
|
+
`
|
|
142
|
+
const responsive = makeItResponsive({ key: '$pad', styles, css })
|
|
143
|
+
|
|
144
|
+
const Padded = styled('div')<{ $pad: any; theme?: typeof theme }>`
|
|
145
|
+
${(p) => responsive(p as any)};
|
|
146
|
+
`
|
|
147
|
+
|
|
148
|
+
const { container, unmount } = mountInBrowser(
|
|
149
|
+
h(
|
|
150
|
+
Provider,
|
|
151
|
+
{ theme },
|
|
152
|
+
h(Padded, { id: 'p', $pad: { pad: ['8px', '32px'] } }),
|
|
153
|
+
),
|
|
154
|
+
)
|
|
155
|
+
const el = container.querySelector<HTMLElement>('#p')!
|
|
156
|
+
// xs (always-on) should apply 8px; sm (99999) does not apply.
|
|
157
|
+
expect(getComputedStyle(el).padding).toBe('8px')
|
|
158
|
+
unmount()
|
|
159
|
+
})
|
|
160
|
+
|
|
161
|
+
it('value() and stripUnit() behave identically in the browser', () => {
|
|
162
|
+
expect(value(16)).toBe('1rem')
|
|
163
|
+
expect(value('16px')).toBe('1rem')
|
|
164
|
+
expect(value('50%')).toBe('50%')
|
|
165
|
+
expect(value(null)).toBeNull()
|
|
166
|
+
expect(stripUnit('24px', true)).toEqual([24, 'px'])
|
|
167
|
+
expect(stripUnit('2.5rem', true)).toEqual([2.5, 'rem'])
|
|
168
|
+
})
|
|
169
|
+
})
|
|
@@ -6,73 +6,47 @@ export type OptimizeTheme = ({
|
|
|
6
6
|
breakpoints: string[]
|
|
7
7
|
}) => Record<string, Record<string, unknown>>
|
|
8
8
|
|
|
9
|
+
const shallowEqual = (
|
|
10
|
+
a: Record<string, unknown> | undefined,
|
|
11
|
+
b: Record<string, unknown> | undefined,
|
|
12
|
+
): boolean => {
|
|
13
|
+
if (a === b) return true
|
|
14
|
+
if (!a || !b) return false
|
|
15
|
+
const keysA = Object.keys(a)
|
|
16
|
+
const keysB = Object.keys(b)
|
|
17
|
+
if (keysA.length !== keysB.length) return false
|
|
18
|
+
for (const key of keysA) {
|
|
19
|
+
if (a[key] !== b[key]) return false
|
|
20
|
+
}
|
|
21
|
+
return true
|
|
22
|
+
}
|
|
23
|
+
|
|
9
24
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* the previous breakpoint.
|
|
14
|
-
*
|
|
15
|
-
* This minimizes generated CSS — a Container with 4 breakpoints where
|
|
16
|
-
* only `maxWidth` changes emits `maxWidth` in each media query rather
|
|
17
|
-
* than the full property set.
|
|
25
|
+
* Removes breakpoints whose full-object styles are identical to the
|
|
26
|
+
* previous one. Simple all-or-nothing: if ANY property differs from
|
|
27
|
+
* the previous breakpoint, emit the ENTIRE current breakpoint.
|
|
18
28
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
29
|
+
* This matches the reference implementation (vitus-labs/ui-system) and
|
|
30
|
+
* the original monorepo-migration version (commit 2b7c5876). Previous
|
|
31
|
+
* "optimizations" (PRs #159, #208) that tried per-property diffing
|
|
32
|
+
* broke responsive styles in subtle ways — shorthand/longhand CSS
|
|
33
|
+
* property interactions, properties that depend on each other,
|
|
34
|
+
* properties that need to be emitted together to cascade correctly.
|
|
24
35
|
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
* sm: { maxWidth: '33.75rem' } // only maxWidth changed
|
|
29
|
-
* ```
|
|
36
|
+
* The all-or-nothing approach is the correct level of deduplication —
|
|
37
|
+
* we skip the breakpoint when it's entirely redundant, and let the
|
|
38
|
+
* browser's CSS cascade handle the rest.
|
|
30
39
|
*/
|
|
31
40
|
const optimizeTheme: OptimizeTheme = ({ theme, breakpoints }) => {
|
|
32
41
|
const result: Record<string, Record<string, unknown>> = {}
|
|
33
42
|
|
|
34
43
|
for (let i = 0; i < breakpoints.length; i++) {
|
|
35
44
|
const key = breakpoints[i] as string
|
|
45
|
+
const previousBreakpoint = breakpoints[i - 1] as string
|
|
36
46
|
const current = theme[key]
|
|
37
|
-
if (!current)
|
|
38
|
-
|
|
39
|
-
if (i === 0) {
|
|
40
|
-
// First breakpoint: emit all properties (baseline)
|
|
41
|
-
result[key] = current
|
|
42
|
-
continue
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// Higher breakpoints: only emit properties that changed from previous.
|
|
46
|
-
const prev = theme[breakpoints[i - 1] as string]
|
|
47
|
-
if (!prev) {
|
|
48
|
-
// No previous breakpoint data — emit all
|
|
49
|
-
result[key] = current
|
|
50
|
-
continue
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const diff: Record<string, unknown> = {}
|
|
54
|
-
let hasDiff = false
|
|
55
|
-
|
|
56
|
-
for (const prop of Object.keys(current)) {
|
|
57
|
-
const currVal = current[prop]
|
|
58
|
-
const prevVal = prev[prop]
|
|
59
|
-
|
|
60
|
-
if (currVal !== prevVal) {
|
|
61
|
-
diff[prop] = currVal
|
|
62
|
-
hasDiff = true
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// Also check for properties that were in previous but removed in current
|
|
67
|
-
// (key count difference means something was added or removed)
|
|
68
|
-
if (Object.keys(current).length !== Object.keys(prev).length) {
|
|
69
|
-
// Different number of keys — emit the full current set since
|
|
70
|
-
// properties may have been added or removed
|
|
47
|
+
if (current && (i === 0 || !shallowEqual(theme[previousBreakpoint], current))) {
|
|
71
48
|
result[key] = current
|
|
72
|
-
} else if (hasDiff) {
|
|
73
|
-
result[key] = diff
|
|
74
49
|
}
|
|
75
|
-
// else: identical to previous — skip (no media query needed)
|
|
76
50
|
}
|
|
77
51
|
|
|
78
52
|
return result
|
|
@@ -4,7 +4,7 @@ import type { Edge } from '../shorthands/edge'
|
|
|
4
4
|
import type { PropertyDescriptor } from './propertyMap'
|
|
5
5
|
import type { InnerTheme } from './types'
|
|
6
6
|
|
|
7
|
-
type Css = (strings: TemplateStringsArray, ...values: any[]) =>
|
|
7
|
+
type Css = (strings: TemplateStringsArray, ...values: any[]) => any
|
|
8
8
|
type Calc = (...params: any[]) => ReturnType<Values>
|
|
9
9
|
|
|
10
10
|
/** Mirrors the Value / PropertyValue types used by edge and borderRadius shorthands. */
|
|
@@ -12,18 +12,44 @@ type Value = string | number | null | undefined
|
|
|
12
12
|
|
|
13
13
|
const toCssDecl = (css: string, v: unknown) => (v == null ? '' : `${css}: ${v};`)
|
|
14
14
|
|
|
15
|
+
/**
|
|
16
|
+
* Converts a single property descriptor + theme values into a CSS fragment.
|
|
17
|
+
*
|
|
18
|
+
* - `simple` — pass-through (no unit conversion)
|
|
19
|
+
* - `convert` — number→rem via `calc()`
|
|
20
|
+
* - `convert_fallback` — picks first non-null from multiple theme keys, then converts
|
|
21
|
+
* - `edge` — delegates to the edge shorthand (margin, padding, inset, border-*)
|
|
22
|
+
* - `border_radius` — delegates to the border-radius shorthand
|
|
23
|
+
* - `special` — one-off logic (fullScreen, backgroundImage url wrapping, animation combo, etc.)
|
|
24
|
+
*
|
|
25
|
+
* IMPORTANT: special cases MUST return `css` tagged-template results,
|
|
26
|
+
* NOT plain strings. The caller (styles/index.ts) embeds these in another
|
|
27
|
+
* `css` template, and the interpolation chain requires template results
|
|
28
|
+
* for correct nesting of pseudo-selectors, media queries, and @layer
|
|
29
|
+
* wrapping. A previous "optimization" returned plain strings which broke
|
|
30
|
+
* responsive styles, hover states, and media-query generation.
|
|
31
|
+
*/
|
|
15
32
|
const processSpecial = (
|
|
16
33
|
d: Extract<PropertyDescriptor, { kind: 'special' }>,
|
|
17
34
|
t: InnerTheme,
|
|
18
|
-
|
|
35
|
+
css: Css,
|
|
36
|
+
): string | ReturnType<typeof css> => {
|
|
19
37
|
switch (d.id) {
|
|
20
38
|
case 'fullScreen':
|
|
21
39
|
if (!t.fullScreen) return ''
|
|
22
|
-
return
|
|
40
|
+
return css`
|
|
41
|
+
position: fixed;
|
|
42
|
+
top: 0;
|
|
43
|
+
left: 0;
|
|
44
|
+
right: 0;
|
|
45
|
+
bottom: 0;
|
|
46
|
+
`
|
|
23
47
|
|
|
24
48
|
case 'backgroundImage':
|
|
25
49
|
if (!t.backgroundImage) return ''
|
|
26
|
-
return `
|
|
50
|
+
return css`
|
|
51
|
+
background-image: url(${t.backgroundImage});
|
|
52
|
+
`
|
|
27
53
|
|
|
28
54
|
case 'animation': {
|
|
29
55
|
const parts = [t.keyframe, t.animation].filter(Boolean).join(' ')
|
|
@@ -32,14 +58,24 @@ const processSpecial = (
|
|
|
32
58
|
|
|
33
59
|
case 'hideEmpty':
|
|
34
60
|
if (!t.hideEmpty) return ''
|
|
35
|
-
return
|
|
61
|
+
return css`
|
|
62
|
+
&:empty {
|
|
63
|
+
display: none;
|
|
64
|
+
}
|
|
65
|
+
`
|
|
36
66
|
|
|
37
67
|
case 'clearFix':
|
|
38
68
|
if (!t.clearFix) return ''
|
|
39
|
-
return
|
|
69
|
+
return css`
|
|
70
|
+
&::after {
|
|
71
|
+
clear: both;
|
|
72
|
+
content: '';
|
|
73
|
+
display: table;
|
|
74
|
+
}
|
|
75
|
+
`
|
|
40
76
|
|
|
41
77
|
case 'extendCss':
|
|
42
|
-
return (t.extendCss as string) ?? ''
|
|
78
|
+
return (t.extendCss as string | undefined) ?? ''
|
|
43
79
|
|
|
44
80
|
default:
|
|
45
81
|
return ''
|
|
@@ -49,11 +85,11 @@ const processSpecial = (
|
|
|
49
85
|
const processDescriptor = (
|
|
50
86
|
d: PropertyDescriptor,
|
|
51
87
|
t: InnerTheme,
|
|
52
|
-
|
|
88
|
+
css: Css,
|
|
53
89
|
calc: Calc,
|
|
54
90
|
shorthand: ReturnType<Edge>,
|
|
55
91
|
borderRadiusFn: ReturnType<BorderRadius>,
|
|
56
|
-
): string => {
|
|
92
|
+
): string | ReturnType<typeof css> => {
|
|
57
93
|
switch (d.kind) {
|
|
58
94
|
case 'simple':
|
|
59
95
|
return toCssDecl(d.css, t[d.key])
|
|
@@ -93,7 +129,7 @@ const processDescriptor = (
|
|
|
93
129
|
)
|
|
94
130
|
|
|
95
131
|
case 'special':
|
|
96
|
-
return processSpecial(d, t)
|
|
132
|
+
return processSpecial(d, t, css)
|
|
97
133
|
}
|
|
98
134
|
}
|
|
99
135
|
|