@teacss/directives 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
@@ -52,7 +52,8 @@ After resolving all applies, pass their flattened utility payloads to
52
52
  `generateApplyPreflights(generator, generated, filename)` and append its CSS at the
53
53
  stylesheet's top level. It preserves configured CSS layers and keeps dependency
54
54
  state local to that stylesheet. Pass the filename so conventional `.module.css`
55
- stylesheets keep generated theme selectors global while author selectors remain
56
- local.
55
+ stylesheets keep generated theme selectors global. Also pass it to
56
+ `renderStandaloneApplyUtility`: fixed dependency selectors, html mode selectors and configured
57
+ aliases stay global while the application host remains local.
57
58
 
58
59
  Pre-1.0. Applications should normally use a build adapter.
package/dist/core.d.ts CHANGED
@@ -27,7 +27,7 @@ export declare function resolveApplyTokens(classNames: readonly string[], genera
27
27
  export declare function missingApplyTokens(tokens: readonly ResolvedApplyToken[]): string[];
28
28
  export declare function formatMissingApplyTokens(missing: readonly string[]): string;
29
29
  export declare function prepareApplyUtilities(tokens: readonly ResolvedApplyToken[], parentOrders: ReadonlyMap<string, number>): PreparedApplyUtility[];
30
- export declare function renderStandaloneApplyUtility(host: ApplyHost, utility: StandaloneApplyUtility): string;
30
+ export declare function renderStandaloneApplyUtility(host: ApplyHost, utility: StandaloneApplyUtility, filename?: string): string;
31
31
  //#endregion
32
32
  //#region src/apply-preflights.d.ts
33
33
  /** Carry dependency-sensitive preflights with the stylesheet that inlined the utilities. */
package/dist/core.js CHANGED
@@ -1 +1 @@
1
- import{a as e,c as t,i as n,n as r,o as i,r as a,s as o,t as s}from"./screen-core-Dxp40_3u.js";export{n as formatMissingApplyTokens,a as generateApplyPreflights,e as missingApplyTokens,i as prepareApplyUtilities,o as renderStandaloneApplyUtility,t as resolveApplyTokens,r as resolveCssFunction,s as resolveScreenQuery};
1
+ import{a as e,c as t,i as n,n as r,o as i,r as a,s as o,t as s}from"./screen-core-LhuCZHM6.js";export{n as formatMissingApplyTokens,a as generateApplyPreflights,e as missingApplyTokens,i as prepareApplyUtilities,o as renderStandaloneApplyUtility,t as resolveApplyTokens,r as resolveCssFunction,s as resolveScreenQuery};
package/dist/index.d.ts CHANGED
@@ -40,7 +40,7 @@ export interface TransformerDirectivesContext {
40
40
  //#endregion
41
41
  //#region src/generateEntry.d.ts
42
42
  export interface GenerateEntryOptions {
43
- /** Entry file directory — base for `@preset` relative specifiers and `@source` globs. */
43
+ /** Entry file directory — base for `@presets` relative specifiers and `@source` globs. */
44
44
  base: string;
45
45
  /** Entry filename, when known, so local `@import` cycles include the root identity. */
46
46
  entryFile?: string;
@@ -59,19 +59,17 @@ export interface GenerateEntryResult {
59
59
  files: string[];
60
60
  /** `@custom` var names that matched no namespace / illegal step (decision 11 — for LSP diagnostics). */
61
61
  unknown: string[];
62
- /** `@custom theme` var names overriding no declared base value (not registered — for diagnostics). */
63
- undeclared: string[];
64
62
  /** Number of utilities matched. */
65
63
  matched: number;
66
64
  /** Whether the entry has a `@teacss;` placeholder. */
67
65
  hasTeacss: boolean;
68
- /** Whether the entry declared at least one `@preset` (false → nothing to generate; caller warns). */
66
+ /** Whether the entry declared at least one `@presets` (false → nothing to generate; caller warns). */
69
67
  hasPreset: boolean;
70
68
  }
71
69
  /**
72
- * Drive generation from a CSS entry: parse its directives, resolve `@preset`,
70
+ * Drive generation from a CSS entry: parse its directives, resolve `@presets`,
73
71
  * register `@custom` into the theme, scan `@source` content, and generate.
74
- * There's no implicit default preset — an entry with no `@preset` yields no
72
+ * There's no implicit default preset — an entry with no `@presets` yields no
75
73
  * utilities and reports `hasPreset: false` for the caller to warn. Returns the
76
74
  * generated layers (the theme preflight emits `:root`/mode vars from the
77
75
  * registered `@custom`) plus the scanned files and `@custom` diagnostics.
@@ -86,7 +84,7 @@ export declare function generateEntry(entryCss: string, options: GenerateEntryOp
86
84
  * Produce the final stylesheet from an entry CSS file and the generated layers:
87
85
  *
88
86
  * - `@teacss;` → replaced by `layers`
89
- * - `@preset` / `@source` / `@shortcut` / `@safelist` / `@custom {}` → stripped (consumed)
87
+ * - `@presets` / `@source` / `@shortcut` / `@safelist` / `@custom {}` → stripped (consumed)
90
88
  * - native `@charset` / `@import` → hoisted in CSS-required order
91
89
  * - everything else (plain rules, comments, `@media`, …) → kept in place
92
90
  *
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{a as e,c as t,i as n,n as r,o as i,r as a,s as o,t as s}from"./screen-core-Dxp40_3u.js";import{createGenerator as c,expandClassGroups as l,expandVariantGroup as u,isCssId as d,splitClassTokens as f,toArray as p}from"@teacss/core";import{generate as m,parse as h,walk as g}from"css-tree";import{hasIconFn as _,hasThemeFn as v,transformThemeFn as y}from"@teacss/rule-helpers";import{customToTheme as b,diagnoseCustom as x,parseEntry as S,resolveEntryConfig as C,resolvePresets as w,scanTopLevelAtRules as T}from"@teacss/config";import{generateSources as E}from"@teacss/runtime/source-generation";async function D(e,t,n){let r=[],i=[],a=!1;for(let o of t.block.children)if(o.type===`Raw`)await n(o.value,o.loc.start.offset);else{let n=await O(e,t,o);if(!n)continue;r.push(n.consumedRange),i.push(...n.standaloneCss),a||=n.hasInlineUtility}let o=e.code.original,s=t.block.loc.start.offset+1,c=!1;for(let[e,t]of r){if(o.slice(s,e).trim()){c=!0;break}s=t}c||=!!o.slice(s,t.block.loc.end.offset-1).trim(),!a&&!c&&r.length>0&&e.code.remove(t.loc.start.offset,t.loc.end.offset);for(let n of i)e.code.appendLeft(t.loc.end.offset,n)}async function O({code:r,generator:a,applyVariable:s,options:c,filename:d,applyUtilities:p},h,g){let _=r.original,v,b=g.loc.end.offset;if(g.type===`Atrule`&&g.name===`apply`&&g.prelude&&g.prelude.type===`Raw`)v=A(g.prelude.value.trim());else if(g.type===`Atrule`&&g.name===`apply`&&!g.prelude&&g.block)b=k(_,b),v=_.slice(g.loc.start.offset+6,b).trim();else if(g.type===`Declaration`&&s.includes(g.property)&&(g.value.type===`Value`||g.value.type===`Raw`)){let e=_.slice(g.value.loc.start.offset,g.value.loc.end.offset).trim();e=A(e),v=f(e).map(e=>A(e)).join(` `)}if(!v)return;v=j(v),v=y(v,a.config.theme,c.throwOnMissing??!0);let x=f(u(l(v))),S=await t(x,a),C=e(S);if(C.length&&(c.throwOnMissing??!0))throw Error(`${n(C)}${d?` in ${d}`:``}`);let w=i(S,a.parentOrders);p?.set(g.loc.start.offset,S.flatMap(([,e])=>e??[]));let T=+(_[b]===`;`),E=[g.loc.start.offset,b+T];if(!w.length)return r.remove(...E),{consumedRange:E,hasInlineUtility:!1,standaloneCss:[]};let D,O=!1,M=[];for(let e of w)if(e.kind===`top-level`)M.push(e.body);else if(e.kind===`standalone`){if(!D){let e=h.prelude;D={prelude:e,selector:m(e),replacementSelector:r.slice(h.prelude.loc.start.offset,h.prelude.loc.end.offset)}}let t=o(D,e);M.push(t)}else O=!0,r.appendLeft(g.loc.start.offset,e.body);return r.remove(...E),{consumedRange:E,hasInlineUtility:O,standaloneCss:M}}function k(e,t){let n=t;for(;e[n]===`@`;){let t=0;for(n++;n<e.length;){let r=e[n];if(r===`[`||r===`(`)t++;else if(r===`]`||r===`)`)t--;else if(t===0&&(/\s/.test(r)||r===`;`||r===`{`||r===`}`))break;n++}}return n}function A(e){return e.replace(/^(['"])(.*)\1$/,`$2`)}function j(e){return e.replace(/\/\*[\s\S]*?\*\//g,``)}async function M({code:e,generator:t,options:n},i){let a=await r(t,i,(t,n)=>e.slice(t,n),n.throwOnMissing??!0);a!==void 0&&e.overwrite(i.loc.start.offset,i.loc.end.offset,a)}const N=/(@screen [^{]+).+/g;function P({code:e,generator:t},n){if(n.prelude?.type!==`Raw`)return;let r=s(n.prelude.value,t.config.theme);if(!r)return;let i=n.loc.start.offset,a=e.original.slice(i,n.loc.end.offset);for(let t of a.matchAll(N))e.overwrite(i+t.index,i+t.index+t[1].length,`@media ${r}`)}const F=new Set([`preset`,`source`,`shortcut`,`safelist`]);function I(e){let t=e.original;if(!t.includes(`@`))return;let n=T(t);if(!n.some(e=>e.name===`teacss`&&e.prelude===``&&e.terminator!==`block`))for(let t of n)(F.has(t.name)?t.terminator===`;`:t.name===`custom`&&t.terminator===`block`)&&e.remove(t.start,t.end)}function L(e){return e.includes(`@preset`)||e.includes(`@source`)||e.includes(`@shortcut`)||e.includes(`@safelist`)||e.includes(`@custom`)}async function R(e,t,n,r,i,o){let s=new Map;await z(e,t,n,s,r,i,o);let c=[...s].sort(([e],[t])=>e-t).flatMap(([,e])=>e),l=await a(t,c,r);l&&e.appendLeft(e.original.length,`\n${l}`)}async function z(e,t,n,r,i,a,o){let{applyVariable:s}=n,c=n.varStyle;s===void 0&&(s=c===void 0?[`--at-apply`]:c?[`${c}apply`]:[]),s=p(s||[]);let l=e=>e.includes(`@apply`)||s.some(t=>e.includes(t)),u=a||e.original,d=l(u),f=u.includes(`@screen`),m=v(u)||_(u);if(a===void 0&&L(u)&&I(e),!d&&!m&&!f)return;let y=h(u,{parseCustomProperty:!0,parseAtrulePrelude:!1,positions:!0,filename:i,offset:o});if(y.type!==`StyleSheet`)return;let b=[],x=new WeakSet,S=new WeakSet,C={options:n,applyVariable:s,generator:t,code:e,filename:i,offset:o,applyUtilities:r},w=(a,o)=>z(e,t,n,r,i,a,o),T=async e=>{for(let t of e.block.children)t.type===`Raw`&&await w(t.value,t.loc.start.offset)};g(y,function(t){if(f&&t.type===`Atrule`&&t.name===`screen`)P(C,t);else if(m&&t.type===`Function`&&(t.name===`theme`||t.name===`icon`))return b.push(M(C,t)),this.skip;else d&&t.type===`Rule`&&l(e.original.slice(t.loc.start.offset,t.loc.end.offset))?(x.add(t),b.push(D(C,t,w))):t.type===`Raw`&&this.rule&&!x.has(this.rule)&&!S.has(this.rule)&&(S.add(this.rule),b.push(T(this.rule)))}),await Promise.all(b)}async function B(e,t){let{base:n,entryFile:r,readSources:i,contents:a}=t,o=await C(e,n,r),s=await c(o.config),l=[],u=[];for(let e of o.config.content?.filesystem??[])e.startsWith(`!`)?u.push(e.slice(1)):l.push(e);let{files:d,sources:f}=a?{files:[],sources:a}:i?await i(l,u):{files:[],sources:[]},p=await E(s,d,f);return{layers:p.getLayers()||``,files:d,unknown:o.unknown,undeclared:o.undeclared,matched:p.matched.size,hasTeacss:o.hasTeacss,hasPreset:!!o.config.presets?.length}}function V(e,t){let n=[],r=[],i=[];for(let a of T(e))a.name===`charset`&&a.terminator===`;`?(n.push(e.slice(a.start,a.end)),i.push({start:a.start,end:a.end,replacement:``})):a.name===`import`&&a.terminator===`;`?(r.push(e.slice(a.start,a.end)),i.push({start:a.start,end:a.end,replacement:``})):(a.name===`preset`||a.name===`source`||a.name===`shortcut`||a.name===`safelist`)&&a.terminator===`;`||a.name===`custom`&&a.terminator===`block`?i.push({start:a.start,end:a.end,replacement:``}):a.name===`teacss`&&a.prelude===``&&a.terminator!==`block`&&i.push({start:a.start,end:a.end,replacement:t});i.sort((e,t)=>e.start-t.start);let a=``,o=0;for(let t of i)a+=e.slice(o,t.start)+t.replacement,o=t.end;a+=e.slice(o);let s=a.startsWith(``)?``:``;s&&(a=a.slice(1));let c=[...n,...r];return s+(c.length?`${c.join(`
2
- `)}\n`:``)+a}function H(e={}){return{name:`@teacss/directives`,enforce:e.enforce,idFilter:d,transform:(t,n,r)=>R(t,r.generator,e,n)}}export{b as customToTheme,H as default,x as diagnoseCustom,B as generateEntry,S as parseEntry,w as resolvePresets,V as spliceEntry,R as transformDirectives};
1
+ import{a as e,c as t,i as n,n as r,o as i,r as a,s as o,t as s}from"./screen-core-LhuCZHM6.js";import{createGenerator as c,expandClassGroups as l,expandVariantGroup as u,isCssId as d,splitClassTokens as f,toArray as p}from"@teacss/core";import{generate as m,parse as h,walk as g}from"css-tree";import{hasIconFn as _,hasThemeFn as v,transformThemeFn as y}from"@teacss/rule-helpers";import{ROLE_DIRECTIVES as b,customToTheme as x,diagnoseCustom as S,parseEntry as C,resolveEntryConfig as w,resolvePresets as T,scanTopLevelAtRules as E}from"@teacss/config";import{generateSources as D}from"@teacss/runtime/source-generation";async function O(e,t,n){let r=[],i=[],a=!1;for(let o of t.block.children)if(o.type===`Raw`)await n(o.value,o.loc.start.offset);else{let n=await k(e,t,o);if(!n)continue;r.push(n.consumedRange),i.push(...n.standaloneCss),a||=n.hasInlineUtility}let o=e.code.original,s=t.block.loc.start.offset+1,c=!1;for(let[e,t]of r){if(o.slice(s,e).trim()){c=!0;break}s=t}c||=!!o.slice(s,t.block.loc.end.offset-1).trim(),!a&&!c&&r.length>0&&e.code.remove(t.loc.start.offset,t.loc.end.offset);for(let n of i)e.code.appendLeft(t.loc.end.offset,n)}async function k({code:r,generator:a,applyVariable:s,options:c,filename:d,applyUtilities:p},h,g){let _=r.original,v,b=g.loc.end.offset;if(g.type===`Atrule`&&g.name===`apply`&&g.prelude&&g.prelude.type===`Raw`)v=j(g.prelude.value.trim());else if(g.type===`Atrule`&&g.name===`apply`&&!g.prelude&&g.block)b=A(_,b),v=_.slice(g.loc.start.offset+6,b).trim();else if(g.type===`Declaration`&&s.includes(g.property)&&(g.value.type===`Value`||g.value.type===`Raw`)){let e=_.slice(g.value.loc.start.offset,g.value.loc.end.offset).trim();e=j(e),v=f(e).map(e=>j(e)).join(` `)}if(!v)return;v=M(v),v=y(v,a.config.theme,c.throwOnMissing??!0);let x=f(u(l(v))),S=await t(x,a),C=e(S);if(C.length&&(c.throwOnMissing??!0))throw Error(`${n(C)}${d?` in ${d}`:``}`);let w=i(S,a.parentOrders);p?.set(g.loc.start.offset,S.flatMap(([,e])=>e??[]));let T=+(_[b]===`;`),E=[g.loc.start.offset,b+T];if(!w.length)return r.remove(...E),{consumedRange:E,hasInlineUtility:!1,standaloneCss:[]};let D,O=!1,k=[];for(let e of w)if(e.kind===`top-level`)k.push(e.body);else if(e.kind===`standalone`){if(!D){let e=h.prelude;D={prelude:e,selector:m(e),replacementSelector:r.slice(h.prelude.loc.start.offset,h.prelude.loc.end.offset)}}let t=o(D,e,d);k.push(t)}else O=!0,r.appendLeft(g.loc.start.offset,e.body);return r.remove(...E),{consumedRange:E,hasInlineUtility:O,standaloneCss:k}}function A(e,t){let n=t;for(;e[n]===`@`;){let t=0;for(n++;n<e.length;){let r=e[n];if(r===`[`||r===`(`)t++;else if(r===`]`||r===`)`)t--;else if(t===0&&(/\s/.test(r)||r===`;`||r===`{`||r===`}`))break;n++}}return n}function j(e){return e.replace(/^(['"])(.*)\1$/,`$2`)}function M(e){return e.replace(/\/\*[\s\S]*?\*\//g,``)}async function N({code:e,generator:t,options:n},i){let a=await r(t,i,(t,n)=>e.slice(t,n),n.throwOnMissing??!0);a!==void 0&&e.overwrite(i.loc.start.offset,i.loc.end.offset,a)}const P=/(@screen [^{]+).+/g;function F({code:e,generator:t},n){if(n.prelude?.type!==`Raw`)return;let r=s(n.prelude.value,t.config.theme);if(!r)return;let i=n.loc.start.offset,a=e.original.slice(i,n.loc.end.offset);for(let t of a.matchAll(P))e.overwrite(i+t.index,i+t.index+t[1].length,`@media ${r}`)}const I=new Set([`presets`,`source`,`shortcut`,`safelist`,...b]);function L(e){let t=e.original;if(!t.includes(`@`))return;let n=E(t);if(!n.some(e=>e.name===`teacss`&&e.prelude===``&&e.terminator!==`block`))for(let t of n)(I.has(t.name)?t.terminator===`;`:t.name===`custom`&&t.terminator===`block`)&&e.remove(t.start,t.end)}function R(e){return b.some(t=>e.includes(`@${t}`))||e.includes(`@preset`)||e.includes(`@source`)||e.includes(`@shortcut`)||e.includes(`@safelist`)||e.includes(`@custom`)}async function z(e,t,n,r,i,o){let s=new Map;await B(e,t,n,s,r,i,o);let c=[...s].sort(([e],[t])=>e-t).flatMap(([,e])=>e),l=await a(t,c,r);l&&e.appendLeft(e.original.length,`\n${l}`)}async function B(e,t,n,r,i,a,o){let{applyVariable:s}=n,c=n.varStyle;s===void 0&&(s=c===void 0?[`--at-apply`]:c?[`${c}apply`]:[]),s=p(s||[]);let l=e=>e.includes(`@apply`)||s.some(t=>e.includes(t)),u=a||e.original,d=l(u),f=u.includes(`@screen`),m=v(u)||_(u);if(a===void 0&&R(u)&&L(e),!d&&!m&&!f)return;let y=h(u,{parseCustomProperty:!0,parseAtrulePrelude:!1,positions:!0,filename:i,offset:o});if(y.type!==`StyleSheet`)return;let b=[],x=new WeakSet,S=new WeakSet,C={options:n,applyVariable:s,generator:t,code:e,filename:i,offset:o,applyUtilities:r},w=(a,o)=>B(e,t,n,r,i,a,o),T=async e=>{for(let t of e.block.children)t.type===`Raw`&&await w(t.value,t.loc.start.offset)};g(y,function(t){if(f&&t.type===`Atrule`&&t.name===`screen`)F(C,t);else if(m&&t.type===`Function`&&(t.name===`theme`||t.name===`icon`))return b.push(N(C,t)),this.skip;else d&&t.type===`Rule`&&l(e.original.slice(t.loc.start.offset,t.loc.end.offset))?(x.add(t),b.push(O(C,t,w))):t.type===`Raw`&&this.rule&&!x.has(this.rule)&&!S.has(this.rule)&&(S.add(this.rule),b.push(T(this.rule)))}),await Promise.all(b)}async function V(e,t){let{base:n,entryFile:r,readSources:i,contents:a}=t,o=await w(e,n,r),s=await c(o.config),l=[],u=[];for(let e of o.config.content?.filesystem??[])e.startsWith(`!`)?u.push(e.slice(1)):l.push(e);let{files:d,sources:f}=a?{files:[],sources:a}:i?await i(l,u):{files:[],sources:[]},p=await D(s,d,f);return{layers:p.getLayers()||``,files:d,unknown:o.unknown,matched:p.matched.size,hasTeacss:o.hasTeacss,hasPreset:!!o.config.presets?.length}}function H(e,t){let n=[],r=[],i=[];for(let a of E(e))a.name===`charset`&&a.terminator===`;`?(n.push(e.slice(a.start,a.end)),i.push({start:a.start,end:a.end,replacement:``})):a.name===`import`&&a.terminator===`;`?(r.push(e.slice(a.start,a.end)),i.push({start:a.start,end:a.end,replacement:``})):(b.includes(a.name)||a.name===`presets`||a.name===`source`||a.name===`shortcut`||a.name===`safelist`)&&a.terminator===`;`||a.name===`custom`&&a.terminator===`block`?i.push({start:a.start,end:a.end,replacement:``}):a.name===`teacss`&&a.prelude===``&&a.terminator!==`block`&&i.push({start:a.start,end:a.end,replacement:t});i.sort((e,t)=>e.start-t.start);let a=``,o=0;for(let t of i)a+=e.slice(o,t.start)+t.replacement,o=t.end;a+=e.slice(o);let s=a.startsWith(``)?``:``;s&&(a=a.slice(1));let c=[...n,...r];return s+(c.length?`${c.join(`
2
+ `)}\n`:``)+a}function U(e={}){return{name:`@teacss/directives`,enforce:e.enforce,idFilter:d,transform:(t,n,r)=>z(t,r.generator,e,n)}}export{x as customToTheme,U as default,S as diagnoseCustom,V as generateEntry,C as parseEntry,T as resolvePresets,H as spliceEntry,z as transformDirectives};
@@ -0,0 +1 @@
1
+ import{clone as e,comparableWidth as t,createGenerator as n,notNull as r,toArray as i}from"@teacss/core";import{clone as a,generate as o,ident as s,parse as c,walk as l}from"css-tree";import{calcMaxWidthBySize as u,hasIconFn as d,hasThemeFn as f,transformThemeFn as p,transformThemeString as m}from"@teacss/rule-helpers";function h(e){if(e.type!==`PseudoClassSelector`||e.name!==`is`)return!1;let t=e.children?.first;if(t?.type!==`SelectorList`)return!1;let n=t.children.toArray().map(e=>o(e));return n.length===2&&/^:root:where\(html[:[]/.test(n[0])&&n[1]===`${n[0].slice(5)} *`}function g(e,t,n){if(!/\.module\.(?:css|postcss|scss|sass|less|styl|stylus)$/i.test(t?.split(/[?#]/,1)[0]??``)||!n&&!/@scope\s*\(|:root:where\(html/i.test(e))return e;let r=c(e),i=e=>{e.children=e.children.map(e=>c(`:global(${o(e)})`,{context:`selector`}))};return l(r,{enter(e,t,r){if(e.type===`PseudoClassSelector`&&e.name===`global`)return this.skip;if(!n&&h(e)){let n=c(`:global(${o(e)})`,{context:`selector`});return r.replace(t,n.children),this.skip}if(e.type===`Scope`){e.root?.type===`SelectorList`&&i(e.root),e.limit?.type===`SelectorList`&&i(e.limit);return}n&&e.type===`Rule`&&(this.atrule&&/(?:^|-)keyframes$/i.test(this.atrule.name)||e.prelude.type===`SelectorList`&&i(e.prelude))}}),o(r)}function _(e){try{let t=c(e,{context:`declarationList`});for(let e of t.children)if(e.type===`Atrule`)return!0}catch{}return!1}async function v(e,t){return await Promise.all(e.map(async e=>[e,await t.parseToken(e,`-`)]))}function y(e){return e.filter(([,e])=>e==null).map(([e])=>e)}function b(e){return`[@teacss] @apply: no rule matched ${e.map(e=>`"${e}"`).join(`, `)}`}function x(e){let t=!1,n=0,r,i=``;for(let a=0;a<e.length;a++){let o=e[a];if(t){o===`*`&&e[a+1]===`/`&&(t=!1,a++);continue}if(r){o===`\\`?a++:o===r&&(r=void 0);continue}if(o===`/`&&e[a+1]===`*`){t=!0,a++;continue}if(o===`\\`){a++;continue}if(o===`"`||o===`'`){r=o;continue}if(!/\s/.test(o)||e[a+1]!==`$`||e[a+2]!==`$`||!/\s/.test(e[a+3]??``))continue;let s=a+4;for(;s<e.length&&/\s/.test(e[s]);)s++;i+=`${e.slice(n,a)} `,n=s,a=s-1}return n?i+e.slice(n):e}function S(e){let t=[],n=0,r=!1,i=0,a,o=0;for(let s=0;s<e.length;s++){let c=e[s];r?c===`*`&&e[s+1]===`/`&&(r=!1,s++):a?c===`\\`?s++:c===a&&(a=void 0):c===`/`&&e[s+1]===`*`?(r=!0,s++):c===`"`||c===`'`?a=c:c===`(`?i++:c===`)`?i>0&&i--:c===`[`?n++:c===`]`?n>0&&n--:n===0&&i===0&&e.startsWith(` $$ `,s)&&(t.push(e.slice(o,s)),s+=3,o=s+1)}return t.push(e.slice(o)),t}function C(e,t){let n=e.flatMap(([,e])=>e??[]).filter(r).sort((e,n)=>(e[3]?t.get(e[3])??0:0)-(n[3]?t.get(n[3])??0:0)||e[0]-n[0]);if(!n.length)return[];let i=[],a;for(let e of n){if(!a&&i.length===64){a=new Map;for(let e of i)w(a,e)}let t=e[1],n=e[3],r=t===void 0&&n===void 0&&_(e[2]),o=a?a.get(n)?.get(t)?.get(r):i.find(e=>e.value[1]===t&&e.value[3]===n&&e.topLevel===r);if(o){o.value[2]+=e[2];continue}let s={topLevel:r,value:[...e]};i.push(s),a&&w(a,s)}return i.map(({topLevel:e,value:[,t,n,r,i]})=>{let a=t&&x(t),o=!!(a&&i?.noMerge);return e?{kind:`top-level`,body:n}:r||a&&a!==`.\\-`||o?{kind:`standalone`,selector:a,body:n,parent:r,noMerge:o}:{kind:`inline`,body:n}})}function w(e,t){let n=t.value[3],r=e.get(n);r||(r=new Map,e.set(n,r));let i=t.value[1],a=r.get(i);a||(a=new Map,r.set(i,a)),a.set(t.topLevel,t)}function T(e,t,n){let r=e.selector,i=!1;if(t.selector&&t.selector!==`.\\-`){let n=E(e.prelude,t.selector);r=n.selector,i=!n.hasHost}let a=g(`${r}{${t.body}}`,n,i);if(t.parent){let n=S(t.parent);a=n.length>1?`${n.join(`{`)}{${a}${`}`.repeat(n.length)}`:t.parent===`.\\-`?`${e.replacementSelector}{${a}}`:`${t.parent}{${a}}`}return g(a,n,!1)}function E(e,t){let n=c(`${t}{}`,{context:`rule`}).prelude,r=!1;if(l(n,{enter(e){if(h(e))return this.skip;e.type===`ClassSelector`&&s.decode(e.name)===`-`&&(r=!0)}}),!r)return{selector:o(n),hasHost:r};let i=a(n);return i.children.clear(),e.children.forEach(e=>{n.children.forEach(t=>{let n=a(t);l(n,{enter(t,n,r){if(h(t))return this.skip;t.type===`ClassSelector`&&s.decode(t.name)===`-`&&r.replace(n,a(e).children)}}),i.children.appendData(n)})}),{selector:o(i),hasHost:r}}function D(e,t){let n=e;for(;n!==null&&n!==Object.prototype&&n!==Array.prototype&&n!==Function.prototype;){if(Object.hasOwn(n,t))return Reflect.get(e,t);n=Object.getPrototypeOf(n)}}async function O(t,r,a){if(!r.length)return``;let o=t.config,s=[],c=()=>{if(t.config!==o)throw Error(`[@teacss] Configuration changed while generating @apply dependencies; retry the stylesheet transform.`)};for(let n of i(o.preflights)){let i=D(n,`getCSS`);if(!i)continue;let a=await Reflect.apply(i,n,[{generator:t,generated:[],theme:o.theme}]);c();let l=await Reflect.apply(i,n,[{generator:t,generated:e(r),theme:o.theme}]);c(),l&&l!==a&&s.push({layer:D(n,`layer`),getCSS:()=>l})}if(!s.length)return``;let l=await(await n({layers:o.layers,sortLayers:o.sortLayers,outputToCssLayers:o.outputToCssLayers,preflights:s})).generate(new Set,{safelist:!1});return c(),g(l.css,a,!0)}async function k(e,t,n,r=!0){switch(t.name){case`theme`:{if(!t.children.size)throw Error(`theme() expect exact one argument`);if(t.children.first.type!==`String`)throw Error(`theme() expect a string argument`);let i;if(t.children.size>1){let e=t.children.toArray().slice(1);if(e[0].type!==`Operator`||e[0].value!==`,`)throw Error(`theme() expect a comma between expression string and default value`);e.length>1&&(i=[e[1].loc.start.offset,t.children.last.loc.end.offset])}let a=m(t.children.first.value,e.config.theme,!i&&r);return a===void 0&&i&&(a=await A(e,n(i[0],i[1]),r)),a}case`icon`:{let n=t.children.toArray().filter(e=>e.type===`String`).map(e=>e.value);if(n.length===0)throw Error(`icon() expects at least one argument`);let[i,a]=n;return a&&=encodeURIComponent(p(a,e.config.theme,r)),j(e,i,a)}}}async function A(e,t,n){if(!f(t)&&!d(t))return t;let r=[],i=[],a=c(t,{context:`value`,parseCustomProperty:!0,positions:!0});l(a,function(a){if(!(a.type!==`Function`||a.name!==`theme`&&a.name!==`icon`||!a.loc))return i.push(k(e,a,(e,n)=>t.slice(e,n),n).then(e=>{e!==void 0&&r.push({start:a.loc.start.offset,end:a.loc.end.offset,value:e})})),this.skip}),await Promise.all(i);let o=t;for(let e of r.sort((e,t)=>t.start-e.start))o=`${o.slice(0,e.start)}${e.value}${o.slice(e.end)}`;return o}async function j(e,t,n){let r=e.config.presets?.flat()?.find(e=>e.name===`@teacss/preset-icons`);if(!r){console.warn(`@teacss/preset-icons not found, icon() directive will be kept as-is`);return}let i=r.api,a=await i.resolveIcon(t);if(!a)return;let o=i.encodeSvgForCss(a.svg);return`url("data:image/svg+xml;utf8,${n?o.replace(/currentcolor/gi,n):o}")`}function M(e){return typeof e==`string`?t(e)??void 0:void 0}function N(e,t){let n=e.trim();if(!n)return;let r=``,i=n.match(/^(?:(lt|at)-)?([\w-]+)$/);i&&(r=i[1],n=i[2]);let{breakpoint:a,breakpoints:o}=t,s=a??o??{};if(r!==`at`){if(!Object.hasOwn(s,n))throw Error(`breakpoint ${n} not found`);let e=s[n];return r===`lt`?`(max-width: ${u(e)})`:`(min-width: ${e})`}let c=Object.entries(s),l=c.find(([e])=>e===n);if(!l)throw Error(`breakpoint ${n} not found`);let d=l[1],f=M(d),p,m;if(f!==void 0)for(let[e,t]of c){if(e===n)continue;let r=M(t);r===void 0||r.unit!==f.unit||r.value<=f.value||m!==void 0&&(r.value>m.value||r.value===m.value&&t>=p)||(p=t,m=r)}return`(min-width: ${d})${p===void 0?``:` and (max-width: ${u(p)})`}`}export{y as a,v as c,b as i,k as n,C as o,O as r,T as s,N as t};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teacss/directives",
3
- "version": "0.5.2",
3
+ "version": "0.6.2",
4
4
  "description": "Build-time CSS directive transformer for TeaCSS — @apply, theme(), icon(), and @screen.",
5
5
  "homepage": "https://css.teasim.com",
6
6
  "funding": "https://github.com/sponsors/billgo",
@@ -23,16 +23,17 @@
23
23
  "dev": "tsdown --watch"
24
24
  },
25
25
  "dependencies": {
26
- "@teacss/config": "0.5.2",
27
- "@teacss/core": "0.5.2",
28
- "@teacss/rule-helpers": "0.5.2",
29
- "@teacss/runtime": "0.5.2",
26
+ "@teacss/config": "0.6.2",
27
+ "@teacss/core": "0.6.2",
28
+ "@teacss/rule-helpers": "0.6.2",
29
+ "@teacss/runtime": "0.6.2",
30
30
  "@types/css-tree": "^3.2.0",
31
31
  "css-tree": "^3.2.1"
32
32
  },
33
33
  "devDependencies": {
34
- "@teacss/preset-icons": "0.5.2",
35
- "@teacss/preset-standard": "0.5.2",
34
+ "@teacss/preset-icons": "0.6.2",
35
+ "@teacss/preset-official": "0.6.2",
36
+ "@teacss/preset-standard": "0.6.2",
36
37
  "magic-string": "^1.2.3"
37
38
  },
38
39
  "engines": {
@@ -1 +0,0 @@
1
- import{clone as e,comparableWidth as t,createGenerator as n,notNull as r,toArray as i}from"@teacss/core";import{clone as a,generate as o,parse as s,walk as c}from"css-tree";import{calcMaxWidthBySize as l,hasIconFn as u,hasThemeFn as d,transformThemeFn as f,transformThemeString as p}from"@teacss/rule-helpers";function m(e){try{let t=s(e,{context:`declarationList`});for(let e of t.children)if(e.type===`Atrule`)return!0}catch{}return!1}async function h(e,t){return await Promise.all(e.map(async e=>[e,await t.parseToken(e,`-`)]))}function g(e){return e.filter(([,e])=>e==null).map(([e])=>e)}function _(e){return`[@teacss] @apply: no rule matched ${e.map(e=>`"${e}"`).join(`, `)}`}function v(e){let t=!1,n=0,r,i=``;for(let a=0;a<e.length;a++){let o=e[a];if(t){o===`*`&&e[a+1]===`/`&&(t=!1,a++);continue}if(r){o===`\\`?a++:o===r&&(r=void 0);continue}if(o===`/`&&e[a+1]===`*`){t=!0,a++;continue}if(o===`\\`){a++;continue}if(o===`"`||o===`'`){r=o;continue}if(!/\s/.test(o)||e[a+1]!==`$`||e[a+2]!==`$`||!/\s/.test(e[a+3]??``))continue;let s=a+4;for(;s<e.length&&/\s/.test(e[s]);)s++;i+=`${e.slice(n,a)} `,n=s,a=s-1}return n?i+e.slice(n):e}function y(e){let t=[],n=0,r=!1,i=0,a,o=0;for(let s=0;s<e.length;s++){let c=e[s];r?c===`*`&&e[s+1]===`/`&&(r=!1,s++):a?c===`\\`?s++:c===a&&(a=void 0):c===`/`&&e[s+1]===`*`?(r=!0,s++):c===`"`||c===`'`?a=c:c===`(`?i++:c===`)`?i>0&&i--:c===`[`?n++:c===`]`?n>0&&n--:n===0&&i===0&&e.startsWith(` $$ `,s)&&(t.push(e.slice(o,s)),s+=3,o=s+1)}return t.push(e.slice(o)),t}function b(e,t){let n=e.flatMap(([,e])=>e??[]).filter(r).sort((e,n)=>(e[3]?t.get(e[3])??0:0)-(n[3]?t.get(n[3])??0:0)||e[0]-n[0]);if(!n.length)return[];let i=[],a;for(let e of n){if(!a&&i.length===64){a=new Map;for(let e of i)x(a,e)}let t=e[1],n=e[3],r=t===void 0&&n===void 0&&m(e[2]),o=a?a.get(n)?.get(t)?.get(r):i.find(e=>e.value[1]===t&&e.value[3]===n&&e.topLevel===r);if(o){o.value[2]+=e[2];continue}let s={topLevel:r,value:[...e]};i.push(s),a&&x(a,s)}return i.map(({topLevel:e,value:[,t,n,r,i]})=>{let a=t&&v(t),o=!!(a&&i?.noMerge);return e?{kind:`top-level`,body:n}:r||a&&a!==`.\\-`||o?{kind:`standalone`,selector:a,body:n,parent:r,noMerge:o}:{kind:`inline`,body:n}})}function x(e,t){let n=t.value[3],r=e.get(n);r||(r=new Map,e.set(n,r));let i=t.value[1],a=r.get(i);a||(a=new Map,r.set(i,a)),a.set(t.topLevel,t)}function S(e,t){let n=e.selector;t.selector&&t.selector!==`.\\-`&&(n=C(e.prelude,t.selector));let r=`${n}{${t.body}}`;if(t.parent){let n=y(t.parent);r=n.length>1?`${n.join(`{`)}{${r}${`}`.repeat(n.length)}`:t.parent===`.\\-`?`${e.replacementSelector}{${r}}`:`${t.parent}{${r}}`}return r}function C(e,t){let n=s(`${t}{}`,{context:`rule`}).prelude;if(!t.includes(`.\\-`))return o(n);let r=a(n);return r.children.clear(),e.children.forEach(e=>{n.children.forEach(t=>{let n=a(t);c(n,{visit:`ClassSelector`,enter(t,n,r){t.name===`\\-`&&r.replace(n,a(e).children)}}),r.children.appendData(n)})}),o(r)}function w(e,t){let n=e;for(;n!==null&&n!==Object.prototype&&n!==Array.prototype&&n!==Function.prototype;){if(Object.hasOwn(n,t))return Reflect.get(e,t);n=Object.getPrototypeOf(n)}}function T(e){let t=s(e);return c(t,{visit:`Rule`,enter(e){this.atrule&&/(?:^|-)keyframes$/i.test(this.atrule.name)||e.prelude.type===`SelectorList`&&(e.prelude.children=e.prelude.children.map(e=>s(`:global(${o(e)})`,{context:`selector`})))}}),o(t)}async function E(t,r,a){if(!r.length)return``;let o=t.config,s=[],c=()=>{if(t.config!==o)throw Error(`[@teacss] Configuration changed while generating @apply dependencies; retry the stylesheet transform.`)};for(let n of i(o.preflights)){let i=w(n,`getCSS`);if(!i)continue;let a=await Reflect.apply(i,n,[{generator:t,generated:[],theme:o.theme}]);c();let l=await Reflect.apply(i,n,[{generator:t,generated:e(r),theme:o.theme}]);c(),l&&l!==a&&s.push({layer:w(n,`layer`),getCSS:()=>l})}if(!s.length)return``;let l=await(await n({layers:o.layers,sortLayers:o.sortLayers,outputToCssLayers:o.outputToCssLayers,preflights:s})).generate(new Set,{safelist:!1});return c(),/\.module\.(?:css|postcss|scss|sass|less|styl|stylus)$/i.test(a?.split(/[?#]/,1)[0]??``)?T(l.css):l.css}async function D(e,t,n,r=!0){switch(t.name){case`theme`:{if(!t.children.size)throw Error(`theme() expect exact one argument`);if(t.children.first.type!==`String`)throw Error(`theme() expect a string argument`);let i;if(t.children.size>1){let e=t.children.toArray().slice(1);if(e[0].type!==`Operator`||e[0].value!==`,`)throw Error(`theme() expect a comma between expression string and default value`);e.length>1&&(i=[e[1].loc.start.offset,t.children.last.loc.end.offset])}let a=p(t.children.first.value,e.config.theme,!i&&r);return a===void 0&&i&&(a=await O(e,n(i[0],i[1]),r)),a}case`icon`:{let n=t.children.toArray().filter(e=>e.type===`String`).map(e=>e.value);if(n.length===0)throw Error(`icon() expects at least one argument`);let[i,a]=n;return a&&=encodeURIComponent(f(a,e.config.theme,r)),k(e,i,a)}}}async function O(e,t,n){if(!d(t)&&!u(t))return t;let r=[],i=[],a=s(t,{context:`value`,parseCustomProperty:!0,positions:!0});c(a,function(a){if(!(a.type!==`Function`||a.name!==`theme`&&a.name!==`icon`||!a.loc))return i.push(D(e,a,(e,n)=>t.slice(e,n),n).then(e=>{e!==void 0&&r.push({start:a.loc.start.offset,end:a.loc.end.offset,value:e})})),this.skip}),await Promise.all(i);let o=t;for(let e of r.sort((e,t)=>t.start-e.start))o=`${o.slice(0,e.start)}${e.value}${o.slice(e.end)}`;return o}async function k(e,t,n){let r=e.config.presets?.flat()?.find(e=>e.name===`@teacss/preset-icons`);if(!r){console.warn(`@teacss/preset-icons not found, icon() directive will be kept as-is`);return}let i=r.api,a=await i.resolveIcon(t);if(!a)return;let o=i.encodeSvgForCss(a.svg);return`url("data:image/svg+xml;utf8,${n?o.replace(/currentcolor/gi,n):o}")`}function A(e){return typeof e==`string`?t(e)??void 0:void 0}function j(e,t){let n=e.trim();if(!n)return;let r=``,i=n.match(/^(?:(lt|at)-)?([\w-]+)$/);i&&(r=i[1],n=i[2]);let{breakpoint:a,breakpoints:o}=t,s=a??o??{};if(r!==`at`){if(!Object.hasOwn(s,n))throw Error(`breakpoint ${n} not found`);let e=s[n];return r===`lt`?`(max-width: ${l(e)})`:`(min-width: ${e})`}let c=Object.entries(s),u=c.find(([e])=>e===n);if(!u)throw Error(`breakpoint ${n} not found`);let d=u[1],f=A(d),p,m;if(f!==void 0)for(let[e,t]of c){if(e===n)continue;let r=A(t);r===void 0||r.unit!==f.unit||r.value<=f.value||m!==void 0&&(r.value>m.value||r.value===m.value&&t>=p)||(p=t,m=r)}return`(min-width: ${d})${p===void 0?``:` and (max-width: ${l(p)})`}`}export{g as a,h as c,_ as i,D as n,b as o,E as r,S as s,j as t};