@pyreon/unistyle 0.13.1 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -194,6 +194,10 @@ When using `normalize: true` (default), missing breakpoints inherit from the pre
194
194
  | @pyreon/reactivity | >= 0.0.1 |
195
195
  | @pyreon/ui-core | >= 0.0.1 |
196
196
 
197
+ ## Performance
198
+
199
+ The `styles()` function reuses module-level `Set<number>` and `fragments[]` containers, cleared on each synchronous call instead of allocating per-call. Combined with the Tier 1 key-to-index lookup (iterates ~10-20 descriptors per component instead of ~257), this eliminates ~160 allocations per 80-component page.
200
+
197
201
  ## License
198
202
 
199
203
  MIT
package/lib/index.d.ts CHANGED
@@ -495,18 +495,6 @@ type Styles = ({
495
495
  rootSize?: number | undefined;
496
496
  globalTheme?: Record<string, any> | undefined;
497
497
  }) => ReturnType<Css>;
498
- /**
499
- * Data-driven style processor. Uses the pre-built key→index lookup to
500
- * iterate ONLY the descriptors whose theme keys are present in the
501
- * incoming theme object. Falls back to full scan only if the lookup
502
- * produces zero matches (defensive — shouldn't happen in practice).
503
- *
504
- * IMPORTANT: the return MUST be wrapped in `css\`...\`` — NOT a plain
505
- * string join. makeItResponsive embeds this result in another template
506
- * literal, and the CSS interpolation chain requires a css template
507
- * result (not a raw string) for correct nesting of media queries,
508
- * pseudo-selectors, and @layer wrapping.
509
- */
510
498
  declare const styles$1: Styles;
511
499
  //#endregion
512
500
  //#region src/types.d.ts
package/lib/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { provide } from "@pyreon/core";
1
+ import { nativeCompat, provide } from "@pyreon/core";
2
2
  import { ThemeContext } from "@pyreon/styler";
3
3
  import { Provider as Provider$1, config, context, isEmpty, set } from "@pyreon/ui-core";
4
4
 
@@ -245,6 +245,7 @@ function Provider(props) {
245
245
  children
246
246
  });
247
247
  }
248
+ nativeCompat(Provider);
248
249
 
249
250
  //#endregion
250
251
  //#region src/styles/alignContent.ts
@@ -1897,6 +1898,7 @@ const propertyMap = [
1897
1898
 
1898
1899
  //#endregion
1899
1900
  //#region src/styles/styles/index.ts
1901
+ const _countSink = globalThis;
1900
1902
  const keyToIndices = /* @__PURE__ */ new Map();
1901
1903
  for (let i = 0; i < propertyMap.length; i++) {
1902
1904
  const d = propertyMap[i];
@@ -1910,13 +1912,19 @@ for (let i = 0; i < propertyMap.length; i++) {
1910
1912
  };
1911
1913
  if (d.key) addKey(d.key);
1912
1914
  if (d.keys) if (Array.isArray(d.keys)) for (const k of d.keys) addKey(k);
1913
- else for (const k of Object.values(d.keys)) addKey(k);
1915
+ else for (const inner of Object.values(d.keys)) addKey(inner);
1914
1916
  }
1915
1917
  /**
1916
- * Data-driven style processor. Uses the pre-built key→index lookup to
1917
- * iterate ONLY the descriptors whose theme keys are present in the
1918
- * incoming theme object. Falls back to full scan only if the lookup
1919
- * produces zero matches (defensive shouldn't happen in practice).
1918
+ * Convert a normalized theme object (Record<key, value>) into a CSS template
1919
+ * by walking the property map. Each entry in propertyMap describes a single
1920
+ * CSS property its kind (simple / convert / convert_fallback / edge /
1921
+ * border_radius), the input theme key(s) to read, and the output CSS name.
1922
+ *
1923
+ * Returns a `css` tagged template literal so makeItResponsive can embed the
1924
+ * result inside the responsive breakpoint structure. Each call returns a
1925
+ * FRESH array — the result CSSResult holds onto that array by reference,
1926
+ * and reusing one module-level array across calls would clobber an earlier
1927
+ * CSSResult's data when the next styles() call clears the shared array.
1920
1928
  *
1921
1929
  * IMPORTANT: the return MUST be wrapped in `css\`...\`` — NOT a plain
1922
1930
  * string join. makeItResponsive embeds this result in another template
@@ -1924,22 +1932,31 @@ for (let i = 0; i < propertyMap.length; i++) {
1924
1932
  * result (not a raw string) for correct nesting of media queries,
1925
1933
  * pseudo-selectors, and @layer wrapping.
1926
1934
  */
1935
+ const _seen = /* @__PURE__ */ new Set();
1927
1936
  const styles = ({ theme: t, css, rootSize }) => {
1937
+ if (process.env.NODE_ENV !== "production") _countSink.__pyreon_count__?.("unistyle.styles");
1928
1938
  const calc = (...params) => values(params, rootSize);
1929
1939
  const shorthand = edge(rootSize);
1930
1940
  const borderRadiusFn = borderRadius(rootSize);
1931
- const seen = /* @__PURE__ */ new Set();
1932
1941
  const fragments = [];
1942
+ _seen.clear();
1933
1943
  for (const key of Object.keys(t)) {
1934
1944
  const indices = keyToIndices.get(key);
1935
1945
  if (!indices) continue;
1936
1946
  for (const idx of indices) {
1937
- if (seen.has(idx)) continue;
1938
- seen.add(idx);
1947
+ if (_seen.has(idx)) continue;
1948
+ _seen.add(idx);
1949
+ if (process.env.NODE_ENV !== "production") _countSink.__pyreon_count__?.("unistyle.descriptor");
1939
1950
  fragments.push(processDescriptor(propertyMap[idx], t, css, calc, shorthand, borderRadiusFn));
1940
1951
  }
1941
1952
  }
1942
- if (fragments.length === 0 && Object.keys(t).length > 0) for (const d of propertyMap) fragments.push(processDescriptor(d, t, css, calc, shorthand, borderRadiusFn));
1953
+ if (fragments.length === 0 && Object.keys(t).length > 0) {
1954
+ if (process.env.NODE_ENV !== "production") _countSink.__pyreon_count__?.("unistyle.descriptor.fallback-scan");
1955
+ for (const d of propertyMap) {
1956
+ if (process.env.NODE_ENV !== "production") _countSink.__pyreon_count__?.("unistyle.descriptor");
1957
+ fragments.push(processDescriptor(d, t, css, calc, shorthand, borderRadiusFn));
1958
+ }
1959
+ }
1943
1960
  return css`
1944
1961
  ${fragments}
1945
1962
  `;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pyreon/unistyle",
3
- "version": "0.13.1",
3
+ "version": "0.15.0",
4
4
  "description": "Responsive theming and breakpoint utilities for Pyreon",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -10,6 +10,7 @@
10
10
  },
11
11
  "files": [
12
12
  "lib",
13
+ "!lib/**/*.map",
13
14
  "!lib/analysis",
14
15
  "README.md",
15
16
  "LICENSE",
@@ -41,16 +42,17 @@
41
42
  "typecheck": "tsc --noEmit"
42
43
  },
43
44
  "devDependencies": {
44
- "@pyreon/test-utils": "^0.13.1",
45
- "@pyreon/typescript": "^0.13.1",
45
+ "@pyreon/manifest": "0.13.1",
46
+ "@pyreon/test-utils": "^0.13.2",
47
+ "@pyreon/typescript": "^0.15.0",
46
48
  "@vitest/browser-playwright": "^4.1.4",
47
- "@vitus-labs/tools-rolldown": "^1.15.3"
49
+ "@vitus-labs/tools-rolldown": "^2.3.0"
48
50
  },
49
51
  "peerDependencies": {
50
- "@pyreon/core": "^0.13.1",
51
- "@pyreon/reactivity": "^0.13.1",
52
- "@pyreon/styler": "^0.13.1",
53
- "@pyreon/ui-core": "^0.13.1"
52
+ "@pyreon/core": "^0.15.0",
53
+ "@pyreon/reactivity": "^0.15.0",
54
+ "@pyreon/styler": "^0.15.0",
55
+ "@pyreon/ui-core": "^0.15.0"
54
56
  },
55
57
  "engines": {
56
58
  "node": ">= 22"
@@ -0,0 +1,34 @@
1
+ import {
2
+ renderApiReferenceEntries,
3
+ renderLlmsFullSection,
4
+ renderLlmsTxtLine,
5
+ } from '@pyreon/manifest'
6
+ import manifest from '../manifest'
7
+
8
+ describe('gen-docs — unistyle snapshot', () => {
9
+ it('renders a llms.txt bullet starting with the package prefix', () => {
10
+ const line = renderLlmsTxtLine(manifest)
11
+ expect(line.startsWith('- @pyreon/unistyle —')).toBe(true)
12
+ })
13
+
14
+ it('renders a llms-full.txt section with the right header', () => {
15
+ const section = renderLlmsFullSection(manifest)
16
+ expect(section.startsWith('## @pyreon/unistyle —')).toBe(true)
17
+ expect(section).toContain('```typescript')
18
+ })
19
+
20
+ it('renders MCP api-reference entries for every api[] item', () => {
21
+ const record = renderApiReferenceEntries(manifest)
22
+ expect(Object.keys(record).sort()).toEqual([
23
+ 'unistyle/alignContent',
24
+ 'unistyle/breakpoints',
25
+ 'unistyle/createMediaQueries',
26
+ 'unistyle/enrichTheme',
27
+ 'unistyle/extendCss',
28
+ 'unistyle/makeItResponsive',
29
+ 'unistyle/stripUnit',
30
+ 'unistyle/styles',
31
+ 'unistyle/value',
32
+ ])
33
+ })
34
+ })
@@ -0,0 +1,9 @@
1
+ import { isNativeCompat } from '@pyreon/core'
2
+ import { describe, expect, it } from 'vitest'
3
+ import UnistyleProvider from '../context'
4
+
5
+ describe('native-compat marker — @pyreon/unistyle', () => {
6
+ it('Provider is marked native', () => {
7
+ expect(isNativeCompat(UnistyleProvider)).toBe(true)
8
+ })
9
+ })
@@ -212,3 +212,62 @@ describe('Tier 1: performance characteristics', () => {
212
212
  // the indexed path should always find matches.
213
213
  })
214
214
  })
215
+
216
+ // Regression test for PR #283's `_fragments` reuse — the module-level array
217
+ // was captured by reference inside the returned CSSResult's values, so the
218
+ // next styles() call would clear the previous result's data before its
219
+ // consumer ever resolved it.
220
+ //
221
+ // Pre-fix: r1.values[0] (the fragments array) was the SAME reference as the
222
+ // module-level array; the second styles() call ran `_fragments.length = 0`
223
+ // and wiped r1's fragments to []. Post-fix: each call gets its own array.
224
+ //
225
+ // Real-app symptom this caused: rocketstyle dimension themes (state="primary"
226
+ // → blue background) produced empty CSS because element.ts calls
227
+ // makeItResponsive 5 times (base/hover/focus/active/disabled), each calling
228
+ // styles() under the hood. Only the LAST one kept its data; the rest
229
+ // resolved empty. See `packages/ui/components/src/bases/element.ts`.
230
+ describe('regression: CSSResult ownership of fragments array (PR #283 follow-up)', () => {
231
+ // Lazy-capturing mock: stores strings + values without resolving, mimicking
232
+ // the real CSSResult contract where consumers resolve later.
233
+ const lazyCss = (strings: TemplateStringsArray, ...values: unknown[]) => ({
234
+ strings,
235
+ values,
236
+ })
237
+
238
+ it('first result retains its fragments after a second styles() call', () => {
239
+ const r1 = styles({
240
+ theme: { color: 'red', fontSize: 14 },
241
+ css: lazyCss as never,
242
+ rootSize: 16,
243
+ })
244
+ const r1Fragments = (r1 as { values: unknown[] }).values[0]
245
+ const r1LenBefore = Array.isArray(r1Fragments) ? r1Fragments.length : -1
246
+ expect(r1LenBefore).toBeGreaterThan(0)
247
+
248
+ // Second call — pre-fix this cleared r1's array via shared module-level
249
+ // reference. Post-fix: each call owns its array.
250
+ styles({
251
+ theme: { backgroundColor: 'blue', padding: 8 },
252
+ css: lazyCss as never,
253
+ rootSize: 16,
254
+ })
255
+
256
+ const r1FragmentsAfter = (r1 as { values: unknown[] }).values[0]
257
+ const r1LenAfter = Array.isArray(r1FragmentsAfter) ? r1FragmentsAfter.length : -1
258
+ expect(r1LenAfter).toBe(r1LenBefore)
259
+ })
260
+
261
+ it('two results from sequential calls have INDEPENDENT fragments arrays', () => {
262
+ const r1 = styles({ theme: { color: 'red' }, css: lazyCss as never, rootSize: 16 })
263
+ const r2 = styles({ theme: { backgroundColor: 'blue' }, css: lazyCss as never, rootSize: 16 })
264
+
265
+ const r1Fragments = (r1 as { values: unknown[] }).values[0]
266
+ const r2Fragments = (r2 as { values: unknown[] }).values[0]
267
+ // Different array identities — r1 is not r2.
268
+ expect(r1Fragments).not.toBe(r2Fragments)
269
+ // Both populated.
270
+ expect(Array.isArray(r1Fragments) && r1Fragments.length).toBeGreaterThan(0)
271
+ expect(Array.isArray(r2Fragments) && r2Fragments.length).toBeGreaterThan(0)
272
+ })
273
+ })
package/src/context.tsx CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { VNode } from '@pyreon/core'
2
- import { provide } from '@pyreon/core'
2
+ import { nativeCompat, provide } from '@pyreon/core'
3
3
  import { ThemeContext } from '@pyreon/styler'
4
4
  import { Provider as CoreProvider, context } from '@pyreon/ui-core'
5
5
  import type { PyreonTheme } from './enrichTheme'
@@ -35,6 +35,10 @@ function Provider(props: TProvider): VNode | null {
35
35
  return CoreProvider({ theme: enrichedTheme, children }) as VNode | null
36
36
  }
37
37
 
38
+ // Mark as native — invoked by PyreonUI internally; needs Pyreon's setup
39
+ // frame for provide(ThemeContext, ...) to reach descendants.
40
+ nativeCompat(Provider)
41
+
38
42
  export { context }
39
43
 
40
44
  export default Provider
package/src/env.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Minimal process type — just enough for `process.env.NODE_ENV` checks.
3
+ * Avoids requiring @types/node in consumers that import pyreon source
4
+ * via the `"bun"` export condition.
5
+ */
6
+ declare var process: { env: { NODE_ENV?: string } }
@@ -0,0 +1,197 @@
1
+ import { defineManifest } from '@pyreon/manifest'
2
+
3
+ export default defineManifest({
4
+ name: '@pyreon/unistyle',
5
+ title: 'Responsive CSS Utilities',
6
+ tagline:
7
+ 'Responsive breakpoints, CSS property mappings, unit utilities, theme enrichment',
8
+ description:
9
+ 'Foundational responsive-style layer that powers every visual package above it (`elements`, `rocketstyle`, `coolgrid`, `kinetic`). `enrichTheme()` merges a partial user theme with the default breakpoints / spacing / unit utilities so the rest of the system has a complete theme to read. `makeItResponsive()` turns a value or per-breakpoint map into the right CSS for the current screen. `createMediaQueries()` builds breakpoint-keyed media queries; `styles()` generates CSS from a theme; `alignContent()` resolves alignment shorthand to flex / grid CSS. The package is the single source of truth for responsive prop semantics across the UI system.',
10
+ category: 'browser',
11
+ features: [
12
+ 'enrichTheme(theme) — merge a partial theme with default breakpoints / spacing / units',
13
+ 'breakpoints() — default responsive breakpoint set',
14
+ 'createMediaQueries(breakpoints) — build breakpoint-keyed media query strings',
15
+ 'makeItResponsive() — resolve a value / array / breakpoint object to CSS for the current screen',
16
+ 'styles(theme) — generate CSS from a theme',
17
+ 'alignContent() — resolve alignX / alignY / direction to flex CSS',
18
+ 'extendCss() — extend a CSS definition with overrides',
19
+ 'stripUnit / value / values — unit-utility helpers',
20
+ 'Provider / context — React-style provider for the theme (used internally by PyreonUI)',
21
+ ],
22
+ longExample: `import { enrichTheme, makeItResponsive, createMediaQueries, alignContent } from '@pyreon/unistyle'
23
+
24
+ // 1. Enrich a partial user theme with defaults — required before passing to PyreonUI
25
+ const theme = enrichTheme({
26
+ colors: { primary: '#3b82f6', secondary: '#6366f1' },
27
+ fonts: { body: 'Inter, sans-serif' },
28
+ })
29
+
30
+ // 2. Build media queries keyed by breakpoint name
31
+ const queries = createMediaQueries(theme.breakpoints)
32
+ // → { xs: '@media (min-width: 0)', sm: '@media (min-width: 640px)', md: '...', ... }
33
+
34
+ // 3. Responsive props — single value, mobile-first array, or breakpoint object
35
+ const padding = makeItResponsive({ value: [8, 12, 16], property: 'padding', theme })
36
+ // → 'padding: 8px; @media (...) { padding: 12px } @media (...) { padding: 16px }'
37
+
38
+ const padding2 = makeItResponsive({
39
+ value: { xs: 8, md: 16, xl: 24 },
40
+ property: 'padding',
41
+ theme,
42
+ })
43
+
44
+ // 4. alignContent maps shorthand to flex CSS
45
+ const flexCss = alignContent({ alignX: 'center', alignY: 'start', direction: 'row' })
46
+ // → 'justify-content: center; align-items: flex-start;'`,
47
+ api: [
48
+ {
49
+ name: 'enrichTheme',
50
+ kind: 'function',
51
+ signature: 'enrichTheme(theme: PartialTheme): Theme',
52
+ summary:
53
+ 'Merge a partial theme with the full default theme (breakpoints, spacing, unit utilities, fallback colors). Always call this before passing a user theme to `PyreonUI` — raw theme objects miss the default breakpoints and spacing scale that the rest of the UI system reads from. Idempotent: enriching an already-enriched theme is a no-op.',
54
+ example: `import { enrichTheme } from "@pyreon/unistyle"
55
+
56
+ const theme = enrichTheme({
57
+ colors: { primary: "#3b82f6", secondary: "#6366f1" },
58
+ fonts: { body: "Inter, sans-serif" },
59
+ })
60
+
61
+ // Merges user overrides with default breakpoints, spacing, and units`,
62
+ mistakes: [
63
+ 'Passing the raw partial theme to `<PyreonUI theme={...}>` without enriching — `theme.breakpoints` is undefined and every responsive prop falls back to the desktop value',
64
+ 'Mutating the theme after passing it to `PyreonUI` — the styler resolver caches off the theme identity; clone + re-enrich for whole-theme swaps',
65
+ ],
66
+ seeAlso: ['breakpoints', 'createMediaQueries'],
67
+ },
68
+ {
69
+ name: 'breakpoints',
70
+ kind: 'function',
71
+ signature: 'breakpoints(): Breakpoints',
72
+ summary:
73
+ 'Return the default breakpoint set keyed by name (`xs`, `sm`, `md`, `lg`, `xl`, `xxl`) with min-width values in pixels. The same map is folded into `enrichTheme()` output, so most consumers read `theme.breakpoints` rather than calling this directly. Use it when you need the defaults outside a theme context (e.g. building a custom theme programmatically).',
74
+ example: `import { breakpoints } from '@pyreon/unistyle'
75
+
76
+ const bp = breakpoints()
77
+ // { xs: 0, sm: 640, md: 768, lg: 1024, xl: 1280, xxl: 1536 }`,
78
+ seeAlso: ['enrichTheme', 'createMediaQueries'],
79
+ },
80
+ {
81
+ name: 'createMediaQueries',
82
+ kind: 'function',
83
+ signature: 'createMediaQueries(breakpoints: Breakpoints): Record<string, string>',
84
+ summary:
85
+ 'Build a record of media-query strings keyed by breakpoint name. Each value is a `min-width` query — `xs` is `(min-width: 0)`, `sm` becomes `(min-width: 640px)`, and so on. Used internally by `makeItResponsive()`; expose to consumers when they need to compose custom CSS-in-JS rules outside the responsive-prop pipeline.',
86
+ example: `import { createMediaQueries, breakpoints } from '@pyreon/unistyle'
87
+
88
+ const queries = createMediaQueries(breakpoints())
89
+ // { xs: '@media (min-width: 0)', sm: '@media (min-width: 640px)', md: '@media (min-width: 768px)', ... }`,
90
+ seeAlso: ['breakpoints', 'makeItResponsive'],
91
+ },
92
+ {
93
+ name: 'makeItResponsive',
94
+ kind: 'function',
95
+ signature:
96
+ 'makeItResponsive<T>(options: { value: T | T[] | Record<string, T>; property: string; theme: Theme }): string',
97
+ summary:
98
+ 'Resolve a responsive prop value to CSS for the current screen. Accepts three input shapes: single value (applies at all breakpoints), mobile-first array `[xs, sm, md, lg]` (each entry maps to the next breakpoint), or breakpoint object `{ xs: ..., md: ..., xl: ... }` (named keys map directly). The output is a CSS string with media queries already embedded; insert into a styled component template literal.',
99
+ example: `import { makeItResponsive } from '@pyreon/unistyle'
100
+
101
+ makeItResponsive({ value: 16, property: 'padding', theme })
102
+ // → 'padding: 16px;'
103
+
104
+ makeItResponsive({ value: [8, 12, 16], property: 'padding', theme })
105
+ // → 'padding: 8px; @media (min-width: 640px) { padding: 12px } @media (min-width: 768px) { padding: 16px }'
106
+
107
+ makeItResponsive({ value: { xs: 8, md: 16, xl: 24 }, property: 'padding', theme })
108
+ // → '@media (min-width: 0) { padding: 8px } @media (min-width: 768px) { padding: 16px } @media (min-width: 1280px) { padding: 24px }'`,
109
+ mistakes: [
110
+ 'Passing CSS-spec property names (`borderTopWidth`) — unistyle uses property-first naming (`borderWidthTop`); the responsive transformer expects the unistyle convention',
111
+ 'Forgetting to pass an enriched theme — without `theme.breakpoints`, the array form falls back to the first value at every breakpoint',
112
+ ],
113
+ seeAlso: ['createMediaQueries', 'styles'],
114
+ },
115
+ {
116
+ name: 'styles',
117
+ kind: 'function',
118
+ signature: 'styles(theme: Theme): string',
119
+ summary:
120
+ 'Generate the CSS string for a complete theme — colors, spacing, fonts, breakpoints, the works. Used to produce the cascade of CSS variables / global declarations that backs every styled component. Most consumers don\\\'t call this directly; the `PyreonUI` provider invokes it internally on theme mount.',
121
+ example: `import { styles, enrichTheme } from '@pyreon/unistyle'
122
+
123
+ const theme = enrichTheme({ colors: { primary: '#3b82f6' } })
124
+ const css = styles(theme)
125
+ // → ':root { --color-primary: #3b82f6; --spacing-xs: 4px; ... }'`,
126
+ seeAlso: ['enrichTheme', 'extendCss'],
127
+ },
128
+ {
129
+ name: 'alignContent',
130
+ kind: 'function',
131
+ signature:
132
+ "alignContent(options: { alignX?: AlignXKey; alignY?: AlignYKey; direction?: 'row' | 'column' | 'inline' | 'rows' }): string",
133
+ summary:
134
+ 'Resolve `alignX` / `alignY` / `direction` shorthand to the matching flex / grid CSS (`justify-content`, `align-items`). The Element / Row / Column primitives use this internally — it\\\'s exposed for custom layout components that want the same alignment semantics. `direction: "inline"` maps to `row`; `direction: "rows"` maps to `column`.',
135
+ example: `import { alignContent } from '@pyreon/unistyle'
136
+
137
+ alignContent({ alignX: 'center', alignY: 'start', direction: 'row' })
138
+ // → 'justify-content: center; align-items: flex-start;'
139
+
140
+ alignContent({ alignX: 'spaceBetween', direction: 'inline' })
141
+ // → 'justify-content: space-between;'`,
142
+ seeAlso: ['makeItResponsive'],
143
+ },
144
+ {
145
+ name: 'extendCss',
146
+ kind: 'function',
147
+ signature: 'extendCss(base: ExtendCss, override?: ExtendCss): ExtendCss',
148
+ summary:
149
+ 'Extend a CSS definition (theme block, style descriptor) with overrides — deep-merges nested objects without losing the base. Used by rocketstyle dimension chains to layer dimension-specific CSS over a baseline. The base is not mutated; the result is a new object.',
150
+ example: `import { extendCss } from '@pyreon/unistyle'
151
+
152
+ const base = { color: 'red', hover: { color: 'darkred' } }
153
+ const extended = extendCss(base, { hover: { background: 'pink' } })
154
+ // → { color: 'red', hover: { color: 'darkred', background: 'pink' } }`,
155
+ seeAlso: ['styles'],
156
+ },
157
+ {
158
+ name: 'stripUnit',
159
+ kind: 'function',
160
+ signature: 'stripUnit(value: string | number): number',
161
+ summary:
162
+ 'Strip the unit suffix from a CSS value and return the numeric part (`"16px"` → `16`, `"1.5rem"` → `1.5`). Returns the input unchanged when already a number. Useful for arithmetic on theme values declared as strings (`"16px"`) without manually parsing.',
163
+ example: `import { stripUnit } from '@pyreon/unistyle'
164
+
165
+ stripUnit('16px') // → 16
166
+ stripUnit('1.5rem') // → 1.5
167
+ stripUnit(16) // → 16`,
168
+ seeAlso: ['value', 'values'],
169
+ },
170
+ {
171
+ name: 'value',
172
+ kind: 'function',
173
+ signature: 'value(input: PropertyValue, fallback?: PropertyValue): UnitValue',
174
+ summary:
175
+ 'Parse and validate a single property value into a `UnitValue` shape (`{ value, unit }`). Accepts numbers (treated as pixels), strings with units (`"16px"`, `"1rem"`, `"50%"`), or objects already in `UnitValue` form. Optional `fallback` is returned when the input is invalid. The companion `values()` does the same over an array.',
176
+ example: `import { value } from '@pyreon/unistyle'
177
+
178
+ value(16) // → { value: 16, unit: 'px' }
179
+ value('1.5rem') // → { value: 1.5, unit: 'rem' }
180
+ value('50%') // → { value: 50, unit: '%' }
181
+ value('garbage', 0) // → { value: 0, unit: 'px' }`,
182
+ seeAlso: ['stripUnit', 'values'],
183
+ },
184
+ ],
185
+ gotchas: [
186
+ {
187
+ label: 'Single source for responsive semantics',
188
+ note:
189
+ 'Every visual package (`elements`, `rocketstyle`, `coolgrid`, `kinetic`) reads breakpoints / spacing / unit conventions from this package. Override defaults via `enrichTheme()` once at the app root rather than per-component.',
190
+ },
191
+ {
192
+ label: 'CSS property naming',
193
+ note:
194
+ 'Unistyle uses property-first naming (`borderWidthTop`, `borderColorLeft`) rather than CSS-spec order (`borderTopWidth`, `borderLeftColor`). Stick to the unistyle convention when authoring components — the responsive transformer expects it.',
195
+ },
196
+ ],
197
+ })
@@ -4,6 +4,10 @@ import processDescriptor from './processDescriptor'
4
4
  import propertyMap from './propertyMap'
5
5
  import type { ITheme, InnerTheme, Theme } from './types'
6
6
 
7
+ // Dev-time counter sink — populated by `@pyreon/perf-harness` on install().
8
+ // No import so unistyle carries zero coupling to a private package.
9
+ const _countSink = globalThis as { __pyreon_count__?: (name: string, n?: number) => void }
10
+
7
11
  export type { ITheme, Theme as StylesTheme }
8
12
 
9
13
  type Css = (strings: TemplateStringsArray, ...args: any[]) => any
@@ -44,16 +48,24 @@ for (let i = 0; i < propertyMap.length; i++) {
44
48
  if (Array.isArray(d.keys)) {
45
49
  for (const k of d.keys) addKey(k)
46
50
  } else {
47
- for (const k of Object.values(d.keys as Record<string, string>)) addKey(k)
51
+ for (const inner of Object.values(d.keys as Record<string, string>)) {
52
+ addKey(inner)
53
+ }
48
54
  }
49
55
  }
50
56
  }
51
57
 
52
58
  /**
53
- * Data-driven style processor. Uses the pre-built key→index lookup to
54
- * iterate ONLY the descriptors whose theme keys are present in the
55
- * incoming theme object. Falls back to full scan only if the lookup
56
- * produces zero matches (defensive shouldn't happen in practice).
59
+ * Convert a normalized theme object (Record<key, value>) into a CSS template
60
+ * by walking the property map. Each entry in propertyMap describes a single
61
+ * CSS property its kind (simple / convert / convert_fallback / edge /
62
+ * border_radius), the input theme key(s) to read, and the output CSS name.
63
+ *
64
+ * Returns a `css` tagged template literal so makeItResponsive can embed the
65
+ * result inside the responsive breakpoint structure. Each call returns a
66
+ * FRESH array — the result CSSResult holds onto that array by reference,
67
+ * and reusing one module-level array across calls would clobber an earlier
68
+ * CSSResult's data when the next styles() call clears the shared array.
57
69
  *
58
70
  * IMPORTANT: the return MUST be wrapped in `css\`...\`` — NOT a plain
59
71
  * string join. makeItResponsive embeds this result in another template
@@ -61,21 +73,36 @@ for (let i = 0; i < propertyMap.length; i++) {
61
73
  * result (not a raw string) for correct nesting of media queries,
62
74
  * pseudo-selectors, and @layer wrapping.
63
75
  */
76
+ // Module-level reusable Set — cleared before each synchronous styles() call.
77
+ // The fragments array CANNOT be module-level because the returned CSSResult
78
+ // captures it by reference; the next styles() call would clear-out the
79
+ // previous result before its consumer ever resolved it.
80
+ const _seen = new Set<number>()
81
+
64
82
  const styles: Styles = ({ theme: t, css, rootSize }) => {
83
+ if (process.env.NODE_ENV !== 'production') _countSink.__pyreon_count__?.('unistyle.styles')
84
+
65
85
  const calc = (...params: any[]) => values(params, rootSize)
66
86
  const shorthand = edge(rootSize)
67
87
  const borderRadiusFn = borderRadius(rootSize)
68
88
 
69
- // Fast path: iterate only descriptors whose keys are present in theme
70
- const seen = new Set<number>()
89
+ // Per-call fragments array owned by the returned CSSResult.
71
90
  const fragments: unknown[] = []
72
91
 
92
+ // Reuse module-level Set — safe because the Set is fully consumed before
93
+ // styles() returns. The fragments array is the one we MUST allocate fresh
94
+ // (see top-of-function comment) — its lifetime extends past this call.
95
+ _seen.clear()
96
+
97
+ // Fast path: iterate only descriptors whose keys are present in theme
73
98
  for (const key of Object.keys(t)) {
74
99
  const indices = keyToIndices.get(key)
75
100
  if (!indices) continue
76
101
  for (const idx of indices) {
77
- if (seen.has(idx)) continue
78
- seen.add(idx)
102
+ if (_seen.has(idx)) continue
103
+ _seen.add(idx)
104
+ if (process.env.NODE_ENV !== 'production')
105
+ _countSink.__pyreon_count__?.('unistyle.descriptor')
79
106
  fragments.push(processDescriptor(propertyMap[idx]!, t, css, calc, shorthand, borderRadiusFn))
80
107
  }
81
108
  }
@@ -83,7 +110,11 @@ const styles: Styles = ({ theme: t, css, rootSize }) => {
83
110
  // Fallback: if lookup produced nothing, full scan (handles edge cases
84
111
  // where theme uses non-standard keys that aren't in propertyMap)
85
112
  if (fragments.length === 0 && Object.keys(t).length > 0) {
113
+ if (process.env.NODE_ENV !== 'production')
114
+ _countSink.__pyreon_count__?.('unistyle.descriptor.fallback-scan')
86
115
  for (const d of propertyMap) {
116
+ if (process.env.NODE_ENV !== 'production')
117
+ _countSink.__pyreon_count__?.('unistyle.descriptor')
87
118
  fragments.push(processDescriptor(d, t, css, calc, shorthand, borderRadiusFn))
88
119
  }
89
120
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index2.d.ts","names":[],"sources":["../../src/enrichTheme.ts","../../src/context.tsx","../../src/responsive/breakpoints.ts","../../src/responsive/createMediaQueries.ts","../../src/responsive/sortBreakpoints.ts","../../src/responsive/makeItResponsive.ts","../../src/responsive/normalizeTheme.ts","../../src/responsive/transformTheme.ts","../../src/styles/alignContent.ts","../../src/styles/extendCss.ts","../../src/styles/styles/types.ts","../../src/styles/styles/index.ts","../../src/types.ts","../../src/units/stripUnit.ts","../../src/units/value.ts","../../src/units/values.ts"],"mappings":";;;;KAGY,WAAA;EACV,QAAA;EACA,WAAA,GAAc,MAAA;EACd,UAAA;IACE,iBAAA;IACA,KAAA,EAAO,MAAA,aAAmB,IAAA;EAAA;AAAA,IAE1B,MAAA;;;;;;;;;;;;;iBAcY,WAAA,WAAsB,WAAA,CAAA,CACpC,KAAA,EAAO,CAAA,GACN,CAAA,GAAI,QAAA,CAAS,IAAA,CAAK,WAAA;;;KCnBT,SAAA;EACV,KAAA,EAAO,WAAA;EACP,QAAA,GAAW,KAAA;AAAA;;;;;;;;;;;iBAaJ,QAAA,CAAS,KAAA,EAAO,SAAA,GAAY,KAAA;;;cCtB/B,aAAA;EAAA;;;;;;;;;;KAYM,WAAA,UAAqB,aAAA;;;KCZ5B,KAAA,IAAO,OAAA,EAAS,oBAAA,KAAyB,MAAA;AAAA,KAElC,kBAAA,cACA,MAAA,8CAEA,KAAA,EACV,KAAA;EACA,WAAA,EAAa,CAAA;EACb,QAAA,EAAU,CAAA;EACV,GAAA,EAAK,CAAA;AAAA,MACD,MAAA,OAAa,CAAA,MAAO,IAAA;AAAA,cAIpB,kBAAA,EAAoB,kBAAA;;;KCdd,eAAA,cAA6B,MAAA,kBAAwB,WAAA,EAAa,CAAA,YAAa,CAAA;AAAA,cAErF,eAAA,EAAiB,eAAA;;;KCKlB,KAAA,IAAO,OAAA,EAAS,oBAAA,KAAyB,MAAA;AAAA,KAEzC,WAAA,GAAc,MAAA;AAAA,KAEd,OAAA,GAAQ,OAAA;EACX,QAAA;EACA,WAAA,EAAa,MAAA;EACb,UAAA,EAAY,OAAA;IACV,KAAA,EAAO,UAAA,QAAkB,kBAAA;IACzB,iBAAA,EAAmB,UAAA,QAAkB,eAAA;EAAA;AAAA,KAGvC,WAAA;AAAA,KAEU,sBAAA,WAAiC,OAAA,CAAQ,MAAA;EACnD,KAAA;EACA,GAAA;EACA,QAAA;EACA;AAAA;EAEA,KAAA,EAAO,CAAA;EACP,GAAA,EAAK,KAAA;EACL,QAAA;EACA,WAAA,GAAc,MAAA;AAAA,MACV,UAAA,QAAkB,GAAA;AAAA,KAEZ,gBAAA;EACV,KAAA;EACA,GAAA;EACA,GAAA;EACA,MAAA;EACA;AAAA;EAEA,KAAA,GAAQ,WAAA;EACR,GAAA;EACA,GAAA;EACA,MAAA,EAAQ,sBAAA;EACR,SAAA;AAAA,OACK,KAAA;EAAS,KAAA,GAAQ,OAAA;EAAA,CAAQ,IAAA;AAAA;AAAA,cAO1B,gBAAA,EAAkB,gBAAA;;;KCjBZ,cAAA;EACV,KAAA;EACA;AAAA;EAEA,KAAA,EAAO,MAAA;EACP,WAAA;AAAA,MACI,MAAA;AAAA,cAEA,cAAA,EAAgB,cAAA;;;KC9BV,cAAA;EACV,KAAA;EACA;AAAA;EAEA,KAAA,EAAO,MAAA;EACP,WAAA;AAAA;AAAA,cAGI,cAAA,EAAgB,cAAA;;;KCnBV,yBAAA,gBAAyC,uBAAA;AAAA,KACzC,sBAAA,gBAAsC,mBAAA;AAAA,KACtC,sBAAA,gBAAsC,mBAAA;AAAA,cASrC,mBAAA;EAAA;;;;;;;cAMA,mBAAA;EAAA;;;;;;;cAMA,uBAAA;EAAA;;;;;KAOD,YAAA;EACV,SAAA;EACA,MAAA;EACA;AAAA;EAEA,SAAA,EAAW,yBAAA;EACX,MAAA,EAAQ,sBAAA;EACR,MAAA,EAAQ,sBAAA;AAAA;AAAA,cAGJ,YAAA,EAAc,YAAA;;;KC1CR,SAAA,IACV,MAAA,IACM,GAAA,GAAM,OAAA,EAAS,oBAAA,KAAyB,MAAA;AAAA,cAe1C,SAAA,EAAW,SAAA;;;KCjBZ,eAAA;AAAA,KACA,OAAA;AAAA,UAEY,MAAA;EAEf,UAAA;EACA,SAAA;EACA,QAAA;EACA,SAAA,cAAuB,GAAA,MAAS,IAAA;EAGhC,GAAA;EACA,OAAA;EACA,QAAA;EACA,SAAA;EACA,KAAA;EAGA,KAAA,GAAQ,eAAA;EACR,MAAA,GAAS,eAAA;EACT,MAAA,GAAS,eAAA;EACT,GAAA,GAAM,eAAA;EACN,IAAA,GAAO,eAAA;EACP,MAAA,GAAS,eAAA;EACT,KAAA,GAAQ,eAAA;EAGR,KAAA,GAAQ,eAAA;EACR,QAAA,GAAW,eAAA;EACX,QAAA,GAAW,eAAA;EACX,MAAA,GAAS,eAAA;EACT,SAAA,GAAY,eAAA;EACZ,SAAA,GAAY,eAAA;EACZ,IAAA,GAAO,eAAA;EACP,OAAA,GAAU,eAAA;EACV,OAAA,GAAU,eAAA;EACV,GAAA,GAAM,eAAA;EACN,WAAA;EACA,OAAA;EACA,aAAA;EACA,aAAA;EACA,SAAA;EACA,UAAA,GAAa,eAAA;EACb,SAAA,GAAY,eAAA;EACZ,aAAA,GAAgB,eAAA;EAChB,YAAA,GAAe,eAAA;EACf,aAAA,GAAgB,eAAA;EAChB,YAAA,GAAe,eAAA;EAGf,MAAA,GAAS,eAAA;EACT,OAAA,GAAU,eAAA;EACV,OAAA,GAAU,eAAA;EACV,SAAA,GAAY,eAAA;EACZ,UAAA,GAAa,eAAA;EACb,YAAA,GAAe,eAAA;EACf,WAAA,GAAc,eAAA;EACd,OAAA,GAAU,eAAA;EACV,QAAA,GAAW,eAAA;EACX,QAAA,GAAW,eAAA;EACX,UAAA,GAAa,eAAA;EACb,WAAA,GAAc,eAAA;EACd,aAAA,GAAgB,eAAA;EAChB,YAAA,GAAe,eAAA;EAGf,YAAA,GAAe,eAAA;EACf,iBAAA,GAAoB,eAAA;EACpB,eAAA,GAAkB,eAAA;EAClB,WAAA,GAAc,eAAA;EACd,gBAAA,GAAmB,eAAA;EACnB,cAAA,GAAiB,eAAA;EACjB,aAAA,GAAgB,eAAA;EAChB,kBAAA,GAAqB,eAAA;EACrB,gBAAA,GAAmB,eAAA;EACnB,YAAA,GAAe,eAAA;EACf,iBAAA,GAAoB,eAAA;EACpB,eAAA,GAAkB,eAAA;EAGlB,WAAA,GAAc,eAAA;EACd,gBAAA,GAAmB,eAAA;EACnB,cAAA,GAAiB,eAAA;EACjB,UAAA,GAAa,eAAA;EACb,eAAA,GAAkB,eAAA;EAClB,aAAA,GAAgB,eAAA;EAGhB,YAAA;EACA,UAAA;EACA,SAAA;EACA,IAAA;EACA,SAAA;EACA,aAAA;EACA,QAAA;EACA,QAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,YAAA;EACA,WAAA;EACA,UAAA;EACA,YAAA;EACA,SAAA;EACA,MAAA,GAAS,eAAA;EACT,SAAA,GAAY,eAAA;EAGZ,IAAA;EACA,QAAA;EACA,eAAA,GAAkB,eAAA;EAClB,YAAA;EACA,YAAA,GAAe,eAAA;EACf,UAAA;EACA,aAAA;EACA,aAAA,GAAgB,eAAA;EAChB,eAAA,GAAkB,eAAA;EAClB,OAAA,GAAU,eAAA;EACV,OAAA;EACA,YAAA;EACA,UAAA;EACA,UAAA,GAAa,eAAA;EACb,YAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EAGA,SAAA;EACA,cAAA;EACA,KAAA;EACA,OAAA;EACA,MAAA;EACA,aAAA;EAGA,UAAA;EACA,IAAA;EACA,UAAA;EACA,QAAA,GAAW,eAAA;EACX,cAAA,GAAiB,eAAA;EACjB,WAAA,GAAc,eAAA;EACd,SAAA;EACA,WAAA;EACA,UAAA;EACA,WAAA;EACA,mBAAA;EACA,qBAAA;EACA,iBAAA;EACA,SAAA;EACA,aAAA;EACA,aAAA;EACA,cAAA;EACA,mBAAA,GAAsB,OAAA;EACtB,kBAAA;EACA,mBAAA;EACA,uBAAA;EACA,mBAAA;EACA,YAAA;EACA,iBAAA,GAAoB,OAAA;EACpB,iBAAA;EACA,aAAA;EACA,WAAA;EACA,UAAA;EACA,WAAA;EACA,YAAA;EACA,UAAA;EACA,QAAA;EACA,aAAA;EACA,UAAA;EACA,SAAA;EACA,QAAA;EACA,WAAA;EACA,SAAA;EACA,OAAA;EAGA,SAAA;EACA,cAAA;EACA,iBAAA;EACA,aAAA;EAGA,KAAA,GAAQ,OAAA;EACR,UAAA;EACA,eAAA,GAAkB,OAAA;EAClB,eAAA;EACA,oBAAA;EACA,cAAA;EACA,gBAAA;EACA,kBAAA;EACA,gBAAA;EACA,cAAA;EAGA,YAAA,GAAe,eAAA;EACf,eAAA,GAAkB,eAAA;EAClB,kBAAA,GAAqB,eAAA;EACrB,gBAAA,GAAmB,eAAA;EACnB,iBAAA,GAAoB,eAAA;EACpB,mBAAA,GAAsB,eAAA;EACtB,oBAAA,GAAuB,eAAA;EACvB,sBAAA,GAAyB,eAAA;EACzB,uBAAA,GAA0B,eAAA;EAC1B,MAAA;EACA,SAAA;EACA,YAAA;EACA,UAAA;EACA,WAAA;EACA,WAAA,GAAc,eAAA;EACd,YAAA,GAAe,eAAA;EACf,YAAA,GAAe,eAAA;EACf,cAAA,GAAiB,eAAA;EACjB,eAAA,GAAkB,eAAA;EAClB,iBAAA,GAAoB,eAAA;EACpB,gBAAA,GAAmB,eAAA;EACnB,WAAA;EACA,YAAA;EACA,YAAA;EACA,cAAA;EACA,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,WAAA,GAAc,OAAA;EACd,YAAA,GAAe,OAAA;EACf,YAAA,GAAe,OAAA;EACf,cAAA,GAAiB,OAAA;EACjB,eAAA,GAAkB,OAAA;EAClB,iBAAA,GAAoB,OAAA;EACpB,gBAAA,GAAmB,OAAA;EACnB,WAAA;EACA,iBAAA;EACA,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,aAAA;EAEA,cAAA;EAGA,YAAA;EACA,WAAA;EACA,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,cAAA;EAGA,kBAAA;EACA,SAAA;EACA,MAAA;EACA,cAAA;EACA,YAAA;EACA,mBAAA;EACA,SAAA;EACA,OAAA;EACA,YAAA,GAAe,OAAA;EACf,aAAA;EACA,YAAA;EACA,YAAA;EAGA,QAAA;EACA,SAAA;EACA,aAAA;EACA,iBAAA;EACA,uBAAA;EACA,cAAA;EACA,uBAAA;EACA,kBAAA;EACA,iBAAA;EACA,kBAAA;EACA,UAAA;EACA,eAAA;EACA,kBAAA;EACA,kBAAA;EACA,wBAAA;EAGA,SAAA;EACA,eAAA;EACA,cAAA;EACA,SAAA;EACA,MAAA;EACA,KAAA;EACA,UAAA;EAGA,cAAA;EACA,cAAA;EACA,eAAA;EACA,cAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,mBAAA;EACA,mBAAA;EAGA,MAAA;EACA,aAAA;EACA,UAAA;EACA,WAAA;EACA,cAAA;EACA,cAAA;EACA,eAAA;EACA,UAAA,GAAa,OAAA;EACb,WAAA,GAAc,OAAA;EACd,WAAA;EAGA,WAAA;EACA,KAAA;EACA,IAAA;EACA,QAAA;EACA,OAAA;EACA,iBAAA;EACA,gBAAA;EACA,YAAA;EACA,UAAA;EACA,MAAA;EACA,QAAA;EACA,YAAA;EACA,SAAA;EACA,SAAA;EACA,WAAA;EACA,iBAAA;EACA,MAAA;EACA,OAAA;EACA,WAAA;EACA,UAAA;EACA,UAAA;EACA,cAAA;EAGA,SAAA;EACA,QAAA;EACA,YAAA;EACA,UAAA;EAGA,YAAA;EACA,WAAA;EACA,mBAAA;EAGA,WAAA;EACA,WAAA;EACA,UAAA;EACA,OAAA;EAGA,WAAA;EACA,UAAA;EACA,WAAA;EACA,OAAA;EACA,MAAA;EACA,gBAAA;AAAA;AAAA,KAGU,UAAA,iBACE,MAAA,IAAU,MAAA,CAAO,CAAA;AAAA,KAGnB,KAAA,iBACE,UAAA,IAAc,UAAA,CAAW,CAAA,WAAY,MAAA,CAAO,CAAA;;;KCtWrD,GAAA,IAAO,OAAA,EAAS,oBAAA,KAAyB,IAAA;AAAA,KAElC,MAAA;EACV,KAAA;EACA,GAAA;EACA,QAAA;EACA;AAAA;EAEA,KAAA,EAAO,UAAA;EACP,GAAA,EAAK,GAAA;EACL,QAAA;EACA,WAAA,GAAc,MAAA;AAAA,MACV,UAAA,CAAW,GAAA;;;;;;;;;;;;;cA2CX,QAAA,EAAQ,MAAA;;;KC3DF,QAAA;AAAA,KACA,KAAA;AAAA,KACA,SAAA,wBAAiC,KAAA;AAAA,KACjC,aAAA,GAAgB,SAAA,YAAqB,QAAA;AAAA,KAIrC,KAAA,kbAYR,aAAA,GACA,QAAA;AAAA,KAEQ,aAAA;;;KC1BP,OAAA,MAAW,CAAA,2BAA4B,CAAA;AAAA,KACvC,IAAA,MAAU,CAAA;AAAA,KAEH,SAAA,2DACV,KAAA,EAAO,CAAA,EACP,UAAA,GAAa,EAAA,KACV,EAAA,iBAAmB,OAAA,CAAM,CAAA,GAAI,IAAA,CAAK,CAAA,KAAM,OAAA,CAAM,CAAA;AAAA,cAE7C,SAAA,EAcA,SAAA;;;KCpBD,UAAA;AAAA,KAmBO,KAAA,IACV,KAAA,sCACA,QAAA,WACA,UAAA,GAAa,UAAA;AAAA,cAGT,KAAA,EAAO,KAAA;;;KCzBR,QAAA;AAAA,KAqBO,MAAA,IACV,KAAA,aACA,QAAA,WACA,UAAA,GAAa,QAAA;AAAA,cAGT,MAAA,EAAQ,MAAA"}
package/lib/index.js.map DELETED
@@ -1 +0,0 @@
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 // ThemeContext is a ReactiveContext — provide an accessor.\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// ─── Tier 1: Key → descriptor-index lookup ──────────────────────────────────\n// Built once at module init. Instead of scanning all 257 descriptors on every\n// styles() call, we look up only the indices whose keys are present in the\n// incoming theme object. Reduces iterations from ~257 to ~10-20 for a typical\n// component that uses 5-10 properties.\n\nconst keyToIndices = new Map<string, number[]>()\n\nfor (let i = 0; i < propertyMap.length; i++) {\n const d = propertyMap[i] as Record<string, any>\n const addKey = (k: string) => {\n let arr = keyToIndices.get(k)\n if (!arr) {\n arr = []\n keyToIndices.set(k, arr)\n }\n arr.push(i)\n }\n\n if (d.key) addKey(d.key)\n if (d.keys) {\n if (Array.isArray(d.keys)) {\n for (const k of d.keys) addKey(k)\n } else {\n for (const k of Object.values(d.keys as Record<string, string>)) addKey(k)\n }\n }\n}\n\n/**\n * Data-driven style processor. Uses the pre-built key→index lookup to\n * iterate ONLY the descriptors whose theme keys are present in the\n * incoming theme object. Falls back to full scan only if the lookup\n * produces zero matches (defensive — shouldn't happen in practice).\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.\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 // Fast path: iterate only descriptors whose keys are present in theme\n const seen = new Set<number>()\n const fragments: unknown[] = []\n\n for (const key of Object.keys(t)) {\n const indices = keyToIndices.get(key)\n if (!indices) continue\n for (const idx of indices) {\n if (seen.has(idx)) continue\n seen.add(idx)\n fragments.push(processDescriptor(propertyMap[idx]!, t, css, calc, shorthand, borderRadiusFn))\n }\n }\n\n // Fallback: if lookup produced nothing, full scan (handles edge cases\n // where theme uses non-standard keys that aren't in propertyMap)\n if (fragments.length === 0 && Object.keys(t).length > 0) {\n for (const d of propertyMap) {\n fragments.push(processDescriptor(d, t, css, calc, shorthand, borderRadiusFn))\n }\n }\n\n return css`\n ${fragments}\n `\n}\n\nexport default styles\n"],"mappings":";;;;;AAAA,MAAM,cAAc;CAClB,UAAU;CACV,aAAa;EACX,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,KAAK;EACN;CACF;;;;ACID,MAAM,uBAA2C,UAI3C;CACJ,MAAM,EAAE,aAAa,UAAU,QAAQ;AAEvC,QAAO,OAAO,KAAK,YAAY,CAAC,QAE7B,KAAK,QAAQ;EACd,MAAM,kBAAkB,YAAY;AAEpC,MAAI,oBAAoB,EACtB,KAAI,QAAQ,GAAG,SAA2C,IAAI,GAAG,KAAK;WAC7D,mBAAmB,MAAM;GAClC,MAAM,SAAS,kBAAkB;AAEjC,OAAI,QAAQ,GAAG,SAA2C,GAAG;6CACtB,OAAO;YACxC,IAAI,GAAG,KAAK,CAAC;;;;AAKrB,SAAO;IACN,EAAE,CAAC;;;;;ACjCR,MAAM,yBAAgD,iBAAiB,YAAY;CACjF,MAAM,SAAkC,EAAE;AAC1C,aAAY,SAAS,MAAM,MAAM;AAC/B,SAAO,QAAQ,QAAQ,MAAM,GAAG,aAAa,OAAO;GACpD;AACF,QAAO;;AAGT,MAAM,iBAAiB,SAA8B,GAAY,MAAc;CAC7E,MAAM,eAAe,IAAI;CACzB,MAAM,YAAY,IAAI,IAAI,SAAS;AACnC,QAAO,gBAAgB;;AAGzB,MAAM,kBACH,SACA,IAAY,GAAW,KAAe,QAAiC;CACtE,MAAM,eAAe,IAAI;CACzB,MAAM,SAAS,IAAI,IAAI;CACvB,MAAM,gBAAgB,UAAU,OAAO,IAAI,UAAU;AACrD,KAAI,gBAAgB,KAAM,QAAO;AACjC,QAAO;;AAGX,MAAM,iBAAiB,gBAAyB;AAEhD,MAAM,mBAAmB,UACvB,OAAO,OAAO,MAAM,CAAC,MAAM,SAAS,OAAO,SAAS,YAAY,MAAM,QAAQ,KAAK,CAAC;AAUtF,MAAM,kBAAkC,EAAE,OAAO,kBAAkB;AACjE,KAAI,CAAC,gBAAgB,MAAM,CAAE,QAAO;CAEpC,MAAM,cAAc,sBAAsB,YAAY;CACtD,MAAM,SAAkC,EAAE;AAE1C,QAAO,QAAQ,MAAM,CAAC,SAAS,CAAC,KAAK,WAAW;AAC9C,MAAI,SAAS,KAAM;AAEnB,MAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,OAAO,YAAY,cAAc,MAA6B,CAAC;WAC7D,OAAO,UAAU,SAC1B,QAAO,OAAO,YAAY,eAAe,MAA6B,CAAC;MAEvE,QAAO,OAAO,YAAY,cAAc,MAAM,CAAC;GAEjD;AAEF,QAAO;;;;;ACrDT,MAAM,gBACJ,GACA,MACY;AACZ,KAAI,MAAM,EAAG,QAAO;AACpB,KAAI,CAAC,KAAK,CAAC,EAAG,QAAO;CACrB,MAAM,QAAQ,OAAO,KAAK,EAAE;CAC5B,MAAM,QAAQ,OAAO,KAAK,EAAE;AAC5B,KAAI,MAAM,WAAW,MAAM,OAAQ,QAAO;AAC1C,MAAK,MAAM,OAAO,MAChB,KAAI,EAAE,SAAS,EAAE,KAAM,QAAO;AAEhC,QAAO;;;;;;;;;;;;;;;;;;AAmBT,MAAM,iBAAgC,EAAE,OAAO,kBAAkB;CAC/D,MAAM,SAAkD,EAAE;AAE1D,MAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;EAC3C,MAAM,MAAM,YAAY;EACxB,MAAM,qBAAqB,YAAY,IAAI;EAC3C,MAAM,UAAU,MAAM;AACtB,MAAI,YAAY,MAAM,KAAK,CAAC,aAAa,MAAM,qBAAqB,QAAQ,EAC1E,QAAO,OAAO;;AAIlB,QAAO;;;;;ACjDT,MAAM,wBAAwB,KAA8B,SAAmB;CAC7E,MAAM,SAAkC,EAAE;AAC1C,MAAK,SAAS,OAAO;EACnB,MAAM,QAAQ,IAAI;AAClB,MAAI,MACF,QAAO,MAAM;GAEf;AACF,QAAO;;AAWT,MAAM,kBAAkC,EAAE,OAAO,kBAAkB;CACjE,MAAM,SAAS,EAAE;AAEjB,KAAI,QAAQ,MAAM,IAAI,QAAQ,YAAY,CAAE,QAAO;AAEnD,QAAO,QAAQ,MAAM,CAAC,SAAS,CAAC,KAAK,WAAW;AAC9C,MAAI,MAAM,QAAQ,MAAM,IAAI,MAAM,SAAS,EACzC,OAAM,SAAS,OAAO,MAAM;GAC1B,MAAM,kBAAkB,YAAY;AACpC,OAAI,mBAAmB,KAAM;AAC7B,OAAI,QAAQ,CAAC,iBAAiB,IAAI,EAAE,MAAM;IAC1C;WACO,OAAO,UAAU,YAAY,UAAU,KAChD,QAAO,QAAQ,MAAM,CAAC,SAAS,CAAC,UAAU,gBAAgB;AACxD,OAAI,QAAQ,CAAC,UAAU,IAAI,EAAE,WAAW;IACxC;WACO,SAAS,MAAM;GACxB,MAAM,kBAAkB,YAAY;AACpC,OAAI,mBAAmB,KAAM;AAC7B,OAAI,QAAQ,CAAC,iBAAiB,IAAI,EAAE,MAAM;;GAE5C;AAEF,QAAO,qBAAqB,QAAQ,YAAY;;;;;ACGlD,MAAM,6BAAa,IAAI,SAGpB;AAEH,MAAM,oBACH,EAAE,OAAO,aAAa,MAAM,IAAI,KAAK,QAAQ,YAAY,YACzD,EAAE,QAAQ,EAAE,EAAE,GAAG,YAAY;CAC5B,MAAM,gBAAgB,eAAe,MAAM;AAE3C,KAAI,QAAQ,cAAc,CAAE,QAAO;CAEnC,MAAM,EAAE,UAAU,aAAa,YAAY,GAAG,cAAc;CAE5D,MAAM,gBAAgB,eACpB,OAAO;EAAE,OAAO;EAAY;EAAK;EAAU,aAAa;EAAW,CAAC;AAEtE,KAAI,QAAQ,YAAY,IAAI,QAAQ,WAAW,CAC7C,QAAO,GAAG;UACN,aAAa,cAAc,CAAC;;CAKlC,MAAM,EAAE,OAAO,sBAAsB;CAErC,IAAI;CAEJ,MAAM,SAAS,WAAW,IAAI,cAAc;AAC5C,KAAI,UAAU,OAAO,gBAAgB,kBACnC,kBAAiB,OAAO;MACnB;EACL,IAAI,cAAc;AAElB,MAAI,UACF,eAAc,eAAe;GAC3B,OAAO;GACP,aAAa;GACd,CAAC;AAQJ,mBAAiB,cAAc;GAC7B,OANuB,eAAe;IACtC,OAAO;IACP,aAAa;IACd,CAAC;GAIA,aAAa;GACd,CAAC;AAEF,aAAW,IAAI,eAAe;GAC5B,aAAa;GACb,WAAW;GACZ,CAAC;;AAGJ,QAAO,kBAAkB,KAAK,SAAiB;EAC7C,MAAM,kBAAkB,eAAe;AAEvC,MAAI,CAAC,mBAAmB,CAAC,MAAO,QAAO;EAEvC,MAAM,SAAS,aAAa,gBAAgB;AAE5C,SAAO,AAAC,MAA8B,KAAK;UACvC,OAAO;;GAEX;;;;;AChHN,MAAM,mBAAoC,gBAAgB;AAIxD,QAHe,OAAO,KAAK,YAAY,CAAC,MACrC,GAAG,OAAO,YAAY,MAAM,MAAM,YAAY,MAAM,GACtD;;;;;;;;;;;;;;;;;ACmBH,SAAgB,YACd,OAC+C;CAC/C,MAAM,EAAE,aAAa,WAAW,OAAO;CAEvC,MAAM,oBACJ,eAAe,CAAC,QAAQ,YAAY,GAAG,gBAAgB,YAAY,GAAG;CAExE,MAAM,QACJ,eAAe,CAAC,QAAQ,YAAY,GAChC,mBAAmB;EAAE;EAAa,KAAK,OAAO;EAAK;EAAU,CAAC,GAC9D;AAEN,QAAO;EACL,GAAG;EACH,YAAY;GAAE;GAAmB;GAAO;EACzC;;;;;;;;;;;;;;;AClBH,SAAS,SAAS,OAAgC;CAChD,MAAM,EAAE,OAAO,aAAa;CAE5B,MAAM,gBAAgB,YAAY,MAAM;AAOxC,SAAQ,oBAAoB,cAAc;AAE1C,QAAOA,WAAa;EAAE,OAAO;EAAe;EAAU,CAAC;;;;;AC5BzD,MAAM,2BAA2B;CAC/B,QAAQ;CACR,cAAc;CACd,aAAa;CACb,OAAO;CACR;AAED,MAAa,sBAAsB;CACjC,MAAM;CACN,OAAO;CACP,GAAG;CACJ;AAED,MAAa,sBAAsB;CACjC,KAAK;CACL,QAAQ;CACR,GAAG;CACJ;AAED,MAAa,0BAA0B;CACrC,QAAQ;CACR,eAAe;CACf,MAAM;CACN,aAAa;CACd;AAYD,MAAM,gBAA8B,UAAU;CAC5C,MAAM,EAAE,WAAW,QAAQ,WAAW;AAEtC,KAAI,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,OAC9C,QAAO;CAGT,MAAM,aAAa,CAAC,UAAU,gBAAgB,CAAC,SAAS,UAAU;CAClE,MAAM,MAAM,wBAAwB;CACpC,MAAM,IAAI,oBAAoB;CAC9B,MAAM,IAAI,oBAAoB;AAE9B,QAAO,mBAAmB,IAAI,iBAAiB,aAAa,IAAI,EAAE,qBAAqB,aAAa,IAAI,EAAE;;;;;AC9C5G,MAAM,aAAa,SAA+B,GAAG,WAA0B;CAC7E,IAAI,SAAS;AACb,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAU,QAAQ;AAClB,MAAI,IAAI,OAAO,OAAQ,WAAU,OAAO,OAAO,MAAM,GAAG;;AAE1D,QAAO;;AAGT,MAAM,aAAwB,WAAW;AACvC,KAAI,CAAC,OAAQ,QAAO;AACpB,KAAI,OAAO,WAAW,WACpB,QAAO,OAAO,UAAU;AAE1B,QAAO;;;;;ACdT,MAAM,cAAc,OAAwB,eAAyB;CACnE,MAAM,WAAW;AAEjB,KAAI,OAAO,UAAU,SAAU,QAAO,aAAa,CAAC,OAAO,OAAU,GAAG;CAExE,MAAM,eAAe,MAAM,MAAM,SAAS;AAE1C,KAAI,YAAY;AACd,MAAI,aAAc,QAAO,CAAC,WAAW,MAAM,EAAE,aAAa,GAAG;AAC7D,SAAO,CAAC,OAAO,OAAU;;AAG3B,KAAI,aAAc,QAAO,WAAW,MAAM;AAC1C,QAAO;;;;;ACFT,MAAM,cAAc,QAAiB,CAAC,OAAO,QAAQ;AAQrD,MAAM,SAAgB,OAAO,WAAW,IAAI,aAAa,UAAkC;AACzF,KAAI,WAAW,MAAM,CAAE,QAAO;CAG9B,MAAM,IAAI;CAEV,MAAM,CAAC,KAAK,QAAQ,UAAU,GAAa,KAAK;AAChD,KAAI,WAAW,IAAI,CAAE,QAAO;AAC5B,KAAI,QAAQ,KAAK,OAAO,QAAQ,SAAU,QAAO;CAEjD,MAAM,aAAa,YAAY,CAAC,OAAO,MAAM,IAAI;AACjD,KAAI,cAAc,CAAC,QAAQ,eAAe,KAAM,QAAO,GAAG,MAAM;AAChE,KAAI,cAAc,CAAC,KAAM,QAAO,GAAG,MAAM,SAAS;AAClD,KAAI,cAAc,SAAS,QAAQ,eAAe,MAAO,QAAO,GAAG,MAAM,SAAS;AAClF,KAAI,KAAM,QAAO;AAEjB,QAAO,GAAG,MAAM;;;;;ACvBlB,MAAM,cAA0B,GAAG,SACjC,KAAK,MAAM,MAAM,OAAO,MAAM,eAAe,MAAM,KAAK;AAQ1D,MAAM,UAAkB,OAAO,UAAU,eAAe;CACtD,MAAM,QAAQ,WAAW,GAAG,MAAM;AAElC,KAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,MAAM,KAAK,SAAS,MAAM,MAAM,UAAU,WAAW,CAAC,CAAC,KAAK,IAAI;AAGzE,QAAO,MAAM,OAAO,UAAU,WAAW;;;;;AC/B3C,MAAMC,kBAAgB,MAAe,CAAC,CAAC,KAAK,MAAM;AAclD,MAAMC,iBAAe,MACnBD,eAAa,EAAE,KAAK,IACpBA,eAAa,EAAE,IAAI,IACnBA,eAAa,EAAE,OAAO,IACtBA,eAAa,EAAE,KAAK,IACpBA,eAAa,EAAE,MAAM,IACrBA,eAAa,EAAE,QAAQ,IACvBA,eAAa,EAAE,SAAS,IACxBA,eAAa,EAAE,WAAW,IAC1BA,eAAa,EAAE,YAAY;AAE7B,MAAM,kBAAkB,MAAoB;CAC1C,MAAM,UAAgB;EAAC,EAAE;EAAM,EAAE;EAAM,EAAE;EAAM,EAAE;EAAK;AACtD,KAAIA,eAAa,EAAE,IAAI,EAAE;AACvB,UAAQ,KAAK,EAAE;AACf,UAAQ,KAAK,EAAE;;AAEjB,KAAIA,eAAa,EAAE,OAAO,EAAE;AAC1B,UAAQ,KAAK,EAAE;AACf,UAAQ,KAAK,EAAE;;AAEjB,KAAIA,eAAa,EAAE,KAAK,EAAE;AACxB,UAAQ,KAAK,EAAE;AACf,UAAQ,KAAK,EAAE;;AAEjB,KAAIA,eAAa,EAAE,MAAM,EAAE;AACzB,UAAQ,KAAK,EAAE;AACf,UAAQ,KAAK,EAAE;;AAEjB,KAAIA,eAAa,EAAE,QAAQ,CAAE,SAAQ,KAAK,EAAE;AAC5C,KAAIA,eAAa,EAAE,SAAS,CAAE,SAAQ,KAAK,EAAE;AAC7C,KAAIA,eAAa,EAAE,YAAY,CAAE,SAAQ,KAAK,EAAE;AAChD,KAAIA,eAAa,EAAE,WAAW,CAAE,SAAQ,KAAK,EAAE;AAC/C,QAAO;;AAGT,MAAME,qBAAmB,SAAe,SAAyB;CAC/D,MAAM,CAAC,IAAI,IAAI,IAAI,MAAM;AACzB,KAAI,QAAQ,OAAO,KAAK,GAAG,QAAQ,QAAQ,IAAI,GAAG,CAAE,QAAO,kBAAkB,KAAK,GAAG,CAAC;AACtF,KAAI,OAAO,MAAM,OAAO,GAAI,QAAO,kBAAkB,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC;AAC1E,KAAI,MAAM,OAAO,MAAM,GAAI,QAAO,kBAAkB,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC;AACrF,QAAO,kBAAkB,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC;;AAGxE,MAAM,aAAa;CACjB;CACA;CACA;CACA;CACD;AAED,MAAMC,sBAAoB,SAAe,SAAyB;CAChE,IAAI,SAAS;AACb,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,IAClC,KAAIH,eAAa,QAAQ,GAAG,CAAE,WAAU,GAAG,WAAW,GAAG,IAAI,KAAK,QAAQ,GAAG,CAAC;AAEhF,QAAO;;AAKT,MAAM,gBAA8B,cAAc,UAAU;AAC1D,KAAI,CAACC,cAAY,MAAM,CAAE,QAAO;CAChC,MAAM,QAAQ,UAAc,MAAM,OAAO,SAAS;CAClD,MAAM,UAAU,eAAe,MAAM;AACrC,KAAI,QAAQ,OAAO,QAAQD,eAAa,IAAI,CAAC,CAAE,QAAOE,kBAAgB,SAAS,KAAK;AACpF,QAAOC,mBAAiB,SAAS,KAAK;;;;;AClExC,MAAM,gBAAgB,MAAe,CAAC,CAAC,KAAK,MAAM;AAkBlD,MAAM,cAA2B;CAC/B,OAAO;EAAE,MAAM;EAAO,UAAU,SAAS;EAAM;CAC/C,QAAQ;EAAE,MAAM;EAAO,UAAU,SAAS,UAAU;EAAQ;CAC5D,SAAS;EAAE,MAAM;EAAO,UAAU,SAAS,WAAW;EAAQ;CAC9D,gBAAgB;EAAE,MAAM;EAAM,UAAU,SAAS,UAAU,KAAK;EAAS;CACzE,gBAAgB,EAAE,UAAU,SAAS,UAAU,KAAK,SAAS;CAC7D,gBAAgB,EAAE,UAAU,SAAS,UAAU,KAAK,SAAS;CAC9D;AAED,MAAM,eAAe,SACnB,aAAa,KAAK,IAAI,IACtB,aAAa,KAAK,OAAO,IACzB,aAAa,KAAK,KAAK,IACvB,aAAa,KAAK,MAAM,IACxB,aAAa,KAAK,EAAE,IACpB,aAAa,KAAK,EAAE,IACpB,aAAa,KAAK,KAAK;AAEzB,MAAM,gBAAgB,EAAE,MAAM,GAAG,GAAG,KAAK,MAAM,OAAO,aAAyB;CAC7E,MAAM,QAAiB;EAAC;EAAM;EAAM;EAAM;EAAK;AAC/C,KAAI,aAAa,EAAE,EAAE;AACnB,QAAM,KAAK;AACX,QAAM,KAAK;;AAEb,KAAI,aAAa,EAAE,EAAE;AACnB,QAAM,KAAK;AACX,QAAM,KAAK;;AAEb,KAAI,aAAa,IAAI,CAAE,OAAM,KAAK;AAClC,KAAI,aAAa,MAAM,CAAE,OAAM,KAAK;AACpC,KAAI,aAAa,OAAO,CAAE,OAAM,KAAK;AACrC,KAAI,aAAa,KAAK,CAAE,OAAM,KAAK;AACnC,QAAO;;AAGT,MAAM,mBAAmB,UAAoB,OAAgB,SAA8B;CACzF,MAAM,CAAC,GAAG,GAAG,GAAG,KAAK;AACrB,KAAI,MAAM,OAAO,KAAK,GAAG,QAAQ,QAAQ,IAAI,GAAG,CAAE,QAAO,GAAG,SAAS,IAAI,KAAK,EAAE,CAAC;AACjF,KAAI,MAAM,KAAK,MAAM,EAAG,QAAO,GAAG,SAAS,IAAI,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC;AAClE,KAAI,KAAK,MAAM,KAAK,EAAG,QAAO,GAAG,SAAS,IAAI,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC;AAC5E,QAAO,GAAG,SAAS,IAAI,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC;;AAGlE,MAAM,oBACJ,OACA,SACA,SACG;CACH,MAAM,CAAC,GAAG,GAAG,GAAG,KAAK;CACrB,IAAI,SAAS;AACb,KAAI,aAAa,EAAE,CAAE,WAAU,GAAG,QAAQ,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;AAC7D,KAAI,aAAa,EAAE,CAAE,WAAU,GAAG,QAAQ,SAAS,CAAC,IAAI,KAAK,EAAE,CAAC;AAChE,KAAI,aAAa,EAAE,CAAE,WAAU,GAAG,QAAQ,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC;AAC9D,KAAI,aAAa,EAAE,CAAE,WAAU,GAAG,QAAQ,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC;AAC/D,QAAO;;AAKT,MAAM,QACH,WAAW,QACX,UAAU,WAAW;AACpB,KAAI,CAAC,YAAY,OAAO,CAAE,QAAO;CACjC,MAAM,EAAE,MAAM,YAAY,YAAY;CACtC,MAAM,QAAQ,UAAkB,OAAO,MAAM,OAAO,UAAU,KAAK,GAAG;CACtE,MAAM,QAAQ,aAAa,OAAO;AAClC,KAAI,MAAM,OAAO,QAAQ,aAAa,IAAI,CAAC,CAAE,QAAO,gBAAgB,UAAU,OAAO,KAAK;AAC1F,QAAO,iBAAiB,OAAO,SAAS,KAAK;;;;;AC5FjD,MAAM,aAAa,KAAa,MAAgB,KAAK,OAAO,KAAK,GAAG,IAAI,IAAI,EAAE;;;;;;;;;;;;;;;;;;AAmB9E,MAAM,kBACJ,GACA,GACA,QACoC;AACpC,SAAQ,EAAE,IAAV;EACE,KAAK;AACH,OAAI,CAAC,EAAE,WAAY,QAAO;AAC1B,UAAO,GAAG;;;;;;;EAQZ,KAAK;AACH,OAAI,CAAC,EAAE,gBAAiB,QAAO;AAC/B,UAAO,GAAG;gCACgB,EAAE,gBAAgB;;EAG9C,KAAK,aAAa;GAChB,MAAM,QAAQ,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI;AACjE,UAAO,QAAQ,cAAc,MAAM,KAAK;;EAG1C,KAAK;AACH,OAAI,CAAC,EAAE,UAAW,QAAO;AACzB,UAAO,GAAG;;;;;EAMZ,KAAK;AACH,OAAI,CAAC,EAAE,SAAU,QAAO;AACxB,UAAO,GAAG;;;;;;;EAQZ,KAAK,YACH,QAAQ,EAAE,aAAoC;EAEhD,QACE,QAAO;;;AAIb,MAAM,qBACJ,GACA,GACA,KACA,MACA,WACA,mBACoC;AACpC,SAAQ,EAAE,MAAV;EACE,KAAK,SACH,QAAO,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK;EAEnC,KAAK,UACH,QAAO,UAAU,EAAE,KAAK,KAAK,EAAE,EAAE,KAAK,CAAC;EAEzC,KAAK,mBACH,QAAO,UAAU,EAAE,KAAK,KAAK,GAAG,EAAE,KAAK,KAAK,MAAM,EAAE,GAAG,CAAC,CAAC;EAE3D,KAAK,OACH,QACE,UAAU,EAAE,UAAU;GACpB,MAAM,EAAE,EAAE,KAAK;GACf,GAAG,EAAE,EAAE,KAAK;GACZ,GAAG,EAAE,EAAE,KAAK;GACZ,KAAK,EAAE,EAAE,KAAK;GACd,MAAM,EAAE,EAAE,KAAK;GACf,QAAQ,EAAE,EAAE,KAAK;GACjB,OAAO,EAAE,EAAE,KAAK;GACjB,CAAC,IAAI;EAGV,KAAK,gBACH,QACE,eAAe;GACb,MAAM,EAAE,EAAE,KAAK;GACf,KAAK,EAAE,EAAE,KAAK;GACd,QAAQ,EAAE,EAAE,KAAK;GACjB,MAAM,EAAE,EAAE,KAAK;GACf,OAAO,EAAE,EAAE,KAAK;GAChB,SAAS,EAAE,EAAE,KAAK;GAClB,UAAU,EAAE,EAAE,KAAK;GACnB,YAAY,EAAE,EAAE,KAAK;GACrB,aAAa,EAAE,EAAE,KAAK;GACvB,CAAC,IAAI;EAGV,KAAK,UACH,QAAO,eAAe,GAAG,GAAG,IAAI;;;;;;AC3FtC,MAAM,cAAoC;CAExC;EAAE,MAAM;EAAW,IAAI;EAAc;CAGrC;EAAE,MAAM;EAAU,KAAK;EAAO,KAAK;EAAO;CAC1C;EAAE,MAAM;EAAU,KAAK;EAAW,KAAK;EAAW;CAClD;EAAE,MAAM;EAAU,KAAK;EAAY,KAAK;EAAY;CACpD;EAAE,MAAM;EAAU,KAAK;EAAc,KAAK;EAAa;CACvD;EAAE,MAAM;EAAU,KAAK;EAAS,KAAK;EAAS;CAG9C;EACE,MAAM;EACN,UAAU;EACV,MAAM;GACJ,MAAM;GACN,GAAG;GACH,GAAG;GACH,KAAK;GACL,MAAM;GACN,QAAQ;GACR,OAAO;GACR;EACF;CAGD;EAAE,MAAM;EAAoB,KAAK;EAAS,MAAM,CAAC,SAAS,OAAO;EAAE;CACnE;EAAE,MAAM;EAAoB,KAAK;EAAa,MAAM,CAAC,YAAY,UAAU;EAAE;CAC7E;EAAE,MAAM;EAAoB,KAAK;EAAa,MAAM,CAAC,YAAY,UAAU;EAAE;CAC7E;EAAE,MAAM;EAAoB,KAAK;EAAU,MAAM,CAAC,UAAU,OAAO;EAAE;CACrE;EAAE,MAAM;EAAoB,KAAK;EAAc,MAAM,CAAC,aAAa,UAAU;EAAE;CAC/E;EAAE,MAAM;EAAoB,KAAK;EAAc,MAAM,CAAC,aAAa,UAAU;EAAE;CAC/E;EAAE,MAAM;EAAW,KAAK;EAAO,KAAK;EAAO;CAC3C;EAAE,MAAM;EAAU,KAAK;EAAgB,KAAK;EAAe;CAC3D;EAAE,MAAM;EAAU,KAAK;EAAW,KAAK;EAAW;CAClD;EAAE,MAAM;EAAU,KAAK;EAAkB,KAAK;EAAiB;CAC/D;EAAE,MAAM;EAAU,KAAK;EAAkB,KAAK;EAAiB;CAC/D;EAAE,MAAM;EAAU,KAAK;EAAa,KAAK;EAAa;CACtD;EAAE,MAAM;EAAW,KAAK;EAAe,KAAK;EAAc;CAC1D;EAAE,MAAM;EAAW,KAAK;EAAc,KAAK;EAAa;CACxD;EAAE,MAAM;EAAW,KAAK;EAAmB,KAAK;EAAiB;CACjE;EAAE,MAAM;EAAW,KAAK;EAAkB,KAAK;EAAgB;CAC/D;EAAE,MAAM;EAAW,KAAK;EAAmB,KAAK;EAAiB;CACjE;EAAE,MAAM;EAAW,KAAK;EAAkB,KAAK;EAAgB;CAG/D;EACE,MAAM;EACN,UAAU;EACV,MAAM;GACJ,MAAM;GACN,GAAG;GACH,GAAG;GACH,KAAK;GACL,MAAM;GACN,QAAQ;GACR,OAAO;GACR;EACF;CACD;EACE,MAAM;EACN,UAAU;EACV,MAAM;GACJ,MAAM;GACN,GAAG;GACH,GAAG;GACH,KAAK;GACL,MAAM;GACN,QAAQ;GACR,OAAO;GACR;EACF;CAGD;EAAE,MAAM;EAAW,KAAK;EAAiB,KAAK;EAAgB;CAC9D;EAAE,MAAM;EAAW,KAAK;EAAuB,KAAK;EAAqB;CACzE;EAAE,MAAM;EAAW,KAAK;EAAqB,KAAK;EAAmB;CACrE;EAAE,MAAM;EAAW,KAAK;EAAgB,KAAK;EAAe;CAC5D;EAAE,MAAM;EAAW,KAAK;EAAsB,KAAK;EAAoB;CACvE;EAAE,MAAM;EAAW,KAAK;EAAoB,KAAK;EAAkB;CACnE;EAAE,MAAM;EAAW,KAAK;EAAkB,KAAK;EAAiB;CAChE;EAAE,MAAM;EAAW,KAAK;EAAwB,KAAK;EAAsB;CAC3E;EAAE,MAAM;EAAW,KAAK;EAAsB,KAAK;EAAoB;CACvE;EAAE,MAAM;EAAW,KAAK;EAAiB,KAAK;EAAgB;CAC9D;EAAE,MAAM;EAAW,KAAK;EAAuB,KAAK;EAAqB;CACzE;EAAE,MAAM;EAAW,KAAK;EAAqB,KAAK;EAAmB;CAGrE;EAAE,MAAM;EAAW,KAAK;EAAgB,KAAK;EAAe;CAC5D;EAAE,MAAM;EAAW,KAAK;EAAsB,KAAK;EAAoB;CACvE;EAAE,MAAM;EAAW,KAAK;EAAoB,KAAK;EAAkB;CACnE;EAAE,MAAM;EAAW,KAAK;EAAe,KAAK;EAAc;CAC1D;EAAE,MAAM;EAAW,KAAK;EAAqB,KAAK;EAAmB;CACrE;EAAE,MAAM;EAAW,KAAK;EAAmB,KAAK;EAAiB;CAGjE;EAAE,MAAM;EAAU,KAAK;EAAiB,KAAK;EAAgB;CAC7D;EAAE,MAAM;EAAU,KAAK;EAAe,KAAK;EAAc;CACzD;EAAE,MAAM;EAAU,KAAK;EAAc,KAAK;EAAa;CACvD;EAAE,MAAM;EAAU,KAAK;EAAQ,KAAK;EAAQ;CAC5C;EAAE,MAAM;EAAU,KAAK;EAAc,KAAK;EAAa;CACvD;EAAE,MAAM;EAAU,KAAK;EAAkB,KAAK;EAAiB;CAC/D;EAAE,MAAM;EAAU,KAAK;EAAa,KAAK;EAAY;CACrD;EAAE,MAAM;EAAU,KAAK;EAAa,KAAK;EAAY;CACrD;EAAE,MAAM;EAAU,KAAK;EAAe,KAAK;EAAc;CACzD;EAAE,MAAM;EAAU,KAAK;EAAa,KAAK;EAAY;CACrD;EAAE,MAAM;EAAU,KAAK;EAAmB,KAAK;EAAkB;CACjE;EAAE,MAAM;EAAU,KAAK;EAAiB,KAAK;EAAgB;CAC7D;EAAE,MAAM;EAAU,KAAK;EAAgB,KAAK;EAAe;CAC3D;EAAE,MAAM;EAAU,KAAK;EAAe,KAAK;EAAc;CACzD;EAAE,MAAM;EAAU,KAAK;EAAiB,KAAK;EAAgB;CAC7D;EAAE,MAAM;EAAU,KAAK;EAAc,KAAK;EAAa;CACvD;EAAE,MAAM;EAAW,KAAK;EAAW,KAAK;EAAU;CAClD;EAAE,MAAM;EAAW,KAAK;EAAc,KAAK;EAAa;CAGxD;EAAE,MAAM;EAAU,KAAK;EAAQ,KAAK;EAAQ;CAC5C;EAAE,MAAM;EAAU,KAAK;EAAa,KAAK;EAAY;CACrD;EAAE,MAAM;EAAW,KAAK;EAAqB,KAAK;EAAmB;CACrE;EAAE,MAAM;EAAU,KAAK;EAAkB,KAAK;EAAgB;CAC9D;EAAE,MAAM;EAAW,KAAK;EAAkB,KAAK;EAAgB;CAC/D;EAAE,MAAM;EAAU,KAAK;EAAe,KAAK;EAAc;CACzD;EAAE,MAAM;EAAU,KAAK;EAAmB,KAAK;EAAiB;CAChE;EAAE,MAAM;EAAW,KAAK;EAAmB,KAAK;EAAiB;CACjE;EAAE,MAAM;EAAW,KAAK;EAAqB,KAAK;EAAmB;CACrE;EAAE,MAAM;EAAW,KAAK;EAAY,KAAK;EAAW;CACpD;EAAE,MAAM;EAAU,KAAK;EAAY,KAAK;EAAW;CACnD;EAAE,MAAM;EAAU,KAAK;EAAkB,KAAK;EAAgB;CAC9D;EAAE,MAAM;EAAU,KAAK;EAAgB,KAAK;EAAc;CAC1D;EAAE,MAAM;EAAW,KAAK;EAAgB,KAAK;EAAc;CAC3D;EAAE,MAAM;EAAU,KAAK;EAAiB,KAAK;EAAgB;CAC7D;EAAE,MAAM;EAAU,KAAK;EAAuB,KAAK;EAAqB;CACxE;EAAE,MAAM;EAAU,KAAK;EAAyB,KAAK;EAAuB;CAC5E;EAAE,MAAM;EAAU,KAAK;EAAsB,KAAK;EAAoB;CAGtE;EAAE,MAAM;EAAU,KAAK;EAAc,KAAK;EAAa;CACvD;EAAE,MAAM;EAAU,KAAK;EAAmB,KAAK;EAAkB;CACjE;EAAE,MAAM;EAAU,KAAK;EAAS,KAAK;EAAS;CAC9C;EAAE,MAAM;EAAU,KAAK;EAAW,KAAK;EAAW;CAClD;EAAE,MAAM;EAAU,KAAK;EAAU,KAAK;EAAU;CAChD;EAAE,MAAM;EAAU,KAAK;EAAkB,KAAK;EAAiB;CAG/D;EAAE,MAAM;EAAU,KAAK;EAAe,KAAK;EAAc;CACzD;EAAE,MAAM;EAAU,KAAK;EAAQ,KAAK;EAAQ;CAC5C;EAAE,MAAM;EAAU,KAAK;EAAe,KAAK;EAAc;CACzD;EAAE,MAAM;EAAW,KAAK;EAAa,KAAK;EAAY;CACtD;EAAE,MAAM;EAAW,KAAK;EAAoB,KAAK;EAAkB;CACnE;EAAE,MAAM;EAAW,KAAK;EAAgB,KAAK;EAAe;CAC5D;EAAE,MAAM;EAAU,KAAK;EAAc,KAAK;EAAa;CACvD;EAAE,MAAM;EAAU,KAAK;EAAgB,KAAK;EAAe;CAC3D;EAAE,MAAM;EAAU,KAAK;EAAe,KAAK;EAAc;CACzD;EAAE,MAAM;EAAU,KAAK;EAAgB,KAAK;EAAe;CAC3D;EAAE,MAAM;EAAU,KAAK;EAAyB,KAAK;EAAuB;CAC5E;EAAE,MAAM;EAAU,KAAK;EAA2B,KAAK;EAAyB;CAChF;EAAE,MAAM;EAAU,KAAK;EAAuB,KAAK;EAAqB;CACxE;EAAE,MAAM;EAAU,KAAK;EAAc,KAAK;EAAa;CACvD;EAAE,MAAM;EAAU,KAAK;EAAmB,KAAK;EAAiB;CAChE;EAAE,MAAM;EAAU,KAAK;EAAkB,KAAK;EAAiB;CAC/D;EAAE,MAAM;EAAU,KAAK;EAAmB,KAAK;EAAkB;CACjE;EAAE,MAAM;EAAU,KAAK;EAAyB,KAAK;EAAuB;CAC5E;EAAE,MAAM;EAAU,KAAK;EAAwB,KAAK;EAAsB;CAC1E;EAAE,MAAM;EAAU,KAAK;EAAyB,KAAK;EAAuB;CAC5E;EAAE,MAAM;EAAU,KAAK;EAA6B,KAAK;EAA2B;CACpF;EAAE,MAAM;EAAU,KAAK;EAAyB,KAAK;EAAuB;CAC5E;EAAE,MAAM;EAAU,KAAK;EAAiB,KAAK;EAAgB;CAC7D;EAAE,MAAM;EAAU,KAAK;EAAuB,KAAK;EAAqB;CACxE;EAAE,MAAM;EAAU,KAAK;EAAuB,KAAK;EAAqB;CACxE;EAAE,MAAM;EAAU,KAAK;EAAkB,KAAK;EAAiB;CAC/D;EAAE,MAAM;EAAU,KAAK;EAAgB,KAAK;EAAe;CAC3D;EAAE,MAAM;EAAU,KAAK;EAAe,KAAK;EAAc;CACzD;EAAE,MAAM;EAAU,KAAK;EAAgB,KAAK;EAAe;CAC3D;EAAE,MAAM;EAAU,KAAK;EAAiB,KAAK;EAAgB;CAC7D;EAAE,MAAM;EAAU,KAAK;EAAe,KAAK;EAAc;CACzD;EAAE,MAAM;EAAU,KAAK;EAAa,KAAK;EAAY;CACrD;EAAE,MAAM;EAAU,KAAK;EAAkB,KAAK;EAAiB;CAC/D;EAAE,MAAM;EAAU,KAAK;EAAe,KAAK;EAAc;CACzD;EAAE,MAAM;EAAU,KAAK;EAAc,KAAK;EAAa;CACvD;EAAE,MAAM;EAAU,KAAK;EAAa,KAAK;EAAY;CACrD;EAAE,MAAM;EAAU,KAAK;EAAgB,KAAK;EAAe;CAC3D;EAAE,MAAM;EAAU,KAAK;EAAa,KAAK;EAAa;CACtD;EAAE,MAAM;EAAU,KAAK;EAAW,KAAK;EAAW;CAGlD;EAAE,MAAM;EAAU,KAAK;EAAc,KAAK;EAAa;CACvD;EAAE,MAAM;EAAU,KAAK;EAAoB,KAAK;EAAkB;CAClE;EAAE,MAAM;EAAU,KAAK;EAAuB,KAAK;EAAqB;CACxE;EAAE,MAAM;EAAU,KAAK;EAAmB,KAAK;EAAiB;CAGhE;EAAE,MAAM;EAAU,KAAK;EAAS,KAAK;EAAS;CAC9C;EAAE,MAAM;EAAU,KAAK;EAAc,KAAK;EAAc;CACxD;EAAE,MAAM;EAAU,KAAK;EAAoB,KAAK;EAAmB;CACnE;EAAE,MAAM;EAAW,IAAI;EAAmB;CAC1C;EAAE,MAAM;EAAU,KAAK;EAAyB,KAAK;EAAwB;CAC7E;EAAE,MAAM;EAAU,KAAK;EAAmB,KAAK;EAAkB;CACjE;EAAE,MAAM;EAAU,KAAK;EAAqB,KAAK;EAAoB;CACrE;EAAE,MAAM;EAAU,KAAK;EAAuB,KAAK;EAAsB;CACzE;EAAE,MAAM;EAAU,KAAK;EAAqB,KAAK;EAAoB;CACrE;EAAE,MAAM;EAAU,KAAK;EAAmB,KAAK;EAAkB;CAGjE;EACE,MAAM;EACN,MAAM;GACJ,MAAM;GACN,KAAK;GACL,QAAQ;GACR,MAAM;GACN,OAAO;GACP,SAAS;GACT,UAAU;GACV,YAAY;GACZ,aAAa;GACd;EACF;CACD;EAAE,MAAM;EAAU,KAAK;EAAU,KAAK;EAAU;CAChD;EAAE,MAAM;EAAU,KAAK;EAAc,KAAK;EAAa;CACvD;EAAE,MAAM;EAAU,KAAK;EAAiB,KAAK;EAAgB;CAC7D;EAAE,MAAM;EAAU,KAAK;EAAe,KAAK;EAAc;CACzD;EAAE,MAAM;EAAU,KAAK;EAAgB,KAAK;EAAe;CAC3D;EACE,MAAM;EACN,UAAU;EACV,MAAM;GACJ,MAAM;GACN,GAAG;GACH,GAAG;GACH,KAAK;GACL,MAAM;GACN,QAAQ;GACR,OAAO;GACR;EACF;CACD;EACE,MAAM;EACN,UAAU;EACV,MAAM;GACJ,MAAM;GACN,GAAG;GACH,GAAG;GACH,KAAK;GACL,MAAM;GACN,QAAQ;GACR,OAAO;GACR;EACF;CACD;EACE,MAAM;EACN,UAAU;EACV,MAAM;GACJ,MAAM;GACN,GAAG;GACH,GAAG;GACH,KAAK;GACL,MAAM;GACN,QAAQ;GACR,OAAO;GACR;EACF;CACD;EAAE,MAAM;EAAU,KAAK;EAAgB,KAAK;EAAe;CAC3D;EAAE,MAAM;EAAU,KAAK;EAAuB,KAAK;EAAqB;CACxE;EAAE,MAAM;EAAU,KAAK;EAAuB,KAAK;EAAqB;CACxE;EAAE,MAAM;EAAU,KAAK;EAAsB,KAAK;EAAoB;CACtE;EAAE,MAAM;EAAU,KAAK;EAAuB,KAAK;EAAqB;CACxE;EAAE,MAAM;EAAU,KAAK;EAAsB,KAAK;EAAoB;CACtE;EAAE,MAAM;EAAU,KAAK;EAAkB,KAAK;EAAiB;CAE/D;EAAE,MAAM;EAAU,KAAK;EAAmB,KAAK;EAAkB;CAGjE;EAAE,MAAM;EAAU,KAAK;EAAiB,KAAK;EAAgB;CAC7D;EAAE,MAAM;EAAU,KAAK;EAAgB,KAAK;EAAe;CAC3D;EAAE,MAAM;EAAU,KAAK;EAAuB,KAAK;EAAqB;CACxE;EAAE,MAAM;EAAU,KAAK;EAAqB,KAAK;EAAmB;CACpE;EAAE,MAAM;EAAU,KAAK;EAAsB,KAAK;EAAoB;CACtE;EAAE,MAAM;EAAU,KAAK;EAAoB,KAAK;EAAkB;CAGlE;EAAE,MAAM;EAAU,KAAK;EAAuB,KAAK;EAAsB;CACzE;EAAE,MAAM;EAAU,KAAK;EAAc,KAAK;EAAa;CACvD;EAAE,MAAM;EAAU,KAAK;EAAU,KAAK;EAAU;CAChD;EAAE,MAAM;EAAU,KAAK;EAAmB,KAAK;EAAkB;CACjE;EAAE,MAAM;EAAU,KAAK;EAAkB,KAAK;EAAgB;CAC9D;EAAE,MAAM;EAAU,KAAK;EAAyB,KAAK;EAAuB;CAC5E;EAAE,MAAM;EAAU,KAAK;EAAa,KAAK;EAAa;CACtD;EAAE,MAAM;EAAU,KAAK;EAAW,KAAK;EAAW;CAClD;EAAE,MAAM;EAAU,KAAK;EAAiB,KAAK;EAAgB;CAC7D;EAAE,MAAM;EAAU,KAAK;EAAkB,KAAK;EAAiB;CAC/D;EAAE,MAAM;EAAU,KAAK;EAAiB,KAAK;EAAgB;CAC7D;EAAE,MAAM;EAAU,KAAK;EAAiB,KAAK;EAAgB;CAG7D;EAAE,MAAM;EAAW,IAAI;EAAa;CACpC;EAAE,MAAM;EAAU,KAAK;EAAkB,KAAK;EAAiB;CAC/D;EAAE,MAAM;EAAU,KAAK;EAAsB,KAAK;EAAqB;CACvE;EAAE,MAAM;EAAU,KAAK;EAA6B,KAAK;EAA2B;CACpF;EAAE,MAAM;EAAU,KAAK;EAAmB,KAAK;EAAkB;CACjE;EAAE,MAAM;EAAU,KAAK;EAA6B,KAAK;EAA2B;CACpF;EAAE,MAAM;EAAU,KAAK;EAAuB,KAAK;EAAsB;CACzE;EAAE,MAAM;EAAU,KAAK;EAAuB,KAAK;EAAqB;CACxE;EAAE,MAAM;EAAU,KAAK;EAAwB,KAAK;EAAsB;CAC1E;EAAE,MAAM;EAAU,KAAK;EAAc,KAAK;EAAc;CACxD;EAAE,MAAM;EAAU,KAAK;EAAoB,KAAK;EAAmB;CACnE;EAAE,MAAM;EAAU,KAAK;EAAuB,KAAK;EAAsB;CACzE;EAAE,MAAM;EAAU,KAAK;EAAuB,KAAK;EAAsB;CACzE;EAAE,MAAM;EAAU,KAAK;EAA8B,KAAK;EAA4B;CAGtF;EAAE,MAAM;EAAU,KAAK;EAAa,KAAK;EAAa;CACtD;EAAE,MAAM;EAAU,KAAK;EAAoB,KAAK;EAAmB;CACnE;EAAE,MAAM;EAAU,KAAK;EAAmB,KAAK;EAAkB;CACjE;EAAE,MAAM;EAAU,KAAK;EAAa,KAAK;EAAa;CACtD;EAAE,MAAM;EAAU,KAAK;EAAU,KAAK;EAAU;CAChD;EAAE,MAAM;EAAU,KAAK;EAAS,KAAK;EAAS;CAC9C;EAAE,MAAM;EAAU,KAAK;EAAe,KAAK;EAAc;CAGzD;EAAE,MAAM;EAAU,KAAK;EAAmB,KAAK;EAAkB;CACjE;EAAE,MAAM;EAAU,KAAK;EAAoB,KAAK;EAAkB;CAClE;EAAE,MAAM;EAAU,KAAK;EAAqB,KAAK;EAAmB;CACpE;EAAE,MAAM;EAAU,KAAK;EAAoB,KAAK;EAAkB;CAClE;EAAE,MAAM;EAAU,KAAK;EAAiB,KAAK;EAAgB;CAC7D;EAAE,MAAM;EAAU,KAAK;EAAkB,KAAK;EAAiB;CAC/D;EAAE,MAAM;EAAU,KAAK;EAAuB,KAAK;EAAsB;CACzE;EAAE,MAAM;EAAU,KAAK;EAAyB,KAAK;EAAuB;CAC5E;EAAE,MAAM;EAAU,KAAK;EAAyB,KAAK;EAAuB;CAG5E;EAAE,MAAM;EAAU,KAAK;EAAU,KAAK;EAAU;CAChD;EAAE,MAAM;EAAU,KAAK;EAAkB,KAAK;EAAiB;CAC/D;EAAE,MAAM;EAAU,KAAK;EAAe,KAAK;EAAc;CACzD;EAAE,MAAM;EAAU,KAAK;EAAgB,KAAK;EAAe;CAC3D;EAAE,MAAM;EAAU,KAAK;EAAmB,KAAK;EAAkB;CACjE;EAAE,MAAM;EAAU,KAAK;EAAmB,KAAK;EAAkB;CACjE;EAAE,MAAM;EAAU,KAAK;EAAoB,KAAK;EAAmB;CACnE;EAAE,MAAM;EAAU,KAAK;EAAe,KAAK;EAAc;CACzD;EAAE,MAAM;EAAU,KAAK;EAAgB,KAAK;EAAe;CAC3D;EAAE,MAAM;EAAU,KAAK;EAAgB,KAAK;EAAe;CAG3D;EAAE,MAAM;EAAU,KAAK;EAAgB,KAAK;EAAe;CAC3D;EAAE,MAAM;EAAU,KAAK;EAAS,KAAK;EAAS;CAC9C;EAAE,MAAM;EAAU,KAAK;EAAQ,KAAK;EAAQ;CAC5C;EAAE,MAAM;EAAU,KAAK;EAAa,KAAK;EAAY;CACrD;EAAE,MAAM;EAAU,KAAK;EAAW,KAAK;EAAW;CAClD;EAAE,MAAM;EAAU,KAAK;EAAsB,KAAK;EAAqB;CACvE;EAAE,MAAM;EAAU,KAAK;EAAqB,KAAK;EAAoB;CACrE;EAAE,MAAM;EAAU,KAAK;EAAiB,KAAK;EAAgB;CAC7D;EAAE,MAAM;EAAU,KAAK;EAAe,KAAK;EAAc;CACzD;EAAE,MAAM;EAAU,KAAK;EAAW,KAAK;EAAU;CACjD;EAAE,MAAM;EAAU,KAAK;EAAY,KAAK;EAAY;CACpD;EAAE,MAAM;EAAU,KAAK;EAAiB,KAAK;EAAgB;CAC7D;EAAE,MAAM;EAAU,KAAK;EAAc,KAAK;EAAa;CACvD;EAAE,MAAM;EAAU,KAAK;EAAc,KAAK;EAAa;CACvD;EAAE,MAAM;EAAU,KAAK;EAAe,KAAK;EAAe;CAC1D;EAAE,MAAM;EAAU,KAAK;EAAsB,KAAK;EAAqB;CACvE;EAAE,MAAM;EAAU,KAAK;EAAU,KAAK;EAAU;CAChD;EAAE,MAAM;EAAU,KAAK;EAAY,KAAK;EAAW;CACnD;EAAE,MAAM;EAAU,KAAK;EAAgB,KAAK;EAAe;CAC3D;EAAE,MAAM;EAAU,KAAK;EAAc,KAAK;EAAc;CACxD;EAAE,MAAM;EAAU,KAAK;EAAc,KAAK;EAAc;CACxD;EAAE,MAAM;EAAU,KAAK;EAAmB,KAAK;EAAkB;CAGjE;EAAE,MAAM;EAAU,KAAK;EAAc,KAAK;EAAa;CACvD;EAAE,MAAM;EAAU,KAAK;EAAa,KAAK;EAAY;CACrD;EAAE,MAAM;EAAU,KAAK;EAAiB,KAAK;EAAgB;CAC7D;EAAE,MAAM;EAAU,KAAK;EAAe,KAAK;EAAc;CAGzD;EAAE,MAAM;EAAU,KAAK;EAAiB,KAAK;EAAgB;CAC7D;EAAE,MAAM;EAAU,KAAK;EAAgB,KAAK;EAAe;CAC3D;EAAE,MAAM;EAAU,KAAK;EAAyB,KAAK;EAAuB;CAG5E;EAAE,MAAM;EAAU,KAAK;EAAgB,KAAK;EAAe;CAC3D;EAAE,MAAM;EAAU,KAAK;EAAgB,KAAK;EAAe;CAC3D;EAAE,MAAM;EAAU,KAAK;EAAe,KAAK;EAAc;CACzD;EAAE,MAAM;EAAU,KAAK;EAAW,KAAK;EAAW;CAGlD;EAAE,MAAM;EAAU,KAAK;EAAgB,KAAK;EAAe;CAC3D;EAAE,MAAM;EAAU,KAAK;EAAe,KAAK;EAAc;CACzD;EAAE,MAAM;EAAU,KAAK;EAAgB,KAAK;EAAe;CAC3D;EAAE,MAAM;EAAU,KAAK;EAAW,KAAK;EAAW;CAClD;EAAE,MAAM;EAAU,KAAK;EAAU,KAAK;EAAU;CAChD;EAAE,MAAM;EAAU,KAAK;EAAsB,KAAK;EAAoB;CAGtE;EAAE,MAAM;EAAW,IAAI;EAAa;CACpC;EAAE,MAAM;EAAW,IAAI;EAAY;CACnC;EAAE,MAAM;EAAW,IAAI;EAAa;CACrC;;;;ACvZD,MAAM,+BAAe,IAAI,KAAuB;AAEhD,KAAK,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;CAC3C,MAAM,IAAI,YAAY;CACtB,MAAM,UAAU,MAAc;EAC5B,IAAI,MAAM,aAAa,IAAI,EAAE;AAC7B,MAAI,CAAC,KAAK;AACR,SAAM,EAAE;AACR,gBAAa,IAAI,GAAG,IAAI;;AAE1B,MAAI,KAAK,EAAE;;AAGb,KAAI,EAAE,IAAK,QAAO,EAAE,IAAI;AACxB,KAAI,EAAE,KACJ,KAAI,MAAM,QAAQ,EAAE,KAAK,CACvB,MAAK,MAAM,KAAK,EAAE,KAAM,QAAO,EAAE;KAEjC,MAAK,MAAM,KAAK,OAAO,OAAO,EAAE,KAA+B,CAAE,QAAO,EAAE;;;;;;;;;;;;;;AAiBhF,MAAM,UAAkB,EAAE,OAAO,GAAG,KAAK,eAAe;CACtD,MAAM,QAAQ,GAAG,WAAkB,OAAO,QAAQ,SAAS;CAC3D,MAAM,YAAY,KAAK,SAAS;CAChC,MAAM,iBAAiB,aAAa,SAAS;CAG7C,MAAM,uBAAO,IAAI,KAAa;CAC9B,MAAM,YAAuB,EAAE;AAE/B,MAAK,MAAM,OAAO,OAAO,KAAK,EAAE,EAAE;EAChC,MAAM,UAAU,aAAa,IAAI,IAAI;AACrC,MAAI,CAAC,QAAS;AACd,OAAK,MAAM,OAAO,SAAS;AACzB,OAAI,KAAK,IAAI,IAAI,CAAE;AACnB,QAAK,IAAI,IAAI;AACb,aAAU,KAAK,kBAAkB,YAAY,MAAO,GAAG,KAAK,MAAM,WAAW,eAAe,CAAC;;;AAMjG,KAAI,UAAU,WAAW,KAAK,OAAO,KAAK,EAAE,CAAC,SAAS,EACpD,MAAK,MAAM,KAAK,YACd,WAAU,KAAK,kBAAkB,GAAG,GAAG,KAAK,MAAM,WAAW,eAAe,CAAC;AAIjF,QAAO,GAAG;MACN,UAAU"}
@@ -1,62 +0,0 @@
1
- import type { PropertyValue } from '../../types'
2
- import value from '../../units/value'
3
-
4
- const isValidValue = (v: unknown) => !!v || v === 0
5
-
6
- type SideValues = {
7
- top: PropertyValue | null | undefined
8
- left: PropertyValue | null | undefined
9
- right: PropertyValue | null | undefined
10
- bottom: PropertyValue | null | undefined
11
- x: PropertyValue | null | undefined
12
- y: PropertyValue | null | undefined
13
- full: PropertyValue | null | undefined
14
- }
15
-
16
- // top - right - bottom - left
17
- const resolveSides = ({ top, left, right, bottom, x, y, full }: SideValues) => {
18
- const sides = [full, full, full, full]
19
-
20
- if (isValidValue(x)) {
21
- sides[1] = x
22
- sides[3] = x
23
- }
24
-
25
- if (isValidValue(y)) {
26
- sides[0] = y
27
- sides[2] = y
28
- }
29
-
30
- if (isValidValue(top)) sides[0] = top
31
- if (isValidValue(right)) sides[1] = right
32
- if (isValidValue(bottom)) sides[2] = bottom
33
- if (isValidValue(left)) sides[3] = left
34
-
35
- return sides
36
- }
37
-
38
- const formatSpacing = (property: string, sides: (PropertyValue | null | undefined)[]) => {
39
- const [t, r, b, l] = sides
40
-
41
- if (sides.every((val, _, arr) => isValidValue(val) && val === arr[0])) return `${property}: ${t};`
42
-
43
- if (t === b && r === l) return `${property}: ${value(t)} ${value(r)};`
44
-
45
- if (t && r === l && b) return `${property}: ${value(t)} ${value(r)} ${value(b)};`
46
-
47
- if (sides.every((val) => !!val))
48
- return `${property}: ${value(t)} ${value(r)} ${value(b)} ${value(l)};`
49
-
50
- let output = ''
51
- if (t) output += `${property}-top: ${value(t)};`
52
- if (b) output += `${property}-bottom: ${value(b)};`
53
- if (l) output += `${property}-left: ${value(l)};`
54
- if (r) output += `${property}-right: ${value(r)};`
55
-
56
- return output
57
- }
58
-
59
- export type SpacingShorthand = (property: 'padding' | 'margin') => (props: SideValues) => string
60
-
61
- export const spacingShorthand: SpacingShorthand = (property) => (props) =>
62
- formatSpacing(property, resolveSides(props))