@theme-registry/refract-scss 0.1.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/LICENSE +21 -0
- package/dist/index.cjs.js +2 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.esm.js +2 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/types.d.ts +29 -0
- package/package.json +54 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Petyo Stoyanov
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var e=require("@theme-registry/refract");const n={link:":link",visited:":visited",hover:":hover",focus:":focus",active:":active",disabled:"[disabled]",pressed:"[aria-pressed]"},s=Object.keys(n),t=s.reduce((e,n,s)=>(e[n]=s,e),{}),o=e=>e.replace(/[^a-zA-Z0-9]+/g,"-").replace(/^-+|-+$/g,"").toLowerCase(),r=(e,n)=>`$${n}-${e.split(".").map(o).join("-")}`,i=(e,n,s,t)=>[t,e,n,s].map(o).join("-"),l=e=>e.endsWith(".scss")?e:`${e.replace(/\.[^./]+$/,"")}.scss`,a=e=>{const n=l(e),s=n.lastIndexOf("/"),t=s>=0?n.slice(0,s+1):"",o=n.slice(s+1);return`${t}${o.startsWith("_")?o:`_${o}`}`},u=e=>{const n=e.lastIndexOf("/");return e.slice(n+1).replace(/^_/,"").replace(/\.scss$/,"")};exports.createScssAdapter=(o={})=>{var c,d,v;const f=null!==(c=o.prefix)&&void 0!==c?c:"dt",p=null!==(d=o.inline)&&void 0!==d&&d,m=null!==(v=o.indent)&&void 0!==v?v:2,b=" ".repeat(m),h=e=>b.repeat(e),$=!0===o.layer?"refract":"string"==typeof o.layer&&o.layer||void 0,y=e=>{if(!$)return e;const n=e.trimEnd().split("\n").map(e=>e?`${b}${e}`:e).join("\n");return`@layer ${$} {\n${n}\n}\n`},j={name:"scss",version:1,allowedStates:s,bind(s,o){var c,d,v,m,b,j,g;const O=o.media,k=e.buildTokenMap(s),S=e=>{try{return o.resolve(e)}catch{return}},w=(e,n)=>{var s;if("number"!=typeof n)return String(null!=n?n:"");const t=null===(s=k[e])||void 0===s?void 0:s.unit;return t?`${n}${t}`:`${n}`},x=(e,n)=>n?`${n}(${e})`:e,A=(e,n,s)=>Object.entries(e).map(([e,t])=>`${h(n)}${e}: ${((e,n)=>{var s,t,o;if(void 0!==e.ref){const o=null===(s=k[e.ref])||void 0===s?void 0:s.external;return x(void 0!==o?`var(${o})`:n?w(e.ref,null!==(t=S(e.ref))&&void 0!==t?t:e.value):r(e.ref,f),e.wrap)}return x(String(null!==(o=e.value)&&void 0!==o?o:""),e.wrap)})(t,s)};`).join("\n"),E=(e,s,t)=>{var o;const r=null!==(o=e.declarations)&&void 0!==o?o:{},i=e.state?n[e.state]:void 0,l=void 0!==e.breakpoint?(e=>{var n,s,t;const o=e.breakpoint;if(void 0===o)return"";const r=null!==(n=e.query)&&void 0!==n?n:"exact",i=e.orientation;return i?"min"===r?O.min(o,{orientation:i}):"max"===r?O.max(o,{orientation:i}):O.exact(o,{orientation:i}):null!==(t=null===(s=O[o])||void 0===s?void 0:s[r])&&void 0!==t?t:""})(e):void 0;if(!Object.keys(r).length)return"";if(void 0!==e.breakpoint&&!l)return"";const a=[],u=[];let c=s;return l&&(a.push(`${h(c)}${l} {`),u.unshift(`${h(c)}}`),c+=1),i&&(a.push(`${h(c)}&${i} {`),u.unshift(`${h(c)}}`),c+=1),[...a,A(r,c,t),...u].join("\n")},R=e=>[...e].sort((e,n)=>{var s,o;const r=void 0!==e.breakpoint?1:0,i=void 0!==n.breakpoint?1:0;if(r!==i)return r-i;return(e.state?null!==(s=t[e.state])&&void 0!==s?s:99:-1)-(n.state?null!==(o=t[n.state])&&void 0!==o?o:99:-1)}),C=(e,n,s,t)=>{const o=[`${e} {`],r=A(n,1,t);r&&o.push(r);for(const e of R(s)){const n=E(e,1,t);n&&o.push(n)}return o.push("}"),o.join("\n")},B={};for(const[e,n]of Object.entries(s.subsystems))if("components"!==e&&"globals"!==e)for(const[s,t]of Object.entries(null!==(c=n.ruleSets)&&void 0!==c?c:{}))for(const n of Object.keys(t))null!==(v=(g=null!==(d=B[e])&&void 0!==d?d:B[e]={})[s])&&void 0!==v||(g[s]={}),B[e][s][n]=i(e,s,n,f);const V={},W=s.subsystems.components;if(W)for(const[n,s]of Object.entries(null!==(m=W.ruleSets)&&void 0!==m?m:{}))for(const[t,o]of Object.entries(s)){const s=i("components",n,t,f),r=(null!==(b=o.references)&&void 0!==b?b:[]).map(n=>{var s,t;const o=e.parseRuleSetReference(n);return o?null===(t=null===(s=B[o.subsystem])||void 0===s?void 0:s[o.group])||void 0===t?void 0:t[o.variant]:void 0}).filter(e=>void 0!==e),l=[...r,s];(null!==(j=V[n])&&void 0!==j?j:V[n]={})[t]={className:l.join(" "),classList:l}}const _=e=>{var n;if(p)return"";const s=`${e}.`,t=[];for(const[e,o]of Object.entries(k)){if(!e.startsWith(s))continue;if(void 0!==o.external)continue;const i=null!==(n=S(e))&&void 0!==n?n:o.value;void 0!==i&&t.push(`${r(e,f)}: ${w(e,i)};`)}return t.join("\n")},q=(e,n,t,o)=>{var r,l,a,u,c,d;const v=null===(a=null===(l=null===(r=s.subsystems[e])||void 0===r?void 0:r.ruleSets)||void 0===l?void 0:l[n])||void 0===a?void 0:a[t];if(!v)return"";if("globals"===v.kind)return((e,n)=>{var s,t;const o=[`${null!==(s=e.selector)&&void 0!==s?s:"*"} {`],r=A(e.declarations,1,n);r&&o.push(r);for(const s of R(e.overrides)){const e=E(s,1,n);e&&o.push(e)}for(const[s,r]of Object.entries(null!==(t=e.variants)&&void 0!==t?t:{})){const e=[`${h(1)}&.${s} {`],t=A(r.declarations,2,n);t&&e.push(t);for(const s of R(r.overrides)){const t=E(s,2,n);t&&e.push(t)}e.push(`${h(1)}}`),o.push(e.join("\n"))}return o.push("}"),o.join("\n")})(v,o);if("reset"===v.kind){const e=null!==(u=v.selector)&&void 0!==u?u:"*";return C(`:where(${e})`,v.declarations,v.overrides,o)}const p="components"===e?i("components",n,t,f):null===(d=null===(c=B[e])||void 0===c?void 0:c[n])||void 0===d?void 0:d[t];return p?C(`.${p}`,v.declarations,v.overrides,o):""},I=()=>Object.keys(s.subsystems).map(_).filter(Boolean).join("\n\n"),L=()=>{var e;const n=[];for(const[t,o]of Object.entries(s.subsystems))for(const[s,r]of Object.entries(null!==(e=o.ruleSets)&&void 0!==e?e:{}))for(const e of Object.keys(r)){const o=q(t,s,e,p);o&&n.push(o)}return n.join("\n\n")},N=()=>[I(),L()].filter(Boolean).join("\n\n");return{recipeName(e,n,t){var o,r,l,a,u,c;const d=null===(l=null===(r=null===(o=s.subsystems[e])||void 0===o?void 0:o.ruleSets)||void 0===r?void 0:r[n])||void 0===l?void 0:l[t];return"reset"===(null==d?void 0:d.kind)||"globals"===(null==d?void 0:d.kind)?"":"components"===e?i("components",n,t,f):null!==(c=null===(u=null===(a=B[e])||void 0===a?void 0:a[n])||void 0===u?void 0:u[t])&&void 0!==c?c:""},describeUsage(){var e,n,t,o;const r=[];for(const[l,a]of Object.entries(s.subsystems))for(const[s,u]of Object.entries(null!==(e=a.ruleSets)&&void 0!==e?e:{}))for(const[e,a]of Object.entries(u)){if("reset"===(null==a?void 0:a.kind)||"globals"===(null==a?void 0:a.kind))continue;const u="components"===l?i("components",s,e,f):null!==(o=null===(t=null===(n=B[l])||void 0===n?void 0:n[s])||void 0===t?void 0:t[e])&&void 0!==o?o:"";u&&r.push({subsystem:l,group:s,variant:e,name:u})}return{format:"scss",summary:["This theme is emitted as Sass partials: a `$`-variables layer plus recipe rules that compile to CSS classes.",'Pull it into your Sass entry with `@use`: `@use "theme" as *;` (or `@use "variables" as *;` for just the tokens), then compile to CSS.','Apply the recipe class names below to your markup: `<button class="<class>">`. Values resolve through Sass variables (or baked literals under the `inline` option).'],recipes:r}},renderRecipe:(e,n,s)=>q(e,n,s,p),renderVariables:e=>_(e),join:e=>e.filter(Boolean).join("\n\n"),renderAllVariables:I,renderAllRecipes:L,renderAll:N,extend:()=>({media:O,get scss(){return y(N())},get variablesScss(){return I()},get rulesScss(){return L()},get classes(){return(()=>{const e={};for(const[n,s]of Object.entries(B)){const t={};for(const[e,n]of Object.entries(s))t[e]={...n};e[n]=t}return W&&(e.components=V),e})()}}),emit(n){var t,o,c,d,v,m;const b=null!==(t=null==n?void 0:n.type)&&void 0!==t?t:"single";if($&&"single"!==b)throw new Error(`scss adapter: the \`layer\` option is only supported with single-file emit (got "${b}").`);if("single"===b){const e="single"===(null==n?void 0:n.type)?n.file:"theme.scss";return{files:{[l(e)]:y(N())}}}if(p&&("split"===b||"subsystem"===b))throw new Error(`scss adapter: emit mode '${b}' cannot be combined with the global inline option (inline bakes values, leaving no $variables file)`);if("split"===(null==n?void 0:n.type)){const e=a(n.variables),s=l(n.file),t=`@use "${u(e)}" as *;\n\n${L()}`;return{files:{[s]:t,[e]:I()}}}if("subsystem"===(null==n?void 0:n.type))throw new Error("scss adapter: emit mode 'subsystem' is not supported yet");if("components"===(null==n?void 0:n.type)){const t=null!==(c=null===(o=s.subsystems.components)||void 0===o?void 0:o.ruleSets)&&void 0!==c?c:{},p=n.inline,b={},h=[],$=new Set;for(const[o,r]of Object.entries(t))for(const t of Object.keys(r)){const r=e.mergeComponentRuleSet(s,o,t),a=`.${i("components",o,t,f)}`,u=[...Object.entries(r.states).map(([e,n])=>({state:e,declarations:n})),...r.responsive.map(e=>{const{declarations:n,...s}=e;return{...s,declarations:n}})],c=C(a,r.base,u,p),v=l(n.filename({group:o,variant:t}));if((null!==(d=b[v])&&void 0!==d?d:b[v]=[]).push(c),!p)for(const e of r.referencedPaths)$.has(e)||($.add(e),h.push(e))}const y={},j=!p&&h.length>0&&!1!==n.variables;for(const[e,s]of Object.entries(b)){const t=s.join("\n\n");y[e]=j?`@use "${u(a(n.variables))}" as *;\n\n${t}`:t}if(!p&&!1!==n.variables){const e=[];for(const n of h){const s=null!==(v=S(n))&&void 0!==v?v:null===(m=k[n])||void 0===m?void 0:m.value;void 0!==s&&e.push(`${r(n,f)}: ${w(n,s)};`)}e.length&&(y[a(n.variables)]=e.join("\n"))}return{files:y}}throw new Error(`scss adapter: emit mode '${b}' not yet implemented`)}}}};return e.defineAdapter(j)};
|
|
2
|
+
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/index.ts"],"sourcesContent":["/**\n * The SCSS adapter — lowers the format-neutral {@link ThemeModel} to idiomatic Sass.\n *\n * The third output adapter. Like CSS its `TUnit` is `string`, but the output is genuinely a\n * different format: tokens become compile-time **`$variables`** (not `:root` custom properties),\n * declaration refs render as **`$dt-…`** (not `var(--…)`), and each rule-set nests its\n * state/breakpoint overrides with `&` / `@media` the Sass way. Recipes are emitted as **classes**\n * and composition is the option-C **class list** (as in the CSS adapter) — the same class surface,\n * generated from Sass source.\n *\n * Naming is uniform + path-based (`$dt-<subsystem>-<path>`, `.dt-<subsystem>-<group>-<variant>`) —\n * SCSS is its own format, so it does not chase the CSS adapter's byte-for-byte variable/class names.\n *\n * KNOWN LIMITATION (inherent to compile-time Sass variables): `$variables` capture each token's\n * BASE value only. Responsive / appearance-mode *token* variation — which the CSS adapter emits as\n * `@media { :root { --x: … } }` custom-property reassignments — cannot be expressed as a `$variable`\n * (a Sass var is not media-conditional). Recipe-level breakpoint overrides, which re-emit whole\n * declarations, are fully supported via nested `@media`.\n *\n * Worked reference: `src/adapters/css/`. Core stays format-agnostic; all naming + state handling live here.\n */\nimport type { Literal, Ref, RuleSet, RuleSetOverride, ThemeModel } from \"@theme-registry/refract\";\nimport { buildTokenMap, mergeComponentRuleSet, parseRuleSetReference } from \"@theme-registry/refract\";\nimport type { MergedRuleSet } from \"@theme-registry/refract\";\nimport type { MediaDescriptor, MediaVariant } from \"@theme-registry/refract\";\nimport type { AdapterSpec, RenderContext, ThemeAdapter, UsageDescriptor, UsageRecipe } from \"@theme-registry/refract\";\nimport { defineAdapter } from \"@theme-registry/refract\";\nimport type { ResolvedComponentClass, ScssAdapterOptions, ScssUnit } from \"./types\";\n\nexport type { ResolvedComponentClass, ScssAdapterOptions, ScssUnit } from \"./types\";\n\n/** `state → selector suffix`, nested as `&<suffix>`. SCSS compiles to CSS, so it knows the CSS states. */\nconst SCSS_STATE_SELECTORS: Record<string, string> = {\n link: \":link\",\n visited: \":visited\",\n hover: \":hover\",\n focus: \":focus\",\n active: \":active\",\n disabled: \"[disabled]\",\n pressed: \"[aria-pressed]\",\n};\nconst SCSS_KNOWN_STATES: ReadonlyArray<string> = Object.keys(SCSS_STATE_SELECTORS);\nconst STATE_ORDER: Record<string, number> = SCSS_KNOWN_STATES.reduce<Record<string, number>>(\n (acc, s, i) => ((acc[s] = i), acc),\n {},\n);\n\n/** Sanitize one identifier segment to `[a-z0-9-]` (drops `.` / `--` collisions to single dashes). */\nconst sanitizeSegment = (segment: string): string =>\n segment.replace(/[^a-zA-Z0-9]+/g, \"-\").replace(/^-+|-+$/g, \"\").toLowerCase();\n\n/** `$dt-colors-primary-dark` from a token path + prefix. */\nconst scssVarName = (path: string, prefix: string): string =>\n `$${prefix}-${path.split(\".\").map(sanitizeSegment).join(\"-\")}`;\n\n/** `dt-colors-solid-primary` from an address + prefix (no leading dot). */\nconst scssClassName = (subsystem: string, group: string, variant: string, prefix: string): string =>\n [prefix, subsystem, group, variant].map(sanitizeSegment).join(\"-\");\n\n/** Normalize a filename to a `.scss` extension (plan defaults are CSS-centric). */\nconst scssName = (name: string): string =>\n name.endsWith(\".scss\") ? name : `${name.replace(/\\.[^./]+$/, \"\")}.scss`;\n\n/** Turn a filename into a Sass partial (`_name.scss`) for `@use`. */\nconst scssPartial = (name: string): string => {\n const scss = scssName(name);\n const slash = scss.lastIndexOf(\"/\");\n const dir = slash >= 0 ? scss.slice(0, slash + 1) : \"\";\n const base = scss.slice(slash + 1);\n return `${dir}${base.startsWith(\"_\") ? base : `_${base}`}`;\n};\n\n/** The `@use` reference for a partial — its basename without leading `_` or `.scss`. */\nconst useRef = (partial: string): string => {\n const slash = partial.lastIndexOf(\"/\");\n return partial\n .slice(slash + 1)\n .replace(/^_/, \"\")\n .replace(/\\.scss$/, \"\");\n};\n\nexport const createScssAdapter = (options: ScssAdapterOptions = {}): ThemeAdapter<ScssUnit> => {\n const prefix = options.prefix ?? \"dt\";\n const optionInline = options.inline ?? false;\n const indentWidth = options.indent ?? 2;\n const IND = \" \".repeat(indentWidth);\n const pad = (level: number): string => IND.repeat(level);\n // §W9 — optional cascade-layer wrap for the full-document output (single emit + runtime `scss`).\n const layerName =\n options.layer === true ? \"refract\" : (typeof options.layer === \"string\" && options.layer) || undefined;\n const wrapLayer = (scss: string): string => {\n if (!layerName) return scss;\n const body = scss\n .trimEnd()\n .split(\"\\n\")\n .map(line => (line ? `${IND}${line}` : line))\n .join(\"\\n\");\n return `@layer ${layerName} {\\n${body}\\n}\\n`;\n };\n\n const spec: AdapterSpec<ScssUnit> = {\n name: \"scss\",\n version: 1,\n // SCSS compiles to CSS, so it renders the same state selectors CSS does.\n allowedStates: SCSS_KNOWN_STATES,\n bind(model: ThemeModel, ctx: RenderContext) {\n const media = ctx.media;\n const tokenMap = buildTokenMap(model);\n\n const safeResolve = (path: string): Literal | undefined => {\n try {\n return ctx.resolve(path);\n } catch {\n return undefined;\n }\n };\n\n /**\n * A token value → its SCSS text. §21: length units are resolved format-neutrally in core and baked\n * onto the leaf's `Ref.unit`; a numeric length token appends its resolved unit (looked up on the\n * token map), everything else (unit-less numbers, colours, strings) passes through raw.\n */\n const formatTokenValue = (path: string, value: Literal | undefined): string => {\n if (typeof value !== \"number\") return String(value ?? \"\");\n const unit = tokenMap[path]?.unit;\n return unit ? `${value}${unit}` : `${value}`;\n };\n\n const applyWrap = (value: string, wrap?: string): string => (wrap ? `${wrap}(${value})` : value);\n\n /** Render one declaration value: a `$var` ref (default), or a baked literal (inline). */\n const renderValue = (ref: Ref, inline: boolean): string => {\n if (ref.ref !== undefined) {\n // §W6b — an external token has no `$var`; reference the parent's CSS variable directly.\n const external = tokenMap[ref.ref]?.external;\n if (external !== undefined) return applyWrap(`var(${external})`, ref.wrap);\n if (inline) return applyWrap(formatTokenValue(ref.ref, safeResolve(ref.ref) ?? ref.value), ref.wrap);\n return applyWrap(scssVarName(ref.ref, prefix), ref.wrap);\n }\n return applyWrap(String(ref.value ?? \"\"), ref.wrap);\n };\n\n const renderDeclarations = (decls: Record<string, Ref>, level: number, inline: boolean): string =>\n Object.entries(decls)\n .map(([property, ref]) => `${pad(level)}${property}: ${renderValue(ref, inline)};`)\n .join(\"\\n\");\n\n /** The full `@media (…)` at-rule for a viewport override (empty when unresolved). The core media\n * descriptor already includes the `@media` keyword, so it is used verbatim as the block prelude. */\n const mediaQueryFor = (override: Pick<RuleSetOverride, \"breakpoint\" | \"query\" | \"orientation\">): string => {\n const breakpoint = override.breakpoint;\n if (breakpoint === undefined) return \"\";\n const query = (override.query ?? \"exact\") as MediaVariant;\n const orientation = override.orientation;\n if (!orientation) return (media as MediaDescriptor<string>)[breakpoint]?.[query] ?? \"\";\n if (query === \"min\") return media.min(breakpoint, { orientation });\n if (query === \"max\") return media.max(breakpoint, { orientation });\n return media.exact(breakpoint, { orientation });\n };\n\n /** One override → its nested block (`&:hover { … }`, `@media (…) { … }`, or both). */\n const renderOverride = (override: RuleSetOverride, level: number, inline: boolean): string => {\n const decls = override.declarations ?? {};\n const stateSuffix = override.state ? SCSS_STATE_SELECTORS[override.state] : undefined;\n const atRule = override.breakpoint !== undefined ? mediaQueryFor(override) : undefined;\n // Nothing renderable (e.g. a pure variant/target swap — not expressible in a $var recipe class).\n if (!Object.keys(decls).length) return \"\";\n if (override.breakpoint !== undefined && !atRule) return \"\";\n\n const open: string[] = [];\n const close: string[] = [];\n let cur = level;\n if (atRule) {\n open.push(`${pad(cur)}${atRule} {`);\n close.unshift(`${pad(cur)}}`);\n cur += 1;\n }\n if (stateSuffix) {\n open.push(`${pad(cur)}&${stateSuffix} {`);\n close.unshift(`${pad(cur)}}`);\n cur += 1;\n }\n return [...open, renderDeclarations(decls, cur, inline), ...close].join(\"\\n\");\n };\n\n /** Order overrides: canonical state order, base-state (no bp) before responsive. */\n const orderOverrides = (overrides: RuleSetOverride[]): RuleSetOverride[] =>\n [...overrides].sort((a, b) => {\n const abp = a.breakpoint !== undefined ? 1 : 0;\n const bbp = b.breakpoint !== undefined ? 1 : 0;\n if (abp !== bbp) return abp - bbp;\n const as = a.state ? STATE_ORDER[a.state] ?? 99 : -1;\n const bs = b.state ? STATE_ORDER[b.state] ?? 99 : -1;\n return as - bs;\n });\n\n /** Render a `{ declarations, overrides }` block under a selector (recipe class / reset selector). */\n const renderRuleSet = (\n selector: string,\n declarations: Record<string, Ref>,\n overrides: RuleSetOverride[],\n inline: boolean,\n ): string => {\n const parts: string[] = [`${selector} {`];\n const base = renderDeclarations(declarations, 1, inline);\n if (base) parts.push(base);\n for (const override of orderOverrides(overrides)) {\n const block = renderOverride(override, 1, inline);\n if (block) parts.push(block);\n }\n parts.push(`}`);\n return parts.join(\"\\n\");\n };\n\n /**\n * Render a themed globals element (§9) `kind:\"globals\"` rule-set → a bare, nested SCSS block:\n * `selector { <decls>; <&:state / @media overrides>; &.<variant> { <delta>; <overrides> } }`.\n * Unlike the preset `:where()` reset layer, the selector is bare (higher tier) and each\n * delta-only variant nests as `&.<variant>`.\n */\n const renderGlobalsElement = (ruleSet: RuleSet, inline: boolean): string => {\n const selector = ruleSet.selector ?? \"*\";\n const parts: string[] = [`${selector} {`];\n const base = renderDeclarations(ruleSet.declarations, 1, inline);\n if (base) parts.push(base);\n for (const override of orderOverrides(ruleSet.overrides)) {\n const block = renderOverride(override, 1, inline);\n if (block) parts.push(block);\n }\n for (const [variantName, variant] of Object.entries(ruleSet.variants ?? {})) {\n const vparts: string[] = [`${pad(1)}&.${variantName} {`];\n const vbase = renderDeclarations(variant.declarations, 2, inline);\n if (vbase) vparts.push(vbase);\n for (const override of orderOverrides(variant.overrides)) {\n const block = renderOverride(override, 2, inline);\n if (block) vparts.push(block);\n }\n vparts.push(`${pad(1)}}`);\n parts.push(vparts.join(\"\\n\"));\n }\n parts.push(`}`);\n return parts.join(\"\\n\");\n };\n\n // ── Precompute class names for every recipe/utility variant (components' class list needs\n // sibling classes) — mirrors the CSS adapter's `selectors` map. ──\n const selectors: Record<string, Record<string, Record<string, string>>> = {};\n for (const [subsystem, subModel] of Object.entries(model.subsystems)) {\n if (subsystem === \"components\" || subsystem === \"globals\") continue;\n for (const [group, ruleSetGroup] of Object.entries(subModel.ruleSets ?? {})) {\n for (const variant of Object.keys(ruleSetGroup)) {\n (selectors[subsystem] ??= {})[group] ??= {};\n selectors[subsystem][group][variant] = scssClassName(subsystem, group, variant, prefix);\n }\n }\n }\n\n // ── Components: option-C class list (referenced recipe classes + own delta class). ──\n const componentClasses: Record<string, Record<string, ResolvedComponentClass>> = {};\n const components = model.subsystems.components;\n if (components) {\n for (const [group, ruleSetGroup] of Object.entries(components.ruleSets ?? {})) {\n for (const [variant, ruleSet] of Object.entries(ruleSetGroup)) {\n const ownClass = scssClassName(\"components\", group, variant, prefix);\n const referenced = (ruleSet.references ?? [])\n .map(reference => {\n const parsed = parseRuleSetReference(reference);\n return parsed ? selectors[parsed.subsystem]?.[parsed.group]?.[parsed.variant] : undefined;\n })\n .filter((cls): cls is string => cls !== undefined);\n const classList = [...referenced, ownClass];\n (componentClasses[group] ??= {})[variant] = { className: classList.join(\" \"), classList };\n }\n }\n }\n\n // ── Primitives ──\n const renderVariablesFor = (subsystem: string): string => {\n // Inline bakes values into declarations, so there are no `$variables` to define.\n if (optionInline) return \"\";\n const prefixDot = `${subsystem}.`;\n const lines: string[] = [];\n for (const [path, ref] of Object.entries(tokenMap)) {\n if (!path.startsWith(prefixDot)) continue;\n if (ref.external !== undefined) continue; // §W6b — parent owns the var; define no `$var`\n const value = safeResolve(path) ?? ref.value;\n if (value === undefined) continue;\n lines.push(`${scssVarName(path, prefix)}: ${formatTokenValue(path, value)};`);\n }\n return lines.join(\"\\n\");\n };\n\n const renderRecipeFor = (subsystem: string, group: string, variant: string, inline: boolean): string => {\n const ruleSet = model.subsystems[subsystem]?.ruleSets?.[group]?.[variant];\n if (!ruleSet) return \"\";\n if (ruleSet.kind === \"globals\") {\n return renderGlobalsElement(ruleSet, inline);\n }\n if (ruleSet.kind === \"reset\") {\n const target = ruleSet.selector ?? \"*\";\n return renderRuleSet(`:where(${target})`, ruleSet.declarations, ruleSet.overrides, inline);\n }\n const cls =\n subsystem === \"components\"\n ? scssClassName(\"components\", group, variant, prefix)\n : selectors[subsystem]?.[group]?.[variant];\n if (!cls) return \"\";\n return renderRuleSet(`.${cls}`, ruleSet.declarations, ruleSet.overrides, inline);\n };\n\n // Aggregate builders (reused by the aggregators, `extend`, and `emit`).\n const allVariables = (): string =>\n Object.keys(model.subsystems)\n .map(renderVariablesFor)\n .filter(Boolean)\n .join(\"\\n\\n\");\n\n const allRecipes = (): string => {\n const parts: string[] = [];\n for (const [subsystem, subModel] of Object.entries(model.subsystems)) {\n for (const [group, ruleSetGroup] of Object.entries(subModel.ruleSets ?? {})) {\n for (const variant of Object.keys(ruleSetGroup)) {\n const rule = renderRecipeFor(subsystem, group, variant, optionInline);\n if (rule) parts.push(rule);\n }\n }\n }\n return parts.join(\"\\n\\n\");\n };\n\n const allScss = (): string => [allVariables(), allRecipes()].filter(Boolean).join(\"\\n\\n\");\n\n const collectClasses = (): Record<string, Record<string, Record<string, unknown>>> => {\n const out: Record<string, Record<string, Record<string, unknown>>> = {};\n for (const [subsystem, groups] of Object.entries(selectors)) {\n const g: Record<string, Record<string, string>> = {};\n for (const [group, variants] of Object.entries(groups)) g[group] = { ...variants };\n out[subsystem] = g;\n }\n if (components) out.components = componentClasses;\n return out;\n };\n\n return {\n recipeName(subsystem, group, variant) {\n const ruleSet = model.subsystems[subsystem]?.ruleSets?.[group]?.[variant];\n if (ruleSet?.kind === \"reset\" || ruleSet?.kind === \"globals\") return \"\";\n if (subsystem === \"components\") return scssClassName(\"components\", group, variant, prefix);\n return selectors[subsystem]?.[group]?.[variant] ?? \"\";\n },\n\n // Self-documentation: the REAL class names recipes compile to (globals/reset carry no class),\n // plus Sass-specific `@use` prose for the emitted guide (llms.txt).\n describeUsage(): UsageDescriptor {\n const recipes: UsageRecipe[] = [];\n for (const [subsystem, sub] of Object.entries(model.subsystems)) {\n for (const [group, ruleSetGroup] of Object.entries(sub.ruleSets ?? {})) {\n for (const [variant, ruleSet] of Object.entries(ruleSetGroup)) {\n if (ruleSet?.kind === \"reset\" || ruleSet?.kind === \"globals\") continue;\n const name =\n subsystem === \"components\"\n ? scssClassName(\"components\", group, variant, prefix)\n : selectors[subsystem]?.[group]?.[variant] ?? \"\";\n if (name) recipes.push({ subsystem, group, variant, name });\n }\n }\n }\n return {\n format: \"scss\",\n summary: [\n \"This theme is emitted as Sass partials: a `$`-variables layer plus recipe rules that compile to CSS classes.\",\n 'Pull it into your Sass entry with `@use`: `@use \"theme\" as *;` (or `@use \"variables\" as *;` for just the tokens), then compile to CSS.',\n 'Apply the recipe class names below to your markup: `<button class=\"<class>\">`. Values resolve through Sass variables (or baked literals under the `inline` option).',\n ],\n recipes,\n };\n },\n renderRecipe(subsystem, group, variant) {\n return renderRecipeFor(subsystem, group, variant, optionInline);\n },\n renderVariables(subsystem) {\n return renderVariablesFor(subsystem);\n },\n join(parts) {\n return parts.filter(Boolean).join(\"\\n\\n\");\n },\n\n // The full document is variables-then-rules; override so the aggregate ordering is explicit.\n renderAllVariables: allVariables,\n renderAllRecipes: allRecipes,\n renderAll: allScss,\n\n extend() {\n return {\n media,\n get scss() {\n return wrapLayer(allScss());\n },\n get variablesScss() {\n return allVariables();\n },\n get rulesScss() {\n return allRecipes();\n },\n get classes() {\n return collectClasses();\n },\n };\n },\n\n emit(plan) {\n const type = plan?.type ?? \"single\";\n\n // §W9 — `layer` wraps one self-contained document; multi-file modes split the cascade.\n if (layerName && type !== \"single\") {\n throw new Error(\n `scss adapter: the \\`layer\\` option is only supported with single-file emit (got \"${type}\").`,\n );\n }\n\n if (type === \"single\") {\n const file = plan?.type === \"single\" ? plan.file : \"theme.scss\";\n return { files: { [scssName(file)]: wrapLayer(allScss()) } };\n }\n\n // Baking values leaves no `$variables` to split out — contradicts every multi-file mode.\n if (optionInline && (type === \"split\" || type === \"subsystem\")) {\n throw new Error(\n `scss adapter: emit mode '${type}' cannot be combined with the global inline option ` +\n `(inline bakes values, leaving no $variables file)`,\n );\n }\n\n if (plan?.type === \"split\") {\n // A `_variables.scss` partial + a rules file that `@use`s it (Sass module system — NOT\n // the banned `@import`), so the rules' `$dt-…` refs resolve.\n const varsFile = scssPartial(plan.variables);\n const rulesFile = scssName(plan.file);\n const rules = `@use \"${useRef(varsFile)}\" as *;\\n\\n${allRecipes()}`;\n return { files: { [rulesFile]: rules, [varsFile]: allVariables() } };\n }\n\n if (plan?.type === \"subsystem\") {\n // Per-subsystem Sass files need cross-subsystem `@use` wiring (a component `@use`s the\n // colors/typography/… partials it composes). Deferred — a clear, honest v1 boundary.\n throw new Error(\"scss adapter: emit mode 'subsystem' is not supported yet\");\n }\n\n if (plan?.type === \"components\") {\n // Each component variant → one self-contained class (its merged declarations). `inline`\n // (default true) bakes values; `inline: false` keeps `$var` refs + a tree-shaken partial.\n const componentRuleSets = model.subsystems.components?.ruleSets ?? {};\n const inline = plan.inline;\n\n const filesByName: Record<string, string[]> = {};\n const referencedPaths: string[] = [];\n const seen = new Set<string>();\n\n for (const [group, ruleSetGroup] of Object.entries(componentRuleSets)) {\n for (const variant of Object.keys(ruleSetGroup)) {\n const merged = mergeComponentRuleSet(model, group, variant);\n const selector = `.${scssClassName(\"components\", group, variant, prefix)}`;\n // Flatten the merged view into a rule-set shape renderRuleSet understands.\n const overrides: RuleSetOverride[] = [\n ...Object.entries(merged.states).map(([state, declarations]) => ({ state, declarations })),\n ...merged.responsive.map(entry => {\n const { declarations, ...condition } = entry;\n return { ...condition, declarations } as RuleSetOverride;\n }),\n ];\n const rule = renderRuleSet(selector, merged.base, overrides, inline);\n const filename = scssName(plan.filename({ group, variant }));\n (filesByName[filename] ??= []).push(rule);\n\n if (!inline) {\n for (const path of merged.referencedPaths) {\n if (!seen.has(path)) {\n seen.add(path);\n referencedPaths.push(path);\n }\n }\n }\n }\n }\n\n const files: Record<string, string> = {};\n const usesVars = !inline && referencedPaths.length > 0 && plan.variables !== false;\n for (const [name, parts] of Object.entries(filesByName)) {\n const body = parts.join(\"\\n\\n\");\n files[name] = usesVars ? `@use \"${useRef(scssPartial(plan.variables as string))}\" as *;\\n\\n${body}` : body;\n }\n\n // Tree-shaken variables partial — only the referenced token paths — unless `variables: false`.\n if (!inline && plan.variables !== false) {\n const lines: string[] = [];\n for (const path of referencedPaths) {\n const value = safeResolve(path) ?? tokenMap[path]?.value;\n if (value === undefined) continue;\n lines.push(`${scssVarName(path, prefix)}: ${formatTokenValue(path, value)};`);\n }\n if (lines.length) files[scssPartial(plan.variables)] = lines.join(\"\\n\");\n }\n\n return { files };\n }\n\n throw new Error(`scss adapter: emit mode '${type}' not yet implemented`);\n },\n };\n },\n };\n\n return defineAdapter(spec);\n};\n"],"names":["SCSS_STATE_SELECTORS","link","visited","hover","focus","active","disabled","pressed","SCSS_KNOWN_STATES","Object","keys","STATE_ORDER","reduce","acc","s","i","sanitizeSegment","segment","replace","toLowerCase","scssVarName","path","prefix","split","map","join","scssClassName","subsystem","group","variant","scssName","name","endsWith","scssPartial","scss","slash","lastIndexOf","dir","slice","base","startsWith","useRef","partial","options","_a","optionInline","_b","inline","indentWidth","_c","indent","IND","repeat","pad","level","layerName","layer","undefined","wrapLayer","body","trimEnd","line","spec","version","allowedStates","bind","model","ctx","media","tokenMap","buildTokenMap","safeResolve","resolve","formatTokenValue","value","String","unit","applyWrap","wrap","renderDeclarations","decls","entries","property","ref","external","renderValue","renderOverride","override","declarations","stateSuffix","state","atRule","breakpoint","query","orientation","min","max","exact","mediaQueryFor","length","open","close","cur","push","unshift","orderOverrides","overrides","sort","a","b","abp","bbp","renderRuleSet","selector","parts","block","selectors","subModel","subsystems","ruleSetGroup","ruleSets","_g","componentClasses","components","_d","ruleSet","ownClass","referenced","_e","references","reference","parsed","parseRuleSetReference","filter","cls","classList","_f","className","renderVariablesFor","prefixDot","lines","renderRecipeFor","kind","variantName","variants","vparts","vbase","renderGlobalsElement","target","allVariables","Boolean","allRecipes","rule","allScss","recipeName","describeUsage","recipes","sub","format","summary","renderRecipe","renderVariables","renderAllVariables","renderAllRecipes","renderAll","extend","variablesScss","rulesScss","classes","out","groups","g","collectClasses","emit","plan","type","Error","file","files","varsFile","variables","rulesFile","rules","componentRuleSets","filesByName","referencedPaths","seen","Set","merged","mergeComponentRuleSet","states","responsive","entry","condition","filename","has","add","usesVars","defineAdapter"],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ThemeAdapter } from "@theme-registry/refract";
|
|
2
|
+
import type { ScssAdapterOptions, ScssUnit } from "./types";
|
|
3
|
+
export type { ResolvedComponentClass, ScssAdapterOptions, ScssUnit } from "./types";
|
|
4
|
+
export declare const createScssAdapter: (options?: ScssAdapterOptions) => ThemeAdapter<ScssUnit>;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{defineAdapter as e,buildTokenMap as n,parseRuleSetReference as s,mergeComponentRuleSet as t}from"@theme-registry/refract";const o={link:":link",visited:":visited",hover:":hover",focus:":focus",active:":active",disabled:"[disabled]",pressed:"[aria-pressed]"},r=Object.keys(o),i=r.reduce((e,n,s)=>(e[n]=s,e),{}),l=e=>e.replace(/[^a-zA-Z0-9]+/g,"-").replace(/^-+|-+$/g,"").toLowerCase(),a=(e,n)=>`$${n}-${e.split(".").map(l).join("-")}`,u=(e,n,s,t)=>[t,e,n,s].map(l).join("-"),c=e=>e.endsWith(".scss")?e:`${e.replace(/\.[^./]+$/,"")}.scss`,d=e=>{const n=c(e),s=n.lastIndexOf("/"),t=s>=0?n.slice(0,s+1):"",o=n.slice(s+1);return`${t}${o.startsWith("_")?o:`_${o}`}`},v=e=>{const n=e.lastIndexOf("/");return e.slice(n+1).replace(/^_/,"").replace(/\.scss$/,"")},f=(l={})=>{var f,p,m;const b=null!==(f=l.prefix)&&void 0!==f?f:"dt",h=null!==(p=l.inline)&&void 0!==p&&p,$=null!==(m=l.indent)&&void 0!==m?m:2,y=" ".repeat($),j=e=>y.repeat(e),g=!0===l.layer?"refract":"string"==typeof l.layer&&l.layer||void 0,O=e=>{if(!g)return e;const n=e.trimEnd().split("\n").map(e=>e?`${y}${e}`:e).join("\n");return`@layer ${g} {\n${n}\n}\n`},k={name:"scss",version:1,allowedStates:r,bind(e,r){var l,f,p,m,$,y,k;const S=r.media,w=n(e),x=e=>{try{return r.resolve(e)}catch{return}},A=(e,n)=>{var s;if("number"!=typeof n)return String(null!=n?n:"");const t=null===(s=w[e])||void 0===s?void 0:s.unit;return t?`${n}${t}`:`${n}`},E=(e,n)=>n?`${n}(${e})`:e,B=(e,n,s)=>Object.entries(e).map(([e,t])=>`${j(n)}${e}: ${((e,n)=>{var s,t,o;if(void 0!==e.ref){const o=null===(s=w[e.ref])||void 0===s?void 0:s.external;return E(void 0!==o?`var(${o})`:n?A(e.ref,null!==(t=x(e.ref))&&void 0!==t?t:e.value):a(e.ref,b),e.wrap)}return E(String(null!==(o=e.value)&&void 0!==o?o:""),e.wrap)})(t,s)};`).join("\n"),C=(e,n,s)=>{var t;const r=null!==(t=e.declarations)&&void 0!==t?t:{},i=e.state?o[e.state]:void 0,l=void 0!==e.breakpoint?(e=>{var n,s,t;const o=e.breakpoint;if(void 0===o)return"";const r=null!==(n=e.query)&&void 0!==n?n:"exact",i=e.orientation;return i?"min"===r?S.min(o,{orientation:i}):"max"===r?S.max(o,{orientation:i}):S.exact(o,{orientation:i}):null!==(t=null===(s=S[o])||void 0===s?void 0:s[r])&&void 0!==t?t:""})(e):void 0;if(!Object.keys(r).length)return"";if(void 0!==e.breakpoint&&!l)return"";const a=[],u=[];let c=n;return l&&(a.push(`${j(c)}${l} {`),u.unshift(`${j(c)}}`),c+=1),i&&(a.push(`${j(c)}&${i} {`),u.unshift(`${j(c)}}`),c+=1),[...a,B(r,c,s),...u].join("\n")},V=e=>[...e].sort((e,n)=>{var s,t;const o=void 0!==e.breakpoint?1:0,r=void 0!==n.breakpoint?1:0;if(o!==r)return o-r;return(e.state?null!==(s=i[e.state])&&void 0!==s?s:99:-1)-(n.state?null!==(t=i[n.state])&&void 0!==t?t:99:-1)}),W=(e,n,s,t)=>{const o=[`${e} {`],r=B(n,1,t);r&&o.push(r);for(const e of V(s)){const n=C(e,1,t);n&&o.push(n)}return o.push("}"),o.join("\n")},_={};for(const[n,s]of Object.entries(e.subsystems))if("components"!==n&&"globals"!==n)for(const[e,t]of Object.entries(null!==(l=s.ruleSets)&&void 0!==l?l:{}))for(const s of Object.keys(t))null!==(p=(k=null!==(f=_[n])&&void 0!==f?f:_[n]={})[e])&&void 0!==p||(k[e]={}),_[n][e][s]=u(n,e,s,b);const I={},L=e.subsystems.components;if(L)for(const[e,n]of Object.entries(null!==(m=L.ruleSets)&&void 0!==m?m:{}))for(const[t,o]of Object.entries(n)){const n=u("components",e,t,b),r=(null!==($=o.references)&&void 0!==$?$:[]).map(e=>{var n,t;const o=s(e);return o?null===(t=null===(n=_[o.subsystem])||void 0===n?void 0:n[o.group])||void 0===t?void 0:t[o.variant]:void 0}).filter(e=>void 0!==e),i=[...r,n];(null!==(y=I[e])&&void 0!==y?y:I[e]={})[t]={className:i.join(" "),classList:i}}const N=e=>{var n;if(h)return"";const s=`${e}.`,t=[];for(const[e,o]of Object.entries(w)){if(!e.startsWith(s))continue;if(void 0!==o.external)continue;const r=null!==(n=x(e))&&void 0!==n?n:o.value;void 0!==r&&t.push(`${a(e,b)}: ${A(e,r)};`)}return t.join("\n")},P=(n,s,t,o)=>{var r,i,l,a,c,d;const v=null===(l=null===(i=null===(r=e.subsystems[n])||void 0===r?void 0:r.ruleSets)||void 0===i?void 0:i[s])||void 0===l?void 0:l[t];if(!v)return"";if("globals"===v.kind)return((e,n)=>{var s,t;const o=[`${null!==(s=e.selector)&&void 0!==s?s:"*"} {`],r=B(e.declarations,1,n);r&&o.push(r);for(const s of V(e.overrides)){const e=C(s,1,n);e&&o.push(e)}for(const[s,r]of Object.entries(null!==(t=e.variants)&&void 0!==t?t:{})){const e=[`${j(1)}&.${s} {`],t=B(r.declarations,2,n);t&&e.push(t);for(const s of V(r.overrides)){const t=C(s,2,n);t&&e.push(t)}e.push(`${j(1)}}`),o.push(e.join("\n"))}return o.push("}"),o.join("\n")})(v,o);if("reset"===v.kind){const e=null!==(a=v.selector)&&void 0!==a?a:"*";return W(`:where(${e})`,v.declarations,v.overrides,o)}const f="components"===n?u("components",s,t,b):null===(d=null===(c=_[n])||void 0===c?void 0:c[s])||void 0===d?void 0:d[t];return f?W(`.${f}`,v.declarations,v.overrides,o):""},R=()=>Object.keys(e.subsystems).map(N).filter(Boolean).join("\n\n"),q=()=>{var n;const s=[];for(const[t,o]of Object.entries(e.subsystems))for(const[e,r]of Object.entries(null!==(n=o.ruleSets)&&void 0!==n?n:{}))for(const n of Object.keys(r)){const o=P(t,e,n,h);o&&s.push(o)}return s.join("\n\n")},z=()=>[R(),q()].filter(Boolean).join("\n\n");return{recipeName(n,s,t){var o,r,i,l,a,c;const d=null===(i=null===(r=null===(o=e.subsystems[n])||void 0===o?void 0:o.ruleSets)||void 0===r?void 0:r[s])||void 0===i?void 0:i[t];return"reset"===(null==d?void 0:d.kind)||"globals"===(null==d?void 0:d.kind)?"":"components"===n?u("components",s,t,b):null!==(c=null===(a=null===(l=_[n])||void 0===l?void 0:l[s])||void 0===a?void 0:a[t])&&void 0!==c?c:""},describeUsage(){var n,s,t,o;const r=[];for(const[i,l]of Object.entries(e.subsystems))for(const[e,a]of Object.entries(null!==(n=l.ruleSets)&&void 0!==n?n:{}))for(const[n,l]of Object.entries(a)){if("reset"===(null==l?void 0:l.kind)||"globals"===(null==l?void 0:l.kind))continue;const a="components"===i?u("components",e,n,b):null!==(o=null===(t=null===(s=_[i])||void 0===s?void 0:s[e])||void 0===t?void 0:t[n])&&void 0!==o?o:"";a&&r.push({subsystem:i,group:e,variant:n,name:a})}return{format:"scss",summary:["This theme is emitted as Sass partials: a `$`-variables layer plus recipe rules that compile to CSS classes.",'Pull it into your Sass entry with `@use`: `@use "theme" as *;` (or `@use "variables" as *;` for just the tokens), then compile to CSS.','Apply the recipe class names below to your markup: `<button class="<class>">`. Values resolve through Sass variables (or baked literals under the `inline` option).'],recipes:r}},renderRecipe:(e,n,s)=>P(e,n,s,h),renderVariables:e=>N(e),join:e=>e.filter(Boolean).join("\n\n"),renderAllVariables:R,renderAllRecipes:q,renderAll:z,extend:()=>({media:S,get scss(){return O(z())},get variablesScss(){return R()},get rulesScss(){return q()},get classes(){return(()=>{const e={};for(const[n,s]of Object.entries(_)){const t={};for(const[e,n]of Object.entries(s))t[e]={...n};e[n]=t}return L&&(e.components=I),e})()}}),emit(n){var s,o,r,i,l,f;const p=null!==(s=null==n?void 0:n.type)&&void 0!==s?s:"single";if(g&&"single"!==p)throw new Error(`scss adapter: the \`layer\` option is only supported with single-file emit (got "${p}").`);if("single"===p){const e="single"===(null==n?void 0:n.type)?n.file:"theme.scss";return{files:{[c(e)]:O(z())}}}if(h&&("split"===p||"subsystem"===p))throw new Error(`scss adapter: emit mode '${p}' cannot be combined with the global inline option (inline bakes values, leaving no $variables file)`);if("split"===(null==n?void 0:n.type)){const e=d(n.variables),s=c(n.file),t=`@use "${v(e)}" as *;\n\n${q()}`;return{files:{[s]:t,[e]:R()}}}if("subsystem"===(null==n?void 0:n.type))throw new Error("scss adapter: emit mode 'subsystem' is not supported yet");if("components"===(null==n?void 0:n.type)){const s=null!==(r=null===(o=e.subsystems.components)||void 0===o?void 0:o.ruleSets)&&void 0!==r?r:{},p=n.inline,m={},h=[],$=new Set;for(const[o,r]of Object.entries(s))for(const s of Object.keys(r)){const r=t(e,o,s),l=`.${u("components",o,s,b)}`,a=[...Object.entries(r.states).map(([e,n])=>({state:e,declarations:n})),...r.responsive.map(e=>{const{declarations:n,...s}=e;return{...s,declarations:n}})],d=W(l,r.base,a,p),v=c(n.filename({group:o,variant:s}));if((null!==(i=m[v])&&void 0!==i?i:m[v]=[]).push(d),!p)for(const e of r.referencedPaths)$.has(e)||($.add(e),h.push(e))}const y={},j=!p&&h.length>0&&!1!==n.variables;for(const[e,s]of Object.entries(m)){const t=s.join("\n\n");y[e]=j?`@use "${v(d(n.variables))}" as *;\n\n${t}`:t}if(!p&&!1!==n.variables){const e=[];for(const n of h){const s=null!==(l=x(n))&&void 0!==l?l:null===(f=w[n])||void 0===f?void 0:f.value;void 0!==s&&e.push(`${a(n,b)}: ${A(n,s)};`)}e.length&&(y[d(n.variables)]=e.join("\n"))}return{files:y}}throw new Error(`scss adapter: emit mode '${p}' not yet implemented`)}}}};return e(k)};export{f as createScssAdapter};
|
|
2
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/index.ts"],"sourcesContent":["/**\n * The SCSS adapter — lowers the format-neutral {@link ThemeModel} to idiomatic Sass.\n *\n * The third output adapter. Like CSS its `TUnit` is `string`, but the output is genuinely a\n * different format: tokens become compile-time **`$variables`** (not `:root` custom properties),\n * declaration refs render as **`$dt-…`** (not `var(--…)`), and each rule-set nests its\n * state/breakpoint overrides with `&` / `@media` the Sass way. Recipes are emitted as **classes**\n * and composition is the option-C **class list** (as in the CSS adapter) — the same class surface,\n * generated from Sass source.\n *\n * Naming is uniform + path-based (`$dt-<subsystem>-<path>`, `.dt-<subsystem>-<group>-<variant>`) —\n * SCSS is its own format, so it does not chase the CSS adapter's byte-for-byte variable/class names.\n *\n * KNOWN LIMITATION (inherent to compile-time Sass variables): `$variables` capture each token's\n * BASE value only. Responsive / appearance-mode *token* variation — which the CSS adapter emits as\n * `@media { :root { --x: … } }` custom-property reassignments — cannot be expressed as a `$variable`\n * (a Sass var is not media-conditional). Recipe-level breakpoint overrides, which re-emit whole\n * declarations, are fully supported via nested `@media`.\n *\n * Worked reference: `src/adapters/css/`. Core stays format-agnostic; all naming + state handling live here.\n */\nimport type { Literal, Ref, RuleSet, RuleSetOverride, ThemeModel } from \"@theme-registry/refract\";\nimport { buildTokenMap, mergeComponentRuleSet, parseRuleSetReference } from \"@theme-registry/refract\";\nimport type { MergedRuleSet } from \"@theme-registry/refract\";\nimport type { MediaDescriptor, MediaVariant } from \"@theme-registry/refract\";\nimport type { AdapterSpec, RenderContext, ThemeAdapter, UsageDescriptor, UsageRecipe } from \"@theme-registry/refract\";\nimport { defineAdapter } from \"@theme-registry/refract\";\nimport type { ResolvedComponentClass, ScssAdapterOptions, ScssUnit } from \"./types\";\n\nexport type { ResolvedComponentClass, ScssAdapterOptions, ScssUnit } from \"./types\";\n\n/** `state → selector suffix`, nested as `&<suffix>`. SCSS compiles to CSS, so it knows the CSS states. */\nconst SCSS_STATE_SELECTORS: Record<string, string> = {\n link: \":link\",\n visited: \":visited\",\n hover: \":hover\",\n focus: \":focus\",\n active: \":active\",\n disabled: \"[disabled]\",\n pressed: \"[aria-pressed]\",\n};\nconst SCSS_KNOWN_STATES: ReadonlyArray<string> = Object.keys(SCSS_STATE_SELECTORS);\nconst STATE_ORDER: Record<string, number> = SCSS_KNOWN_STATES.reduce<Record<string, number>>(\n (acc, s, i) => ((acc[s] = i), acc),\n {},\n);\n\n/** Sanitize one identifier segment to `[a-z0-9-]` (drops `.` / `--` collisions to single dashes). */\nconst sanitizeSegment = (segment: string): string =>\n segment.replace(/[^a-zA-Z0-9]+/g, \"-\").replace(/^-+|-+$/g, \"\").toLowerCase();\n\n/** `$dt-colors-primary-dark` from a token path + prefix. */\nconst scssVarName = (path: string, prefix: string): string =>\n `$${prefix}-${path.split(\".\").map(sanitizeSegment).join(\"-\")}`;\n\n/** `dt-colors-solid-primary` from an address + prefix (no leading dot). */\nconst scssClassName = (subsystem: string, group: string, variant: string, prefix: string): string =>\n [prefix, subsystem, group, variant].map(sanitizeSegment).join(\"-\");\n\n/** Normalize a filename to a `.scss` extension (plan defaults are CSS-centric). */\nconst scssName = (name: string): string =>\n name.endsWith(\".scss\") ? name : `${name.replace(/\\.[^./]+$/, \"\")}.scss`;\n\n/** Turn a filename into a Sass partial (`_name.scss`) for `@use`. */\nconst scssPartial = (name: string): string => {\n const scss = scssName(name);\n const slash = scss.lastIndexOf(\"/\");\n const dir = slash >= 0 ? scss.slice(0, slash + 1) : \"\";\n const base = scss.slice(slash + 1);\n return `${dir}${base.startsWith(\"_\") ? base : `_${base}`}`;\n};\n\n/** The `@use` reference for a partial — its basename without leading `_` or `.scss`. */\nconst useRef = (partial: string): string => {\n const slash = partial.lastIndexOf(\"/\");\n return partial\n .slice(slash + 1)\n .replace(/^_/, \"\")\n .replace(/\\.scss$/, \"\");\n};\n\nexport const createScssAdapter = (options: ScssAdapterOptions = {}): ThemeAdapter<ScssUnit> => {\n const prefix = options.prefix ?? \"dt\";\n const optionInline = options.inline ?? false;\n const indentWidth = options.indent ?? 2;\n const IND = \" \".repeat(indentWidth);\n const pad = (level: number): string => IND.repeat(level);\n // §W9 — optional cascade-layer wrap for the full-document output (single emit + runtime `scss`).\n const layerName =\n options.layer === true ? \"refract\" : (typeof options.layer === \"string\" && options.layer) || undefined;\n const wrapLayer = (scss: string): string => {\n if (!layerName) return scss;\n const body = scss\n .trimEnd()\n .split(\"\\n\")\n .map(line => (line ? `${IND}${line}` : line))\n .join(\"\\n\");\n return `@layer ${layerName} {\\n${body}\\n}\\n`;\n };\n\n const spec: AdapterSpec<ScssUnit> = {\n name: \"scss\",\n version: 1,\n // SCSS compiles to CSS, so it renders the same state selectors CSS does.\n allowedStates: SCSS_KNOWN_STATES,\n bind(model: ThemeModel, ctx: RenderContext) {\n const media = ctx.media;\n const tokenMap = buildTokenMap(model);\n\n const safeResolve = (path: string): Literal | undefined => {\n try {\n return ctx.resolve(path);\n } catch {\n return undefined;\n }\n };\n\n /**\n * A token value → its SCSS text. §21: length units are resolved format-neutrally in core and baked\n * onto the leaf's `Ref.unit`; a numeric length token appends its resolved unit (looked up on the\n * token map), everything else (unit-less numbers, colours, strings) passes through raw.\n */\n const formatTokenValue = (path: string, value: Literal | undefined): string => {\n if (typeof value !== \"number\") return String(value ?? \"\");\n const unit = tokenMap[path]?.unit;\n return unit ? `${value}${unit}` : `${value}`;\n };\n\n const applyWrap = (value: string, wrap?: string): string => (wrap ? `${wrap}(${value})` : value);\n\n /** Render one declaration value: a `$var` ref (default), or a baked literal (inline). */\n const renderValue = (ref: Ref, inline: boolean): string => {\n if (ref.ref !== undefined) {\n // §W6b — an external token has no `$var`; reference the parent's CSS variable directly.\n const external = tokenMap[ref.ref]?.external;\n if (external !== undefined) return applyWrap(`var(${external})`, ref.wrap);\n if (inline) return applyWrap(formatTokenValue(ref.ref, safeResolve(ref.ref) ?? ref.value), ref.wrap);\n return applyWrap(scssVarName(ref.ref, prefix), ref.wrap);\n }\n return applyWrap(String(ref.value ?? \"\"), ref.wrap);\n };\n\n const renderDeclarations = (decls: Record<string, Ref>, level: number, inline: boolean): string =>\n Object.entries(decls)\n .map(([property, ref]) => `${pad(level)}${property}: ${renderValue(ref, inline)};`)\n .join(\"\\n\");\n\n /** The full `@media (…)` at-rule for a viewport override (empty when unresolved). The core media\n * descriptor already includes the `@media` keyword, so it is used verbatim as the block prelude. */\n const mediaQueryFor = (override: Pick<RuleSetOverride, \"breakpoint\" | \"query\" | \"orientation\">): string => {\n const breakpoint = override.breakpoint;\n if (breakpoint === undefined) return \"\";\n const query = (override.query ?? \"exact\") as MediaVariant;\n const orientation = override.orientation;\n if (!orientation) return (media as MediaDescriptor<string>)[breakpoint]?.[query] ?? \"\";\n if (query === \"min\") return media.min(breakpoint, { orientation });\n if (query === \"max\") return media.max(breakpoint, { orientation });\n return media.exact(breakpoint, { orientation });\n };\n\n /** One override → its nested block (`&:hover { … }`, `@media (…) { … }`, or both). */\n const renderOverride = (override: RuleSetOverride, level: number, inline: boolean): string => {\n const decls = override.declarations ?? {};\n const stateSuffix = override.state ? SCSS_STATE_SELECTORS[override.state] : undefined;\n const atRule = override.breakpoint !== undefined ? mediaQueryFor(override) : undefined;\n // Nothing renderable (e.g. a pure variant/target swap — not expressible in a $var recipe class).\n if (!Object.keys(decls).length) return \"\";\n if (override.breakpoint !== undefined && !atRule) return \"\";\n\n const open: string[] = [];\n const close: string[] = [];\n let cur = level;\n if (atRule) {\n open.push(`${pad(cur)}${atRule} {`);\n close.unshift(`${pad(cur)}}`);\n cur += 1;\n }\n if (stateSuffix) {\n open.push(`${pad(cur)}&${stateSuffix} {`);\n close.unshift(`${pad(cur)}}`);\n cur += 1;\n }\n return [...open, renderDeclarations(decls, cur, inline), ...close].join(\"\\n\");\n };\n\n /** Order overrides: canonical state order, base-state (no bp) before responsive. */\n const orderOverrides = (overrides: RuleSetOverride[]): RuleSetOverride[] =>\n [...overrides].sort((a, b) => {\n const abp = a.breakpoint !== undefined ? 1 : 0;\n const bbp = b.breakpoint !== undefined ? 1 : 0;\n if (abp !== bbp) return abp - bbp;\n const as = a.state ? STATE_ORDER[a.state] ?? 99 : -1;\n const bs = b.state ? STATE_ORDER[b.state] ?? 99 : -1;\n return as - bs;\n });\n\n /** Render a `{ declarations, overrides }` block under a selector (recipe class / reset selector). */\n const renderRuleSet = (\n selector: string,\n declarations: Record<string, Ref>,\n overrides: RuleSetOverride[],\n inline: boolean,\n ): string => {\n const parts: string[] = [`${selector} {`];\n const base = renderDeclarations(declarations, 1, inline);\n if (base) parts.push(base);\n for (const override of orderOverrides(overrides)) {\n const block = renderOverride(override, 1, inline);\n if (block) parts.push(block);\n }\n parts.push(`}`);\n return parts.join(\"\\n\");\n };\n\n /**\n * Render a themed globals element (§9) `kind:\"globals\"` rule-set → a bare, nested SCSS block:\n * `selector { <decls>; <&:state / @media overrides>; &.<variant> { <delta>; <overrides> } }`.\n * Unlike the preset `:where()` reset layer, the selector is bare (higher tier) and each\n * delta-only variant nests as `&.<variant>`.\n */\n const renderGlobalsElement = (ruleSet: RuleSet, inline: boolean): string => {\n const selector = ruleSet.selector ?? \"*\";\n const parts: string[] = [`${selector} {`];\n const base = renderDeclarations(ruleSet.declarations, 1, inline);\n if (base) parts.push(base);\n for (const override of orderOverrides(ruleSet.overrides)) {\n const block = renderOverride(override, 1, inline);\n if (block) parts.push(block);\n }\n for (const [variantName, variant] of Object.entries(ruleSet.variants ?? {})) {\n const vparts: string[] = [`${pad(1)}&.${variantName} {`];\n const vbase = renderDeclarations(variant.declarations, 2, inline);\n if (vbase) vparts.push(vbase);\n for (const override of orderOverrides(variant.overrides)) {\n const block = renderOverride(override, 2, inline);\n if (block) vparts.push(block);\n }\n vparts.push(`${pad(1)}}`);\n parts.push(vparts.join(\"\\n\"));\n }\n parts.push(`}`);\n return parts.join(\"\\n\");\n };\n\n // ── Precompute class names for every recipe/utility variant (components' class list needs\n // sibling classes) — mirrors the CSS adapter's `selectors` map. ──\n const selectors: Record<string, Record<string, Record<string, string>>> = {};\n for (const [subsystem, subModel] of Object.entries(model.subsystems)) {\n if (subsystem === \"components\" || subsystem === \"globals\") continue;\n for (const [group, ruleSetGroup] of Object.entries(subModel.ruleSets ?? {})) {\n for (const variant of Object.keys(ruleSetGroup)) {\n (selectors[subsystem] ??= {})[group] ??= {};\n selectors[subsystem][group][variant] = scssClassName(subsystem, group, variant, prefix);\n }\n }\n }\n\n // ── Components: option-C class list (referenced recipe classes + own delta class). ──\n const componentClasses: Record<string, Record<string, ResolvedComponentClass>> = {};\n const components = model.subsystems.components;\n if (components) {\n for (const [group, ruleSetGroup] of Object.entries(components.ruleSets ?? {})) {\n for (const [variant, ruleSet] of Object.entries(ruleSetGroup)) {\n const ownClass = scssClassName(\"components\", group, variant, prefix);\n const referenced = (ruleSet.references ?? [])\n .map(reference => {\n const parsed = parseRuleSetReference(reference);\n return parsed ? selectors[parsed.subsystem]?.[parsed.group]?.[parsed.variant] : undefined;\n })\n .filter((cls): cls is string => cls !== undefined);\n const classList = [...referenced, ownClass];\n (componentClasses[group] ??= {})[variant] = { className: classList.join(\" \"), classList };\n }\n }\n }\n\n // ── Primitives ──\n const renderVariablesFor = (subsystem: string): string => {\n // Inline bakes values into declarations, so there are no `$variables` to define.\n if (optionInline) return \"\";\n const prefixDot = `${subsystem}.`;\n const lines: string[] = [];\n for (const [path, ref] of Object.entries(tokenMap)) {\n if (!path.startsWith(prefixDot)) continue;\n if (ref.external !== undefined) continue; // §W6b — parent owns the var; define no `$var`\n const value = safeResolve(path) ?? ref.value;\n if (value === undefined) continue;\n lines.push(`${scssVarName(path, prefix)}: ${formatTokenValue(path, value)};`);\n }\n return lines.join(\"\\n\");\n };\n\n const renderRecipeFor = (subsystem: string, group: string, variant: string, inline: boolean): string => {\n const ruleSet = model.subsystems[subsystem]?.ruleSets?.[group]?.[variant];\n if (!ruleSet) return \"\";\n if (ruleSet.kind === \"globals\") {\n return renderGlobalsElement(ruleSet, inline);\n }\n if (ruleSet.kind === \"reset\") {\n const target = ruleSet.selector ?? \"*\";\n return renderRuleSet(`:where(${target})`, ruleSet.declarations, ruleSet.overrides, inline);\n }\n const cls =\n subsystem === \"components\"\n ? scssClassName(\"components\", group, variant, prefix)\n : selectors[subsystem]?.[group]?.[variant];\n if (!cls) return \"\";\n return renderRuleSet(`.${cls}`, ruleSet.declarations, ruleSet.overrides, inline);\n };\n\n // Aggregate builders (reused by the aggregators, `extend`, and `emit`).\n const allVariables = (): string =>\n Object.keys(model.subsystems)\n .map(renderVariablesFor)\n .filter(Boolean)\n .join(\"\\n\\n\");\n\n const allRecipes = (): string => {\n const parts: string[] = [];\n for (const [subsystem, subModel] of Object.entries(model.subsystems)) {\n for (const [group, ruleSetGroup] of Object.entries(subModel.ruleSets ?? {})) {\n for (const variant of Object.keys(ruleSetGroup)) {\n const rule = renderRecipeFor(subsystem, group, variant, optionInline);\n if (rule) parts.push(rule);\n }\n }\n }\n return parts.join(\"\\n\\n\");\n };\n\n const allScss = (): string => [allVariables(), allRecipes()].filter(Boolean).join(\"\\n\\n\");\n\n const collectClasses = (): Record<string, Record<string, Record<string, unknown>>> => {\n const out: Record<string, Record<string, Record<string, unknown>>> = {};\n for (const [subsystem, groups] of Object.entries(selectors)) {\n const g: Record<string, Record<string, string>> = {};\n for (const [group, variants] of Object.entries(groups)) g[group] = { ...variants };\n out[subsystem] = g;\n }\n if (components) out.components = componentClasses;\n return out;\n };\n\n return {\n recipeName(subsystem, group, variant) {\n const ruleSet = model.subsystems[subsystem]?.ruleSets?.[group]?.[variant];\n if (ruleSet?.kind === \"reset\" || ruleSet?.kind === \"globals\") return \"\";\n if (subsystem === \"components\") return scssClassName(\"components\", group, variant, prefix);\n return selectors[subsystem]?.[group]?.[variant] ?? \"\";\n },\n\n // Self-documentation: the REAL class names recipes compile to (globals/reset carry no class),\n // plus Sass-specific `@use` prose for the emitted guide (llms.txt).\n describeUsage(): UsageDescriptor {\n const recipes: UsageRecipe[] = [];\n for (const [subsystem, sub] of Object.entries(model.subsystems)) {\n for (const [group, ruleSetGroup] of Object.entries(sub.ruleSets ?? {})) {\n for (const [variant, ruleSet] of Object.entries(ruleSetGroup)) {\n if (ruleSet?.kind === \"reset\" || ruleSet?.kind === \"globals\") continue;\n const name =\n subsystem === \"components\"\n ? scssClassName(\"components\", group, variant, prefix)\n : selectors[subsystem]?.[group]?.[variant] ?? \"\";\n if (name) recipes.push({ subsystem, group, variant, name });\n }\n }\n }\n return {\n format: \"scss\",\n summary: [\n \"This theme is emitted as Sass partials: a `$`-variables layer plus recipe rules that compile to CSS classes.\",\n 'Pull it into your Sass entry with `@use`: `@use \"theme\" as *;` (or `@use \"variables\" as *;` for just the tokens), then compile to CSS.',\n 'Apply the recipe class names below to your markup: `<button class=\"<class>\">`. Values resolve through Sass variables (or baked literals under the `inline` option).',\n ],\n recipes,\n };\n },\n renderRecipe(subsystem, group, variant) {\n return renderRecipeFor(subsystem, group, variant, optionInline);\n },\n renderVariables(subsystem) {\n return renderVariablesFor(subsystem);\n },\n join(parts) {\n return parts.filter(Boolean).join(\"\\n\\n\");\n },\n\n // The full document is variables-then-rules; override so the aggregate ordering is explicit.\n renderAllVariables: allVariables,\n renderAllRecipes: allRecipes,\n renderAll: allScss,\n\n extend() {\n return {\n media,\n get scss() {\n return wrapLayer(allScss());\n },\n get variablesScss() {\n return allVariables();\n },\n get rulesScss() {\n return allRecipes();\n },\n get classes() {\n return collectClasses();\n },\n };\n },\n\n emit(plan) {\n const type = plan?.type ?? \"single\";\n\n // §W9 — `layer` wraps one self-contained document; multi-file modes split the cascade.\n if (layerName && type !== \"single\") {\n throw new Error(\n `scss adapter: the \\`layer\\` option is only supported with single-file emit (got \"${type}\").`,\n );\n }\n\n if (type === \"single\") {\n const file = plan?.type === \"single\" ? plan.file : \"theme.scss\";\n return { files: { [scssName(file)]: wrapLayer(allScss()) } };\n }\n\n // Baking values leaves no `$variables` to split out — contradicts every multi-file mode.\n if (optionInline && (type === \"split\" || type === \"subsystem\")) {\n throw new Error(\n `scss adapter: emit mode '${type}' cannot be combined with the global inline option ` +\n `(inline bakes values, leaving no $variables file)`,\n );\n }\n\n if (plan?.type === \"split\") {\n // A `_variables.scss` partial + a rules file that `@use`s it (Sass module system — NOT\n // the banned `@import`), so the rules' `$dt-…` refs resolve.\n const varsFile = scssPartial(plan.variables);\n const rulesFile = scssName(plan.file);\n const rules = `@use \"${useRef(varsFile)}\" as *;\\n\\n${allRecipes()}`;\n return { files: { [rulesFile]: rules, [varsFile]: allVariables() } };\n }\n\n if (plan?.type === \"subsystem\") {\n // Per-subsystem Sass files need cross-subsystem `@use` wiring (a component `@use`s the\n // colors/typography/… partials it composes). Deferred — a clear, honest v1 boundary.\n throw new Error(\"scss adapter: emit mode 'subsystem' is not supported yet\");\n }\n\n if (plan?.type === \"components\") {\n // Each component variant → one self-contained class (its merged declarations). `inline`\n // (default true) bakes values; `inline: false` keeps `$var` refs + a tree-shaken partial.\n const componentRuleSets = model.subsystems.components?.ruleSets ?? {};\n const inline = plan.inline;\n\n const filesByName: Record<string, string[]> = {};\n const referencedPaths: string[] = [];\n const seen = new Set<string>();\n\n for (const [group, ruleSetGroup] of Object.entries(componentRuleSets)) {\n for (const variant of Object.keys(ruleSetGroup)) {\n const merged = mergeComponentRuleSet(model, group, variant);\n const selector = `.${scssClassName(\"components\", group, variant, prefix)}`;\n // Flatten the merged view into a rule-set shape renderRuleSet understands.\n const overrides: RuleSetOverride[] = [\n ...Object.entries(merged.states).map(([state, declarations]) => ({ state, declarations })),\n ...merged.responsive.map(entry => {\n const { declarations, ...condition } = entry;\n return { ...condition, declarations } as RuleSetOverride;\n }),\n ];\n const rule = renderRuleSet(selector, merged.base, overrides, inline);\n const filename = scssName(plan.filename({ group, variant }));\n (filesByName[filename] ??= []).push(rule);\n\n if (!inline) {\n for (const path of merged.referencedPaths) {\n if (!seen.has(path)) {\n seen.add(path);\n referencedPaths.push(path);\n }\n }\n }\n }\n }\n\n const files: Record<string, string> = {};\n const usesVars = !inline && referencedPaths.length > 0 && plan.variables !== false;\n for (const [name, parts] of Object.entries(filesByName)) {\n const body = parts.join(\"\\n\\n\");\n files[name] = usesVars ? `@use \"${useRef(scssPartial(plan.variables as string))}\" as *;\\n\\n${body}` : body;\n }\n\n // Tree-shaken variables partial — only the referenced token paths — unless `variables: false`.\n if (!inline && plan.variables !== false) {\n const lines: string[] = [];\n for (const path of referencedPaths) {\n const value = safeResolve(path) ?? tokenMap[path]?.value;\n if (value === undefined) continue;\n lines.push(`${scssVarName(path, prefix)}: ${formatTokenValue(path, value)};`);\n }\n if (lines.length) files[scssPartial(plan.variables)] = lines.join(\"\\n\");\n }\n\n return { files };\n }\n\n throw new Error(`scss adapter: emit mode '${type}' not yet implemented`);\n },\n };\n },\n };\n\n return defineAdapter(spec);\n};\n"],"names":["SCSS_STATE_SELECTORS","link","visited","hover","focus","active","disabled","pressed","SCSS_KNOWN_STATES","Object","keys","STATE_ORDER","reduce","acc","s","i","sanitizeSegment","segment","replace","toLowerCase","scssVarName","path","prefix","split","map","join","scssClassName","subsystem","group","variant","scssName","name","endsWith","scssPartial","scss","slash","lastIndexOf","dir","slice","base","startsWith","useRef","partial","createScssAdapter","options","_a","optionInline","_b","inline","indentWidth","_c","indent","IND","repeat","pad","level","layerName","layer","undefined","wrapLayer","body","trimEnd","line","spec","version","allowedStates","bind","model","ctx","media","tokenMap","buildTokenMap","safeResolve","resolve","formatTokenValue","value","String","unit","applyWrap","wrap","renderDeclarations","decls","entries","property","ref","external","renderValue","renderOverride","override","declarations","stateSuffix","state","atRule","breakpoint","query","orientation","min","max","exact","mediaQueryFor","length","open","close","cur","push","unshift","orderOverrides","overrides","sort","a","b","abp","bbp","renderRuleSet","selector","parts","block","selectors","subModel","subsystems","ruleSetGroup","ruleSets","_g","componentClasses","components","_d","ruleSet","ownClass","referenced","_e","references","reference","parsed","parseRuleSetReference","filter","cls","classList","_f","className","renderVariablesFor","prefixDot","lines","renderRecipeFor","kind","variantName","variants","vparts","vbase","renderGlobalsElement","target","allVariables","Boolean","allRecipes","rule","allScss","recipeName","describeUsage","recipes","sub","format","summary","renderRecipe","renderVariables","renderAllVariables","renderAllRecipes","renderAll","extend","variablesScss","rulesScss","classes","out","groups","g","collectClasses","emit","plan","type","Error","file","files","varsFile","variables","rulesFile","rules","componentRuleSets","filesByName","referencedPaths","seen","Set","merged","mergeComponentRuleSet","states","responsive","entry","condition","filename","has","add","usesVars","defineAdapter"],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The SCSS adapter's option + output types.
|
|
3
|
+
*
|
|
4
|
+
* `TUnit = string` (like CSS) — SCSS is a text format. What differs from the CSS adapter:
|
|
5
|
+
* tokens lower to compile-time Sass **`$variables`** (not `:root` custom properties), refs render
|
|
6
|
+
* as `$dt-…` (not `var(--…)`), and rule-sets nest their state/breakpoint overrides with `&` /
|
|
7
|
+
* `@media` in idiomatic Sass. Recipes are emitted as **classes** (composition = class list, the CSS
|
|
8
|
+
* option-C model), so the output compiles to the same class surface as CSS from a Sass source.
|
|
9
|
+
*/
|
|
10
|
+
/** SCSS output unit — a string of Sass source. */
|
|
11
|
+
export type ScssUnit = string;
|
|
12
|
+
/** The resolved composition class for one component variant (referenced classes + own delta). */
|
|
13
|
+
export type ResolvedComponentClass = {
|
|
14
|
+
className: string;
|
|
15
|
+
classList: string[];
|
|
16
|
+
};
|
|
17
|
+
export type ScssAdapterOptions = {
|
|
18
|
+
/** Identifier prefix for `$variables` and class names (`$dt-colors-primary`, `.dt-colors-solid-primary`). Default `dt`. */
|
|
19
|
+
prefix?: string;
|
|
20
|
+
/** Bake resolved literal values into declarations instead of `$var` references (drops the `$variables`). */
|
|
21
|
+
inline?: boolean;
|
|
22
|
+
/** Indent width (spaces) for nested Sass blocks. Default `2`. */
|
|
23
|
+
indent?: number;
|
|
24
|
+
/**
|
|
25
|
+
* §W9 — wrap all emitted SCSS in a named cascade `@layer` (compiles to a CSS `@layer`). `true` uses
|
|
26
|
+
* `"refract"`; a string sets a custom name. Off by default (byte-identical). Single-file emit only.
|
|
27
|
+
*/
|
|
28
|
+
layer?: string | boolean;
|
|
29
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@theme-registry/refract-scss",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "The SCSS output adapter for @theme-registry/refract — lowers a ThemeModel to SCSS variables + mixins.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Petyo Stoyanov",
|
|
7
|
+
"email": "petyosv@gmail.com"
|
|
8
|
+
},
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/theme-registry/refract.git",
|
|
12
|
+
"directory": "packages/refract-scss"
|
|
13
|
+
},
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/theme-registry/refract/issues"
|
|
16
|
+
},
|
|
17
|
+
"homepage": "https://github.com/theme-registry/refract#readme",
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"main": "./dist/index.cjs.js",
|
|
20
|
+
"module": "./dist/index.esm.js",
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"files": [
|
|
23
|
+
"/dist"
|
|
24
|
+
],
|
|
25
|
+
"sideEffects": false,
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"types": "./dist/index.d.ts",
|
|
29
|
+
"import": "./dist/index.esm.js",
|
|
30
|
+
"require": "./dist/index.cjs.js"
|
|
31
|
+
},
|
|
32
|
+
"./package.json": "./package.json"
|
|
33
|
+
},
|
|
34
|
+
"peerDependencies": {
|
|
35
|
+
"@theme-registry/refract": "^0.1.0"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@rollup/plugin-terser": "^0.4.4",
|
|
39
|
+
"@rollup/plugin-typescript": "^11.1.6",
|
|
40
|
+
"rimraf": "^5.0.5",
|
|
41
|
+
"rollup": "^3.29.4",
|
|
42
|
+
"rollup-plugin-peer-deps-external": "^2.2.4",
|
|
43
|
+
"typescript": "^5.4.2",
|
|
44
|
+
"vitest": "^4.1.10",
|
|
45
|
+
"@theme-registry/theme-fixtures": "^0.0.0",
|
|
46
|
+
"@theme-registry/refract": "^0.1.0"
|
|
47
|
+
},
|
|
48
|
+
"scripts": {
|
|
49
|
+
"build": "rollup -c",
|
|
50
|
+
"typecheck": "tsc -p tsconfig.typecheck.json",
|
|
51
|
+
"clean": "rimraf dist",
|
|
52
|
+
"test": "vitest run"
|
|
53
|
+
}
|
|
54
|
+
}
|