@lobehub/ui 5.31.0 → 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.
- package/es/ColorSwatches/ColorSwatches.mjs +3 -3
- package/es/ColorSwatches/ColorSwatches.mjs.map +1 -1
- package/es/_virtual/_rolldown/runtime.mjs +1 -0
- package/es/base-ui/Input/style.d.mts +1 -1
- package/es/base-ui/Popover/PopoverGroup.mjs +3 -2
- package/es/base-ui/Popover/PopoverGroup.mjs.map +1 -1
- package/es/base-ui/Popover/PopoverInGroup.mjs +3 -1
- package/es/base-ui/Popover/PopoverInGroup.mjs.map +1 -1
- package/es/base-ui/Popover/hoverOnlyPress.mjs +12 -1
- package/es/base-ui/Popover/hoverOnlyPress.mjs.map +1 -1
- package/es/static-css/baseline.d.mts +6 -0
- package/es/static-css/baseline.mjs +39 -0
- package/es/static-css/baseline.mjs.map +1 -0
- package/es/static-css/buildAntdStaticCss.d.mts +31 -0
- package/es/static-css/buildAntdStaticCss.mjs +71 -0
- package/es/static-css/buildAntdStaticCss.mjs.map +1 -0
- package/es/static-css/emit/index.d.mts +18 -0
- package/es/static-css/emit/index.mjs +42 -0
- package/es/static-css/emit/index.mjs.map +1 -0
- package/es/static-css/hash.mjs +7 -0
- package/es/static-css/hash.mjs.map +1 -0
- package/es/static-css/index.d.mts +6 -0
- package/es/static-css/index.d.ts +1 -0
- package/es/static-css/index.js +1 -0
- package/es/static-css/index.mjs +6 -0
- package/es/static-css/registry.d.mts +20 -0
- package/es/static-css/registry.mjs +298 -0
- package/es/static-css/registry.mjs.map +1 -0
- package/es/static-css/runtime/index.d.mts +14 -0
- package/es/static-css/runtime/index.mjs +34 -0
- package/es/static-css/runtime/index.mjs.map +1 -0
- package/es/static-css/scan.d.mts +19 -0
- package/es/static-css/scan.mjs +87 -0
- package/es/static-css/scan.mjs.map +1 -0
- package/es/static-css/shared.mjs +6 -0
- package/es/static-css/shared.mjs.map +1 -0
- package/es/static-css/themeVars.d.mts +22 -0
- package/es/static-css/themeVars.mjs +130 -0
- package/es/static-css/themeVars.mjs.map +1 -0
- package/es/static-css/vite/index.d.mts +14 -0
- package/es/static-css/vite/index.mjs +48 -0
- package/es/static-css/vite/index.mjs.map +1 -0
- 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,
|
|
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"}
|
|
@@ -24,7 +24,7 @@ declare const styles: {
|
|
|
24
24
|
declare const rootVariants: (props?: ({
|
|
25
25
|
shadow?: boolean | null | undefined;
|
|
26
26
|
size?: "large" | "middle" | "small" | null | undefined;
|
|
27
|
-
variant?: "filled" | "
|
|
27
|
+
variant?: "filled" | "borderless" | "outlined" | null | undefined;
|
|
28
28
|
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
29
29
|
//#endregion
|
|
30
30
|
export { rootVariants, styles };
|
|
@@ -7,7 +7,7 @@ import { usePopoverPortalContainer } from "./PopoverPortal.mjs";
|
|
|
7
7
|
import { PopoverArrow, PopoverPopup, PopoverPortal, PopoverPositioner, PopoverViewport } from "./atoms.mjs";
|
|
8
8
|
import { PopoverProvider } from "./context.mjs";
|
|
9
9
|
import { PopoverGroupHandleContext, PopoverGroupPropsContext } from "./groupContext.mjs";
|
|
10
|
-
import { shouldCancelHoverOnlyPressOpen } from "./hoverOnlyPress.mjs";
|
|
10
|
+
import { isHoverOnlyTriggerElement, shouldCancelHoverOnlyPressOpen } from "./hoverOnlyPress.mjs";
|
|
11
11
|
import { useCallback, useMemo, useRef, useState } from "react";
|
|
12
12
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
13
13
|
import { Popover } from "@base-ui/react/popover";
|
|
@@ -31,7 +31,8 @@ const PopoverGroup = ({ children, contentLayoutAnimation = false, disableDestroy
|
|
|
31
31
|
const contextValue = useMemo(() => ({ close }), [close]);
|
|
32
32
|
const handleOpenChange = useCallback((nextOpen, eventDetails) => {
|
|
33
33
|
const item = activeItemRef.current;
|
|
34
|
-
const
|
|
34
|
+
const hoverOnlyTrigger = isHoverOnlyTriggerElement(eventDetails?.trigger);
|
|
35
|
+
const openOnClick = hoverOnlyTrigger === null ? parseTrigger(item?.trigger ?? "hover").openOnClick : !hoverOnlyTrigger;
|
|
35
36
|
if (shouldCancelHoverOnlyPressOpen(openOnClick, nextOpen, eventDetails?.reason)) {
|
|
36
37
|
eventDetails?.cancel?.();
|
|
37
38
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PopoverGroup.mjs","names":["BasePopover"],"sources":["../../../src/base-ui/Popover/PopoverGroup.tsx"],"sourcesContent":["'use client';\n\nimport { Popover as BasePopover } from '@base-ui/react/popover';\nimport { type FC, type ReactNode, useCallback, useMemo, useRef, useState } from 'react';\n\nimport {\n useDestroyOnInvalidActiveTriggerElement,\n useHidePopupWhenPositionerAtOrigin,\n} from '@/utils/destroyOnInvalidActiveTriggerElement';\nimport { parseTrigger } from '@/utils/parseTrigger';\nimport { placementMap } from '@/utils/placement';\n\nimport { PopoverArrowIcon } from './ArrowIcon';\nimport {\n PopoverArrow,\n PopoverPopup,\n PopoverPortal,\n PopoverPositioner,\n PopoverViewport,\n} from './atoms';\nimport { PopoverProvider } from './context';\nimport {\n PopoverGroupHandleContext,\n type PopoverGroupItem,\n PopoverGroupPropsContext,\n type PopoverGroupSharedProps,\n} from './groupContext';\nimport { shouldCancelHoverOnlyPressOpen } from './hoverOnlyPress';\nimport { usePopoverPortalContainer } from './PopoverPortal';\n\ntype PopoverGroupProps = PopoverGroupSharedProps & {\n children: ReactNode;\n};\n\nconst PopoverGroup: FC<PopoverGroupProps> = ({\n children,\n contentLayoutAnimation = false,\n disableDestroyOnInvalidTrigger = false,\n disableZeroOriginGuard = false,\n ...sharedProps\n}) => {\n const [{ handle, key }, setHandleState] = useState(() => ({\n handle: BasePopover.createHandle<PopoverGroupItem>(),\n key: 0,\n }));\n const activeItemRef = useRef<PopoverGroupItem | null>(null);\n const destroy = useCallback(() => {\n activeItemRef.current = null;\n setHandleState(({ key }) => ({\n handle: BasePopover.createHandle<PopoverGroupItem>(),\n key: key + 1,\n }));\n }, []);\n const close = useCallback(() => {\n handle.close();\n }, [handle]);\n const contextValue = useMemo(() => ({ close }), [close]);\n\n const handleOpenChange = useCallback(\n (nextOpen: boolean
|
|
1
|
+
{"version":3,"file":"PopoverGroup.mjs","names":["BasePopover"],"sources":["../../../src/base-ui/Popover/PopoverGroup.tsx"],"sourcesContent":["'use client';\n\nimport { Popover as BasePopover } from '@base-ui/react/popover';\nimport { type FC, type ReactNode, useCallback, useMemo, useRef, useState } from 'react';\n\nimport {\n useDestroyOnInvalidActiveTriggerElement,\n useHidePopupWhenPositionerAtOrigin,\n} from '@/utils/destroyOnInvalidActiveTriggerElement';\nimport { parseTrigger } from '@/utils/parseTrigger';\nimport { placementMap } from '@/utils/placement';\n\nimport { PopoverArrowIcon } from './ArrowIcon';\nimport {\n PopoverArrow,\n PopoverPopup,\n PopoverPortal,\n PopoverPositioner,\n PopoverViewport,\n} from './atoms';\nimport { PopoverProvider } from './context';\nimport {\n PopoverGroupHandleContext,\n type PopoverGroupItem,\n PopoverGroupPropsContext,\n type PopoverGroupSharedProps,\n} from './groupContext';\nimport { isHoverOnlyTriggerElement, shouldCancelHoverOnlyPressOpen } from './hoverOnlyPress';\nimport { usePopoverPortalContainer } from './PopoverPortal';\n\ntype PopoverGroupProps = PopoverGroupSharedProps & {\n children: ReactNode;\n};\n\nconst PopoverGroup: FC<PopoverGroupProps> = ({\n children,\n contentLayoutAnimation = false,\n disableDestroyOnInvalidTrigger = false,\n disableZeroOriginGuard = false,\n ...sharedProps\n}) => {\n const [{ handle, key }, setHandleState] = useState(() => ({\n handle: BasePopover.createHandle<PopoverGroupItem>(),\n key: 0,\n }));\n const activeItemRef = useRef<PopoverGroupItem | null>(null);\n const destroy = useCallback(() => {\n activeItemRef.current = null;\n setHandleState(({ key }) => ({\n handle: BasePopover.createHandle<PopoverGroupItem>(),\n key: key + 1,\n }));\n }, []);\n const close = useCallback(() => {\n handle.close();\n }, [handle]);\n const contextValue = useMemo(() => ({ close }), [close]);\n\n const handleOpenChange = useCallback(\n (\n nextOpen: boolean,\n eventDetails?: { cancel?: () => void; reason?: string; trigger?: unknown },\n ) => {\n const item = activeItemRef.current;\n // The press belongs to the trigger that fired it, which is not necessarily\n // the member currently showing — judging by `activeItemRef` cancels every\n // click member's first press, since the active one is a hover member (or\n // none, which also reads as hover-only).\n const hoverOnlyTrigger = isHoverOnlyTriggerElement(eventDetails?.trigger);\n const openOnClick =\n hoverOnlyTrigger === null\n ? parseTrigger(item?.trigger ?? 'hover').openOnClick\n : !hoverOnlyTrigger;\n\n if (shouldCancelHoverOnlyPressOpen(openOnClick, nextOpen, eventDetails?.reason)) {\n eventDetails?.cancel?.();\n return;\n }\n\n item?.onOpenChange?.(nextOpen);\n },\n [],\n );\n\n useDestroyOnInvalidActiveTriggerElement(handle.store, destroy, {\n enabled: !disableDestroyOnInvalidTrigger,\n });\n useHidePopupWhenPositionerAtOrigin(handle.store, { enabled: !disableZeroOriginGuard });\n\n const portalContainer = usePopoverPortalContainer();\n\n return (\n <PopoverGroupHandleContext value={handle}>\n <PopoverGroupPropsContext value={sharedProps}>\n {children}\n <BasePopover.Root handle={handle} key={key} onOpenChange={handleOpenChange}>\n {({ payload }) => {\n const item = (payload as PopoverGroupItem | null) ?? null;\n activeItemRef.current = item;\n\n if (!item?.content) return null;\n\n const arrow = item.arrow ?? false;\n const placement = item.placement ?? 'top';\n const { openOnHover } = parseTrigger(item.trigger ?? 'hover');\n\n const placementConfig = placementMap[placement] ?? placementMap.top;\n const resolvedSideOffset = arrow ? 10 : 6;\n\n const resolvedClassNames = {\n arrow: item.classNames?.arrow,\n popup: item.className,\n positioner: item.classNames?.root,\n viewport: item.classNames?.content,\n };\n\n const resolvedStyles = {\n arrow: item.styles?.arrow,\n positioner: {\n ...item.styles?.root,\n ...(item.zIndex !== undefined ? { zIndex: item.zIndex } : {}),\n },\n viewport: item.styles?.content,\n };\n\n const contentNode = (\n <PopoverProvider value={contextValue}>{item.content}</PopoverProvider>\n );\n\n const popup = (\n <PopoverPositioner\n align={placementConfig.align}\n className={resolvedClassNames.positioner}\n data-layout-animation={contentLayoutAnimation || undefined}\n hoverTrigger={openOnHover}\n placement={placement}\n side={placementConfig.side}\n sideOffset={resolvedSideOffset}\n style={resolvedStyles.positioner}\n {...item.positionerProps}\n >\n <PopoverPopup\n className={resolvedClassNames.popup}\n data-layout-animation={contentLayoutAnimation || undefined}\n {...item.popupProps}\n >\n {arrow && (\n <PopoverArrow className={resolvedClassNames.arrow} style={resolvedStyles.arrow}>\n {PopoverArrowIcon}\n </PopoverArrow>\n )}\n <PopoverViewport\n className={resolvedClassNames.viewport}\n style={resolvedStyles.viewport}\n >\n {contentNode}\n </PopoverViewport>\n </PopoverPopup>\n </PopoverPositioner>\n );\n\n return portalContainer ? (\n <PopoverPortal container={portalContainer}>{popup}</PopoverPortal>\n ) : null;\n }}\n </BasePopover.Root>\n </PopoverGroupPropsContext>\n </PopoverGroupHandleContext>\n );\n};\n\nPopoverGroup.displayName = 'PopoverGroup';\n\nexport default PopoverGroup;\n"],"mappings":";;;;;;;;;;;;;;AAkCA,MAAM,gBAAuC,EAC3C,UACA,yBAAyB,OACzB,iCAAiC,OACjC,yBAAyB,OACzB,GAAG,kBACC;CACJ,MAAM,CAAC,EAAE,QAAQ,OAAO,kBAAkB,gBAAgB;EACxD,QAAQA,QAAY,aAA+B;EACnD,KAAK;CACP,EAAE;CACF,MAAM,gBAAgB,OAAgC,IAAI;CAC1D,MAAM,UAAU,kBAAkB;EAChC,cAAc,UAAU;EACxB,gBAAgB,EAAE,WAAW;GAC3B,QAAQA,QAAY,aAA+B;GACnD,KAAK,MAAM;EACb,EAAE;CACJ,GAAG,CAAC,CAAC;CACL,MAAM,QAAQ,kBAAkB;EAC9B,OAAO,MAAM;CACf,GAAG,CAAC,MAAM,CAAC;CACX,MAAM,eAAe,eAAe,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC;CAEvD,MAAM,mBAAmB,aAErB,UACA,iBACG;EACH,MAAM,OAAO,cAAc;EAK3B,MAAM,mBAAmB,0BAA0B,cAAc,OAAO;EACxE,MAAM,cACJ,qBAAqB,OACjB,aAAa,MAAM,WAAW,OAAO,CAAC,CAAC,cACvC,CAAC;EAEP,IAAI,+BAA+B,aAAa,UAAU,cAAc,MAAM,GAAG;GAC/E,cAAc,SAAS;GACvB;EACF;EAEA,MAAM,eAAe,QAAQ;CAC/B,GACA,CAAC,CACH;CAEA,wCAAwC,OAAO,OAAO,SAAS,EAC7D,SAAS,CAAC,+BACZ,CAAC;CACD,mCAAmC,OAAO,OAAO,EAAE,SAAS,CAAC,uBAAuB,CAAC;CAErF,MAAM,kBAAkB,0BAA0B;CAElD,OACE,oBAAC,2BAAD;EAA2B,OAAO;EAChC,UAAA,qBAAC,0BAAD;GAA0B,OAAO;GAAjC,UAAA,CACG,UACD,oBAACA,QAAY,MAAb;IAA0B;IAAkB,cAAc;IACtD,WAAA,EAAE,cAAc;KAChB,MAAM,OAAQ,WAAuC;KACrD,cAAc,UAAU;KAExB,IAAI,CAAC,MAAM,SAAS,OAAO;KAE3B,MAAM,QAAQ,KAAK,SAAS;KAC5B,MAAM,YAAY,KAAK,aAAa;KACpC,MAAM,EAAE,gBAAgB,aAAa,KAAK,WAAW,OAAO;KAE5D,MAAM,kBAAkB,aAAa,cAAc,aAAa;KAChE,MAAM,qBAAqB,QAAQ,KAAK;KAExC,MAAM,qBAAqB;MACzB,OAAO,KAAK,YAAY;MACxB,OAAO,KAAK;MACZ,YAAY,KAAK,YAAY;MAC7B,UAAU,KAAK,YAAY;KAC7B;KAEA,MAAM,iBAAiB;MACrB,OAAO,KAAK,QAAQ;MACpB,YAAY;OACV,GAAG,KAAK,QAAQ;OAChB,GAAI,KAAK,WAAW,KAAA,IAAY,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;MAC7D;MACA,UAAU,KAAK,QAAQ;KACzB;KAEA,MAAM,cACJ,oBAAC,iBAAD;MAAiB,OAAO;MAAe,UAAA,KAAK;KAAyB,CAAA;KAGvE,MAAM,QACJ,oBAAC,mBAAD;MACE,OAAO,gBAAgB;MACvB,WAAW,mBAAmB;MAC9B,yBAAuB,0BAA0B,KAAA;MACjD,cAAc;MACH;MACX,MAAM,gBAAgB;MACtB,YAAY;MACZ,OAAO,eAAe;MACtB,GAAI,KAAK;MAET,UAAA,qBAAC,cAAD;OACE,WAAW,mBAAmB;OAC9B,yBAAuB,0BAA0B,KAAA;OACjD,GAAI,KAAK;OAHX,UAAA,CAKG,SACC,oBAAC,cAAD;QAAc,WAAW,mBAAmB;QAAO,OAAO,eAAe;QACtE,UAAA;OACW,CAAA,GAEhB,oBAAC,iBAAD;QACE,WAAW,mBAAmB;QAC9B,OAAO,eAAe;QAErB,UAAA;OACc,CAAA,CACL;;KACG,CAAA;KAGrB,OAAO,kBACL,oBAAC,eAAD;MAAe,WAAW;MAAkB,UAAA;KAAqB,CAAA,IAC/D;IACN;GACgB,GAtEqB,GAsErB,CACM;;CACD,CAAA;AAE/B;AAEA,aAAa,cAAc"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { useNativeButton } from "../../hooks/useNativeButton.mjs";
|
|
3
3
|
import { parseTrigger } from "../../utils/parseTrigger.mjs";
|
|
4
4
|
import { PopoverGroupHandleContext } from "./groupContext.mjs";
|
|
5
|
+
import { HOVER_ONLY_TRIGGER_ATTR } from "./hoverOnlyPress.mjs";
|
|
5
6
|
import { useMergedPopoverProps } from "./useMergedPopoverProps.mjs";
|
|
6
7
|
import { cloneElement, isValidElement, use, useMemo } from "react";
|
|
7
8
|
import { jsx } from "react/jsx-runtime";
|
|
@@ -13,7 +14,7 @@ import { Popover } from "@base-ui/react/popover";
|
|
|
13
14
|
const PopoverInGroup = ({ children, ref: refProp, ...props }) => {
|
|
14
15
|
const group = use(PopoverGroupHandleContext);
|
|
15
16
|
const item = useMergedPopoverProps(props);
|
|
16
|
-
const { openOnHover } = useMemo(() => parseTrigger(item.trigger ?? "hover"), [item.trigger]);
|
|
17
|
+
const { openOnClick, openOnHover } = useMemo(() => parseTrigger(item.trigger ?? "hover"), [item.trigger]);
|
|
17
18
|
const resolvedOpenDelay = item.openDelay ?? (item.mouseEnterDelay ?? .1) * 1e3;
|
|
18
19
|
const resolvedCloseDelay = item.closeDelay ?? (item.mouseLeaveDelay ?? .1) * 1e3;
|
|
19
20
|
const disabled = Boolean(item.disabled);
|
|
@@ -23,6 +24,7 @@ const PopoverInGroup = ({ children, ref: refProp, ...props }) => {
|
|
|
23
24
|
});
|
|
24
25
|
if (!item.content) return children;
|
|
25
26
|
const triggerProps = {
|
|
27
|
+
[HOVER_ONLY_TRIGGER_ATTR]: openOnClick ? void 0 : "",
|
|
26
28
|
closeDelay: resolvedCloseDelay,
|
|
27
29
|
delay: resolvedOpenDelay,
|
|
28
30
|
disabled,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PopoverInGroup.mjs","names":["BasePopover"],"sources":["../../../src/base-ui/Popover/PopoverInGroup.tsx"],"sourcesContent":["'use client';\n\nimport { mergeProps } from '@base-ui/react/merge-props';\nimport { Popover as BasePopover } from '@base-ui/react/popover';\nimport { cx } from 'antd-style';\nimport { cloneElement, type FC, isValidElement, useMemo } from 'react';\nimport { use } from 'react';\nimport { mergeRefs } from 'react-merge-refs';\n\nimport { useNativeButton } from '@/hooks/useNativeButton';\nimport { parseTrigger } from '@/utils/parseTrigger';\n\nimport { PopoverGroupHandleContext } from './groupContext';\nimport { type PopoverProps } from './type';\nimport { useMergedPopoverProps } from './useMergedPopoverProps';\n\nexport const PopoverInGroup: FC<PopoverProps> = ({ children, ref: refProp, ...props }) => {\n const group = use(PopoverGroupHandleContext);\n const item = useMergedPopoverProps(props);\n\n const { openOnHover } = useMemo(() => parseTrigger(item.trigger ?? 'hover')
|
|
1
|
+
{"version":3,"file":"PopoverInGroup.mjs","names":["BasePopover"],"sources":["../../../src/base-ui/Popover/PopoverInGroup.tsx"],"sourcesContent":["'use client';\n\nimport { mergeProps } from '@base-ui/react/merge-props';\nimport { Popover as BasePopover } from '@base-ui/react/popover';\nimport { cx } from 'antd-style';\nimport { cloneElement, type FC, isValidElement, useMemo } from 'react';\nimport { use } from 'react';\nimport { mergeRefs } from 'react-merge-refs';\n\nimport { useNativeButton } from '@/hooks/useNativeButton';\nimport { parseTrigger } from '@/utils/parseTrigger';\n\nimport { PopoverGroupHandleContext } from './groupContext';\nimport { HOVER_ONLY_TRIGGER_ATTR } from './hoverOnlyPress';\nimport { type PopoverProps } from './type';\nimport { useMergedPopoverProps } from './useMergedPopoverProps';\n\nexport const PopoverInGroup: FC<PopoverProps> = ({ children, ref: refProp, ...props }) => {\n const group = use(PopoverGroupHandleContext);\n const item = useMergedPopoverProps(props);\n\n const { openOnClick, openOnHover } = useMemo(\n () => parseTrigger(item.trigger ?? 'hover'),\n [item.trigger],\n );\n\n const resolvedOpenDelay = item.openDelay ?? (item.mouseEnterDelay ?? 0.1) * 1000;\n const resolvedCloseDelay = item.closeDelay ?? (item.mouseLeaveDelay ?? 0.1) * 1000;\n const disabled = Boolean(item.disabled);\n\n const { isNativeButtonTriggerElement, resolvedNativeButton } = useNativeButton({\n children,\n nativeButton: item.nativeButton,\n });\n\n // Don't render trigger behavior if no content\n if (!item.content) {\n return children as any;\n }\n\n const triggerProps = {\n [HOVER_ONLY_TRIGGER_ATTR]: openOnClick ? undefined : '',\n closeDelay: resolvedCloseDelay,\n delay: resolvedOpenDelay,\n disabled,\n openOnHover: openOnHover && !disabled,\n ...item.triggerProps,\n payload: item,\n };\n\n const triggerClassName = item.classNames?.trigger;\n\n if (isValidElement(children)) {\n return (\n <BasePopover.Trigger\n handle={group ?? undefined}\n {...triggerProps}\n nativeButton={resolvedNativeButton}\n render={(renderProps) => {\n // Base UI's trigger props include `type=\"button\"` by default.\n // If we render into a non-<button> element, that prop is invalid and can warn.\n const resolvedProps = (() => {\n if (isNativeButtonTriggerElement) return renderProps as any;\n // eslint-disable-next-line unused-imports/no-unused-vars\n const { type, ref: triggerRef, ...restProps } = renderProps as any;\n return restProps;\n })();\n\n const mergedProps = mergeProps((children as any).props, resolvedProps);\n return cloneElement(children as any, {\n ...mergedProps,\n className: cx(mergedProps.className, triggerClassName),\n ref: mergeRefs([(children as any).ref, (renderProps as any).ref, refProp]),\n });\n }}\n />\n );\n }\n\n return (\n <BasePopover.Trigger\n handle={group ?? undefined}\n {...triggerProps}\n className={triggerClassName}\n nativeButton={resolvedNativeButton}\n ref={refProp}\n >\n {children}\n </BasePopover.Trigger>\n );\n};\n\nPopoverInGroup.displayName = 'PopoverInGroup';\n"],"mappings":";;;;;;;;;;;;;AAiBA,MAAa,kBAAoC,EAAE,UAAU,KAAK,SAAS,GAAG,YAAY;CACxF,MAAM,QAAQ,IAAI,yBAAyB;CAC3C,MAAM,OAAO,sBAAsB,KAAK;CAExC,MAAM,EAAE,aAAa,gBAAgB,cAC7B,aAAa,KAAK,WAAW,OAAO,GAC1C,CAAC,KAAK,OAAO,CACf;CAEA,MAAM,oBAAoB,KAAK,cAAc,KAAK,mBAAmB,MAAO;CAC5E,MAAM,qBAAqB,KAAK,eAAe,KAAK,mBAAmB,MAAO;CAC9E,MAAM,WAAW,QAAQ,KAAK,QAAQ;CAEtC,MAAM,EAAE,8BAA8B,yBAAyB,gBAAgB;EAC7E;EACA,cAAc,KAAK;CACrB,CAAC;CAGD,IAAI,CAAC,KAAK,SACR,OAAO;CAGT,MAAM,eAAe;GAClB,0BAA0B,cAAc,KAAA,IAAY;EACrD,YAAY;EACZ,OAAO;EACP;EACA,aAAa,eAAe,CAAC;EAC7B,GAAG,KAAK;EACR,SAAS;CACX;CAEA,MAAM,mBAAmB,KAAK,YAAY;CAE1C,IAAI,eAAe,QAAQ,GACzB,OACE,oBAACA,QAAY,SAAb;EACE,QAAQ,SAAS,KAAA;EACjB,GAAI;EACJ,cAAc;EACd,SAAS,gBAAgB;GAGvB,MAAM,uBAAuB;IAC3B,IAAI,8BAA8B,OAAO;IAEzC,MAAM,EAAE,MAAM,KAAK,YAAY,GAAG,cAAc;IAChD,OAAO;GACT,EAAA,CAAG;GAEH,MAAM,cAAc,WAAY,SAAiB,OAAO,aAAa;GACrE,OAAO,aAAa,UAAiB;IACnC,GAAG;IACH,WAAW,GAAG,YAAY,WAAW,gBAAgB;IACrD,KAAK,UAAU;KAAE,SAAiB;KAAM,YAAoB;KAAK;IAAO,CAAC;GAC3E,CAAC;EACH;CACD,CAAA;CAIL,OACE,oBAACA,QAAY,SAAb;EACE,QAAQ,SAAS,KAAA;EACjB,GAAI;EACJ,WAAW;EACX,cAAc;EACd,KAAK;EAEJ;CACkB,CAAA;AAEzB;AAEA,eAAe,cAAc"}
|
|
@@ -8,7 +8,18 @@
|
|
|
8
8
|
function shouldCancelHoverOnlyPressOpen(openOnClick, nextOpen, reason) {
|
|
9
9
|
return !openOnClick && nextOpen && reason === "trigger-press";
|
|
10
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* Stamped on a grouped trigger that only opens on hover. The group arbitrates
|
|
13
|
+
* open changes for every member from one handler, and the event only carries the
|
|
14
|
+
* trigger element — without this it cannot tell which member the press belongs to
|
|
15
|
+
* and would judge it by whichever member happens to be active.
|
|
16
|
+
*/
|
|
17
|
+
const HOVER_ONLY_TRIGGER_ATTR = "data-hover-only-trigger";
|
|
18
|
+
function isHoverOnlyTriggerElement(trigger) {
|
|
19
|
+
if (typeof Element === "undefined" || !(trigger instanceof Element)) return null;
|
|
20
|
+
return trigger.hasAttribute(HOVER_ONLY_TRIGGER_ATTR);
|
|
21
|
+
}
|
|
11
22
|
//#endregion
|
|
12
|
-
export { shouldCancelHoverOnlyPressOpen };
|
|
23
|
+
export { HOVER_ONLY_TRIGGER_ATTR, isHoverOnlyTriggerElement, shouldCancelHoverOnlyPressOpen };
|
|
13
24
|
|
|
14
25
|
//# sourceMappingURL=hoverOnlyPress.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hoverOnlyPress.mjs","names":[],"sources":["../../../src/base-ui/Popover/hoverOnlyPress.ts"],"sourcesContent":["/**\n * Base UI Popover.Trigger always wires useClick. With openOnHover, a press while\n * the popup is hover-open can re-open with reason `trigger-press` (stickIfOpen),\n * which disables mouseleave dismiss. Hover-only triggers must cancel press-driven\n * opens so antd-compatible `trigger=\"hover\"` keeps hover close semantics.\n */\nexport function shouldCancelHoverOnlyPressOpen(\n openOnClick: boolean,\n nextOpen: boolean,\n reason: string | undefined,\n): boolean {\n return !openOnClick && nextOpen && reason === 'trigger-press';\n}\n"],"mappings":";;;;;;;AAMA,SAAgB,+BACd,aACA,UACA,QACS;CACT,OAAO,CAAC,eAAe,YAAY,WAAW;AAChD"}
|
|
1
|
+
{"version":3,"file":"hoverOnlyPress.mjs","names":[],"sources":["../../../src/base-ui/Popover/hoverOnlyPress.ts"],"sourcesContent":["/**\n * Base UI Popover.Trigger always wires useClick. With openOnHover, a press while\n * the popup is hover-open can re-open with reason `trigger-press` (stickIfOpen),\n * which disables mouseleave dismiss. Hover-only triggers must cancel press-driven\n * opens so antd-compatible `trigger=\"hover\"` keeps hover close semantics.\n */\nexport function shouldCancelHoverOnlyPressOpen(\n openOnClick: boolean,\n nextOpen: boolean,\n reason: string | undefined,\n): boolean {\n return !openOnClick && nextOpen && reason === 'trigger-press';\n}\n\n/**\n * Stamped on a grouped trigger that only opens on hover. The group arbitrates\n * open changes for every member from one handler, and the event only carries the\n * trigger element — without this it cannot tell which member the press belongs to\n * and would judge it by whichever member happens to be active.\n */\nexport const HOVER_ONLY_TRIGGER_ATTR = 'data-hover-only-trigger';\n\nexport function isHoverOnlyTriggerElement(trigger: unknown): boolean | null {\n if (typeof Element === 'undefined' || !(trigger instanceof Element)) return null;\n\n return trigger.hasAttribute(HOVER_ONLY_TRIGGER_ATTR);\n}\n"],"mappings":";;;;;;;AAMA,SAAgB,+BACd,aACA,UACA,QACS;CACT,OAAO,CAAC,eAAe,YAAY,WAAW;AAChD;;;;;;;AAQA,MAAa,0BAA0B;AAEvC,SAAgB,0BAA0B,SAAkC;CAC1E,IAAI,OAAO,YAAY,eAAe,EAAE,mBAAmB,UAAU,OAAO;CAE5E,OAAO,QAAQ,aAAa,uBAAuB;AACrD"}
|
|
@@ -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 @@
|
|
|
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
|