@teacss/config 0.5.2 → 0.6.2

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
@@ -6,7 +6,7 @@ TeaCSS has no `teacss.config.*` file. Entry discovery checks
6
6
  `package.json#teacss.entry`, `index.css`, then `src/index.css`.
7
7
 
8
8
  ```css
9
- @preset "standard";
9
+ @presets "standard";
10
10
  @source "./src/**/*.{ts,tsx}";
11
11
  @custom {
12
12
  --color-brand-500: #58a6ff;
@@ -14,8 +14,8 @@ TeaCSS has no `teacss.config.*` file. Entry discovery checks
14
14
  @teacss;
15
15
  ```
16
16
 
17
- The built-in preset names are `standard`, `shortcuts`, and `icons`.
18
- Shortcuts does not enable Standard. Package and local-file preset
17
+ The built-in preset names are `standard`, `official`, and `icons`.
18
+ Official does not enable Standard. Package and local-file preset
19
19
  specifiers are also supported.
20
20
 
21
21
  ```ts
@@ -56,4 +56,32 @@ Lower-level APIs:
56
56
  This package does not scan application modules, generate CSS, or manage a build
57
57
  tool's lifecycle.
58
58
 
59
+ When an entry changes, resolve it again and replace the generator configuration
60
+ with the complete new result:
61
+
62
+ ```ts
63
+ const next = await resolveEntryConfig(nextCss, entryDirectory, entryFile);
64
+ await generator.setConfig(next.config);
65
+ ```
66
+
67
+ For staged updates, pass `next.config` to `prepareConfig()` and commit the
68
+ prepared result. Do not merge the new entry result with a previous entry snapshot:
69
+ presets with the same name retain the first occurrence, which can preserve old
70
+ palette candidates after a list changes or is removed. Apply application options
71
+ to each fresh result instead. The built-in runtime reloads entries this way.
72
+
59
73
  Pre-1.0. Keep behavior aligned across build, CLI, and editor integrations.
74
+
75
+ ## Palette configuration
76
+
77
+ `@presets "standard,official";` preserves ordered, quoted CSV module names.
78
+ Repeated declarations append; imported relative paths rebase per item.
79
+ Old `@preset`, malformed lists and nested configuration directives fail.
80
+
81
+ With Standard enabled, `@primary "red,blue";` enables DOM selections through
82
+ `data-css-primary`. The same syntax applies to neutral, focused, success, warning,
83
+ failure and general. Focused follows neutral unless a configured palette is
84
+ selected. Repeated/imported lists union; sources are complete physical palettes
85
+ with no role dependencies. `@custom` defines base values, `@custom dark` color
86
+ overrides. Whole-theme variants are removed. Configuration failures retain
87
+ import/preset dependency paths for editor and development-server recovery.
package/dist/index.d.ts CHANGED
@@ -1,4 +1,19 @@
1
1
  import { Preset, UserConfig, UserConfigDefaults } from "@teacss/core";
2
+ //#region src/entry-lists.d.ts
3
+ export declare const ROLE_DIRECTIVES: readonly ["primary", "neutral", "focused", "success", "warning", "failure", "general"];
4
+ export type ColorRole = (typeof ROLE_DIRECTIVES)[number];
5
+ export type RolePalettes = Partial<Record<ColorRole, readonly string[]>>;
6
+ export interface EntryDiagnostic {
7
+ start: number;
8
+ end: number;
9
+ message: string;
10
+ }
11
+ /** Literal module names: commas separate items; CSS escapes are not decoded. */
12
+ export declare function parseEntryList(prelude: string): string[];
13
+ /** Recoverable diagnostics for editors; build callers reject these before loading. */
14
+ export declare function diagnoseEntry(css: string): EntryDiagnostic[];
15
+ export declare function assertEntryDirectives(css: string): void;
16
+ //#endregion
2
17
  //#region src/parseEntry.d.ts
3
18
  export interface EntrySource {
4
19
  /** The glob pattern (with any leading `!` stripped). */
@@ -13,36 +28,19 @@ export interface EntryCustomDecl {
13
28
  value: string;
14
29
  }
15
30
  export interface EntryCustomBlock {
16
- /**
17
- * Mode name from the prelude (`@custom dark`); undefined for the base
18
- * `@custom {}`. On a theme variant block, the `dark` sub-block mode.
19
- */
31
+ /** Mode name, or undefined for the base block. */
20
32
  mode?: string;
21
- /** Theme variant name from a `@custom theme <name> [dark]` prelude. */
22
- theme?: string;
23
33
  declarations: EntryCustomDecl[];
24
34
  }
25
- /** A `@custom` prelude, interpreted: base block, mode block, theme variant block, or invalid. */
35
+ /** The retired leading word theme is never interpreted as a mode. */
26
36
  export type CustomPrelude = {
27
37
  kind: "base";
28
38
  } | {
29
39
  kind: "mode";
30
40
  mode: string;
31
- } | {
32
- kind: "theme";
33
- theme: string;
34
- mode?: "dark";
35
41
  } | {
36
42
  kind: "invalid";
37
43
  };
38
- /**
39
- * Interpret a `@custom` prelude. The `theme` leading word claims the theme
40
- * variant grammar (`theme <name>` / `theme <name> dark`, kebab names, `dark` /
41
- * `light` reserved); anything else `theme`-led is invalid and its block must
42
- * register nothing. Non-`theme` preludes keep their historic meaning: the
43
- * whole prelude is the mode name. Shared by `parseEntry` and `diagnoseCustom`
44
- * so the build and the editor agree on which blocks are alive.
45
- */
46
44
  export declare function parseCustomPrelude(prelude: string | undefined): CustomPrelude;
47
45
  export interface EntryShortcut {
48
46
  /** Shortcut class name, e.g. `popup-surface`. */
@@ -51,8 +49,10 @@ export interface EntryShortcut {
51
49
  expansion: string;
52
50
  }
53
51
  export interface EntryConfig {
54
- /** `@preset "<spec>"` specifiers, in source order. */
52
+ /** `@presets "<spec>"` specifiers, in source order. */
55
53
  presets: string[];
54
+ /** Explicit selectable physical palettes, only present for declared roles. */
55
+ rolePalettes?: RolePalettes;
56
56
  /** `@source "<glob>"` entries (`!`-prefixed → exclude). */
57
57
  sources: EntrySource[];
58
58
  /** `@custom {}` / `@custom <mode> {}` blocks, in source order. */
@@ -75,24 +75,10 @@ export declare function parseEntry(css: string): EntryConfig;
75
75
  //#endregion
76
76
  //#region src/customToTheme.d.ts
77
77
  export interface CustomToThemeResult {
78
- /**
79
- * Theme patch to deep-merge over the preset theme (pass as `createGenerator`'s
80
- * `theme`). Base blocks land at `theme.<ns>...`; mode blocks at
81
- * `theme.modes.<mode>.<ns>...`; theme variant blocks at
82
- * `theme.themes.<name>.<ns>...` (dark sub-blocks under
83
- * `theme.themes.<name>.modes.dark.<ns>...`). The theme preflight emits the
84
- * `:root` / `.<mode>` / `.theme-<name>` CSS from this, so no separate
85
- * emission is needed.
86
- */
78
+ /** Base values and color mode overrides, deep-merged over preset configuration. */
87
79
  theme: Record<string, any>;
88
80
  /** Var names whose prefix matched no namespace or used an illegal color step. */
89
81
  unknown: string[];
90
- /**
91
- * Theme-variant var names that override no declared base value (neither the
92
- * resolved preset theme nor a base `@custom` block defines them) — not
93
- * registered. Always empty when no base theme is passed.
94
- */
95
- undeclared: string[];
96
82
  }
97
83
  export interface Namespace {
98
84
  /** Var-name prefix, e.g. `color`, `font-family`, `spacing`. */
@@ -135,26 +121,8 @@ export type CustomClassification = {
135
121
  * theme-patch builder and the LSP/build diagnostics so they never drift.
136
122
  */
137
123
  export declare function classifyCustomVar(name: string, namespaces: Namespace[]): CustomClassification;
138
- /**
139
- * Whether a classified theme var already has a base value in one of `sources`
140
- * (the resolved preset theme, or the base-`@custom` patch built beside it).
141
- * Shared by `customToTheme` and `diagnoseCustom` so the build and the editor
142
- * agree on what a theme variant may override.
143
- */
144
- export declare function hasBaseThemeValue(c: Extract<CustomClassification, {
145
- ok: true;
146
- }>, sources: readonly Record<string, unknown>[]): boolean;
147
- /**
148
- * Turn parsed `@custom {}` / `@custom <mode> {}` / `@custom theme <name> {}`
149
- * blocks into a theme patch. `themeKeys` are the scale-namespace keys of the
150
- * resolved preset theme (e.g. `colors`, `spacing`, `radius`, `fontFamily`,
151
- * ...) — they drive the closed var-prefix → namespace mapping. Passing the
152
- * resolved `baseTheme` turns on the theme-variant contract: a variant
153
- * declaration must override a value the base theme (or a base block in
154
- * `blocks`, regardless of entry order) already declares, else it lands on
155
- * `undeclared` and registers nothing. Pure: no generator, no I/O.
156
- */
157
- export declare function customToTheme(blocks: EntryCustomBlock[], themeKeys: string[], baseTheme?: Record<string, unknown>): CustomToThemeResult;
124
+ /** Map base and mode custom properties to the corresponding theme namespaces. */
125
+ export declare function customToTheme(blocks: EntryCustomBlock[], themeKeys: string[]): CustomToThemeResult;
158
126
  //#endregion
159
127
  //#region src/diagnoseCustom.d.ts
160
128
  export interface CustomDiagnostic {
@@ -163,25 +131,11 @@ export interface CustomDiagnostic {
163
131
  /** Offset range of the property name (or the at-rule header) in the source (for mapping to an editor range). */
164
132
  start: number;
165
133
  end: number;
166
- reason: "unknown-prefix" | "illegal-color-step" | "undeclared-theme-variable" | "invalid-theme-prelude";
134
+ reason: "unknown-prefix" | "illegal-color-step" | "removed-theme";
167
135
  message: string;
168
136
  }
169
- /**
170
- * Position-aware `@custom` diagnostics: for every `--x` declaration inside a
171
- * `@custom {}` block that won't register (unknown namespace prefix, or an
172
- * illegal color step), return its source range + a message. An invalid
173
- * `theme …` prelude reports one block-level diagnostic instead of scanning
174
- * its dead declarations. Passing the generator's resolved `baseTheme` also
175
- * turns on the theme-variant contract: a variant declaration overriding no
176
- * declared base value (resolved theme, or a base block in the same css — so
177
- * unsaved edits count) reports `undeclared-theme-variable`.
178
- * `themeKeys` are the scale-namespace keys of the resolved preset theme.
179
- *
180
- * Shares the classification with `customToTheme`, so the editor and the build
181
- * agree on what registers. Pure: offsets in, no I/O — the caller maps offsets
182
- * to an editor `Range`.
183
- */
184
- export declare function diagnoseCustom(css: string, themeKeys: string[], baseTheme?: Record<string, unknown>): CustomDiagnostic[];
137
+ /** Position-aware custom-property diagnostics shared by builds and editors. */
138
+ export declare function diagnoseCustom(css: string, themeKeys: string[]): CustomDiagnostic[];
185
139
  //#endregion
186
140
  //#region src/resolveEntryConfig.d.ts
187
141
  export interface ResolveEntryResult {
@@ -189,8 +143,6 @@ export interface ResolveEntryResult {
189
143
  config: UserConfig;
190
144
  /** `@custom` var names that didn't register (decision 11 — for diagnostics/warnings). */
191
145
  unknown: string[];
192
- /** `@custom theme` var names overriding no declared base value (not registered — for diagnostics/warnings). */
193
- undeclared: string[];
194
146
  /** Whether the entry has a `@teacss;` placeholder. */
195
147
  hasTeacss: boolean;
196
148
  /** Absolute config dependencies: followed imports, sourced CSS, package preset entries, and local preset modules. */
@@ -198,7 +150,7 @@ export interface ResolveEntryResult {
198
150
  }
199
151
  /**
200
152
  * Resolve a CSS entry into a `UserConfig` — the single source every integration
201
- * uses. `@preset` → presets (no implicit default — an entry with no `@preset`
153
+ * uses. `@presets` → presets (no implicit default — an entry with no `@presets`
202
154
  * gets no presets, and the caller warns); `@source` → `content.filesystem`
203
155
  * (`!`-prefixed = exclude); `@custom` → a theme patch; `@shortcut` → custom
204
156
  * shortcuts (later declarations of the same name win); `@safelist` → safelist
@@ -211,16 +163,16 @@ export interface ResolveEntryResult {
211
163
  * entry/import scoped): they resolve before the entry's own text, so the
212
164
  * entry and its `@import`s win shortcut name conflicts while safelist
213
165
  * tokens accumulate, and the matched files join `sources`.
214
- * `base` is the entry file's directory (for `@preset` relative specifiers and
166
+ * `base` is the entry file's directory (for `@presets` relative specifiers and
215
167
  * `@import` resolution). Pass `entryFile` when the CSS has a filesystem identity
216
168
  * so an imported file that points back to the root entry closes the cycle.
217
169
  */
218
- export declare function resolveEntryConfig(entryCss: string, base: string, entryFile?: string): Promise<ResolveEntryResult>;
170
+ export declare function resolveEntryConfig(entryCss: string, base: string, entryFile?: string, /** @internal Unsaved CSS text keyed by absolute filename; never committed or written. */ sourceOverrides?: ReadonlyMap<string, string>): Promise<ResolveEntryResult>;
219
171
  //#endregion
220
172
  //#region src/resolvePresets.d.ts
221
173
  declare function getPresetSourcesFromError(error: unknown): string[];
222
174
  /**
223
- * Resolve `@preset` specifiers into preset objects for `createGenerator`.
175
+ * Resolve `@presets` specifiers into preset objects for `createGenerator`.
224
176
  * Relative paths resolve against the CSS entry directory; bare names use Node
225
177
  * resolution after mapping the exact built-in name `standard` to
226
178
  * `@teacss/preset-standard`. Local preset modules are evaluated without a
@@ -253,6 +205,8 @@ export interface ScannedCustomBlock {
253
205
  close: number;
254
206
  }
255
207
  export interface ScannedTopLevelAtRule {
208
+ /** Included only by the nested diagnostic scan. */
209
+ depth?: number;
256
210
  /** At-rule name without the leading `@`. */
257
211
  name: string;
258
212
  /** Trimmed text between the name and its terminator/opening brace. */
@@ -262,12 +216,12 @@ export interface ScannedTopLevelAtRule {
262
216
  end: number;
263
217
  terminator: ";" | "block" | "eof";
264
218
  }
265
- /** Return string values from exact, top-level at-rules such as `@preset "…"`. */
219
+ /** Return string values from exact, top-level at-rules such as `@presets "…"`. */
266
220
  export declare function scanQuotedDirectives(css: string, directive: string): string[];
267
221
  /** Whether an exact at-rule name occurs at the top level outside strings/comments. */
268
222
  export declare function hasTopLevelDirective(css: string, directive: string): boolean;
269
223
  /** Scan complete top-level at-rules without matching text in comments, strings, or nested CSS. */
270
- export declare function scanTopLevelAtRules(css: string): ScannedTopLevelAtRule[];
224
+ export declare function scanTopLevelAtRules(css: string, includeNested?: boolean): ScannedTopLevelAtRule[];
271
225
  /** Scan top-level `@custom` blocks without treating strings, comments, or nested CSS as directives. */
272
226
  export declare function scanCustomBlocks(css: string): ScannedCustomBlock[];
273
227
  //#endregion
@@ -287,7 +241,7 @@ export declare function findEntry(root: string): string | undefined;
287
241
  * directory (or entry file) to discover the entry from. There is no
288
242
  * `teacss.config.ts` — the CSS entry is the only config source. No entry found →
289
243
  * empty config (just the caller's `defaults`). An entry that declares no
290
- * `@preset` warns: config never reaches for a specific preset itself.
244
+ * `@presets` warns: config never reaches for a specific preset itself.
291
245
  */
292
246
  export declare function loadConfig<U extends UserConfig>(cwd?: string, configOrPath?: string | U, defaults?: UserConfigDefaults): Promise<LoadConfigResult<U>>;
293
247
  /**
package/dist/index.js CHANGED
@@ -1 +1,2 @@
1
- import{createRequire as e}from"node:module";import*as t from"node:fs";import n,{existsSync as r,readFileSync as i,realpathSync as a}from"node:fs";import{dirname as o,extname as s,isAbsolute as c,join as l,relative as u,resolve as d,sep as f}from"node:path";import p from"node:process";import{consola as m}from"consola";import{expandClassGroups as h,resolveConfig as g,splitClassTokens as _}from"@teacss/core";import{glob as v}from"tinyglobby";import{Buffer as y}from"node:buffer";import{readFile as b,stat as ee}from"node:fs/promises";import{fileURLToPath as te,pathToFileURL as x}from"node:url";const ne=[`100`,`150`,`200`,`300`,`400`,`500`,`600`,`700`,`800`,`850`,`900`,`950`],re=new Set(ne);function ie(e){return e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)}function S(e){return Object.keys(e).filter(t=>{if(t===`modes`||t===`defaultMode`||t===`themes`)return!1;let n=e[t];return typeof n!=`object`||!n?!1:t===`colors`||Object.values(n).every(e=>e==null||typeof e==`string`||typeof e==`number`||Array.isArray(e))})}function C(e){return e.map(e=>({key:e,prefix:e===`colors`||e===`semanticColors`?`color`:ie(e),twoLevel:e===`colors`,semanticColor:e===`semanticColors`})).sort((e,t)=>t.prefix.length-e.prefix.length)}function w(e,t,n){Object.defineProperty(e,t,{value:n,configurable:!0,enumerable:!0,writable:!0})}function T(e,t){let n=Object.hasOwn(e,t)?e[t]:void 0;if(typeof n==`object`&&n&&!Array.isArray(n))return n;let r={};return w(e,t,r),r}function E(e,t){let n=t.filter(t=>e===t.prefix||e.startsWith(`${t.prefix}-`)),r=n.find(e=>e.key===`colors`),i=n.find(e=>e.semanticColor);if(r&&i){let t=e===`color`?``:e.slice(6),n=t.lastIndexOf(`-`),a=n>0?t.slice(0,n):``,o=n>0?t.slice(n+1):``;return a&&re.has(o)?{ok:!0,nsKey:r.key,twoLevel:!0,rest:t,colorName:a,step:o}:a&&/^\d+$/.test(o)?{ok:!1,reason:`illegal-color-step`}:t?{ok:!0,nsKey:i.key,twoLevel:!1,rest:t}:{ok:!1,reason:`unknown-prefix`}}let a=n[0];if(!a)return{ok:!1,reason:`unknown-prefix`};let o=e===a.prefix?``:e.slice(a.prefix.length+1);if(a.twoLevel){let e=o.lastIndexOf(`-`),t=e>0?o.slice(0,e):``,n=e>0?o.slice(e+1):``;return!t||!re.has(n)?{ok:!1,reason:`illegal-color-step`}:{ok:!0,nsKey:a.key,twoLevel:!0,rest:o,colorName:t,step:n}}return{ok:!0,nsKey:a.key,twoLevel:!1,rest:o}}function D(e,t){if(typeof e==`object`&&e&&Object.hasOwn(e,t))return e[t]}function O(e,t){for(let n of t){let t=D(n,e.nsKey);if((e.twoLevel?D(D(t,e.colorName),e.step):D(t,e.rest||`DEFAULT`))!=null)return!0}return!1}function k(e,t,n){let r=C(t),i={},a=[],o=[],s=e=>{let t=E(e.startsWith(`--`)?e.slice(2):e,r);return t.ok||a.push(e),t},c=(e,t,n)=>{let r=T(e,t.nsKey);t.twoLevel?w(T(r,t.colorName),t.step,n):w(r,t.rest||`DEFAULT`,n)};for(let t of e){if(t.theme)continue;let e=t.mode?T(T(i,`modes`),t.mode):i;for(let{property:n,value:r}of t.declarations){let t=s(n);t.ok&&c(e,t,r)}}let l=n?[n,i]:void 0;for(let t of e){if(!t.theme)continue;let e=T(T(i,`themes`),t.theme),n=t.mode?T(T(e,`modes`),t.mode):e;for(let{property:e,value:r}of t.declarations){let t=s(e);if(t.ok){if(l&&!O(t,l)){o.push(e);continue}c(n,t,r)}}}return{theme:i,unknown:a,undeclared:o}}const ae=/[A-Za-z0-9-]/,oe=/[\w-]/;function A(e,t,n){let r=e.indexOf(`*/`,t+2);return r<0||r>=n?n:r+2}function j(e,t,n){let r=e[t];for(let i=t+1;i<n;i++)if(e[i]===`\\`)i++;else if(e[i]===r)return i+1;return n}function M(e,t,n){let r=``;for(let i=t;i<n;i++)if(e[i]===`/`&&e[i+1]===`*`)i=A(e,i,n)-1,r+=` `;else if(e[i]===`"`||e[i]===`'`){let t=j(e,i,n);r+=e.slice(i,t),i=t-1}else r+=e[i];return r.trim()}function se(e,t){let n=[],r=t.startsWith(`@`)?t.slice(1):t;for(let t of N(e)){if(t.name!==r||t.terminator!==`;`)continue;let e=t.prelude[0];if(e!==`"`&&e!==`'`)continue;let i=j(t.prelude,0,t.prelude.length);i!==t.prelude.length||i<=1||t.prelude[i-1]!==e||n.push(t.prelude.slice(1,i-1))}return n}function ce(e,t){let n=t.startsWith(`@`)?t.slice(1):t;return N(e).some(e=>e.name===n)}function le(e,t){for(let n=t;n<e.length;n++)if(e[n]===`/`&&e[n+1]===`*`)n=A(e,n,e.length)-1;else if(e[n]===`"`||e[n]===`'`)n=j(e,n,e.length)-1;else if(e[n]===`{`)return n;else if(e[n]===`;`||e[n]===`}`)return-1;return-1}function ue(e,t){let n=1;for(let r=t+1;r<e.length;r++)if(e[r]===`/`&&e[r+1]===`*`)r=A(e,r,e.length)-1;else if(e[r]===`"`||e[r]===`'`)r=j(e,r,e.length)-1;else if(e[r]===`{`)n++;else if(e[r]===`}`&&--n===0)return r;return-1}function N(e){let t=[],n=0;for(let r=0;r<e.length;r++){if(e[r]===`/`&&e[r+1]===`*`){r=A(e,r,e.length)-1;continue}if(e[r]===`"`||e[r]===`'`){r=j(e,r,e.length)-1;continue}if(e[r]===`{`){n++;continue}if(e[r]===`}`){n=Math.max(0,n-1);continue}if(n!==0||e[r]!==`@`)continue;let i=r,a=i+1;for(;oe.test(e[a]??``);)a++;if(a===i+1)continue;let o=e.slice(i+1,a),s=[],c=!1;for(let n=a;n<e.length;n++){let l=e[n];if(l===`/`&&e[n+1]===`*`)n=A(e,n,e.length)-1;else if(l===`"`||l===`'`)n=j(e,n,e.length)-1;else if(l===`(`)s.push(`)`);else if(l===`[`)s.push(`]`);else if(l===s.at(-1))s.pop();else if(s.length===0&&l===`;`){t.push({name:o,prelude:M(e,a,n),start:i,end:n+1,terminator:`;`}),r=n,c=!0;break}else if(s.length===0&&l===`{`){let s=ue(e,n);s>=0&&(t.push({name:o,prelude:M(e,a,n),start:i,end:s+1,terminator:`block`}),r=s,c=!0);break}}if(!c&&M(e,a,e.length)===``){t.push({name:o,prelude:``,start:i,end:e.length,terminator:`eof`});break}}return t}function de(e,t,n){let r=[];for(let i=t;i<n;i++){let t=e[i];if(t===`/`&&e[i+1]===`*`)i=A(e,i,n)-1;else if(t===`"`||t===`'`)i=j(e,i,n)-1;else if(t===`(`)r.push(`)`);else if(t===`[`)r.push(`]`);else if(t===`{`)r.push(`}`);else if(t===r.at(-1))r.pop();else if(t===`;`&&r.length===0)return i}return n}function fe(e,t,n){let r=[];for(let i=t;i<n;){for(;i<n;)if(/\s/.test(e[i]))i++;else if(e[i]===`/`&&e[i+1]===`*`)i=A(e,i,n);else break;let t=de(e,i,n);if(e[i]!==`-`||e[i+1]!==`-`){i=t+1;continue}let a=i+2;for(;a<n&&ae.test(e[a]);)a++;if(a===i+2){i=t+1;continue}let o=a;for(;o<n;)if(/\s/.test(e[o]))o++;else if(e[o]===`/`&&e[o+1]===`*`)o=A(e,o,n);else break;if(e[o]!==`:`){i=t+1;continue}let s=o+1,c=e.slice(s,t),l=c.trim(),u=s+c.length-c.trimStart().length,d=u+l.length;r.push({property:e.slice(i,a),value:l,start:i,end:a,colon:o,valueStart:u,valueEnd:d}),i=t+1}return r}function P(e){let t=[];for(let n of N(e)){if(n.name!==`custom`||n.terminator!==`block`)continue;let r=le(e,n.start+7);if(r<0)continue;let i=n.end-1;t.push({mode:n.prelude||void 0,declarations:fe(e,r+1,i),start:n.start,open:r,close:i})}return t}function pe(e){let t=e,n=/^url\(\s*([^)]*?)\s*\)$/i.exec(t);if(n)t=n[1];else if(/^url\(/i.test(t))return;let r=t[0];if(r===`"`||r===`'`){if(t.length<2||t[t.length-1]!==r)return;let e=t.slice(1,-1);return e.includes(r)?void 0:e}return n?t:void 0}function me(e){return!(!e||e.startsWith(`//`)||/^[a-z][\w+.-]*:/i.test(e))}function he(e){return e.split(`\\`).join(`/`)}function ge(e,t,n,r){if(!me(e)||c(e)||!r&&!e.startsWith(`./`)&&!e.startsWith(`../`))return e;let i=he(u(n,d(t,e)));return i.startsWith(`.`)?i:`./${i}`}function _e(e,t){if(t.length===0)return e;t.sort((e,t)=>e.start-t.start);let n=``,r=0;for(let i of t)n+=e.slice(r,i.start)+i.replacement,r=i.end;return n+e.slice(r)}function ve(e,t,n){if(t===n)return e;let r=[];for(let i of N(e)){if(i.terminator!==`;`||i.name!==`preset`&&i.name!==`source`)continue;let a=i.prelude[0];if(a!==`"`&&a!==`'`||i.prelude[i.prelude.length-1]!==a)continue;let o=i.prelude.slice(1,-1).trim(),s=i.name===`source`&&o.startsWith(`!`),c=s?o.slice(1):o,l=ge(c,t,n,i.name===`source`);if(l===c)continue;let u=e.slice(i.start,i.end).replace(i.prelude,`${a}${s?`!`:``}${l}${a}`);r.push({start:i.start,end:i.end,replacement:u})}return _e(e,r)}function F(e,n,r,i,a){if(a>32)return e;let s=[];for(let c of N(e)){if(c.name!==`import`||c.terminator!==`;`)continue;let e=pe(c.prelude);if(e===void 0||!me(e))continue;let l=d(n,e),u;try{u=t.statSync(l)}catch{continue}if(!u.isFile())continue;if(r.has(l)){s.push({start:c.start,end:c.end,replacement:``});continue}r.add(l),i.push(l);let f=o(l),p=F(t.readFileSync(l,`utf8`),f,r,i,a+1);p=ve(p,f,n),s.push({start:c.start,end:c.end,replacement:p})}return _e(e,s)}function ye(e,t,n){if(!e.includes(`@import`))return{css:e,files:[]};let r=[];return{css:F(e,t,new Set(n?[d(t,n)]:[]),r,0),files:r}}const be=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;function I(e){if(!e)return{kind:`base`};let t=e.split(/\s+/);if(t[0]!==`theme`)return{kind:`mode`,mode:e};let n=t[1];return!n||!be.test(n)||n===`dark`||n===`light`?{kind:`invalid`}:t.length===2?{kind:`theme`,theme:n}:t.length===3&&t[2]===`dark`?{kind:`theme`,theme:n,mode:`dark`}:{kind:`invalid`}}function xe(e){let t,n=0,r=null;for(let i=0;i<e.length;i++){let a=e[i];if(r)a===`\\`?i++:a===r&&(r=null);else if(a===`"`||a===`'`)r=a;else if(a===`/`&&e[i+1]===`*`){let r=e.indexOf(`*/`,i+2),a=r<0?e.length:r+2;(t??=[]).push(e.slice(n,i),` `),n=a,i=a-1}}return t?`${t.join(``)}${e.slice(n)}`:e}function Se(e){let t=e[0];if(t===`"`||t===`'`)for(let n=1;n<e.length;n++){let r=e[n];if(r===`\\`)n++;else if(r===t)return n===e.length-1?e.slice(1,n):void 0}}function L(e){let t=N(e),n=[],r=[],i=[],a=[],o=!1,s=!1;for(let e of t){if(e.name===`custom`&&e.terminator===`block`?o=!0:e.name===`teacss`&&e.prelude===``&&e.terminator!==`block`&&(s=!0),e.terminator!==`;`)continue;if(e.name===`shortcut`){let t=e.prelude.search(/\s/);if(t<=0)continue;let n=e.prelude.slice(0,t);if(!/^[A-Za-z_][\w-]*$/.test(n))continue;let r=Se(e.prelude.slice(t).trimStart())?.trim();r&&i.push({name:n,expansion:r});continue}if(e.name!==`preset`&&e.name!==`source`&&e.name!==`safelist`)continue;let t=Se(e.prelude)?.trim();if(!t)continue;if(e.name===`preset`){n.push(t);continue}if(e.name===`safelist`){a.push(t);continue}let c=t.startsWith(`!`),l=c?t.slice(1):t;l&&r.push({glob:l,exclude:c})}return{presets:n,sources:r,custom:o?P(e).flatMap(({mode:e,declarations:t})=>{let n=I(e);return n.kind===`invalid`?[]:[{mode:n.kind===`base`?void 0:n.mode,...n.kind===`theme`?{theme:n.theme}:{},declarations:t.map(({property:e,value:t})=>({property:e,value:xe(t).trim()}))}]}):[],shortcuts:i,safelist:a,hasTeacss:s}}let Ce;function we(){return Ce??=import(`jiti`).then(({createJiti:e})=>({createJiti:e,transformer:e(import.meta.url,{fsCache:!1,interopDefault:!0,moduleCache:!1})}))}const R=new Map,z=new WeakMap,Te=16777216,B=new Map;let V=0;const Ee={icons:`@teacss/preset-icons`,official:`@teacss/preset-official`,standard:`@teacss/preset-standard`};function De(t,n){try{return n.resolve(t)}catch(r){let i;try{i=n.resolve(`teacss/package.json`)}catch{throw r}return e(i).resolve(t)}}function Oe(t,n){if(t.startsWith(`.`)||c(t))return d(n,t);let r=e(d(n,`_`)),i=Object.hasOwn(Ee,t)?Ee[t]:void 0;return i?De(i,r):r.resolve(t)}function H(e){return e.startsWith(`.`)||c(e)}function U(e){try{return a(e)}catch{return d(e)}}function W(e,t){let n=o(e),i=[];for(;;){if(t.has(n)){let e=t.get(n);for(let n of i)t.set(n,e);return e}if(i.push(n),r(d(n,`package.json`))){for(let e of i)t.set(e,n);return n}let e=o(n);if(e===n){for(let e of i)t.set(e,void 0);return}n=e}}function ke(e,t){let n=u(t,e);return n===``||!c(n)&&n!==`..`&&!n.startsWith(`..${f}`)}function G(e,t,n){let r=W(e,n);return t.packageRoot===void 0?r===void 0&&ke(e,t.fallbackRoot):r===t.packageRoot}function K(e,t,n,r,i){if(!e||n.has(e)||(n.add(e),!c(e.filename)))return;let a=U(e.filename);if(G(a,r,i)){t.add(a);for(let a of e.children)K(a,t,n,r,i)}}function Ae(e){if(!e||typeof e!=`object`)return;let t,n,r;try{t=Reflect.get(e,`path`),n=Reflect.get(e,`url`),r=Reflect.get(e,`message`)}catch{return}if(typeof t==`string`&&c(t))return U(t);if(typeof n==`string`&&n.startsWith(`file:`))return U(te(n));if(typeof r!=`string`)return;let i=/Cannot find module ['"]([^'"]+)['"] from ['"]([^'"]+)['"]/.exec(r),a=/Cannot find module ['"]([^'"]+)['"][\s\S]*?Require stack:\s*\n- ([^\n]+)/.exec(r),s=i??a;if(!s)return;let l=s[1],u=s[2];if(l&&u&&(l.startsWith(`.`)||c(l)))return U(c(l)?l:d(o(u),l))}async function je(e,t){let n=R.get(e)??Promise.resolve(),r,i=new Promise(e=>{r=e}),a=n.then(()=>i);R.set(e,a),await n;try{return{evaluation:t()}}finally{r(),R.get(e)===a&&R.delete(e)}}function Me(e){return()=>({visitor:{AwaitExpression(t){t.getFunctionParent()||(e.hasTopLevelAwait=!0)},CallExpression(t){t.node.callee?.type===`Identifier`&&t.node.callee.name===`jitiImport`&&(e.hasDynamicImport=!0);let n=t.node.arguments?.[0];if(t.node.callee?.type!==`Identifier`||t.node.callee.name!==`require`)return;let r=n?.type===`StringLiteral`&&typeof n.value==`string`;r&&e.dependencies.add(n.value),typeof t.node.start==`number`&&(r?t.getFunctionParent()?e.hasNestedRequire=!0:e.hasTopLevelRequire=!0:e.hasNonLiteralRequire=!0)},ForOfStatement(t){t.node.await&&!t.getFunctionParent()&&(e.hasTopLevelAwait=!0)}}})}function q(e,t,n){if(e.hasDynamicImport)throw Error(`Dynamic imports are not supported in local preset modules: "${t}". Use static imports so TeaCSS can track and reload the complete graph.`);if(e.hasNonLiteralRequire)throw Error(`CommonJS require() specifiers must be string literals in local preset modules: "${t}".`);if(e.hasNestedRequire)throw Error(`CommonJS require() is only supported at module top level in local preset modules: "${t}".`);if(e.hasTopLevelRequire&&e.hasTopLevelAwait)throw Error(`CommonJS require() cannot be combined with top-level await in a local preset module: "${t}". Use a static import instead.`);if(t!==n&&e.hasTopLevelAwait)throw Error(`Top-level await is only supported in the local preset entry module: "${t}".`)}const J=Symbol(`uncacheable transform option`);function Y(e,t=new Set){if(e===null)return`n`;if(typeof e==`string`)return`s${JSON.stringify(e)}`;if(typeof e==`boolean`)return e?`b1`:`b0`;if(typeof e==`number`)return Number.isNaN(e)?`dNaN`:e===1/0?`dInfinity`:e===-1/0?`d-Infinity`:Object.is(e,-0)?`d-0`:`d${JSON.stringify(e)}`;if(e===void 0)return`u`;if(typeof e!=`object`||t.has(e))throw J;t.add(e);try{if(Array.isArray(e)){for(let t of Reflect.ownKeys(e)){if(t===`length`)continue;if(typeof t!=`string`)throw J;let n=Number(t),r=Object.getOwnPropertyDescriptor(e,t);if(!Number.isSafeInteger(n)||n<0||String(n)!==t||n>=e.length||!r?.enumerable||!(`value`in r))throw J}let n=Array.from({length:e.length},(n,r)=>{let i=Object.getOwnPropertyDescriptor(e,String(r));return i&&`value`in i?Y(i.value,t):`h`});return`a${e.length}[${n.join(`,`)}]`}if(Object.getPrototypeOf(e)!==Object.prototype&&Object.getPrototypeOf(e)!==null)throw J;return`o{${Reflect.ownKeys(e).map(t=>{if(typeof t!=`string`)throw J;let n=Object.getOwnPropertyDescriptor(e,t);if(!n?.enumerable||!(`value`in n))throw J;return[t,n.value]}).sort(([e],[t])=>e.localeCompare(t)).map(([e,n])=>`${JSON.stringify(e)}:${Y(n,t)}`).join(`,`)}}`}finally{t.delete(e)}}function Ne(e,t){return{...t,async:!1,interopDefault:t.interopDefault??!0,jsx:t.jsx??e.options.jsx,retainLines:t.retainLines??e.options.transformOptions?.retainLines}}function Pe(e){if(!(e&&Object.getPrototypeOf(e)===Object.prototype&&Reflect.ownKeys(e).length===0))return e}function Fe(e){try{return Y({babel:Pe(e.babel),interopDefault:e.interopDefault,jsx:e.jsx,retainLines:e.retainLines,ts:e.ts})}catch{return}}function Ie(e,t,n,r){let i=y.byteLength(e)+y.byteLength(t)+y.byteLength(n);for(let e of r.dependencies)i+=y.byteLength(e);return i}function Le(e,t){let n=B.get(e);n&&(V-=n.bytes,B.delete(e));let r=Ie(e,t.source,t.code,t.facts);if(!(r>Te))for(B.set(e,{...t,bytes:r}),V+=r;B.size>256||V>Te;){let e=B.keys().next();if(e.done)break;let t=B.get(e.value);B.delete(e.value),t&&(V-=t.bytes)}}function Re(e){return{...e,dependencies:Array.from(e.dependencies)}}function ze(e,t,n,r,i,a){let o=t.filename?U(t.filename):n,s=Ne(e,t),c=Fe(s),l=c===void 0?void 0:`${o}\0${c}`,u=l===void 0?void 0:B.get(l);if(l!==void 0&&u?.source===s.source)return B.delete(l),B.set(l,u),G(o,r,i)&&q(u.facts,o,n),{code:u.code,dependencies:u.facts.dependencies};let d=c===void 0?void 0:{filename:o,mode:c,source:s.source},f=d===void 0?void 0:a?.read(d);if(l!==void 0&&f){let e={...f.facts,dependencies:new Set(f.facts.dependencies)};return Le(l,{code:f.code,facts:e,source:s.source}),G(o,r,i)&&q(e,o,n),{code:f.code,dependencies:e.dependencies}}let p={dependencies:new Set,hasDynamicImport:!1,hasNestedRequire:!1,hasNonLiteralRequire:!1,hasTopLevelAwait:!1,hasTopLevelRequire:!1},m=Me(p),h=Error.prepareStackTrace,g=Error.stackTraceLimit;try{let t=e.transform({...s,babel:{...s.babel,plugins:[...Array.isArray(s.babel?.plugins)?s.babel.plugins:[],m]}});return l!==void 0&&Le(l,{code:t,facts:p,source:s.source}),G(o,r,i)&&q(p,o,n),d!==void 0&&a?.write(d,{code:t,facts:Re(p)}),{code:t,dependencies:p.dependencies}}finally{Error.prepareStackTrace=h,Error.stackTraceLimit=g}}const Be=/\.[cm]?[jt]sx?$/;function X(e,t,n){let r=U(c(n)?n:d(o(t),n));if(s(r))return[r];let i=Array.from(new Set([``,...e.options.extensions??[],`.json`])),a=[r,d(r,`index`)].flatMap(e=>i.map(t=>`${e}${t}`));return a.push(d(r,`package.json`)),a}function Ve(t,n,r){if(r.startsWith(`node:`))return[];try{let i=H(r)?t.esmResolve(r,{parentURL:x(n).href,try:!0}):e(n).resolve(r);if(!i)return H(r)?X(t,n,r):[];let a=i.startsWith(`file:`)?te(i):i;return c(a)?[U(a)]:[]}catch{return H(r)?X(t,n,r):[]}}async function He(e,t,n,r,i,a,o){let c=[e],l;for(let u=0;u<c.length;u++){let d=c[u];if(!d||!Be.test(s(d)))continue;let f;try{f=await b(d,`utf8`)}catch(e){if(e.code===`ENOENT`)continue;throw e}d===e&&(l=f);let{dependencies:p}=ze(n,{source:f,filename:d,async:d===e,ts:/\.[cm]?tsx?$/.test(d)},e,r,i,o);for(let e of p)for(let n of Ve(t,d,e))!a.has(n)&&G(n,r,i)&&(a.add(n),c.push(n))}return l}async function Ue(e,t){try{let{createPresetTransformDiskCache:n}=await import(`./presetTransformDiskCache-BNUNLsPo.js`);return n(e,import.meta.url,t)}catch{return}}function Z(e,t){if(!e||typeof e!=`object`)return;let n=z.get(e)??[];z.set(e,Array.from(new Set([...n,...t])))}function Q(e){return e&&typeof e==`object`?[...z.get(e)??[]]:[]}async function We(t,n,r){let i=U(t),a=e(i),s=Object.create(null),c=new Set([i]),l=new Map,u={packageRoot:W(i,l),fallbackRoot:o(i)},[{createJiti:d,transformer:f},p]=await Promise.all([we(),Ue(i,r)]),m=d(i,{fsCache:!1,interopDefault:!0,moduleCache:!1,tryNative:!1,transform:e=>{let{code:t}=ze(f,e,i,u,l,p);return{code:t}}}),h=()=>{let e=new Set;for(let t of Object.values(s))K(t,c,e,u,l);for(let t of c)K(a.cache[t],c,e,u,l)};try{let e=await He(i,m,f,u,l,c,p)??await b(i,`utf8`),{evaluation:t}=await je(u.packageRoot??u.fallbackRoot,()=>{for(let e of c)delete a.cache[e];return m.evalModule(e,{async:!0,cache:s,filename:i,forceTranspile:!0})}),r=await t,o=r?.__esModule?r.default:r;if(o==null)throw Error(`@preset "${n}" has no default export (expected a Preset or preset factory)`);let d=typeof o==`function`?await o():o;return h(),{preset:d,sources:Array.from(c)}}catch(e){h();let t=Ae(e);throw Z(e,t&&G(t,u,l)?[...c,t]:Array.from(c)),e}}async function Ge(e){let t=await ee(e),n=x(e);return n.searchParams.set(`version`,`${t.mtimeMs}:${t.ctimeMs}:${t.size}:${t.ino}`),(await import(n.href)).default}async function Ke(e,t){let n=[],r=new Set,i={protectedSlotsByDirectory:new Map};for(let a of e){let e;try{e=Oe(a,t);let o;if(H(a)){let t=await We(e,a,i);for(let e of t.sources)r.add(e);n.push(t.preset);continue}if(r.add(U(e)),o=await Ge(e),o==null)throw Error(`@preset "${a}" has no default export (expected a Preset or preset factory)`);n.push(typeof o==`function`?await o():o)}catch(t){throw Z(t,e!==void 0&&H(a)?[...r,U(e)]:r),t}}return{presets:n,sources:Array.from(r)}}async function qe(e,t){return(await Ke(e,t)).presets}async function Je(e,t,n){let r=e.filter(e=>!e.exclude).map(e=>e.glob);if(r.length===0)return{shortcuts:[],safelist:[],files:[]};let a=e.filter(e=>e.exclude).map(e=>e.glob),o=await v(r,{cwd:t,absolute:!0,ignore:a,expandDirectories:!1}),s=new Set(n),c=o.filter(e=>e.endsWith(`.css`)&&!s.has(e)).sort(),l=[],u=[];for(let e of c){let t;try{t=i(e,`utf8`)}catch(e){if(e.code===`ENOENT`)continue;throw e}if(!t.includes(`@shortcut`)&&!t.includes(`@safelist`))continue;let n=L(t);l.push(...n.shortcuts),u.push(...n.safelist)}return{shortcuts:l,safelist:u,files:c}}async function Ye(e,t,n){let r=ye(e,t,n),i=L(r.css),[a,o]=await Promise.all([i.presets.length?Ke(i.presets,t):{presets:[],sources:[]},Je(i.sources,t,r.files)]).catch(e=>{throw Z(e,r.files),e}),s=a.presets,c=await g({presets:s}).catch(e=>{throw Z(e,[...r.files,...o.files,...a.sources]),e}),l=S(c.theme),{theme:u,unknown:d,undeclared:f}=k(i.custom,l,c.theme),p=[...i.sources.filter(e=>!e.exclude).map(e=>e.glob),...i.sources.filter(e=>e.exclude).map(e=>`!${e.glob}`)],m=[...o.shortcuts,...i.shortcuts],v=Object.fromEntries(m.map(({name:e,expansion:t})=>[e,t])),y=[...new Set([...o.safelist,...i.safelist].flatMap(e=>_(h(e))))],b=[...new Set(i.custom.map(e=>e.theme).filter(e=>!!e))];return{config:{presets:s,theme:u,...i.sources.length?{content:{filesystem:p}}:{},...m.length?{shortcuts:v}:{},...y.length?{safelist:y}:{},...b.length?{autocomplete:{templates:[`theme-(${b.join(`|`)})`]}}:{}},unknown:d,undeclared:f,hasTeacss:r.files.length===0?i.hasTeacss:L(e).hasTeacss,sources:[...r.files,...o.files,...a.sources]}}const Xe=ne.join(` `);function $(e,t){switch(t){case`unknown-prefix`:return`@custom var "${e}" matches no theme namespace — not registered (emitted as a plain :root var).`;case`illegal-color-step`:return`@custom var "${e}" has an illegal color step — palette steps are ${Xe}.`;case`undeclared-theme-variable`:return`@custom theme var "${e}" overrides no declared base value — not registered. Declare it in the preset theme or a base @custom block first.`;case`invalid-theme-prelude`:return`@custom prelude "${e}" is not a theme declaration — use \`@custom theme <name> {}\` or \`@custom theme <name> dark {}\` with a kebab-case name (\`dark\`/\`light\` reserved). The block registers nothing.`}}function Ze(e,t,n){let r=C(t),i=[],a=P(e),o=n?[n,k(a.filter(e=>I(e.mode).kind===`base`).map(e=>({declarations:e.declarations})),t).theme]:void 0;for(let e of a){let t=I(e.mode);if(t.kind===`invalid`){i.push({property:e.mode,start:e.start,end:e.open,reason:`invalid-theme-prelude`,message:$(e.mode,`invalid-theme-prelude`)});continue}for(let n of e.declarations){let{property:e,start:a,end:s}=n,c=E(e.slice(2),r);if(!c.ok){i.push({property:e,start:a,end:s,reason:c.reason,message:$(e,c.reason)});continue}t.kind===`theme`&&o&&!O(c,o)&&i.push({property:e,start:a,end:s,reason:`undeclared-theme-variable`,message:$(e,`undeclared-theme-variable`)})}}return i}const Qe=Object.freeze([`package.json`,`index.css`,`src/index.css`]),[$e,...et]=Qe;function tt(e){let t=e instanceof Error?`${e.name}:${e.message}`:`${typeof e}:${String(e)}`,r=Array.from(new Set(Q(e))).sort().map(e=>{try{let t=n.statSync(e);return`${e}:${t.mtimeMs}:${t.ctimeMs}:${t.size}:${t.ino}`}catch(t){let n=t.code;return`${e}:${n===`ENOENT`?`missing`:`unreadable:${n??String(t)}`}`}});return JSON.stringify([t,r])}function nt(e,t){let n={...e};for(let e of Reflect.ownKeys(t)){if(!Object.getOwnPropertyDescriptor(t,e)?.enumerable)continue;let r=Reflect.get(t,e);r!==void 0&&Object.defineProperty(n,e,{value:r,configurable:!0,enumerable:!0,writable:!0})}return n}function rt(e){try{let t=n.readFileSync(e,`utf8`);return t.includes(`@teacss`)?N(t).some(e=>e.name===`teacss`&&e.prelude===``&&e.terminator!==`block`):!1}catch(e){if(e.code===`ENOENT`)return!1;throw e}}function it(e){try{let t=JSON.parse(n.readFileSync(l(e,$e),`utf8`))?.teacss?.entry;return typeof t==`string`?t:void 0}catch(e){if(e.code===`ENOENT`)return;throw e}}function at(e){let t=it(e);if(t){let r=d(e,t);if(n.existsSync(r)&&n.statSync(r).isFile())return r}for(let t of et){let r=l(e,t);if(n.existsSync(r)&&n.statSync(r).isFile()&&rt(r))return r}}async function ot(e=p.cwd(),t=e,r={}){if(typeof t!=`string`)return{config:nt(r,t),sources:[]};let i=d(e,t),a=n.existsSync(i)&&n.statSync(i).isFile()?i:at(i);if(!a)return{config:{...r},sources:[]};let s;try{s=await Ye(n.readFileSync(a,`utf8`),o(a),a)}catch(e){throw Z(e,[a]),e}let{config:c}=s,l=nt(r,c);return c.presets?.length||(r.presets?.length?l.presets=r.presets:m.warn(`[@teacss/config] "${a}" declares no @preset — no utilities will be generated. Add one, e.g. \`@preset "standard";\``)),{config:l,sources:Array.from(new Set([a,...s.sources]))}}function st(){let e=new Map,t=new Map,n=new Map,r=new Map,i=new WeakMap,a=new WeakMap,o=new WeakMap,s=new WeakMap,c=(e,n)=>e?t.get(e):n?a.get(n):void 0,l=(e,t)=>e?n.get(e):t?o.get(t):void 0,u=async(e,t)=>{for(;;){let n=c(e,t),r=l(e,t);if(!r)return;let i=await r;if(c(e,t)===n)return i}};return(c=p.cwd(),l=c,f={})=>{let h=typeof l==`string`?d(c,l):void 0,g=typeof l==`object`&&l?l:void 0,_=h?(t.get(h)??0)+1:g?(a.get(g)??0)+1:0;h?t.set(h,_):g&&a.set(g,_);let v=ot(c,l,f).then(n=>(h&&t.get(h)===_?(e.set(h,n),r.delete(h)):g&&a.get(g)===_&&(i.set(g,n),s.delete(g)),n),async n=>{let o=h?t.get(h)===_:!g||a.get(g)===_;if(!o){let e=await u(h,g);if(e)return e}let c=h?e.get(h):g?i.get(g):void 0;if(!c)throw n;if(o){let e=tt(n);e!==(h?r.get(h):g?s.get(g):void 0)&&(m.error(`[@teacss/config] Error resolving config from the CSS entry:`,n),h?r.set(h,e):g&&s.set(g,e));let t=Array.from(new Set([...c.sources,...Q(n)]));return t.length===c.sources.length?c:{...c,sources:t}}return c});return h?n.set(h,v):g&&o.set(g,v),v}}export{C as buildNamespaces,E as classifyCustomVar,st as createRecoveryConfigLoader,k as customToTheme,Ze as diagnoseCustom,Qe as entryDiscoveryFiles,at as findEntry,Q as getConfigSourcesFromError,O as hasBaseThemeValue,ce as hasTopLevelDirective,ot as loadConfig,I as parseCustomPrelude,L as parseEntry,Ye as resolveEntryConfig,qe as resolvePresets,S as scaleThemeKeys,P as scanCustomBlocks,se as scanQuotedDirectives,N as scanTopLevelAtRules};
1
+ import{createRequire as e}from"node:module";import*as t from"node:fs";import n,{existsSync as r,readFileSync as i,realpathSync as a}from"node:fs";import{dirname as o,extname as s,isAbsolute as c,join as l,relative as u,resolve as d,sep as f}from"node:path";import p from"node:process";import{consola as m}from"consola";import{expandClassGroups as h,mergeDeep as g,resolveConfig as _,splitClassTokens as v}from"@teacss/core";import{glob as ee}from"tinyglobby";import{Buffer as y}from"node:buffer";import{readFile as b,stat as te}from"node:fs/promises";import{fileURLToPath as x,pathToFileURL as ne}from"node:url";const re=[`100`,`150`,`200`,`300`,`400`,`500`,`600`,`700`,`800`,`850`,`900`,`950`],ie=new Set(re);function ae(e){return e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)}function oe(e){return Object.keys(e).filter(t=>{if(t===`modes`||t===`defaultMode`||t===`rolePalettes`)return!1;let n=e[t];return typeof n!=`object`||!n?!1:t===`colors`||Object.values(n).every(e=>e==null||typeof e==`string`||typeof e==`number`||Array.isArray(e))})}function S(e){return e.map(e=>({key:e,prefix:e===`colors`||e===`semanticColors`?`color`:ae(e),twoLevel:e===`colors`,semanticColor:e===`semanticColors`})).sort((e,t)=>t.prefix.length-e.prefix.length)}function C(e,t,n){Object.defineProperty(e,t,{value:n,configurable:!0,enumerable:!0,writable:!0})}function w(e,t){let n=Object.hasOwn(e,t)?e[t]:void 0;if(typeof n==`object`&&n&&!Array.isArray(n))return n;let r={};return C(e,t,r),r}function T(e,t){let n=t.filter(t=>e===t.prefix||e.startsWith(`${t.prefix}-`)),r=n.find(e=>e.key===`colors`),i=n.find(e=>e.semanticColor);if(r&&i){let t=e===`color`?``:e.slice(6),n=t.lastIndexOf(`-`),a=n>0?t.slice(0,n):``,o=n>0?t.slice(n+1):``;return a&&ie.has(o)?{ok:!0,nsKey:r.key,twoLevel:!0,rest:t,colorName:a,step:o}:a&&/^\d+$/.test(o)?{ok:!1,reason:`illegal-color-step`}:t?{ok:!0,nsKey:i.key,twoLevel:!1,rest:t}:{ok:!1,reason:`unknown-prefix`}}let a=n[0];if(!a)return{ok:!1,reason:`unknown-prefix`};let o=e===a.prefix?``:e.slice(a.prefix.length+1);if(a.twoLevel){let e=o.lastIndexOf(`-`),t=e>0?o.slice(0,e):``,n=e>0?o.slice(e+1):``;return!t||!ie.has(n)?{ok:!1,reason:`illegal-color-step`}:{ok:!0,nsKey:a.key,twoLevel:!0,rest:o,colorName:t,step:n}}return{ok:!0,nsKey:a.key,twoLevel:!1,rest:o}}function E(e,t){let n=S(t),r={},i=[],a=e=>{let t=T(e.startsWith(`--`)?e.slice(2):e,n);return t.ok||i.push(e),t},o=(e,t,n)=>{let r=w(e,t.nsKey);t.twoLevel?C(w(r,t.colorName),t.step,n):C(r,t.rest||`DEFAULT`,n)};for(let t of e){let e=t.mode?w(w(r,`modes`),t.mode):r;for(let{property:n,value:r}of t.declarations){let t=a(n);t.ok&&o(e,t,r)}}return{theme:r,unknown:i}}const se=/[A-Za-z0-9-]/,ce=/[\w-]/;function D(e,t,n){let r=e.indexOf(`*/`,t+2);return r<0||r>=n?n:r+2}function O(e,t,n){let r=e[t];for(let i=t+1;i<n;i++)if(e[i]===`\\`)i++;else if(e[i]===r)return i+1;return n}function k(e,t,n){let r=``;for(let i=t;i<n;i++)if(e[i]===`/`&&e[i+1]===`*`)i=D(e,i,n)-1,r+=` `;else if(e[i]===`"`||e[i]===`'`){let t=O(e,i,n);r+=e.slice(i,t),i=t-1}else r+=e[i];return r.trim()}function le(e,t){let n=[],r=t.startsWith(`@`)?t.slice(1):t;for(let t of A(e)){if(t.name!==r||t.terminator!==`;`)continue;let e=t.prelude[0];if(e!==`"`&&e!==`'`)continue;let i=O(t.prelude,0,t.prelude.length);i!==t.prelude.length||i<=1||t.prelude[i-1]!==e||n.push(t.prelude.slice(1,i-1))}return n}function ue(e,t){let n=t.startsWith(`@`)?t.slice(1):t;return A(e).some(e=>e.name===n)}function de(e,t){for(let n=t;n<e.length;n++)if(e[n]===`/`&&e[n+1]===`*`)n=D(e,n,e.length)-1;else if(e[n]===`"`||e[n]===`'`)n=O(e,n,e.length)-1;else if(e[n]===`{`)return n;else if(e[n]===`;`||e[n]===`}`)return-1;return-1}function fe(e,t){let n=1;for(let r=t+1;r<e.length;r++)if(e[r]===`/`&&e[r+1]===`*`)r=D(e,r,e.length)-1;else if(e[r]===`"`||e[r]===`'`)r=O(e,r,e.length)-1;else if(e[r]===`{`)n++;else if(e[r]===`}`&&--n===0)return r;return-1}function A(e,t=!1){let n=[],r=0;for(let i=0;i<e.length;i++){if(e[i]===`/`&&e[i+1]===`*`){i=D(e,i,e.length)-1;continue}if(e[i]===`"`||e[i]===`'`){i=O(e,i,e.length)-1;continue}if(e[i]===`{`){r++;continue}if(e[i]===`}`){r=Math.max(0,r-1);continue}if(!t&&r!==0||e[i]!==`@`)continue;let a=i,o=a+1;for(;ce.test(e[o]??``);)o++;if(o===a+1)continue;let s=e.slice(a+1,o),c=[],l=!1;for(let u=o;u<e.length;u++){let d=e[u];if(d===`/`&&e[u+1]===`*`)u=D(e,u,e.length)-1;else if(d===`"`||d===`'`)u=O(e,u,e.length)-1;else if(d===`(`)c.push(`)`);else if(d===`[`)c.push(`]`);else if(d===c.at(-1))c.pop();else if(c.length===0&&d===`;`){n.push({name:s,prelude:k(e,o,u),start:a,end:u+1,terminator:`;`,...t?{depth:r}:{}}),i=u,l=!0;break}else if(c.length===0&&d===`{`){let c=fe(e,u);(c>=0||t)&&(n.push({name:s,prelude:k(e,o,u),start:a,end:c<0?e.length:c+1,terminator:`block`,...t?{depth:r}:{}}),i=t?u:c,t&&r++,l=!0);break}}if(!l){n.push({name:s,prelude:k(e,o,e.length),start:a,end:e.length,terminator:`eof`,...t?{depth:r}:{}});break}}return n}function pe(e,t,n){let r=[];for(let i=t;i<n;i++){let t=e[i];if(t===`/`&&e[i+1]===`*`)i=D(e,i,n)-1;else if(t===`"`||t===`'`)i=O(e,i,n)-1;else if(t===`(`)r.push(`)`);else if(t===`[`)r.push(`]`);else if(t===`{`)r.push(`}`);else if(t===r.at(-1))r.pop();else if(t===`;`&&r.length===0)return i}return n}function me(e,t,n){let r=[];for(let i=t;i<n;){for(;i<n;)if(/\s/.test(e[i]))i++;else if(e[i]===`/`&&e[i+1]===`*`)i=D(e,i,n);else break;let t=pe(e,i,n);if(e[i]!==`-`||e[i+1]!==`-`){i=t+1;continue}let a=i+2;for(;a<n&&se.test(e[a]);)a++;if(a===i+2){i=t+1;continue}let o=a;for(;o<n;)if(/\s/.test(e[o]))o++;else if(e[o]===`/`&&e[o+1]===`*`)o=D(e,o,n);else break;if(e[o]!==`:`){i=t+1;continue}let s=o+1,c=e.slice(s,t),l=c.trim(),u=s+c.length-c.trimStart().length,d=u+l.length;r.push({property:e.slice(i,a),value:l,start:i,end:a,colon:o,valueStart:u,valueEnd:d}),i=t+1}return r}function j(e){let t=[];for(let n of A(e)){if(n.name!==`custom`||n.terminator!==`block`)continue;let r=de(e,n.start+7);if(r<0)continue;let i=n.end-1;t.push({mode:n.prelude||void 0,declarations:me(e,r+1,i),start:n.start,open:r,close:i})}return t}const M=[`primary`,`neutral`,`focused`,`success`,`warning`,`failure`,`general`];function N(e){let t=e[0];if(t!==`"`&&t!==`'`)throw Error(`expected one quoted comma-separated list`);let n=1;for(;n<e.length;n++)if(e[n]===`\\`)n++;else if(e[n]===t)break;if(n!==e.length-1||e[n]!==t)throw Error(`expected one complete quoted list without extra arguments`);let r=e.slice(1,-1);if(r.includes(`\\,`))throw Error(`commas cannot be escaped; re-export the preset from a path without commas`);let i=r.split(`,`).map(e=>e.trim());if(i.some(e=>!e))throw Error(`empty lists, empty items and trailing commas are not allowed`);return i}function P(e){let t=[];for(let n of A(e,!0)){let e,r=M.includes(n.name);if(n.name===`preset`)e=`@preset was removed; use @presets "standard,official";`;else if(n.name===`custom`&&n.prelude.split(/\s+/)[0]===`theme`)e=`named themes were removed; use global / mode @custom values and data-css-<role> palette selectors`;else if(n.name===`presets`||r){if(n.depth)e=`configuration directives must be top-level`;else if(n.terminator!==`;`)e=`expected a quoted list ending with a semicolon, without a block`;else try{let t=N(n.prelude);r&&t.some(e=>!/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/.test(e))&&(e=`palette names must use lowercase kebab-case`)}catch(t){e=t.message}}e&&t.push({start:n.start,end:n.end,message:`@${n.name}: ${e}`})}return t}function F(e){let t=P(e);if(t.length)throw SyntaxError(t.map(e=>e.message).join(`
2
+ `))}let he;function ge(){return he??=import(`jiti`).then(({createJiti:e})=>({createJiti:e,transformer:e(import.meta.url,{fsCache:!1,interopDefault:!0,moduleCache:!1})}))}const I=new Map,L=new WeakMap,R=16777216,z=new Map;let B=0;const V={icons:`@teacss/preset-icons`,official:`@teacss/preset-official`,standard:`@teacss/preset-standard`};function _e(t,n){try{return n.resolve(t)}catch(r){let i;try{i=n.resolve(`teacss/package.json`)}catch{throw r}return e(i).resolve(t)}}function ve(t,n){if(t.startsWith(`.`)||c(t))return d(n,t);let r=e(d(n,`_`)),i=Object.hasOwn(V,t)?V[t]:void 0;return i?_e(i,r):r.resolve(t)}function H(e){return e.startsWith(`.`)||c(e)}function U(e){try{return a(e)}catch{return d(e)}}function W(e,t){let n=o(e),i=[];for(;;){if(t.has(n)){let e=t.get(n);for(let n of i)t.set(n,e);return e}if(i.push(n),r(d(n,`package.json`))){for(let e of i)t.set(e,n);return n}let e=o(n);if(e===n){for(let e of i)t.set(e,void 0);return}n=e}}function ye(e,t){let n=u(t,e);return n===``||!c(n)&&n!==`..`&&!n.startsWith(`..${f}`)}function G(e,t,n){let r=W(e,n);return t.packageRoot===void 0?r===void 0&&ye(e,t.fallbackRoot):r===t.packageRoot}function K(e,t,n,r,i){if(!e||n.has(e)||(n.add(e),!c(e.filename)))return;let a=U(e.filename);if(G(a,r,i)){t.add(a);for(let a of e.children)K(a,t,n,r,i)}}function be(e){if(!e||typeof e!=`object`)return;let t,n,r;try{t=Reflect.get(e,`path`),n=Reflect.get(e,`url`),r=Reflect.get(e,`message`)}catch{return}if(typeof t==`string`&&c(t))return U(t);if(typeof n==`string`&&n.startsWith(`file:`))return U(x(n));if(typeof r!=`string`)return;let i=/Cannot find module ['"]([^'"]+)['"] from ['"]([^'"]+)['"]/.exec(r),a=/Cannot find module ['"]([^'"]+)['"][\s\S]*?Require stack:\s*\n- ([^\n]+)/.exec(r),s=i??a;if(!s)return;let l=s[1],u=s[2];if(l&&u&&(l.startsWith(`.`)||c(l)))return U(c(l)?l:d(o(u),l))}async function xe(e,t){let n=I.get(e)??Promise.resolve(),r,i=new Promise(e=>{r=e}),a=n.then(()=>i);I.set(e,a),await n;try{return{evaluation:t()}}finally{r(),I.get(e)===a&&I.delete(e)}}function Se(e){return()=>({visitor:{AwaitExpression(t){t.getFunctionParent()||(e.hasTopLevelAwait=!0)},CallExpression(t){t.node.callee?.type===`Identifier`&&t.node.callee.name===`jitiImport`&&(e.hasDynamicImport=!0);let n=t.node.arguments?.[0];if(t.node.callee?.type!==`Identifier`||t.node.callee.name!==`require`)return;let r=n?.type===`StringLiteral`&&typeof n.value==`string`;r&&e.dependencies.add(n.value),typeof t.node.start==`number`&&(r?t.getFunctionParent()?e.hasNestedRequire=!0:e.hasTopLevelRequire=!0:e.hasNonLiteralRequire=!0)},ForOfStatement(t){t.node.await&&!t.getFunctionParent()&&(e.hasTopLevelAwait=!0)}}})}function q(e,t,n){if(e.hasDynamicImport)throw Error(`Dynamic imports are not supported in local preset modules: "${t}". Use static imports so TeaCSS can track and reload the complete graph.`);if(e.hasNonLiteralRequire)throw Error(`CommonJS require() specifiers must be string literals in local preset modules: "${t}".`);if(e.hasNestedRequire)throw Error(`CommonJS require() is only supported at module top level in local preset modules: "${t}".`);if(e.hasTopLevelRequire&&e.hasTopLevelAwait)throw Error(`CommonJS require() cannot be combined with top-level await in a local preset module: "${t}". Use a static import instead.`);if(t!==n&&e.hasTopLevelAwait)throw Error(`Top-level await is only supported in the local preset entry module: "${t}".`)}const J=Symbol(`uncacheable transform option`);function Y(e,t=new Set){if(e===null)return`n`;if(typeof e==`string`)return`s${JSON.stringify(e)}`;if(typeof e==`boolean`)return e?`b1`:`b0`;if(typeof e==`number`)return Number.isNaN(e)?`dNaN`:e===1/0?`dInfinity`:e===-1/0?`d-Infinity`:Object.is(e,-0)?`d-0`:`d${JSON.stringify(e)}`;if(e===void 0)return`u`;if(typeof e!=`object`||t.has(e))throw J;t.add(e);try{if(Array.isArray(e)){for(let t of Reflect.ownKeys(e)){if(t===`length`)continue;if(typeof t!=`string`)throw J;let n=Number(t),r=Object.getOwnPropertyDescriptor(e,t);if(!Number.isSafeInteger(n)||n<0||String(n)!==t||n>=e.length||!r?.enumerable||!(`value`in r))throw J}let n=Array.from({length:e.length},(n,r)=>{let i=Object.getOwnPropertyDescriptor(e,String(r));return i&&`value`in i?Y(i.value,t):`h`});return`a${e.length}[${n.join(`,`)}]`}if(Object.getPrototypeOf(e)!==Object.prototype&&Object.getPrototypeOf(e)!==null)throw J;return`o{${Reflect.ownKeys(e).map(t=>{if(typeof t!=`string`)throw J;let n=Object.getOwnPropertyDescriptor(e,t);if(!n?.enumerable||!(`value`in n))throw J;return[t,n.value]}).sort(([e],[t])=>e.localeCompare(t)).map(([e,n])=>`${JSON.stringify(e)}:${Y(n,t)}`).join(`,`)}}`}finally{t.delete(e)}}function Ce(e,t){return{...t,async:!1,interopDefault:t.interopDefault??!0,jsx:t.jsx??e.options.jsx,retainLines:t.retainLines??e.options.transformOptions?.retainLines}}function we(e){if(!(e&&Object.getPrototypeOf(e)===Object.prototype&&Reflect.ownKeys(e).length===0))return e}function Te(e){try{return Y({babel:we(e.babel),interopDefault:e.interopDefault,jsx:e.jsx,retainLines:e.retainLines,ts:e.ts})}catch{return}}function Ee(e,t,n,r){let i=y.byteLength(e)+y.byteLength(t)+y.byteLength(n);for(let e of r.dependencies)i+=y.byteLength(e);return i}function De(e,t){let n=z.get(e);n&&(B-=n.bytes,z.delete(e));let r=Ee(e,t.source,t.code,t.facts);if(!(r>R))for(z.set(e,{...t,bytes:r}),B+=r;z.size>256||B>R;){let e=z.keys().next();if(e.done)break;let t=z.get(e.value);z.delete(e.value),t&&(B-=t.bytes)}}function Oe(e){return{...e,dependencies:Array.from(e.dependencies)}}function ke(e,t,n,r,i,a){let o=t.filename?U(t.filename):n,s=Ce(e,t),c=Te(s),l=c===void 0?void 0:`${o}\0${c}`,u=l===void 0?void 0:z.get(l);if(l!==void 0&&u?.source===s.source)return z.delete(l),z.set(l,u),G(o,r,i)&&q(u.facts,o,n),{code:u.code,dependencies:u.facts.dependencies};let d=c===void 0?void 0:{filename:o,mode:c,source:s.source},f=d===void 0?void 0:a?.read(d);if(l!==void 0&&f){let e={...f.facts,dependencies:new Set(f.facts.dependencies)};return De(l,{code:f.code,facts:e,source:s.source}),G(o,r,i)&&q(e,o,n),{code:f.code,dependencies:e.dependencies}}let p={dependencies:new Set,hasDynamicImport:!1,hasNestedRequire:!1,hasNonLiteralRequire:!1,hasTopLevelAwait:!1,hasTopLevelRequire:!1},m=Se(p),h=Error.prepareStackTrace,g=Error.stackTraceLimit;try{let t=e.transform({...s,babel:{...s.babel,plugins:[...Array.isArray(s.babel?.plugins)?s.babel.plugins:[],m]}});return l!==void 0&&De(l,{code:t,facts:p,source:s.source}),G(o,r,i)&&q(p,o,n),d!==void 0&&a?.write(d,{code:t,facts:Oe(p)}),{code:t,dependencies:p.dependencies}}finally{Error.prepareStackTrace=h,Error.stackTraceLimit=g}}const Ae=/\.[cm]?[jt]sx?$/;function je(e,t,n){let r=U(c(n)?n:d(o(t),n));if(s(r))return[r];let i=Array.from(new Set([``,...e.options.extensions??[],`.json`])),a=[r,d(r,`index`)].flatMap(e=>i.map(t=>`${e}${t}`));return a.push(d(r,`package.json`)),a}function Me(t,n,r){if(r.startsWith(`node:`))return[];try{let i=H(r)?t.esmResolve(r,{parentURL:ne(n).href,try:!0}):e(n).resolve(r);if(!i)return H(r)?je(t,n,r):[];let a=i.startsWith(`file:`)?x(i):i;return c(a)?[U(a)]:[]}catch{return H(r)?je(t,n,r):[]}}async function Ne(e,t,n,r,i,a,o){let c=[e],l;for(let u=0;u<c.length;u++){let d=c[u];if(!d||!Ae.test(s(d)))continue;let f;try{f=await b(d,`utf8`)}catch(e){if(e.code===`ENOENT`)continue;throw e}d===e&&(l=f);let{dependencies:p}=ke(n,{source:f,filename:d,async:d===e,ts:/\.[cm]?tsx?$/.test(d)},e,r,i,o);for(let e of p)for(let n of Me(t,d,e))!a.has(n)&&G(n,r,i)&&(a.add(n),c.push(n))}return l}async function Pe(e,t){try{let{createPresetTransformDiskCache:n}=await import(`./presetTransformDiskCache-BNUNLsPo.js`);return n(e,import.meta.url,t)}catch{return}}function X(e,t){if(!e||typeof e!=`object`)return;let n=L.get(e)??[];L.set(e,Array.from(new Set([...n,...t])))}function Z(e){return e&&typeof e==`object`?[...L.get(e)??[]]:[]}async function Fe(t,n,r){let i=U(t),a=e(i),s=Object.create(null),c=new Set([i]),l=new Map,u={packageRoot:W(i,l),fallbackRoot:o(i)},[{createJiti:d,transformer:f},p]=await Promise.all([ge(),Pe(i,r)]),m=d(i,{fsCache:!1,interopDefault:!0,moduleCache:!1,tryNative:!1,transform:e=>{let{code:t}=ke(f,e,i,u,l,p);return{code:t}}}),h=()=>{let e=new Set;for(let t of Object.values(s))K(t,c,e,u,l);for(let t of c)K(a.cache[t],c,e,u,l)};try{let e=await Ne(i,m,f,u,l,c,p)??await b(i,`utf8`),{evaluation:t}=await xe(u.packageRoot??u.fallbackRoot,()=>{for(let e of c)delete a.cache[e];return m.evalModule(e,{async:!0,cache:s,filename:i,forceTranspile:!0})}),r=await t,o=r?.__esModule?r.default:r;if(o==null)throw Error(`@presets "${n}" has no default export (expected a Preset or preset factory)`);let d=typeof o==`function`?await o():o;return h(),{preset:d,sources:Array.from(c)}}catch(e){h();let t=be(e);throw X(e,t&&G(t,u,l)?[...c,t]:Array.from(c)),e}}async function Ie(e){let t=await te(e),n=ne(e);return n.searchParams.set(`version`,`${t.mtimeMs}:${t.ctimeMs}:${t.size}:${t.ino}`),(await import(n.href)).default}async function Le(e,t){let n=[],r=new Set,i={protectedSlotsByDirectory:new Map};for(let a of e){let e;try{e=ve(a,t);let o;if(H(a)){let t=await Fe(e,a,i);for(let e of t.sources)r.add(e);n.push(t.preset);continue}if(r.add(U(e)),o=await Ie(e),o==null)throw Error(`@presets "${a}" has no default export (expected a Preset or preset factory)`);n.push(typeof o==`function`?await o():o)}catch(t){throw X(t,e!==void 0&&H(a)?[...r,U(e)]:r),t}}return{presets:n,sources:Array.from(r)}}async function Re(e,t){return(await Le(e,t)).presets}function ze(e){let t=e,n=/^url\(\s*([^)]*?)\s*\)$/i.exec(t);if(n)t=n[1];else if(/^url\(/i.test(t))return;let r=t[0];if(r===`"`||r===`'`){if(t.length<2||t[t.length-1]!==r)return;let e=t.slice(1,-1);return e.includes(r)?void 0:e}return n?t:void 0}function Be(e){return!(!e||e.startsWith(`//`)||/^[a-z][\w+.-]*:/i.test(e))}function Ve(e){return e.split(`\\`).join(`/`)}function He(e,t,n,r){if(!Be(e)||c(e)||!r&&!e.startsWith(`./`)&&!e.startsWith(`../`))return e;let i=Ve(u(n,d(t,e)));return i.startsWith(`.`)?i:`./${i}`}function Ue(e,t){if(t.length===0)return e;t.sort((e,t)=>e.start-t.start);let n=``,r=0;for(let i of t)n+=e.slice(r,i.start)+i.replacement,r=i.end;return n+e.slice(r)}function We(e,t,n){if(t===n)return e;let r=[];for(let i of A(e)){if(i.terminator!==`;`||i.name!==`presets`&&i.name!==`source`)continue;let a=i.prelude[0];if(a!==`"`&&a!==`'`||i.prelude[i.prelude.length-1]!==a)continue;if(i.name===`presets`){let e=N(i.prelude).map(e=>{let r=He(e,t,n,!1);if(r.includes(`,`))throw SyntaxError(`@presets: rebased module paths cannot contain commas; re-export from a path without commas`);return r});r.push({start:i.start,end:i.end,replacement:`@presets ${a}${e.join(`,`)}${a};`});continue}let o=i.prelude.slice(1,-1).trim(),s=i.name===`source`&&o.startsWith(`!`),c=s?o.slice(1):o,l=He(c,t,n,i.name===`source`);if(l===c)continue;let u=e.slice(i.start,i.end).replace(i.prelude,`${a}${s?`!`:``}${l}${a}`);r.push({start:i.start,end:i.end,replacement:u})}return Ue(e,r)}function Ge(e,n,r,i,a,s){if(F(e),a>32)return e;let c=[];for(let l of A(e)){if(l.name!==`import`||l.terminator!==`;`)continue;let e=ze(l.prelude);if(e===void 0||!Be(e))continue;let u=d(n,e);if(!s?.has(u))try{if(!t.statSync(u).isFile())continue}catch{continue}if(r.has(u)){c.push({start:l.start,end:l.end,replacement:``});continue}r.add(u),i.push(u);let f=o(u),p=Ge(s?.get(u)??t.readFileSync(u,`utf8`),f,r,i,a+1,s);p=We(p,f,n),c.push({start:l.start,end:l.end,replacement:p})}return Ue(e,c)}function Ke(e,t,n,r){let i=[],a=new Set(n?[d(t,n)]:[]);try{return{css:Ge(e,t,a,i,0,r),files:i}}catch(e){throw X(e,i),e}}function Q(e){return e?e.split(/\s+/)[0]===`theme`?{kind:`invalid`}:{kind:`mode`,mode:e}:{kind:`base`}}function qe(e){let t,n=0,r=null;for(let i=0;i<e.length;i++){let a=e[i];if(r)a===`\\`?i++:a===r&&(r=null);else if(a===`"`||a===`'`)r=a;else if(a===`/`&&e[i+1]===`*`){let r=e.indexOf(`*/`,i+2),a=r<0?e.length:r+2;(t??=[]).push(e.slice(n,i),` `),n=a,i=a-1}}return t?`${t.join(``)}${e.slice(n)}`:e}function Je(e){let t=e[0];if(t===`"`||t===`'`)for(let n=1;n<e.length;n++){let r=e[n];if(r===`\\`)n++;else if(r===t)return n===e.length-1?e.slice(1,n):void 0}}function $(e){let t=A(e),n=[],r={},i=[],a=[],o=[],s=!1,c=!1;for(let e of t){if(e.name===`custom`&&e.terminator===`block`?s=!0:e.name===`teacss`&&e.prelude===``&&e.terminator!==`block`&&(c=!0),e.terminator!==`;`)continue;if(M.includes(e.name)){try{let t=e.name,n=N(e.prelude);r[t]=[...new Set([...r[t]??[],...n])].sort()}catch{}continue}if(e.name===`shortcut`){let t=e.prelude.search(/\s/);if(t<=0)continue;let n=e.prelude.slice(0,t);if(!/^[A-Za-z_][\w-]*$/.test(n))continue;let r=Je(e.prelude.slice(t).trimStart())?.trim();r&&a.push({name:n,expansion:r});continue}if(e.name!==`presets`&&e.name!==`source`&&e.name!==`safelist`)continue;let t=Je(e.prelude)?.trim();if(!t)continue;if(e.name===`presets`){try{n.push(...N(e.prelude))}catch{}continue}if(e.name===`safelist`){o.push(t);continue}let l=t.startsWith(`!`),u=l?t.slice(1):t;u&&i.push({glob:u,exclude:l})}let l=s?j(e).flatMap(({mode:e,declarations:t})=>{let n=Q(e);return n.kind===`invalid`?[]:[{mode:n.kind===`base`?void 0:n.mode,declarations:t.map(({property:e,value:t})=>({property:e,value:qe(t).trim()}))}]}):[];return{presets:n,...Object.keys(r).length?{rolePalettes:r}:{},sources:i,custom:l,shortcuts:a,safelist:o,hasTeacss:c}}async function Ye(e,t,n,r){let a=e.filter(e=>!e.exclude).map(e=>e.glob);if(a.length===0)return{shortcuts:[],safelist:[],files:[]};let o=e.filter(e=>e.exclude).map(e=>e.glob),s=await ee(a,{cwd:t,absolute:!0,ignore:o,expandDirectories:!1}),c=new Set(n),l=s.filter(e=>e.endsWith(`.css`)&&!c.has(e)).sort(),u=[],d=[];for(let e of l){let t;try{t=r?.get(e)??i(e,`utf8`)}catch(e){if(e.code===`ENOENT`)continue;throw e}if(!t.includes(`@shortcut`)&&!t.includes(`@safelist`))continue;let n=$(t);u.push(...n.shortcuts),d.push(...n.safelist)}return{shortcuts:u,safelist:d,files:l}}async function Xe(e,t,n,r){let i=Ke(e,t,n,r),a=$(i.css),[o,s]=await Promise.all([a.presets.length?Le(a.presets,t):{presets:[],sources:[]},Ye(a.sources,t,i.files,r)]).catch(e=>{throw X(e,i.files),e}),c=o.presets,l={},u=[],d=Object.freeze(Object.fromEntries(Object.entries(a.rolePalettes??{}).map(([e,t])=>[e,Object.freeze([...t])]))),f={name:`@teacss/config/role-palettes`,configResolved(e){Object.defineProperty(e,Symbol.for(`@teacss/config/role-palettes`),{value:d,configurable:!0})}};await _({presets:c,configResolved(e){if({theme:l,unknown:u}=E(a.custom,oe(e.theme)),a.rolePalettes&&!e.presets.some(e=>e.name===`@teacss/preset-standard`))throw TypeError(`Role palette directives require an explicitly enabled Standard preset`);e.theme=g(e.theme,l),a.rolePalettes&&f.configResolved?.(e)}}).catch(e=>{throw X(e,[...i.files,...s.files,...o.sources]),e});let p=[...a.sources.filter(e=>!e.exclude).map(e=>e.glob),...a.sources.filter(e=>e.exclude).map(e=>`!${e.glob}`)],m=[...s.shortcuts,...a.shortcuts],ee=Object.fromEntries(m.map(({name:e,expansion:t})=>[e,t])),y=[...new Set([...s.safelist,...a.safelist].flatMap(e=>v(h(e))))];return{config:{presets:a.rolePalettes?[...c,f]:c,theme:l,...a.sources.length?{content:{filesystem:p}}:{},...m.length?{shortcuts:ee}:{},...y.length?{safelist:y}:{}},unknown:u,hasTeacss:i.files.length===0?a.hasTeacss:$(e).hasTeacss,sources:[...i.files,...s.files,...o.sources]}}const Ze=re.join(` `);function Qe(e,t){switch(t){case`unknown-prefix`:return`@custom var "${e}" matches no theme namespace — not registered (emitted as a plain :root var).`;case`illegal-color-step`:return`@custom var "${e}" has an illegal color step — palette steps are ${Ze}.`;case`removed-theme`:return`@custom ${e}: named themes were removed; use global / mode values and data-css-<role> palette selectors.`}}function $e(e,t){let n=S(t),r=[],i=j(e);for(let e of i){if(Q(e.mode).kind===`invalid`){r.push({property:e.mode,start:e.start,end:e.open,reason:`removed-theme`,message:Qe(e.mode,`removed-theme`)});continue}for(let t of e.declarations){let{property:e,start:i,end:a}=t,o=T(e.slice(2),n);o.ok||r.push({property:e,start:i,end:a,reason:o.reason,message:Qe(e,o.reason)})}}return r}const et=Object.freeze([`package.json`,`index.css`,`src/index.css`]),[tt,...nt]=et;function rt(e){let t=e instanceof Error?`${e.name}:${e.message}`:`${typeof e}:${String(e)}`,r=Array.from(new Set(Z(e))).sort().map(e=>{try{let t=n.statSync(e);return`${e}:${t.mtimeMs}:${t.ctimeMs}:${t.size}:${t.ino}`}catch(t){let n=t.code;return`${e}:${n===`ENOENT`?`missing`:`unreadable:${n??String(t)}`}`}});return JSON.stringify([t,r])}function it(e,t){let n={...e};for(let e of Reflect.ownKeys(t)){if(!Object.getOwnPropertyDescriptor(t,e)?.enumerable)continue;let r=Reflect.get(t,e);r!==void 0&&Object.defineProperty(n,e,{value:r,configurable:!0,enumerable:!0,writable:!0})}return n}function at(e){try{let t=n.readFileSync(e,`utf8`);return t.includes(`@teacss`)?A(t).some(e=>e.name===`teacss`&&e.prelude===``&&e.terminator!==`block`):!1}catch(e){if(e.code===`ENOENT`)return!1;throw e}}function ot(e){try{let t=JSON.parse(n.readFileSync(l(e,tt),`utf8`))?.teacss?.entry;return typeof t==`string`?t:void 0}catch(e){if(e.code===`ENOENT`)return;throw e}}function st(e){let t=ot(e);if(t){let r=d(e,t);if(n.existsSync(r)&&n.statSync(r).isFile())return r}for(let t of nt){let r=l(e,t);if(n.existsSync(r)&&n.statSync(r).isFile()&&at(r))return r}}async function ct(e=p.cwd(),t=e,r={}){if(typeof t!=`string`)return{config:it(r,t),sources:[]};let i=d(e,t),a=n.existsSync(i)&&n.statSync(i).isFile()?i:st(i);if(!a)return{config:{...r},sources:[]};let s;try{s=await Xe(n.readFileSync(a,`utf8`),o(a),a)}catch(e){throw X(e,[a]),e}let{config:c}=s,l=it(r,c);return c.presets?.length||(r.presets?.length?l.presets=r.presets:m.warn(`[@teacss/config] "${a}" declares no @presets — no utilities will be generated. Add one, e.g. \`@presets "standard";\``)),{config:l,sources:Array.from(new Set([a,...s.sources]))}}function lt(){let e=new Map,t=new Map,n=new Map,r=new Map,i=new WeakMap,a=new WeakMap,o=new WeakMap,s=new WeakMap,c=(e,n)=>e?t.get(e):n?a.get(n):void 0,l=(e,t)=>e?n.get(e):t?o.get(t):void 0,u=async(e,t)=>{for(;;){let n=c(e,t),r=l(e,t);if(!r)return;let i=await r;if(c(e,t)===n)return i}};return(c=p.cwd(),l=c,f={})=>{let h=typeof l==`string`?d(c,l):void 0,g=typeof l==`object`&&l?l:void 0,_=h?(t.get(h)??0)+1:g?(a.get(g)??0)+1:0;h?t.set(h,_):g&&a.set(g,_);let v=ct(c,l,f).then(n=>(h&&t.get(h)===_?(e.set(h,n),r.delete(h)):g&&a.get(g)===_&&(i.set(g,n),s.delete(g)),n),async n=>{let o=h?t.get(h)===_:!g||a.get(g)===_;if(!o){let e=await u(h,g);if(e)return e}let c=h?e.get(h):g?i.get(g):void 0;if(!c)throw n;if(o){let e=rt(n);e!==(h?r.get(h):g?s.get(g):void 0)&&(m.error(`[@teacss/config] Error resolving config from the CSS entry:`,n),h?r.set(h,e):g&&s.set(g,e));let t=Array.from(new Set([...c.sources,...Z(n)]));return t.length===c.sources.length?c:{...c,sources:t}}return c});return h?n.set(h,v):g&&o.set(g,v),v}}export{M as ROLE_DIRECTIVES,F as assertEntryDirectives,S as buildNamespaces,T as classifyCustomVar,lt as createRecoveryConfigLoader,E as customToTheme,$e as diagnoseCustom,P as diagnoseEntry,et as entryDiscoveryFiles,st as findEntry,Z as getConfigSourcesFromError,ue as hasTopLevelDirective,ct as loadConfig,Q as parseCustomPrelude,$ as parseEntry,N as parseEntryList,Xe as resolveEntryConfig,Re as resolvePresets,oe as scaleThemeKeys,j as scanCustomBlocks,le as scanQuotedDirectives,A as scanTopLevelAtRules};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teacss/config",
3
- "version": "0.5.2",
3
+ "version": "0.6.2",
4
4
  "description": "TeaCSS config loader — discovers the CSS entry and resolves its directives into a config (no teacss.config file).",
5
5
  "homepage": "https://css.teasim.com",
6
6
  "funding": "https://github.com/sponsors/billgo",
@@ -22,7 +22,7 @@
22
22
  "dev": "tsdown --watch"
23
23
  },
24
24
  "dependencies": {
25
- "@teacss/core": "0.5.2",
25
+ "@teacss/core": "0.6.2",
26
26
  "consola": "^3.4.2",
27
27
  "jiti": "^2.7.0",
28
28
  "tinyglobby": "^0.2.17"