@lobehub/ui 5.31.1 → 5.32.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.
Files changed (36) hide show
  1. package/es/ColorSwatches/ColorSwatches.mjs +3 -3
  2. package/es/ColorSwatches/ColorSwatches.mjs.map +1 -1
  3. package/es/_virtual/_rolldown/runtime.mjs +1 -0
  4. package/es/static-css/baseline.d.mts +6 -0
  5. package/es/static-css/baseline.mjs +39 -0
  6. package/es/static-css/baseline.mjs.map +1 -0
  7. package/es/static-css/buildAntdStaticCss.d.mts +31 -0
  8. package/es/static-css/buildAntdStaticCss.mjs +71 -0
  9. package/es/static-css/buildAntdStaticCss.mjs.map +1 -0
  10. package/es/static-css/emit/index.d.mts +18 -0
  11. package/es/static-css/emit/index.mjs +42 -0
  12. package/es/static-css/emit/index.mjs.map +1 -0
  13. package/es/static-css/hash.mjs +7 -0
  14. package/es/static-css/hash.mjs.map +1 -0
  15. package/es/static-css/index.d.mts +6 -0
  16. package/es/static-css/index.d.ts +1 -0
  17. package/es/static-css/index.js +1 -0
  18. package/es/static-css/index.mjs +6 -0
  19. package/es/static-css/registry.d.mts +20 -0
  20. package/es/static-css/registry.mjs +298 -0
  21. package/es/static-css/registry.mjs.map +1 -0
  22. package/es/static-css/runtime/index.d.mts +14 -0
  23. package/es/static-css/runtime/index.mjs +34 -0
  24. package/es/static-css/runtime/index.mjs.map +1 -0
  25. package/es/static-css/scan.d.mts +19 -0
  26. package/es/static-css/scan.mjs +87 -0
  27. package/es/static-css/scan.mjs.map +1 -0
  28. package/es/static-css/shared.mjs +6 -0
  29. package/es/static-css/shared.mjs.map +1 -0
  30. package/es/static-css/themeVars.d.mts +22 -0
  31. package/es/static-css/themeVars.mjs +130 -0
  32. package/es/static-css/themeVars.mjs.map +1 -0
  33. package/es/static-css/vite/index.d.mts +14 -0
  34. package/es/static-css/vite/index.mjs +48 -0
  35. package/es/static-css/vite/index.mjs.map +1 -0
  36. package/package.json +17 -1
@@ -3,7 +3,7 @@ import FlexBasic_default from "../Flex/FlexBasic.mjs";
3
3
  import Center from "../Flex/Center.mjs";
4
4
  import { safeReadableColor } from "../utils/safeReadableColor.mjs";
5
5
  import Icon from "../Icon/Icon.mjs";
6
- import { Tooltip } from "../base-ui/Tooltip/Tooltip.mjs";
6
+ import { Tooltip as Tooltip$1 } from "../base-ui/Tooltip/Tooltip.mjs";
7
7
  import { styles } from "./style.mjs";
8
8
  import { useMemo } from "react";
9
9
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -43,7 +43,7 @@ const ColorSwatches = ({ enableColorPicker, enableColorSwatches = true, defaultV
43
43
  }
44
44
  })();
45
45
  const actualColorForReadable = c.color?.startsWith("var(") ? cssVar.colorPrimary : color;
46
- return /* @__PURE__ */ jsx(Tooltip, {
46
+ return /* @__PURE__ */ jsx(Tooltip$1, {
47
47
  title: c.title,
48
48
  children: /* @__PURE__ */ jsx(Center, {
49
49
  className: cx(styles.container, isTransparent && styles.transparent, isActive && styles.active),
@@ -63,7 +63,7 @@ const ColorSwatches = ({ enableColorPicker, enableColorSwatches = true, defaultV
63
63
  })
64
64
  })
65
65
  }, c?.key || i);
66
- }), enableColorPicker && /* @__PURE__ */ jsx(Tooltip, {
66
+ }), enableColorPicker && /* @__PURE__ */ jsx(Tooltip$1, {
67
67
  title: texts?.custom || "Custom",
68
68
  children: /* @__PURE__ */ jsx(ColorPicker, {
69
69
  disabledAlpha: true,
@@ -1 +1 @@
1
- {"version":3,"file":"ColorSwatches.mjs","names":["Flexbox"],"sources":["../../src/ColorSwatches/ColorSwatches.tsx"],"sourcesContent":["'use client';\n\nimport { ColorPicker } from 'antd';\nimport { cssVar, cx } from 'antd-style';\nimport chroma from 'chroma-js';\nimport { CheckIcon } from 'lucide-react';\nimport { rgba } from 'polished';\nimport { type FC, useMemo } from 'react';\nimport useMergeState from 'use-merge-value';\n\nimport { Center, Flexbox } from '@/Flex';\nimport Icon from '@/Icon';\nimport Tooltip from '@/Tooltip';\nimport { safeReadableColor } from '@/utils/safeReadableColor';\n\nimport { styles } from './style';\nimport type { ColorSwatchesProps } from './type';\n\nconst ColorSwatches: FC<ColorSwatchesProps> = ({\n enableColorPicker,\n enableColorSwatches = true,\n defaultValue,\n value,\n style,\n colors,\n onChange,\n size = 24,\n shape = 'circle',\n texts,\n ref,\n ...rest\n}) => {\n const [active, setActive] = useMergeState(defaultValue, {\n defaultValue,\n onChange,\n value,\n });\n\n // Convert size prop to CSS variable\n const cssVariables = useMemo<Record<string, string>>(\n () => ({\n '--color-swatches-size': `${size}px`,\n }),\n [size],\n );\n\n const isCustomActive = useMemo(\n () => active && active !== cssVar.colorPrimary && !colors.some((c) => c.color === active),\n [active, colors],\n );\n\n return (\n <Flexbox\n horizontal\n gap={6}\n ref={ref}\n style={{\n ...cssVariables,\n flexWrap: 'wrap',\n ...style,\n }}\n {...rest}\n >\n {enableColorSwatches &&\n colors.map((c, i) => {\n const color = c.color || cssVar.colorPrimary;\n const isActive = (!active && !c.color) || color === active;\n // Check if color is transparent or CSS variable (which chroma can't parse)\n const isTransparent =\n c.color === 'transparent' ||\n (c.color &&\n !c.color.startsWith('var(') &&\n (() => {\n try {\n return chroma(c.color).alpha() === 0;\n } catch {\n return false;\n }\n })());\n // Get actual color value for readableColor (CSS variables can't be parsed)\n const actualColorForReadable = c.color?.startsWith('var(') ? cssVar.colorPrimary : color;\n return (\n <Tooltip key={c?.key || i} title={c.title}>\n <Center\n className={cx(\n styles.container,\n isTransparent && styles.transparent,\n isActive && styles.active,\n )}\n style={{\n background: isTransparent ? undefined : color,\n borderRadius: shape === 'circle' ? '50%' : cssVar.borderRadius,\n }}\n onClick={() => setActive(c.color || undefined)}\n >\n {isActive && (\n <Icon\n color={rgba(safeReadableColor(actualColorForReadable), 0.33)}\n icon={CheckIcon}\n size={{ size: 14, strokeWidth: 4 }}\n style={{\n pointerEvents: 'none',\n }}\n />\n )}\n </Center>\n </Tooltip>\n );\n })}\n {enableColorPicker && (\n <Tooltip title={texts?.custom || 'Custom'}>\n <ColorPicker\n disabledAlpha\n arrow={false}\n defaultValue={cssVar.colorPrimary}\n format={'hex'}\n value={enableColorSwatches ? undefined : active}\n className={cx(\n styles.picker,\n enableColorSwatches && styles.conic,\n isCustomActive && styles.active,\n )}\n presets={\n enableColorSwatches\n ? undefined\n : [\n {\n colors: colors.map((c) => c.color),\n label: texts?.presets || 'Presets',\n },\n ]\n }\n style={{\n borderRadius: shape === 'circle' ? '50%' : cssVar.borderRadius,\n }}\n onChangeComplete={(c) => {\n if (c.toHexString() === cssVar.colorPrimary) {\n setActive('');\n } else {\n setActive(c.toHexString());\n }\n }}\n />\n </Tooltip>\n )}\n </Flexbox>\n );\n};\n\nColorSwatches.displayName = 'ColorSwatches';\n\nexport default ColorSwatches;\n"],"mappings":";;;;;;;;;;;;;;;;AAkBA,MAAM,iBAAyC,EAC7C,mBACA,sBAAsB,MACtB,cACA,OACA,OACA,QACA,UACA,OAAO,IACP,QAAQ,UACR,OACA,KACA,GAAG,WACC;CACJ,MAAM,CAAC,QAAQ,aAAa,cAAc,cAAc;EACtD;EACA;EACA;CACF,CAAC;CAGD,MAAM,eAAe,eACZ,EACL,yBAAyB,GAAG,KAAK,IACnC,IACA,CAAC,IAAI,CACP;CAEA,MAAM,iBAAiB,cACf,UAAU,WAAW,OAAO,gBAAgB,CAAC,OAAO,MAAM,MAAM,EAAE,UAAU,MAAM,GACxF,CAAC,QAAQ,MAAM,CACjB;CAEA,OACE,qBAACA,mBAAD;EACE,YAAA;EACA,KAAK;EACA;EACL,OAAO;GACL,GAAG;GACH,UAAU;GACV,GAAG;EACL;EACA,GAAI;EATN,UAAA,CAWG,uBACC,OAAO,KAAK,GAAG,MAAM;GACnB,MAAM,QAAQ,EAAE,SAAS,OAAO;GAChC,MAAM,WAAY,CAAC,UAAU,CAAC,EAAE,SAAU,UAAU;GAEpD,MAAM,gBACJ,EAAE,UAAU,iBACX,EAAE,SACD,CAAC,EAAE,MAAM,WAAW,MAAM,YACnB;IACL,IAAI;KACF,OAAO,OAAO,EAAE,KAAK,CAAC,CAAC,MAAM,MAAM;IACrC,QAAQ;KACN,OAAO;IACT;GACF,EAAA,CAAG;GAEP,MAAM,yBAAyB,EAAE,OAAO,WAAW,MAAM,IAAI,OAAO,eAAe;GACnF,OACE,oBAAC,SAAD;IAA2B,OAAO,EAAE;IAClC,UAAA,oBAAC,QAAD;KACE,WAAW,GACT,OAAO,WACP,iBAAiB,OAAO,aACxB,YAAY,OAAO,MACrB;KACA,OAAO;MACL,YAAY,gBAAgB,KAAA,IAAY;MACxC,cAAc,UAAU,WAAW,QAAQ,OAAO;KACpD;KACA,eAAe,UAAU,EAAE,SAAS,KAAA,CAAS;KAE5C,UAAA,YACC,oBAAC,MAAD;MACE,OAAO,KAAK,kBAAkB,sBAAsB,GAAG,GAAI;MAC3D,MAAM;MACN,MAAM;OAAE,MAAM;OAAI,aAAa;MAAE;MACjC,OAAO,EACL,eAAe,OACjB;KACD,CAAA;IAEG,CAAA;GACD,GAxBK,GAAG,OAAO,CAwBf;EAEb,CAAC,GACF,qBACC,oBAAC,SAAD;GAAS,OAAO,OAAO,UAAU;GAC/B,UAAA,oBAAC,aAAD;IACE,eAAA;IACA,OAAO;IACP,cAAc,OAAO;IACrB,QAAQ;IACR,OAAO,sBAAsB,KAAA,IAAY;IACzC,WAAW,GACT,OAAO,QACP,uBAAuB,OAAO,OAC9B,kBAAkB,OAAO,MAC3B;IACA,SACE,sBACI,KAAA,IACA,CACE;KACE,QAAQ,OAAO,KAAK,MAAM,EAAE,KAAK;KACjC,OAAO,OAAO,WAAW;IAC3B,CACF;IAEN,OAAO,EACL,cAAc,UAAU,WAAW,QAAQ,OAAO,aACpD;IACA,mBAAmB,MAAM;KACvB,IAAI,EAAE,YAAY,MAAM,OAAO,cAC7B,UAAU,EAAE;UAEZ,UAAU,EAAE,YAAY,CAAC;IAE7B;GACD,CAAA;EACM,CAAA,CAEJ;;AAEb;AAEA,cAAc,cAAc"}
1
+ {"version":3,"file":"ColorSwatches.mjs","names":["Flexbox","Tooltip"],"sources":["../../src/ColorSwatches/ColorSwatches.tsx"],"sourcesContent":["'use client';\n\nimport { ColorPicker } from 'antd';\nimport { cssVar, cx } from 'antd-style';\nimport chroma from 'chroma-js';\nimport { CheckIcon } from 'lucide-react';\nimport { rgba } from 'polished';\nimport { type FC, useMemo } from 'react';\nimport useMergeState from 'use-merge-value';\n\nimport { Center, Flexbox } from '@/Flex';\nimport Icon from '@/Icon';\nimport Tooltip from '@/Tooltip';\nimport { safeReadableColor } from '@/utils/safeReadableColor';\n\nimport { styles } from './style';\nimport type { ColorSwatchesProps } from './type';\n\nconst ColorSwatches: FC<ColorSwatchesProps> = ({\n enableColorPicker,\n enableColorSwatches = true,\n defaultValue,\n value,\n style,\n colors,\n onChange,\n size = 24,\n shape = 'circle',\n texts,\n ref,\n ...rest\n}) => {\n const [active, setActive] = useMergeState(defaultValue, {\n defaultValue,\n onChange,\n value,\n });\n\n // Convert size prop to CSS variable\n const cssVariables = useMemo<Record<string, string>>(\n () => ({\n '--color-swatches-size': `${size}px`,\n }),\n [size],\n );\n\n const isCustomActive = useMemo(\n () => active && active !== cssVar.colorPrimary && !colors.some((c) => c.color === active),\n [active, colors],\n );\n\n return (\n <Flexbox\n horizontal\n gap={6}\n ref={ref}\n style={{\n ...cssVariables,\n flexWrap: 'wrap',\n ...style,\n }}\n {...rest}\n >\n {enableColorSwatches &&\n colors.map((c, i) => {\n const color = c.color || cssVar.colorPrimary;\n const isActive = (!active && !c.color) || color === active;\n // Check if color is transparent or CSS variable (which chroma can't parse)\n const isTransparent =\n c.color === 'transparent' ||\n (c.color &&\n !c.color.startsWith('var(') &&\n (() => {\n try {\n return chroma(c.color).alpha() === 0;\n } catch {\n return false;\n }\n })());\n // Get actual color value for readableColor (CSS variables can't be parsed)\n const actualColorForReadable = c.color?.startsWith('var(') ? cssVar.colorPrimary : color;\n return (\n <Tooltip key={c?.key || i} title={c.title}>\n <Center\n className={cx(\n styles.container,\n isTransparent && styles.transparent,\n isActive && styles.active,\n )}\n style={{\n background: isTransparent ? undefined : color,\n borderRadius: shape === 'circle' ? '50%' : cssVar.borderRadius,\n }}\n onClick={() => setActive(c.color || undefined)}\n >\n {isActive && (\n <Icon\n color={rgba(safeReadableColor(actualColorForReadable), 0.33)}\n icon={CheckIcon}\n size={{ size: 14, strokeWidth: 4 }}\n style={{\n pointerEvents: 'none',\n }}\n />\n )}\n </Center>\n </Tooltip>\n );\n })}\n {enableColorPicker && (\n <Tooltip title={texts?.custom || 'Custom'}>\n <ColorPicker\n disabledAlpha\n arrow={false}\n defaultValue={cssVar.colorPrimary}\n format={'hex'}\n value={enableColorSwatches ? undefined : active}\n className={cx(\n styles.picker,\n enableColorSwatches && styles.conic,\n isCustomActive && styles.active,\n )}\n presets={\n enableColorSwatches\n ? undefined\n : [\n {\n colors: colors.map((c) => c.color),\n label: texts?.presets || 'Presets',\n },\n ]\n }\n style={{\n borderRadius: shape === 'circle' ? '50%' : cssVar.borderRadius,\n }}\n onChangeComplete={(c) => {\n if (c.toHexString() === cssVar.colorPrimary) {\n setActive('');\n } else {\n setActive(c.toHexString());\n }\n }}\n />\n </Tooltip>\n )}\n </Flexbox>\n );\n};\n\nColorSwatches.displayName = 'ColorSwatches';\n\nexport default ColorSwatches;\n"],"mappings":";;;;;;;;;;;;;;;;AAkBA,MAAM,iBAAyC,EAC7C,mBACA,sBAAsB,MACtB,cACA,OACA,OACA,QACA,UACA,OAAO,IACP,QAAQ,UACR,OACA,KACA,GAAG,WACC;CACJ,MAAM,CAAC,QAAQ,aAAa,cAAc,cAAc;EACtD;EACA;EACA;CACF,CAAC;CAGD,MAAM,eAAe,eACZ,EACL,yBAAyB,GAAG,KAAK,IACnC,IACA,CAAC,IAAI,CACP;CAEA,MAAM,iBAAiB,cACf,UAAU,WAAW,OAAO,gBAAgB,CAAC,OAAO,MAAM,MAAM,EAAE,UAAU,MAAM,GACxF,CAAC,QAAQ,MAAM,CACjB;CAEA,OACE,qBAACA,mBAAD;EACE,YAAA;EACA,KAAK;EACA;EACL,OAAO;GACL,GAAG;GACH,UAAU;GACV,GAAG;EACL;EACA,GAAI;EATN,UAAA,CAWG,uBACC,OAAO,KAAK,GAAG,MAAM;GACnB,MAAM,QAAQ,EAAE,SAAS,OAAO;GAChC,MAAM,WAAY,CAAC,UAAU,CAAC,EAAE,SAAU,UAAU;GAEpD,MAAM,gBACJ,EAAE,UAAU,iBACX,EAAE,SACD,CAAC,EAAE,MAAM,WAAW,MAAM,YACnB;IACL,IAAI;KACF,OAAO,OAAO,EAAE,KAAK,CAAC,CAAC,MAAM,MAAM;IACrC,QAAQ;KACN,OAAO;IACT;GACF,EAAA,CAAG;GAEP,MAAM,yBAAyB,EAAE,OAAO,WAAW,MAAM,IAAI,OAAO,eAAe;GACnF,OACE,oBAACC,WAAD;IAA2B,OAAO,EAAE;IAClC,UAAA,oBAAC,QAAD;KACE,WAAW,GACT,OAAO,WACP,iBAAiB,OAAO,aACxB,YAAY,OAAO,MACrB;KACA,OAAO;MACL,YAAY,gBAAgB,KAAA,IAAY;MACxC,cAAc,UAAU,WAAW,QAAQ,OAAO;KACpD;KACA,eAAe,UAAU,EAAE,SAAS,KAAA,CAAS;KAE5C,UAAA,YACC,oBAAC,MAAD;MACE,OAAO,KAAK,kBAAkB,sBAAsB,GAAG,GAAI;MAC3D,MAAM;MACN,MAAM;OAAE,MAAM;OAAI,aAAa;MAAE;MACjC,OAAO,EACL,eAAe,OACjB;KACD,CAAA;IAEG,CAAA;GACD,GAxBK,GAAG,OAAO,CAwBf;EAEb,CAAC,GACF,qBACC,oBAACA,WAAD;GAAS,OAAO,OAAO,UAAU;GAC/B,UAAA,oBAAC,aAAD;IACE,eAAA;IACA,OAAO;IACP,cAAc,OAAO;IACrB,QAAQ;IACR,OAAO,sBAAsB,KAAA,IAAY;IACzC,WAAW,GACT,OAAO,QACP,uBAAuB,OAAO,OAC9B,kBAAkB,OAAO,MAC3B;IACA,SACE,sBACI,KAAA,IACA,CACE;KACE,QAAQ,OAAO,KAAK,MAAM,EAAE,KAAK;KACjC,OAAO,OAAO,WAAW;IAC3B,CACF;IAEN,OAAO,EACL,cAAc,UAAU,WAAW,QAAQ,OAAO,aACpD;IACA,mBAAmB,MAAM;KACvB,IAAI,EAAE,YAAY,MAAM,OAAO,cAC7B,UAAU,EAAE;UAEZ,UAAU,EAAE,YAAY,CAAC;IAE7B;GACD,CAAA;EACM,CAAA,CAEJ;;AAEb;AAEA,cAAc,cAAc"}
@@ -1,3 +1,4 @@
1
+ import "node:module";
1
2
  //#region \0rolldown/runtime.js
2
3
  var __defProp = Object.defineProperty;
3
4
  var __exportAll = (all, no_symbols) => {
@@ -0,0 +1,6 @@
1
+ import { AntdProbeName } from "./registry.mjs";
2
+ //#region src/static-css/baseline.d.ts
3
+ declare const lobeUiAntdBaseline: AntdProbeName[];
4
+ //#endregion
5
+ export { lobeUiAntdBaseline };
6
+ //# sourceMappingURL=baseline.d.mts.map
@@ -0,0 +1,39 @@
1
+ //#region src/static-css/baseline.ts
2
+ const lobeUiAntdBaseline = [
3
+ "alert",
4
+ "anchor",
5
+ "app",
6
+ "auto-complete",
7
+ "avatar",
8
+ "button",
9
+ "collapse",
10
+ "color-picker",
11
+ "date-picker",
12
+ "divider",
13
+ "drawer",
14
+ "dropdown",
15
+ "empty",
16
+ "form",
17
+ "image",
18
+ "input",
19
+ "input-number",
20
+ "input-textarea",
21
+ "menu",
22
+ "modal",
23
+ "popover",
24
+ "progress",
25
+ "segmented",
26
+ "select",
27
+ "skeleton",
28
+ "slider",
29
+ "space",
30
+ "tabs",
31
+ "tag",
32
+ "tag-preset",
33
+ "tag-status",
34
+ "upload"
35
+ ];
36
+ //#endregion
37
+ export { lobeUiAntdBaseline };
38
+
39
+ //# sourceMappingURL=baseline.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseline.mjs","names":[],"sources":["../../src/static-css/baseline.ts"],"sourcesContent":["import type { AntdProbeName } from './registry';\n\n// The antd components @lobehub/ui internals can render. Kept in sync with the\n// source tree by baseline.test.ts — a failure there means this list must change.\nexport const lobeUiAntdBaseline: AntdProbeName[] = [\n 'alert',\n 'anchor',\n 'app',\n 'auto-complete',\n 'avatar',\n 'button',\n 'collapse',\n 'color-picker',\n 'date-picker',\n 'divider',\n 'drawer',\n 'dropdown',\n 'empty',\n 'form',\n 'image',\n 'input',\n 'input-number',\n 'input-textarea',\n 'menu',\n 'modal',\n 'popover',\n 'progress',\n 'segmented',\n 'select',\n 'skeleton',\n 'slider',\n 'space',\n 'tabs',\n 'tag',\n 'tag-preset',\n 'tag-status',\n 'upload',\n];\n"],"mappings":";AAIA,MAAa,qBAAsC;CACjD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
@@ -0,0 +1,31 @@
1
+ import { AntdProbeName } from "./registry.mjs";
2
+ import { ScanAntdUsageOptions } from "./scan.mjs";
3
+ import { ReactElement } from "react";
4
+ import { ThemeConfig } from "antd";
5
+ //#region src/static-css/buildAntdStaticCss.d.ts
6
+ interface AntdStaticCssOptions {
7
+ /** escape hatch for render paths the registry has no probe for */
8
+ customProbes?: [name: string, render: () => ReactElement][];
9
+ /** extra probes on top of 'auto' scan results */
10
+ extraIncluded?: AntdProbeName[];
11
+ hrefTemplate?: (hash: string) => string;
12
+ included?: 'auto' | AntdProbeName[];
13
+ scan?: ScanAntdUsageOptions;
14
+ /** must equal the ConfigProvider theme used at SSR — token hash decides styleKeys matching */
15
+ theme?: ThemeConfig;
16
+ }
17
+ interface AntdStaticCssPayload {
18
+ css: string;
19
+ failedProbes: string[];
20
+ hash: string;
21
+ href: string;
22
+ probes: string[];
23
+ styleKeys: string[];
24
+ /** antd exports found by 'auto' scan that no registry probe covers */
25
+ unmatchedComponents: string[];
26
+ }
27
+ declare const createProbeAntdTheme: () => ThemeConfig;
28
+ declare const buildAntdStaticCss: (options?: AntdStaticCssOptions) => AntdStaticCssPayload;
29
+ //#endregion
30
+ export { AntdStaticCssOptions, AntdStaticCssPayload, buildAntdStaticCss, createProbeAntdTheme };
31
+ //# sourceMappingURL=buildAntdStaticCss.d.mts.map
@@ -0,0 +1,71 @@
1
+ import { createLobeAntdTheme } from "../styles/theme/antdTheme.mjs";
2
+ import { lobeUiAntdBaseline } from "./baseline.mjs";
3
+ import { hashCss } from "./hash.mjs";
4
+ import { antdProbeNames, antdProbeRegistry, expandComponentsToProbes } from "./registry.mjs";
5
+ import { scanAntdUsage } from "./scan.mjs";
6
+ import { styleKeysOf } from "./shared.mjs";
7
+ import { createElement } from "react";
8
+ import { ConfigProvider, theme } from "antd";
9
+ import { StyleProvider } from "antd-style";
10
+ import { createCache, extractStyle } from "@ant-design/cssinjs";
11
+ import { renderToString } from "react-dom/server";
12
+ //#region src/static-css/buildAntdStaticCss.ts
13
+ const createProbeAntdTheme = () => {
14
+ const config = createLobeAntdTheme({ appearance: "light" });
15
+ return {
16
+ ...config,
17
+ algorithm: [theme.defaultAlgorithm, config.algorithm ?? []].flat()
18
+ };
19
+ };
20
+ const resolveProbes = (options) => {
21
+ const { included = "auto", extraIncluded = [], customProbes = [], scan } = options;
22
+ const names = /* @__PURE__ */ new Set();
23
+ const unmatchedComponents = [];
24
+ if (included === "auto") {
25
+ const usage = scanAntdUsage(scan);
26
+ if (usage.wildcard) for (const name of antdProbeNames) names.add(name);
27
+ else {
28
+ const expanded = expandComponentsToProbes(usage.components);
29
+ for (const name of expanded.probes) names.add(name);
30
+ unmatchedComponents.push(...expanded.unmatched);
31
+ }
32
+ if (usage.importsLobeUi) for (const name of lobeUiAntdBaseline) names.add(name);
33
+ } else for (const name of included) names.add(name);
34
+ for (const name of extraIncluded) names.add(name);
35
+ return {
36
+ probes: [...[...names].sort().map((name) => [name, antdProbeRegistry[name].render]), ...customProbes],
37
+ unmatchedComponents
38
+ };
39
+ };
40
+ const buildAntdStaticCss = (options = {}) => {
41
+ const { theme = createProbeAntdTheme(), hrefTemplate = (hash) => `/antd.css?v=${hash}` } = options;
42
+ const { probes, unmatchedComponents } = resolveProbes(options);
43
+ const cache = createCache();
44
+ const failedProbes = [];
45
+ for (const [name, probe] of probes) try {
46
+ renderToString(createElement(StyleProvider, {
47
+ cache,
48
+ children: createElement(ConfigProvider, { theme }, probe())
49
+ }));
50
+ } catch {
51
+ failedProbes.push(name);
52
+ }
53
+ const css = extractStyle(cache, {
54
+ plain: true,
55
+ types: ["style"]
56
+ });
57
+ const hash = hashCss(css);
58
+ return {
59
+ css,
60
+ failedProbes,
61
+ hash,
62
+ href: hrefTemplate(hash),
63
+ probes: probes.map(([name]) => name),
64
+ styleKeys: styleKeysOf(cache).sort(),
65
+ unmatchedComponents
66
+ };
67
+ };
68
+ //#endregion
69
+ export { buildAntdStaticCss, createProbeAntdTheme };
70
+
71
+ //# sourceMappingURL=buildAntdStaticCss.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildAntdStaticCss.mjs","names":["antdTheme","extractCssinjsStyle"],"sources":["../../src/static-css/buildAntdStaticCss.ts"],"sourcesContent":["import { createCache, extractStyle as extractCssinjsStyle } from '@ant-design/cssinjs';\nimport type { ThemeConfig } from 'antd';\nimport { ConfigProvider, theme as antdTheme } from 'antd';\nimport { StyleProvider } from 'antd-style';\nimport type { ReactElement } from 'react';\nimport { createElement } from 'react';\nimport { renderToString } from 'react-dom/server';\n\nimport { createLobeAntdTheme } from '@/styles/theme/antdTheme';\n\nimport { lobeUiAntdBaseline } from './baseline';\nimport { hashCss } from './hash';\nimport type { AntdProbeName } from './registry';\nimport { antdProbeNames, antdProbeRegistry, expandComponentsToProbes } from './registry';\nimport type { ScanAntdUsageOptions } from './scan';\nimport { scanAntdUsage } from './scan';\nimport { styleKeysOf } from './shared';\n\nexport interface AntdStaticCssOptions {\n /** escape hatch for render paths the registry has no probe for */\n customProbes?: [name: string, render: () => ReactElement][];\n /** extra probes on top of 'auto' scan results */\n extraIncluded?: AntdProbeName[];\n hrefTemplate?: (hash: string) => string;\n included?: 'auto' | AntdProbeName[];\n scan?: ScanAntdUsageOptions;\n /** must equal the ConfigProvider theme used at SSR — token hash decides styleKeys matching */\n theme?: ThemeConfig;\n}\n\nexport interface AntdStaticCssPayload {\n css: string;\n failedProbes: string[];\n hash: string;\n href: string;\n probes: string[];\n styleKeys: string[];\n /** antd exports found by 'auto' scan that no registry probe covers */\n unmatchedComponents: string[];\n}\n\nexport const createProbeAntdTheme = (): ThemeConfig => {\n const config = createLobeAntdTheme({ appearance: 'light' });\n return {\n ...config,\n algorithm: [antdTheme.defaultAlgorithm, config.algorithm ?? []].flat(),\n };\n};\n\nconst resolveProbes = (options: AntdStaticCssOptions) => {\n const { included = 'auto', extraIncluded = [], customProbes = [], scan } = options;\n\n const names = new Set<AntdProbeName>();\n const unmatchedComponents: string[] = [];\n\n if (included === 'auto') {\n const usage = scanAntdUsage(scan);\n if (usage.wildcard) {\n for (const name of antdProbeNames) names.add(name);\n } else {\n const expanded = expandComponentsToProbes(usage.components);\n for (const name of expanded.probes) names.add(name);\n unmatchedComponents.push(...expanded.unmatched);\n }\n if (usage.importsLobeUi) for (const name of lobeUiAntdBaseline) names.add(name);\n } else {\n for (const name of included) names.add(name);\n }\n\n for (const name of extraIncluded) names.add(name);\n\n const probes: [string, () => ReactElement][] = [...names]\n .sort()\n .map((name) => [name, antdProbeRegistry[name].render]);\n\n return { probes: [...probes, ...customProbes], unmatchedComponents };\n};\n\nexport const buildAntdStaticCss = (options: AntdStaticCssOptions = {}): AntdStaticCssPayload => {\n const { theme = createProbeAntdTheme(), hrefTemplate = (hash) => `/antd.css?v=${hash}` } =\n options;\n\n const { probes, unmatchedComponents } = resolveProbes(options);\n\n const cache = createCache();\n const failedProbes: string[] = [];\n\n for (const [name, probe] of probes) {\n try {\n renderToString(\n createElement(StyleProvider, {\n cache,\n children: createElement(ConfigProvider, { theme }, probe()),\n }),\n );\n } catch {\n failedProbes.push(name);\n }\n }\n\n const css = extractCssinjsStyle(cache, { plain: true, types: ['style'] });\n const hash = hashCss(css);\n\n return {\n css,\n failedProbes,\n hash,\n href: hrefTemplate(hash),\n probes: probes.map(([name]) => name),\n styleKeys: styleKeysOf(cache as unknown as { cache: Map<string, unknown> }).sort(),\n unmatchedComponents,\n };\n};\n"],"mappings":";;;;;;;;;;;;AAyCA,MAAa,6BAA0C;CACrD,MAAM,SAAS,oBAAoB,EAAE,YAAY,QAAQ,CAAC;CAC1D,OAAO;EACL,GAAG;EACH,WAAW,CAACA,MAAU,kBAAkB,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK;CACvE;AACF;AAEA,MAAM,iBAAiB,YAAkC;CACvD,MAAM,EAAE,WAAW,QAAQ,gBAAgB,CAAC,GAAG,eAAe,CAAC,GAAG,SAAS;CAE3E,MAAM,wBAAQ,IAAI,IAAmB;CACrC,MAAM,sBAAgC,CAAC;CAEvC,IAAI,aAAa,QAAQ;EACvB,MAAM,QAAQ,cAAc,IAAI;EAChC,IAAI,MAAM,UACR,KAAK,MAAM,QAAQ,gBAAgB,MAAM,IAAI,IAAI;OAC5C;GACL,MAAM,WAAW,yBAAyB,MAAM,UAAU;GAC1D,KAAK,MAAM,QAAQ,SAAS,QAAQ,MAAM,IAAI,IAAI;GAClD,oBAAoB,KAAK,GAAG,SAAS,SAAS;EAChD;EACA,IAAI,MAAM,eAAe,KAAK,MAAM,QAAQ,oBAAoB,MAAM,IAAI,IAAI;CAChF,OACE,KAAK,MAAM,QAAQ,UAAU,MAAM,IAAI,IAAI;CAG7C,KAAK,MAAM,QAAQ,eAAe,MAAM,IAAI,IAAI;CAMhD,OAAO;EAAE,QAAQ,CAAC,GAJ6B,CAAC,GAAG,KAAK,CAAC,CACtD,KAAK,CAAC,CACN,KAAK,SAAS,CAAC,MAAM,kBAAkB,KAAK,CAAC,MAAM,CAE5B,GAAG,GAAG,YAAY;EAAG;CAAoB;AACrE;AAEA,MAAa,sBAAsB,UAAgC,CAAC,MAA4B;CAC9F,MAAM,EAAE,QAAQ,qBAAqB,GAAG,gBAAgB,SAAS,eAAe,WAC9E;CAEF,MAAM,EAAE,QAAQ,wBAAwB,cAAc,OAAO;CAE7D,MAAM,QAAQ,YAAY;CAC1B,MAAM,eAAyB,CAAC;CAEhC,KAAK,MAAM,CAAC,MAAM,UAAU,QAC1B,IAAI;EACF,eACE,cAAc,eAAe;GAC3B;GACA,UAAU,cAAc,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAAC;EAC5D,CAAC,CACH;CACF,QAAQ;EACN,aAAa,KAAK,IAAI;CACxB;CAGF,MAAM,MAAMC,aAAoB,OAAO;EAAE,OAAO;EAAM,OAAO,CAAC,OAAO;CAAE,CAAC;CACxE,MAAM,OAAO,QAAQ,GAAG;CAExB,OAAO;EACL;EACA;EACA;EACA,MAAM,aAAa,IAAI;EACvB,QAAQ,OAAO,KAAK,CAAC,UAAU,IAAI;EACnC,WAAW,YAAY,KAAmD,CAAC,CAAC,KAAK;EACjF;CACF;AACF"}
@@ -0,0 +1,18 @@
1
+ import { AntdStaticCssOptions, AntdStaticCssPayload } from "../buildAntdStaticCss.mjs";
2
+ import { ThemeVarsCssOptions, ThemeVarsCssPayload } from "../themeVars.mjs";
3
+ //#region src/static-css/emit/index.d.ts
4
+ interface EmitStaticCssOptions {
5
+ antd?: AntdStaticCssOptions | false;
6
+ manifestPath?: string;
7
+ outDir: string;
8
+ themeVars?: ThemeVarsCssOptions | false;
9
+ }
10
+ interface EmitStaticCssResult {
11
+ antd?: AntdStaticCssPayload;
12
+ files: string[];
13
+ themeVars?: ThemeVarsCssPayload;
14
+ }
15
+ declare const emitStaticCssAssets: (options: EmitStaticCssOptions) => Promise<EmitStaticCssResult>;
16
+ //#endregion
17
+ export { EmitStaticCssOptions, EmitStaticCssResult, emitStaticCssAssets };
18
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1,42 @@
1
+ import path from "node:path";
2
+ import { mkdir, writeFile } from "node:fs/promises";
3
+ //#region src/static-css/emit/index.ts
4
+ process.env.NODE_ENV = "production";
5
+ const emitStaticCssAssets = async (options) => {
6
+ const { outDir, manifestPath = path.join(outDir, "static-css.manifest.json") } = options;
7
+ await mkdir(outDir, { recursive: true });
8
+ const result = { files: [] };
9
+ const manifest = {};
10
+ if (options.antd !== false) {
11
+ const { buildAntdStaticCss } = await import("../buildAntdStaticCss.mjs");
12
+ const payload = buildAntdStaticCss(options.antd);
13
+ const file = path.join(outDir, "antd.css");
14
+ await writeFile(file, payload.css, "utf8");
15
+ result.antd = payload;
16
+ result.files.push(file);
17
+ manifest.antd = {
18
+ hash: payload.hash,
19
+ href: payload.href,
20
+ styleKeys: payload.styleKeys
21
+ };
22
+ }
23
+ if (options.themeVars !== false) {
24
+ const { buildThemeVarsCss } = await import("../themeVars.mjs");
25
+ const payload = buildThemeVarsCss(options.themeVars);
26
+ const file = path.join(outDir, "theme-vars.css");
27
+ await writeFile(file, payload.css, "utf8");
28
+ result.themeVars = payload;
29
+ result.files.push(file);
30
+ manifest.themeVars = {
31
+ hash: payload.hash,
32
+ href: payload.href
33
+ };
34
+ }
35
+ await writeFile(manifestPath, JSON.stringify(manifest, null, 2), "utf8");
36
+ result.files.push(manifestPath);
37
+ return result;
38
+ };
39
+ //#endregion
40
+ export { emitStaticCssAssets };
41
+
42
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/static-css/emit/index.ts"],"sourcesContent":["// react-dom/server, @ant-design/cssinjs and antd-style pick their dev/prod flavor\n// at import time and the dev flavor emits different CSS, so production must be\n// forced before any React/antd module loads — hence this entry has no static\n// imports of them and must be imported before anything that does.\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport type { AntdStaticCssOptions, AntdStaticCssPayload } from '../buildAntdStaticCss';\nimport type { ThemeVarsCssOptions, ThemeVarsCssPayload } from '../themeVars';\n\nprocess.env.NODE_ENV = 'production';\n\nexport interface EmitStaticCssOptions {\n antd?: AntdStaticCssOptions | false;\n manifestPath?: string;\n outDir: string;\n themeVars?: ThemeVarsCssOptions | false;\n}\n\nexport interface EmitStaticCssResult {\n antd?: AntdStaticCssPayload;\n files: string[];\n themeVars?: ThemeVarsCssPayload;\n}\n\nexport const emitStaticCssAssets = async (\n options: EmitStaticCssOptions,\n): Promise<EmitStaticCssResult> => {\n const { outDir, manifestPath = path.join(outDir, 'static-css.manifest.json') } = options;\n\n await mkdir(outDir, { recursive: true });\n\n const result: EmitStaticCssResult = { files: [] };\n const manifest: Record<string, unknown> = {};\n\n if (options.antd !== false) {\n const { buildAntdStaticCss } = await import('../buildAntdStaticCss');\n const payload = buildAntdStaticCss(options.antd);\n const file = path.join(outDir, 'antd.css');\n await writeFile(file, payload.css, 'utf8');\n result.antd = payload;\n result.files.push(file);\n manifest.antd = { hash: payload.hash, href: payload.href, styleKeys: payload.styleKeys };\n }\n\n if (options.themeVars !== false) {\n const { buildThemeVarsCss } = await import('../themeVars');\n const payload = buildThemeVarsCss(options.themeVars);\n const file = path.join(outDir, 'theme-vars.css');\n await writeFile(file, payload.css, 'utf8');\n result.themeVars = payload;\n result.files.push(file);\n manifest.themeVars = { hash: payload.hash, href: payload.href };\n }\n\n await writeFile(manifestPath, JSON.stringify(manifest, null, 2), 'utf8');\n result.files.push(manifestPath);\n\n return result;\n};\n"],"mappings":";;;AAUA,QAAQ,IAAI,WAAW;AAevB,MAAa,sBAAsB,OACjC,YACiC;CACjC,MAAM,EAAE,QAAQ,eAAe,KAAK,KAAK,QAAQ,0BAA0B,MAAM;CAEjF,MAAM,MAAM,QAAQ,EAAE,WAAW,KAAK,CAAC;CAEvC,MAAM,SAA8B,EAAE,OAAO,CAAC,EAAE;CAChD,MAAM,WAAoC,CAAC;CAE3C,IAAI,QAAQ,SAAS,OAAO;EAC1B,MAAM,EAAE,uBAAuB,MAAM,OAAO;EAC5C,MAAM,UAAU,mBAAmB,QAAQ,IAAI;EAC/C,MAAM,OAAO,KAAK,KAAK,QAAQ,UAAU;EACzC,MAAM,UAAU,MAAM,QAAQ,KAAK,MAAM;EACzC,OAAO,OAAO;EACd,OAAO,MAAM,KAAK,IAAI;EACtB,SAAS,OAAO;GAAE,MAAM,QAAQ;GAAM,MAAM,QAAQ;GAAM,WAAW,QAAQ;EAAU;CACzF;CAEA,IAAI,QAAQ,cAAc,OAAO;EAC/B,MAAM,EAAE,sBAAsB,MAAM,OAAO;EAC3C,MAAM,UAAU,kBAAkB,QAAQ,SAAS;EACnD,MAAM,OAAO,KAAK,KAAK,QAAQ,gBAAgB;EAC/C,MAAM,UAAU,MAAM,QAAQ,KAAK,MAAM;EACzC,OAAO,YAAY;EACnB,OAAO,MAAM,KAAK,IAAI;EACtB,SAAS,YAAY;GAAE,MAAM,QAAQ;GAAM,MAAM,QAAQ;EAAK;CAChE;CAEA,MAAM,UAAU,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC,GAAG,MAAM;CACvE,OAAO,MAAM,KAAK,YAAY;CAE9B,OAAO;AACT"}
@@ -0,0 +1,7 @@
1
+ import { createHash } from "node:crypto";
2
+ //#region src/static-css/hash.ts
3
+ const hashCss = (css) => createHash("sha256").update(css).digest("hex").slice(0, 8);
4
+ //#endregion
5
+ export { hashCss };
6
+
7
+ //# sourceMappingURL=hash.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.mjs","names":[],"sources":["../../src/static-css/hash.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\n\nexport const hashCss = (css: string): string =>\n createHash('sha256').update(css).digest('hex').slice(0, 8);\n"],"mappings":";;AAEA,MAAa,WAAW,QACtB,WAAW,QAAQ,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { AntdProbeDef, AntdProbeName, ExpandedProbes, antdProbeNames, antdProbeRegistry, expandComponentsToProbes, nonProbeAntdExports } from "./registry.mjs";
2
+ import { AntdUsageScanResult, ScanAntdUsageOptions, scanAntdUsage } from "./scan.mjs";
3
+ import { AntdStaticCssOptions, AntdStaticCssPayload, buildAntdStaticCss, createProbeAntdTheme } from "./buildAntdStaticCss.mjs";
4
+ import { ThemeVarsCssOptions, ThemeVarsCssPayload, buildThemeVarsCss } from "./themeVars.mjs";
5
+ import { lobeUiAntdBaseline } from "./baseline.mjs";
6
+ export { type AntdProbeDef, type AntdProbeName, type AntdStaticCssOptions, type AntdStaticCssPayload, type AntdUsageScanResult, type ExpandedProbes, type ScanAntdUsageOptions, type ThemeVarsCssOptions, type ThemeVarsCssPayload, antdProbeNames, antdProbeRegistry, buildAntdStaticCss, buildThemeVarsCss, createProbeAntdTheme, expandComponentsToProbes, lobeUiAntdBaseline, nonProbeAntdExports, scanAntdUsage };
@@ -0,0 +1 @@
1
+ export * from './index.d.mts';
@@ -0,0 +1 @@
1
+ export * from './index.mjs';
@@ -0,0 +1,6 @@
1
+ import { lobeUiAntdBaseline } from "./baseline.mjs";
2
+ import { antdProbeNames, antdProbeRegistry, expandComponentsToProbes, nonProbeAntdExports } from "./registry.mjs";
3
+ import { scanAntdUsage } from "./scan.mjs";
4
+ import { buildAntdStaticCss, createProbeAntdTheme } from "./buildAntdStaticCss.mjs";
5
+ import { buildThemeVarsCss } from "./themeVars.mjs";
6
+ export { antdProbeNames, antdProbeRegistry, buildAntdStaticCss, buildThemeVarsCss, createProbeAntdTheme, expandComponentsToProbes, lobeUiAntdBaseline, nonProbeAntdExports, scanAntdUsage };
@@ -0,0 +1,20 @@
1
+ import { ReactElement } from "react";
2
+ //#region src/static-css/registry.d.ts
3
+ interface AntdProbeDef {
4
+ /** antd export name whose usage activates this probe during auto scan */
5
+ detect: string;
6
+ render: () => ReactElement;
7
+ }
8
+ declare const PROBE_NAMES: readonly ["alert", "anchor", "app", "auto-complete", "avatar", "badge", "breadcrumb", "button", "card", "checkbox", "collapse", "color-picker", "date-picker", "divider", "drawer", "dropdown", "empty", "flex", "float-button", "form", "grid-col", "grid-row", "image", "input", "input-number", "input-textarea", "mentions", "menu", "modal", "pagination", "popover", "progress", "qrcode", "radio", "rate", "segmented", "select", "skeleton", "slider", "space", "spin", "steps", "switch", "table", "tabs", "tag", "tag-preset", "tag-status", "tooltip", "tree", "typography", "upload"];
9
+ type AntdProbeName = (typeof PROBE_NAMES)[number];
10
+ declare const antdProbeNames: AntdProbeName[];
11
+ declare const antdProbeRegistry: Record<AntdProbeName, AntdProbeDef>;
12
+ declare const nonProbeAntdExports: Set<string>;
13
+ interface ExpandedProbes {
14
+ probes: AntdProbeName[];
15
+ unmatched: string[];
16
+ }
17
+ declare const expandComponentsToProbes: (components: Iterable<string>) => ExpandedProbes;
18
+ //#endregion
19
+ export { AntdProbeDef, AntdProbeName, ExpandedProbes, antdProbeNames, antdProbeRegistry, expandComponentsToProbes, nonProbeAntdExports };
20
+ //# sourceMappingURL=registry.d.mts.map
@@ -0,0 +1,298 @@
1
+ import { createElement } from "react";
2
+ import { Alert, Anchor, App, AutoComplete, Avatar, Badge, Breadcrumb, Button, Card, Checkbox, Col, Collapse, ColorPicker, DatePicker, Divider, Drawer, Dropdown, Empty, Flex, FloatButton, Form, Image, Input, InputNumber, Mentions, Menu, Modal, Pagination, Popover, Progress, QRCode, Radio, Rate, Row, Segmented, Select, Skeleton, Slider, Space, Spin, Steps, Switch, Table, Tabs, Tag, Tooltip, Tree, Typography, Upload } from "antd";
3
+ const antdProbeNames = [...[
4
+ "alert",
5
+ "anchor",
6
+ "app",
7
+ "auto-complete",
8
+ "avatar",
9
+ "badge",
10
+ "breadcrumb",
11
+ "button",
12
+ "card",
13
+ "checkbox",
14
+ "collapse",
15
+ "color-picker",
16
+ "date-picker",
17
+ "divider",
18
+ "drawer",
19
+ "dropdown",
20
+ "empty",
21
+ "flex",
22
+ "float-button",
23
+ "form",
24
+ "grid-col",
25
+ "grid-row",
26
+ "image",
27
+ "input",
28
+ "input-number",
29
+ "input-textarea",
30
+ "mentions",
31
+ "menu",
32
+ "modal",
33
+ "pagination",
34
+ "popover",
35
+ "progress",
36
+ "qrcode",
37
+ "radio",
38
+ "rate",
39
+ "segmented",
40
+ "select",
41
+ "skeleton",
42
+ "slider",
43
+ "space",
44
+ "spin",
45
+ "steps",
46
+ "switch",
47
+ "table",
48
+ "tabs",
49
+ "tag",
50
+ "tag-preset",
51
+ "tag-status",
52
+ "tooltip",
53
+ "tree",
54
+ "typography",
55
+ "upload"
56
+ ]];
57
+ const antdProbeRegistry = {
58
+ "alert": {
59
+ detect: "Alert",
60
+ render: () => createElement(Alert, { message: "-" })
61
+ },
62
+ "anchor": {
63
+ detect: "Anchor",
64
+ render: () => createElement(Anchor, { items: [] })
65
+ },
66
+ "app": {
67
+ detect: "App",
68
+ render: () => createElement(App, null, "-")
69
+ },
70
+ "auto-complete": {
71
+ detect: "AutoComplete",
72
+ render: () => createElement(AutoComplete)
73
+ },
74
+ "avatar": {
75
+ detect: "Avatar",
76
+ render: () => createElement(Avatar)
77
+ },
78
+ "badge": {
79
+ detect: "Badge",
80
+ render: () => createElement(Badge, { count: 1 })
81
+ },
82
+ "breadcrumb": {
83
+ detect: "Breadcrumb",
84
+ render: () => createElement(Breadcrumb, { items: [] })
85
+ },
86
+ "button": {
87
+ detect: "Button",
88
+ render: () => createElement(Button, null, "-")
89
+ },
90
+ "card": {
91
+ detect: "Card",
92
+ render: () => createElement(Card, null, "-")
93
+ },
94
+ "checkbox": {
95
+ detect: "Checkbox",
96
+ render: () => createElement(Checkbox)
97
+ },
98
+ "collapse": {
99
+ detect: "Collapse",
100
+ render: () => createElement(Collapse, { items: [] })
101
+ },
102
+ "color-picker": {
103
+ detect: "ColorPicker",
104
+ render: () => createElement(ColorPicker)
105
+ },
106
+ "date-picker": {
107
+ detect: "DatePicker",
108
+ render: () => createElement(DatePicker)
109
+ },
110
+ "divider": {
111
+ detect: "Divider",
112
+ render: () => createElement(Divider)
113
+ },
114
+ "drawer": {
115
+ detect: "Drawer",
116
+ render: () => createElement(Drawer, { open: false })
117
+ },
118
+ "dropdown": {
119
+ detect: "Dropdown",
120
+ render: () => createElement(Dropdown, { menu: { items: [] } }, createElement("span"))
121
+ },
122
+ "empty": {
123
+ detect: "Empty",
124
+ render: () => createElement(Empty)
125
+ },
126
+ "flex": {
127
+ detect: "Flex",
128
+ render: () => createElement(Flex, null, createElement("span"))
129
+ },
130
+ "float-button": {
131
+ detect: "FloatButton",
132
+ render: () => createElement(FloatButton)
133
+ },
134
+ "form": {
135
+ detect: "Form",
136
+ render: () => createElement(Form, null, createElement(Form.Item, { label: "-" }, createElement("span")))
137
+ },
138
+ "grid-col": {
139
+ detect: "Col",
140
+ render: () => createElement(Col, { span: 1 })
141
+ },
142
+ "grid-row": {
143
+ detect: "Row",
144
+ render: () => createElement(Row)
145
+ },
146
+ "image": {
147
+ detect: "Image",
148
+ render: () => createElement(Image, { src: "" })
149
+ },
150
+ "input": {
151
+ detect: "Input",
152
+ render: () => createElement(Input)
153
+ },
154
+ "input-number": {
155
+ detect: "InputNumber",
156
+ render: () => createElement(InputNumber)
157
+ },
158
+ "input-textarea": {
159
+ detect: "Input",
160
+ render: () => createElement(Input.TextArea)
161
+ },
162
+ "mentions": {
163
+ detect: "Mentions",
164
+ render: () => createElement(Mentions)
165
+ },
166
+ "menu": {
167
+ detect: "Menu",
168
+ render: () => createElement(Menu, { items: [] })
169
+ },
170
+ "modal": {
171
+ detect: "Modal",
172
+ render: () => createElement(Modal, { open: false })
173
+ },
174
+ "pagination": {
175
+ detect: "Pagination",
176
+ render: () => createElement(Pagination)
177
+ },
178
+ "popover": {
179
+ detect: "Popover",
180
+ render: () => createElement(Popover, null, createElement("span"))
181
+ },
182
+ "progress": {
183
+ detect: "Progress",
184
+ render: () => createElement(Progress, { percent: 0 })
185
+ },
186
+ "qrcode": {
187
+ detect: "QRCode",
188
+ render: () => createElement(QRCode, { value: "-" })
189
+ },
190
+ "radio": {
191
+ detect: "Radio",
192
+ render: () => createElement(Radio)
193
+ },
194
+ "rate": {
195
+ detect: "Rate",
196
+ render: () => createElement(Rate)
197
+ },
198
+ "segmented": {
199
+ detect: "Segmented",
200
+ render: () => createElement(Segmented, { options: ["-"] })
201
+ },
202
+ "select": {
203
+ detect: "Select",
204
+ render: () => createElement(Select)
205
+ },
206
+ "skeleton": {
207
+ detect: "Skeleton",
208
+ render: () => createElement(Skeleton)
209
+ },
210
+ "slider": {
211
+ detect: "Slider",
212
+ render: () => createElement(Slider)
213
+ },
214
+ "space": {
215
+ detect: "Space",
216
+ render: () => createElement(Space, null, createElement("span"))
217
+ },
218
+ "spin": {
219
+ detect: "Spin",
220
+ render: () => createElement(Spin)
221
+ },
222
+ "steps": {
223
+ detect: "Steps",
224
+ render: () => createElement(Steps, { items: [] })
225
+ },
226
+ "switch": {
227
+ detect: "Switch",
228
+ render: () => createElement(Switch)
229
+ },
230
+ "table": {
231
+ detect: "Table",
232
+ render: () => createElement(Table, {
233
+ columns: [],
234
+ dataSource: []
235
+ })
236
+ },
237
+ "tabs": {
238
+ detect: "Tabs",
239
+ render: () => createElement(Tabs, { items: [] })
240
+ },
241
+ "tag": {
242
+ detect: "Tag",
243
+ render: () => createElement(Tag, null, "-")
244
+ },
245
+ "tag-preset": {
246
+ detect: "Tag",
247
+ render: () => createElement(Tag, { color: "blue" }, "-")
248
+ },
249
+ "tag-status": {
250
+ detect: "Tag",
251
+ render: () => createElement(Tag, { color: "success" }, "-")
252
+ },
253
+ "tooltip": {
254
+ detect: "Tooltip",
255
+ render: () => createElement(Tooltip, { title: "-" }, createElement("span"))
256
+ },
257
+ "tree": {
258
+ detect: "Tree",
259
+ render: () => createElement(Tree, { treeData: [] })
260
+ },
261
+ "typography": {
262
+ detect: "Typography",
263
+ render: () => createElement(Typography.Text, null, "-")
264
+ },
265
+ "upload": {
266
+ detect: "Upload",
267
+ render: () => createElement(Upload)
268
+ }
269
+ };
270
+ const nonProbeAntdExports = /* @__PURE__ */ new Set([
271
+ "ConfigProvider",
272
+ "Grid",
273
+ "message",
274
+ "notification",
275
+ "theme",
276
+ "Theme",
277
+ "version"
278
+ ]);
279
+ const expandComponentsToProbes = (components) => {
280
+ const probes = /* @__PURE__ */ new Set();
281
+ const unmatched = [];
282
+ for (const component of components) {
283
+ let matched = false;
284
+ for (const name of antdProbeNames) if (antdProbeRegistry[name].detect === component) {
285
+ probes.add(name);
286
+ matched = true;
287
+ }
288
+ if (!matched && !nonProbeAntdExports.has(component)) unmatched.push(component);
289
+ }
290
+ return {
291
+ probes: [...probes].sort(),
292
+ unmatched: unmatched.sort()
293
+ };
294
+ };
295
+ //#endregion
296
+ export { antdProbeNames, antdProbeRegistry, expandComponentsToProbes, nonProbeAntdExports };
297
+
298
+ //# sourceMappingURL=registry.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.mjs","names":[],"sources":["../../src/static-css/registry.ts"],"sourcesContent":["import {\n Alert,\n Anchor,\n App,\n AutoComplete,\n Avatar,\n Badge,\n Breadcrumb,\n Button,\n Card,\n Checkbox,\n Col,\n Collapse,\n ColorPicker,\n DatePicker,\n Divider,\n Drawer,\n Dropdown,\n Empty,\n Flex,\n FloatButton,\n Form,\n Image,\n Input,\n InputNumber,\n Mentions,\n Menu,\n Modal,\n Pagination,\n Popover,\n Progress,\n QRCode,\n Radio,\n Rate,\n Row,\n Segmented,\n Select,\n Skeleton,\n Slider,\n Space,\n Spin,\n Steps,\n Switch,\n Table,\n Tabs,\n Tag,\n Tooltip,\n Tree,\n Typography,\n Upload,\n} from 'antd';\nimport type { ReactElement } from 'react';\nimport { createElement } from 'react';\n\nexport interface AntdProbeDef {\n /** antd export name whose usage activates this probe during auto scan */\n detect: string;\n render: () => ReactElement;\n}\n\nconst PROBE_NAMES = [\n 'alert',\n 'anchor',\n 'app',\n 'auto-complete',\n 'avatar',\n 'badge',\n 'breadcrumb',\n 'button',\n 'card',\n 'checkbox',\n 'collapse',\n 'color-picker',\n 'date-picker',\n 'divider',\n 'drawer',\n 'dropdown',\n 'empty',\n 'flex',\n 'float-button',\n 'form',\n 'grid-col',\n 'grid-row',\n 'image',\n 'input',\n 'input-number',\n 'input-textarea',\n 'mentions',\n 'menu',\n 'modal',\n 'pagination',\n 'popover',\n 'progress',\n 'qrcode',\n 'radio',\n 'rate',\n 'segmented',\n 'select',\n 'skeleton',\n 'slider',\n 'space',\n 'spin',\n 'steps',\n 'switch',\n 'table',\n 'tabs',\n 'tag',\n 'tag-preset',\n 'tag-status',\n 'tooltip',\n 'tree',\n 'typography',\n 'upload',\n] as const;\n\nexport type AntdProbeName = (typeof PROBE_NAMES)[number];\n\nexport const antdProbeNames: AntdProbeName[] = [...PROBE_NAMES];\n\nexport const antdProbeRegistry: Record<AntdProbeName, AntdProbeDef> = {\n 'alert': { detect: 'Alert', render: () => createElement(Alert, { message: '-' }) },\n 'anchor': { detect: 'Anchor', render: () => createElement(Anchor, { items: [] }) },\n 'app': { detect: 'App', render: () => createElement(App, null, '-') },\n 'auto-complete': { detect: 'AutoComplete', render: () => createElement(AutoComplete) },\n 'avatar': { detect: 'Avatar', render: () => createElement(Avatar) },\n 'badge': { detect: 'Badge', render: () => createElement(Badge, { count: 1 }) },\n 'breadcrumb': { detect: 'Breadcrumb', render: () => createElement(Breadcrumb, { items: [] }) },\n 'button': { detect: 'Button', render: () => createElement(Button, null, '-') },\n 'card': { detect: 'Card', render: () => createElement(Card, null, '-') },\n 'checkbox': { detect: 'Checkbox', render: () => createElement(Checkbox) },\n 'collapse': { detect: 'Collapse', render: () => createElement(Collapse, { items: [] }) },\n 'color-picker': { detect: 'ColorPicker', render: () => createElement(ColorPicker) },\n 'date-picker': { detect: 'DatePicker', render: () => createElement(DatePicker) },\n 'divider': { detect: 'Divider', render: () => createElement(Divider) },\n 'drawer': { detect: 'Drawer', render: () => createElement(Drawer, { open: false }) },\n 'dropdown': {\n detect: 'Dropdown',\n render: () => createElement(Dropdown, { menu: { items: [] } }, createElement('span')),\n },\n 'empty': { detect: 'Empty', render: () => createElement(Empty) },\n 'flex': { detect: 'Flex', render: () => createElement(Flex, null, createElement('span')) },\n 'float-button': { detect: 'FloatButton', render: () => createElement(FloatButton) },\n 'form': {\n detect: 'Form',\n render: () =>\n createElement(Form, null, createElement(Form.Item, { label: '-' }, createElement('span'))),\n },\n 'grid-col': { detect: 'Col', render: () => createElement(Col, { span: 1 }) },\n 'grid-row': { detect: 'Row', render: () => createElement(Row) },\n 'image': { detect: 'Image', render: () => createElement(Image, { src: '' }) },\n 'input': { detect: 'Input', render: () => createElement(Input) },\n 'input-number': { detect: 'InputNumber', render: () => createElement(InputNumber) },\n 'input-textarea': { detect: 'Input', render: () => createElement(Input.TextArea) },\n 'mentions': { detect: 'Mentions', render: () => createElement(Mentions) },\n 'menu': { detect: 'Menu', render: () => createElement(Menu, { items: [] }) },\n 'modal': { detect: 'Modal', render: () => createElement(Modal, { open: false }) },\n 'pagination': { detect: 'Pagination', render: () => createElement(Pagination) },\n 'popover': {\n detect: 'Popover',\n render: () => createElement(Popover, null, createElement('span')),\n },\n 'progress': { detect: 'Progress', render: () => createElement(Progress, { percent: 0 }) },\n 'qrcode': { detect: 'QRCode', render: () => createElement(QRCode, { value: '-' }) },\n 'radio': { detect: 'Radio', render: () => createElement(Radio) },\n 'rate': { detect: 'Rate', render: () => createElement(Rate) },\n 'segmented': { detect: 'Segmented', render: () => createElement(Segmented, { options: ['-'] }) },\n 'select': { detect: 'Select', render: () => createElement(Select) },\n 'skeleton': { detect: 'Skeleton', render: () => createElement(Skeleton) },\n 'slider': { detect: 'Slider', render: () => createElement(Slider) },\n 'space': { detect: 'Space', render: () => createElement(Space, null, createElement('span')) },\n 'spin': { detect: 'Spin', render: () => createElement(Spin) },\n 'steps': { detect: 'Steps', render: () => createElement(Steps, { items: [] }) },\n 'switch': { detect: 'Switch', render: () => createElement(Switch) },\n 'table': { detect: 'Table', render: () => createElement(Table, { columns: [], dataSource: [] }) },\n 'tabs': { detect: 'Tabs', render: () => createElement(Tabs, { items: [] }) },\n 'tag': { detect: 'Tag', render: () => createElement(Tag, null, '-') },\n 'tag-preset': { detect: 'Tag', render: () => createElement(Tag, { color: 'blue' }, '-') },\n 'tag-status': { detect: 'Tag', render: () => createElement(Tag, { color: 'success' }, '-') },\n 'tooltip': {\n detect: 'Tooltip',\n render: () => createElement(Tooltip, { title: '-' }, createElement('span')),\n },\n 'tree': { detect: 'Tree', render: () => createElement(Tree, { treeData: [] }) },\n 'typography': { detect: 'Typography', render: () => createElement(Typography.Text, null, '-') },\n 'upload': { detect: 'Upload', render: () => createElement(Upload) },\n};\n\n// Imperative or unstyled antd exports the scanner may find but no probe should cover.\nexport const nonProbeAntdExports = new Set([\n 'ConfigProvider',\n 'Grid',\n 'message',\n 'notification',\n 'theme',\n // kebabToPascal('antd/es/theme') during deep-import scan\n 'Theme',\n 'version',\n]);\n\nexport interface ExpandedProbes {\n probes: AntdProbeName[];\n unmatched: string[];\n}\n\nexport const expandComponentsToProbes = (components: Iterable<string>): ExpandedProbes => {\n const probes = new Set<AntdProbeName>();\n const unmatched: string[] = [];\n\n for (const component of components) {\n let matched = false;\n for (const name of antdProbeNames) {\n if (antdProbeRegistry[name].detect === component) {\n probes.add(name);\n matched = true;\n }\n }\n if (!matched && !nonProbeAntdExports.has(component)) unmatched.push(component);\n }\n\n return { probes: [...probes].sort(), unmatched: unmatched.sort() };\n};\n"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ //#region src/static-css/runtime/index.d.ts
2
+ interface InlineAntdStyleResult {
3
+ css: string;
4
+ /** css wrapped in a prepend-ordered style tag, '' when empty */
5
+ html: string;
6
+ /** probe-uncovered components whose rules fell back inline */
7
+ uncovered: string[];
8
+ }
9
+ declare const buildInlineAntdStyle: (runtimeCache: unknown, payload: {
10
+ styleKeys: Iterable<string>;
11
+ }) => InlineAntdStyleResult;
12
+ //#endregion
13
+ export { InlineAntdStyleResult, buildInlineAntdStyle };
14
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1,34 @@
1
+ import { styleKeysOf } from "../shared.mjs";
2
+ import { extractStyle } from "@ant-design/cssinjs";
3
+ //#region src/static-css/runtime/index.ts
4
+ const buildInlineAntdStyle = (runtimeCache, payload) => {
5
+ const staticKeys = payload.styleKeys instanceof Set ? payload.styleKeys : new Set(payload.styleKeys);
6
+ const cssinjsCache = runtimeCache;
7
+ const cssVarCss = extractStyle(cssinjsCache, {
8
+ plain: true,
9
+ types: ["cssVar"]
10
+ });
11
+ const uncoveredKeys = styleKeysOf(cssinjsCache).filter((key) => !staticKeys.has(key));
12
+ let uncoveredCss = "";
13
+ if (uncoveredKeys.length > 0) {
14
+ const pseudoCache = {
15
+ cache: new Map(uncoveredKeys.map((key) => [key, cssinjsCache.cache.get(key)])),
16
+ extracted: /* @__PURE__ */ new Set(),
17
+ updateTimes: cssinjsCache.updateTimes
18
+ };
19
+ uncoveredCss = extractStyle(pseudoCache, {
20
+ plain: true,
21
+ types: ["style"]
22
+ });
23
+ }
24
+ const css = cssVarCss + uncoveredCss;
25
+ return {
26
+ css,
27
+ html: css ? `<style data-rc-order="prepend" data-rc-priority="-9999">${css}</style>` : "",
28
+ uncovered: uncoveredKeys.map((key) => key.split("%")[2] ?? key)
29
+ };
30
+ };
31
+ //#endregion
32
+ export { buildInlineAntdStyle };
33
+
34
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["extractCssinjsStyle"],"sources":["../../../src/static-css/runtime/index.ts"],"sourcesContent":["import { extractStyle as extractCssinjsStyle } from '@ant-design/cssinjs';\n\nimport { styleKeysOf } from '../shared';\n\ninterface CssinjsCache {\n cache: Map<string, unknown>;\n extracted: Set<string>;\n updateTimes: Map<string, number>;\n}\n\nexport interface InlineAntdStyleResult {\n css: string;\n /** css wrapped in a prepend-ordered style tag, '' when empty */\n html: string;\n /** probe-uncovered components whose rules fell back inline */\n uncovered: string[];\n}\n\n// Replaces antd-style's inline antd entry: component css-var blocks always stay\n// inline (their values are the light-theme truth for this render), while style\n// rules ship via the static stylesheet — except components the probe set missed,\n// which fall back to inline rules.\nexport const buildInlineAntdStyle = (\n runtimeCache: unknown,\n payload: { styleKeys: Iterable<string> },\n): InlineAntdStyleResult => {\n const staticKeys =\n payload.styleKeys instanceof Set ? payload.styleKeys : new Set(payload.styleKeys);\n const cssinjsCache = runtimeCache as CssinjsCache;\n\n const cssVarCss = extractCssinjsStyle(cssinjsCache as never, {\n plain: true,\n types: ['cssVar'],\n });\n\n const uncoveredKeys = styleKeysOf(cssinjsCache).filter((key) => !staticKeys.has(key));\n let uncoveredCss = '';\n if (uncoveredKeys.length > 0) {\n const pseudoCache = {\n cache: new Map(uncoveredKeys.map((key) => [key, cssinjsCache.cache.get(key)])),\n extracted: new Set<string>(),\n updateTimes: cssinjsCache.updateTimes,\n };\n uncoveredCss = extractCssinjsStyle(pseudoCache as never, { plain: true, types: ['style'] });\n }\n\n const css = cssVarCss + uncoveredCss;\n\n return {\n css,\n html: css ? `<style data-rc-order=\"prepend\" data-rc-priority=\"-9999\">${css}</style>` : '',\n uncovered: uncoveredKeys.map((key) => key.split('%')[2] ?? key),\n };\n};\n"],"mappings":";;;AAsBA,MAAa,wBACX,cACA,YAC0B;CAC1B,MAAM,aACJ,QAAQ,qBAAqB,MAAM,QAAQ,YAAY,IAAI,IAAI,QAAQ,SAAS;CAClF,MAAM,eAAe;CAErB,MAAM,YAAYA,aAAoB,cAAuB;EAC3D,OAAO;EACP,OAAO,CAAC,QAAQ;CAClB,CAAC;CAED,MAAM,gBAAgB,YAAY,YAAY,CAAC,CAAC,QAAQ,QAAQ,CAAC,WAAW,IAAI,GAAG,CAAC;CACpF,IAAI,eAAe;CACnB,IAAI,cAAc,SAAS,GAAG;EAC5B,MAAM,cAAc;GAClB,OAAO,IAAI,IAAI,cAAc,KAAK,QAAQ,CAAC,KAAK,aAAa,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC;GAC7E,2BAAW,IAAI,IAAY;GAC3B,aAAa,aAAa;EAC5B;EACA,eAAeA,aAAoB,aAAsB;GAAE,OAAO;GAAM,OAAO,CAAC,OAAO;EAAE,CAAC;CAC5F;CAEA,MAAM,MAAM,YAAY;CAExB,OAAO;EACL;EACA,MAAM,MAAM,2DAA2D,IAAI,YAAY;EACvF,WAAW,cAAc,KAAK,QAAQ,IAAI,MAAM,GAAG,CAAC,CAAC,MAAM,GAAG;CAChE;AACF"}
@@ -0,0 +1,19 @@
1
+ //#region src/static-css/scan.d.ts
2
+ interface ScanAntdUsageOptions {
3
+ cwd?: string;
4
+ exclude?: RegExp[];
5
+ extensions?: string[];
6
+ roots?: string[];
7
+ }
8
+ interface AntdUsageScanResult {
9
+ /** PascalCase antd export names found in value imports */
10
+ components: string[];
11
+ importsLobeUi: boolean;
12
+ scannedFiles: number;
13
+ /** a namespace/default antd import was found — usage is not statically enumerable */
14
+ wildcard: boolean;
15
+ }
16
+ declare const scanAntdUsage: (options?: ScanAntdUsageOptions) => AntdUsageScanResult;
17
+ //#endregion
18
+ export { AntdUsageScanResult, ScanAntdUsageOptions, scanAntdUsage };
19
+ //# sourceMappingURL=scan.d.mts.map
@@ -0,0 +1,87 @@
1
+ import { readFileSync, readdirSync, statSync } from "node:fs";
2
+ import path from "node:path";
3
+ //#region src/static-css/scan.ts
4
+ const DEFAULT_EXTENSIONS = [
5
+ "ts",
6
+ "tsx",
7
+ "js",
8
+ "jsx",
9
+ "mjs",
10
+ "mts",
11
+ "cjs",
12
+ "cts"
13
+ ];
14
+ const DEFAULT_EXCLUDE = [
15
+ /node_modules/,
16
+ /\.test\./,
17
+ /\.spec\./,
18
+ /\.d\.[cm]?ts$/,
19
+ /__tests__/
20
+ ];
21
+ const NAMED_IMPORT_RE = /import\s+(type\s+)?((?:[\w$]+\s*,\s*)?\{[^}]*\}|[\w$]+|\*\s+as\s+[\w$]+)\s+from\s+['"]antd['"]/g;
22
+ const DEEP_IMPORT_RE = /from\s+['"]antd\/(?:es|lib)\/([\w-]+)/g;
23
+ const LOBE_UI_RE = /from\s+['"]@lobehub\/ui(?:['"]|\/)/;
24
+ const kebabToPascal = (name) => name.split("-").map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("");
25
+ const parseImportClause = (clause, components) => {
26
+ const braceStart = clause.indexOf("{");
27
+ const wildcard = (braceStart === -1 ? clause : clause.slice(0, braceStart)).trim().length > 0;
28
+ if (braceStart === -1) return wildcard;
29
+ const inner = clause.slice(braceStart + 1, clause.lastIndexOf("}"));
30
+ for (const rawSpecifier of inner.split(",")) {
31
+ const specifier = rawSpecifier.trim();
32
+ if (!specifier || specifier.startsWith("type ")) continue;
33
+ const name = specifier.split(/\s+as\s+/)[0].trim();
34
+ if (/^[A-Za-z_$][\w$]*$/.test(name)) components.add(name);
35
+ }
36
+ return wildcard;
37
+ };
38
+ const listFiles = (root, extensions, exclude) => {
39
+ let entries;
40
+ try {
41
+ entries = readdirSync(root, { recursive: true });
42
+ } catch {
43
+ return [];
44
+ }
45
+ return entries.map((entry) => path.join(root, entry)).filter((path) => {
46
+ if (exclude.some((pattern) => pattern.test(path))) return false;
47
+ const extension = path.split(".").pop();
48
+ if (!extension || !extensions.has(extension)) return false;
49
+ try {
50
+ return statSync(path).isFile();
51
+ } catch {
52
+ return false;
53
+ }
54
+ });
55
+ };
56
+ const scanAntdUsage = (options = {}) => {
57
+ const { cwd = process.cwd(), roots = ["src"], extensions = DEFAULT_EXTENSIONS, exclude = DEFAULT_EXCLUDE } = options;
58
+ const components = /* @__PURE__ */ new Set();
59
+ let importsLobeUi = false;
60
+ let wildcard = false;
61
+ let scannedFiles = 0;
62
+ for (const root of roots) for (const file of listFiles(path.resolve(cwd, root), new Set(extensions), exclude)) {
63
+ let source;
64
+ try {
65
+ source = readFileSync(file, "utf8");
66
+ } catch {
67
+ continue;
68
+ }
69
+ scannedFiles += 1;
70
+ if (!importsLobeUi && LOBE_UI_RE.test(source)) importsLobeUi = true;
71
+ for (const match of source.matchAll(NAMED_IMPORT_RE)) {
72
+ if (match[1]) continue;
73
+ if (parseImportClause(match[2], components)) wildcard = true;
74
+ }
75
+ for (const match of source.matchAll(DEEP_IMPORT_RE)) components.add(kebabToPascal(match[1]));
76
+ }
77
+ return {
78
+ components: [...components].sort(),
79
+ importsLobeUi,
80
+ scannedFiles,
81
+ wildcard
82
+ };
83
+ };
84
+ //#endregion
85
+ export { scanAntdUsage };
86
+
87
+ //# sourceMappingURL=scan.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.mjs","names":[],"sources":["../../src/static-css/scan.ts"],"sourcesContent":["import { readdirSync, readFileSync, statSync } from 'node:fs';\nimport path from 'node:path';\n\nexport interface ScanAntdUsageOptions {\n cwd?: string;\n exclude?: RegExp[];\n extensions?: string[];\n roots?: string[];\n}\n\nexport interface AntdUsageScanResult {\n /** PascalCase antd export names found in value imports */\n components: string[];\n importsLobeUi: boolean;\n scannedFiles: number;\n /** a namespace/default antd import was found — usage is not statically enumerable */\n wildcard: boolean;\n}\n\nconst DEFAULT_EXTENSIONS = ['ts', 'tsx', 'js', 'jsx', 'mjs', 'mts', 'cjs', 'cts'];\nconst DEFAULT_EXCLUDE = [/node_modules/, /\\.test\\./, /\\.spec\\./, /\\.d\\.[cm]?ts$/, /__tests__/];\n\n// clause alternatives ({named} / Default / Default, {named} / * as ns) deliberately\n// exclude statement-crossing text so one match never spans two imports\nconst NAMED_IMPORT_RE =\n /import\\s+(type\\s+)?((?:[\\w$]+\\s*,\\s*)?\\{[^}]*\\}|[\\w$]+|\\*\\s+as\\s+[\\w$]+)\\s+from\\s+['\"]antd['\"]/g;\n// type-only deep imports are included too — over-approximation is harmless here\nconst DEEP_IMPORT_RE = /from\\s+['\"]antd\\/(?:es|lib)\\/([\\w-]+)/g;\nconst LOBE_UI_RE = /from\\s+['\"]@lobehub\\/ui(?:['\"]|\\/)/;\n\nconst kebabToPascal = (name: string) =>\n name\n .split('-')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('');\n\nconst parseImportClause = (clause: string, components: Set<string>): boolean => {\n const braceStart = clause.indexOf('{');\n\n const bare = (braceStart === -1 ? clause : clause.slice(0, braceStart)).trim();\n const wildcard = bare.length > 0;\n\n if (braceStart === -1) return wildcard;\n\n const inner = clause.slice(braceStart + 1, clause.lastIndexOf('}'));\n for (const rawSpecifier of inner.split(',')) {\n const specifier = rawSpecifier.trim();\n if (!specifier || specifier.startsWith('type ')) continue;\n const name = specifier.split(/\\s+as\\s+/)[0]!.trim();\n if (/^[A-Za-z_$][\\w$]*$/.test(name)) components.add(name);\n }\n\n return wildcard;\n};\n\nconst listFiles = (root: string, extensions: Set<string>, exclude: RegExp[]): string[] => {\n let entries: string[];\n try {\n entries = readdirSync(root, { recursive: true }) as string[];\n } catch {\n return [];\n }\n\n return entries\n .map((entry) => path.join(root, entry))\n .filter((path) => {\n if (exclude.some((pattern) => pattern.test(path))) return false;\n const extension = path.split('.').pop();\n if (!extension || !extensions.has(extension)) return false;\n try {\n return statSync(path).isFile();\n } catch {\n return false;\n }\n });\n};\n\nexport const scanAntdUsage = (options: ScanAntdUsageOptions = {}): AntdUsageScanResult => {\n const {\n cwd = process.cwd(),\n roots = ['src'],\n extensions = DEFAULT_EXTENSIONS,\n exclude = DEFAULT_EXCLUDE,\n } = options;\n\n const components = new Set<string>();\n let importsLobeUi = false;\n let wildcard = false;\n let scannedFiles = 0;\n\n for (const root of roots) {\n for (const file of listFiles(path.resolve(cwd, root), new Set(extensions), exclude)) {\n let source: string;\n try {\n source = readFileSync(file, 'utf8');\n } catch {\n continue;\n }\n scannedFiles += 1;\n\n if (!importsLobeUi && LOBE_UI_RE.test(source)) importsLobeUi = true;\n\n for (const match of source.matchAll(NAMED_IMPORT_RE)) {\n if (match[1]) continue;\n if (parseImportClause(match[2]!, components)) wildcard = true;\n }\n\n for (const match of source.matchAll(DEEP_IMPORT_RE)) {\n components.add(kebabToPascal(match[1]!));\n }\n }\n }\n\n return { components: [...components].sort(), importsLobeUi, scannedFiles, wildcard };\n};\n"],"mappings":";;;AAmBA,MAAM,qBAAqB;CAAC;CAAM;CAAO;CAAM;CAAO;CAAO;CAAO;CAAO;AAAK;AAChF,MAAM,kBAAkB;CAAC;CAAgB;CAAY;CAAY;CAAiB;AAAW;AAI7F,MAAM,kBACJ;AAEF,MAAM,iBAAiB;AACvB,MAAM,aAAa;AAEnB,MAAM,iBAAiB,SACrB,KACG,MAAM,GAAG,CAAC,CACV,KAAK,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAC3D,KAAK,EAAE;AAEZ,MAAM,qBAAqB,QAAgB,eAAqC;CAC9E,MAAM,aAAa,OAAO,QAAQ,GAAG;CAGrC,MAAM,YADQ,eAAe,KAAK,SAAS,OAAO,MAAM,GAAG,UAAU,EAAA,CAAG,KACpD,CAAC,CAAC,SAAS;CAE/B,IAAI,eAAe,IAAI,OAAO;CAE9B,MAAM,QAAQ,OAAO,MAAM,aAAa,GAAG,OAAO,YAAY,GAAG,CAAC;CAClE,KAAK,MAAM,gBAAgB,MAAM,MAAM,GAAG,GAAG;EAC3C,MAAM,YAAY,aAAa,KAAK;EACpC,IAAI,CAAC,aAAa,UAAU,WAAW,OAAO,GAAG;EACjD,MAAM,OAAO,UAAU,MAAM,UAAU,CAAC,CAAC,EAAE,CAAE,KAAK;EAClD,IAAI,qBAAqB,KAAK,IAAI,GAAG,WAAW,IAAI,IAAI;CAC1D;CAEA,OAAO;AACT;AAEA,MAAM,aAAa,MAAc,YAAyB,YAAgC;CACxF,IAAI;CACJ,IAAI;EACF,UAAU,YAAY,MAAM,EAAE,WAAW,KAAK,CAAC;CACjD,QAAQ;EACN,OAAO,CAAC;CACV;CAEA,OAAO,QACJ,KAAK,UAAU,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC,CACtC,QAAQ,SAAS;EAChB,IAAI,QAAQ,MAAM,YAAY,QAAQ,KAAK,IAAI,CAAC,GAAG,OAAO;EAC1D,MAAM,YAAY,KAAK,MAAM,GAAG,CAAC,CAAC,IAAI;EACtC,IAAI,CAAC,aAAa,CAAC,WAAW,IAAI,SAAS,GAAG,OAAO;EACrD,IAAI;GACF,OAAO,SAAS,IAAI,CAAC,CAAC,OAAO;EAC/B,QAAQ;GACN,OAAO;EACT;CACF,CAAC;AACL;AAEA,MAAa,iBAAiB,UAAgC,CAAC,MAA2B;CACxF,MAAM,EACJ,MAAM,QAAQ,IAAI,GAClB,QAAQ,CAAC,KAAK,GACd,aAAa,oBACb,UAAU,oBACR;CAEJ,MAAM,6BAAa,IAAI,IAAY;CACnC,IAAI,gBAAgB;CACpB,IAAI,WAAW;CACf,IAAI,eAAe;CAEnB,KAAK,MAAM,QAAQ,OACjB,KAAK,MAAM,QAAQ,UAAU,KAAK,QAAQ,KAAK,IAAI,GAAG,IAAI,IAAI,UAAU,GAAG,OAAO,GAAG;EACnF,IAAI;EACJ,IAAI;GACF,SAAS,aAAa,MAAM,MAAM;EACpC,QAAQ;GACN;EACF;EACA,gBAAgB;EAEhB,IAAI,CAAC,iBAAiB,WAAW,KAAK,MAAM,GAAG,gBAAgB;EAE/D,KAAK,MAAM,SAAS,OAAO,SAAS,eAAe,GAAG;GACpD,IAAI,MAAM,IAAI;GACd,IAAI,kBAAkB,MAAM,IAAK,UAAU,GAAG,WAAW;EAC3D;EAEA,KAAK,MAAM,SAAS,OAAO,SAAS,cAAc,GAChD,WAAW,IAAI,cAAc,MAAM,EAAG,CAAC;CAE3C;CAGF,OAAO;EAAE,YAAY,CAAC,GAAG,UAAU,CAAC,CAAC,KAAK;EAAG;EAAe;EAAc;CAAS;AACrF"}
@@ -0,0 +1,6 @@
1
+ //#region src/static-css/shared.ts
2
+ const styleKeysOf = (cache) => [...cache.cache.keys()].filter((key) => key.startsWith("style%"));
3
+ //#endregion
4
+ export { styleKeysOf };
5
+
6
+ //# sourceMappingURL=shared.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.mjs","names":[],"sources":["../../src/static-css/shared.ts"],"sourcesContent":["export interface CssinjsCacheLike {\n cache: Map<string, unknown>;\n}\n\nexport const styleKeysOf = (cache: CssinjsCacheLike): string[] =>\n [...cache.cache.keys()].filter((key) => key.startsWith('style%'));\n"],"mappings":";AAIA,MAAa,eAAe,UAC1B,CAAC,GAAG,MAAM,MAAM,KAAK,CAAC,CAAC,CAAC,QAAQ,QAAQ,IAAI,WAAW,QAAQ,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { ThemeConfig } from "antd";
2
+ //#region src/static-css/themeVars.d.ts
3
+ type ThemeAppearance = 'dark' | 'light';
4
+ interface ThemeVarsCssOptions {
5
+ /** selector activating an appearance; default matches next-themes' data-theme attribute */
6
+ appearanceSelector?: (appearance: ThemeAppearance) => string;
7
+ /** dark fixups for lobe-ui antdOverride rules that keep literal polished-derived colors */
8
+ compatRules?: boolean;
9
+ hrefTemplate?: (hash: string) => string;
10
+ /** same theme factory the app hands to ConfigProvider/ThemeProvider */
11
+ theme?: (appearance: ThemeAppearance) => ThemeConfig;
12
+ }
13
+ interface ThemeVarsCssPayload {
14
+ css: string;
15
+ hash: string;
16
+ href: string;
17
+ skippedComponents: string[];
18
+ }
19
+ declare const buildThemeVarsCss: (options?: ThemeVarsCssOptions) => ThemeVarsCssPayload;
20
+ //#endregion
21
+ export { ThemeVarsCssOptions, ThemeVarsCssPayload, buildThemeVarsCss };
22
+ //# sourceMappingURL=themeVars.d.mts.map
@@ -0,0 +1,130 @@
1
+ import { createLobeAntdTheme } from "../styles/theme/antdTheme.mjs";
2
+ import { hashCss } from "./hash.mjs";
3
+ import { createRequire } from "node:module";
4
+ import { theme } from "antd";
5
+ import { existsSync, readdirSync } from "node:fs";
6
+ import path from "node:path";
7
+ //#region src/static-css/themeVars.ts
8
+ const require = createRequire(import.meta.url);
9
+ const unitless = /* @__PURE__ */ new Set([
10
+ "fontWeightStrong",
11
+ "lineHeight",
12
+ "lineHeightHeading1",
13
+ "lineHeightHeading2",
14
+ "lineHeightHeading3",
15
+ "lineHeightHeading4",
16
+ "lineHeightHeading5",
17
+ "lineHeightLG",
18
+ "lineHeightSM",
19
+ "opacityImage",
20
+ "opacityLoading",
21
+ "zIndexBase",
22
+ "zIndexPopupBase"
23
+ ]);
24
+ const ignoredTokens = /* @__PURE__ */ new Set(["motionBase", "motionUnit"]);
25
+ const toKebabCase = (str) => str.replaceAll(/([a-z])([A-Z])/g, "$1-$2").replaceAll(/([a-z])(\d)/g, "$1-$2").replaceAll(/(\d)([A-Z])/g, "$1-$2").replaceAll(/([A-Z]+)([A-Z][a-z])/g, "$1-$2").toLowerCase();
26
+ const defaultThemeFactory = (appearance) => createLobeAntdTheme({ appearance });
27
+ const buildDesignToken = (themeFactory, appearance) => {
28
+ const themeConfig = themeFactory(appearance);
29
+ return theme.getDesignToken({
30
+ ...themeConfig,
31
+ algorithm: [appearance === "dark" ? theme.darkAlgorithm : theme.defaultAlgorithm, themeConfig.algorithm ?? []].flat()
32
+ });
33
+ };
34
+ const toDeclarations = (token) => Object.entries(token).filter(([key, value]) => !key.startsWith("_") && !key.startsWith("screen") && !key.includes("-") && !ignoredTokens.has(key) && (typeof value === "string" || typeof value === "number")).map(([key, value]) => {
35
+ const cssValue = typeof value === "number" && !unitless.has(key) ? `${value}px` : String(value);
36
+ return `--ant-${toKebabCase(key)}: ${cssValue};`;
37
+ }).join("\n");
38
+ const isBrightColor = (value) => {
39
+ const hex = /^#([\da-f]{6})/i.exec(value)?.[1];
40
+ const rgb = /^rgba?\((\d+)[\s,]+(\d+)[\s,]+(\d+)/.exec(value);
41
+ const [r, g, b] = hex ? [
42
+ Number.parseInt(hex.slice(0, 2), 16),
43
+ Number.parseInt(hex.slice(2, 4), 16),
44
+ Number.parseInt(hex.slice(4, 6), 16)
45
+ ] : rgb ? [
46
+ Number(rgb[1]),
47
+ Number(rgb[2]),
48
+ Number(rgb[3])
49
+ ] : [
50
+ 0,
51
+ 0,
52
+ 0
53
+ ];
54
+ return (r * 299 + g * 587 + b * 114) / 1e3 > 128;
55
+ };
56
+ const loadAntdTokenModules = () => {
57
+ const antdLibDir = path.join(path.dirname(require.resolve("antd/package.json")), "lib");
58
+ return readdirSync(antdLibDir, { withFileTypes: true }).filter((entry) => entry.isDirectory()).map((entry) => entry.name).sort().map((name) => ({
59
+ component: name,
60
+ path: path.join(antdLibDir, name, "style", "token.js")
61
+ })).filter(({ path }) => existsSync(path));
62
+ };
63
+ const buildDarkComponentVars = (tokens) => {
64
+ const declarations = [];
65
+ const skipped = [];
66
+ for (const { component, path } of loadAntdTokenModules()) try {
67
+ const prepare = require(path).prepareComponentToken;
68
+ if (typeof prepare !== "function") continue;
69
+ const light = prepare(tokens.light);
70
+ const dark = prepare(tokens.dark);
71
+ for (const [key, value] of Object.entries(dark)) {
72
+ if (typeof value !== "string" || light[key] === value) continue;
73
+ declarations.push(`--ant-${component}-${toKebabCase(key)}:${value};`);
74
+ }
75
+ } catch {
76
+ skipped.push(component);
77
+ }
78
+ return {
79
+ css: declarations.join(""),
80
+ skipped
81
+ };
82
+ };
83
+ const buildCompatRules = (darkSelector, darkToken) => {
84
+ const readableOnPrimary = isBrightColor(String(darkToken.colorPrimary)) ? "#000" : "#fff";
85
+ return [
86
+ [
87
+ `${darkSelector} .ant-btn-primary:not(:disabled)`,
88
+ `${darkSelector} .ant-btn-primary:not(:disabled):hover`,
89
+ `${darkSelector} .ant-btn-primary:not(:disabled):active`
90
+ ].join(",") + `{color:${readableOnPrimary} !important;}`,
91
+ `${darkSelector} .ant-checkbox-inner:after{border-color:${readableOnPrimary} !important;}`,
92
+ `${darkSelector} .ant-radio-wrapper .ant-radio-checked .ant-radio-inner:after{background:${readableOnPrimary};}`
93
+ ].join("\n");
94
+ };
95
+ const buildThemeVarsCss = (options = {}) => {
96
+ const { theme = defaultThemeFactory, appearanceSelector = (appearance) => `html[data-theme='${appearance}']`, compatRules = true, hrefTemplate = (hash) => `/theme-vars.css?v=${hash}` } = options;
97
+ const tokens = {
98
+ dark: buildDesignToken(theme, "dark"),
99
+ light: buildDesignToken(theme, "light")
100
+ };
101
+ const light = appearanceSelector("light");
102
+ const dark = appearanceSelector("dark");
103
+ const componentVars = buildDarkComponentVars(tokens);
104
+ const blocks = [
105
+ [
106
+ ":root",
107
+ `${light} [class*='css-var-']`,
108
+ `${light} .ant-app`
109
+ ].join(",") + `{${toDeclarations(tokens.light)}}`,
110
+ [
111
+ dark,
112
+ `${dark} [class*='css-var-']`,
113
+ `${dark} .ant-app`
114
+ ].join(",") + `{${toDeclarations(tokens.dark)}}`,
115
+ `${dark} [class*='css-var-']{${componentVars.css}}`
116
+ ];
117
+ if (compatRules) blocks.push(buildCompatRules(dark, tokens.dark));
118
+ const css = blocks.join("\n");
119
+ const hash = hashCss(css);
120
+ return {
121
+ css,
122
+ hash,
123
+ href: hrefTemplate(hash),
124
+ skippedComponents: componentVars.skipped
125
+ };
126
+ };
127
+ //#endregion
128
+ export { buildThemeVarsCss, toKebabCase };
129
+
130
+ //# sourceMappingURL=themeVars.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"themeVars.mjs","names":["antdTheme"],"sources":["../../src/static-css/themeVars.ts"],"sourcesContent":["import { existsSync, readdirSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\n\nimport type { ThemeConfig } from 'antd';\nimport { theme as antdTheme } from 'antd';\n\nimport { createLobeAntdTheme } from '@/styles/theme/antdTheme';\n\nimport { hashCss } from './hash';\n\ntype ThemeAppearance = 'dark' | 'light';\n\nexport interface ThemeVarsCssOptions {\n /** selector activating an appearance; default matches next-themes' data-theme attribute */\n appearanceSelector?: (appearance: ThemeAppearance) => string;\n /** dark fixups for lobe-ui antdOverride rules that keep literal polished-derived colors */\n compatRules?: boolean;\n hrefTemplate?: (hash: string) => string;\n /** same theme factory the app hands to ConfigProvider/ThemeProvider */\n theme?: (appearance: ThemeAppearance) => ThemeConfig;\n}\n\nexport interface ThemeVarsCssPayload {\n css: string;\n hash: string;\n href: string;\n skippedComponents: string[];\n}\n\nconst require = createRequire(import.meta.url);\n\nconst unitless = new Set([\n 'fontWeightStrong',\n 'lineHeight',\n 'lineHeightHeading1',\n 'lineHeightHeading2',\n 'lineHeightHeading3',\n 'lineHeightHeading4',\n 'lineHeightHeading5',\n 'lineHeightLG',\n 'lineHeightSM',\n 'opacityImage',\n 'opacityLoading',\n 'zIndexBase',\n 'zIndexPopupBase',\n]);\n\nconst ignoredTokens = new Set(['motionBase', 'motionUnit']);\n\n// same kebab algorithm as antd-style's toKebabCase, so names match antd's emitted vars\nexport const toKebabCase = (str: string) =>\n str\n .replaceAll(/([a-z])([A-Z])/g, '$1-$2')\n .replaceAll(/([a-z])(\\d)/g, '$1-$2')\n .replaceAll(/(\\d)([A-Z])/g, '$1-$2')\n .replaceAll(/([A-Z]+)([A-Z][a-z])/g, '$1-$2')\n .toLowerCase();\n\nconst defaultThemeFactory = (appearance: ThemeAppearance): ThemeConfig =>\n createLobeAntdTheme({ appearance });\n\nconst buildDesignToken = (\n themeFactory: (appearance: ThemeAppearance) => ThemeConfig,\n appearance: ThemeAppearance,\n) => {\n const themeConfig = themeFactory(appearance);\n return antdTheme.getDesignToken({\n ...themeConfig,\n algorithm: [\n appearance === 'dark' ? antdTheme.darkAlgorithm : antdTheme.defaultAlgorithm,\n themeConfig.algorithm ?? [],\n ].flat(),\n }) as unknown as Record<string, number | string>;\n};\n\nconst toDeclarations = (token: Record<string, number | string>) =>\n Object.entries(token)\n .filter(\n ([key, value]) =>\n !key.startsWith('_') &&\n !key.startsWith('screen') &&\n !key.includes('-') &&\n !ignoredTokens.has(key) &&\n (typeof value === 'string' || typeof value === 'number'),\n )\n .map(([key, value]) => {\n const cssValue =\n typeof value === 'number' && !unitless.has(key) ? `${value}px` : String(value);\n return `--ant-${toKebabCase(key)}: ${cssValue};`;\n })\n .join('\\n');\n\nconst isBrightColor = (value: string) => {\n const hex = /^#([\\da-f]{6})/i.exec(value)?.[1];\n const rgb = /^rgba?\\((\\d+)[\\s,]+(\\d+)[\\s,]+(\\d+)/.exec(value);\n const [r, g, b] = hex\n ? [\n Number.parseInt(hex.slice(0, 2), 16),\n Number.parseInt(hex.slice(2, 4), 16),\n Number.parseInt(hex.slice(4, 6), 16),\n ]\n : rgb\n ? [Number(rgb[1]), Number(rgb[2]), Number(rgb[3])]\n : [0, 0, 0];\n return (r * 299 + g * 587 + b * 114) / 1000 > 128;\n};\n\nconst loadAntdTokenModules = () => {\n const antdLibDir = path.join(path.dirname(require.resolve('antd/package.json')), 'lib');\n\n return readdirSync(antdLibDir, { withFileTypes: true })\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .sort()\n .map((name) => ({ component: name, path: path.join(antdLibDir, name, 'style', 'token.js') }))\n .filter(({ path }) => existsSync(path));\n};\n\nconst buildDarkComponentVars = (tokens: {\n dark: Record<string, number | string>;\n light: Record<string, number | string>;\n}) => {\n const declarations: string[] = [];\n const skipped: string[] = [];\n\n for (const { component, path } of loadAntdTokenModules()) {\n try {\n const mod = require(path) as { prepareComponentToken?: unknown };\n const prepare = mod.prepareComponentToken;\n if (typeof prepare !== 'function') continue;\n\n const light = prepare(tokens.light) as Record<string, unknown>;\n const dark = prepare(tokens.dark) as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(dark)) {\n if (typeof value !== 'string' || light[key] === value) continue;\n declarations.push(`--ant-${component}-${toKebabCase(key)}:${value};`);\n }\n } catch {\n skipped.push(component);\n }\n }\n\n return { css: declarations.join(''), skipped };\n};\n\nconst buildCompatRules = (\n darkSelector: string,\n darkToken: Record<string, number | string>,\n): string => {\n // mirrors polished's readableColor for the antdOverride rules that keep colorPrimary literal\n const readableOnPrimary = isBrightColor(String(darkToken.colorPrimary)) ? '#000' : '#fff';\n\n return [\n [\n `${darkSelector} .ant-btn-primary:not(:disabled)`,\n `${darkSelector} .ant-btn-primary:not(:disabled):hover`,\n `${darkSelector} .ant-btn-primary:not(:disabled):active`,\n ].join(',') + `{color:${readableOnPrimary} !important;}`,\n `${darkSelector} .ant-checkbox-inner:after{border-color:${readableOnPrimary} !important;}`,\n `${darkSelector} .ant-radio-wrapper .ant-radio-checked .ant-radio-inner:after{background:${readableOnPrimary};}`,\n ].join('\\n');\n};\n\nexport const buildThemeVarsCss = (options: ThemeVarsCssOptions = {}): ThemeVarsCssPayload => {\n const {\n theme = defaultThemeFactory,\n appearanceSelector = (appearance) => `html[data-theme='${appearance}']`,\n compatRules = true,\n hrefTemplate = (hash) => `/theme-vars.css?v=${hash}`,\n } = options;\n\n const tokens = {\n dark: buildDesignToken(theme, 'dark'),\n light: buildDesignToken(theme, 'light'),\n };\n\n const light = appearanceSelector('light');\n const dark = appearanceSelector('dark');\n const componentVars = buildDarkComponentVars(tokens);\n\n // antd v6 cssVar mode re-declares all --ant-* with SSR-light literals on\n // [class*='css-var-'] / .ant-app, which would shadow the html-level palettes\n const blocks = [\n [':root', `${light} [class*='css-var-']`, `${light} .ant-app`].join(',') +\n `{${toDeclarations(tokens.light)}}`,\n [dark, `${dark} [class*='css-var-']`, `${dark} .ant-app`].join(',') +\n `{${toDeclarations(tokens.dark)}}`,\n `${dark} [class*='css-var-']{${componentVars.css}}`,\n ];\n\n if (compatRules) blocks.push(buildCompatRules(dark, tokens.dark));\n\n const css = blocks.join('\\n');\n const hash = hashCss(css);\n\n return { css, hash, href: hrefTemplate(hash), skippedComponents: componentVars.skipped };\n};\n"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { AntdStaticCssOptions } from "../buildAntdStaticCss.mjs";
2
+ import { ThemeVarsCssOptions } from "../themeVars.mjs";
3
+ import { Plugin } from "vite";
4
+ //#region src/static-css/vite/index.d.ts
5
+ declare const ANTD_STATIC_CSS_MODULE_ID = "virtual:lobehub/antd-static-css";
6
+ declare const THEME_VARS_CSS_MODULE_ID = "virtual:lobehub/theme-vars-css";
7
+ interface StaticCssPluginOptions {
8
+ antd?: AntdStaticCssOptions | false;
9
+ themeVars?: ThemeVarsCssOptions | false;
10
+ }
11
+ declare const lobeStaticCssPlugin: (options?: StaticCssPluginOptions) => Plugin;
12
+ //#endregion
13
+ export { ANTD_STATIC_CSS_MODULE_ID, StaticCssPluginOptions, THEME_VARS_CSS_MODULE_ID, lobeStaticCssPlugin };
14
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1,48 @@
1
+ //#region src/static-css/vite/index.ts
2
+ const ANTD_STATIC_CSS_MODULE_ID = "virtual:lobehub/antd-static-css";
3
+ const THEME_VARS_CSS_MODULE_ID = "virtual:lobehub/theme-vars-css";
4
+ const moduleSource = (payload) => [...Object.entries(payload).map(([key, value]) => `export const ${key} = ${JSON.stringify(value)};`), `export default ${JSON.stringify(payload)};`].join("\n");
5
+ const lobeStaticCssPlugin = (options = {}) => {
6
+ let antdPayload;
7
+ let themeVarsPayload;
8
+ return {
9
+ name: "lobehub-static-css",
10
+ resolveId(id) {
11
+ if (id === "virtual:lobehub/antd-static-css" || id === "virtual:lobehub/theme-vars-css") return `\0${id}`;
12
+ },
13
+ async load(id) {
14
+ if (id === `\0virtual:lobehub/antd-static-css`) {
15
+ if (options.antd === false) return moduleSource({
16
+ css: "",
17
+ href: "",
18
+ styleKeys: []
19
+ });
20
+ const { buildAntdStaticCss } = await import("../buildAntdStaticCss.mjs");
21
+ antdPayload ??= buildAntdStaticCss(options.antd);
22
+ const { css, href, styleKeys } = antdPayload;
23
+ return moduleSource({
24
+ css,
25
+ href,
26
+ styleKeys
27
+ });
28
+ }
29
+ if (id === `\0virtual:lobehub/theme-vars-css`) {
30
+ if (options.themeVars === false) return moduleSource({
31
+ css: "",
32
+ href: ""
33
+ });
34
+ const { buildThemeVarsCss } = await import("../themeVars.mjs");
35
+ themeVarsPayload ??= buildThemeVarsCss(options.themeVars);
36
+ const { css, href } = themeVarsPayload;
37
+ return moduleSource({
38
+ css,
39
+ href
40
+ });
41
+ }
42
+ }
43
+ };
44
+ };
45
+ //#endregion
46
+ export { ANTD_STATIC_CSS_MODULE_ID, THEME_VARS_CSS_MODULE_ID, lobeStaticCssPlugin };
47
+
48
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/static-css/vite/index.ts"],"sourcesContent":["import type { Plugin } from 'vite';\n\nimport type { AntdStaticCssOptions, AntdStaticCssPayload } from '../buildAntdStaticCss';\nimport type { ThemeVarsCssOptions, ThemeVarsCssPayload } from '../themeVars';\n\nexport const ANTD_STATIC_CSS_MODULE_ID = 'virtual:lobehub/antd-static-css';\nexport const THEME_VARS_CSS_MODULE_ID = 'virtual:lobehub/theme-vars-css';\n\nexport interface StaticCssPluginOptions {\n antd?: AntdStaticCssOptions | false;\n themeVars?: ThemeVarsCssOptions | false;\n}\n\nconst moduleSource = (payload: Record<string, unknown>) =>\n [\n ...Object.entries(payload).map(\n ([key, value]) => `export const ${key} = ${JSON.stringify(value)};`,\n ),\n `export default ${JSON.stringify(payload)};`,\n ].join('\\n');\n\nexport const lobeStaticCssPlugin = (options: StaticCssPluginOptions = {}): Plugin => {\n let antdPayload: AntdStaticCssPayload | undefined;\n let themeVarsPayload: ThemeVarsCssPayload | undefined;\n\n return {\n name: 'lobehub-static-css',\n resolveId(id) {\n if (id === ANTD_STATIC_CSS_MODULE_ID || id === THEME_VARS_CSS_MODULE_ID) return `\\0${id}`;\n },\n async load(id) {\n if (id === `\\0${ANTD_STATIC_CSS_MODULE_ID}`) {\n if (options.antd === false) return moduleSource({ css: '', href: '', styleKeys: [] });\n const { buildAntdStaticCss } = await import('../buildAntdStaticCss');\n antdPayload ??= buildAntdStaticCss(options.antd);\n const { css, href, styleKeys } = antdPayload;\n return moduleSource({ css, href, styleKeys });\n }\n\n if (id === `\\0${THEME_VARS_CSS_MODULE_ID}`) {\n if (options.themeVars === false) return moduleSource({ css: '', href: '' });\n const { buildThemeVarsCss } = await import('../themeVars');\n themeVarsPayload ??= buildThemeVarsCss(options.themeVars);\n const { css, href } = themeVarsPayload;\n return moduleSource({ css, href });\n }\n },\n };\n};\n"],"mappings":";AAKA,MAAa,4BAA4B;AACzC,MAAa,2BAA2B;AAOxC,MAAM,gBAAgB,YACpB,CACE,GAAG,OAAO,QAAQ,OAAO,CAAC,CAAC,KACxB,CAAC,KAAK,WAAW,gBAAgB,IAAI,KAAK,KAAK,UAAU,KAAK,EAAE,EACnE,GACA,kBAAkB,KAAK,UAAU,OAAO,EAAE,EAC5C,CAAC,CAAC,KAAK,IAAI;AAEb,MAAa,uBAAuB,UAAkC,CAAC,MAAc;CACnF,IAAI;CACJ,IAAI;CAEJ,OAAO;EACL,MAAM;EACN,UAAU,IAAI;GACZ,IAAI,OAAA,qCAAoC,OAAA,kCAAiC,OAAO,KAAK;EACvF;EACA,MAAM,KAAK,IAAI;GACb,IAAI,OAAO,qCAAkC;IAC3C,IAAI,QAAQ,SAAS,OAAO,OAAO,aAAa;KAAE,KAAK;KAAI,MAAM;KAAI,WAAW,CAAC;IAAE,CAAC;IACpF,MAAM,EAAE,uBAAuB,MAAM,OAAO;IAC5C,gBAAgB,mBAAmB,QAAQ,IAAI;IAC/C,MAAM,EAAE,KAAK,MAAM,cAAc;IACjC,OAAO,aAAa;KAAE;KAAK;KAAM;IAAU,CAAC;GAC9C;GAEA,IAAI,OAAO,oCAAiC;IAC1C,IAAI,QAAQ,cAAc,OAAO,OAAO,aAAa;KAAE,KAAK;KAAI,MAAM;IAAG,CAAC;IAC1E,MAAM,EAAE,sBAAsB,MAAM,OAAO;IAC3C,qBAAqB,kBAAkB,QAAQ,SAAS;IACxD,MAAM,EAAE,KAAK,SAAS;IACtB,OAAO,aAAa;KAAE;KAAK;IAAK,CAAC;GACnC;EACF;CACF;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobehub/ui",
3
- "version": "5.31.1",
3
+ "version": "5.32.0",
4
4
  "description": "Lobe UI is an open-source UI component library for building AIGC web apps",
5
5
  "keywords": [
6
6
  "lobehub",
@@ -81,6 +81,22 @@
81
81
  "types": "./es/eslint/index.d.mts",
82
82
  "import": "./es/eslint/index.mjs"
83
83
  },
84
+ "./static-css": {
85
+ "types": "./es/static-css/index.d.mts",
86
+ "import": "./es/static-css/index.mjs"
87
+ },
88
+ "./static-css/emit": {
89
+ "types": "./es/static-css/emit/index.d.mts",
90
+ "import": "./es/static-css/emit/index.mjs"
91
+ },
92
+ "./static-css/runtime": {
93
+ "types": "./es/static-css/runtime/index.d.mts",
94
+ "import": "./es/static-css/runtime/index.mjs"
95
+ },
96
+ "./static-css/vite": {
97
+ "types": "./es/static-css/vite/index.d.mts",
98
+ "import": "./es/static-css/vite/index.mjs"
99
+ },
84
100
  "./es/*": {
85
101
  "types": "./es/*.d.mts",
86
102
  "import": "./es/*.mjs"