@slabui/theme-core 0.2.0 → 0.3.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/CHANGELOG.md +10 -0
- package/dist/index.d.mts +4 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# @slabui/theme-core
|
|
2
2
|
|
|
3
|
+
## 0.3.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#95](https://github.com/slabui/ui/pull/95) [`d099c46`](https://github.com/slabui/ui/commit/d099c4656eb551a3b51c75034adb05873533ce93) Thanks [@andrefelipeschulle](https://github.com/andrefelipeschulle)! - O tema padrão ganha a cor da marca, `brand` e `brand-foreground`, com os mesmos valores iniciais do `primary`. A `brand` é a identidade (logo, destaques); o `primary` é a cor das ações dos componentes.
|
|
8
|
+
|
|
9
|
+
O `slabui init` passa a gravar, além das cores do `base.css`, as que quase todo componente usa, cada uma com o `-foreground`: `brand`, `primary`, `secondary`, `danger`, `success`, `warning` e `inverted`. Com o `danger`, vem também o apelido `--color-destructive`.
|
|
10
|
+
|
|
11
|
+
No editor de tema, a lista de cores ganha o grupo "Brand", antes de "Actions".
|
|
12
|
+
|
|
3
13
|
## 0.2.0
|
|
4
14
|
|
|
5
15
|
### Minor Changes
|
package/dist/index.d.mts
CHANGED
|
@@ -104,6 +104,8 @@ export declare const defaultTheme: {
|
|
|
104
104
|
"sidebar-accent-foreground": string;
|
|
105
105
|
"sidebar-border": string;
|
|
106
106
|
"sidebar-ring": string;
|
|
107
|
+
brand: string;
|
|
108
|
+
"brand-foreground": string;
|
|
107
109
|
primary: string;
|
|
108
110
|
"primary-foreground": string;
|
|
109
111
|
secondary: string;
|
|
@@ -153,6 +155,8 @@ export declare const defaultTheme: {
|
|
|
153
155
|
"sidebar-accent-foreground": string;
|
|
154
156
|
"sidebar-border": string;
|
|
155
157
|
"sidebar-ring": string;
|
|
158
|
+
brand: string;
|
|
159
|
+
"brand-foreground": string;
|
|
156
160
|
primary: string;
|
|
157
161
|
"primary-foreground": string;
|
|
158
162
|
danger: string;
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/css.ts","../src/default-theme.ts","../src/rules.ts","../src/validate.ts","../src/theme.ts","../src/tokens.ts"],"mappings":";;;KACY;KAGA,YAAY;KAIZ,cAAc,QAAQ,OAAO,YAAY;KCGzC;EACV,OAAO;EACP;EACA;;KAGU;EACV;EACA,SAAS;EACT;;KAGU;EAEV,OAAO;EACP;EAEA,gBAAgB,OAAO,YAAY,iBAAiB;EAGpD;;wBAOoB,aACpB,aACA,QAAQ,eACN,MAAM,WAAmB,cAAc,UAAS,sBACjD,QAAQ;wBAiGK,kBAAkB,MAAM,cAAc;qBCvIzC;;IAET;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IAKA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IAEA;IACA;IAGA;;;IAGA;IACA;IAGA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/css.ts","../src/default-theme.ts","../src/rules.ts","../src/validate.ts","../src/theme.ts","../src/tokens.ts"],"mappings":";;;KACY;KAGA,YAAY;KAIZ,cAAc,QAAQ,OAAO,YAAY;KCGzC;EACV,OAAO;EACP;EACA;;KAGU;EACV;EACA,SAAS;EACT;;KAGU;EAEV,OAAO;EACP;EAEA,gBAAgB,OAAO,YAAY,iBAAiB;EAGpD;;wBAOoB,aACpB,aACA,QAAQ,eACN,MAAM,WAAmB,cAAc,UAAS,sBACjD,QAAQ;wBAiGK,kBAAkB,MAAM,cAAc;qBCvIzC;;IAET;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IAKA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IAEA;IACA;IAGA;;;IAGA;IACA;IAGA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAKA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IAEA;IACA;IACA;;;IAGA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IAEA;IACA;IACA;;;wBAMY,kBAAkB;KClKtB;EACV,YAAY;EACZ,WAAW;EACX,OAAO,eAAe;;KAGZ;KAEA;EACV,MAAM;EAEN;EACA;;KAGU;EACV;EACA,SAAS;EACT;;KAGU;EAEV,OAAO;EACP;EAEA,gBAAgB,MAAM,aAAa,iBAAiB;;wBAatC,aACd,cACC,SAAS,KAAK;wBAmBK,cACpB,aACA,QAAQ,KAAK,qCACb,UAAS,uBACR,QAAQ;wBAgDW,eACpB,aACA,SAAQ,kBACR,UAAS,uBACR,QAAQ;KClIC;KAEA;EACV,OAAO;EACP;EACA;EACA;;qBAGW,6BAA6B;WACnB,QAAQ;EAA7B,YAAqB,QAAQ;;wBAwCf,YAAY;wBA6BZ,aAAa,gBAAgB;KA6BjC;EAEV,YAAY;;wBAKE,cACd,QAAQ,eACN,cAA4B,uBAC7B;KCvGS;EAGV;;wBAOc,UACd,eACE,UAAS,mBACV;wBAsCmB,WACpB,aACA,QAAQ,eAEN,cACG,YACF,KAAK,oCAAoC,uBAC3C,QAAQ;KC1DC;EAEV,MAAM;EAGN,QAAQ;;wBAIM,aACd,OAAO,aACP,WAAU,gBACT;wBAyBa,WACd,oBACA,SAAS"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{THEME_ATTRIBUTE as e,THEME_ENV as t,isThemeName as n,themeAttribute as r,themeSelector as i}from"./attribute.mjs";import{d as a,l as o,r as s,t as c,u as l}from"./theme-files-a8APQNco.mjs";import u from"postcss";const d={theme:{"font-sans":`var(--font-sans)`,"font-heading":`var(--font-heading)`,"font-mono":`var(--font-mono)`,"radius-sm":`calc(var(--radius) * 0.6)`,"radius-md":`calc(var(--radius) * 0.8)`,"radius-lg":`var(--radius)`,"radius-xl":`calc(var(--radius) * 1.4)`,"radius-2xl":`calc(var(--radius) * 1.8)`,"radius-3xl":`calc(var(--radius) * 2.2)`,"radius-4xl":`calc(var(--radius) * 2.6)`,"breakpoint-3xl":`1600px`,"breakpoint-4xl":`2000px`,"text-xxs":`calc(var(--font-size) * 0.625)`,"text-2xxs":`calc(var(--font-size) * 0.688)`,"text-xs":`calc(var(--font-size) * 0.75)`,"text-xs--line-height":`calc(1 / 0.75)`,"text-2xs":`calc(var(--font-size) * 0.813)`,"text-2xs--line-height":`calc(1.125 / 0.813)`,"text-sm":`calc(var(--font-size) * 0.875)`,"text-sm--line-height":`calc(1.25 / 0.875)`,"text-2sm":`calc(var(--font-size) * 0.938)`,"text-2sm--line-height":`calc(1.625 / 0.938)`,"text-base":`var(--font-size)`,"text-base--line-height":`calc(1.5 / 1)`,"text-lg":`calc(var(--font-size) * 1.125)`,"text-lg--line-height":`calc(1.75 / 1.125)`,"text-xl":`calc(var(--font-size) * 1.25)`,"text-xl--line-height":`calc(1.75 / 1.25)`,"text-2xl":`calc(var(--font-size) * 1.5)`,"text-2xl--line-height":`calc(2 / 1.5)`,"text-3xl":`calc(var(--font-size) * 1.875)`,"text-3xl--line-height":`calc(2.25 / 1.875)`,"text-4xl":`calc(var(--font-size) * 2.25)`,"text-4xl--line-height":`calc(2.5 / 2.25)`,"text-5xl":`calc(var(--font-size) * 3)`,"text-5xl--line-height":`1`,"text-6xl":`calc(var(--font-size) * 3.75)`,"text-6xl--line-height":`1`,"text-7xl":`calc(var(--font-size) * 4.5)`,"text-7xl--line-height":`1`,"text-8xl":`calc(var(--font-size) * 6)`,"text-8xl--line-height":`1`,"text-9xl":`calc(var(--font-size) * 8)`,"text-9xl--line-height":`1`,spacing:`var(--spacing)`,"focus-size":`calc(var(--focus-size))`,"focus-offset":`var(--focus-offset)`,"color-destructive":`var(--danger)`},light:{spacing:`0.25rem`,radius:`0.65rem`,"font-size":`1rem`,background:`oklch(1 0 0)`,"scrollbar-thumb":`oklch(0.922 0 0)`,foreground:`oklch(0.145 0 0)`,card:`oklch(1 0 0)`,"card-foreground":`oklch(0.145 0 0)`,popover:`oklch(1 0 0)`,"popover-foreground":`oklch(0.145 0 0)`,muted:`oklch(0.97 0 0)`,"muted-foreground":`oklch(0.556 0 0)`,accent:`oklch(0.97 0 0)`,"accent-foreground":`oklch(0.205 0 0)`,border:`oklch(0.922 0 0)`,input:`oklch(0.922 0 0)`,ring:`oklch(0.708 0 0)`,"chart-1":`oklch(0.646 0.222 41.116)`,"chart-2":`oklch(0.6 0.118 184.704)`,"chart-3":`oklch(0.398 0.07 227.392)`,"chart-4":`oklch(0.828 0.189 84.429)`,"chart-5":`oklch(0.769 0.188 70.08)`,sidebar:`oklch(0.985 0 0)`,"sidebar-foreground":`oklch(0.145 0 0)`,"sidebar-primary":`oklch(0.205 0 0)`,"sidebar-primary-foreground":`oklch(0.985 0 0)`,"sidebar-accent":`oklch(0.97 0 0)`,"sidebar-accent-foreground":`oklch(0.205 0 0)`,"sidebar-border":`oklch(0.922 0 0)`,"sidebar-ring":`oklch(0.708 0 0)`,primary:`oklch(70% 0.1435 227.76)`,"primary-foreground":`oklch(0.985 0 0)`,secondary:`oklch(0.97 0 0)`,"secondary-foreground":`oklch(0.205 0 0)`,danger:`oklch(0.577 0.245 27.325)`,"danger-foreground":`oklch(0.985 0 0)`,success:`oklch(0.728 0.125 139.6)`,"success-foreground":`oklch(0.985 0 0)`,warning:`oklch(0.784 0.181 44.7)`,"warning-foreground":`oklch(0.985 0 0)`,inverted:`oklch(0.205 0 0)`,"inverted-foreground":`oklch(0.97 0 0)`,focus:`oklch(0.7 0.181 44.7)`,"focus-size":`2.5px`,"focus-offset":`2px`,table:`oklch(0.94 0 0 / 65%)`,"table-content":`oklch(1 0 0)`,"table-hover":`oklch(0.98 0 0 / 10%)`},dark:{background:`oklch(0.145 0 0)`,"scrollbar-thumb":`oklch(0.269 0 0)`,foreground:`oklch(0.985 0 0)`,card:`oklch(0.205 0 0)`,"card-foreground":`oklch(0.985 0 0)`,popover:`oklch(0.205 0 0)`,"popover-foreground":`oklch(0.985 0 0)`,secondary:`oklch(0.269 0 0)`,"secondary-foreground":`oklch(0.985 0 0)`,muted:`oklch(0.269 0 0)`,"muted-foreground":`oklch(0.708 0 0)`,accent:`oklch(0.269 0 0)`,"accent-foreground":`oklch(0.985 0 0)`,border:`oklch(1 0 0 / 10%)`,input:`oklch(1 0 0 / 15%)`,ring:`oklch(0.556 0 0)`,"chart-1":`oklch(0.488 0.243 264.376)`,"chart-2":`oklch(0.696 0.17 162.48)`,"chart-3":`oklch(0.769 0.188 70.08)`,"chart-4":`oklch(0.627 0.265 303.9)`,"chart-5":`oklch(0.645 0.246 16.439)`,sidebar:`oklch(0.205 0 0)`,"sidebar-foreground":`oklch(0.985 0 0)`,"sidebar-primary":`oklch(0.488 0.243 264.376)`,"sidebar-primary-foreground":`oklch(0.985 0 0)`,"sidebar-accent":`oklch(0.269 0 0)`,"sidebar-accent-foreground":`oklch(0.985 0 0)`,"sidebar-border":`oklch(1 0 0 / 10%)`,"sidebar-ring":`oklch(0.556 0 0)`,primary:`oklch(66% 0.1435 227.76)`,"primary-foreground":`oklch(0.985 0 0)`,danger:`oklch(0.704 0.191 22.216)`,"danger-foreground":`oklch(0.985 0 0)`,success:`oklch(0.728 0.125 139.6)`,"success-foreground":`oklch(0.985 0 0)`,warning:`oklch(0.784 0.181 44.7)`,"warning-foreground":`oklch(0.985 0 0)`,inverted:`oklch(0.922 0 0)`,"inverted-foreground":`oklch(0.205 0 0)`,focus:`oklch(0.7 0.181 44.7)`,table:`oklch(0.265 0 0)`,"table-content":`oklch(0.205 0 0)`,"table-hover":`oklch(0.22 0 0)`}};function f(e){return/^(?:font|text)-/.test(e)}const p={utility:`utility`,variant:`custom-variant`};function m(e){return e.params.trim().split(/[\s({]/)[0]??``}function h(e){let t=u.parse(e),n={},r={};return t.each(e=>{if(e.type!==`atrule`)return;let t=m(e);e.name===p.utility?n[t]=S(e):e.name===p.variant&&t!==`dark`&&(r[t]=S(e))}),{utilities:n,variants:r}}async function g(e,t,n={}){let r=u.parse(e),i=[],a=[];for(let e of[`variant`,`utility`]){let o=e===`utility`?`utilities`:`variants`,s=t[o]??{},c=n.base?.[o]??{},l=/* @__PURE__ */ new Set([...Object.keys(s),...Object.keys(c)]);for(let t of l){let l=s[t],u=c[t],d=y(r,e,t),f=`${o===`utilities`?`@utility`:`@custom-variant`} ${t}`,p=await v({local:d&&S(d),remote:l,base:u,options:n,kind:e,name:t,label:f,warnings:a,add:t=>b(r,e,t),replace:e=>{let t=x(e);t.raws.before=d?.raws.before??``,d?.replaceWith(t)},remove:()=>d?.remove()});p&&i.push({kind:e,name:t,action:p})}}return{css:r.toString(),changes:i,warnings:a}}async function _(e,t={},n={}){let r=u.parse(e),i=[],a=[],o=n.base?.base??{},s=/* @__PURE__ */ new Set([...Object.keys(t),...Object.keys(o)]);for(let e of s){let s=t[e]??{},c=o[e]??{},l=/* @__PURE__ */ new Set([...Object.keys(s),...Object.keys(c)]);for(let t of l){let o=C(r),l=o&&w(o,e),d=l?.nodes.find(e=>e.type===`decl`&&e.prop===t),f=`${e} { ${t} }`,p=await v({local:d?.value,remote:s[t],base:c[t],options:n,kind:`base`,name:f,label:`${t} in ${e}`,warnings:a,add:n=>{l??=T(r,e),l.append(u.decl({prop:t,value:n,raws:{before:`
|
|
1
|
+
import{THEME_ATTRIBUTE as e,THEME_ENV as t,isThemeName as n,themeAttribute as r,themeSelector as i}from"./attribute.mjs";import{d as a,l as o,r as s,t as c,u as l}from"./theme-files-a8APQNco.mjs";import u from"postcss";const d={theme:{"font-sans":`var(--font-sans)`,"font-heading":`var(--font-heading)`,"font-mono":`var(--font-mono)`,"radius-sm":`calc(var(--radius) * 0.6)`,"radius-md":`calc(var(--radius) * 0.8)`,"radius-lg":`var(--radius)`,"radius-xl":`calc(var(--radius) * 1.4)`,"radius-2xl":`calc(var(--radius) * 1.8)`,"radius-3xl":`calc(var(--radius) * 2.2)`,"radius-4xl":`calc(var(--radius) * 2.6)`,"breakpoint-3xl":`1600px`,"breakpoint-4xl":`2000px`,"text-xxs":`calc(var(--font-size) * 0.625)`,"text-2xxs":`calc(var(--font-size) * 0.688)`,"text-xs":`calc(var(--font-size) * 0.75)`,"text-xs--line-height":`calc(1 / 0.75)`,"text-2xs":`calc(var(--font-size) * 0.813)`,"text-2xs--line-height":`calc(1.125 / 0.813)`,"text-sm":`calc(var(--font-size) * 0.875)`,"text-sm--line-height":`calc(1.25 / 0.875)`,"text-2sm":`calc(var(--font-size) * 0.938)`,"text-2sm--line-height":`calc(1.625 / 0.938)`,"text-base":`var(--font-size)`,"text-base--line-height":`calc(1.5 / 1)`,"text-lg":`calc(var(--font-size) * 1.125)`,"text-lg--line-height":`calc(1.75 / 1.125)`,"text-xl":`calc(var(--font-size) * 1.25)`,"text-xl--line-height":`calc(1.75 / 1.25)`,"text-2xl":`calc(var(--font-size) * 1.5)`,"text-2xl--line-height":`calc(2 / 1.5)`,"text-3xl":`calc(var(--font-size) * 1.875)`,"text-3xl--line-height":`calc(2.25 / 1.875)`,"text-4xl":`calc(var(--font-size) * 2.25)`,"text-4xl--line-height":`calc(2.5 / 2.25)`,"text-5xl":`calc(var(--font-size) * 3)`,"text-5xl--line-height":`1`,"text-6xl":`calc(var(--font-size) * 3.75)`,"text-6xl--line-height":`1`,"text-7xl":`calc(var(--font-size) * 4.5)`,"text-7xl--line-height":`1`,"text-8xl":`calc(var(--font-size) * 6)`,"text-8xl--line-height":`1`,"text-9xl":`calc(var(--font-size) * 8)`,"text-9xl--line-height":`1`,spacing:`var(--spacing)`,"focus-size":`calc(var(--focus-size))`,"focus-offset":`var(--focus-offset)`,"color-destructive":`var(--danger)`},light:{spacing:`0.25rem`,radius:`0.65rem`,"font-size":`1rem`,background:`oklch(1 0 0)`,"scrollbar-thumb":`oklch(0.922 0 0)`,foreground:`oklch(0.145 0 0)`,card:`oklch(1 0 0)`,"card-foreground":`oklch(0.145 0 0)`,popover:`oklch(1 0 0)`,"popover-foreground":`oklch(0.145 0 0)`,muted:`oklch(0.97 0 0)`,"muted-foreground":`oklch(0.556 0 0)`,accent:`oklch(0.97 0 0)`,"accent-foreground":`oklch(0.205 0 0)`,border:`oklch(0.922 0 0)`,input:`oklch(0.922 0 0)`,ring:`oklch(0.708 0 0)`,"chart-1":`oklch(0.646 0.222 41.116)`,"chart-2":`oklch(0.6 0.118 184.704)`,"chart-3":`oklch(0.398 0.07 227.392)`,"chart-4":`oklch(0.828 0.189 84.429)`,"chart-5":`oklch(0.769 0.188 70.08)`,sidebar:`oklch(0.985 0 0)`,"sidebar-foreground":`oklch(0.145 0 0)`,"sidebar-primary":`oklch(0.205 0 0)`,"sidebar-primary-foreground":`oklch(0.985 0 0)`,"sidebar-accent":`oklch(0.97 0 0)`,"sidebar-accent-foreground":`oklch(0.205 0 0)`,"sidebar-border":`oklch(0.922 0 0)`,"sidebar-ring":`oklch(0.708 0 0)`,brand:`oklch(70% 0.1435 227.76)`,"brand-foreground":`oklch(0.985 0 0)`,primary:`oklch(70% 0.1435 227.76)`,"primary-foreground":`oklch(0.985 0 0)`,secondary:`oklch(0.97 0 0)`,"secondary-foreground":`oklch(0.205 0 0)`,danger:`oklch(0.577 0.245 27.325)`,"danger-foreground":`oklch(0.985 0 0)`,success:`oklch(0.728 0.125 139.6)`,"success-foreground":`oklch(0.985 0 0)`,warning:`oklch(0.784 0.181 44.7)`,"warning-foreground":`oklch(0.985 0 0)`,inverted:`oklch(0.205 0 0)`,"inverted-foreground":`oklch(0.97 0 0)`,focus:`oklch(0.7 0.181 44.7)`,"focus-size":`2.5px`,"focus-offset":`2px`,table:`oklch(0.94 0 0 / 65%)`,"table-content":`oklch(1 0 0)`,"table-hover":`oklch(0.98 0 0 / 10%)`},dark:{background:`oklch(0.145 0 0)`,"scrollbar-thumb":`oklch(0.269 0 0)`,foreground:`oklch(0.985 0 0)`,card:`oklch(0.205 0 0)`,"card-foreground":`oklch(0.985 0 0)`,popover:`oklch(0.205 0 0)`,"popover-foreground":`oklch(0.985 0 0)`,secondary:`oklch(0.269 0 0)`,"secondary-foreground":`oklch(0.985 0 0)`,muted:`oklch(0.269 0 0)`,"muted-foreground":`oklch(0.708 0 0)`,accent:`oklch(0.269 0 0)`,"accent-foreground":`oklch(0.985 0 0)`,border:`oklch(1 0 0 / 10%)`,input:`oklch(1 0 0 / 15%)`,ring:`oklch(0.556 0 0)`,"chart-1":`oklch(0.488 0.243 264.376)`,"chart-2":`oklch(0.696 0.17 162.48)`,"chart-3":`oklch(0.769 0.188 70.08)`,"chart-4":`oklch(0.627 0.265 303.9)`,"chart-5":`oklch(0.645 0.246 16.439)`,sidebar:`oklch(0.205 0 0)`,"sidebar-foreground":`oklch(0.985 0 0)`,"sidebar-primary":`oklch(0.488 0.243 264.376)`,"sidebar-primary-foreground":`oklch(0.985 0 0)`,"sidebar-accent":`oklch(0.269 0 0)`,"sidebar-accent-foreground":`oklch(0.985 0 0)`,"sidebar-border":`oklch(1 0 0 / 10%)`,"sidebar-ring":`oklch(0.556 0 0)`,brand:`oklch(66% 0.1435 227.76)`,"brand-foreground":`oklch(0.985 0 0)`,primary:`oklch(66% 0.1435 227.76)`,"primary-foreground":`oklch(0.985 0 0)`,danger:`oklch(0.704 0.191 22.216)`,"danger-foreground":`oklch(0.985 0 0)`,success:`oklch(0.728 0.125 139.6)`,"success-foreground":`oklch(0.985 0 0)`,warning:`oklch(0.784 0.181 44.7)`,"warning-foreground":`oklch(0.985 0 0)`,inverted:`oklch(0.922 0 0)`,"inverted-foreground":`oklch(0.205 0 0)`,focus:`oklch(0.7 0.181 44.7)`,table:`oklch(0.265 0 0)`,"table-content":`oklch(0.205 0 0)`,"table-hover":`oklch(0.22 0 0)`}};function f(e){return/^(?:font|text)-/.test(e)}const p={utility:`utility`,variant:`custom-variant`};function m(e){return e.params.trim().split(/[\s({]/)[0]??``}function h(e){let t=u.parse(e),n={},r={};return t.each(e=>{if(e.type!==`atrule`)return;let t=m(e);e.name===p.utility?n[t]=S(e):e.name===p.variant&&t!==`dark`&&(r[t]=S(e))}),{utilities:n,variants:r}}async function g(e,t,n={}){let r=u.parse(e),i=[],a=[];for(let e of[`variant`,`utility`]){let o=e===`utility`?`utilities`:`variants`,s=t[o]??{},c=n.base?.[o]??{},l=/* @__PURE__ */ new Set([...Object.keys(s),...Object.keys(c)]);for(let t of l){let l=s[t],u=c[t],d=y(r,e,t),f=`${o===`utilities`?`@utility`:`@custom-variant`} ${t}`,p=await v({local:d&&S(d),remote:l,base:u,options:n,kind:e,name:t,label:f,warnings:a,add:t=>b(r,e,t),replace:e=>{let t=x(e);t.raws.before=d?.raws.before??``,d?.replaceWith(t)},remove:()=>d?.remove()});p&&i.push({kind:e,name:t,action:p})}}return{css:r.toString(),changes:i,warnings:a}}async function _(e,t={},n={}){let r=u.parse(e),i=[],a=[],o=n.base?.base??{},s=/* @__PURE__ */ new Set([...Object.keys(t),...Object.keys(o)]);for(let e of s){let s=t[e]??{},c=o[e]??{},l=/* @__PURE__ */ new Set([...Object.keys(s),...Object.keys(c)]);for(let t of l){let o=C(r),l=o&&w(o,e),d=l?.nodes.find(e=>e.type===`decl`&&e.prop===t),f=`${e} { ${t} }`,p=await v({local:d?.value,remote:s[t],base:c[t],options:n,kind:`base`,name:f,label:`${t} in ${e}`,warnings:a,add:n=>{l??=T(r,e),l.append(u.decl({prop:t,value:n,raws:{before:`
|
|
2
2
|
`}}))},replace:e=>{d&&(d.value=e)},remove:()=>{d?.remove(),l?.nodes.length===0&&l.remove()}});p&&i.push({kind:`base`,name:f,action:p})}}return{css:r.toString(),changes:i,warnings:a}}async function v({local:e,remote:t,base:n,options:r,kind:i,name:a,label:o,warnings:s,add:c,replace:l,remove:u}){return t===void 0?e===void 0?void 0:r.shouldRemove&&await r.shouldRemove(i,a)?(u(),`removed`):(s.push(`${o} was removed in the new version; kept in the CSS.`),`kept`):e===void 0?n===void 0?(c(t),`added`):`kept`:D(e,t)?`unchanged`:r.overwrite||n!==void 0&&D(e,n)?(l(t),`updated`):(s.push(`${o} was changed in the CSS; kept instead of the new one.`),`kept`)}function y(e,t,n){return e.nodes.find(e=>e.type===`atrule`&&e.name===p[t]&&m(e)===n)}function b(e,t,n){let r=x(n),i=e.nodes.findLast(e=>e.type===`atrule`&&e.name===p.variant);if(t===`variant`){let t=e.nodes.find(e=>e.type===`atrule`&&e.name===p.utility);if(i){r.raws.before=`
|
|
3
3
|
`,i.after(r);return}if(t){r.raws.before=t.raws.before??``,t.raws.before=`
|
|
4
4
|
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["withColorMappings","applyCssVars","localImports","addImport","findBlock","postcss","defaultTheme","isTypographyToken","name","AT_RULE","ruleName","rule","readCssRules","root","css","utilities","variants","node","ruleSource","applyCssRules","changes","warnings","kind","field","remoteRules","remote","baseRules","options","names","remoteSource","baseSource","local","findRule","label","result","merge","appendRule","source","next","parseRule","applyBaseRules","previous","selectors","selector","remoteDecls","baseDecls","props","prop","layer","findBaseLayer","findRuleBySelector","declaration","appendBaseRule","value","remove","base","add","same","replace","lastVariant","firstUtility","clone","normalizeSelector","normalize","a","b","ThemeValidationError","issues","group","message","NAME","SAFE_CHARS","COLOR_FUNCTIONS","MATH_FUNCTIONS","HEX","NUMBER","LENGTH","KEYWORD","FUNCTION","isSafeValue","depth","char","fn","getValueKind","trimmed","accepts","actual","expected","validateTheme","tokens","issue","reference","expectedKind","actualKind","GROUPS","readTheme","vars","theme","derived","writeTheme","COLOR_UTILITY","RADIUS_UTILITY","SPACING_UTILITY","SPACING_FUNCTION","CSS_VAR","tokenCatalog","itemVars","colors","target","findTokens","found","content","contents","token","catalog","THEME_ATTRIBUTE","THEME_ENV","isThemeName","themeAttribute","themeSelector"],"sources":["../src/default-theme.ts","../src/rules.ts","../src/validate.ts","../src/theme.ts","../src/tokens.ts"],"sourcesContent":["import type { ThemeTokens } from \"./types\"\n\n// Tema padrão da SlabUI. Os `--color-<nome>: var(--<nome>)` do `@theme inline`\n// não ficam aqui: saem das cores de `light` e `dark` na gravação.\nexport const defaultTheme = {\n theme: {\n \"font-sans\": \"var(--font-sans)\",\n \"font-heading\": \"var(--font-heading)\",\n \"font-mono\": \"var(--font-mono)\",\n\n \"radius-sm\": \"calc(var(--radius) * 0.6)\",\n \"radius-md\": \"calc(var(--radius) * 0.8)\",\n \"radius-lg\": \"var(--radius)\",\n \"radius-xl\": \"calc(var(--radius) * 1.4)\",\n \"radius-2xl\": \"calc(var(--radius) * 1.8)\",\n \"radius-3xl\": \"calc(var(--radius) * 2.2)\",\n \"radius-4xl\": \"calc(var(--radius) * 2.6)\",\n\n \"breakpoint-3xl\": \"1600px\",\n \"breakpoint-4xl\": \"2000px\",\n\n // Tamanhos de texto proporcionais ao `--font-size` (o `text-base`): mudar\n // ele muda todas as classes `text-*`. A altura de linha de cada tamanho é\n // uma proporção sem unidade, então acompanha sozinha.\n \"text-xxs\": \"calc(var(--font-size) * 0.625)\",\n \"text-2xxs\": \"calc(var(--font-size) * 0.688)\",\n \"text-xs\": \"calc(var(--font-size) * 0.75)\",\n \"text-xs--line-height\": \"calc(1 / 0.75)\",\n \"text-2xs\": \"calc(var(--font-size) * 0.813)\",\n \"text-2xs--line-height\": \"calc(1.125 / 0.813)\",\n \"text-sm\": \"calc(var(--font-size) * 0.875)\",\n \"text-sm--line-height\": \"calc(1.25 / 0.875)\",\n \"text-2sm\": \"calc(var(--font-size) * 0.938)\",\n \"text-2sm--line-height\": \"calc(1.625 / 0.938)\",\n \"text-base\": \"var(--font-size)\",\n \"text-base--line-height\": \"calc(1.5 / 1)\",\n \"text-lg\": \"calc(var(--font-size) * 1.125)\",\n \"text-lg--line-height\": \"calc(1.75 / 1.125)\",\n \"text-xl\": \"calc(var(--font-size) * 1.25)\",\n \"text-xl--line-height\": \"calc(1.75 / 1.25)\",\n \"text-2xl\": \"calc(var(--font-size) * 1.5)\",\n \"text-2xl--line-height\": \"calc(2 / 1.5)\",\n \"text-3xl\": \"calc(var(--font-size) * 1.875)\",\n \"text-3xl--line-height\": \"calc(2.25 / 1.875)\",\n \"text-4xl\": \"calc(var(--font-size) * 2.25)\",\n \"text-4xl--line-height\": \"calc(2.5 / 2.25)\",\n \"text-5xl\": \"calc(var(--font-size) * 3)\",\n \"text-5xl--line-height\": \"1\",\n \"text-6xl\": \"calc(var(--font-size) * 3.75)\",\n \"text-6xl--line-height\": \"1\",\n \"text-7xl\": \"calc(var(--font-size) * 4.5)\",\n \"text-7xl--line-height\": \"1\",\n \"text-8xl\": \"calc(var(--font-size) * 6)\",\n \"text-8xl--line-height\": \"1\",\n \"text-9xl\": \"calc(var(--font-size) * 8)\",\n \"text-9xl--line-height\": \"1\",\n\n spacing: \"var(--spacing)\",\n\n \"focus-size\": \"calc(var(--focus-size))\",\n \"focus-offset\": \"var(--focus-offset)\",\n\n // `destructive` (estados inválidos dos componentes) é a cor `danger`.\n \"color-destructive\": \"var(--danger)\",\n },\n light: {\n spacing: \"0.25rem\",\n radius: \"0.65rem\",\n // Tamanho base do texto. Em `rem`, respeita o tamanho de fonte do\n // navegador; o usuário pode aumentar ou diminuir em produção.\n \"font-size\": \"1rem\",\n background: \"oklch(1 0 0)\",\n // Cor da barra de rolagem (base.css).\n \"scrollbar-thumb\": \"oklch(0.922 0 0)\",\n foreground: \"oklch(0.145 0 0)\",\n card: \"oklch(1 0 0)\",\n \"card-foreground\": \"oklch(0.145 0 0)\",\n popover: \"oklch(1 0 0)\",\n \"popover-foreground\": \"oklch(0.145 0 0)\",\n muted: \"oklch(0.97 0 0)\",\n \"muted-foreground\": \"oklch(0.556 0 0)\",\n accent: \"oklch(0.97 0 0)\",\n \"accent-foreground\": \"oklch(0.205 0 0)\",\n border: \"oklch(0.922 0 0)\",\n input: \"oklch(0.922 0 0)\",\n ring: \"oklch(0.708 0 0)\",\n \"chart-1\": \"oklch(0.646 0.222 41.116)\",\n \"chart-2\": \"oklch(0.6 0.118 184.704)\",\n \"chart-3\": \"oklch(0.398 0.07 227.392)\",\n \"chart-4\": \"oklch(0.828 0.189 84.429)\",\n \"chart-5\": \"oklch(0.769 0.188 70.08)\",\n sidebar: \"oklch(0.985 0 0)\",\n \"sidebar-foreground\": \"oklch(0.145 0 0)\",\n \"sidebar-primary\": \"oklch(0.205 0 0)\",\n \"sidebar-primary-foreground\": \"oklch(0.985 0 0)\",\n \"sidebar-accent\": \"oklch(0.97 0 0)\",\n \"sidebar-accent-foreground\": \"oklch(0.205 0 0)\",\n \"sidebar-border\": \"oklch(0.922 0 0)\",\n \"sidebar-ring\": \"oklch(0.708 0 0)\",\n\n primary: \"oklch(70% 0.1435 227.76)\",\n \"primary-foreground\": \"oklch(0.985 0 0)\",\n secondary: \"oklch(0.97 0 0)\",\n \"secondary-foreground\": \"oklch(0.205 0 0)\",\n danger: \"oklch(0.577 0.245 27.325)\",\n \"danger-foreground\": \"oklch(0.985 0 0)\",\n success: \"oklch(0.728 0.125 139.6)\",\n \"success-foreground\": \"oklch(0.985 0 0)\",\n warning: \"oklch(0.784 0.181 44.7)\",\n \"warning-foreground\": \"oklch(0.985 0 0)\",\n inverted: \"oklch(0.205 0 0)\",\n \"inverted-foreground\": \"oklch(0.97 0 0)\",\n\n focus: \"oklch(0.7 0.181 44.7)\",\n \"focus-size\": \"2.5px\",\n \"focus-offset\": \"2px\",\n\n table: \"oklch(0.94 0 0 / 65%)\",\n \"table-content\": \"oklch(1 0 0)\",\n \"table-hover\": \"oklch(0.98 0 0 / 10%)\",\n },\n dark: {\n background: \"oklch(0.145 0 0)\",\n \"scrollbar-thumb\": \"oklch(0.269 0 0)\",\n foreground: \"oklch(0.985 0 0)\",\n card: \"oklch(0.205 0 0)\",\n \"card-foreground\": \"oklch(0.985 0 0)\",\n popover: \"oklch(0.205 0 0)\",\n \"popover-foreground\": \"oklch(0.985 0 0)\",\n secondary: \"oklch(0.269 0 0)\",\n \"secondary-foreground\": \"oklch(0.985 0 0)\",\n muted: \"oklch(0.269 0 0)\",\n \"muted-foreground\": \"oklch(0.708 0 0)\",\n accent: \"oklch(0.269 0 0)\",\n \"accent-foreground\": \"oklch(0.985 0 0)\",\n border: \"oklch(1 0 0 / 10%)\",\n input: \"oklch(1 0 0 / 15%)\",\n ring: \"oklch(0.556 0 0)\",\n \"chart-1\": \"oklch(0.488 0.243 264.376)\",\n \"chart-2\": \"oklch(0.696 0.17 162.48)\",\n \"chart-3\": \"oklch(0.769 0.188 70.08)\",\n \"chart-4\": \"oklch(0.627 0.265 303.9)\",\n \"chart-5\": \"oklch(0.645 0.246 16.439)\",\n sidebar: \"oklch(0.205 0 0)\",\n \"sidebar-foreground\": \"oklch(0.985 0 0)\",\n \"sidebar-primary\": \"oklch(0.488 0.243 264.376)\",\n \"sidebar-primary-foreground\": \"oklch(0.985 0 0)\",\n \"sidebar-accent\": \"oklch(0.269 0 0)\",\n \"sidebar-accent-foreground\": \"oklch(0.985 0 0)\",\n \"sidebar-border\": \"oklch(1 0 0 / 10%)\",\n \"sidebar-ring\": \"oklch(0.556 0 0)\",\n\n primary: \"oklch(66% 0.1435 227.76)\",\n \"primary-foreground\": \"oklch(0.985 0 0)\",\n danger: \"oklch(0.704 0.191 22.216)\",\n \"danger-foreground\": \"oklch(0.985 0 0)\",\n success: \"oklch(0.728 0.125 139.6)\",\n \"success-foreground\": \"oklch(0.985 0 0)\",\n warning: \"oklch(0.784 0.181 44.7)\",\n \"warning-foreground\": \"oklch(0.985 0 0)\",\n inverted: \"oklch(0.922 0 0)\",\n \"inverted-foreground\": \"oklch(0.205 0 0)\",\n\n focus: \"oklch(0.7 0.181 44.7)\",\n\n table: \"oklch(0.265 0 0)\",\n \"table-content\": \"oklch(0.205 0 0)\",\n \"table-hover\": \"oklch(0.22 0 0)\",\n },\n} satisfies ThemeTokens\n\n// Entradas de tipografia do `@theme inline` (famílias `--font-*` e a escala\n// `--text-*`): no projeto, ficam no `fonts.css`, ao lado do CSS global.\nexport function isTypographyToken(name: string): boolean {\n return /^(?:font|text)-/.test(name)\n}\n","import postcss, {\n type AtRule,\n type Container,\n type Root,\n type Rule,\n} from \"postcss\"\n\n// Regras de CSS que os itens trazem além das variáveis do tema:\n//\n// - `utilities` e `variants`: `@utility <nome>` e `@custom-variant <nome>`,\n// com o texto completo da regra, no `utilities.css`. O merge é pelo nome.\n// - `base`: declarações em seletores de elemento (`body`, `html`, `*`…),\n// dentro do `@layer base` do `base.css`. O merge é por seletor e\n// propriedade.\n//\n// As regras de merge são as mesmas das variáveis: o que falta é adicionado, o\n// que o usuário mudou fica, e no update o que não foi mexido acompanha a\n// versão nova.\nexport type CssRules = {\n utilities?: Record<string, string>\n variants?: Record<string, string>\n base?: Record<string, Record<string, string>>\n}\n\nexport type CssRuleKind = \"utility\" | \"variant\" | \"base\"\n\nexport type CssRuleChange = {\n kind: CssRuleKind\n // Nome da utility ou da variante; na base, `<seletor> { <propriedade> }`.\n name: string\n action: \"added\" | \"updated\" | \"kept\" | \"removed\" | \"unchanged\"\n}\n\nexport type CssRulesResult = {\n css: string\n changes: CssRuleChange[]\n warnings: string[]\n}\n\nexport type ApplyCssRulesOptions = {\n // Regras da versão instalada (no update); ausente no add.\n base?: CssRules\n overwrite?: boolean\n // Regra removida na versão nova: remover? Ausente = manter.\n shouldRemove?: (kind: CssRuleKind, name: string) => Promise<boolean>\n}\n\nconst AT_RULE = { utility: \"utility\", variant: \"custom-variant\" } as const\n\n// Nome de uma `@utility`/`@custom-variant` pelo começo dos parâmetros\n// (`no-scrollbar`, `fixed (&:is(.layout-fixed *))`).\nexport function ruleName(rule: AtRule): string {\n return rule.params.trim().split(/[\\s({]/)[0] ?? \"\"\n}\n\n// As `@utility` e `@custom-variant` de um CSS, pelo nome, com o texto de cada\n// uma. A variante `dark` fica de fora: é do tema, e o CSS global cuida dela.\nexport function readCssRules(\n css: string,\n): Required<Pick<CssRules, \"utilities\" | \"variants\">> {\n const root = postcss.parse(css)\n const utilities: Record<string, string> = {}\n const variants: Record<string, string> = {}\n root.each((node) => {\n if (node.type !== \"atrule\") {\n return\n }\n const name = ruleName(node)\n if (node.name === AT_RULE.utility) {\n utilities[name] = ruleSource(node)\n } else if (node.name === AT_RULE.variant && name !== \"dark\") {\n variants[name] = ruleSource(node)\n }\n })\n return { utilities, variants }\n}\n\n// Aplica as `@utility` e `@custom-variant` de um item, com merge pelo nome.\nexport async function applyCssRules(\n css: string,\n remote: Pick<CssRules, \"utilities\" | \"variants\">,\n options: ApplyCssRulesOptions = {},\n): Promise<CssRulesResult> {\n const root = postcss.parse(css)\n const changes: CssRuleChange[] = []\n const warnings: string[] = []\n\n for (const kind of [\"variant\", \"utility\"] as const) {\n const field = kind === \"utility\" ? \"utilities\" : \"variants\"\n const remoteRules = remote[field] ?? {}\n const baseRules = options.base?.[field] ?? {}\n const names = new Set([\n ...Object.keys(remoteRules),\n ...Object.keys(baseRules),\n ])\n\n for (const name of names) {\n const remoteSource = remoteRules[name]\n const baseSource = baseRules[name]\n const local = findRule(root, kind, name)\n const label = `${field === \"utilities\" ? \"@utility\" : \"@custom-variant\"} ${name}`\n\n const result = await merge({\n local: local && ruleSource(local),\n remote: remoteSource,\n base: baseSource,\n options,\n kind,\n name,\n label,\n warnings,\n add: (source) => appendRule(root, kind, source),\n replace: (source) => {\n const next = parseRule(source)\n next.raws.before = local?.raws.before ?? \"\"\n local?.replaceWith(next)\n },\n remove: () => local?.remove(),\n })\n if (result) {\n changes.push({ kind, name, action: result })\n }\n }\n }\n\n return { css: root.toString(), changes, warnings }\n}\n\n// Aplica as declarações de base de um item no `@layer base`, com merge por\n// seletor e propriedade.\nexport async function applyBaseRules(\n css: string,\n remote: CssRules[\"base\"] = {},\n options: ApplyCssRulesOptions = {},\n): Promise<CssRulesResult> {\n const root = postcss.parse(css)\n const changes: CssRuleChange[] = []\n const warnings: string[] = []\n const previous = options.base?.base ?? {}\n\n const selectors = new Set([...Object.keys(remote), ...Object.keys(previous)])\n for (const selector of selectors) {\n const remoteDecls = remote[selector] ?? {}\n const baseDecls = previous[selector] ?? {}\n const props = new Set([\n ...Object.keys(remoteDecls),\n ...Object.keys(baseDecls),\n ])\n\n for (const prop of props) {\n const layer = findBaseLayer(root)\n let rule = layer && findRuleBySelector(layer, selector)\n const declaration = rule?.nodes.find(\n (node) => node.type === \"decl\" && node.prop === prop,\n ) as postcss.Declaration | undefined\n const name = `${selector} { ${prop} }`\n\n const result = await merge({\n local: declaration?.value,\n remote: remoteDecls[prop],\n base: baseDecls[prop],\n options,\n kind: \"base\",\n name,\n label: `${prop} in ${selector}`,\n warnings,\n add: (value) => {\n rule ??= appendBaseRule(root, selector)\n rule.append(postcss.decl({ prop, value, raws: { before: \"\\n \" } }))\n },\n replace: (value) => {\n if (declaration) {\n declaration.value = value\n }\n },\n remove: () => {\n declaration?.remove()\n if (rule?.nodes.length === 0) {\n rule.remove()\n }\n },\n })\n if (result) {\n changes.push({ kind: \"base\", name, action: result })\n }\n }\n }\n\n return { css: root.toString(), changes, warnings }\n}\n\n// Mesmas regras do merge das variáveis (`applyCssVars`).\nasync function merge({\n local,\n remote,\n base,\n options,\n kind,\n name,\n label,\n warnings,\n add,\n replace,\n remove,\n}: {\n local: string | undefined\n remote: string | undefined\n base: string | undefined\n options: ApplyCssRulesOptions\n kind: CssRuleKind\n name: string\n label: string\n warnings: string[]\n add: (value: string) => void\n replace: (value: string) => void\n remove: () => void\n}): Promise<CssRuleChange[\"action\"] | undefined> {\n if (remote === undefined) {\n // Removida na versão nova.\n if (local === undefined) {\n return undefined\n }\n if (options.shouldRemove && (await options.shouldRemove(kind, name))) {\n remove()\n return \"removed\"\n }\n warnings.push(`${label} was removed in the new version; kept in the CSS.`)\n return \"kept\"\n }\n\n if (local === undefined) {\n if (base !== undefined) {\n // Apagada pelo usuário: não recria.\n return \"kept\"\n }\n add(remote)\n return \"added\"\n }\n\n if (same(local, remote)) {\n return \"unchanged\"\n }\n if (options.overwrite || (base !== undefined && same(local, base))) {\n replace(remote)\n return \"updated\"\n }\n warnings.push(`${label} was changed in the CSS; kept instead of the new one.`)\n return \"kept\"\n}\n\nfunction findRule(\n root: Root,\n kind: \"utility\" | \"variant\",\n name: string,\n): AtRule | undefined {\n return root.nodes.find(\n (node): node is AtRule =>\n node.type === \"atrule\" &&\n node.name === AT_RULE[kind] &&\n ruleName(node) === name,\n )\n}\n\n// Variantes antes das utilities: uma utility pode usar uma variante.\nfunction appendRule(root: Root, kind: \"utility\" | \"variant\", source: string) {\n const rule = parseRule(source)\n const lastVariant = root.nodes.findLast(\n (node) => node.type === \"atrule\" && node.name === AT_RULE.variant,\n )\n if (kind === \"variant\") {\n const firstUtility = root.nodes.find(\n (node) => node.type === \"atrule\" && node.name === AT_RULE.utility,\n )\n if (lastVariant) {\n rule.raws.before = \"\\n\"\n lastVariant.after(rule)\n return\n }\n if (firstUtility) {\n rule.raws.before = firstUtility.raws.before ?? \"\"\n firstUtility.raws.before = \"\\n\\n\"\n firstUtility.before(rule)\n return\n }\n }\n rule.raws.before = root.nodes.length > 0 ? \"\\n\\n\" : \"\"\n root.append(rule)\n root.raws.after = \"\\n\"\n}\n\nfunction parseRule(source: string): AtRule {\n const node = postcss.parse(source.trim()).first\n if (node?.type !== \"atrule\") {\n throw new Error(`Not a CSS at-rule: ${source}`)\n }\n return node\n}\n\n// Texto da regra sem os espaços de antes (é o que vai para o item publicado).\nfunction ruleSource(rule: AtRule): string {\n const clone = rule.clone()\n clone.raws.before = \"\"\n // Sem bloco (`@custom-variant x (…);`), o `;` é do pai: vai junto.\n return clone.nodes === undefined ? `${clone.toString()};` : clone.toString()\n}\n\nfunction findBaseLayer(root: Root): Container | undefined {\n return root.nodes.find(\n (node) =>\n node.type === \"atrule\" &&\n node.name === \"layer\" &&\n node.params.trim() === \"base\",\n ) as Container | undefined\n}\n\nfunction findRuleBySelector(\n layer: Container,\n selector: string,\n): Rule | undefined {\n return layer.nodes?.find(\n (node): node is Rule =>\n node.type === \"rule\" &&\n normalizeSelector(node.selector) === normalizeSelector(selector),\n )\n}\n\nfunction appendBaseRule(root: Root, selector: string): Rule {\n let layer = findBaseLayer(root)\n if (layer === undefined) {\n layer = postcss.atRule({ name: \"layer\", params: \"base\" })\n layer.raws = {\n before: root.nodes.length > 0 ? \"\\n\\n\" : \"\",\n between: \" \",\n after: \"\\n\",\n }\n root.append(layer)\n root.raws.after = \"\\n\"\n }\n const rule = postcss.rule({ selector })\n rule.raws = {\n before: (layer.nodes?.length ?? 0) > 0 ? \"\\n\\n \" : \"\\n \",\n between: \" \",\n after: \"\\n \",\n semicolon: true,\n }\n layer.append(rule)\n layer.raws.after = \"\\n\"\n return rule\n}\n\n// Compara seletores sem os espaços (`a > b` = `a>b`) e sem as aspas.\nconst normalizeSelector = (selector: string) => selector.replace(/[\"'\\s]/g, \"\")\n\nfunction same(a: string, b: string) {\n const normalize = (value: string) =>\n value\n .replace(/\\s+/g, \" \")\n .replace(/\\s*([{};:,])\\s*/g, \"$1\")\n .replace(/;}/g, \"}\")\n .replace(/;$/, \"\")\n .trim()\n return normalize(a) === normalize(b)\n}\n","import type { ThemeGroup, ThemeTokens } from \"./types\"\n\nimport { defaultTheme } from \"./default-theme\"\n\nexport type ValueKind = \"color\" | \"length\" | \"number\" | \"keyword\" | \"expression\"\n\nexport type ThemeIssue = {\n group: ThemeGroup\n name: string\n value: string\n message: string\n}\n\nexport class ThemeValidationError extends Error {\n constructor(readonly issues: ThemeIssue[]) {\n super(\n `Invalid theme:\\n${issues\n .map(({ group, name, message }) => ` --${name} (${group}): ${message}`)\n .join(\"\\n\")}`,\n )\n this.name = \"ThemeValidationError\"\n }\n}\n\nconst MAX_LENGTH = 200\n\nconst NAME = /^[\\w-]+$/\n// Só o que um valor de tema usa: sem `;`, `{}`, aspas, `\\`, `@`, `!` ou `:`,\n// que permitiriam fechar o bloco ou injetar outra regra.\nconst SAFE_CHARS = /^[\\w\\s.,%#()+\\-*/]+$/\n\nconst COLOR_FUNCTIONS = new Set([\n \"rgb\",\n \"rgba\",\n \"hsl\",\n \"hsla\",\n \"hwb\",\n \"lab\",\n \"lch\",\n \"oklab\",\n \"oklch\",\n \"color\",\n \"color-mix\",\n])\nconst MATH_FUNCTIONS = new Set([\"calc\", \"min\", \"max\", \"clamp\", \"var\"])\n\nconst HEX = /^#(?:[\\da-f]{3,4}|[\\da-f]{6}|[\\da-f]{8})$/i\nconst NUMBER = /^[+-]?(?:\\d+\\.?\\d*|\\.\\d+)$/\nconst LENGTH =\n /^[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:px|rem|em|%|ch|ex|lh|rlh|vw|vh|vmin|vmax|svh|lvh|dvh|cqw|cqh|pt|pc|in|cm|mm|q|deg|rad|turn|ms|s)$/i\nconst KEYWORD = /^[a-z][a-z-]*$/i\nconst FUNCTION = /^([a-z-]+)\\(/i\n\n// O valor só usa caracteres e funções conhecidos, com parênteses balanceados.\nexport function isSafeValue(value: string): boolean {\n if (value.trim() === \"\" || value.length > MAX_LENGTH) {\n return false\n }\n if (!SAFE_CHARS.test(value)) {\n return false\n }\n let depth = 0\n for (const char of value) {\n depth += char === \"(\" ? 1 : char === \")\" ? -1 : 0\n if (depth < 0) {\n return false\n }\n }\n if (depth !== 0) {\n return false\n }\n for (const [, name] of value.matchAll(/([a-z-]*)\\(/gi)) {\n // Sem nome, é só um agrupamento: `calc((a + b) * 2)`.\n const fn = name.toLowerCase()\n if (fn !== \"\" && !COLOR_FUNCTIONS.has(fn) && !MATH_FUNCTIONS.has(fn)) {\n return false\n }\n }\n return true\n}\n\n// Tipo do valor, para conferir com o do tema padrão. `calc()` e `var()` são\n// \"expression\": aceitos no lugar de qualquer tipo.\nexport function getValueKind(value: string): ValueKind {\n const trimmed = value.trim()\n if (HEX.test(trimmed)) {\n return \"color\"\n }\n if (NUMBER.test(trimmed)) {\n return \"number\"\n }\n if (LENGTH.test(trimmed)) {\n return \"length\"\n }\n if (KEYWORD.test(trimmed)) {\n return \"keyword\"\n }\n const fn = trimmed.match(FUNCTION)?.[1]?.toLowerCase()\n if (fn && COLOR_FUNCTIONS.has(fn)) {\n return \"color\"\n }\n return \"expression\"\n}\n\nfunction accepts(expected: ValueKind, actual: ValueKind) {\n if (actual === expected || actual === \"expression\" || actual === \"keyword\") {\n return true\n }\n // `0` sem unidade vale como tamanho.\n return expected === \"length\" && actual === \"number\"\n}\n\nexport type ValidateThemeOptions = {\n // Tema que define o tipo de cada token (padrão: `defaultTheme`).\n reference?: ThemeTokens\n}\n\n// Confere nomes e valores antes de gravar ou injetar o tema. Tokens fora da\n// referência só passam pela checagem de segurança.\nexport function validateTheme(\n tokens: ThemeTokens,\n { reference = defaultTheme }: ValidateThemeOptions = {},\n): ThemeIssue[] {\n const issues: ThemeIssue[] = []\n\n for (const group of [\"theme\", \"light\", \"dark\"] as const) {\n for (const [name, value] of Object.entries(tokens[group] ?? {})) {\n const issue = (message: string) =>\n issues.push({ group, name, value, message })\n\n if (!NAME.test(name)) {\n issue(\"invalid variable name\")\n continue\n }\n if (typeof value !== \"string\" || !isSafeValue(value)) {\n issue(\"unsafe or malformed value\")\n continue\n }\n const expected =\n reference[group]?.[name] ??\n reference.light?.[name] ??\n reference.dark?.[name]\n if (expected === undefined) {\n continue\n }\n const expectedKind = getValueKind(expected)\n const actualKind = getValueKind(value)\n if (expectedKind !== \"expression\" && !accepts(expectedKind, actualKind)) {\n issue(`expected a ${expectedKind}, got a ${actualKind}`)\n }\n }\n }\n\n return issues\n}\n","import postcss from \"postcss\"\n\nimport type { ThemeGroup, ThemeTokens, ThemeVars } from \"./types\"\n\nimport {\n type ApplyCssVarsOptions,\n applyCssVars,\n type CssVarsResult,\n findBlock,\n withColorMappings,\n} from \"./css\"\nimport {\n ThemeValidationError,\n type ValidateThemeOptions,\n validateTheme,\n} from \"./validate\"\n\nconst GROUPS: ThemeGroup[] = [\"theme\", \"light\", \"dark\"]\n\nexport type ThemeFileOptions = {\n // Nome do tema, para ler e gravar o arquivo dele (`styles/themes/<nome>.css`)\n // com os blocos `:root[data-slabui-theme=\"<nome>\"]` e `.dark`.\n theme?: string\n}\n\n// Lê o tema do CSS global (`@theme inline`, `:root` e `.dark`), ou de um\n// arquivo de tema com `theme`. Os `--color-<nome>: var(--<nome>)` gerados das\n// cores ficam de fora, como no `defaultTheme`; um mapeamento com outro valor é\n// mantido.\nexport function readTheme(\n css: string,\n { theme }: ThemeFileOptions = {},\n): ThemeTokens {\n const root = postcss.parse(css)\n const tokens: ThemeTokens = {}\n\n for (const group of GROUPS) {\n const vars: ThemeVars = {}\n findBlock(root, group, theme)?.each((node) => {\n if (node.type === \"decl\" && node.prop.startsWith(\"--\")) {\n vars[node.prop.slice(2)] = node.value\n }\n })\n if (Object.keys(vars).length > 0) {\n tokens[group] = vars\n }\n }\n\n if (tokens.theme) {\n const { theme: derived = {} } = withColorMappings({\n light: tokens.light,\n dark: tokens.dark,\n })\n for (const [name, value] of Object.entries(derived)) {\n if (tokens.theme[name] === value) {\n delete tokens.theme[name]\n }\n }\n if (Object.keys(tokens.theme).length === 0) {\n delete tokens.theme\n }\n }\n\n return tokens\n}\n\n// Grava os tokens no CSS global, com merge por variável: só as variáveis\n// passadas mudam, e o resto do arquivo fica como está. Diferente do `add` do\n// registry, o valor do tema substitui o do arquivo. Tokens inválidos\n// interrompem a gravação com `ThemeValidationError`.\nexport async function writeTheme(\n css: string,\n tokens: ThemeTokens,\n {\n reference,\n ...options\n }: Omit<ApplyCssVarsOptions, \"overwrite\"> & ValidateThemeOptions = {},\n): Promise<CssVarsResult> {\n const issues = validateTheme(tokens, { reference })\n if (issues.length > 0) {\n throw new ThemeValidationError(issues)\n }\n return applyCssVars(css, tokens, { ...options, overwrite: true })\n}\n","import type { ThemeTokens } from \"./types\"\n\n// Utilitários de cor do Tailwind: `bg-primary`, `text-muted-foreground`,\n// `dark:border-input/50`, `ring-offset-background`…\nconst COLOR_UTILITY =\n /(?<![\\w-])(?:bg|text|border(?:-[xytrblse])?|ring(?:-offset)?|inset-ring|outline|fill|stroke|from|via|to|decoration|divide|accent|caret|placeholder|shadow|inset-shadow)-([a-z][a-z0-9-]*)(?=[/\\s\"'`\\]);,}!]|$)/g\n\n// `rounded`, `rounded-md`, `rounded-tl-xl`… (sem `none`, `full` e valores\n// arbitrários).\nconst RADIUS_UTILITY =\n /(?<![\\w-])rounded(?:-[trblse]{1,2})?(?:-(?:xs|sm|md|lg|xl|2xl|3xl|4xl))?(?![\\w[-])/\n\n// Escala de espaçamento: `p-4`, `-mt-2`, `gap-x-1.5`, `size-9`, `h-0.5`…\nconst SPACING_UTILITY =\n /(?<![\\w-])-?(?:p[xytrblse]?|m[xytrblse]?|gap(?:-[xy])?|space-[xy]|size|[wh]|min-[wh]|max-[wh]|inset(?:-[xy])?|top|right|bottom|left|start|end|translate-[xy]|scroll-[mp][xytrblse]?|indent|basis)-\\d+(?:\\.\\d+)?(?![\\w.-])/\n\nconst SPACING_FUNCTION = /--spacing\\(/\nconst CSS_VAR = /var\\(--([\\w-]+)/g\n\nexport type TokenCatalog = {\n // Variáveis do tema (`:root`/`.dark`) e as dos próprios itens.\n vars: Set<string>\n // Nome usado nas classes → variável (`destructive` → `danger`, pelo\n // `--color-destructive: var(--danger)` do `@theme inline`).\n colors: Map<string, string>\n}\n\n// Catálogo a partir do tema do CSS global do autor e das `cssVars` dos itens.\nexport function tokenCatalog(\n theme: ThemeTokens,\n itemVars: ThemeTokens[] = [],\n): TokenCatalog {\n const vars = new Set<string>()\n for (const tokens of [theme, ...itemVars]) {\n for (const group of [tokens.light, tokens.dark]) {\n for (const name of Object.keys(group ?? {})) {\n vars.add(name)\n }\n }\n }\n const colors = new Map<string, string>()\n for (const name of vars) {\n colors.set(name, name)\n }\n for (const tokens of [theme, ...itemVars]) {\n for (const [name, value] of Object.entries(tokens.theme ?? {})) {\n const target = value.match(/^var\\(--([\\w-]+)\\)$/)?.[1]\n if (name.startsWith(\"color-\") && target && vars.has(target)) {\n colors.set(name.slice(\"color-\".length), target)\n }\n }\n }\n return { vars, colors }\n}\n\n// Variáveis do tema que os arquivos de um item usam, em ordem alfabética.\nexport function findTokens(\n contents: string[],\n catalog: TokenCatalog,\n): string[] {\n const found = new Set<string>()\n for (const content of contents) {\n for (const [, name] of content.matchAll(COLOR_UTILITY)) {\n const token = catalog.colors.get(name as string)\n if (token) {\n found.add(token)\n }\n }\n for (const [, name] of content.matchAll(CSS_VAR)) {\n if (catalog.vars.has(name as string)) {\n found.add(name as string)\n }\n }\n if (catalog.vars.has(\"radius\") && RADIUS_UTILITY.test(content)) {\n found.add(\"radius\")\n }\n if (\n catalog.vars.has(\"spacing\") &&\n (SPACING_UTILITY.test(content) || SPACING_FUNCTION.test(content))\n ) {\n found.add(\"spacing\")\n }\n }\n return [...found].sort()\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["withColorMappings","applyCssVars","localImports","addImport","findBlock","postcss","defaultTheme","isTypographyToken","name","AT_RULE","ruleName","rule","readCssRules","root","css","utilities","variants","node","ruleSource","applyCssRules","changes","warnings","kind","field","remoteRules","remote","baseRules","options","names","remoteSource","baseSource","local","findRule","label","result","merge","appendRule","source","next","parseRule","applyBaseRules","previous","selectors","selector","remoteDecls","baseDecls","props","prop","layer","findBaseLayer","findRuleBySelector","declaration","appendBaseRule","value","remove","base","add","same","replace","lastVariant","firstUtility","clone","normalizeSelector","normalize","a","b","ThemeValidationError","issues","group","message","NAME","SAFE_CHARS","COLOR_FUNCTIONS","MATH_FUNCTIONS","HEX","NUMBER","LENGTH","KEYWORD","FUNCTION","isSafeValue","depth","char","fn","getValueKind","trimmed","accepts","actual","expected","validateTheme","tokens","issue","reference","expectedKind","actualKind","GROUPS","readTheme","vars","theme","derived","writeTheme","COLOR_UTILITY","RADIUS_UTILITY","SPACING_UTILITY","SPACING_FUNCTION","CSS_VAR","tokenCatalog","itemVars","colors","target","findTokens","found","content","contents","token","catalog","THEME_ATTRIBUTE","THEME_ENV","isThemeName","themeAttribute","themeSelector"],"sources":["../src/default-theme.ts","../src/rules.ts","../src/validate.ts","../src/theme.ts","../src/tokens.ts"],"sourcesContent":["import type { ThemeTokens } from \"./types\"\n\n// Tema padrão da SlabUI. Os `--color-<nome>: var(--<nome>)` do `@theme inline`\n// não ficam aqui: saem das cores de `light` e `dark` na gravação.\nexport const defaultTheme = {\n theme: {\n \"font-sans\": \"var(--font-sans)\",\n \"font-heading\": \"var(--font-heading)\",\n \"font-mono\": \"var(--font-mono)\",\n\n \"radius-sm\": \"calc(var(--radius) * 0.6)\",\n \"radius-md\": \"calc(var(--radius) * 0.8)\",\n \"radius-lg\": \"var(--radius)\",\n \"radius-xl\": \"calc(var(--radius) * 1.4)\",\n \"radius-2xl\": \"calc(var(--radius) * 1.8)\",\n \"radius-3xl\": \"calc(var(--radius) * 2.2)\",\n \"radius-4xl\": \"calc(var(--radius) * 2.6)\",\n\n \"breakpoint-3xl\": \"1600px\",\n \"breakpoint-4xl\": \"2000px\",\n\n // Tamanhos de texto proporcionais ao `--font-size` (o `text-base`): mudar\n // ele muda todas as classes `text-*`. A altura de linha de cada tamanho é\n // uma proporção sem unidade, então acompanha sozinha.\n \"text-xxs\": \"calc(var(--font-size) * 0.625)\",\n \"text-2xxs\": \"calc(var(--font-size) * 0.688)\",\n \"text-xs\": \"calc(var(--font-size) * 0.75)\",\n \"text-xs--line-height\": \"calc(1 / 0.75)\",\n \"text-2xs\": \"calc(var(--font-size) * 0.813)\",\n \"text-2xs--line-height\": \"calc(1.125 / 0.813)\",\n \"text-sm\": \"calc(var(--font-size) * 0.875)\",\n \"text-sm--line-height\": \"calc(1.25 / 0.875)\",\n \"text-2sm\": \"calc(var(--font-size) * 0.938)\",\n \"text-2sm--line-height\": \"calc(1.625 / 0.938)\",\n \"text-base\": \"var(--font-size)\",\n \"text-base--line-height\": \"calc(1.5 / 1)\",\n \"text-lg\": \"calc(var(--font-size) * 1.125)\",\n \"text-lg--line-height\": \"calc(1.75 / 1.125)\",\n \"text-xl\": \"calc(var(--font-size) * 1.25)\",\n \"text-xl--line-height\": \"calc(1.75 / 1.25)\",\n \"text-2xl\": \"calc(var(--font-size) * 1.5)\",\n \"text-2xl--line-height\": \"calc(2 / 1.5)\",\n \"text-3xl\": \"calc(var(--font-size) * 1.875)\",\n \"text-3xl--line-height\": \"calc(2.25 / 1.875)\",\n \"text-4xl\": \"calc(var(--font-size) * 2.25)\",\n \"text-4xl--line-height\": \"calc(2.5 / 2.25)\",\n \"text-5xl\": \"calc(var(--font-size) * 3)\",\n \"text-5xl--line-height\": \"1\",\n \"text-6xl\": \"calc(var(--font-size) * 3.75)\",\n \"text-6xl--line-height\": \"1\",\n \"text-7xl\": \"calc(var(--font-size) * 4.5)\",\n \"text-7xl--line-height\": \"1\",\n \"text-8xl\": \"calc(var(--font-size) * 6)\",\n \"text-8xl--line-height\": \"1\",\n \"text-9xl\": \"calc(var(--font-size) * 8)\",\n \"text-9xl--line-height\": \"1\",\n\n spacing: \"var(--spacing)\",\n\n \"focus-size\": \"calc(var(--focus-size))\",\n \"focus-offset\": \"var(--focus-offset)\",\n\n // `destructive` (estados inválidos dos componentes) é a cor `danger`.\n \"color-destructive\": \"var(--danger)\",\n },\n light: {\n spacing: \"0.25rem\",\n radius: \"0.65rem\",\n // Tamanho base do texto. Em `rem`, respeita o tamanho de fonte do\n // navegador; o usuário pode aumentar ou diminuir em produção.\n \"font-size\": \"1rem\",\n background: \"oklch(1 0 0)\",\n // Cor da barra de rolagem (base.css).\n \"scrollbar-thumb\": \"oklch(0.922 0 0)\",\n foreground: \"oklch(0.145 0 0)\",\n card: \"oklch(1 0 0)\",\n \"card-foreground\": \"oklch(0.145 0 0)\",\n popover: \"oklch(1 0 0)\",\n \"popover-foreground\": \"oklch(0.145 0 0)\",\n muted: \"oklch(0.97 0 0)\",\n \"muted-foreground\": \"oklch(0.556 0 0)\",\n accent: \"oklch(0.97 0 0)\",\n \"accent-foreground\": \"oklch(0.205 0 0)\",\n border: \"oklch(0.922 0 0)\",\n input: \"oklch(0.922 0 0)\",\n ring: \"oklch(0.708 0 0)\",\n \"chart-1\": \"oklch(0.646 0.222 41.116)\",\n \"chart-2\": \"oklch(0.6 0.118 184.704)\",\n \"chart-3\": \"oklch(0.398 0.07 227.392)\",\n \"chart-4\": \"oklch(0.828 0.189 84.429)\",\n \"chart-5\": \"oklch(0.769 0.188 70.08)\",\n sidebar: \"oklch(0.985 0 0)\",\n \"sidebar-foreground\": \"oklch(0.145 0 0)\",\n \"sidebar-primary\": \"oklch(0.205 0 0)\",\n \"sidebar-primary-foreground\": \"oklch(0.985 0 0)\",\n \"sidebar-accent\": \"oklch(0.97 0 0)\",\n \"sidebar-accent-foreground\": \"oklch(0.205 0 0)\",\n \"sidebar-border\": \"oklch(0.922 0 0)\",\n \"sidebar-ring\": \"oklch(0.708 0 0)\",\n\n // Cor da marca (logo, destaques), com o texto por cima. Começa igual ao\n // `primary`, que é a cor das ações dos componentes: quando a marca não tem\n // contraste para um botão, o `primary` muda e a marca fica.\n brand: \"oklch(70% 0.1435 227.76)\",\n \"brand-foreground\": \"oklch(0.985 0 0)\",\n primary: \"oklch(70% 0.1435 227.76)\",\n \"primary-foreground\": \"oklch(0.985 0 0)\",\n secondary: \"oklch(0.97 0 0)\",\n \"secondary-foreground\": \"oklch(0.205 0 0)\",\n danger: \"oklch(0.577 0.245 27.325)\",\n \"danger-foreground\": \"oklch(0.985 0 0)\",\n success: \"oklch(0.728 0.125 139.6)\",\n \"success-foreground\": \"oklch(0.985 0 0)\",\n warning: \"oklch(0.784 0.181 44.7)\",\n \"warning-foreground\": \"oklch(0.985 0 0)\",\n inverted: \"oklch(0.205 0 0)\",\n \"inverted-foreground\": \"oklch(0.97 0 0)\",\n\n focus: \"oklch(0.7 0.181 44.7)\",\n \"focus-size\": \"2.5px\",\n \"focus-offset\": \"2px\",\n\n table: \"oklch(0.94 0 0 / 65%)\",\n \"table-content\": \"oklch(1 0 0)\",\n \"table-hover\": \"oklch(0.98 0 0 / 10%)\",\n },\n dark: {\n background: \"oklch(0.145 0 0)\",\n \"scrollbar-thumb\": \"oklch(0.269 0 0)\",\n foreground: \"oklch(0.985 0 0)\",\n card: \"oklch(0.205 0 0)\",\n \"card-foreground\": \"oklch(0.985 0 0)\",\n popover: \"oklch(0.205 0 0)\",\n \"popover-foreground\": \"oklch(0.985 0 0)\",\n secondary: \"oklch(0.269 0 0)\",\n \"secondary-foreground\": \"oklch(0.985 0 0)\",\n muted: \"oklch(0.269 0 0)\",\n \"muted-foreground\": \"oklch(0.708 0 0)\",\n accent: \"oklch(0.269 0 0)\",\n \"accent-foreground\": \"oklch(0.985 0 0)\",\n border: \"oklch(1 0 0 / 10%)\",\n input: \"oklch(1 0 0 / 15%)\",\n ring: \"oklch(0.556 0 0)\",\n \"chart-1\": \"oklch(0.488 0.243 264.376)\",\n \"chart-2\": \"oklch(0.696 0.17 162.48)\",\n \"chart-3\": \"oklch(0.769 0.188 70.08)\",\n \"chart-4\": \"oklch(0.627 0.265 303.9)\",\n \"chart-5\": \"oklch(0.645 0.246 16.439)\",\n sidebar: \"oklch(0.205 0 0)\",\n \"sidebar-foreground\": \"oklch(0.985 0 0)\",\n \"sidebar-primary\": \"oklch(0.488 0.243 264.376)\",\n \"sidebar-primary-foreground\": \"oklch(0.985 0 0)\",\n \"sidebar-accent\": \"oklch(0.269 0 0)\",\n \"sidebar-accent-foreground\": \"oklch(0.985 0 0)\",\n \"sidebar-border\": \"oklch(1 0 0 / 10%)\",\n \"sidebar-ring\": \"oklch(0.556 0 0)\",\n\n brand: \"oklch(66% 0.1435 227.76)\",\n \"brand-foreground\": \"oklch(0.985 0 0)\",\n primary: \"oklch(66% 0.1435 227.76)\",\n \"primary-foreground\": \"oklch(0.985 0 0)\",\n danger: \"oklch(0.704 0.191 22.216)\",\n \"danger-foreground\": \"oklch(0.985 0 0)\",\n success: \"oklch(0.728 0.125 139.6)\",\n \"success-foreground\": \"oklch(0.985 0 0)\",\n warning: \"oklch(0.784 0.181 44.7)\",\n \"warning-foreground\": \"oklch(0.985 0 0)\",\n inverted: \"oklch(0.922 0 0)\",\n \"inverted-foreground\": \"oklch(0.205 0 0)\",\n\n focus: \"oklch(0.7 0.181 44.7)\",\n\n table: \"oklch(0.265 0 0)\",\n \"table-content\": \"oklch(0.205 0 0)\",\n \"table-hover\": \"oklch(0.22 0 0)\",\n },\n} satisfies ThemeTokens\n\n// Entradas de tipografia do `@theme inline` (famílias `--font-*` e a escala\n// `--text-*`): no projeto, ficam no `fonts.css`, ao lado do CSS global.\nexport function isTypographyToken(name: string): boolean {\n return /^(?:font|text)-/.test(name)\n}\n","import postcss, {\n type AtRule,\n type Container,\n type Root,\n type Rule,\n} from \"postcss\"\n\n// Regras de CSS que os itens trazem além das variáveis do tema:\n//\n// - `utilities` e `variants`: `@utility <nome>` e `@custom-variant <nome>`,\n// com o texto completo da regra, no `utilities.css`. O merge é pelo nome.\n// - `base`: declarações em seletores de elemento (`body`, `html`, `*`…),\n// dentro do `@layer base` do `base.css`. O merge é por seletor e\n// propriedade.\n//\n// As regras de merge são as mesmas das variáveis: o que falta é adicionado, o\n// que o usuário mudou fica, e no update o que não foi mexido acompanha a\n// versão nova.\nexport type CssRules = {\n utilities?: Record<string, string>\n variants?: Record<string, string>\n base?: Record<string, Record<string, string>>\n}\n\nexport type CssRuleKind = \"utility\" | \"variant\" | \"base\"\n\nexport type CssRuleChange = {\n kind: CssRuleKind\n // Nome da utility ou da variante; na base, `<seletor> { <propriedade> }`.\n name: string\n action: \"added\" | \"updated\" | \"kept\" | \"removed\" | \"unchanged\"\n}\n\nexport type CssRulesResult = {\n css: string\n changes: CssRuleChange[]\n warnings: string[]\n}\n\nexport type ApplyCssRulesOptions = {\n // Regras da versão instalada (no update); ausente no add.\n base?: CssRules\n overwrite?: boolean\n // Regra removida na versão nova: remover? Ausente = manter.\n shouldRemove?: (kind: CssRuleKind, name: string) => Promise<boolean>\n}\n\nconst AT_RULE = { utility: \"utility\", variant: \"custom-variant\" } as const\n\n// Nome de uma `@utility`/`@custom-variant` pelo começo dos parâmetros\n// (`no-scrollbar`, `fixed (&:is(.layout-fixed *))`).\nexport function ruleName(rule: AtRule): string {\n return rule.params.trim().split(/[\\s({]/)[0] ?? \"\"\n}\n\n// As `@utility` e `@custom-variant` de um CSS, pelo nome, com o texto de cada\n// uma. A variante `dark` fica de fora: é do tema, e o CSS global cuida dela.\nexport function readCssRules(\n css: string,\n): Required<Pick<CssRules, \"utilities\" | \"variants\">> {\n const root = postcss.parse(css)\n const utilities: Record<string, string> = {}\n const variants: Record<string, string> = {}\n root.each((node) => {\n if (node.type !== \"atrule\") {\n return\n }\n const name = ruleName(node)\n if (node.name === AT_RULE.utility) {\n utilities[name] = ruleSource(node)\n } else if (node.name === AT_RULE.variant && name !== \"dark\") {\n variants[name] = ruleSource(node)\n }\n })\n return { utilities, variants }\n}\n\n// Aplica as `@utility` e `@custom-variant` de um item, com merge pelo nome.\nexport async function applyCssRules(\n css: string,\n remote: Pick<CssRules, \"utilities\" | \"variants\">,\n options: ApplyCssRulesOptions = {},\n): Promise<CssRulesResult> {\n const root = postcss.parse(css)\n const changes: CssRuleChange[] = []\n const warnings: string[] = []\n\n for (const kind of [\"variant\", \"utility\"] as const) {\n const field = kind === \"utility\" ? \"utilities\" : \"variants\"\n const remoteRules = remote[field] ?? {}\n const baseRules = options.base?.[field] ?? {}\n const names = new Set([\n ...Object.keys(remoteRules),\n ...Object.keys(baseRules),\n ])\n\n for (const name of names) {\n const remoteSource = remoteRules[name]\n const baseSource = baseRules[name]\n const local = findRule(root, kind, name)\n const label = `${field === \"utilities\" ? \"@utility\" : \"@custom-variant\"} ${name}`\n\n const result = await merge({\n local: local && ruleSource(local),\n remote: remoteSource,\n base: baseSource,\n options,\n kind,\n name,\n label,\n warnings,\n add: (source) => appendRule(root, kind, source),\n replace: (source) => {\n const next = parseRule(source)\n next.raws.before = local?.raws.before ?? \"\"\n local?.replaceWith(next)\n },\n remove: () => local?.remove(),\n })\n if (result) {\n changes.push({ kind, name, action: result })\n }\n }\n }\n\n return { css: root.toString(), changes, warnings }\n}\n\n// Aplica as declarações de base de um item no `@layer base`, com merge por\n// seletor e propriedade.\nexport async function applyBaseRules(\n css: string,\n remote: CssRules[\"base\"] = {},\n options: ApplyCssRulesOptions = {},\n): Promise<CssRulesResult> {\n const root = postcss.parse(css)\n const changes: CssRuleChange[] = []\n const warnings: string[] = []\n const previous = options.base?.base ?? {}\n\n const selectors = new Set([...Object.keys(remote), ...Object.keys(previous)])\n for (const selector of selectors) {\n const remoteDecls = remote[selector] ?? {}\n const baseDecls = previous[selector] ?? {}\n const props = new Set([\n ...Object.keys(remoteDecls),\n ...Object.keys(baseDecls),\n ])\n\n for (const prop of props) {\n const layer = findBaseLayer(root)\n let rule = layer && findRuleBySelector(layer, selector)\n const declaration = rule?.nodes.find(\n (node) => node.type === \"decl\" && node.prop === prop,\n ) as postcss.Declaration | undefined\n const name = `${selector} { ${prop} }`\n\n const result = await merge({\n local: declaration?.value,\n remote: remoteDecls[prop],\n base: baseDecls[prop],\n options,\n kind: \"base\",\n name,\n label: `${prop} in ${selector}`,\n warnings,\n add: (value) => {\n rule ??= appendBaseRule(root, selector)\n rule.append(postcss.decl({ prop, value, raws: { before: \"\\n \" } }))\n },\n replace: (value) => {\n if (declaration) {\n declaration.value = value\n }\n },\n remove: () => {\n declaration?.remove()\n if (rule?.nodes.length === 0) {\n rule.remove()\n }\n },\n })\n if (result) {\n changes.push({ kind: \"base\", name, action: result })\n }\n }\n }\n\n return { css: root.toString(), changes, warnings }\n}\n\n// Mesmas regras do merge das variáveis (`applyCssVars`).\nasync function merge({\n local,\n remote,\n base,\n options,\n kind,\n name,\n label,\n warnings,\n add,\n replace,\n remove,\n}: {\n local: string | undefined\n remote: string | undefined\n base: string | undefined\n options: ApplyCssRulesOptions\n kind: CssRuleKind\n name: string\n label: string\n warnings: string[]\n add: (value: string) => void\n replace: (value: string) => void\n remove: () => void\n}): Promise<CssRuleChange[\"action\"] | undefined> {\n if (remote === undefined) {\n // Removida na versão nova.\n if (local === undefined) {\n return undefined\n }\n if (options.shouldRemove && (await options.shouldRemove(kind, name))) {\n remove()\n return \"removed\"\n }\n warnings.push(`${label} was removed in the new version; kept in the CSS.`)\n return \"kept\"\n }\n\n if (local === undefined) {\n if (base !== undefined) {\n // Apagada pelo usuário: não recria.\n return \"kept\"\n }\n add(remote)\n return \"added\"\n }\n\n if (same(local, remote)) {\n return \"unchanged\"\n }\n if (options.overwrite || (base !== undefined && same(local, base))) {\n replace(remote)\n return \"updated\"\n }\n warnings.push(`${label} was changed in the CSS; kept instead of the new one.`)\n return \"kept\"\n}\n\nfunction findRule(\n root: Root,\n kind: \"utility\" | \"variant\",\n name: string,\n): AtRule | undefined {\n return root.nodes.find(\n (node): node is AtRule =>\n node.type === \"atrule\" &&\n node.name === AT_RULE[kind] &&\n ruleName(node) === name,\n )\n}\n\n// Variantes antes das utilities: uma utility pode usar uma variante.\nfunction appendRule(root: Root, kind: \"utility\" | \"variant\", source: string) {\n const rule = parseRule(source)\n const lastVariant = root.nodes.findLast(\n (node) => node.type === \"atrule\" && node.name === AT_RULE.variant,\n )\n if (kind === \"variant\") {\n const firstUtility = root.nodes.find(\n (node) => node.type === \"atrule\" && node.name === AT_RULE.utility,\n )\n if (lastVariant) {\n rule.raws.before = \"\\n\"\n lastVariant.after(rule)\n return\n }\n if (firstUtility) {\n rule.raws.before = firstUtility.raws.before ?? \"\"\n firstUtility.raws.before = \"\\n\\n\"\n firstUtility.before(rule)\n return\n }\n }\n rule.raws.before = root.nodes.length > 0 ? \"\\n\\n\" : \"\"\n root.append(rule)\n root.raws.after = \"\\n\"\n}\n\nfunction parseRule(source: string): AtRule {\n const node = postcss.parse(source.trim()).first\n if (node?.type !== \"atrule\") {\n throw new Error(`Not a CSS at-rule: ${source}`)\n }\n return node\n}\n\n// Texto da regra sem os espaços de antes (é o que vai para o item publicado).\nfunction ruleSource(rule: AtRule): string {\n const clone = rule.clone()\n clone.raws.before = \"\"\n // Sem bloco (`@custom-variant x (…);`), o `;` é do pai: vai junto.\n return clone.nodes === undefined ? `${clone.toString()};` : clone.toString()\n}\n\nfunction findBaseLayer(root: Root): Container | undefined {\n return root.nodes.find(\n (node) =>\n node.type === \"atrule\" &&\n node.name === \"layer\" &&\n node.params.trim() === \"base\",\n ) as Container | undefined\n}\n\nfunction findRuleBySelector(\n layer: Container,\n selector: string,\n): Rule | undefined {\n return layer.nodes?.find(\n (node): node is Rule =>\n node.type === \"rule\" &&\n normalizeSelector(node.selector) === normalizeSelector(selector),\n )\n}\n\nfunction appendBaseRule(root: Root, selector: string): Rule {\n let layer = findBaseLayer(root)\n if (layer === undefined) {\n layer = postcss.atRule({ name: \"layer\", params: \"base\" })\n layer.raws = {\n before: root.nodes.length > 0 ? \"\\n\\n\" : \"\",\n between: \" \",\n after: \"\\n\",\n }\n root.append(layer)\n root.raws.after = \"\\n\"\n }\n const rule = postcss.rule({ selector })\n rule.raws = {\n before: (layer.nodes?.length ?? 0) > 0 ? \"\\n\\n \" : \"\\n \",\n between: \" \",\n after: \"\\n \",\n semicolon: true,\n }\n layer.append(rule)\n layer.raws.after = \"\\n\"\n return rule\n}\n\n// Compara seletores sem os espaços (`a > b` = `a>b`) e sem as aspas.\nconst normalizeSelector = (selector: string) => selector.replace(/[\"'\\s]/g, \"\")\n\nfunction same(a: string, b: string) {\n const normalize = (value: string) =>\n value\n .replace(/\\s+/g, \" \")\n .replace(/\\s*([{};:,])\\s*/g, \"$1\")\n .replace(/;}/g, \"}\")\n .replace(/;$/, \"\")\n .trim()\n return normalize(a) === normalize(b)\n}\n","import type { ThemeGroup, ThemeTokens } from \"./types\"\n\nimport { defaultTheme } from \"./default-theme\"\n\nexport type ValueKind = \"color\" | \"length\" | \"number\" | \"keyword\" | \"expression\"\n\nexport type ThemeIssue = {\n group: ThemeGroup\n name: string\n value: string\n message: string\n}\n\nexport class ThemeValidationError extends Error {\n constructor(readonly issues: ThemeIssue[]) {\n super(\n `Invalid theme:\\n${issues\n .map(({ group, name, message }) => ` --${name} (${group}): ${message}`)\n .join(\"\\n\")}`,\n )\n this.name = \"ThemeValidationError\"\n }\n}\n\nconst MAX_LENGTH = 200\n\nconst NAME = /^[\\w-]+$/\n// Só o que um valor de tema usa: sem `;`, `{}`, aspas, `\\`, `@`, `!` ou `:`,\n// que permitiriam fechar o bloco ou injetar outra regra.\nconst SAFE_CHARS = /^[\\w\\s.,%#()+\\-*/]+$/\n\nconst COLOR_FUNCTIONS = new Set([\n \"rgb\",\n \"rgba\",\n \"hsl\",\n \"hsla\",\n \"hwb\",\n \"lab\",\n \"lch\",\n \"oklab\",\n \"oklch\",\n \"color\",\n \"color-mix\",\n])\nconst MATH_FUNCTIONS = new Set([\"calc\", \"min\", \"max\", \"clamp\", \"var\"])\n\nconst HEX = /^#(?:[\\da-f]{3,4}|[\\da-f]{6}|[\\da-f]{8})$/i\nconst NUMBER = /^[+-]?(?:\\d+\\.?\\d*|\\.\\d+)$/\nconst LENGTH =\n /^[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:px|rem|em|%|ch|ex|lh|rlh|vw|vh|vmin|vmax|svh|lvh|dvh|cqw|cqh|pt|pc|in|cm|mm|q|deg|rad|turn|ms|s)$/i\nconst KEYWORD = /^[a-z][a-z-]*$/i\nconst FUNCTION = /^([a-z-]+)\\(/i\n\n// O valor só usa caracteres e funções conhecidos, com parênteses balanceados.\nexport function isSafeValue(value: string): boolean {\n if (value.trim() === \"\" || value.length > MAX_LENGTH) {\n return false\n }\n if (!SAFE_CHARS.test(value)) {\n return false\n }\n let depth = 0\n for (const char of value) {\n depth += char === \"(\" ? 1 : char === \")\" ? -1 : 0\n if (depth < 0) {\n return false\n }\n }\n if (depth !== 0) {\n return false\n }\n for (const [, name] of value.matchAll(/([a-z-]*)\\(/gi)) {\n // Sem nome, é só um agrupamento: `calc((a + b) * 2)`.\n const fn = name.toLowerCase()\n if (fn !== \"\" && !COLOR_FUNCTIONS.has(fn) && !MATH_FUNCTIONS.has(fn)) {\n return false\n }\n }\n return true\n}\n\n// Tipo do valor, para conferir com o do tema padrão. `calc()` e `var()` são\n// \"expression\": aceitos no lugar de qualquer tipo.\nexport function getValueKind(value: string): ValueKind {\n const trimmed = value.trim()\n if (HEX.test(trimmed)) {\n return \"color\"\n }\n if (NUMBER.test(trimmed)) {\n return \"number\"\n }\n if (LENGTH.test(trimmed)) {\n return \"length\"\n }\n if (KEYWORD.test(trimmed)) {\n return \"keyword\"\n }\n const fn = trimmed.match(FUNCTION)?.[1]?.toLowerCase()\n if (fn && COLOR_FUNCTIONS.has(fn)) {\n return \"color\"\n }\n return \"expression\"\n}\n\nfunction accepts(expected: ValueKind, actual: ValueKind) {\n if (actual === expected || actual === \"expression\" || actual === \"keyword\") {\n return true\n }\n // `0` sem unidade vale como tamanho.\n return expected === \"length\" && actual === \"number\"\n}\n\nexport type ValidateThemeOptions = {\n // Tema que define o tipo de cada token (padrão: `defaultTheme`).\n reference?: ThemeTokens\n}\n\n// Confere nomes e valores antes de gravar ou injetar o tema. Tokens fora da\n// referência só passam pela checagem de segurança.\nexport function validateTheme(\n tokens: ThemeTokens,\n { reference = defaultTheme }: ValidateThemeOptions = {},\n): ThemeIssue[] {\n const issues: ThemeIssue[] = []\n\n for (const group of [\"theme\", \"light\", \"dark\"] as const) {\n for (const [name, value] of Object.entries(tokens[group] ?? {})) {\n const issue = (message: string) =>\n issues.push({ group, name, value, message })\n\n if (!NAME.test(name)) {\n issue(\"invalid variable name\")\n continue\n }\n if (typeof value !== \"string\" || !isSafeValue(value)) {\n issue(\"unsafe or malformed value\")\n continue\n }\n const expected =\n reference[group]?.[name] ??\n reference.light?.[name] ??\n reference.dark?.[name]\n if (expected === undefined) {\n continue\n }\n const expectedKind = getValueKind(expected)\n const actualKind = getValueKind(value)\n if (expectedKind !== \"expression\" && !accepts(expectedKind, actualKind)) {\n issue(`expected a ${expectedKind}, got a ${actualKind}`)\n }\n }\n }\n\n return issues\n}\n","import postcss from \"postcss\"\n\nimport type { ThemeGroup, ThemeTokens, ThemeVars } from \"./types\"\n\nimport {\n type ApplyCssVarsOptions,\n applyCssVars,\n type CssVarsResult,\n findBlock,\n withColorMappings,\n} from \"./css\"\nimport {\n ThemeValidationError,\n type ValidateThemeOptions,\n validateTheme,\n} from \"./validate\"\n\nconst GROUPS: ThemeGroup[] = [\"theme\", \"light\", \"dark\"]\n\nexport type ThemeFileOptions = {\n // Nome do tema, para ler e gravar o arquivo dele (`styles/themes/<nome>.css`)\n // com os blocos `:root[data-slabui-theme=\"<nome>\"]` e `.dark`.\n theme?: string\n}\n\n// Lê o tema do CSS global (`@theme inline`, `:root` e `.dark`), ou de um\n// arquivo de tema com `theme`. Os `--color-<nome>: var(--<nome>)` gerados das\n// cores ficam de fora, como no `defaultTheme`; um mapeamento com outro valor é\n// mantido.\nexport function readTheme(\n css: string,\n { theme }: ThemeFileOptions = {},\n): ThemeTokens {\n const root = postcss.parse(css)\n const tokens: ThemeTokens = {}\n\n for (const group of GROUPS) {\n const vars: ThemeVars = {}\n findBlock(root, group, theme)?.each((node) => {\n if (node.type === \"decl\" && node.prop.startsWith(\"--\")) {\n vars[node.prop.slice(2)] = node.value\n }\n })\n if (Object.keys(vars).length > 0) {\n tokens[group] = vars\n }\n }\n\n if (tokens.theme) {\n const { theme: derived = {} } = withColorMappings({\n light: tokens.light,\n dark: tokens.dark,\n })\n for (const [name, value] of Object.entries(derived)) {\n if (tokens.theme[name] === value) {\n delete tokens.theme[name]\n }\n }\n if (Object.keys(tokens.theme).length === 0) {\n delete tokens.theme\n }\n }\n\n return tokens\n}\n\n// Grava os tokens no CSS global, com merge por variável: só as variáveis\n// passadas mudam, e o resto do arquivo fica como está. Diferente do `add` do\n// registry, o valor do tema substitui o do arquivo. Tokens inválidos\n// interrompem a gravação com `ThemeValidationError`.\nexport async function writeTheme(\n css: string,\n tokens: ThemeTokens,\n {\n reference,\n ...options\n }: Omit<ApplyCssVarsOptions, \"overwrite\"> & ValidateThemeOptions = {},\n): Promise<CssVarsResult> {\n const issues = validateTheme(tokens, { reference })\n if (issues.length > 0) {\n throw new ThemeValidationError(issues)\n }\n return applyCssVars(css, tokens, { ...options, overwrite: true })\n}\n","import type { ThemeTokens } from \"./types\"\n\n// Utilitários de cor do Tailwind: `bg-primary`, `text-muted-foreground`,\n// `dark:border-input/50`, `ring-offset-background`…\nconst COLOR_UTILITY =\n /(?<![\\w-])(?:bg|text|border(?:-[xytrblse])?|ring(?:-offset)?|inset-ring|outline|fill|stroke|from|via|to|decoration|divide|accent|caret|placeholder|shadow|inset-shadow)-([a-z][a-z0-9-]*)(?=[/\\s\"'`\\]);,}!]|$)/g\n\n// `rounded`, `rounded-md`, `rounded-tl-xl`… (sem `none`, `full` e valores\n// arbitrários).\nconst RADIUS_UTILITY =\n /(?<![\\w-])rounded(?:-[trblse]{1,2})?(?:-(?:xs|sm|md|lg|xl|2xl|3xl|4xl))?(?![\\w[-])/\n\n// Escala de espaçamento: `p-4`, `-mt-2`, `gap-x-1.5`, `size-9`, `h-0.5`…\nconst SPACING_UTILITY =\n /(?<![\\w-])-?(?:p[xytrblse]?|m[xytrblse]?|gap(?:-[xy])?|space-[xy]|size|[wh]|min-[wh]|max-[wh]|inset(?:-[xy])?|top|right|bottom|left|start|end|translate-[xy]|scroll-[mp][xytrblse]?|indent|basis)-\\d+(?:\\.\\d+)?(?![\\w.-])/\n\nconst SPACING_FUNCTION = /--spacing\\(/\nconst CSS_VAR = /var\\(--([\\w-]+)/g\n\nexport type TokenCatalog = {\n // Variáveis do tema (`:root`/`.dark`) e as dos próprios itens.\n vars: Set<string>\n // Nome usado nas classes → variável (`destructive` → `danger`, pelo\n // `--color-destructive: var(--danger)` do `@theme inline`).\n colors: Map<string, string>\n}\n\n// Catálogo a partir do tema do CSS global do autor e das `cssVars` dos itens.\nexport function tokenCatalog(\n theme: ThemeTokens,\n itemVars: ThemeTokens[] = [],\n): TokenCatalog {\n const vars = new Set<string>()\n for (const tokens of [theme, ...itemVars]) {\n for (const group of [tokens.light, tokens.dark]) {\n for (const name of Object.keys(group ?? {})) {\n vars.add(name)\n }\n }\n }\n const colors = new Map<string, string>()\n for (const name of vars) {\n colors.set(name, name)\n }\n for (const tokens of [theme, ...itemVars]) {\n for (const [name, value] of Object.entries(tokens.theme ?? {})) {\n const target = value.match(/^var\\(--([\\w-]+)\\)$/)?.[1]\n if (name.startsWith(\"color-\") && target && vars.has(target)) {\n colors.set(name.slice(\"color-\".length), target)\n }\n }\n }\n return { vars, colors }\n}\n\n// Variáveis do tema que os arquivos de um item usam, em ordem alfabética.\nexport function findTokens(\n contents: string[],\n catalog: TokenCatalog,\n): string[] {\n const found = new Set<string>()\n for (const content of contents) {\n for (const [, name] of content.matchAll(COLOR_UTILITY)) {\n const token = catalog.colors.get(name as string)\n if (token) {\n found.add(token)\n }\n }\n for (const [, name] of content.matchAll(CSS_VAR)) {\n if (catalog.vars.has(name as string)) {\n found.add(name as string)\n }\n }\n if (catalog.vars.has(\"radius\") && RADIUS_UTILITY.test(content)) {\n found.add(\"radius\")\n }\n if (\n catalog.vars.has(\"spacing\") &&\n (SPACING_UTILITY.test(content) || SPACING_FUNCTION.test(content))\n ) {\n found.add(\"spacing\")\n }\n }\n return [...found].sort()\n}\n"],"mappings":"A,2NAIA,MAAaM,EAAe,CAC1B,MAAO,CACL,YAAa,mBACb,eAAgB,sBAChB,YAAa,mBAEb,YAAa,4BACb,YAAa,4BACb,YAAa,gBACb,YAAa,4BACb,aAAc,4BACd,aAAc,4BACd,aAAc,4BAEd,iBAAkB,SAClB,iBAAkB,SAKlB,WAAY,iCACZ,YAAa,iCACb,UAAW,gCACX,uBAAwB,iBACxB,WAAY,iCACZ,wBAAyB,sBACzB,UAAW,iCACX,uBAAwB,qBACxB,WAAY,iCACZ,wBAAyB,sBACzB,YAAa,mBACb,yBAA0B,gBAC1B,UAAW,iCACX,uBAAwB,qBACxB,UAAW,gCACX,uBAAwB,oBACxB,WAAY,+BACZ,wBAAyB,gBACzB,WAAY,iCACZ,wBAAyB,qBACzB,WAAY,gCACZ,wBAAyB,mBACzB,WAAY,6BACZ,wBAAyB,IACzB,WAAY,gCACZ,wBAAyB,IACzB,WAAY,+BACZ,wBAAyB,IACzB,WAAY,6BACZ,wBAAyB,IACzB,WAAY,6BACZ,wBAAyB,IAEzB,QAAS,iBAET,aAAc,0BACd,eAAgB,sBAGhB,oBAAqB,eACvB,EACA,MAAO,CACL,QAAS,UACT,OAAQ,UAGR,YAAa,OACb,WAAY,eAEZ,kBAAmB,mBACnB,WAAY,mBACZ,KAAM,eACN,kBAAmB,mBACnB,QAAS,eACT,qBAAsB,mBACtB,MAAO,kBACP,mBAAoB,mBACpB,OAAQ,kBACR,oBAAqB,mBACrB,OAAQ,mBACR,MAAO,mBACP,KAAM,mBACN,UAAW,4BACX,UAAW,2BACX,UAAW,4BACX,UAAW,4BACX,UAAW,2BACX,QAAS,mBACT,qBAAsB,mBACtB,kBAAmB,mBACnB,6BAA8B,mBAC9B,iBAAkB,kBAClB,4BAA6B,mBAC7B,iBAAkB,mBAClB,eAAgB,mBAKhB,MAAO,2BACP,mBAAoB,mBACpB,QAAS,2BACT,qBAAsB,mBACtB,UAAW,kBACX,uBAAwB,mBACxB,OAAQ,4BACR,oBAAqB,mBACrB,QAAS,2BACT,qBAAsB,mBACtB,QAAS,0BACT,qBAAsB,mBACtB,SAAU,mBACV,sBAAuB,kBAEvB,MAAO,wBACP,aAAc,QACd,eAAgB,MAEhB,MAAO,wBACP,gBAAiB,eACjB,cAAe,uBACjB,EACA,KAAM,CACJ,WAAY,mBACZ,kBAAmB,mBACnB,WAAY,mBACZ,KAAM,mBACN,kBAAmB,mBACnB,QAAS,mBACT,qBAAsB,mBACtB,UAAW,mBACX,uBAAwB,mBACxB,MAAO,mBACP,mBAAoB,mBACpB,OAAQ,mBACR,oBAAqB,mBACrB,OAAQ,qBACR,MAAO,qBACP,KAAM,mBACN,UAAW,6BACX,UAAW,2BACX,UAAW,2BACX,UAAW,2BACX,UAAW,4BACX,QAAS,mBACT,qBAAsB,mBACtB,kBAAmB,6BACnB,6BAA8B,mBAC9B,iBAAkB,mBAClB,4BAA6B,mBAC7B,iBAAkB,qBAClB,eAAgB,mBAEhB,MAAO,2BACP,mBAAoB,mBACpB,QAAS,2BACT,qBAAsB,mBACtB,OAAQ,4BACR,oBAAqB,mBACrB,QAAS,2BACT,qBAAsB,mBACtB,QAAS,0BACT,qBAAsB,mBACtB,SAAU,mBACV,sBAAuB,mBAEvB,MAAO,wBAEP,MAAO,mBACP,gBAAiB,mBACjB,cAAe,iBACjB,CACF,EAIA,SAAgBC,EAAkB,EAAuB,CACvD,MAAO,kBAAkB,KAAKC,CAAI,CACpC,CCvIA,MAAMC,EAAU,CAAE,QAAS,UAAW,QAAS,gBAAiB,EAIhE,SAAgBC,EAAS,EAAsB,CAC7C,OAAOC,EAAK,OAAO,KAAK,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAC,IAAM,EAClD,CAIA,SAAgBC,EACd,EACoD,CACpD,IAAMC,EAAOR,EAAQ,MAAMS,CAAG,EACxBC,EAAoC,CAAC,EACrCC,EAAmC,CAAC,EAY1C,OAXAH,EAAK,KAAM,GAAS,CAClB,GAAII,EAAK,OAAS,SAChB,OAEF,IAAMT,EAAOE,EAASO,CAAI,EACtBA,EAAK,OAASR,EAAQ,QACxB,EAAUD,GAAQU,EAAWD,CAAI,EACxBA,EAAK,OAASR,EAAQ,SAAWD,IAAS,SACnD,EAASA,GAAQU,EAAWD,CAAI,EAEpC,CAAC,EACM,CAAE,YAAW,UAAS,CAC/B,CAGA,eAAsBE,EACpB,EACA,EACA,EAAgC,CAAC,EACR,CACzB,IAAMN,EAAOR,EAAQ,MAAMS,CAAG,EACxBM,EAA2B,CAAC,EAC5BC,EAAqB,CAAC,EAE5B,IAAK,IAAMC,IAAQ,CAAC,UAAW,SAAS,EAAY,CAClD,IAAMC,EAAQD,IAAS,UAAY,YAAc,WAC3CE,EAAcC,EAAOF,IAAU,CAAC,EAChCG,EAAYC,EAAQ,OAAOJ,IAAU,CAAC,EACtCK,kBAAQ,IAAI,IAAI,CACpB,GAAG,OAAO,KAAKJ,CAAW,EAC1B,GAAG,OAAO,KAAKE,CAAS,CAC1B,CAAC,EAED,IAAK,IAAMlB,KAAQoB,EAAO,CACxB,IAAMC,EAAeL,EAAYhB,GAC3BsB,EAAaJ,EAAUlB,GACvBuB,EAAQC,EAASnB,EAAMS,EAAMd,CAAI,EACjCyB,EAAQ,GAAGV,IAAU,YAAc,WAAa,kBAAkB,GAAGf,IAErE0B,EAAS,MAAMC,EAAM,CACzB,MAAOJ,GAASb,EAAWa,CAAK,EAChC,OAAQF,EACR,KAAMC,EACN,UACA,OACA,OACA,QACA,WACA,IAAM,GAAWM,EAAWvB,EAAMS,EAAMe,CAAM,EAC9C,QAAU,GAAW,CACnB,IAAMC,EAAOC,EAAUF,CAAM,EAC7B,EAAK,KAAK,OAASN,GAAO,KAAK,QAAU,GACzCA,GAAO,YAAYO,CAAI,CACzB,EACA,WAAcP,GAAO,OAAO,CAC9B,CAAC,EACGG,GACFd,EAAQ,KAAK,CAAE,OAAM,OAAM,OAAQc,CAAO,CAAC,CAE/C,CACF,CAEA,MAAO,CAAE,IAAKrB,EAAK,SAAS,EAAG,UAAS,UAAS,CACnD,CAIA,eAAsB2B,EACpB,EACA,EAA2B,CAAC,EAC5B,EAAgC,CAAC,EACR,CACzB,IAAM3B,EAAOR,EAAQ,MAAMS,CAAG,EACxBM,EAA2B,CAAC,EAC5BC,EAAqB,CAAC,EACtBoB,EAAWd,EAAQ,MAAM,MAAQ,CAAC,EAElCe,kBAAY,IAAI,IAAI,CAAC,GAAG,OAAO,KAAKjB,CAAM,EAAG,GAAG,OAAO,KAAKgB,CAAQ,CAAC,CAAC,EAC5E,IAAK,IAAME,KAAYD,EAAW,CAChC,IAAME,EAAcnB,EAAOkB,IAAa,CAAC,EACnCE,EAAYJ,EAASE,IAAa,CAAC,EACnCG,kBAAQ,IAAI,IAAI,CACpB,GAAG,OAAO,KAAKF,CAAW,EAC1B,GAAG,OAAO,KAAKC,CAAS,CAC1B,CAAC,EAED,IAAK,IAAME,KAAQD,EAAO,CACxB,IAAME,EAAQC,EAAcpC,CAAI,EAC5BF,EAAOqC,GAASE,EAAmBF,EAAOL,CAAQ,EAChDQ,EAAcxC,GAAM,MAAM,KAC7B,GAASM,EAAK,OAAS,QAAUA,EAAK,OAAS8B,CAClD,EACMvC,EAAO,GAAGmC,EAAS,KAAKI,EAAK,IAE7Bb,EAAS,MAAMC,EAAM,CACzB,MAAOgB,GAAa,MACpB,OAAQP,EAAYG,GACpB,KAAMF,EAAUE,GAChB,UACA,KAAM,OACN,OACA,MAAO,GAAGA,EAAK,MAAMJ,IACrB,WACA,IAAM,GAAU,CACd,IAASS,EAAevC,EAAM8B,CAAQ,EACtChC,EAAK,OAAON,EAAQ,KAAK,CAAE,OAAM,QAAO,KAAM,CAAE,OAAQ;KAAS,CAAE,CAAC,CAAC,CACvE,EACA,QAAU,GAAU,CACd8C,IACF,EAAY,MAAQE,EAExB,EACA,WAAc,CACZF,GAAa,OAAO,EAChBxC,GAAM,MAAM,SAAW,GACzBA,EAAK,OAAO,CAEhB,CACF,CAAC,EACGuB,GACFd,EAAQ,KAAK,CAAE,KAAM,OAAQ,OAAM,OAAQc,CAAO,CAAC,CAEvD,CACF,CAEA,MAAO,CAAE,IAAKrB,EAAK,SAAS,EAAG,UAAS,UAAS,CACnD,CAGA,eAAesB,EAAM,CACnB,QACA,SACA,OACA,UACA,OACA,OACA,QACA,WACA,MACA,UACA,UAa+C,CA+B/C,OA9BIV,IAAW,IAAA,GAETM,IAAU,IAAA,GACZ,OAEEJ,EAAQ,cAAiB,MAAMA,EAAQ,aAAaL,EAAMd,CAAI,GAChE8C,EAAO,EACA,YAETjC,EAAS,KAAK,GAAGY,EAAM,kDAAkD,EAClE,QAGLF,IAAU,IAAA,GACRwB,IAAS,IAAA,IAIbC,EAAI/B,CAAM,EACH,SAHE,OAMPgC,EAAK1B,EAAON,CAAM,EACb,YAELE,EAAQ,WAAc4B,IAAS,IAAA,IAAaE,EAAK1B,EAAOwB,CAAI,GAC9DG,EAAQjC,CAAM,EACP,YAETJ,EAAS,KAAK,GAAGY,EAAM,sDAAsD,EACtE,OACT,CAEA,SAASD,EACP,EACA,EACA,EACoB,CACpB,OAAOnB,EAAK,MAAM,KACf,GACCI,EAAK,OAAS,UACdA,EAAK,OAASR,EAAQa,IACtBZ,EAASO,CAAI,IAAMT,CACvB,CACF,CAGA,SAAS4B,EAAW,EAAY,EAA6B,EAAgB,CAC3E,IAAMzB,EAAO4B,EAAUF,CAAM,EACvBsB,EAAc9C,EAAK,MAAM,SAC5B,GAASI,EAAK,OAAS,UAAYA,EAAK,OAASR,EAAQ,OAC5D,EACA,GAAIa,IAAS,UAAW,CACtB,IAAMsC,EAAe/C,EAAK,MAAM,KAC7B,GAASI,EAAK,OAAS,UAAYA,EAAK,OAASR,EAAQ,OAC5D,EACA,GAAIkD,EAAa,CACf,EAAK,KAAK,OAAS;EACnBA,EAAY,MAAMhD,CAAI,EACtB,MACF,CACA,GAAIiD,EAAc,CAChB,EAAK,KAAK,OAASA,EAAa,KAAK,QAAU,GAC/C,EAAa,KAAK,OAAS;;EAC3BA,EAAa,OAAOjD,CAAI,EACxB,MACF,CACF,CACA,EAAK,KAAK,OAASE,EAAK,MAAM,OAAS,EAAI;;EAAS,GACpDA,EAAK,OAAOF,CAAI,EAChB,EAAK,KAAK,MAAQ;CACpB,CAEA,SAAS4B,EAAU,EAAwB,CACzC,IAAMtB,EAAOZ,EAAQ,MAAMgC,EAAO,KAAK,CAAC,CAAC,CAAC,MAC1C,GAAIpB,GAAM,OAAS,SACjB,MAAU,MAAM,sBAAsBoB,GAAQ,EAEhD,OAAOpB,CACT,CAGA,SAASC,EAAW,EAAsB,CACxC,IAAM2C,EAAQlD,EAAK,MAAM,EAGzB,MAFA,GAAM,KAAK,OAAS,GAEbkD,EAAM,QAAU,IAAA,GAAY,GAAGA,EAAM,SAAS,EAAE,GAAKA,EAAM,SAAS,CAC7E,CAEA,SAASZ,EAAc,EAAmC,CACxD,OAAOpC,EAAK,MAAM,KACf,GACCI,EAAK,OAAS,UACdA,EAAK,OAAS,SACdA,EAAK,OAAO,KAAK,IAAM,MAC3B,CACF,CAEA,SAASiC,EACP,EACA,EACkB,CAClB,OAAOF,EAAM,OAAO,KACjB,GACC/B,EAAK,OAAS,QACd6C,EAAkB7C,EAAK,QAAQ,IAAM6C,EAAkBnB,CAAQ,CACnE,CACF,CAEA,SAASS,EAAe,EAAY,EAAwB,CAC1D,IAAIJ,EAAQC,EAAcpC,CAAI,EAC1BmC,IAAU,IAAA,KACZ,EAAQ3C,EAAQ,OAAO,CAAE,KAAM,QAAS,OAAQ,MAAO,CAAC,EACxD,EAAM,KAAO,CACX,OAAQQ,EAAK,MAAM,OAAS,EAAI;;EAAS,GACzC,QAAS,IACT,MAAO;CACT,EACAA,EAAK,OAAOmC,CAAK,EACjB,EAAK,KAAK,MAAQ;GAEpB,IAAMrC,EAAON,EAAQ,KAAK,CAAE,UAAS,CAAC,EAStC,MARA,GAAK,KAAO,CACV,QAAS2C,EAAM,OAAO,QAAU,GAAK,EAAI;;IAAW;IACpD,QAAS,IACT,MAAO;IACP,UAAW,EACb,EACAA,EAAM,OAAOrC,CAAI,EACjB,EAAM,KAAK,MAAQ;EACZA,CACT,CAGA,MAAMmD,EAAqB,GAAqBnB,EAAS,QAAQ,UAAW,EAAE,EAE9E,SAASc,EAAK,EAAW,EAAW,CAClC,IAAMM,EAAa,GACjBV,EACG,QAAQ,OAAQ,GAAG,CAAC,CACpB,QAAQ,mBAAoB,IAAI,CAAC,CACjC,QAAQ,MAAO,GAAG,CAAC,CACnB,QAAQ,KAAM,EAAE,CAAC,CACjB,KAAK,EACV,OAAOU,EAAUC,CAAC,IAAMD,EAAUE,CAAC,CACrC,CC7VA,IAAaC,EAAb,cAA0C,KAAM,CACzB,OAArB,YAAY,EAA+B,CACzC,MACE,mBAAmBC,EAChB,KAAK,CAAE,QAAO,OAAM,aAAc,OAAO3D,EAAK,IAAI4D,EAAM,KAAKC,GAAS,CAAC,CACvE,KAAK;CAAI,GACd,EALmB,KAAA,OAAAF,EAMnB,KAAK,KAAO,sBACd,CACF,EAEA,MAEMG,EAAO,WAGPC,EAAa,uBAEbC,kBAAkB,IAAI,IAAI,CAC9B,MACA,OACA,MACA,OACA,MACA,MACA,MACA,QACA,QACA,QACA,WACF,CAAC,EACKC,kBAAiB,IAAI,IAAI,CAAC,OAAQ,MAAO,MAAO,QAAS,KAAK,CAAC,EAE/DC,EAAM,6CACNC,EAAS,6BACTC,EACJ,iIACIC,EAAU,kBACVC,EAAW,gBAGjB,SAAgBC,EAAY,EAAwB,CAIlD,GAHI1B,EAAM,KAAK,IAAM,IAAMA,EAAM,OAAS,KAGtC,CAACkB,EAAW,KAAKlB,CAAK,EACxB,MAAO,GAET,IAAI2B,EAAQ,EACZ,IAAK,IAAMC,KAAQ5B,EAEjB,GADA,GAAS4B,IAAS,IAAM,EAAIA,IAAS,IAAM,GAAK,EAC5CD,EAAQ,EACV,MAAO,GAGX,GAAIA,IAAU,EACZ,MAAO,GAET,IAAK,GAAM,EAAGxE,KAAS6C,EAAM,SAAS,eAAe,EAAG,CAEtD,IAAM6B,EAAK1E,EAAK,YAAY,EAC5B,GAAI0E,IAAO,IAAM,CAACV,EAAgB,IAAIU,CAAE,GAAK,CAACT,EAAe,IAAIS,CAAE,EACjE,MAAO,EAEX,CACA,MAAO,EACT,CAIA,SAAgBC,EAAa,EAA0B,CACrD,IAAMC,EAAU/B,EAAM,KAAK,EAC3B,GAAIqB,EAAI,KAAKU,CAAO,EAClB,MAAO,QAET,GAAIT,EAAO,KAAKS,CAAO,EACrB,MAAO,SAET,GAAIR,EAAO,KAAKQ,CAAO,EACrB,MAAO,SAET,GAAIP,EAAQ,KAAKO,CAAO,EACtB,MAAO,UAET,IAAMF,EAAKE,EAAQ,MAAMN,CAAQ,CAAC,GAAG,EAAE,EAAE,YAAY,EAIrD,OAHII,GAAMV,EAAgB,IAAIU,CAAE,EACvB,QAEF,YACT,CAEA,SAASG,EAAQ,EAAqB,EAAmB,CAKvD,OAJIC,IAAWC,GAAYD,IAAW,cAAgBA,IAAW,WAI1DC,IAAa,UAAYD,IAAW,QAC7C,CASA,SAAgBE,EACd,EACA,CAAE,YAAYlF,GAAuC,CAAC,EACxC,CACd,IAAM6D,EAAuB,CAAC,EAE9B,IAAK,IAAMC,IAAS,CAAC,QAAS,QAAS,MAAM,EAC3C,IAAK,GAAM,CAAC5D,EAAM6C,KAAU,OAAO,QAAQoC,EAAOrB,IAAU,CAAC,CAAC,EAAG,CAC/D,IAAMsB,EAAS,GACbvB,EAAO,KAAK,CAAE,QAAO,OAAM,QAAO,SAAQ,CAAC,EAE7C,GAAI,CAACG,EAAK,KAAK9D,CAAI,EAAG,CACpBkF,EAAM,uBAAuB,EAC7B,QACF,CACA,GAAI,OAAOrC,GAAU,UAAY,CAAC0B,EAAY1B,CAAK,EAAG,CACpDqC,EAAM,2BAA2B,EACjC,QACF,CACA,IAAMH,EACJI,EAAUvB,EAAM,GAAG5D,IACnBmF,EAAU,QAAQnF,IAClBmF,EAAU,OAAOnF,GACnB,GAAI+E,IAAa,IAAA,GACf,SAEF,IAAMK,EAAeT,EAAaI,CAAQ,EACpCM,EAAaV,EAAa9B,CAAK,EACjCuC,IAAiB,cAAgB,CAACP,EAAQO,EAAcC,CAAU,GACpEH,EAAM,cAAcE,EAAa,UAAUC,GAAY,CAE3D,CAGF,OAAO1B,CACT,CCzIA,MAAM2B,EAAuB,CAAC,QAAS,QAAS,MAAM,EAYtD,SAAgBC,EACd,EACA,CAAE,SAA4B,CAAC,EAClB,CACb,IAAMlF,EAAOR,EAAQ,MAAMS,CAAG,EACxB2E,EAAsB,CAAC,EAE7B,IAAK,IAAMrB,KAAS0B,EAAQ,CAC1B,IAAME,EAAkB,CAAC,EACzB5F,EAAUS,EAAMuD,EAAO6B,CAAK,CAAC,EAAE,KAAM,GAAS,CACxChF,EAAK,OAAS,QAAUA,EAAK,KAAK,WAAW,IAAI,IACnD,EAAKA,EAAK,KAAK,MAAM,CAAC,GAAKA,EAAK,MAEpC,CAAC,EACG,OAAO,KAAK+E,CAAI,CAAC,CAAC,OAAS,IAC7B,EAAO5B,GAAS4B,EAEpB,CAEA,GAAIP,EAAO,MAAO,CAChB,GAAM,CAAE,MAAOS,EAAU,CAAC,GAAMlG,EAAkB,CAChD,MAAOyF,EAAO,MACd,KAAMA,EAAO,IACf,CAAC,EACD,IAAK,GAAM,CAACjF,EAAM6C,KAAU,OAAO,QAAQ6C,CAAO,EAC5CT,EAAO,MAAMjF,KAAU6C,GACzB,OAAOoC,EAAO,MAAMjF,GAGpB,OAAO,KAAKiF,EAAO,KAAK,CAAC,CAAC,SAAW,GACvC,OAAOA,EAAO,KAElB,CAEA,OAAOA,CACT,CAMA,eAAsBU,EACpB,EACA,EACA,CACE,YACA,GAAGxE,GAC8D,CAAC,EAC5C,CACxB,IAAMwC,EAASqB,EAAcC,EAAQ,CAAE,WAAU,CAAC,EAClD,GAAItB,EAAO,OAAS,EAClB,MAAM,IAAID,EAAqBC,CAAM,EAEvC,OAAOlE,EAAaa,EAAK2E,EAAQ,CAAE,GAAG9D,EAAS,UAAW,EAAK,CAAC,CAClE,CC/EA,MAAMyE,EACJ,kNAIIC,EACJ,qFAGIC,EACJ,4NAEIC,EAAmB,cACnBC,EAAU,mBAWhB,SAAgBC,EACd,EACA,EAA0B,CAAC,EACb,CACd,IAAMT,kBAAO,IAAI,IACjB,IAAK,IAAMP,IAAU,CAACQ,EAAO,GAAGS,CAAQ,EACtC,IAAK,IAAMtC,IAAS,CAACqB,EAAO,MAAOA,EAAO,IAAI,EAC5C,IAAK,IAAMjF,KAAQ,OAAO,KAAK4D,GAAS,CAAC,CAAC,EACxC4B,EAAK,IAAIxF,CAAI,EAInB,IAAMmG,kBAAS,IAAI,IACnB,IAAK,IAAMnG,KAAQwF,EACjBW,EAAO,IAAInG,EAAMA,CAAI,EAEvB,IAAK,IAAMiF,IAAU,CAACQ,EAAO,GAAGS,CAAQ,EACtC,IAAK,GAAM,CAAClG,EAAM6C,KAAU,OAAO,QAAQoC,EAAO,OAAS,CAAC,CAAC,EAAG,CAC9D,IAAMmB,EAASvD,EAAM,MAAM,qBAAqB,CAAC,GAAG,GAChD7C,EAAK,WAAW,QAAQ,GAAKoG,GAAUZ,EAAK,IAAIY,CAAM,GACxDD,EAAO,IAAInG,EAAK,MAAM,CAAe,EAAGoG,CAAM,CAElD,CAEF,MAAO,CAAE,OAAM,QAAO,CACxB,CAGA,SAAgBC,EACd,EACA,EACU,CACV,IAAMC,kBAAQ,IAAI,IAClB,IAAK,IAAMC,KAAWC,EAAU,CAC9B,IAAK,GAAM,EAAGxG,KAASuG,EAAQ,SAASX,CAAa,EAAG,CACtD,IAAMa,EAAQC,EAAQ,OAAO,IAAI1G,CAAc,EAC3CyG,GACFH,EAAM,IAAIG,CAAK,CAEnB,CACA,IAAK,GAAM,EAAGzG,KAASuG,EAAQ,SAASP,CAAO,EACzCU,EAAQ,KAAK,IAAI1G,CAAc,GACjCsG,EAAM,IAAItG,CAAc,EAGxB0G,EAAQ,KAAK,IAAI,QAAQ,GAAKb,EAAe,KAAKU,CAAO,GAC3DD,EAAM,IAAI,QAAQ,EAGlBI,EAAQ,KAAK,IAAI,SAAS,IACzBZ,EAAgB,KAAKS,CAAO,GAAKR,EAAiB,KAAKQ,CAAO,IAE/DD,EAAM,IAAI,SAAS,CAEvB,CACA,MAAO,CAAC,GAAGA,CAAK,CAAC,CAAC,KAAK,CACzB,C"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@slabui/theme-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "SlabUI theme as CSS variables: read, write, validate and multi-theme helpers",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"author": "André Felipe Schulle <andrefelipeschulle@icloud.com>",
|