@razorwind/storybook 0.0.76 → 0.0.77

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/dist/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});let e=require("@razorwind/core/plugin"),t=require("@razorwind/core/lib/fonts"),n=require("@razorwind/core/utils"),r=require("@stryke/path/join");function i(e){return e===!0||e===`true`||e===1}function a(e,t){return e?`${e}:${t}`:t}function o(e){let t=e.theme??e.$theme;return typeof t==`string`&&t.length>0?t:void 0}function s(e,t){return e===`palette`||e===`$palette`?typeof t==`boolean`||typeof t==`number`||typeof t==`string`:(e===`theme`||e===`$theme`)&&typeof t==`string`}function c(e){let t=/* @__PURE__ */ new Map;function r(e,c,l,u,d){if(!(0,n.isObject)(e))return;let f=u||i(e.palette)||i(e.$palette),p=o(e)??d;if((0,n.isTokenLeaf)(e)){(f||p)&&t.set(a(l,c.join(`.`)),{...f&&{palette:!0},...p&&{childTheme:p}});return}for(let[t,n]of Object.entries(e))t.startsWith(`$`)&&t!==`$palette`&&t!==`$theme`||s(t,n)||r(n,[...c,t],l,f,p)}for(let t of(0,n.resolveTokenSets)(e)){let e=t.id==="default"?void 0:t.id;r(t.tokens,[],e,!1,void 0)}return t}function l(e,t={}){let r=t.cssVarPrefix,i=c(e);return(0,n.flattenTokens)(e,{includeTypes:t.includeTypes,shouldIncludeToken:e=>e.skipDocs!==!0,enrichToken:e=>{let t=i.get(a(e.theme,e.path));return{...e,cssVar:(0,n.toCssVar)(e.path,r),...e.type===`color`&&t}}})}function u(e){return e.replaceAll(`\\`,`\\\\`).replaceAll(`"`,`\\"`).replaceAll(`
2
- `,`\\n`).replaceAll(`\r`,`\\r`)}function d(e){return typeof e==`string`?`"${u(e)}"`:typeof e==`number`||typeof e==`boolean`?String(e):e==null?`undefined`:JSON.stringify(e)}function f(e){let t=e.titlePrefix??`Design Tokens`,n=e.themeFiles?.[0],r=e.themeNames??[],i=e.tokenThemeNames??[],a=i.length>1?`
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});let e=require("@razorwind/core/plugin"),t=require("@razorwind/docgen/generate"),n=require("@razorwind/core/lib/fonts"),r=require("@razorwind/core/utils"),i=require("@stryke/path/join");function a(e){return e===!0||e===`true`||e===1}function o(e,t){return e?`${e}:${t}`:t}function s(e){let t=e.theme??e.$theme;return typeof t==`string`&&t.length>0?t:void 0}function c(e,t){return e===`palette`||e===`$palette`?typeof t==`boolean`||typeof t==`number`||typeof t==`string`:(e===`theme`||e===`$theme`)&&typeof t==`string`}function l(e){let t=/* @__PURE__ */ new Map;function n(e,i,l,u,d){if(!(0,r.isObject)(e))return;let f=u||a(e.palette)||a(e.$palette),p=s(e)??d;if((0,r.isTokenLeaf)(e)){(f||p)&&t.set(o(l,i.join(`.`)),{...f&&{palette:!0},...p&&{childTheme:p}});return}for(let[t,r]of Object.entries(e))t.startsWith(`$`)&&t!==`$palette`&&t!==`$theme`||c(t,r)||n(r,[...i,t],l,f,p)}for(let t of(0,r.resolveTokenSets)(e)){let e=t.id==="default"?void 0:t.id;n(t.tokens,[],e,!1,void 0)}return t}function u(e,t={}){let n=t.cssVarPrefix,i=l(e);return(0,r.flattenTokens)(e,{includeTypes:t.includeTypes,shouldIncludeToken:e=>e.skipDocs!==!0,enrichToken:e=>{let t=i.get(o(e.theme,e.path));return{...e,cssVar:(0,r.toCssVar)(e.path,n),...e.type===`color`&&t}}})}function d(e){return e.replaceAll(`\\`,`\\\\`).replaceAll(`"`,`\\"`).replaceAll(`
2
+ `,`\\n`).replaceAll(`\r`,`\\r`)}function f(e){return typeof e==`string`?`"${d(e)}"`:typeof e==`number`||typeof e==`boolean`?String(e):e==null?`undefined`:JSON.stringify(e)}function p(e){let t=e.titlePrefix??`Design Tokens`,n=e.themeFiles?.[0],r=e.themeNames??[],i=e.tokenThemeNames??[],a=i.length>1?`
3
3
  ## Token-doc variants
4
4
 
5
5
  Generated token blocks follow Storybook's \`theme\` global when it matches one
@@ -71,7 +71,7 @@ import { ColorPaletteBlock } from "./blocks";
71
71
  ## Regenerate
72
72
 
73
73
  Re-run Razorwind generate when tokens change to refresh docs under \`${e.outputPath}/\`.
74
- `}const p=`The quick brown fox jumps over the lazy dog`,m=/* @__PURE__ */ new Set([`fontFamily`,`fontWeight`,`typography`]),h=/font|typography|type|text|line[-_.]?height|letter[-_.]?spacing/i;function g(e){return m.has(e.type??``)?!0:(e.type===`dimension`||e.type===`number`)&&h.test(e.path)}function _(e,t){return e.some(e=>t.some(t=>e.path===t||e.path.startsWith(`${t}.`)))}const v=/^\{([^{}]+)\}$/,y=/^var\((--[^),\s]+)(?:\s*,[^)]*)?\)$/;function b(e){if(typeof e==`string`)return v.exec(e.trim())?.[1]?.trim()}function x(e){if(typeof e==`string`)return y.exec(e.trim())?.[1]}function S(e){let t=new Map(e.map(e=>[e.path,e])),r=new Map(e.map(e=>[(0,n.toThemeCssVar)(e.path),e])),i=e=>{let n=e,i=/* @__PURE__ */ new Set;for(let a=0;a<8;a++){if(i.has(n.path))return e.cssValue;i.add(n.path);let a=t.get(b(n.value)??``)??r.get(x(n.value)??x(n.cssValue)??``);if(!a||a.path===n.path)return n.cssValue;n=a}return e.cssValue};return e.map(e=>e.type===`color`?{...e,cssValue:i(e)}:e)}function C(e){return Object.keys(e).length>1}function ee(){return`/**
74
+ `}const m=t.FONT_SPECIMEN_TEXT,h=/* @__PURE__ */ new Set([`fontFamily`,`fontWeight`,`typography`]),g=/font|typography|type|text|line[-_.]?height|letter[-_.]?spacing/i;function _(e){return h.has(e.type??``)?!0:(e.type===`dimension`||e.type===`number`)&&g.test(e.path)}function v(e,t){return e.some(e=>t.some(t=>e.path===t||e.path.startsWith(`${t}.`)))}const y=/^\{([^{}]+)\}$/,b=/^var\((--[^),\s]+)(?:\s*,[^)]*)?\)$/;function x(e){if(typeof e==`string`)return y.exec(e.trim())?.[1]?.trim()}function S(e){if(typeof e==`string`)return b.exec(e.trim())?.[1]}function C(e){let t=new Map(e.map(e=>[e.path,e])),n=new Map(e.map(e=>[(0,r.toThemeCssVar)(e.path),e])),i=e=>{let r=e,i=/* @__PURE__ */ new Set;for(let a=0;a<8;a++){if(i.has(r.path))return e.cssValue;i.add(r.path);let a=t.get(x(r.value)??``)??n.get(S(r.value)??S(r.cssValue)??``);if(!a||a.path===r.path)return r.cssValue;r=a}return e.cssValue};return e.map(e=>e.type===`color`?{...e,cssValue:i(e)}:e)}function w(e){return Object.keys(e).length>1}function ee(){return`/**
75
75
  * Select a generated token variant. Callers may pass \`theme\` to override
76
76
  * the generated fallback without requiring Storybook preview-hook context.
77
77
  */
@@ -84,10 +84,10 @@ export function resolveThemeVariant<T extends Record<string, unknown>>(
84
84
  ? (theme as keyof T & string)
85
85
  : fallback;
86
86
  }
87
- `}function te(e,t){let r=(0,n.resolveTokenSets)(e),i=r.filter(e=>!(0,n.isSharedThemeId)(e.id));return i.length<=1?{default:S(l(e,t))}:Object.fromEntries(i.map(e=>[e.id,S(l(K(r,e),t))]))}function w(e,t){let n=/* @__PURE__ */ new Map;for(let r of e){let e=r.path.split(`.`).slice(0,Math.max(t,1)).join(`.`)||r.path,i=n.get(e)??[];i.push(r),n.set(e,i)}return n}function T(e,t){return e===t?e.split(`.`).at(-1)??e:e.startsWith(`${t}.`)?e.slice(t.length+1):e.split(`.`).at(-1)??e}function ne(e,t={}){let n=t.colorGroupBy??2,r=Object.entries(e),i=r[0]?.[0]??`default`,a=C(e),o=(e,t=` `)=>[...w(e,n).entries()].toSorted(([e],[t])=>e.localeCompare(t)).map(([e,n])=>{let r=n.map(n=>`${t} ${d(T(n.path,e))}: ${d(n.cssValue)}`).join(`,
87
+ `}function T(e,t){let n=(0,r.resolveTokenSets)(e),i=n.filter(e=>!(0,r.isSharedThemeId)(e.id));return i.length<=1?{default:C(u(e,t))}:Object.fromEntries(i.map(e=>[e.id,C(u(H(n,e),t))]))}function E(e,t){let n=/* @__PURE__ */ new Map;for(let r of e){let e=r.path.split(`.`).slice(0,Math.max(t,1)).join(`.`)||r.path,i=n.get(e)??[];i.push(r),n.set(e,i)}return n}function D(e,t){return e===t?e.split(`.`).at(-1)??e:e.startsWith(`${t}.`)?e.slice(t.length+1):e.split(`.`).at(-1)??e}function te(e,t={}){let n=t.colorGroupBy??2,r=Object.entries(e),i=r[0]?.[0]??`default`,a=w(e),o=(e,t=` `)=>[...E(e,n).entries()].toSorted(([e],[t])=>e.localeCompare(t)).map(([e,n])=>{let r=n.map(n=>`${t} ${f(D(n.path,e))}: ${f(n.cssValue)}`).join(`,
88
88
  `),i=n.find(e=>e.description)?.description??`${n.length} token${n.length===1?``:`s`}`;return`${t}<ColorItem
89
- title={${d(e)}}
90
- subtitle={${d(i)}}
89
+ title={${f(e)}}
90
+ subtitle={${f(i)}}
91
91
  colors={{
92
92
  ${r}
93
93
  }}
@@ -98,7 +98,7 @@ ${r}
98
98
  ${o(t,` `)}
99
99
  </ColorPalette>
100
100
  </section>`).join(`
101
- `);return a?`<>\n${c}\n </>`:`<ColorPalette>\n${s||` {/* No color tokens */}`}\n </ColorPalette>`},c=r.map(([e,t])=>` ${d(e)}: (\n ${s(t)}\n )`).join(`,
101
+ `);return a?`<>\n${c}\n </>`:`<ColorPalette>\n${s||` {/* No color tokens */}`}\n </ColorPalette>`},c=r.map(([e,t])=>` ${f(e)}: (\n ${s(t)}\n )`).join(`,
102
102
  `);return`import { ColorPalette, ColorItem } from "@storybook/addon-docs/blocks";
103
103
  ${a?`import { resolveThemeVariant } from "./ThemeVariant";
104
104
  `:``}
@@ -118,16 +118,16 @@ export interface ColorPaletteBlockProps {
118
118
  }
119
119
 
120
120
  export function ColorPaletteBlock({ theme }: ColorPaletteBlockProps = {}) {
121
- const activeTheme = ${a?`resolveThemeVariant(COLOR_VARIANTS, ${d(i)}, theme)`:d(i)};
121
+ const activeTheme = ${a?`resolveThemeVariant(COLOR_VARIANTS, ${f(i)}, theme)`:f(i)};
122
122
 
123
123
  return COLOR_VARIANTS[activeTheme];
124
124
  }
125
- `}function re(e,n={}){let r=n.sampleText??p,i=C(e),a=Object.entries(e),o=a[0]?.[0]??`default`,s=e=>{let i=e.filter(e=>e.type===`dimension`&&/(?:font|type|text).*size|size.*(?:font|type|text)/i.test(e.path)).map(e=>{let t=/^(\d+(?:\.\d+)?)/.exec(e.cssValue);return t?Number(t[1]):e.cssValue}),a=[...new Set(i)],o=(0,t.pickFontByRole)(n.fonts,t.SANS_ROLES),s=(o?(0,t.cssFontFamily)(o):void 0)??e.find(e=>e.type===`fontFamily`)?.cssValue??`system-ui, sans-serif`,c=e.find(e=>e.type===`fontWeight`),l=c&&Number.parseFloat(c.cssValue)||400,u=a.length>0?`[${a.map(e=>d(e)).join(`, `)}]`:`[12, 14, 16, 20, 24, 32]`;return`<Typeset
126
- fontFamily={${d(s)}}
125
+ `}function O(e,t={}){let r=t.sampleText??m,i=w(e),a=Object.entries(e),o=a[0]?.[0]??`default`,s=e=>{let i=e.filter(e=>e.type===`dimension`&&/(?:font|type|text).*size|size.*(?:font|type|text)/i.test(e.path)).map(e=>{let t=/^(\d+(?:\.\d+)?)/.exec(e.cssValue);return t?Number(t[1]):e.cssValue}),a=[...new Set(i)],o=(0,n.pickFontByRole)(t.fonts,n.SANS_ROLES),s=(o?(0,n.cssFontFamily)(o):void 0)??e.find(e=>e.type===`fontFamily`)?.cssValue??`system-ui, sans-serif`,c=e.find(e=>e.type===`fontWeight`),l=c&&Number.parseFloat(c.cssValue)||400,u=a.length>0?`[${a.map(e=>f(e)).join(`, `)}]`:`[12, 14, 16, 20, 24, 32]`;return`<Typeset
126
+ fontFamily={${f(s)}}
127
127
  fontSizes={${u}}
128
- fontWeight={${d(l)}}
129
- sampleText={${d(r)}}
130
- />`},c=a.map(([e,t])=>` ${d(e)}: (${s(t)})`).join(`,
128
+ fontWeight={${f(l)}}
129
+ sampleText={${f(r)}}
130
+ />`},c=a.map(([e,t])=>` ${f(e)}: (${s(t)})`).join(`,
131
131
  `);return`import { Typeset } from "@storybook/addon-docs/blocks";
132
132
  ${i?`import { resolveThemeVariant } from "./ThemeVariant";
133
133
  `:``}
@@ -147,20 +147,20 @@ export interface TypesetBlockProps {
147
147
  }
148
148
 
149
149
  export function TypesetBlock({ theme }: TypesetBlockProps = {}) {
150
- const activeTheme = ${i?`resolveThemeVariant(TYPESET_VARIANTS, ${d(o)}, theme)`:d(o)};
150
+ const activeTheme = ${i?`resolveThemeVariant(TYPESET_VARIANTS, ${f(o)}, theme)`:f(o)};
151
151
 
152
152
  return TYPESET_VARIANTS[activeTheme];
153
153
  }
154
- `}function ie(e){let t=C(e),n=Object.entries(e),r=n[0]?.[0]??`default`,i=e=>e.map(e=>{let t=e.theme?d(e.theme):`undefined`;return` {
155
- path: ${d(e.path)},
156
- type: ${e.type?d(e.type):`undefined`},
157
- value: ${d(e.cssValue)},
158
- cssVar: ${d(e.cssVar)},
159
- description: ${e.description?d(e.description):`undefined`},
154
+ `}function ne(e){let t=w(e),n=Object.entries(e),r=n[0]?.[0]??`default`,i=e=>e.map(e=>{let t=e.theme?f(e.theme):`undefined`;return` {
155
+ path: ${f(e.path)},
156
+ type: ${e.type?f(e.type):`undefined`},
157
+ value: ${f(e.cssValue)},
158
+ cssVar: ${f(e.cssVar)},
159
+ description: ${e.description?f(e.description):`undefined`},
160
160
  theme: ${t},
161
- typography: ${g(e)}
161
+ typography: ${_(e)}
162
162
  }`}).join(`,
163
- `),a=n.map(([e,t])=>` ${d(e)}: [
163
+ `),a=n.map(([e,t])=>` ${f(e)}: [
164
164
  ${i(t)}
165
165
  ]`).join(`,
166
166
  `);return`import type { CSSProperties, ReactElement } from "react";
@@ -225,7 +225,7 @@ export function TokenTableBlock({
225
225
  typography,
226
226
  theme
227
227
  }: TokenTableBlockProps = {}): ReactElement {
228
- const activeTheme = ${t?`resolveThemeVariant(TOKEN_VARIANTS, ${d(r)}, theme)`:d(r)};
228
+ const activeTheme = ${t?`resolveThemeVariant(TOKEN_VARIANTS, ${f(r)}, theme)`:f(r)};
229
229
  const rows = TOKEN_VARIANTS[activeTheme].filter(token => {
230
230
  const filters = typeof filter === "string" ? [filter] : filter;
231
231
  if (
@@ -278,7 +278,7 @@ export function TokenTableBlock({
278
278
  </table>
279
279
  );
280
280
  }
281
- `}function ae(e){let t=e.titlePrefix??`Design Tokens`,n=e.hasColors?`
281
+ `}function re(e){let t=e.titlePrefix??`Design Tokens`,n=e.hasColors?`
282
282
  ## Colors
283
283
 
284
284
  <ColorPaletteBlock />
@@ -307,7 +307,7 @@ import { TokenTableBlock } from "./blocks/TokenTable";
307
307
  import { TypesetBlock } from "./blocks/Typeset";
308
308
  ${e.hasFonts?`import { FontSpecimenBlock } from "./blocks/FontSpecimen";
309
309
  `:``}
310
- <Meta title="${u(t)}/Overview" />
310
+ <Meta title="${d(t)}/Overview" />
311
311
 
312
312
  # ${t}
313
313
 
@@ -316,19 +316,19 @@ ${n}${r}${i}${a}${o}
316
316
  ## All tokens
317
317
 
318
318
  <TokenTableBlock />
319
- `}function E(e={}){return`import { Meta } from "@storybook/addon-docs/blocks";
319
+ `}function ie(e={}){return`import { Meta } from "@storybook/addon-docs/blocks";
320
320
  import { ColorPaletteBlock } from "./blocks/ColorPalette";
321
321
 
322
- <Meta title="${u(e.titlePrefix??`Design Tokens`)}/Colors" />
322
+ <Meta title="${d(e.titlePrefix??`Design Tokens`)}/Colors" />
323
323
 
324
324
  # Colors
325
325
 
326
326
  <ColorPaletteBlock />
327
- `}function D(e={}){return`import { Meta } from "@storybook/addon-docs/blocks";
327
+ `}function ae(e={}){return`import { Meta } from "@storybook/addon-docs/blocks";
328
328
  import { TypesetBlock } from "./blocks/Typeset";
329
329
  import { TokenTableBlock } from "./blocks/TokenTable";
330
330
 
331
- <Meta title="${u(e.titlePrefix??`Design Tokens`)}/Typography" />
331
+ <Meta title="${d(e.titlePrefix??`Design Tokens`)}/Typography" />
332
332
 
333
333
  # Typography
334
334
 
@@ -337,7 +337,7 @@ import { TokenTableBlock } from "./blocks/TokenTable";
337
337
  ## Typography tokens
338
338
 
339
339
  <TokenTableBlock typography />
340
- `}function O(e,t){let n=e[t];return typeof n==`string`?n:void 0}function k(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function oe(e){return`import { IconGallery, IconItem } from "@storybook/addon-docs/blocks";
340
+ `}function k(e,t){let n=e[t];return typeof n==`string`?n:void 0}function A(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function j(e){return`import { IconGallery, IconItem } from "@storybook/addon-docs/blocks";
341
341
 
342
342
  /**
343
343
  * Icons rendered with Storybook's IconGallery doc block.
@@ -347,29 +347,29 @@ import { TokenTableBlock } from "./blocks/TokenTable";
347
347
  export function IconGalleryBlock() {
348
348
  return (
349
349
  <IconGallery>
350
- ${(k(e)?Object.values(e).filter(k).toSorted((e,t)=>(O(e,`name`)??``).localeCompare(O(t,`name`)??``)):[]).map(e=>{let t=O(e,`name`)??`unknown`,n=(Array.isArray(e.files)?e.files:[]).find(e=>k(e)&&O(e,`type`)===`svg`&&typeof e.content==`string`),r=k(n)&&typeof n.content==`string`?`<span
350
+ ${(A(e)?Object.values(e).filter(A).toSorted((e,t)=>(k(e,`name`)??``).localeCompare(k(t,`name`)??``)):[]).map(e=>{let t=k(e,`name`)??`unknown`,n=(Array.isArray(e.files)?e.files:[]).find(e=>A(e)&&k(e,`type`)===`svg`&&typeof e.content==`string`),r=A(n)&&typeof n.content==`string`?`<span
351
351
  style={{ display: "inline-flex", width: 24, height: 24 }}
352
- dangerouslySetInnerHTML={{ __html: ${d(n.content)} }}
353
- />`:`<code>${u(t)}</code>`;return` <IconItem name={${d(t)}}>
352
+ dangerouslySetInnerHTML={{ __html: ${f(n.content)} }}
353
+ />`:`<code>${d(t)}</code>`;return` <IconItem name={${f(t)}}>
354
354
  ${r}
355
355
  </IconItem>`}).join(`
356
356
  `)||` {/* No icons */}`}
357
357
  </IconGallery>
358
358
  );
359
359
  }
360
- `}function se(e={}){return`import { Meta } from "@storybook/addon-docs/blocks";
360
+ `}function M(e={}){return`import { Meta } from "@storybook/addon-docs/blocks";
361
361
  import { IconGalleryBlock } from "./blocks/IconGallery";
362
362
 
363
- <Meta title="${u(e.titlePrefix??`Design Tokens`)}/Icons" />
363
+ <Meta title="${d(e.titlePrefix??`Design Tokens`)}/Icons" />
364
364
 
365
365
  # Icons
366
366
 
367
367
  <IconGalleryBlock />
368
- `}const A=[12,14,16,20,24,32,48,64,72];function j(e,t){return O(e,t)}function M(e,t){let n=e[t];return Array.isArray(n)?n.filter(e=>typeof e==`string`):[]}function N(e){return k(e)?Object.values(e).filter(k).toSorted((e,t)=>(O(e,`name`)??``).localeCompare(O(t,`name`)??``)):[]}function P(e){return(O(e,`name`)??O(e,`title`)??`font`).trim().replaceAll(/[^\w-]+/g,`-`).replaceAll(/-{2,}/g,`-`).replaceAll(/^-|-$/g,``).toLowerCase()||`font`}function F(e){let t=/* @__PURE__ */ new Map,n=/* @__PURE__ */ new Map;for(let r of e){let e=P(r),i=t.get(e)??0;t.set(e,i+1),n.set(r,i===0?e:`${e}-${i+1}`)}return n}const I={sans:`sans-serif`,serif:`serif`,mono:`monospace`,code:`monospace`,display:`sans-serif`,heading:`sans-serif`,body:`sans-serif`};function L(e){let t=e.trim();return!t||/^[a-z-]+$/i.test(t)&&!/\s/.test(t)?t:`"${t.replaceAll(`"`,`\\"`)}"`}function R(e){let t=[L(j(e,`family`)??j(e,`title`)??j(e,`name`)??`sans-serif`)];for(let n of M(e,`fallbacks`)){let e=L(n);e&&!t.includes(e)&&t.push(e)}let n=I[j(e,`role`)??``];return n&&!t.includes(n)&&t.push(n),t.filter(Boolean).join(`, `)}function z(e,t={}){let n=t.sampleText??p,r=e.map(e=>{let t=O(e,`name`)??`unknown`,n=R(e);return` ${d(t)}: {
369
- family: ${d(n)},
370
- title: ${d(O(e,`title`)??t)}
368
+ `}function N(e,n={}){let r=n.sampleText??m,i=e.map(e=>{let n=k(e,`name`)??`unknown`,r=(0,t.resolveFontStack)(e);return` ${f(n)}: {
369
+ family: ${f(r)},
370
+ title: ${f(k(e,`title`)??n)}
371
371
  }`}).join(`,
372
- `),i=`[${A.join(`, `)}]`;return`import type { CSSProperties, ReactElement } from "react";
372
+ `),a=`[${t.FONT_SPECIMEN_SIZES.join(`, `)}]`;return`import type { CSSProperties, ReactElement } from "react";
373
373
 
374
374
  export interface FontSpecimenBlockProps {
375
375
  /** Font entry name. Defaults to the first font. */
@@ -381,12 +381,12 @@ export interface FontSpecimenBlockProps {
381
381
  }
382
382
 
383
383
  const FONT_FAMILIES: Record<string, { family: string; title: string }> = {
384
- ${r||` // No fonts`}
384
+ ${i||` // No fonts`}
385
385
  };
386
386
 
387
- const DEFAULT_FONT = ${d(e[0]?O(e[0],`name`)??`unknown`:`unknown`)};
388
- const DEFAULT_SIZES = ${i};
389
- const DEFAULT_SAMPLE_TEXT = ${d(n)};
387
+ const DEFAULT_FONT = ${f(e[0]?k(e[0],`name`)??`unknown`:`unknown`)};
388
+ const DEFAULT_SIZES = ${a};
389
+ const DEFAULT_SAMPLE_TEXT = ${f(r)};
390
390
 
391
391
  const labelStyle: CSSProperties = {
392
392
  display: "block",
@@ -419,7 +419,7 @@ export function FontSpecimenBlock({
419
419
  lineHeight: 1.25,
420
420
  margin: "0 0 0.5em"
421
421
  }}>
422
- AaBbCcDdEeFfGgHh 0123456789
422
+ ${t.FONT_CHARACTER_SET}
423
423
  </div>
424
424
  {sizes.map(size => (
425
425
  <div
@@ -437,32 +437,24 @@ export function FontSpecimenBlock({
437
437
  </div>
438
438
  );
439
439
  }
440
- `}function ce(e){let t=O(e,`name`)??`unknown`,n=O(e,`source`)??`local`,r=O(e,`role`),i=O(e,`category`),a=O(e,`display`),o=M(e,`fallbacks`),s=Array.isArray(e.weights)?e.weights.filter(e=>typeof e==`string`||typeof e==`number`):[],c=M(e,`styles`),l=M(e,`subsets`),d=M(e,`tags`);return[`- **Name:** \`${t}\``,`- **Source:** \`${n}\``,`- **Family:** \`${u(R(e))}\``,...r?[`- **Role:** \`${r}\``]:[],...i?[`- **Category:** \`${i}\``]:[],...a?[`- **Display:** \`${a}\``]:[],...o.length>0?[`- **Fallbacks:** ${o.map(e=>`\`${e}\``).join(`, `)}`]:[],...s.length>0?[`- **Weights:** ${s.map(e=>`\`${e}\``).join(`, `)}`]:[],...c.length>0?[`- **Styles:** ${c.map(e=>`\`${e}\``).join(`, `)}`]:[],...l.length>0?[`- **Subsets:** ${l.map(e=>`\`${e}\``).join(`, `)}`]:[],...d.length>0?[`- **Tags:** ${d.map(e=>`\`${e}\``).join(`, `)}`]:[]].join(`
441
- `)}function B(e){let t=e.titlePrefix??`Design Tokens`,n=e.fonts.map(t=>{let n=O(t,`name`)??`unknown`;return`- [${O(t,`title`)??n}](./Fonts/${e.slugs.get(t)??P(t)}.mdx)`});return`import { Meta } from "@storybook/addon-docs/blocks";
440
+ `}function P(e){let n=e.titlePrefix??`Design Tokens`,r=e.fonts.map(n=>{let r=k(n,`name`)??`unknown`;return`- [${k(n,`title`)??r}](./Fonts/${e.slugs.get(n)??(0,t.fontSlug)(n)}.mdx)`});return`import { Meta } from "@storybook/addon-docs/blocks";
442
441
 
443
- <Meta title="${u(t)}/Fonts" />
442
+ <Meta title="${d(n)}/Fonts" />
444
443
 
445
444
  # Fonts
446
445
 
447
446
  ${e.fonts.length} font${e.fonts.length===1?``:`s`} in the design system.
448
447
 
449
- ${n.join(`
448
+ ${r.join(`
450
449
  `)}
451
- `}function V(e,t,n={}){let r=n.titlePrefix??`Design Tokens`,i=O(e,`name`)??`unknown`,a=O(e,`title`)??i,o=O(e,`description`);return`import { Meta } from "@storybook/addon-docs/blocks";
452
- import { FontSpecimenBlock } from "../blocks/FontSpecimen";
450
+ `}function F(e,n,r={}){let i=r.titlePrefix??`Design Tokens`,a=k(e,`name`)??`unknown`,o=k(e,`title`)??a;return`import { Meta } from "@storybook/addon-docs/blocks";
453
451
 
454
- <Meta title="${u(r)}/Fonts/${u(a)}" />
452
+ <Meta title="${d(i)}/Fonts/${d(o)}" />
455
453
 
456
- # ${a}
454
+ # ${o}
457
455
 
458
- ${o??`${a} font specimen.`}
459
-
460
- ${ce(e)}
461
-
462
- ## Specimen
463
-
464
- <FontSpecimenBlock name={${d(t)}} />
465
- `}function le(e=!0,t=!0){return`export { ColorPaletteBlock } from "./ColorPalette";
456
+ ${(0,t.renderFontBody)(e,r.sampleText)}
457
+ `}function oe(e=!0,t=!0){return`export { ColorPaletteBlock } from "./ColorPalette";
466
458
  export type { ColorPaletteBlockProps } from "./ColorPalette";
467
459
  ${e?`export { IconGalleryBlock } from "./IconGallery";
468
460
  `:``}${t?`export { FontSpecimenBlock } from "./FontSpecimen";
@@ -471,7 +463,7 @@ export type { FontSpecimenBlockProps } from "./FontSpecimen";
471
463
  export type { TokenTableBlockProps, TokenTableRow } from "./TokenTable";
472
464
  export { TypesetBlock } from "./Typeset";
473
465
  export type { TypesetBlockProps } from "./Typeset";
474
- `}const H=/* @__PURE__ */ new Set(/* @__PURE__ */ `base.colorPrimary.colorSecondary.appBg.appContentBg.appHoverBg.appPreviewBg.appBorderColor.appBorderRadius.fontBase.fontCode.textColor.textInverseColor.textMutedColor.barTextColor.barHoverColor.barSelectedColor.barBg.buttonBg.buttonBorder.booleanBg.booleanSelectedBg.inputBg.inputBorder.inputTextColor.inputBorderRadius.brandTitle.brandUrl.brandImage.brandTarget.gridCellSize`.split(`.`));function U(e){return k(e)?e.base===`light`||e.base===`dark`:!1}function W(e){return k(e)?U(e)?!0:Object.keys(e).some(e=>H.has(e)):!1}function G(e){if(!k(e)||W(e))return!1;let t=Object.values(e);return t.length>0&&t.every(W)}function ue(e,t,n){return t.base===`light`||t.base===`dark`?t.base:`${e} ${n??``}`.toLowerCase().includes(`light`)?`light`:`dark`}function de(e){return/^[a-z_$][\w$]*$/i.test(e)?e:d(e)}function K(e,t){let r=e.find(e=>e.id===n.SHARED_THEME_ID);return!r||(0,n.isSharedThemeId)(t.id)?t.tokens:(0,n.mergeTokenTrees)(t.tokens,r.tokens)}function fe(e){return k(e)&&`$value`in e&&!(`colorSpace`in e)&&!(`hex`in e)?e.$value:e}function pe(e,t){let n=fe(e),r=/* @__PURE__ */ new Set;for(let e=0;e<8;e++){let e=b(n);if(!e||r.has(e))break;r.add(e);let i=t.get(e);if(!i)break;n=i.value}return n}function me(e){return e==null||typeof e==`string`||typeof e==`number`||typeof e==`boolean`?e:(0,n.formatTokenValue)(e)}function he(e,t){let r=(0,n.resolveTokenSets)(e),i=r.find(e=>e.id===t)??(r.length===1?r[0]:void 0),a=i?K(r,i):e,o=/* @__PURE__ */ new Map;for(let e of l(a))(!o.get(e.path)||e.theme===t)&&o.set(e.path,e);return o}function ge(e,t){let n={...e};for(let[r,i]of Object.entries(e))r!==`base`&&i!==void 0&&(n[r]=me(pe(i,t)));return n}function _e(e,t,n,r,i){let a=ge(t,he(i.tokens,e));return q(ue(e,a,i.theme),a,n,r)}function q(e,n,r,i){let a=(0,t.pickFontByRole)(i,t.SANS_ROLES),o=(0,t.pickFontByRole)(i,t.MONO_ROLES);return{brandTarget:`_blank`,base:e||`light`,...n,brandTitle:n.brandTitle??r.title,brandUrl:n.brandUrl??r.homepage,brandImage:n.brandImage??r.logo,fontBase:n.fontBase??(a?(0,t.cssFontFamily)(a):void 0),fontCode:n.fontCode??(o?(0,t.cssFontFamily)(o):void 0)}}function J(e,t=``){return`create({\n${Object.entries(e).filter(([,e])=>e!==void 0).map(([e,n])=>`${t} ${e}: ${d(n)}`).join(`,
466
+ `}const I=/* @__PURE__ */ new Set(/* @__PURE__ */ `base.colorPrimary.colorSecondary.appBg.appContentBg.appHoverBg.appPreviewBg.appBorderColor.appBorderRadius.fontBase.fontCode.textColor.textInverseColor.textMutedColor.barTextColor.barHoverColor.barSelectedColor.barBg.buttonBg.buttonBorder.booleanBg.booleanSelectedBg.inputBg.inputBorder.inputTextColor.inputBorderRadius.brandTitle.brandUrl.brandImage.brandTarget.gridCellSize`.split(`.`));function L(e){return A(e)?e.base===`light`||e.base===`dark`:!1}function R(e){return A(e)?L(e)?!0:Object.keys(e).some(e=>I.has(e)):!1}function z(e){if(!A(e)||R(e))return!1;let t=Object.values(e);return t.length>0&&t.every(R)}function B(e,t,n){return t.base===`light`||t.base===`dark`?t.base:`${e} ${n??``}`.toLowerCase().includes(`light`)?`light`:`dark`}function V(e){return/^[a-z_$][\w$]*$/i.test(e)?e:f(e)}function H(e,t){let n=e.find(e=>e.id===r.SHARED_THEME_ID);return!n||(0,r.isSharedThemeId)(t.id)?t.tokens:(0,r.mergeTokenTrees)(t.tokens,n.tokens)}function U(e){return A(e)&&`$value`in e&&!(`colorSpace`in e)&&!(`hex`in e)?e.$value:e}function W(e,t){let n=U(e),r=/* @__PURE__ */ new Set;for(let e=0;e<8;e++){let e=x(n);if(!e||r.has(e))break;r.add(e);let i=t.get(e);if(!i)break;n=i.value}return n}function G(e){return e==null||typeof e==`string`||typeof e==`number`||typeof e==`boolean`?e:(0,r.formatTokenValue)(e)}function K(e,t){let n=(0,r.resolveTokenSets)(e),i=n.find(e=>e.id===t)??(n.length===1?n[0]:void 0),a=i?H(n,i):e,o=/* @__PURE__ */ new Map;for(let e of u(a))(!o.get(e.path)||e.theme===t)&&o.set(e.path,e);return o}function se(e,t){let n={...e};for(let[r,i]of Object.entries(e))r!==`base`&&i!==void 0&&(n[r]=G(W(i,t)));return n}function ce(e,t,n,r,i){let a=se(t,K(i.tokens,e));return q(B(e,a,i.theme),a,n,r)}function q(e,t,r,i){let a=(0,n.pickFontByRole)(i,n.SANS_ROLES),o=(0,n.pickFontByRole)(i,n.MONO_ROLES);return{brandTarget:`_blank`,base:e||`light`,...t,brandTitle:t.brandTitle??r.title,brandUrl:t.brandUrl??r.homepage,brandImage:t.brandImage??r.logo,fontBase:t.fontBase??(a?(0,n.cssFontFamily)(a):void 0),fontCode:t.fontCode??(o?(0,n.cssFontFamily)(o):void 0)}}function J(e,t=``){return`create({\n${Object.entries(e).filter(([,e])=>e!==void 0).map(([e,n])=>`${t} ${e}: ${f(n)}`).join(`,
475
467
  `)}\n${t}})`}function Y(e){return`import { create } from "storybook/theming";
476
468
 
477
469
  /**
@@ -488,7 +480,7 @@ export default ${J(e)};
488
480
  * @see https://storybook.js.org/docs/configure/user-interface/theming
489
481
  */
490
482
  export default {
491
- ${Object.entries(e).map(([e,t])=>` ${de(e)}: ${J(t,` `)}`).join(`,
483
+ ${Object.entries(e).map(([e,t])=>` ${V(e)}: ${J(t,` `)}`).join(`,
492
484
  `)}
493
485
  };
494
- `}function Z(e){if(U(e))return Y(e);let t=Object.entries(e);if(t.length!==1)return X(e);let[,n]=t[0]??[];return n?Y(n):X(e)}function Q(e,t,r,i){let a=(e,n)=>_e(e,n,r,t.fonts,t);if(G(e))return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,a(e,t)]));let o=(0,n.resolveTokenSets)(t.tokens),s=o.filter(e=>!(0,n.isSharedThemeId)(e.id));if(s.length>1){let e={};for(let t of s){let n=i(K(o,t));if(G(n)){let r=n[t.id];if(r){e[t.id]=a(t.id,r);continue}for(let[t,r]of Object.entries(n))e[t]=a(t,r);continue}W(n)&&(e[t.id]=a(t.id,n))}return e}if(W(e)){let n=s[0]&&s[0].id!=="default"?s[0].id:t.theme??`default`;return{[n]:a(n,e)}}return{}}const ve=e=>(t,i,a)=>(0,n.createDocument)((0,r.joinPaths)(e,t),i,{name:`razorwind-storybook`},!1,a);function $(e,t={}){let i=t.outputPath??`storybook/tokens`,a=(0,n.resolveSchemaIdentity)(e),o=t.titlePrefix??a.title??`Design Tokens`,s={...t,titlePrefix:o,cssVarPrefix:t.cssVarPrefix??(0,n.cssVarPrefixFromName)(e.name)},c=l(e.tokens,s),u=te(e.tokens,s),d=c.some(e=>e.type===`color`),p=e.fonts&&Object.keys(e.fonts).length>0||c.some(g),m=_(c,[`size`]),h=_(c,[`space`,`spacing`]),v=!t.skipIcons&&k(e.icons)&&Object.keys(e.icons).length>0,y=t.skipFonts?[]:N(e.fonts),b=y.length>0,x=F(y),S=ve(i),w={[(0,r.joinPaths)(i,`blocks/ColorPalette.tsx`)]:S(`blocks/ColorPalette.tsx`,ne(u,s),`tsx`),[(0,r.joinPaths)(i,`blocks/Typeset.tsx`)]:S(`blocks/Typeset.tsx`,re(u,{...s,fonts:e.fonts}),`tsx`),[(0,r.joinPaths)(i,`blocks/TokenTable.tsx`)]:S(`blocks/TokenTable.tsx`,ie(u),`tsx`),[(0,r.joinPaths)(i,`blocks/index.ts`)]:S(`blocks/index.ts`,le(v,b),`typescript`),[(0,r.joinPaths)(i,`Tokens.mdx`)]:S(`Tokens.mdx`,ae({titlePrefix:o,hasColors:d,hasTypography:p,hasSizes:m,hasSpaces:h,hasFonts:b}),`mdx`)};if(v&&(w[(0,r.joinPaths)(i,`blocks/IconGallery.tsx`)]=S(`blocks/IconGallery.tsx`,oe(e.icons),`tsx`)),C(u)&&(w[(0,r.joinPaths)(i,`blocks/ThemeVariant.ts`)]=S(`blocks/ThemeVariant.ts`,ee(),`typescript`)),d&&(w[(0,r.joinPaths)(i,`Colors.mdx`)]=S(`Colors.mdx`,E(s),`mdx`)),p&&(w[(0,r.joinPaths)(i,`Typography.mdx`)]=S(`Typography.mdx`,D(s),`mdx`)),v&&(w[(0,r.joinPaths)(i,`Icons.mdx`)]=S(`Icons.mdx`,se(s),`mdx`)),b){w[(0,r.joinPaths)(i,`blocks/FontSpecimen.tsx`)]=S(`blocks/FontSpecimen.tsx`,z(y,s),`tsx`),w[(0,r.joinPaths)(i,`Fonts.mdx`)]=S(`Fonts.mdx`,B({...s,fonts:y,slugs:x}),`mdx`);for(let e of y){let t=x.get(e)??P(e),n=O(e,`name`)??`unknown`,a=(0,r.joinPaths)(`Fonts`,`${t}.mdx`);w[(0,r.joinPaths)(i,a)]=S(a,V(e,n,s),`mdx`)}}w[(0,r.joinPaths)(i,`tokens.json`)]=S(`tokens.json`,`${JSON.stringify(c,null,2)}\n`,`json`);let T;if(t.mapTheme){let n=Q(t.mapTheme(e.tokens),e,a,t.mapTheme);Object.keys(n).length>0&&(T=Object.keys(n),w[(0,r.joinPaths)(i,`theme.ts`)]=S(`theme.ts`,Z(n),`typescript`))}let A=`INSTALL.md`;return w[(0,r.joinPaths)(i,A)]=S(A,t.installGuide??f({outputPath:i,titlePrefix:o,themeFiles:T?[`theme.ts`]:void 0,themeNames:T,tokenThemeNames:Object.keys(u)}),`markdown`),w}var ye=(0,e.definePlugin)(e=>({name:`storybook`,themeGeneration:`combined`,generate:async t=>$(t,e??{})}));exports.applyBrandDefaults=q,exports.default=ye,exports.extractFonts=N,exports.flattenTokens=l,exports.fontSlug=P,exports.fontSlugs=F,Object.defineProperty(exports,"formatTokenValue",{enumerable:!0,get:function(){return n.formatTokenValue}}),exports.generateTokenDocs=$,exports.normalizeThemes=Q,exports.renderFontMdx=V,exports.renderFontSpecimenBlock=z,exports.renderFontsMdx=B,exports.renderInstallMd=f,exports.renderThemeFile=Z,exports.resolveFontStack=R,exports.resolveTokenSets=n.resolveTokenSets,Object.defineProperty(exports,"toCssVar",{enumerable:!0,get:function(){return n.toCssVar}});
486
+ `}function Z(e){if(L(e))return Y(e);let t=Object.entries(e);if(t.length!==1)return X(e);let[,n]=t[0]??[];return n?Y(n):X(e)}function Q(e,t,n,i){let a=(e,r)=>ce(e,r,n,t.fonts,t);if(z(e))return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,a(e,t)]));let o=(0,r.resolveTokenSets)(t.tokens),s=o.filter(e=>!(0,r.isSharedThemeId)(e.id));if(s.length>1){let e={};for(let t of s){let n=i(H(o,t));if(z(n)){let r=n[t.id];if(r){e[t.id]=a(t.id,r);continue}for(let[t,r]of Object.entries(n))e[t]=a(t,r);continue}R(n)&&(e[t.id]=a(t.id,n))}return e}if(R(e)){let n=s[0]&&s[0].id!=="default"?s[0].id:t.theme??`default`;return{[n]:a(n,e)}}return{}}const le=e=>(t,n,a)=>(0,r.createDocument)((0,i.joinPaths)(e,t),n,{name:`razorwind-storybook`},!1,a);function $(e,n={}){let a=n.outputPath??`storybook/tokens`,o=(0,r.resolveSchemaIdentity)(e),s=n.titlePrefix??o.title??`Design Tokens`,c={...n,titlePrefix:s,cssVarPrefix:n.cssVarPrefix??(0,r.cssVarPrefixFromName)(e.name)},l=u(e.tokens,c),d=T(e.tokens,c),f=l.some(e=>e.type===`color`),m=e.fonts&&Object.keys(e.fonts).length>0||l.some(_),h=v(l,[`size`]),g=v(l,[`space`,`spacing`]),y=!n.skipIcons&&A(e.icons)&&Object.keys(e.icons).length>0,b=n.skipFonts?[]:(0,t.extractFonts)(e.fonts),x=b.length>0,S=(0,t.fontSlugs)(b),C=le(a),E={[(0,i.joinPaths)(a,`blocks/ColorPalette.tsx`)]:C(`blocks/ColorPalette.tsx`,te(d,c),`tsx`),[(0,i.joinPaths)(a,`blocks/Typeset.tsx`)]:C(`blocks/Typeset.tsx`,O(d,{...c,fonts:e.fonts}),`tsx`),[(0,i.joinPaths)(a,`blocks/TokenTable.tsx`)]:C(`blocks/TokenTable.tsx`,ne(d),`tsx`),[(0,i.joinPaths)(a,`blocks/index.ts`)]:C(`blocks/index.ts`,oe(y,x),`typescript`),[(0,i.joinPaths)(a,`Tokens.mdx`)]:C(`Tokens.mdx`,re({titlePrefix:s,hasColors:f,hasTypography:m,hasSizes:h,hasSpaces:g,hasFonts:x}),`mdx`)};if(y&&(E[(0,i.joinPaths)(a,`blocks/IconGallery.tsx`)]=C(`blocks/IconGallery.tsx`,j(e.icons),`tsx`)),w(d)&&(E[(0,i.joinPaths)(a,`blocks/ThemeVariant.ts`)]=C(`blocks/ThemeVariant.ts`,ee(),`typescript`)),f&&(E[(0,i.joinPaths)(a,`Colors.mdx`)]=C(`Colors.mdx`,ie(c),`mdx`)),m&&(E[(0,i.joinPaths)(a,`Typography.mdx`)]=C(`Typography.mdx`,ae(c),`mdx`)),y&&(E[(0,i.joinPaths)(a,`Icons.mdx`)]=C(`Icons.mdx`,M(c),`mdx`)),x){E[(0,i.joinPaths)(a,`blocks/FontSpecimen.tsx`)]=C(`blocks/FontSpecimen.tsx`,N(b,c),`tsx`),E[(0,i.joinPaths)(a,`Fonts.mdx`)]=C(`Fonts.mdx`,P({...c,fonts:b,slugs:S}),`mdx`);for(let e of b){let n=S.get(e)??(0,t.fontSlug)(e),r=k(e,`name`)??`unknown`,o=(0,i.joinPaths)(`Fonts`,`${n}.mdx`);E[(0,i.joinPaths)(a,o)]=C(o,F(e,r,c),`mdx`)}}E[(0,i.joinPaths)(a,`tokens.json`)]=C(`tokens.json`,`${JSON.stringify(l,null,2)}\n`,`json`);let D;if(n.mapTheme){let t=Q(n.mapTheme(e.tokens),e,o,n.mapTheme);Object.keys(t).length>0&&(D=Object.keys(t),E[(0,i.joinPaths)(a,`theme.ts`)]=C(`theme.ts`,Z(t),`typescript`))}let I=`INSTALL.md`;return E[(0,i.joinPaths)(a,I)]=C(I,n.installGuide??p({outputPath:a,titlePrefix:s,themeFiles:D?[`theme.ts`]:void 0,themeNames:D,tokenThemeNames:Object.keys(d)}),`markdown`),E}var ue=(0,e.definePlugin)(e=>({name:`storybook`,themeGeneration:`combined`,generate:async t=>$(t,e??{})}));exports.applyBrandDefaults=q,exports.default=ue,Object.defineProperty(exports,"extractFonts",{enumerable:!0,get:function(){return t.extractFonts}}),exports.flattenTokens=u,Object.defineProperty(exports,"fontSlug",{enumerable:!0,get:function(){return t.fontSlug}}),Object.defineProperty(exports,"fontSlugs",{enumerable:!0,get:function(){return t.fontSlugs}}),Object.defineProperty(exports,"formatTokenValue",{enumerable:!0,get:function(){return r.formatTokenValue}}),exports.generateTokenDocs=$,exports.normalizeThemes=Q,exports.renderFontMdx=F,exports.renderFontSpecimenBlock=N,exports.renderFontsMdx=P,exports.renderInstallMd=p,exports.renderThemeFile=Z,Object.defineProperty(exports,"resolveFontStack",{enumerable:!0,get:function(){return t.resolveFontStack}}),exports.resolveTokenSets=r.resolveTokenSets,Object.defineProperty(exports,"toCssVar",{enumerable:!0,get:function(){return r.toCssVar}});
package/dist/index.d.cts CHANGED
@@ -3,6 +3,7 @@ import { PartialKeys } from "@stryke/types/base";
3
3
  import { Fonts, Schema, Tokens as Tokens$1 } from "@razorwind/core/schema";
4
4
  import { formatTokenValue, resolveTokenSets, toCssVar } from "@razorwind/core/utils";
5
5
  import { GeneratorFunctionResult } from "@power-plant/core";
6
+ import { extractFonts, fontSlug, fontSlugs, resolveFontStack } from "@razorwind/docgen/generate";
6
7
  //#region src/types.d.ts
7
8
  /**
8
9
  * A flattened design token ready for documentation rendering.
@@ -167,23 +168,6 @@ declare function renderInstallMd(options: {
167
168
  }): string;
168
169
  //#endregion
169
170
  //#region src/generate.d.ts
170
- /**
171
- * Collect font entries from `schema.fonts`, sorted by name.
172
- */
173
- declare function extractFonts(fonts: unknown): Record<string, unknown>[];
174
- /**
175
- * Slug used for a per-font documentation page.
176
- */
177
- declare function fontSlug(item: Record<string, unknown>): string;
178
- /**
179
- * Assign a unique page slug to each font, deduplicating collisions with a
180
- * numeric suffix.
181
- */
182
- declare function fontSlugs(fonts: Record<string, unknown>[]): Map<Record<string, unknown>, string>;
183
- /**
184
- * Resolve the CSS `font-family` stack for a font entry.
185
- */
186
- declare function resolveFontStack(item: Record<string, unknown>): string;
187
171
  /**
188
172
  * Build a React FontSpecimen doc block previewing each font at a range of
189
173
  * sizes.
@@ -193,7 +177,7 @@ declare function renderFontsMdx(options: Pick<StorybookPluginOptions, "titlePref
193
177
  fonts: Record<string, unknown>[];
194
178
  slugs: Map<Record<string, unknown>, string>;
195
179
  }): string;
196
- declare function renderFontMdx(font: Record<string, unknown>, fontName: string, options?: Pick<StorybookPluginOptions, "titlePrefix">): string;
180
+ declare function renderFontMdx(font: Record<string, unknown>, _fontName: string, options?: Pick<StorybookPluginOptions, "sampleText" | "titlePrefix">): string;
197
181
  /**
198
182
  * Fill Storybook brand fields from Schema identity when the mapped theme omits them.
199
183
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":["Tokens"],"sources":["../src/types.ts","../src/flatten.ts","../src/install.ts","../src/generate.ts","../src/index.ts"],"mappings":";;;;;;;;;UAwBiB;;EAEf;;EAEA,OAAO;;EAEP;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;;;;;;UAQe;;EAEf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;KAGU,wBAAwB,YAAY;KAEpC,uBACV,wBAAwB,eAAe;;;;;;KAO7B,0BACV,QAAQ,SAAS,eAAe,YAC7B;;;;UAKY;;;;;;EAMf;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;EAMA,eAAe;;;;;;EAOf;;;;;;;;;;;;;;EAeA,WAAW;;;;;;EAOX;;;;;;EAOA;;;;;EAMA;;;;;;;iBClEc,cACd,QAAQA,WAAS,eAAeA,WAChC,UAAS,KAAK,2DACb;;;;;;;;iBC3Fa,gBAAgB;EAC9B;EACA;EACA;EACA;EACA;;;;;;;iBC6tBc,aAAa,iBAAiB;;;;iBAe9B,SAAS,MAAM;;;;;iBAkBf,UACd,OAAO,4BACN,IAAI;;;;iBAwCS,iBAAiB,MAAM;;;;;iBA2BvB,wBACd,OAAO,2BACP,UAAS,KAAK;iBAmIA,eACd,SAAS,KAAK;EACZ,OAAO;EACP,OAAO,IAAI;;iBAwBC,cACd,MAAM,yBACN,kBACA,UAAS,KAAK;;;;iBAmQA,mBACd,wBACA,OAAO,YAAY,yBACnB;EAAY;EAAgB;EAAmB;GAC/C,QAAQ,QACP;;;;;;;;;iBAkEa,gBACd,OAAO,iBAAiB,eAAe;;;;;;iBAwBzB,gBACd,iBACA,MAAM,KAAK,uCACX;EAAY;EAAgB;EAAmB;GAC/C,UAAU,YAAY,sCACrB,eAAe;;;;iBAwEF,kBACd,MAAM,QACN,UAAS,yBACR,wBAAwB,QAAQ"}
1
+ {"version":3,"file":"index.d.cts","names":["Tokens"],"sources":["../src/types.ts","../src/flatten.ts","../src/install.ts","../src/generate.ts","../src/index.ts"],"mappings":";;;;;;;;;;UAwBiB;;EAEf;;EAEA,OAAO;;EAEP;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;;;;;;UAQe;;EAEf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;KAGU,wBAAwB,YAAY;KAEpC,uBACV,wBAAwB,eAAe;;;;;;KAO7B,0BACV,QAAQ,SAAS,eAAe,YAC7B;;;;UAKY;;;;;;EAMf;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;EAMA,eAAe;;;;;;EAOf;;;;;;;;;;;;;;EAeA,WAAW;;;;;;EAOX;;;;;;EAOA;;;;;EAMA;;;;;;;iBClEc,cACd,QAAQA,WAAS,eAAeA,WAChC,UAAS,KAAK,2DACb;;;;;;;;iBC3Fa,gBAAgB;EAC9B;EACA;EACA;EACA;EACA;;;;;;;;iBC2tBc,wBACd,OAAO,2BACP,UAAS,KAAK;iBAuFA,eACd,SAAS,KAAK;EACZ,OAAO;EACP,OAAO,IAAI;;iBAwBC,cACd,MAAM,yBACN,mBACA,UAAS,KAAK;;;;iBA2PA,mBACd,wBACA,OAAO,YAAY,yBACnB;EAAY;EAAgB;EAAmB;GAC/C,QAAQ,QACP;;;;;;;;;iBAkEa,gBACd,OAAO,iBAAiB,eAAe;;;;;;iBAwBzB,gBACd,iBACA,MAAM,KAAK,uCACX;EAAY;EAAgB;EAAmB;GAC/C,UAAU,YAAY,sCACrB,eAAe;;;;iBAwEF,kBACd,MAAM,QACN,UAAS,yBACR,wBAAwB,QAAQ"}
package/dist/index.d.mts CHANGED
@@ -1,3 +1,4 @@
1
+ import { extractFonts, fontSlug, fontSlugs, resolveFontStack } from "@razorwind/docgen/generate";
1
2
  import { formatTokenValue, resolveTokenSets, toCssVar } from "@razorwind/core/utils";
2
3
  import { TokenType, Tokens } from "@power-plant/dtcg-schema";
3
4
  import { PartialKeys } from "@stryke/types/base";
@@ -167,23 +168,6 @@ declare function renderInstallMd(options: {
167
168
  }): string;
168
169
  //#endregion
169
170
  //#region src/generate.d.ts
170
- /**
171
- * Collect font entries from `schema.fonts`, sorted by name.
172
- */
173
- declare function extractFonts(fonts: unknown): Record<string, unknown>[];
174
- /**
175
- * Slug used for a per-font documentation page.
176
- */
177
- declare function fontSlug(item: Record<string, unknown>): string;
178
- /**
179
- * Assign a unique page slug to each font, deduplicating collisions with a
180
- * numeric suffix.
181
- */
182
- declare function fontSlugs(fonts: Record<string, unknown>[]): Map<Record<string, unknown>, string>;
183
- /**
184
- * Resolve the CSS `font-family` stack for a font entry.
185
- */
186
- declare function resolveFontStack(item: Record<string, unknown>): string;
187
171
  /**
188
172
  * Build a React FontSpecimen doc block previewing each font at a range of
189
173
  * sizes.
@@ -193,7 +177,7 @@ declare function renderFontsMdx(options: Pick<StorybookPluginOptions, "titlePref
193
177
  fonts: Record<string, unknown>[];
194
178
  slugs: Map<Record<string, unknown>, string>;
195
179
  }): string;
196
- declare function renderFontMdx(font: Record<string, unknown>, fontName: string, options?: Pick<StorybookPluginOptions, "titlePrefix">): string;
180
+ declare function renderFontMdx(font: Record<string, unknown>, _fontName: string, options?: Pick<StorybookPluginOptions, "sampleText" | "titlePrefix">): string;
197
181
  /**
198
182
  * Fill Storybook brand fields from Schema identity when the mapped theme omits them.
199
183
  */
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import{definePlugin as e}from"@razorwind/core/plugin";import{MONO_ROLES as t,SANS_ROLES as n,cssFontFamily as r,pickFontByRole as i}from"@razorwind/core/lib/fonts";import{SHARED_THEME_ID as a,createDocument as o,cssVarPrefixFromName as s,flattenTokens as c,formatTokenValue as l,isObject as u,isSharedThemeId as d,isTokenLeaf as f,mergeTokenTrees as p,resolveSchemaIdentity as ee,resolveTokenSets as m,toCssVar as h,toCssVar as g,toThemeCssVar as _}from"@razorwind/core/utils";import{joinPaths as v}from"@stryke/path/join";function y(e){return e===!0||e===`true`||e===1}function b(e,t){return e?`${e}:${t}`:t}function x(e){let t=e.theme??e.$theme;return typeof t==`string`&&t.length>0?t:void 0}function te(e,t){return e===`palette`||e===`$palette`?typeof t==`boolean`||typeof t==`number`||typeof t==`string`:(e===`theme`||e===`$theme`)&&typeof t==`string`}function ne(e){let t=/* @__PURE__ */ new Map;function n(e,r,i,a,o){if(!u(e))return;let s=a||y(e.palette)||y(e.$palette),c=x(e)??o;if(f(e)){(s||c)&&t.set(b(i,r.join(`.`)),{...s&&{palette:!0},...c&&{childTheme:c}});return}for(let[t,a]of Object.entries(e))t.startsWith(`$`)&&t!==`$palette`&&t!==`$theme`||te(t,a)||n(a,[...r,t],i,s,c)}for(let t of m(e)){let e=t.id==="default"?void 0:t.id;n(t.tokens,[],e,!1,void 0)}return t}function S(e,t={}){let n=t.cssVarPrefix,r=ne(e);return c(e,{includeTypes:t.includeTypes,shouldIncludeToken:e=>e.skipDocs!==!0,enrichToken:e=>{let t=r.get(b(e.theme,e.path));return{...e,cssVar:g(e.path,n),...e.type===`color`&&t}}})}function C(e){return e.replaceAll(`\\`,`\\\\`).replaceAll(`"`,`\\"`).replaceAll(`
2
- `,`\\n`).replaceAll(`\r`,`\\r`)}function w(e){return typeof e==`string`?`"${C(e)}"`:typeof e==`number`||typeof e==`boolean`?String(e):e==null?`undefined`:JSON.stringify(e)}function T(e){let t=e.titlePrefix??`Design Tokens`,n=e.themeFiles?.[0],r=e.themeNames??[],i=e.tokenThemeNames??[],a=i.length>1?`
1
+ import{definePlugin as e}from"@razorwind/core/plugin";import{FONT_CHARACTER_SET as t,FONT_SPECIMEN_SIZES as n,FONT_SPECIMEN_TEXT as r,extractFonts as i,extractFonts as a,fontSlug as o,fontSlug as s,fontSlugs as c,fontSlugs as l,renderFontBody as u,resolveFontStack as d,resolveFontStack as f}from"@razorwind/docgen/generate";import{MONO_ROLES as p,SANS_ROLES as m,cssFontFamily as h,pickFontByRole as g}from"@razorwind/core/lib/fonts";import{SHARED_THEME_ID as _,createDocument as v,cssVarPrefixFromName as ee,flattenTokens as y,formatTokenValue as b,isObject as x,isSharedThemeId as S,isTokenLeaf as te,mergeTokenTrees as ne,resolveSchemaIdentity as re,resolveTokenSets as C,toCssVar as ie,toCssVar as ae,toThemeCssVar as oe}from"@razorwind/core/utils";import{joinPaths as w}from"@stryke/path/join";function T(e){return e===!0||e===`true`||e===1}function E(e,t){return e?`${e}:${t}`:t}function se(e){let t=e.theme??e.$theme;return typeof t==`string`&&t.length>0?t:void 0}function ce(e,t){return e===`palette`||e===`$palette`?typeof t==`boolean`||typeof t==`number`||typeof t==`string`:(e===`theme`||e===`$theme`)&&typeof t==`string`}function le(e){let t=/* @__PURE__ */ new Map;function n(e,r,i,a,o){if(!x(e))return;let s=a||T(e.palette)||T(e.$palette),c=se(e)??o;if(te(e)){(s||c)&&t.set(E(i,r.join(`.`)),{...s&&{palette:!0},...c&&{childTheme:c}});return}for(let[t,a]of Object.entries(e))t.startsWith(`$`)&&t!==`$palette`&&t!==`$theme`||ce(t,a)||n(a,[...r,t],i,s,c)}for(let t of C(e)){let e=t.id==="default"?void 0:t.id;n(t.tokens,[],e,!1,void 0)}return t}function D(e,t={}){let n=t.cssVarPrefix,r=le(e);return y(e,{includeTypes:t.includeTypes,shouldIncludeToken:e=>e.skipDocs!==!0,enrichToken:e=>{let t=r.get(E(e.theme,e.path));return{...e,cssVar:ae(e.path,n),...e.type===`color`&&t}}})}function O(e){return e.replaceAll(`\\`,`\\\\`).replaceAll(`"`,`\\"`).replaceAll(`
2
+ `,`\\n`).replaceAll(`\r`,`\\r`)}function k(e){return typeof e==`string`?`"${O(e)}"`:typeof e==`number`||typeof e==`boolean`?String(e):e==null?`undefined`:JSON.stringify(e)}function A(e){let t=e.titlePrefix??`Design Tokens`,n=e.themeFiles?.[0],r=e.themeNames??[],i=e.tokenThemeNames??[],a=i.length>1?`
3
3
  ## Token-doc variants
4
4
 
5
5
  Generated token blocks follow Storybook's \`theme\` global when it matches one
@@ -71,7 +71,7 @@ import { ColorPaletteBlock } from "./blocks";
71
71
  ## Regenerate
72
72
 
73
73
  Re-run Razorwind generate when tokens change to refresh docs under \`${e.outputPath}/\`.
74
- `}const E=`The quick brown fox jumps over the lazy dog`,re=/* @__PURE__ */ new Set([`fontFamily`,`fontWeight`,`typography`]),ie=/font|typography|type|text|line[-_.]?height|letter[-_.]?spacing/i;function D(e){return re.has(e.type??``)?!0:(e.type===`dimension`||e.type===`number`)&&ie.test(e.path)}function O(e,t){return e.some(e=>t.some(t=>e.path===t||e.path.startsWith(`${t}.`)))}const ae=/^\{([^{}]+)\}$/,oe=/^var\((--[^),\s]+)(?:\s*,[^)]*)?\)$/;function k(e){if(typeof e==`string`)return ae.exec(e.trim())?.[1]?.trim()}function A(e){if(typeof e==`string`)return oe.exec(e.trim())?.[1]}function j(e){let t=new Map(e.map(e=>[e.path,e])),n=new Map(e.map(e=>[_(e.path),e])),r=e=>{let r=e,i=/* @__PURE__ */ new Set;for(let a=0;a<8;a++){if(i.has(r.path))return e.cssValue;i.add(r.path);let a=t.get(k(r.value)??``)??n.get(A(r.value)??A(r.cssValue)??``);if(!a||a.path===r.path)return r.cssValue;r=a}return e.cssValue};return e.map(e=>e.type===`color`?{...e,cssValue:r(e)}:e)}function M(e){return Object.keys(e).length>1}function se(){return`/**
74
+ `}const j=r,ue=/* @__PURE__ */ new Set([`fontFamily`,`fontWeight`,`typography`]),de=/font|typography|type|text|line[-_.]?height|letter[-_.]?spacing/i;function M(e){return ue.has(e.type??``)?!0:(e.type===`dimension`||e.type===`number`)&&de.test(e.path)}function N(e,t){return e.some(e=>t.some(t=>e.path===t||e.path.startsWith(`${t}.`)))}const fe=/^\{([^{}]+)\}$/,pe=/^var\((--[^),\s]+)(?:\s*,[^)]*)?\)$/;function P(e){if(typeof e==`string`)return fe.exec(e.trim())?.[1]?.trim()}function F(e){if(typeof e==`string`)return pe.exec(e.trim())?.[1]}function I(e){let t=new Map(e.map(e=>[e.path,e])),n=new Map(e.map(e=>[oe(e.path),e])),r=e=>{let r=e,i=/* @__PURE__ */ new Set;for(let a=0;a<8;a++){if(i.has(r.path))return e.cssValue;i.add(r.path);let a=t.get(P(r.value)??``)??n.get(F(r.value)??F(r.cssValue)??``);if(!a||a.path===r.path)return r.cssValue;r=a}return e.cssValue};return e.map(e=>e.type===`color`?{...e,cssValue:r(e)}:e)}function L(e){return Object.keys(e).length>1}function me(){return`/**
75
75
  * Select a generated token variant. Callers may pass \`theme\` to override
76
76
  * the generated fallback without requiring Storybook preview-hook context.
77
77
  */
@@ -84,10 +84,10 @@ export function resolveThemeVariant<T extends Record<string, unknown>>(
84
84
  ? (theme as keyof T & string)
85
85
  : fallback;
86
86
  }
87
- `}function ce(e,t){let n=m(e),r=n.filter(e=>!d(e.id));return r.length<=1?{default:j(S(e,t))}:Object.fromEntries(r.map(e=>[e.id,j(S(J(n,e),t))]))}function le(e,t){let n=/* @__PURE__ */ new Map;for(let r of e){let e=r.path.split(`.`).slice(0,Math.max(t,1)).join(`.`)||r.path,i=n.get(e)??[];i.push(r),n.set(e,i)}return n}function ue(e,t){return e===t?e.split(`.`).at(-1)??e:e.startsWith(`${t}.`)?e.slice(t.length+1):e.split(`.`).at(-1)??e}function de(e,t={}){let n=t.colorGroupBy??2,r=Object.entries(e),i=r[0]?.[0]??`default`,a=M(e),o=(e,t=` `)=>[...le(e,n).entries()].toSorted(([e],[t])=>e.localeCompare(t)).map(([e,n])=>{let r=n.map(n=>`${t} ${w(ue(n.path,e))}: ${w(n.cssValue)}`).join(`,
87
+ `}function he(e,t){let n=C(e),r=n.filter(e=>!S(e.id));return r.length<=1?{default:I(D(e,t))}:Object.fromEntries(r.map(e=>[e.id,I(D(K(n,e),t))]))}function ge(e,t){let n=/* @__PURE__ */ new Map;for(let r of e){let e=r.path.split(`.`).slice(0,Math.max(t,1)).join(`.`)||r.path,i=n.get(e)??[];i.push(r),n.set(e,i)}return n}function _e(e,t){return e===t?e.split(`.`).at(-1)??e:e.startsWith(`${t}.`)?e.slice(t.length+1):e.split(`.`).at(-1)??e}function ve(e,t={}){let n=t.colorGroupBy??2,r=Object.entries(e),i=r[0]?.[0]??`default`,a=L(e),o=(e,t=` `)=>[...ge(e,n).entries()].toSorted(([e],[t])=>e.localeCompare(t)).map(([e,n])=>{let r=n.map(n=>`${t} ${k(_e(n.path,e))}: ${k(n.cssValue)}`).join(`,
88
88
  `),i=n.find(e=>e.description)?.description??`${n.length} token${n.length===1?``:`s`}`;return`${t}<ColorItem
89
- title={${w(e)}}
90
- subtitle={${w(i)}}
89
+ title={${k(e)}}
90
+ subtitle={${k(i)}}
91
91
  colors={{
92
92
  ${r}
93
93
  }}
@@ -98,7 +98,7 @@ ${r}
98
98
  ${o(t,` `)}
99
99
  </ColorPalette>
100
100
  </section>`).join(`
101
- `);return a?`<>\n${c}\n </>`:`<ColorPalette>\n${s||` {/* No color tokens */}`}\n </ColorPalette>`},c=r.map(([e,t])=>` ${w(e)}: (\n ${s(t)}\n )`).join(`,
101
+ `);return a?`<>\n${c}\n </>`:`<ColorPalette>\n${s||` {/* No color tokens */}`}\n </ColorPalette>`},c=r.map(([e,t])=>` ${k(e)}: (\n ${s(t)}\n )`).join(`,
102
102
  `);return`import { ColorPalette, ColorItem } from "@storybook/addon-docs/blocks";
103
103
  ${a?`import { resolveThemeVariant } from "./ThemeVariant";
104
104
  `:``}
@@ -118,18 +118,18 @@ export interface ColorPaletteBlockProps {
118
118
  }
119
119
 
120
120
  export function ColorPaletteBlock({ theme }: ColorPaletteBlockProps = {}) {
121
- const activeTheme = ${a?`resolveThemeVariant(COLOR_VARIANTS, ${w(i)}, theme)`:w(i)};
121
+ const activeTheme = ${a?`resolveThemeVariant(COLOR_VARIANTS, ${k(i)}, theme)`:k(i)};
122
122
 
123
123
  return COLOR_VARIANTS[activeTheme];
124
124
  }
125
- `}function fe(e,t={}){let a=t.sampleText??E,o=M(e),s=Object.entries(e),c=s[0]?.[0]??`default`,l=e=>{let o=e.filter(e=>e.type===`dimension`&&/(?:font|type|text).*size|size.*(?:font|type|text)/i.test(e.path)).map(e=>{let t=/^(\d+(?:\.\d+)?)/.exec(e.cssValue);return t?Number(t[1]):e.cssValue}),s=[...new Set(o)],c=i(t.fonts,n),l=(c?r(c):void 0)??e.find(e=>e.type===`fontFamily`)?.cssValue??`system-ui, sans-serif`,u=e.find(e=>e.type===`fontWeight`),d=u&&Number.parseFloat(u.cssValue)||400,f=s.length>0?`[${s.map(e=>w(e)).join(`, `)}]`:`[12, 14, 16, 20, 24, 32]`;return`<Typeset
126
- fontFamily={${w(l)}}
127
- fontSizes={${f}}
128
- fontWeight={${w(d)}}
129
- sampleText={${w(a)}}
130
- />`},u=s.map(([e,t])=>` ${w(e)}: (${l(t)})`).join(`,
125
+ `}function ye(e,t={}){let n=t.sampleText??j,r=L(e),i=Object.entries(e),a=i[0]?.[0]??`default`,o=e=>{let r=e.filter(e=>e.type===`dimension`&&/(?:font|type|text).*size|size.*(?:font|type|text)/i.test(e.path)).map(e=>{let t=/^(\d+(?:\.\d+)?)/.exec(e.cssValue);return t?Number(t[1]):e.cssValue}),i=[...new Set(r)],a=g(t.fonts,m),o=(a?h(a):void 0)??e.find(e=>e.type===`fontFamily`)?.cssValue??`system-ui, sans-serif`,s=e.find(e=>e.type===`fontWeight`),c=s&&Number.parseFloat(s.cssValue)||400,l=i.length>0?`[${i.map(e=>k(e)).join(`, `)}]`:`[12, 14, 16, 20, 24, 32]`;return`<Typeset
126
+ fontFamily={${k(o)}}
127
+ fontSizes={${l}}
128
+ fontWeight={${k(c)}}
129
+ sampleText={${k(n)}}
130
+ />`},s=i.map(([e,t])=>` ${k(e)}: (${o(t)})`).join(`,
131
131
  `);return`import { Typeset } from "@storybook/addon-docs/blocks";
132
- ${o?`import { resolveThemeVariant } from "./ThemeVariant";
132
+ ${r?`import { resolveThemeVariant } from "./ThemeVariant";
133
133
  `:``}
134
134
 
135
135
  /**
@@ -138,7 +138,7 @@ ${o?`import { resolveThemeVariant } from "./ThemeVariant";
138
138
  * @see https://storybook.js.org/docs/api/doc-blocks/doc-block-typeset
139
139
  */
140
140
  const TYPESET_VARIANTS = {
141
- ${u}
141
+ ${s}
142
142
  };
143
143
 
144
144
  export interface TypesetBlockProps {
@@ -147,20 +147,20 @@ export interface TypesetBlockProps {
147
147
  }
148
148
 
149
149
  export function TypesetBlock({ theme }: TypesetBlockProps = {}) {
150
- const activeTheme = ${o?`resolveThemeVariant(TYPESET_VARIANTS, ${w(c)}, theme)`:w(c)};
150
+ const activeTheme = ${r?`resolveThemeVariant(TYPESET_VARIANTS, ${k(a)}, theme)`:k(a)};
151
151
 
152
152
  return TYPESET_VARIANTS[activeTheme];
153
153
  }
154
- `}function pe(e){let t=M(e),n=Object.entries(e),r=n[0]?.[0]??`default`,i=e=>e.map(e=>{let t=e.theme?w(e.theme):`undefined`;return` {
155
- path: ${w(e.path)},
156
- type: ${e.type?w(e.type):`undefined`},
157
- value: ${w(e.cssValue)},
158
- cssVar: ${w(e.cssVar)},
159
- description: ${e.description?w(e.description):`undefined`},
154
+ `}function be(e){let t=L(e),n=Object.entries(e),r=n[0]?.[0]??`default`,i=e=>e.map(e=>{let t=e.theme?k(e.theme):`undefined`;return` {
155
+ path: ${k(e.path)},
156
+ type: ${e.type?k(e.type):`undefined`},
157
+ value: ${k(e.cssValue)},
158
+ cssVar: ${k(e.cssVar)},
159
+ description: ${e.description?k(e.description):`undefined`},
160
160
  theme: ${t},
161
- typography: ${D(e)}
161
+ typography: ${M(e)}
162
162
  }`}).join(`,
163
- `),a=n.map(([e,t])=>` ${w(e)}: [
163
+ `),a=n.map(([e,t])=>` ${k(e)}: [
164
164
  ${i(t)}
165
165
  ]`).join(`,
166
166
  `);return`import type { CSSProperties, ReactElement } from "react";
@@ -225,7 +225,7 @@ export function TokenTableBlock({
225
225
  typography,
226
226
  theme
227
227
  }: TokenTableBlockProps = {}): ReactElement {
228
- const activeTheme = ${t?`resolveThemeVariant(TOKEN_VARIANTS, ${w(r)}, theme)`:w(r)};
228
+ const activeTheme = ${t?`resolveThemeVariant(TOKEN_VARIANTS, ${k(r)}, theme)`:k(r)};
229
229
  const rows = TOKEN_VARIANTS[activeTheme].filter(token => {
230
230
  const filters = typeof filter === "string" ? [filter] : filter;
231
231
  if (
@@ -278,7 +278,7 @@ export function TokenTableBlock({
278
278
  </table>
279
279
  );
280
280
  }
281
- `}function me(e){let t=e.titlePrefix??`Design Tokens`,n=e.hasColors?`
281
+ `}function xe(e){let t=e.titlePrefix??`Design Tokens`,n=e.hasColors?`
282
282
  ## Colors
283
283
 
284
284
  <ColorPaletteBlock />
@@ -307,7 +307,7 @@ import { TokenTableBlock } from "./blocks/TokenTable";
307
307
  import { TypesetBlock } from "./blocks/Typeset";
308
308
  ${e.hasFonts?`import { FontSpecimenBlock } from "./blocks/FontSpecimen";
309
309
  `:``}
310
- <Meta title="${C(t)}/Overview" />
310
+ <Meta title="${O(t)}/Overview" />
311
311
 
312
312
  # ${t}
313
313
 
@@ -316,19 +316,19 @@ ${n}${r}${i}${a}${o}
316
316
  ## All tokens
317
317
 
318
318
  <TokenTableBlock />
319
- `}function he(e={}){return`import { Meta } from "@storybook/addon-docs/blocks";
319
+ `}function Se(e={}){return`import { Meta } from "@storybook/addon-docs/blocks";
320
320
  import { ColorPaletteBlock } from "./blocks/ColorPalette";
321
321
 
322
- <Meta title="${C(e.titlePrefix??`Design Tokens`)}/Colors" />
322
+ <Meta title="${O(e.titlePrefix??`Design Tokens`)}/Colors" />
323
323
 
324
324
  # Colors
325
325
 
326
326
  <ColorPaletteBlock />
327
- `}function ge(e={}){return`import { Meta } from "@storybook/addon-docs/blocks";
327
+ `}function Ce(e={}){return`import { Meta } from "@storybook/addon-docs/blocks";
328
328
  import { TypesetBlock } from "./blocks/Typeset";
329
329
  import { TokenTableBlock } from "./blocks/TokenTable";
330
330
 
331
- <Meta title="${C(e.titlePrefix??`Design Tokens`)}/Typography" />
331
+ <Meta title="${O(e.titlePrefix??`Design Tokens`)}/Typography" />
332
332
 
333
333
  # Typography
334
334
 
@@ -337,7 +337,7 @@ import { TokenTableBlock } from "./blocks/TokenTable";
337
337
  ## Typography tokens
338
338
 
339
339
  <TokenTableBlock typography />
340
- `}function N(e,t){let n=e[t];return typeof n==`string`?n:void 0}function P(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function _e(e){return`import { IconGallery, IconItem } from "@storybook/addon-docs/blocks";
340
+ `}function R(e,t){let n=e[t];return typeof n==`string`?n:void 0}function z(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function we(e){return`import { IconGallery, IconItem } from "@storybook/addon-docs/blocks";
341
341
 
342
342
  /**
343
343
  * Icons rendered with Storybook's IconGallery doc block.
@@ -347,29 +347,29 @@ import { TokenTableBlock } from "./blocks/TokenTable";
347
347
  export function IconGalleryBlock() {
348
348
  return (
349
349
  <IconGallery>
350
- ${(P(e)?Object.values(e).filter(P).toSorted((e,t)=>(N(e,`name`)??``).localeCompare(N(t,`name`)??``)):[]).map(e=>{let t=N(e,`name`)??`unknown`,n=(Array.isArray(e.files)?e.files:[]).find(e=>P(e)&&N(e,`type`)===`svg`&&typeof e.content==`string`),r=P(n)&&typeof n.content==`string`?`<span
350
+ ${(z(e)?Object.values(e).filter(z).toSorted((e,t)=>(R(e,`name`)??``).localeCompare(R(t,`name`)??``)):[]).map(e=>{let t=R(e,`name`)??`unknown`,n=(Array.isArray(e.files)?e.files:[]).find(e=>z(e)&&R(e,`type`)===`svg`&&typeof e.content==`string`),r=z(n)&&typeof n.content==`string`?`<span
351
351
  style={{ display: "inline-flex", width: 24, height: 24 }}
352
- dangerouslySetInnerHTML={{ __html: ${w(n.content)} }}
353
- />`:`<code>${C(t)}</code>`;return` <IconItem name={${w(t)}}>
352
+ dangerouslySetInnerHTML={{ __html: ${k(n.content)} }}
353
+ />`:`<code>${O(t)}</code>`;return` <IconItem name={${k(t)}}>
354
354
  ${r}
355
355
  </IconItem>`}).join(`
356
356
  `)||` {/* No icons */}`}
357
357
  </IconGallery>
358
358
  );
359
359
  }
360
- `}function ve(e={}){return`import { Meta } from "@storybook/addon-docs/blocks";
360
+ `}function Te(e={}){return`import { Meta } from "@storybook/addon-docs/blocks";
361
361
  import { IconGalleryBlock } from "./blocks/IconGallery";
362
362
 
363
- <Meta title="${C(e.titlePrefix??`Design Tokens`)}/Icons" />
363
+ <Meta title="${O(e.titlePrefix??`Design Tokens`)}/Icons" />
364
364
 
365
365
  # Icons
366
366
 
367
367
  <IconGalleryBlock />
368
- `}const ye=[12,14,16,20,24,32,48,64,72];function F(e,t){return N(e,t)}function I(e,t){let n=e[t];return Array.isArray(n)?n.filter(e=>typeof e==`string`):[]}function L(e){return P(e)?Object.values(e).filter(P).toSorted((e,t)=>(N(e,`name`)??``).localeCompare(N(t,`name`)??``)):[]}function R(e){return(N(e,`name`)??N(e,`title`)??`font`).trim().replaceAll(/[^\w-]+/g,`-`).replaceAll(/-{2,}/g,`-`).replaceAll(/^-|-$/g,``).toLowerCase()||`font`}function z(e){let t=/* @__PURE__ */ new Map,n=/* @__PURE__ */ new Map;for(let r of e){let e=R(r),i=t.get(e)??0;t.set(e,i+1),n.set(r,i===0?e:`${e}-${i+1}`)}return n}const be={sans:`sans-serif`,serif:`serif`,mono:`monospace`,code:`monospace`,display:`sans-serif`,heading:`sans-serif`,body:`sans-serif`};function B(e){let t=e.trim();return!t||/^[a-z-]+$/i.test(t)&&!/\s/.test(t)?t:`"${t.replaceAll(`"`,`\\"`)}"`}function V(e){let t=[B(F(e,`family`)??F(e,`title`)??F(e,`name`)??`sans-serif`)];for(let n of I(e,`fallbacks`)){let e=B(n);e&&!t.includes(e)&&t.push(e)}let n=be[F(e,`role`)??``];return n&&!t.includes(n)&&t.push(n),t.filter(Boolean).join(`, `)}function H(e,t={}){let n=t.sampleText??E,r=e.map(e=>{let t=N(e,`name`)??`unknown`,n=V(e);return` ${w(t)}: {
369
- family: ${w(n)},
370
- title: ${w(N(e,`title`)??t)}
368
+ `}function B(e,r={}){let i=r.sampleText??j,a=e.map(e=>{let t=R(e,`name`)??`unknown`,n=f(e);return` ${k(t)}: {
369
+ family: ${k(n)},
370
+ title: ${k(R(e,`title`)??t)}
371
371
  }`}).join(`,
372
- `),i=`[${ye.join(`, `)}]`;return`import type { CSSProperties, ReactElement } from "react";
372
+ `),o=`[${n.join(`, `)}]`;return`import type { CSSProperties, ReactElement } from "react";
373
373
 
374
374
  export interface FontSpecimenBlockProps {
375
375
  /** Font entry name. Defaults to the first font. */
@@ -381,12 +381,12 @@ export interface FontSpecimenBlockProps {
381
381
  }
382
382
 
383
383
  const FONT_FAMILIES: Record<string, { family: string; title: string }> = {
384
- ${r||` // No fonts`}
384
+ ${a||` // No fonts`}
385
385
  };
386
386
 
387
- const DEFAULT_FONT = ${w(e[0]?N(e[0],`name`)??`unknown`:`unknown`)};
388
- const DEFAULT_SIZES = ${i};
389
- const DEFAULT_SAMPLE_TEXT = ${w(n)};
387
+ const DEFAULT_FONT = ${k(e[0]?R(e[0],`name`)??`unknown`:`unknown`)};
388
+ const DEFAULT_SIZES = ${o};
389
+ const DEFAULT_SAMPLE_TEXT = ${k(i)};
390
390
 
391
391
  const labelStyle: CSSProperties = {
392
392
  display: "block",
@@ -419,7 +419,7 @@ export function FontSpecimenBlock({
419
419
  lineHeight: 1.25,
420
420
  margin: "0 0 0.5em"
421
421
  }}>
422
- AaBbCcDdEeFfGgHh 0123456789
422
+ ${t}
423
423
  </div>
424
424
  {sizes.map(size => (
425
425
  <div
@@ -437,10 +437,9 @@ export function FontSpecimenBlock({
437
437
  </div>
438
438
  );
439
439
  }
440
- `}function xe(e){let t=N(e,`name`)??`unknown`,n=N(e,`source`)??`local`,r=N(e,`role`),i=N(e,`category`),a=N(e,`display`),o=I(e,`fallbacks`),s=Array.isArray(e.weights)?e.weights.filter(e=>typeof e==`string`||typeof e==`number`):[],c=I(e,`styles`),l=I(e,`subsets`),u=I(e,`tags`);return[`- **Name:** \`${t}\``,`- **Source:** \`${n}\``,`- **Family:** \`${C(V(e))}\``,...r?[`- **Role:** \`${r}\``]:[],...i?[`- **Category:** \`${i}\``]:[],...a?[`- **Display:** \`${a}\``]:[],...o.length>0?[`- **Fallbacks:** ${o.map(e=>`\`${e}\``).join(`, `)}`]:[],...s.length>0?[`- **Weights:** ${s.map(e=>`\`${e}\``).join(`, `)}`]:[],...c.length>0?[`- **Styles:** ${c.map(e=>`\`${e}\``).join(`, `)}`]:[],...l.length>0?[`- **Subsets:** ${l.map(e=>`\`${e}\``).join(`, `)}`]:[],...u.length>0?[`- **Tags:** ${u.map(e=>`\`${e}\``).join(`, `)}`]:[]].join(`
441
- `)}function U(e){let t=e.titlePrefix??`Design Tokens`,n=e.fonts.map(t=>{let n=N(t,`name`)??`unknown`;return`- [${N(t,`title`)??n}](./Fonts/${e.slugs.get(t)??R(t)}.mdx)`});return`import { Meta } from "@storybook/addon-docs/blocks";
440
+ `}function V(e){let t=e.titlePrefix??`Design Tokens`,n=e.fonts.map(t=>{let n=R(t,`name`)??`unknown`;return`- [${R(t,`title`)??n}](./Fonts/${e.slugs.get(t)??s(t)}.mdx)`});return`import { Meta } from "@storybook/addon-docs/blocks";
442
441
 
443
- <Meta title="${C(t)}/Fonts" />
442
+ <Meta title="${O(t)}/Fonts" />
444
443
 
445
444
  # Fonts
446
445
 
@@ -448,21 +447,14 @@ ${e.fonts.length} font${e.fonts.length===1?``:`s`} in the design system.
448
447
 
449
448
  ${n.join(`
450
449
  `)}
451
- `}function W(e,t,n={}){let r=n.titlePrefix??`Design Tokens`,i=N(e,`name`)??`unknown`,a=N(e,`title`)??i,o=N(e,`description`);return`import { Meta } from "@storybook/addon-docs/blocks";
452
- import { FontSpecimenBlock } from "../blocks/FontSpecimen";
450
+ `}function H(e,t,n={}){let r=n.titlePrefix??`Design Tokens`,i=R(e,`name`)??`unknown`,a=R(e,`title`)??i;return`import { Meta } from "@storybook/addon-docs/blocks";
453
451
 
454
- <Meta title="${C(r)}/Fonts/${C(a)}" />
452
+ <Meta title="${O(r)}/Fonts/${O(a)}" />
455
453
 
456
454
  # ${a}
457
455
 
458
- ${o??`${a} font specimen.`}
459
-
460
- ${xe(e)}
461
-
462
- ## Specimen
463
-
464
- <FontSpecimenBlock name={${w(t)}} />
465
- `}function Se(e=!0,t=!0){return`export { ColorPaletteBlock } from "./ColorPalette";
456
+ ${u(e,n.sampleText)}
457
+ `}function Ee(e=!0,t=!0){return`export { ColorPaletteBlock } from "./ColorPalette";
466
458
  export type { ColorPaletteBlockProps } from "./ColorPalette";
467
459
  ${e?`export { IconGalleryBlock } from "./IconGallery";
468
460
  `:``}${t?`export { FontSpecimenBlock } from "./FontSpecimen";
@@ -471,16 +463,16 @@ export type { FontSpecimenBlockProps } from "./FontSpecimen";
471
463
  export type { TokenTableBlockProps, TokenTableRow } from "./TokenTable";
472
464
  export { TypesetBlock } from "./Typeset";
473
465
  export type { TypesetBlockProps } from "./Typeset";
474
- `}const Ce=/* @__PURE__ */ new Set(/* @__PURE__ */ `base.colorPrimary.colorSecondary.appBg.appContentBg.appHoverBg.appPreviewBg.appBorderColor.appBorderRadius.fontBase.fontCode.textColor.textInverseColor.textMutedColor.barTextColor.barHoverColor.barSelectedColor.barBg.buttonBg.buttonBorder.booleanBg.booleanSelectedBg.inputBg.inputBorder.inputTextColor.inputBorderRadius.brandTitle.brandUrl.brandImage.brandTarget.gridCellSize`.split(`.`));function G(e){return P(e)?e.base===`light`||e.base===`dark`:!1}function K(e){return P(e)?G(e)?!0:Object.keys(e).some(e=>Ce.has(e)):!1}function q(e){if(!P(e)||K(e))return!1;let t=Object.values(e);return t.length>0&&t.every(K)}function we(e,t,n){return t.base===`light`||t.base===`dark`?t.base:`${e} ${n??``}`.toLowerCase().includes(`light`)?`light`:`dark`}function Te(e){return/^[a-z_$][\w$]*$/i.test(e)?e:w(e)}function J(e,t){let n=e.find(e=>e.id===a);return!n||d(t.id)?t.tokens:p(t.tokens,n.tokens)}function Ee(e){return P(e)&&`$value`in e&&!(`colorSpace`in e)&&!(`hex`in e)?e.$value:e}function De(e,t){let n=Ee(e),r=/* @__PURE__ */ new Set;for(let e=0;e<8;e++){let e=k(n);if(!e||r.has(e))break;r.add(e);let i=t.get(e);if(!i)break;n=i.value}return n}function Oe(e){return e==null||typeof e==`string`||typeof e==`number`||typeof e==`boolean`?e:l(e)}function ke(e,t){let n=m(e),r=n.find(e=>e.id===t)??(n.length===1?n[0]:void 0),i=r?J(n,r):e,a=/* @__PURE__ */ new Map;for(let e of S(i))(!a.get(e.path)||e.theme===t)&&a.set(e.path,e);return a}function Ae(e,t){let n={...e};for(let[r,i]of Object.entries(e))r!==`base`&&i!==void 0&&(n[r]=Oe(De(i,t)));return n}function je(e,t,n,r,i){let a=Ae(t,ke(i.tokens,e));return Y(we(e,a,i.theme),a,n,r)}function Y(e,a,o,s){let c=i(s,n),l=i(s,t);return{brandTarget:`_blank`,base:e||`light`,...a,brandTitle:a.brandTitle??o.title,brandUrl:a.brandUrl??o.homepage,brandImage:a.brandImage??o.logo,fontBase:a.fontBase??(c?r(c):void 0),fontCode:a.fontCode??(l?r(l):void 0)}}function X(e,t=``){return`create({\n${Object.entries(e).filter(([,e])=>e!==void 0).map(([e,n])=>`${t} ${e}: ${w(n)}`).join(`,
475
- `)}\n${t}})`}function Z(e){return`import { create } from "storybook/theming";
466
+ `}const De=/* @__PURE__ */ new Set(/* @__PURE__ */ `base.colorPrimary.colorSecondary.appBg.appContentBg.appHoverBg.appPreviewBg.appBorderColor.appBorderRadius.fontBase.fontCode.textColor.textInverseColor.textMutedColor.barTextColor.barHoverColor.barSelectedColor.barBg.buttonBg.buttonBorder.booleanBg.booleanSelectedBg.inputBg.inputBorder.inputTextColor.inputBorderRadius.brandTitle.brandUrl.brandImage.brandTarget.gridCellSize`.split(`.`));function U(e){return z(e)?e.base===`light`||e.base===`dark`:!1}function W(e){return z(e)?U(e)?!0:Object.keys(e).some(e=>De.has(e)):!1}function G(e){if(!z(e)||W(e))return!1;let t=Object.values(e);return t.length>0&&t.every(W)}function Oe(e,t,n){return t.base===`light`||t.base===`dark`?t.base:`${e} ${n??``}`.toLowerCase().includes(`light`)?`light`:`dark`}function ke(e){return/^[a-z_$][\w$]*$/i.test(e)?e:k(e)}function K(e,t){let n=e.find(e=>e.id===_);return!n||S(t.id)?t.tokens:ne(t.tokens,n.tokens)}function Ae(e){return z(e)&&`$value`in e&&!(`colorSpace`in e)&&!(`hex`in e)?e.$value:e}function je(e,t){let n=Ae(e),r=/* @__PURE__ */ new Set;for(let e=0;e<8;e++){let e=P(n);if(!e||r.has(e))break;r.add(e);let i=t.get(e);if(!i)break;n=i.value}return n}function Me(e){return e==null||typeof e==`string`||typeof e==`number`||typeof e==`boolean`?e:b(e)}function Ne(e,t){let n=C(e),r=n.find(e=>e.id===t)??(n.length===1?n[0]:void 0),i=r?K(n,r):e,a=/* @__PURE__ */ new Map;for(let e of D(i))(!a.get(e.path)||e.theme===t)&&a.set(e.path,e);return a}function Pe(e,t){let n={...e};for(let[r,i]of Object.entries(e))r!==`base`&&i!==void 0&&(n[r]=Me(je(i,t)));return n}function Fe(e,t,n,r,i){let a=Pe(t,Ne(i.tokens,e));return q(Oe(e,a,i.theme),a,n,r)}function q(e,t,n,r){let i=g(r,m),a=g(r,p);return{brandTarget:`_blank`,base:e||`light`,...t,brandTitle:t.brandTitle??n.title,brandUrl:t.brandUrl??n.homepage,brandImage:t.brandImage??n.logo,fontBase:t.fontBase??(i?h(i):void 0),fontCode:t.fontCode??(a?h(a):void 0)}}function J(e,t=``){return`create({\n${Object.entries(e).filter(([,e])=>e!==void 0).map(([e,n])=>`${t} ${e}: ${k(n)}`).join(`,
467
+ `)}\n${t}})`}function Y(e){return`import { create } from "storybook/theming";
476
468
 
477
469
  /**
478
470
  * Storybook UI theme generated by \`@razorwind/storybook\`.
479
471
  *
480
472
  * @see https://storybook.js.org/docs/configure/user-interface/theming
481
473
  */
482
- export default ${X(e)};
483
- `}function Q(e){return`import { create } from "storybook/theming";
474
+ export default ${J(e)};
475
+ `}function X(e){return`import { create } from "storybook/theming";
484
476
 
485
477
  /**
486
478
  * Storybook UI themes generated by \`@razorwind/storybook\`.
@@ -488,8 +480,8 @@ export default ${X(e)};
488
480
  * @see https://storybook.js.org/docs/configure/user-interface/theming
489
481
  */
490
482
  export default {
491
- ${Object.entries(e).map(([e,t])=>` ${Te(e)}: ${X(t,` `)}`).join(`,
483
+ ${Object.entries(e).map(([e,t])=>` ${ke(e)}: ${J(t,` `)}`).join(`,
492
484
  `)}
493
485
  };
494
- `}function $(e){if(G(e))return Z(e);let t=Object.entries(e);if(t.length!==1)return Q(e);let[,n]=t[0]??[];return n?Z(n):Q(e)}function Me(e,t,n,r){let i=(e,r)=>je(e,r,n,t.fonts,t);if(q(e))return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,i(e,t)]));let a=m(t.tokens),o=a.filter(e=>!d(e.id));if(o.length>1){let e={};for(let t of o){let n=r(J(a,t));if(q(n)){let r=n[t.id];if(r){e[t.id]=i(t.id,r);continue}for(let[t,r]of Object.entries(n))e[t]=i(t,r);continue}K(n)&&(e[t.id]=i(t.id,n))}return e}if(K(e)){let n=o[0]&&o[0].id!=="default"?o[0].id:t.theme??`default`;return{[n]:i(n,e)}}return{}}const Ne=e=>(t,n,r)=>o(v(e,t),n,{name:`razorwind-storybook`},!1,r);function Pe(e,t={}){let n=t.outputPath??`storybook/tokens`,r=ee(e),i=t.titlePrefix??r.title??`Design Tokens`,a={...t,titlePrefix:i,cssVarPrefix:t.cssVarPrefix??s(e.name)},o=S(e.tokens,a),c=ce(e.tokens,a),l=o.some(e=>e.type===`color`),u=e.fonts&&Object.keys(e.fonts).length>0||o.some(D),d=O(o,[`size`]),f=O(o,[`space`,`spacing`]),p=!t.skipIcons&&P(e.icons)&&Object.keys(e.icons).length>0,m=t.skipFonts?[]:L(e.fonts),h=m.length>0,g=z(m),_=Ne(n),y={[v(n,`blocks/ColorPalette.tsx`)]:_(`blocks/ColorPalette.tsx`,de(c,a),`tsx`),[v(n,`blocks/Typeset.tsx`)]:_(`blocks/Typeset.tsx`,fe(c,{...a,fonts:e.fonts}),`tsx`),[v(n,`blocks/TokenTable.tsx`)]:_(`blocks/TokenTable.tsx`,pe(c),`tsx`),[v(n,`blocks/index.ts`)]:_(`blocks/index.ts`,Se(p,h),`typescript`),[v(n,`Tokens.mdx`)]:_(`Tokens.mdx`,me({titlePrefix:i,hasColors:l,hasTypography:u,hasSizes:d,hasSpaces:f,hasFonts:h}),`mdx`)};if(p&&(y[v(n,`blocks/IconGallery.tsx`)]=_(`blocks/IconGallery.tsx`,_e(e.icons),`tsx`)),M(c)&&(y[v(n,`blocks/ThemeVariant.ts`)]=_(`blocks/ThemeVariant.ts`,se(),`typescript`)),l&&(y[v(n,`Colors.mdx`)]=_(`Colors.mdx`,he(a),`mdx`)),u&&(y[v(n,`Typography.mdx`)]=_(`Typography.mdx`,ge(a),`mdx`)),p&&(y[v(n,`Icons.mdx`)]=_(`Icons.mdx`,ve(a),`mdx`)),h){y[v(n,`blocks/FontSpecimen.tsx`)]=_(`blocks/FontSpecimen.tsx`,H(m,a),`tsx`),y[v(n,`Fonts.mdx`)]=_(`Fonts.mdx`,U({...a,fonts:m,slugs:g}),`mdx`);for(let e of m){let t=g.get(e)??R(e),r=N(e,`name`)??`unknown`,i=v(`Fonts`,`${t}.mdx`);y[v(n,i)]=_(i,W(e,r,a),`mdx`)}}y[v(n,`tokens.json`)]=_(`tokens.json`,`${JSON.stringify(o,null,2)}\n`,`json`);let b;if(t.mapTheme){let i=Me(t.mapTheme(e.tokens),e,r,t.mapTheme);Object.keys(i).length>0&&(b=Object.keys(i),y[v(n,`theme.ts`)]=_(`theme.ts`,$(i),`typescript`))}let x=`INSTALL.md`;return y[v(n,x)]=_(x,t.installGuide??T({outputPath:n,titlePrefix:i,themeFiles:b?[`theme.ts`]:void 0,themeNames:b,tokenThemeNames:Object.keys(c)}),`markdown`),y}var Fe=e(e=>({name:`storybook`,themeGeneration:`combined`,generate:async t=>Pe(t,e??{})}));export{Y as applyBrandDefaults,Fe as default,L as extractFonts,S as flattenTokens,R as fontSlug,z as fontSlugs,l as formatTokenValue,Pe as generateTokenDocs,Me as normalizeThemes,W as renderFontMdx,H as renderFontSpecimenBlock,U as renderFontsMdx,T as renderInstallMd,$ as renderThemeFile,V as resolveFontStack,m as resolveTokenSets,h as toCssVar};
486
+ `}function Z(e){if(U(e))return Y(e);let t=Object.entries(e);if(t.length!==1)return X(e);let[,n]=t[0]??[];return n?Y(n):X(e)}function Q(e,t,n,r){let i=(e,r)=>Fe(e,r,n,t.fonts,t);if(G(e))return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,i(e,t)]));let a=C(t.tokens),o=a.filter(e=>!S(e.id));if(o.length>1){let e={};for(let t of o){let n=r(K(a,t));if(G(n)){let r=n[t.id];if(r){e[t.id]=i(t.id,r);continue}for(let[t,r]of Object.entries(n))e[t]=i(t,r);continue}W(n)&&(e[t.id]=i(t.id,n))}return e}if(W(e)){let n=o[0]&&o[0].id!=="default"?o[0].id:t.theme??`default`;return{[n]:i(n,e)}}return{}}const Ie=e=>(t,n,r)=>v(w(e,t),n,{name:`razorwind-storybook`},!1,r);function $(e,t={}){let n=t.outputPath??`storybook/tokens`,r=re(e),i=t.titlePrefix??r.title??`Design Tokens`,o={...t,titlePrefix:i,cssVarPrefix:t.cssVarPrefix??ee(e.name)},c=D(e.tokens,o),u=he(e.tokens,o),d=c.some(e=>e.type===`color`),f=e.fonts&&Object.keys(e.fonts).length>0||c.some(M),p=N(c,[`size`]),m=N(c,[`space`,`spacing`]),h=!t.skipIcons&&z(e.icons)&&Object.keys(e.icons).length>0,g=t.skipFonts?[]:a(e.fonts),_=g.length>0,v=l(g),y=Ie(n),b={[w(n,`blocks/ColorPalette.tsx`)]:y(`blocks/ColorPalette.tsx`,ve(u,o),`tsx`),[w(n,`blocks/Typeset.tsx`)]:y(`blocks/Typeset.tsx`,ye(u,{...o,fonts:e.fonts}),`tsx`),[w(n,`blocks/TokenTable.tsx`)]:y(`blocks/TokenTable.tsx`,be(u),`tsx`),[w(n,`blocks/index.ts`)]:y(`blocks/index.ts`,Ee(h,_),`typescript`),[w(n,`Tokens.mdx`)]:y(`Tokens.mdx`,xe({titlePrefix:i,hasColors:d,hasTypography:f,hasSizes:p,hasSpaces:m,hasFonts:_}),`mdx`)};if(h&&(b[w(n,`blocks/IconGallery.tsx`)]=y(`blocks/IconGallery.tsx`,we(e.icons),`tsx`)),L(u)&&(b[w(n,`blocks/ThemeVariant.ts`)]=y(`blocks/ThemeVariant.ts`,me(),`typescript`)),d&&(b[w(n,`Colors.mdx`)]=y(`Colors.mdx`,Se(o),`mdx`)),f&&(b[w(n,`Typography.mdx`)]=y(`Typography.mdx`,Ce(o),`mdx`)),h&&(b[w(n,`Icons.mdx`)]=y(`Icons.mdx`,Te(o),`mdx`)),_){b[w(n,`blocks/FontSpecimen.tsx`)]=y(`blocks/FontSpecimen.tsx`,B(g,o),`tsx`),b[w(n,`Fonts.mdx`)]=y(`Fonts.mdx`,V({...o,fonts:g,slugs:v}),`mdx`);for(let e of g){let t=v.get(e)??s(e),r=R(e,`name`)??`unknown`,i=w(`Fonts`,`${t}.mdx`);b[w(n,i)]=y(i,H(e,r,o),`mdx`)}}b[w(n,`tokens.json`)]=y(`tokens.json`,`${JSON.stringify(c,null,2)}\n`,`json`);let x;if(t.mapTheme){let i=Q(t.mapTheme(e.tokens),e,r,t.mapTheme);Object.keys(i).length>0&&(x=Object.keys(i),b[w(n,`theme.ts`)]=y(`theme.ts`,Z(i),`typescript`))}let S=`INSTALL.md`;return b[w(n,S)]=y(S,t.installGuide??A({outputPath:n,titlePrefix:i,themeFiles:x?[`theme.ts`]:void 0,themeNames:x,tokenThemeNames:Object.keys(u)}),`markdown`),b}var Le=e(e=>({name:`storybook`,themeGeneration:`combined`,generate:async t=>$(t,e??{})}));export{q as applyBrandDefaults,Le as default,i as extractFonts,D as flattenTokens,o as fontSlug,c as fontSlugs,b as formatTokenValue,$ as generateTokenDocs,Q as normalizeThemes,H as renderFontMdx,B as renderFontSpecimenBlock,V as renderFontsMdx,A as renderInstallMd,Z as renderThemeFile,d as resolveFontStack,C as resolveTokenSets,ie as toCssVar};
495
487
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["flattenTokensBase","toCssVar","isObject","flattenTokens$1","toCssVar$1","isTruthyFlag","value","metadataKey","theme","path","readChildTheme","node","isColorMetadataKey","key","collectColorMetadata","metadata","walk","isObject","nextPalette","palette","nextChildTheme","childTheme","isTokenLeaf","child","set","resolveTokenSets","tokens","flattenTokens","cssVarPrefix","options","token","colorMetadata","base","escapeString","toLiteral","renderInstallMd","titlePrefix","themeFile","themeNames","tokenThemeNames","tokenThemeSection","name","themeSection","DEFAULT_SAMPLE_TEXT","TYPOGRAPHY_TOKEN_TYPES","TYPOGRAPHY_DIMENSION_PATTERN","isTypographyToken","hasTokenPathPrefix","prefixes","prefix","DTCG_ALIAS_PATTERN","CSS_VAR_PATTERN","readAliasPath","readCssVarName","resolveColorValues","byPath","byCssVar","toThemeCssVar","resolve","current","seen","depth","next","hasThemeVariants","variants","renderVariantResolver","resolveTokenVariants","sets","themes","isSharedThemeId","tokensForThemeSet","groupByPath","groups","list","leafLabel","group","renderColorPaletteBlock","groupBy","variantEntries","defaultTheme","themed","renderItems","sectionTokens","a","b","groupTokens","colorsObject","indent","subtitle","renderPalette","colors","paletteColors","semanticColors","otherColors","hasCategorizedColors","items","sections","section","title","paletteVariants","renderTypesetBlock","sampleText","renderTypeset","fontSizes","match","uniqueSizes","fromFonts","pickFontByRole","SANS_ROLES","fontFamily","cssFontFamily","fontWeightToken","fontWeight","sizesLiteral","size","typesetVariants","renderTokenTableBlock","renderRows","rowsByTheme","renderTokensMdx","colorSection","typographySection","sizeSection","spaceSection","fontsSection","renderColorsMdx","renderTypographyMdx","readString","item","isObject$1","renderIconGalleryBlock","icons","icon","svg","file","preview","renderIconsMdx","FONT_SPECIMEN_SIZES","readFontString","readFontStringArray","entry","extractFonts","fonts","fontSlug","fontSlugs","slugs","font","count","GENERIC_FALLBACK_FROM_ROLE","quoteFontFamily","trimmed","family","resolveFontStack","parts","fallback","quoted","generic","renderFontSpecimenBlock","entries","renderFontMeta","source","role","category","display","fallbacks","weights","styles","subsets","tags","renderFontsMdx","links","renderFontMdx","description","fontName","renderBlocksIndex","hasIcons","hasFonts","STORYBOOK_THEME_KEYS","isStorybookTheme","isThemePartial","isThemeRecord","values","inferThemeBase","specTheme","toPropertyKey","SHARED_THEME_ID","mergeTokenTrees","unwrapTokenNode","resolveAliasValue","aliasPath","formatResolvedThemeValue","formatTokenValue","tokenLookupForTheme","themeName","tree","lookup","resolveThemeFields","resolved","applyMappedTheme","spec","applyBrandDefaults","identity","sans","mono","MONO_ROLES","renderCreateCall","renderSingleThemeFile","renderThemeRecordFile","renderThemeFile","single","normalizeThemes","apply","mapped","result","perTheme","mapTheme","getCreateDocument","createDocument","joinPaths","outputPath","content","language","generateTokenDocs","resolveSchemaIdentity","docsOptions","cssVarPrefixFromName","flat","hasColors","hasTypography","hasSizes","hasSpaces","fontPageSlugs","createDoc","documents","slug","installPath","src_default","definePlugin","toCssVar"],"sources":[],"mappings":""}
1
+ {"version":3,"file":"index.mjs","names":["flattenTokensBase","toCssVar","isObject","resolveFontStack","fontSlug","extractFonts","fontSlugs","extractFonts$1","fontSlug$1","fontSlugs$1","resolveFontStack$1","flattenTokens$1","toCssVar$1","isTruthyFlag","value","metadataKey","theme","path","readChildTheme","node","isColorMetadataKey","key","collectColorMetadata","metadata","walk","isObject","nextPalette","palette","nextChildTheme","childTheme","isTokenLeaf","child","set","resolveTokenSets","tokens","flattenTokens","cssVarPrefix","options","token","colorMetadata","base","escapeString","toLiteral","renderInstallMd","titlePrefix","themeFile","themeNames","tokenThemeNames","tokenThemeSection","name","themeSection","DEFAULT_SAMPLE_TEXT","FONT_SPECIMEN_TEXT","TYPOGRAPHY_TOKEN_TYPES","TYPOGRAPHY_DIMENSION_PATTERN","isTypographyToken","hasTokenPathPrefix","prefixes","prefix","DTCG_ALIAS_PATTERN","CSS_VAR_PATTERN","readAliasPath","readCssVarName","resolveColorValues","byPath","byCssVar","toThemeCssVar","resolve","current","seen","depth","next","hasThemeVariants","variants","renderVariantResolver","resolveTokenVariants","sets","themes","isSharedThemeId","tokensForThemeSet","groupByPath","groups","list","leafLabel","group","renderColorPaletteBlock","groupBy","variantEntries","defaultTheme","themed","renderItems","sectionTokens","a","b","groupTokens","colorsObject","indent","subtitle","renderPalette","colors","paletteColors","semanticColors","otherColors","hasCategorizedColors","items","sections","section","title","paletteVariants","renderTypesetBlock","sampleText","renderTypeset","fontSizes","match","uniqueSizes","fromFonts","pickFontByRole","SANS_ROLES","fontFamily","cssFontFamily","fontWeightToken","fontWeight","sizesLiteral","size","typesetVariants","renderTokenTableBlock","renderRows","rowsByTheme","renderTokensMdx","colorSection","typographySection","sizeSection","spaceSection","fontsSection","renderColorsMdx","renderTypographyMdx","readString","item","isObject$1","renderIconGalleryBlock","icons","icon","svg","file","preview","renderIconsMdx","renderFontSpecimenBlock","entries","fonts","font","family","FONT_SPECIMEN_SIZES","FONT_CHARACTER_SET","renderFontsMdx","links","renderFontMdx","renderFontBody","renderBlocksIndex","hasIcons","hasFonts","STORYBOOK_THEME_KEYS","isStorybookTheme","isThemePartial","isThemeRecord","values","inferThemeBase","specTheme","toPropertyKey","SHARED_THEME_ID","mergeTokenTrees","unwrapTokenNode","resolveAliasValue","aliasPath","formatResolvedThemeValue","formatTokenValue","tokenLookupForTheme","themeName","tree","lookup","resolveThemeFields","resolved","applyMappedTheme","spec","applyBrandDefaults","identity","sans","mono","MONO_ROLES","renderCreateCall","renderSingleThemeFile","renderThemeRecordFile","renderThemeFile","single","normalizeThemes","apply","mapped","result","perTheme","mapTheme","getCreateDocument","createDocument","joinPaths","outputPath","content","language","generateTokenDocs","resolveSchemaIdentity","docsOptions","cssVarPrefixFromName","flat","hasColors","hasTypography","hasSizes","hasSpaces","fontPageSlugs","createDoc","documents","slug","fontName","installPath","src_default","definePlugin","extractFonts","fontSlug","fontSlugs","resolveFontStack","toCssVar"],"sources":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@razorwind/storybook",
3
- "version": "0.0.76",
3
+ "version": "0.0.77",
4
4
  "type": "module",
5
5
  "description": "Razorwind plugin that creates Storybook MDX token doc blocks from Razorwind design tokens.",
6
6
  "repository": {
@@ -85,7 +85,8 @@
85
85
  "dependencies": {
86
86
  "@power-plant/core": "^0.0.93",
87
87
  "@power-plant/dtcg-schema": "^0.0.1",
88
- "@razorwind/core": "^0.0.78",
88
+ "@razorwind/core": "^0.0.79",
89
+ "@razorwind/docgen": "^0.0.75",
89
90
  "@stryke/path": "^0.29.43",
90
91
  "@stryke/type-checks": "^0.6.49"
91
92
  },
@@ -106,5 +107,5 @@
106
107
  "typescript": "^6.0.3"
107
108
  },
108
109
  "publishConfig": { "access": "public" },
109
- "gitHead": "fecb7abc4916e731c1ef490807d00a738522a383"
110
+ "gitHead": "5c48ab00f4080e9bd1f21bf517af901586565400"
110
111
  }