@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.
Files changed (43) 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/base-ui/Input/style.d.mts +1 -1
  5. package/es/base-ui/Popover/PopoverGroup.mjs +3 -2
  6. package/es/base-ui/Popover/PopoverGroup.mjs.map +1 -1
  7. package/es/base-ui/Popover/PopoverInGroup.mjs +3 -1
  8. package/es/base-ui/Popover/PopoverInGroup.mjs.map +1 -1
  9. package/es/base-ui/Popover/hoverOnlyPress.mjs +12 -1
  10. package/es/base-ui/Popover/hoverOnlyPress.mjs.map +1 -1
  11. package/es/static-css/baseline.d.mts +6 -0
  12. package/es/static-css/baseline.mjs +39 -0
  13. package/es/static-css/baseline.mjs.map +1 -0
  14. package/es/static-css/buildAntdStaticCss.d.mts +31 -0
  15. package/es/static-css/buildAntdStaticCss.mjs +71 -0
  16. package/es/static-css/buildAntdStaticCss.mjs.map +1 -0
  17. package/es/static-css/emit/index.d.mts +18 -0
  18. package/es/static-css/emit/index.mjs +42 -0
  19. package/es/static-css/emit/index.mjs.map +1 -0
  20. package/es/static-css/hash.mjs +7 -0
  21. package/es/static-css/hash.mjs.map +1 -0
  22. package/es/static-css/index.d.mts +6 -0
  23. package/es/static-css/index.d.ts +1 -0
  24. package/es/static-css/index.js +1 -0
  25. package/es/static-css/index.mjs +6 -0
  26. package/es/static-css/registry.d.mts +20 -0
  27. package/es/static-css/registry.mjs +298 -0
  28. package/es/static-css/registry.mjs.map +1 -0
  29. package/es/static-css/runtime/index.d.mts +14 -0
  30. package/es/static-css/runtime/index.mjs +34 -0
  31. package/es/static-css/runtime/index.mjs.map +1 -0
  32. package/es/static-css/scan.d.mts +19 -0
  33. package/es/static-css/scan.mjs +87 -0
  34. package/es/static-css/scan.mjs.map +1 -0
  35. package/es/static-css/shared.mjs +6 -0
  36. package/es/static-css/shared.mjs.map +1 -0
  37. package/es/static-css/themeVars.d.mts +22 -0
  38. package/es/static-css/themeVars.mjs +130 -0
  39. package/es/static-css/themeVars.mjs.map +1 -0
  40. package/es/static-css/vite/index.d.mts +14 -0
  41. package/es/static-css/vite/index.mjs +48 -0
  42. package/es/static-css/vite/index.mjs.map +1 -0
  43. 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) => {
@@ -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" | "outlined" | "borderless" | null | undefined;
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 { openOnClick } = parseTrigger(item?.trigger ?? "hover");
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, eventDetails?: { cancel?: () => void; reason?: string }) => {\n const item = activeItemRef.current;\n const { openOnClick } = parseTrigger(item?.trigger ?? 'hover');\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":"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"}
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":"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"}
@@ -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'), [item.trigger]);\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 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":";;;;;;;;;;;;AAgBA,MAAa,kBAAoC,EAAE,UAAU,KAAK,SAAS,GAAG,YAAY;CACxF,MAAM,QAAQ,IAAI,yBAAyB;CAC3C,MAAM,OAAO,sBAAsB,KAAK;CAExC,MAAM,EAAE,gBAAgB,cAAc,aAAa,KAAK,WAAW,OAAO,GAAG,CAAC,KAAK,OAAO,CAAC;CAE3F,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;EACnB,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"}
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,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