@teacss/config 0.5.2 → 0.6.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 +17 -3
- package/dist/index.d.ts +34 -80
- package/dist/index.js +2 -1
- package/package.json +2 -2
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
|
-
@
|
|
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`, `
|
|
18
|
-
|
|
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
|
|
@@ -57,3 +57,17 @@ This package does not scan application modules, generate CSS, or manage a build
|
|
|
57
57
|
tool's lifecycle.
|
|
58
58
|
|
|
59
59
|
Pre-1.0. Keep behavior aligned across build, CLI, and editor integrations.
|
|
60
|
+
|
|
61
|
+
## Palette configuration
|
|
62
|
+
|
|
63
|
+
`@presets "standard,official";` preserves ordered, quoted CSV module names.
|
|
64
|
+
Repeated declarations append; imported relative paths rebase per item.
|
|
65
|
+
Old `@preset`, malformed lists and nested configuration directives fail.
|
|
66
|
+
|
|
67
|
+
With Standard enabled, `@primary "red,blue";` enables DOM selections through
|
|
68
|
+
`data-css-primary`. The same syntax applies to neutral, focused, success, warning,
|
|
69
|
+
failure and general. Focused follows neutral unless a configured palette is
|
|
70
|
+
selected. Repeated/imported lists union; sources are complete physical palettes
|
|
71
|
+
with no role dependencies. `@custom` defines base values, `@custom dark` color
|
|
72
|
+
overrides. Whole-theme variants are removed. Configuration failures retain
|
|
73
|
+
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
|
-
/**
|
|
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
|
-
/** `@
|
|
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
|
-
|
|
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" | "
|
|
134
|
+
reason: "unknown-prefix" | "illegal-color-step" | "removed-theme";
|
|
167
135
|
message: string;
|
|
168
136
|
}
|
|
169
|
-
/**
|
|
170
|
-
|
|
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. `@
|
|
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,7 +163,7 @@ 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 `@
|
|
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
|
*/
|
|
@@ -220,7 +172,7 @@ export declare function resolveEntryConfig(entryCss: string, base: string, entry
|
|
|
220
172
|
//#region src/resolvePresets.d.ts
|
|
221
173
|
declare function getPresetSourcesFromError(error: unknown): string[];
|
|
222
174
|
/**
|
|
223
|
-
* Resolve `@
|
|
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 `@
|
|
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
|
-
* `@
|
|
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){if(F(e),a>32)return e;let s=[];for(let c of A(e)){if(c.name!==`import`||c.terminator!==`;`)continue;let e=ze(c.prelude);if(e===void 0||!Be(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=Ge(t.readFileSync(l,`utf8`),f,r,i,a+1);p=We(p,f,n),s.push({start:c.start,end:c.end,replacement:p})}return Ue(e,s)}function Ke(e,t,n){let r=[],i=new Set(n?[d(t,n)]:[]);try{return{css:Ge(e,t,i,r,0),files:r}}catch(e){throw X(e,r),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){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 ee(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=$(t);l.push(...n.shortcuts),u.push(...n.safelist)}return{shortcuts:l,safelist:u,files:c}}async function Xe(e,t,n){let r=Ke(e,t,n),i=$(r.css),[a,o]=await Promise.all([i.presets.length?Le(i.presets,t):{presets:[],sources:[]},Ye(i.sources,t,r.files)]).catch(e=>{throw X(e,r.files),e}),s=a.presets,c={},l=[];await _({presets:s,configResolved(e){if({theme:c,unknown:l}=E(i.custom,oe(e.theme)),i.rolePalettes){if(!e.presets.some(e=>e.name===`@teacss/preset-standard`))throw TypeError(`Role palette directives require an explicitly enabled Standard preset`);c.rolePalettes=i.rolePalettes}e.theme=g(e.theme,c)}}).catch(e=>{throw X(e,[...r.files,...o.files,...a.sources]),e});let u=[...i.sources.filter(e=>!e.exclude).map(e=>e.glob),...i.sources.filter(e=>e.exclude).map(e=>`!${e.glob}`)],d=[...o.shortcuts,...i.shortcuts],f=Object.fromEntries(d.map(({name:e,expansion:t})=>[e,t])),p=[...new Set([...o.safelist,...i.safelist].flatMap(e=>v(h(e))))];return{config:{presets:s,theme:c,...i.sources.length?{content:{filesystem:u}}:{},...d.length?{shortcuts:f}:{},...p.length?{safelist:p}:{}},unknown:l,hasTeacss:r.files.length===0?i.hasTeacss:$(e).hasTeacss,sources:[...r.files,...o.files,...a.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.
|
|
3
|
+
"version": "0.6.0",
|
|
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.
|
|
25
|
+
"@teacss/core": "0.6.0",
|
|
26
26
|
"consola": "^3.4.2",
|
|
27
27
|
"jiti": "^2.7.0",
|
|
28
28
|
"tinyglobby": "^0.2.17"
|