@bioturing/components 0.27.0 → 0.28.1

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 (46) hide show
  1. package/dist/components/checkbox/component.js.map +1 -1
  2. package/dist/components/choice-list/component.js +9 -9
  3. package/dist/components/cmdk/index.js.map +1 -1
  4. package/dist/components/combobox/component.js +202 -0
  5. package/dist/components/combobox/component.js.map +1 -0
  6. package/dist/components/combobox/style.css +1 -0
  7. package/dist/components/combobox/trigger.js +89 -0
  8. package/dist/components/combobox/trigger.js.map +1 -0
  9. package/dist/components/dropdown-menu/component.js +176 -163
  10. package/dist/components/dropdown-menu/component.js.map +1 -1
  11. package/dist/components/dropdown-menu/divider.js +16 -0
  12. package/dist/components/dropdown-menu/divider.js.map +1 -0
  13. package/dist/components/dropdown-menu/item.css +1 -0
  14. package/dist/components/dropdown-menu/item.js +131 -0
  15. package/dist/components/dropdown-menu/item.js.map +1 -0
  16. package/dist/components/dropdown-menu/style.css +1 -1
  17. package/dist/components/hooks/useDraggable.js +77 -0
  18. package/dist/components/hooks/useDraggable.js.map +1 -0
  19. package/dist/components/hooks/useHover.js +26 -0
  20. package/dist/components/hooks/useHover.js.map +1 -0
  21. package/dist/components/hooks/useTransitionStatus.js +52 -0
  22. package/dist/components/hooks/useTransitionStatus.js.map +1 -0
  23. package/dist/components/nav/item.js +2 -2
  24. package/dist/components/popup-panel/component.js +81 -92
  25. package/dist/components/popup-panel/component.js.map +1 -1
  26. package/dist/components/resizable/component.js +165 -97
  27. package/dist/components/resizable/component.js.map +1 -1
  28. package/dist/components/resizable/style.css +1 -1
  29. package/dist/components/select/component.js +160 -91
  30. package/dist/components/select/component.js.map +1 -1
  31. package/dist/components/select/item.js +54 -0
  32. package/dist/components/select/item.js.map +1 -0
  33. package/dist/components/select/style.css +1 -1
  34. package/dist/components/splitter/splitter-panel.js +8 -8
  35. package/dist/components/splitter/splitter.js +9 -9
  36. package/dist/components/splitter/useSizes.js +10 -10
  37. package/dist/components/splitter/useSizes.js.map +1 -1
  38. package/dist/components/stack/StackChild.js +9 -9
  39. package/dist/components/transition/component.js +1 -1
  40. package/dist/components/transition/component.js.map +1 -1
  41. package/dist/index.d.ts +317 -5
  42. package/dist/index.js +204 -194
  43. package/dist/index.js.map +1 -1
  44. package/dist/metadata.js +21 -7
  45. package/dist/metadata.js.map +1 -1
  46. package/package.json +4 -3
@@ -1,46 +1,61 @@
1
1
  "use client";
2
- import { jsx as o, jsxs as N, Fragment as D } from "react/jsx-runtime";
3
- import { CaretDown as R } from "@bioturing/assets";
4
- import a from "antd/es/select";
5
- import y from "antd/es/checkbox";
6
- import { forwardRef as U } from "react";
7
- import { useFloatingPortalNode as W, useFloating as q, autoUpdate as B, offset as H, autoPlacement as J, shift as K, size as L, FloatingOverlay as Q } from "@floating-ui/react";
8
- import { PopupPanelSize as w } from "../popup-panel/constants.js";
9
- import { toMerged as T } from "es-toolkit";
2
+ import { jsx as r, Fragment as y, jsxs as S } from "react/jsx-runtime";
3
+ import { CaretDown as tt } from "@bioturing/assets";
4
+ import { useFloatingPortalNode as et, useFloating as ot, autoUpdate as rt, offset as lt, autoPlacement as nt, shift as st, size as at, FloatingOverlay as ct } from "@floating-ui/react";
5
+ import j from "antd/es/checkbox";
6
+ import b from "antd/es/select";
7
+ import { toMerged as it } from "es-toolkit";
8
+ import { forwardRef as pt, useCallback as D } from "react";
9
+ import { PopupPanelSize as E } from "../popup-panel/constants.js";
10
+ import { Divider as mt } from "antd";
11
+ import { SelectItem as ut } from "./item.js";
10
12
  import './style.css';/* empty css */
11
- import { useControlledState as V } from "../hooks/useControlledState.js";
12
- import { clsx as C } from "../utils/cn.js";
13
- const X = ({
14
- mode: i,
15
- className: O,
16
- open: k,
17
- defaultOpen: v,
18
- onOpenChange: M,
19
- popupClassName: F,
20
- onDropdownVisibleChange: P,
21
- enhancePositioner: r,
22
- getPopupContainer: I,
23
- popupSize: e,
24
- popupRender: c,
25
- dropdownRender: f,
26
- classNames: n,
27
- styles: m = {},
28
- ...j
29
- }, p) => {
30
- var x;
31
- const E = W({}), u = i === "multiple" || i === "tags", [d, g] = V(
32
- k,
33
- M || P,
34
- v
35
- ), { floatingStyles: S, refs: h } = q({
13
+ import { useControlledState as N } from "../hooks/useControlledState.js";
14
+ import { useCls as ft } from "../utils/antdUtils.js";
15
+ import { clsx as G } from "../utils/cn.js";
16
+ const dt = ({
17
+ mode: d,
18
+ className: T,
19
+ open: U,
20
+ defaultOpen: V,
21
+ onOpenChange: W,
22
+ popupClassName: $,
23
+ onDropdownVisibleChange: q,
24
+ enhancePositioner: s,
25
+ getPopupContainer: B,
26
+ popupSize: l,
27
+ popupRender: g,
28
+ dropdownRender: h,
29
+ classNames: c,
30
+ styles: C = {},
31
+ showSelectionSummary: x,
32
+ selectionSummaryRender: v,
33
+ value: H,
34
+ onChange: J,
35
+ defaultValue: K,
36
+ showSelectAll: A,
37
+ selectAllRender: O,
38
+ options: a,
39
+ ...L
40
+ }, i) => {
41
+ var P;
42
+ const Q = et({}), p = d === "multiple" || d === "tags", [k, M] = N(
43
+ U,
44
+ W || q,
45
+ V
46
+ ), m = ft(), [e, u] = N(
47
+ H,
48
+ J,
49
+ K
50
+ ), { floatingStyles: R, refs: w } = ot({
36
51
  placement: "bottom-start",
37
52
  transform: !1,
38
- open: r && d,
53
+ open: s && k,
39
54
  middleware: [
40
- H({
55
+ lt({
41
56
  mainAxis: 4
42
57
  }),
43
- J({
58
+ nt({
44
59
  allowedPlacements: [
45
60
  "bottom-start",
46
61
  "bottom-end",
@@ -50,87 +65,141 @@ const X = ({
50
65
  "top"
51
66
  ]
52
67
  }),
53
- K({
68
+ st({
54
69
  padding: 8
55
70
  }),
56
- L({
71
+ at({
57
72
  padding: 8,
58
- apply({ availableHeight: t, availableWidth: s, elements: l }) {
59
- l.floating.style.setProperty(
73
+ apply({ availableHeight: t, availableWidth: o, elements: n }) {
74
+ n.floating.style.setProperty(
60
75
  "--available-width",
61
- s + "px"
62
- ), l.floating.style.setProperty(
76
+ o + "px"
77
+ ), n.floating.style.setProperty(
63
78
  "--available-height",
64
79
  t + "px"
65
80
  );
66
81
  }
67
82
  })
68
83
  ],
69
- whileElementsMounted: B
70
- }), b = C(
71
- "ds-select-popup",
72
- u && "ds-select-multiple",
73
- ((x = n == null ? void 0 : n.popup) == null ? void 0 : x.root) || F,
74
- r && "ds-select-popup-enhanced"
75
- ), A = e && typeof e == "string" && e in w ? w[e] : typeof e == "number" ? e + "px" : e || "fit-content";
76
- return /* @__PURE__ */ o(
77
- a,
84
+ whileElementsMounted: rt
85
+ }), X = D(
86
+ (t) => {
87
+ const o = Array.isArray(t) ? t.length : 1;
88
+ return p ? o + ` ${o == 1 ? "item" : "items"} selected` : /* @__PURE__ */ r(y, { children: t });
89
+ },
90
+ [p]
91
+ ), Y = G(
92
+ m("select", x && "select-selection-summary"),
93
+ T
94
+ ), F = G(
95
+ m(
96
+ "select-popup",
97
+ p && "select-multiple",
98
+ s && "select-popup-enhanced"
99
+ ),
100
+ ((P = c == null ? void 0 : c.popup) == null ? void 0 : P.root) || $
101
+ ), Z = l && typeof l == "string" && l in E ? E[l] : typeof l == "number" ? l + "px" : l || "fit-content", I = D(
102
+ (t) => {
103
+ const o = g ? g(t) : h ? h(t) : t;
104
+ if (!A) return o;
105
+ const n = Array.isArray(e) && e.length > 0, _ = Array.isArray(a) ? a.map((f) => f.value) : e.map((f) => f.value), z = Array.isArray(e) && e.length && e.length < a.length;
106
+ return /* @__PURE__ */ S(y, { children: [
107
+ /* @__PURE__ */ r(
108
+ ut,
109
+ {
110
+ className: m(
111
+ "select-item",
112
+ "select-item-option",
113
+ n && "select-item-option-selected",
114
+ "select-item-option-active"
115
+ ),
116
+ onMouseOver: (f) => {
117
+ },
118
+ selectAllRender: O,
119
+ checked: n,
120
+ indeterminate: z,
121
+ onSelectAll: () => u(_),
122
+ onDeselectAll: () => u([])
123
+ }
124
+ ),
125
+ /* @__PURE__ */ r(mt, {}),
126
+ o
127
+ ] });
128
+ },
129
+ [
130
+ g,
131
+ h,
132
+ A,
133
+ e,
134
+ a,
135
+ m,
136
+ O,
137
+ u
138
+ ]
139
+ );
140
+ return /* @__PURE__ */ r(
141
+ b,
78
142
  {
79
143
  ref: (t) => {
80
- p && (typeof p == "function" ? p(t) : p.current = t), t && h.setReference(t == null ? void 0 : t.nativeElement);
144
+ i && (typeof i == "function" ? i(t) : i.current = t), t && w.setReference(t == null ? void 0 : t.nativeElement);
81
145
  },
82
- suffixIcon: /* @__PURE__ */ o(R, { weight: "bold" }),
83
- open: d,
84
- onOpenChange: g,
85
- popupClassName: b,
146
+ suffixIcon: /* @__PURE__ */ r(tt, { weight: "bold" }),
147
+ open: k,
148
+ onOpenChange: M,
149
+ value: e,
150
+ onChange: u,
151
+ popupClassName: F,
86
152
  classNames: {
87
153
  popup: {
88
- root: b
154
+ root: F
89
155
  },
90
- ...n
156
+ ...c
91
157
  },
92
- ...u ? {
93
- menuItemSelectedIcon: ({ isSelected: t }) => /* @__PURE__ */ o("span", { className: "ant-select-checkbox-indicator", children: t ? /* @__PURE__ */ o(y, { checked: !0 }) : /* @__PURE__ */ o(y, { checked: !1 }) })
158
+ ...p ? {
159
+ menuItemSelectedIcon: ({ isSelected: t }) => /* @__PURE__ */ r("span", { className: "ant-select-checkbox-indicator", children: t ? /* @__PURE__ */ r(j, { checked: !0 }) : /* @__PURE__ */ r(j, { checked: !1 }) })
94
160
  } : {},
95
- mode: i,
96
- className: C("ds-select", O),
97
- styles: r ? T(m, {
161
+ mode: d,
162
+ className: Y,
163
+ styles: s ? it(C, {
98
164
  popup: {
99
165
  root: {
100
166
  transition: "none",
101
- ...S,
102
- "--ds-select-popup-width": A
167
+ ...R,
168
+ "--ds-select-popup-width": Z
103
169
  }
104
170
  }
105
- }) : m,
106
- getPopupContainer: I || (r ? () => E || document.body : void 0),
107
- popupRender: (t) => {
108
- const s = () => c ? c(t) : f ? f(t) : t;
109
- return r ? /* @__PURE__ */ N(D, { children: [
110
- /* @__PURE__ */ o(Q, { lockScroll: !0, onClick: () => g(!1) }),
111
- /* @__PURE__ */ o(
112
- "div",
113
- {
114
- ref: (l) => {
115
- if (!l) return;
116
- const G = l.closest(
117
- ".ds-select-dropdown"
118
- );
119
- h.setFloating(G);
120
- },
121
- children: s()
122
- }
123
- )
124
- ] }) : s();
125
- },
126
- ...j
171
+ }) : C,
172
+ getPopupContainer: B || (s ? () => Q || document.body : void 0),
173
+ popupRender: (t) => s ? /* @__PURE__ */ S(y, { children: [
174
+ /* @__PURE__ */ r(ct, { lockScroll: !0, onClick: () => M(!1) }),
175
+ /* @__PURE__ */ r(
176
+ "div",
177
+ {
178
+ ref: (o) => {
179
+ if (!o) return;
180
+ const n = o.closest(
181
+ ".ds-select-dropdown"
182
+ );
183
+ w.setFloating(n);
184
+ },
185
+ children: I(t)
186
+ }
187
+ )
188
+ ] }) : I(t),
189
+ options: a,
190
+ ...x ? {
191
+ maxTagCount: 1,
192
+ showSearch: !1,
193
+ labelRender: () => v ? v(e) : X(e)
194
+ } : {},
195
+ ...L
127
196
  }
128
197
  );
129
- }, Y = U(X), st = Object.assign(Y, {
130
- Option: a.Option,
131
- OptGroup: a.OptGroup
198
+ }, gt = pt(dt), St = Object.assign(gt, {
199
+ Option: b.Option,
200
+ OptGroup: b.OptGroup
132
201
  });
133
202
  export {
134
- st as Select
203
+ St as Select
135
204
  };
136
205
  //# sourceMappingURL=component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"component.js","sources":["../../../src/components/select/component.tsx"],"sourcesContent":["\"use client\";\nimport { CaretDown } from \"@bioturing/assets\";\nimport {\n default as AntSelect,\n type BaseOptionType,\n type DefaultOptionType,\n type SelectProps as AntSelectProps,\n} from \"antd/es/select\";\nimport { default as Checkbox } from \"antd/es/checkbox\";\nimport { CSSProperties, forwardRef } from \"react\";\nimport {\n useFloating,\n offset,\n autoPlacement,\n shift,\n size,\n autoUpdate,\n useFloatingPortalNode,\n FloatingOverlay,\n} from \"@floating-ui/react\";\nimport { useControlledState } from \"../hooks\";\nimport React from \"react\";\nimport { clsx } from \"../utils\";\nimport { PopupPanelSize } from \"../popup-panel/constants\";\nimport { toMerged } from \"es-toolkit\";\n\n// Import component-specific styles\nimport \"./style.css\";\n\n// Define props interface extending Ant Design's SelectProps\nexport interface SelectProps<\n ValueType = unknown,\n OptionType extends BaseOptionType | DefaultOptionType = DefaultOptionType\n> extends AntSelectProps<ValueType, OptionType> {\n /**\n * Whether to enhance the positioner using floating-ui\n * @default false\n */\n enhancePositioner?: boolean;\n /**\n * Size of the popup panel\n * Will be ignored if enhancePositioner is false\n */\n popupSize?: string | number | PopupPanelSize;\n}\n\nexport type {\n BaseOptionType as SelectBaseOptionType,\n DefaultOptionType as SelectDefaultOptionType,\n};\n\n// Create inner function\nconst MainSelectInner = <\n ValueType = unknown,\n OptionType extends BaseOptionType | DefaultOptionType = DefaultOptionType\n>(\n {\n mode,\n className,\n open: openProp,\n defaultOpen,\n onOpenChange,\n popupClassName,\n onDropdownVisibleChange,\n enhancePositioner,\n getPopupContainer,\n popupSize,\n popupRender,\n dropdownRender,\n classNames,\n styles = {},\n ...rest\n }: SelectProps<ValueType, OptionType>,\n ref: React.Ref<React.ComponentRef<typeof AntSelect>>\n) => {\n const portalNode = useFloatingPortalNode({});\n const isMultiple = mode === \"multiple\" || mode === \"tags\";\n const [open, setOpen] = useControlledState(\n openProp,\n onOpenChange || onDropdownVisibleChange,\n defaultOpen\n );\n // enhancePositioner\n const { floatingStyles, refs } = useFloating({\n placement: \"bottom-start\",\n transform: false,\n open: enhancePositioner && open,\n middleware: [\n offset({\n mainAxis: 4,\n }),\n autoPlacement({\n allowedPlacements: [\n \"bottom-start\",\n \"bottom-end\",\n \"bottom\",\n \"top-start\",\n \"top-end\",\n \"top\",\n ],\n }),\n shift({\n padding: 8,\n }),\n size({\n padding: 8,\n apply({ availableHeight, availableWidth, elements }) {\n // 2. Or, use a CSS variable:\n elements.floating.style.setProperty(\n \"--available-width\",\n availableWidth + \"px\"\n );\n elements.floating.style.setProperty(\n \"--available-height\",\n availableHeight + \"px\"\n );\n },\n }),\n ],\n whileElementsMounted: autoUpdate,\n });\n const dsPopupClassName = clsx(\n \"ds-select-popup\",\n isMultiple && \"ds-select-multiple\",\n classNames?.popup?.root || popupClassName,\n enhancePositioner && \"ds-select-popup-enhanced\"\n );\n const popupWidth =\n popupSize && typeof popupSize === \"string\" && popupSize in PopupPanelSize\n ? PopupPanelSize[popupSize as keyof typeof PopupPanelSize]\n : typeof popupSize === \"number\"\n ? popupSize + \"px\"\n : popupSize || \"fit-content\";\n return (\n <AntSelect\n // ref={ref}\n ref={(node) => {\n if (ref) {\n if (typeof ref == \"function\") {\n ref(node);\n } else {\n ref.current = node;\n }\n }\n if (!node) return;\n refs.setReference(node?.nativeElement as HTMLElement);\n }}\n suffixIcon={<CaretDown weight=\"bold\" />}\n open={open}\n onOpenChange={setOpen}\n // for old version\n popupClassName={dsPopupClassName}\n classNames={{\n popup: {\n root: dsPopupClassName,\n },\n ...classNames,\n }}\n {...(isMultiple\n ? {\n menuItemSelectedIcon: ({ isSelected }) => (\n <span className=\"ant-select-checkbox-indicator\">\n {isSelected ? (\n <Checkbox checked />\n ) : (\n <Checkbox checked={false} />\n )}\n </span>\n ),\n }\n : {})}\n mode={mode}\n className={clsx(\"ds-select\", className)}\n styles={\n enhancePositioner\n ? toMerged(styles, {\n popup: {\n root: {\n transition: \"none\",\n ...floatingStyles,\n \"--ds-select-popup-width\": popupWidth,\n } as CSSProperties,\n },\n })\n : styles\n }\n getPopupContainer={\n getPopupContainer ||\n (enhancePositioner ? () => portalNode || document.body : undefined)\n }\n popupRender={(menu) => {\n // Use a more specific type that includes both style and ref properties\n const renderMenu = () =>\n popupRender\n ? popupRender(menu)\n : dropdownRender\n ? dropdownRender(menu)\n : menu;\n if (!enhancePositioner) {\n return renderMenu();\n }\n return (\n <>\n <FloatingOverlay lockScroll onClick={() => setOpen(false)} />\n <div\n ref={(node) => {\n if (!node) return;\n const popupEl = node.closest(\n \".ds-select-dropdown\"\n ) as HTMLDivElement;\n refs.setFloating(popupEl);\n }}\n >\n {renderMenu()}\n </div>\n </>\n );\n }}\n {...rest}\n />\n );\n};\n\n// Use forwardRef with type assertion\nconst MainSelect = forwardRef(MainSelectInner) as <\n ValueType = unknown,\n OptionType extends BaseOptionType | DefaultOptionType = DefaultOptionType\n>(\n props: SelectProps<ValueType, OptionType> & {\n ref?: React.ForwardedRef<React.ComponentRef<typeof AntSelect>>;\n }\n) => ReturnType<typeof MainSelectInner>;\n\nexport const Select = Object.assign(MainSelect, {\n Option: AntSelect.Option,\n OptGroup: AntSelect.OptGroup,\n});\n"],"names":["MainSelectInner","mode","className","openProp","defaultOpen","onOpenChange","popupClassName","onDropdownVisibleChange","enhancePositioner","getPopupContainer","popupSize","popupRender","dropdownRender","classNames","styles","rest","ref","portalNode","useFloatingPortalNode","isMultiple","open","setOpen","useControlledState","floatingStyles","refs","useFloating","offset","autoPlacement","shift","size","availableHeight","availableWidth","elements","autoUpdate","dsPopupClassName","clsx","_a","popupWidth","PopupPanelSize","jsx","AntSelect","node","CaretDown","isSelected","Checkbox","toMerged","menu","renderMenu","jsxs","Fragment","FloatingOverlay","popupEl","MainSelect","forwardRef","Select"],"mappings":"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"}
1
+ {"version":3,"file":"component.js","sources":["../../../src/components/select/component.tsx"],"sourcesContent":["\"use client\";\nimport { CaretDown } from \"@bioturing/assets\";\nimport {\n autoPlacement,\n autoUpdate,\n FloatingOverlay,\n offset,\n shift,\n size,\n useFloating,\n useFloatingPortalNode,\n} from \"@floating-ui/react\";\nimport { default as Checkbox } from \"antd/es/checkbox\";\nimport {\n default as AntSelect,\n type SelectProps as AntSelectProps,\n type BaseOptionType,\n type DefaultOptionType,\n} from \"antd/es/select\";\nimport { toMerged } from \"es-toolkit\";\nimport React, {\n CSSProperties,\n forwardRef,\n isValidElement,\n useCallback,\n} from \"react\";\nimport { useControlledState } from \"../hooks\";\nimport { PopupPanelSize } from \"../popup-panel/constants\";\nimport { clsx, useCls } from \"../utils\";\n\n// Import component-specific styles\nimport { Divider } from \"antd\";\nimport { CheckboxProps } from \"../checkbox\";\nimport { SelectItem } from \"./item\";\nimport \"./style.css\";\n\n// SelectItem component props\n\n// Define props interface extending Ant Design's SelectProps\nexport interface SelectProps<\n ValueType = unknown,\n OptionType extends BaseOptionType | DefaultOptionType = DefaultOptionType\n> extends AntSelectProps<ValueType, OptionType> {\n /**\n * Whether to enhance the positioner using floating-ui\n * @default false\n */\n enhancePositioner?: boolean;\n /**\n * Size of the popup panel\n * Will be ignored if enhancePositioner is false\n */\n popupSize?: string | number | PopupPanelSize;\n /**\n * Show selection summary instead of tags in multiple case\n * @default false\n */\n showSelectionSummary?: boolean;\n /**\n * Render function for the selection summary in multiple case\n * @default (value) => `${value.length} items selected`\n */\n selectionSummaryRender?: (value: ValueType) => React.ReactNode;\n /**\n * Show select all option when in multiple mode\n * @default false\n */\n showSelectAll?: boolean;\n /**\n * Render function for the select all option\n */\n selectAllRender?: (props: {\n onClick: () => void;\n checked: CheckboxProps[\"checked\"];\n indeterminate: CheckboxProps[\"indeterminate\"];\n }) => React.ReactNode;\n}\n\nexport type {\n BaseOptionType as SelectBaseOptionType,\n DefaultOptionType as SelectDefaultOptionType,\n};\n\n// Create inner function\nconst MainSelectInner = <\n ValueType = unknown,\n OptionType extends BaseOptionType | DefaultOptionType = DefaultOptionType\n>(\n {\n mode,\n className,\n open: openProp,\n defaultOpen,\n onOpenChange,\n popupClassName,\n onDropdownVisibleChange,\n enhancePositioner,\n getPopupContainer,\n popupSize,\n popupRender,\n dropdownRender,\n classNames,\n styles = {},\n showSelectionSummary,\n selectionSummaryRender,\n value: valueProp,\n onChange: onChangeProp,\n defaultValue,\n showSelectAll,\n selectAllRender,\n options,\n ...rest\n }: SelectProps<ValueType, OptionType>,\n ref: React.Ref<React.ComponentRef<typeof AntSelect>>\n) => {\n const portalNode = useFloatingPortalNode({});\n const isMultiple = mode === \"multiple\" || mode === \"tags\";\n const [open, setOpen] = useControlledState(\n openProp,\n onOpenChange || onDropdownVisibleChange,\n defaultOpen\n );\n const cls = useCls();\n const [value, onChange] = useControlledState(\n valueProp,\n onChangeProp,\n defaultValue\n );\n // enhancePositioner\n const { floatingStyles, refs } = useFloating({\n placement: \"bottom-start\",\n transform: false,\n open: enhancePositioner && open,\n middleware: [\n offset({\n mainAxis: 4,\n }),\n autoPlacement({\n allowedPlacements: [\n \"bottom-start\",\n \"bottom-end\",\n \"bottom\",\n \"top-start\",\n \"top-end\",\n \"top\",\n ],\n }),\n shift({\n padding: 8,\n }),\n size({\n padding: 8,\n apply({ availableHeight, availableWidth, elements }) {\n // 2. Or, use a CSS variable:\n elements.floating.style.setProperty(\n \"--available-width\",\n availableWidth + \"px\"\n );\n elements.floating.style.setProperty(\n \"--available-height\",\n availableHeight + \"px\"\n );\n },\n }),\n ],\n whileElementsMounted: autoUpdate,\n });\n\n const defaultSelectionSummaryRender = useCallback(\n (v: ValueType) => {\n const count = Array.isArray(v) ? v.length : 1;\n if (isMultiple) {\n return count + ` ${count == 1 ? \"item\" : \"items\"} selected`;\n }\n return <>{v}</>;\n },\n [isMultiple]\n );\n\n const dsSelectClassname = clsx(\n cls(\"select\", showSelectionSummary && \"select-selection-summary\"),\n className\n );\n\n const dsPopupClassName = clsx(\n cls(\n \"select-popup\",\n isMultiple && \"select-multiple\",\n enhancePositioner && \"select-popup-enhanced\"\n ),\n classNames?.popup?.root || popupClassName\n );\n const popupWidth =\n popupSize && typeof popupSize === \"string\" && popupSize in PopupPanelSize\n ? PopupPanelSize[popupSize as keyof typeof PopupPanelSize]\n : typeof popupSize === \"number\"\n ? popupSize + \"px\"\n : popupSize || \"fit-content\";\n const customRenderMenu = useCallback(\n (menu: React.ReactElement) => {\n const renderedMenu = popupRender\n ? popupRender(menu)\n : dropdownRender\n ? dropdownRender(menu)\n : menu;\n if (!showSelectAll) return renderedMenu;\n const checked = Array.isArray(value) && value.length > 0;\n const allValues = Array.isArray(options)\n ? options.map((option) => option.value)\n : (value as any).map((v: any) => v.value);\n const indeterminate =\n Array.isArray(value) && value.length && value.length < options.length;\n return (\n <>\n <SelectItem\n className={cls(\n \"select-item\",\n \"select-item-option\",\n checked && \"select-item-option-selected\",\n \"select-item-option-active\"\n )}\n onMouseOver={(e) => {}}\n selectAllRender={selectAllRender}\n checked={checked}\n indeterminate={indeterminate}\n onSelectAll={() => onChange(allValues)}\n onDeselectAll={() => onChange([] as ValueType)}\n />\n <Divider />\n {renderedMenu}\n </>\n );\n },\n [\n popupRender,\n dropdownRender,\n showSelectAll,\n value,\n options,\n cls,\n selectAllRender,\n onChange,\n ]\n );\n return (\n <AntSelect\n // ref={ref}\n ref={(node) => {\n if (ref) {\n if (typeof ref == \"function\") {\n ref(node);\n } else {\n ref.current = node;\n }\n }\n if (!node) return;\n refs.setReference(node?.nativeElement as HTMLElement);\n }}\n suffixIcon={<CaretDown weight=\"bold\" />}\n open={open}\n onOpenChange={setOpen}\n value={value}\n onChange={onChange}\n // for old version\n popupClassName={dsPopupClassName}\n classNames={{\n popup: {\n root: dsPopupClassName,\n },\n ...classNames,\n }}\n {...(isMultiple\n ? {\n menuItemSelectedIcon: ({ isSelected }) => (\n <span className=\"ant-select-checkbox-indicator\">\n {isSelected ? (\n <Checkbox checked />\n ) : (\n <Checkbox checked={false} />\n )}\n </span>\n ),\n }\n : {})}\n mode={mode}\n className={dsSelectClassname}\n styles={\n enhancePositioner\n ? toMerged(styles, {\n popup: {\n root: {\n transition: \"none\",\n ...floatingStyles,\n \"--ds-select-popup-width\": popupWidth,\n } as CSSProperties,\n },\n })\n : styles\n }\n getPopupContainer={\n getPopupContainer ||\n (enhancePositioner ? () => portalNode || document.body : undefined)\n }\n popupRender={(menu) => {\n if (!enhancePositioner) {\n return customRenderMenu(menu);\n }\n return (\n <>\n <FloatingOverlay lockScroll onClick={() => setOpen(false)} />\n <div\n ref={(node) => {\n if (!node) return;\n const popupEl = node.closest(\n \".ds-select-dropdown\"\n ) as HTMLDivElement;\n refs.setFloating(popupEl);\n }}\n >\n {customRenderMenu(menu)}\n </div>\n </>\n );\n }}\n options={options}\n {...(showSelectionSummary\n ? {\n maxTagCount: 1,\n showSearch: false,\n labelRender: () => {\n if (selectionSummaryRender) {\n return selectionSummaryRender(value);\n }\n return defaultSelectionSummaryRender(value);\n },\n }\n : {})}\n {...rest}\n />\n );\n};\n\n// Use forwardRef with type assertion\nconst MainSelect = forwardRef(MainSelectInner) as <\n ValueType = unknown,\n OptionType extends BaseOptionType | DefaultOptionType = DefaultOptionType\n>(\n props: SelectProps<ValueType, OptionType> & {\n ref?: React.ForwardedRef<React.ComponentRef<typeof AntSelect>>;\n }\n) => ReturnType<typeof MainSelectInner>;\n\nexport const Select = Object.assign(MainSelect, {\n Option: AntSelect.Option,\n OptGroup: AntSelect.OptGroup,\n});\n"],"names":["MainSelectInner","mode","className","openProp","defaultOpen","onOpenChange","popupClassName","onDropdownVisibleChange","enhancePositioner","getPopupContainer","popupSize","popupRender","dropdownRender","classNames","styles","showSelectionSummary","selectionSummaryRender","valueProp","onChangeProp","defaultValue","showSelectAll","selectAllRender","options","rest","ref","portalNode","useFloatingPortalNode","isMultiple","open","setOpen","useControlledState","cls","useCls","value","onChange","floatingStyles","refs","useFloating","offset","autoPlacement","shift","size","availableHeight","availableWidth","elements","autoUpdate","defaultSelectionSummaryRender","useCallback","v","count","dsSelectClassname","clsx","dsPopupClassName","_a","popupWidth","PopupPanelSize","customRenderMenu","menu","renderedMenu","checked","allValues","option","indeterminate","jsxs","Fragment","jsx","SelectItem","e","Divider","AntSelect","node","CaretDown","isSelected","Checkbox","toMerged","FloatingOverlay","popupEl","MainSelect","forwardRef","Select"],"mappings":";;;;;;;;;;;;;;;AAoFA,MAAMA,KAAkB,CAItB;AAAA,EACE,MAAAC;AAAA,EACA,WAAAC;AAAA,EACA,MAAMC;AAAA,EACN,aAAAC;AAAA,EACA,cAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,yBAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,WAAAC;AAAA,EACA,aAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,YAAAC;AAAA,EACA,QAAAC,IAAS,CAAC;AAAA,EACV,sBAAAC;AAAA,EACA,wBAAAC;AAAA,EACA,OAAOC;AAAA,EACP,UAAUC;AAAA,EACV,cAAAC;AAAA,EACA,eAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,SAAAC;AAAA,EACA,GAAGC;AACL,GACAC,MACG;;AACG,QAAAC,IAAaC,GAAsB,EAAE,GACrCC,IAAa1B,MAAS,cAAcA,MAAS,QAC7C,CAAC2B,GAAMC,CAAO,IAAIC;AAAA,IACtB3B;AAAA,IACAE,KAAgBE;AAAA,IAChBH;AAAA,EACF,GACM2B,IAAMC,GAAO,GACb,CAACC,GAAOC,CAAQ,IAAIJ;AAAA,IACxBb;AAAA,IACAC;AAAA,IACAC;AAAA,EACF,GAEM,EAAE,gBAAAgB,GAAgB,MAAAC,EAAK,IAAIC,GAAY;AAAA,IAC3C,WAAW;AAAA,IACX,WAAW;AAAA,IACX,MAAM7B,KAAqBoB;AAAA,IAC3B,YAAY;AAAA,MACVU,GAAO;AAAA,QACL,UAAU;AAAA,MAAA,CACX;AAAA,MACDC,GAAc;AAAA,QACZ,mBAAmB;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MACF,CACD;AAAA,MACDC,GAAM;AAAA,QACJ,SAAS;AAAA,MAAA,CACV;AAAA,MACDC,GAAK;AAAA,QACH,SAAS;AAAA,QACT,MAAM,EAAE,iBAAAC,GAAiB,gBAAAC,GAAgB,UAAAC,KAAY;AAEnD,UAAAA,EAAS,SAAS,MAAM;AAAA,YACtB;AAAA,YACAD,IAAiB;AAAA,UACnB,GACAC,EAAS,SAAS,MAAM;AAAA,YACtB;AAAA,YACAF,IAAkB;AAAA,UACpB;AAAA,QAAA;AAAA,MAEH,CAAA;AAAA,IACH;AAAA,IACA,sBAAsBG;AAAA,EAAA,CACvB,GAEKC,IAAgCC;AAAA,IACpC,CAACC,MAAiB;AAChB,YAAMC,IAAQ,MAAM,QAAQD,CAAC,IAAIA,EAAE,SAAS;AAC5C,aAAIrB,IACKsB,IAAQ,IAAIA,KAAS,IAAI,SAAS,OAAO,qCAExC,UAAED,EAAA,CAAA;AAAA,IACd;AAAA,IACA,CAACrB,CAAU;AAAA,EACb,GAEMuB,IAAoBC;AAAA,IACxBpB,EAAI,UAAUhB,KAAwB,0BAA0B;AAAA,IAChEb;AAAA,EACF,GAEMkD,IAAmBD;AAAA,IACvBpB;AAAA,MACE;AAAA,MACAJ,KAAc;AAAA,MACdnB,KAAqB;AAAA,IACvB;AAAA,MACA6C,IAAAxC,KAAA,gBAAAA,EAAY,UAAZ,gBAAAwC,EAAmB,SAAQ/C;AAAA,EAC7B,GACMgD,IACJ5C,KAAa,OAAOA,KAAc,YAAYA,KAAa6C,IACvDA,EAAe7C,CAAwC,IACvD,OAAOA,KAAc,WACrBA,IAAY,OACZA,KAAa,eACb8C,IAAmBT;AAAA,IACvB,CAACU,MAA6B;AACtB,YAAAC,IAAe/C,IACjBA,EAAY8C,CAAI,IAChB7C,IACAA,EAAe6C,CAAI,IACnBA;AACA,UAAA,CAACrC,EAAsB,QAAAsC;AAC3B,YAAMC,IAAU,MAAM,QAAQ1B,CAAK,KAAKA,EAAM,SAAS,GACjD2B,IAAY,MAAM,QAAQtC,CAAO,IACnCA,EAAQ,IAAI,CAACuC,MAAWA,EAAO,KAAK,IACnC5B,EAAc,IAAI,CAACe,MAAWA,EAAE,KAAK,GACpCc,IACJ,MAAM,QAAQ7B,CAAK,KAAKA,EAAM,UAAUA,EAAM,SAASX,EAAQ;AACjE,aAEI,gBAAAyC,EAAAC,GAAA,EAAA,UAAA;AAAA,QAAA,gBAAAC;AAAA,UAACC;AAAA,UAAA;AAAA,YACC,WAAWnC;AAAA,cACT;AAAA,cACA;AAAA,cACA4B,KAAW;AAAA,cACX;AAAA,YACF;AAAA,YACA,aAAa,CAACQ,MAAM;AAAA,YAAC;AAAA,YACrB,iBAAA9C;AAAA,YACA,SAAAsC;AAAA,YACA,eAAAG;AAAA,YACA,aAAa,MAAM5B,EAAS0B,CAAS;AAAA,YACrC,eAAe,MAAM1B,EAAS,CAAe,CAAA;AAAA,UAAA;AAAA,QAC/C;AAAA,0BACCkC,IAAQ,EAAA;AAAA,QACRV;AAAA,MAAA,GACH;AAAA,IAEJ;AAAA,IACA;AAAA,MACE/C;AAAA,MACAC;AAAA,MACAQ;AAAA,MACAa;AAAA,MACAX;AAAA,MACAS;AAAA,MACAV;AAAA,MACAa;AAAA,IAAA;AAAA,EAEJ;AAEE,SAAA,gBAAA+B;AAAA,IAACI;AAAA,IAAA;AAAA,MAEC,KAAK,CAACC,MAAS;AAQb,QAPI9C,MACE,OAAOA,KAAO,aAChBA,EAAI8C,CAAI,IAER9C,EAAI,UAAU8C,IAGbA,KACAlC,EAAA,aAAakC,KAAA,gBAAAA,EAAM,aAA4B;AAAA,MACtD;AAAA,MACA,YAAY,gBAAAL,EAACM,IAAU,EAAA,QAAO,OAAO,CAAA;AAAA,MACrC,MAAA3C;AAAA,MACA,cAAcC;AAAA,MACd,OAAAI;AAAA,MACA,UAAAC;AAAA,MAEA,gBAAgBkB;AAAA,MAChB,YAAY;AAAA,QACV,OAAO;AAAA,UACL,MAAMA;AAAA,QACR;AAAA,QACA,GAAGvC;AAAA,MACL;AAAA,MACC,GAAIc,IACD;AAAA,QACE,sBAAsB,CAAC,EAAE,YAAA6C,QACvB,gBAAAP,EAAC,UAAK,WAAU,iCACb,cACE,gBAAAA,EAAAQ,GAAA,EAAS,SAAO,IAAC,sBAEjBA,GAAS,EAAA,SAAS,IAAO,EAE9B,CAAA;AAAA,MAAA,IAGJ,CAAC;AAAA,MACL,MAAAxE;AAAA,MACA,WAAWiD;AAAA,MACX,QACE1C,IACIkE,GAAS5D,GAAQ;AAAA,QACf,OAAO;AAAA,UACL,MAAM;AAAA,YACJ,YAAY;AAAA,YACZ,GAAGqB;AAAA,YACH,2BAA2BmB;AAAA,UAAA;AAAA,QAC7B;AAAA,MAEH,CAAA,IACDxC;AAAA,MAEN,mBACEL,MACCD,IAAoB,MAAMiB,KAAc,SAAS,OAAO;AAAA,MAE3D,aAAa,CAACgC,MACPjD,IAKD,gBAAAuD,EAAAC,GAAA,EAAA,UAAA;AAAA,QAAA,gBAAAC,EAACU,MAAgB,YAAU,IAAC,SAAS,MAAM9C,EAAQ,EAAK,GAAG;AAAA,QAC3D,gBAAAoC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAK,CAACK,MAAS;AACb,kBAAI,CAACA,EAAM;AACX,oBAAMM,IAAUN,EAAK;AAAA,gBACnB;AAAA,cACF;AACA,cAAAlC,EAAK,YAAYwC,CAAO;AAAA,YAC1B;AAAA,YAEC,YAAiBnB,CAAI;AAAA,UAAA;AAAA,QAAA;AAAA,MACxB,GACF,IAhBOD,EAAiBC,CAAI;AAAA,MAmBhC,SAAAnC;AAAA,MACC,GAAIP,IACD;AAAA,QACE,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,aAAa,MACPC,IACKA,EAAuBiB,CAAK,IAE9Ba,EAA8Bb,CAAK;AAAA,MAC5C,IAEF,CAAC;AAAA,MACJ,GAAGV;AAAA,IAAA;AAAA,EACN;AAEJ,GAGMsD,KAAaC,GAAW9E,EAAe,GAShC+E,KAAS,OAAO,OAAOF,IAAY;AAAA,EAC9C,QAAQR,EAAU;AAAA,EAClB,UAAUA,EAAU;AACtB,CAAC;"}
@@ -0,0 +1,54 @@
1
+ import { jsx as s } from "react/jsx-runtime";
2
+ import n from "merge-refs";
3
+ import { forwardRef as v } from "react";
4
+ import { useHover as u } from "../hooks/useHover.js";
5
+ import { Checkbox as C } from "../checkbox/component.js";
6
+ import { useCls as g } from "../utils/antdUtils.js";
7
+ const h = v(
8
+ ({
9
+ className: x,
10
+ onMouseOver: N,
11
+ selectAllRender: o,
12
+ checked: e,
13
+ indeterminate: t,
14
+ onSelectAll: r,
15
+ onDeselectAll: m,
16
+ ...i
17
+ }, c) => {
18
+ const [l, f] = u(), p = g();
19
+ return /* @__PURE__ */ s(
20
+ "div",
21
+ {
22
+ ref: n(l, c),
23
+ className: p(
24
+ "select-item",
25
+ "select-item-option",
26
+ e && "select-item-option-selected",
27
+ "select-item-select-all",
28
+ f && "select-item-option-active"
29
+ ),
30
+ ...i,
31
+ children: o ? o({
32
+ onClick: e ? m : r,
33
+ checked: e,
34
+ indeterminate: t
35
+ }) : /* @__PURE__ */ s(
36
+ C,
37
+ {
38
+ checked: e,
39
+ indeterminate: t,
40
+ onChange: (a) => {
41
+ a.target.checked ? r() : m();
42
+ },
43
+ children: "Select all"
44
+ }
45
+ )
46
+ }
47
+ );
48
+ }
49
+ );
50
+ h.displayName = "SelectItem";
51
+ export {
52
+ h as SelectItem
53
+ };
54
+ //# sourceMappingURL=item.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item.js","sources":["../../../src/components/select/item.tsx"],"sourcesContent":["import mergeRefs from \"merge-refs\";\nimport { CheckboxProps, Checkbox } from \"../checkbox\";\nimport { useHover } from \"../hooks\";\nimport { useCls } from \"../utils\";\nimport { forwardRef } from \"react\";\n\nexport interface SelectItemProps extends React.ComponentPropsWithoutRef<\"div\"> {\n selectAllRender?: (props: {\n onClick: () => void;\n checked: CheckboxProps[\"checked\"];\n indeterminate: CheckboxProps[\"indeterminate\"];\n }) => React.ReactNode;\n checked: boolean;\n indeterminate: boolean;\n onSelectAll: () => void;\n onDeselectAll: () => void;\n}\n\n// SelectItem component\nexport const SelectItem: React.FC<SelectItemProps> = forwardRef<\n HTMLDivElement,\n SelectItemProps\n>(\n (\n {\n className,\n onMouseOver,\n selectAllRender,\n checked,\n indeterminate,\n onSelectAll,\n onDeselectAll,\n ...rest\n },\n forwardedRef\n ) => {\n const [ref, _hovering] = useHover<HTMLDivElement>();\n const cls = useCls();\n return (\n <div\n ref={mergeRefs(ref, forwardedRef)}\n className={cls(\n \"select-item\",\n \"select-item-option\",\n checked && \"select-item-option-selected\",\n \"select-item-select-all\",\n _hovering && \"select-item-option-active\"\n )}\n {...rest}\n >\n {selectAllRender ? (\n selectAllRender({\n onClick: checked ? onDeselectAll : onSelectAll,\n checked,\n indeterminate,\n })\n ) : (\n <Checkbox\n checked={checked}\n indeterminate={indeterminate}\n onChange={(e) => {\n if (e.target.checked) {\n onSelectAll();\n } else {\n onDeselectAll();\n }\n }}\n >\n Select all\n </Checkbox>\n )}\n </div>\n );\n }\n);\n\nSelectItem.displayName = \"SelectItem\";\n"],"names":["SelectItem","forwardRef","className","onMouseOver","selectAllRender","checked","indeterminate","onSelectAll","onDeselectAll","rest","forwardedRef","ref","_hovering","useHover","cls","useCls","jsx","mergeRefs","Checkbox","e"],"mappings":";;;;;;AAmBO,MAAMA,IAAwCC;AAAA,EAInD,CACE;AAAA,IACE,WAAAC;AAAA,IACA,aAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,SAAAC;AAAA,IACA,eAAAC;AAAA,IACA,aAAAC;AAAA,IACA,eAAAC;AAAA,IACA,GAAGC;AAAA,KAELC,MACG;AACH,UAAM,CAACC,GAAKC,CAAS,IAAIC,EAAyB,GAC5CC,IAAMC,EAAO;AAEjB,WAAA,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKC,EAAUN,GAAKD,CAAY;AAAA,QAChC,WAAWI;AAAA,UACT;AAAA,UACA;AAAA,UACAT,KAAW;AAAA,UACX;AAAA,UACAO,KAAa;AAAA,QACf;AAAA,QACC,GAAGH;AAAA,QAEH,cACCL,EAAgB;AAAA,UACd,SAASC,IAAUG,IAAgBD;AAAA,UACnC,SAAAF;AAAA,UACA,eAAAC;AAAA,QACD,CAAA,IAED,gBAAAU;AAAA,UAACE;AAAA,UAAA;AAAA,YACC,SAAAb;AAAA,YACA,eAAAC;AAAA,YACA,UAAU,CAACa,MAAM;AACX,cAAAA,EAAE,OAAO,UACCZ,EAAA,IAEEC,EAAA;AAAA,YAElB;AAAA,YACD,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAED;AAAA,IAEJ;AAAA,EAAA;AAGN;AAEAR,EAAW,cAAc;"}
@@ -1 +1 @@
1
- @layer components{.ds-select-popup .ds-select-item-option-state{order:-1}.ds-select-popup .ds-select-checkbox-indicator,.ds-select-popup .ant-select-checkbox-indicator{margin-right:.5rem}.ds-select-multiple .ds-select-item-option-selected:not(.ds-select-item-option-disabled):not(:hover){background:transparent}.ds-select-popup-enhanced{transition:none;width:var(--ds-select-popup-width);height:fit-content;max-width:calc(var(--available-width) - 16px);max-height:calc(var(--available-height) - 16px)}}
1
+ @layer components{.ds-select-popup .ds-select-item-option-state{order:-1}.ds-select-popup .ds-select-checkbox-indicator,.ds-select-popup .ant-select-checkbox-indicator{margin-right:.5rem}.ds-select-multiple .ds-select-item-option-selected:not(.ds-select-item-option-disabled):not(:hover){background:transparent}.ds-select-popup-enhanced{transition:none;width:var(--ds-select-popup-width);height:fit-content;max-width:calc(var(--available-width) - 16px);max-height:calc(var(--available-height) - 16px)}.ds-select-selection-summary .ds-select-selection-overflow-item.ds-select-selection-overflow-item-rest{display:none}.ds-select-selection-summary .ds-select-selection-overflow-item-suffix{opacity:0}.ds-select-selection-summary .ds-select-selection-item-remove{display:none}.ds-select-selection-summary .ds-select-selection-item{background:transparent;border:none}.ds-select-item-select-all>.ds-checkbox-wrapper{width:100%;flex-grow:1}.ds-select-item-select-all+.ds-divider{padding:0;margin-top:.5rem;margin-bottom:.5rem}}
@@ -5,27 +5,27 @@ import { InternalPanel as p } from "antd/es/splitter/Panel";
5
5
  import { useCls as f } from "../utils/antdUtils.js";
6
6
  import { clsx as x } from "../utils/cn.js";
7
7
  const R = o.forwardRef(({
8
- children: t,
8
+ children: n,
9
9
  className: s,
10
10
  style: m,
11
- defaultSize: n,
11
+ defaultSize: t,
12
12
  ...e
13
13
  }, c) => {
14
- const i = f(), r = n === "max-content" || n === "min-content" || n === "fit-content", l = x(
14
+ const i = f(), r = t === "max-content" || t === "min-content" || t === "fit-content", l = x(
15
15
  s,
16
- r && i(`splitter-panel-${n}`)
16
+ r && i(`splitter-panel-${t}`)
17
17
  );
18
18
  return /* @__PURE__ */ a(
19
19
  p,
20
20
  {
21
21
  className: l,
22
22
  style: m,
23
- defaultSize: n,
23
+ defaultSize: t,
24
24
  ...e,
25
- children: r && o.isValidElement(t) ? o.cloneElement(
26
- t,
25
+ children: r && o.isValidElement(n) ? o.cloneElement(
26
+ n,
27
27
  { ref: c }
28
- ) : t
28
+ ) : n
29
29
  }
30
30
  );
31
31
  });
@@ -25,14 +25,14 @@ const Oe = (E) => {
25
25
  onResizeStart: C,
26
26
  onResize: a,
27
27
  onResizeEnd: o,
28
- lazy: B,
29
- showSplitBar: W = !0
28
+ lazy: _,
29
+ showSplitBar: B = !0
30
30
  } = E, {
31
- getPrefixCls: j,
32
- direction: D,
33
- className: _,
31
+ getPrefixCls: W,
32
+ direction: j,
33
+ className: D,
34
34
  style: q
35
- } = he("splitter"), n = j("splitter", V), M = de(n), [F, H, L] = xe(n, M), m = l === "vertical", p = D === "rtl", T = !m && p, i = ge(w), N = u.useMemo(() => i.map(() => u.createRef()), [i.length]);
35
+ } = he("splitter"), n = W("splitter", V), M = de(n), [F, H, L] = xe(n, M), m = l === "vertical", p = j === "rtl", T = !m && p, i = ge(w), N = u.useMemo(() => i.map(() => u.createRef()), [i.length]);
36
36
  if (process.env.NODE_ENV !== "production") {
37
37
  const t = Ce("Splitter");
38
38
  let e = !1, s = !1;
@@ -81,10 +81,10 @@ const Oe = (E) => {
81
81
  `${n}-${l}`,
82
82
  {
83
83
  [`${n}-rtl`]: p,
84
- [`${n}-hide-bars`]: !W
84
+ [`${n}-hide-bars`]: !B
85
85
  },
86
86
  R,
87
- _,
87
+ D,
88
88
  L,
89
89
  M,
90
90
  H
@@ -114,7 +114,7 @@ const Oe = (E) => {
114
114
  r = /* @__PURE__ */ f(
115
115
  ye,
116
116
  {
117
- lazy: B,
117
+ lazy: _,
118
118
  index: e,
119
119
  active: I === e,
120
120
  prefixCls: n,
@@ -1,8 +1,8 @@
1
1
  import u from "react";
2
- const I = (s, l, p) => {
2
+ const I = (s, l, d) => {
3
3
  const o = s.cloneNode(!0);
4
- o.style.position = "absolute", o.style.visibility = "hidden", o.style.pointerEvents = "none", o.style.zIndex = "-1", o.style.top = "0", o.style.left = "0", p === "horizontal" ? (o.style.width = l, o.style.height = "100%") : (o.style.width = "100%", o.style.height = l), document.body.appendChild(o);
5
- const d = o.getBoundingClientRect(), a = p === "horizontal" ? d.width : d.height;
4
+ o.style.position = "absolute", o.style.visibility = "hidden", o.style.pointerEvents = "none", o.style.zIndex = "-1", o.style.top = "0", o.style.left = "0", d === "horizontal" ? (o.style.width = l, o.style.height = "100%") : (o.style.width = "100%", o.style.height = l), document.body.appendChild(o);
5
+ const p = o.getBoundingClientRect(), a = d === "horizontal" ? p.width : p.height;
6
6
  return document.body.removeChild(o), a > 0 ? Math.ceil(a) : 0;
7
7
  };
8
8
  function y(s) {
@@ -11,8 +11,8 @@ function y(s) {
11
11
  function M(s) {
12
12
  return typeof s == "string" && s.endsWith("%");
13
13
  }
14
- function B(s, l, p = "horizontal", o = []) {
15
- const d = s.map((e) => e.size), a = s.length, c = l || 0, w = (e) => e * c, [v, C] = u.useState(() => s.map((e) => e.defaultSize)), [z, P] = u.useState(/* @__PURE__ */ new Map()), b = (e) => e === "max-content" || e === "min-content" || e === "fit-content";
14
+ function _(s, l, d = "horizontal", o = []) {
15
+ const p = s.map((e) => e.size), a = s.length, c = l || 0, w = (e) => e * c, [v, C] = u.useState(() => s.map((e) => e.defaultSize)), [z, P] = u.useState(/* @__PURE__ */ new Map()), b = (e) => e === "max-content" || e === "min-content" || e === "fit-content";
16
16
  u.useEffect(() => {
17
17
  const e = /* @__PURE__ */ new Map();
18
18
  let i = !1;
@@ -20,7 +20,7 @@ function B(s, l, p = "horizontal", o = []) {
20
20
  if (b(r.defaultSize)) {
21
21
  const t = o[n];
22
22
  if (t != null && t.current) {
23
- const f = I(t.current, r.defaultSize, p);
23
+ const f = I(t.current, r.defaultSize, d);
24
24
  if (f > 0) {
25
25
  const g = z.get(n);
26
26
  g === void 0 || g !== f ? (e.set(n, f), i = !0) : e.set(n, g);
@@ -28,15 +28,15 @@ function B(s, l, p = "horizontal", o = []) {
28
28
  }
29
29
  }
30
30
  }), i && P((r) => new Map([...r, ...e]));
31
- }, [s, o, p, l]);
31
+ }, [s, o, d, l]);
32
32
  const m = u.useMemo(() => {
33
33
  const e = [];
34
34
  for (let i = 0; i < a; i += 1) {
35
- let r = d[i] ?? v[i];
35
+ let r = p[i] ?? v[i];
36
36
  b(r) && z.has(i) && (r = z.get(i)), e[i] = r;
37
37
  }
38
38
  return e;
39
- }, [a, v, d, z]), h = u.useMemo(() => {
39
+ }, [a, v, p, z]), h = u.useMemo(() => {
40
40
  let e = [], i = 0;
41
41
  for (let n = 0; n < a; n += 1) {
42
42
  const t = m[n];
@@ -80,7 +80,7 @@ function B(s, l, p = "horizontal", o = []) {
80
80
  ];
81
81
  }
82
82
  export {
83
- B as default,
83
+ _ as default,
84
84
  y as getPtg
85
85
  };
86
86
  //# sourceMappingURL=useSizes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSizes.js","sources":["../../../src/components/splitter/useSizes.ts"],"sourcesContent":["import React from \"react\";\n\nimport type { SplitterPanelProps } from \"./splitter-panel\";\n\n// Helper to measure intrinsic content size\nconst measureIntrinsicSize = (\n element: HTMLElement, \n intrinsicType: \"max-content\" | \"min-content\" | \"fit-content\",\n layout: \"horizontal\" | \"vertical\"\n): number => {\n const clonedElement = element.cloneNode(true) as HTMLElement;\n \n // Set up the cloned element for measurement\n clonedElement.style.position = \"absolute\";\n clonedElement.style.visibility = \"hidden\";\n clonedElement.style.pointerEvents = \"none\";\n clonedElement.style.zIndex = \"-1\";\n clonedElement.style.top = \"0\";\n clonedElement.style.left = \"0\";\n\n if (layout === \"horizontal\") {\n clonedElement.style.width = intrinsicType;\n clonedElement.style.height = \"100%\";\n } else {\n clonedElement.style.width = \"100%\";\n clonedElement.style.height = intrinsicType;\n }\n\n document.body.appendChild(clonedElement);\n const rect = clonedElement.getBoundingClientRect();\n const size = layout === \"horizontal\" ? rect.width : rect.height;\n document.body.removeChild(clonedElement);\n\n return size > 0 ? Math.ceil(size) : 0;\n};\n\nexport function getPtg(str: string) {\n return Number(str.slice(0, -1)) / 100;\n}\n\nfunction isPtg(itemSize: string | number | undefined): itemSize is string {\n return typeof itemSize === \"string\" && itemSize.endsWith(\"%\");\n}\n\n/**\n * Save the size state.\n * Align the size into flex percentage base.\n */\nexport default function useSizes(\n items: SplitterPanelProps[],\n containerSize?: number,\n layout: \"horizontal\" | \"vertical\" = \"horizontal\",\n elementRefs: React.RefObject<HTMLElement>[] = []\n) {\n const propSizes = items.map((item) => item.size);\n\n const itemsCount = items.length;\n\n const mergedContainerSize = containerSize || 0;\n const ptg2px = (ptg: number) => ptg * mergedContainerSize;\n\n // We do not need care the size state match the `items` length in `useState`.\n // It will calculate later.\n const [innerSizes, setInnerSizes] = React.useState<\n (string | number | undefined)[]\n >(() => items.map((item) => item.defaultSize));\n\n // Track measured intrinsic sizes\n const [intrinsicSizes, setIntrinsicSizes] = React.useState<Map<number, number>>(new Map());\n \n // Helper function to check if a size is intrinsic\n const isIntrinsicSize = (size: string | number | undefined): size is \"max-content\" | \"min-content\" | \"fit-content\" => {\n return size === \"max-content\" || size === \"min-content\" || size === \"fit-content\";\n };\n\n // Measure intrinsic sizes directly using element refs\n React.useEffect(() => {\n const newSizes = new Map<number, number>();\n let hasChanges = false;\n\n items.forEach((item, index) => {\n if (isIntrinsicSize(item.defaultSize)) {\n const ref = elementRefs[index];\n if (ref?.current) {\n const measuredSize = measureIntrinsicSize(ref.current, item.defaultSize, layout);\n if (measuredSize > 0) {\n const currentSize = intrinsicSizes.get(index);\n if (currentSize === undefined || currentSize !== measuredSize) {\n newSizes.set(index, measuredSize);\n hasChanges = true;\n } else {\n newSizes.set(index, currentSize);\n }\n }\n }\n }\n });\n\n if (hasChanges) {\n setIntrinsicSizes(prev => new Map([...prev, ...newSizes]));\n }\n }, [items, elementRefs, layout, containerSize]); // Re-measure when container size changes for responsiveness\n const sizes = React.useMemo(() => {\n const mergedSizes: SplitterPanelProps[\"size\"][] = [];\n\n for (let i = 0; i < itemsCount; i += 1) {\n let size = propSizes[i] ?? innerSizes[i];\n \n // Replace intrinsic sizes with measured pixel values\n if (isIntrinsicSize(size) && intrinsicSizes.has(i)) {\n size = intrinsicSizes.get(i);\n }\n \n mergedSizes[i] = size;\n }\n\n return mergedSizes;\n }, [itemsCount, innerSizes, propSizes, intrinsicSizes]);\n\n // Post handle the size. Will do:\n // 1. Convert all the px into percentage if not empty.\n // 2. Get rest percentage for exist percentage.\n // 3. Fill the rest percentage into empty item.\n const postPercentSizes = React.useMemo(() => {\n let ptgList: (number | undefined)[] = [];\n let emptyCount = 0;\n\n // Fill default percentage\n for (let i = 0; i < itemsCount; i += 1) {\n const itemSize = sizes[i];\n\n if (isPtg(itemSize)) {\n ptgList[i] = getPtg(itemSize);\n } else if (itemSize || itemSize === 0) {\n const num = Number(itemSize);\n if (!Number.isNaN(num)) {\n ptgList[i] = num / mergedContainerSize;\n }\n } else {\n emptyCount += 1;\n ptgList[i] = undefined;\n }\n }\n\n const totalPtg = ptgList.reduce<number>((acc, ptg) => acc + (ptg || 0), 0);\n\n if (totalPtg > 1 || !emptyCount) {\n // If total percentage is larger than 1, we will scale it down.\n const scale = 1 / totalPtg;\n ptgList = ptgList.map((ptg) => (ptg === undefined ? 0 : ptg * scale));\n } else {\n // If total percentage is smaller than 1, we will fill the rest.\n const avgRest = (1 - totalPtg) / emptyCount;\n ptgList = ptgList.map((ptg) => (ptg === undefined ? avgRest : ptg));\n }\n\n return ptgList as number[];\n }, [sizes, mergedContainerSize]);\n\n const postPxSizes = React.useMemo(\n () => postPercentSizes.map(ptg2px),\n [postPercentSizes, mergedContainerSize]\n );\n\n const postPercentMinSizes = React.useMemo(\n () =>\n items.map((item) => {\n if (isPtg(item.min)) {\n return getPtg(item.min);\n }\n return (item.min || 0) / mergedContainerSize;\n }),\n [items, mergedContainerSize]\n );\n\n const postPercentMaxSizes = React.useMemo(\n () =>\n items.map((item) => {\n if (isPtg(item.max)) {\n return getPtg(item.max);\n }\n return (item.max || mergedContainerSize) / mergedContainerSize;\n }),\n [items, mergedContainerSize]\n );\n\n // If ssr, we will use the size from developer config first.\n const panelSizes = React.useMemo(\n () => (containerSize ? postPxSizes : sizes),\n [postPxSizes, containerSize]\n );\n\n return [\n panelSizes,\n postPxSizes,\n postPercentSizes,\n postPercentMinSizes,\n postPercentMaxSizes,\n setInnerSizes,\n ] as const;\n}\n"],"names":["measureIntrinsicSize","element","intrinsicType","layout","clonedElement","rect","size","getPtg","str","isPtg","itemSize","useSizes","items","containerSize","elementRefs","propSizes","item","itemsCount","mergedContainerSize","ptg2px","ptg","innerSizes","setInnerSizes","React","intrinsicSizes","setIntrinsicSizes","isIntrinsicSize","newSizes","hasChanges","index","ref","measuredSize","currentSize","prev","sizes","mergedSizes","postPercentSizes","ptgList","emptyCount","i","num","totalPtg","acc","scale","avgRest","postPxSizes","postPercentMinSizes","postPercentMaxSizes"],"mappings":"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"}
1
+ {"version":3,"file":"useSizes.js","sources":["../../../src/components/splitter/useSizes.ts"],"sourcesContent":["import React from \"react\";\n\nimport type { SplitterPanelProps } from \"./splitter-panel\";\n\n// Helper to measure intrinsic content size\nconst measureIntrinsicSize = (\n element: HTMLElement, \n intrinsicType: \"max-content\" | \"min-content\" | \"fit-content\",\n layout: \"horizontal\" | \"vertical\"\n): number => {\n const clonedElement = element.cloneNode(true) as HTMLElement;\n \n // Set up the cloned element for measurement\n clonedElement.style.position = \"absolute\";\n clonedElement.style.visibility = \"hidden\";\n clonedElement.style.pointerEvents = \"none\";\n clonedElement.style.zIndex = \"-1\";\n clonedElement.style.top = \"0\";\n clonedElement.style.left = \"0\";\n\n if (layout === \"horizontal\") {\n clonedElement.style.width = intrinsicType;\n clonedElement.style.height = \"100%\";\n } else {\n clonedElement.style.width = \"100%\";\n clonedElement.style.height = intrinsicType;\n }\n\n document.body.appendChild(clonedElement);\n const rect = clonedElement.getBoundingClientRect();\n const size = layout === \"horizontal\" ? rect.width : rect.height;\n document.body.removeChild(clonedElement);\n\n return size > 0 ? Math.ceil(size) : 0;\n};\n\nexport function getPtg(str: string) {\n return Number(str.slice(0, -1)) / 100;\n}\n\nfunction isPtg(itemSize: string | number | undefined): itemSize is string {\n return typeof itemSize === \"string\" && itemSize.endsWith(\"%\");\n}\n\n/**\n * Save the size state.\n * Align the size into flex percentage base.\n */\nexport default function useSizes(\n items: SplitterPanelProps[],\n containerSize?: number,\n layout: \"horizontal\" | \"vertical\" = \"horizontal\",\n elementRefs: React.RefObject<HTMLElement>[] = []\n) {\n const propSizes = items.map((item) => item.size);\n\n const itemsCount = items.length;\n\n const mergedContainerSize = containerSize || 0;\n const ptg2px = (ptg: number) => ptg * mergedContainerSize;\n\n // We do not need care the size state match the `items` length in `useState`.\n // It will calculate later.\n const [innerSizes, setInnerSizes] = React.useState<\n (string | number | undefined)[]\n >(() => items.map((item) => item.defaultSize));\n\n // Track measured intrinsic sizes\n const [intrinsicSizes, setIntrinsicSizes] = React.useState<Map<number, number>>(new Map());\n \n // Helper function to check if a size is intrinsic\n const isIntrinsicSize = (size: string | number | undefined): size is \"max-content\" | \"min-content\" | \"fit-content\" => {\n return size === \"max-content\" || size === \"min-content\" || size === \"fit-content\";\n };\n\n // Measure intrinsic sizes directly using element refs\n React.useEffect(() => {\n const newSizes = new Map<number, number>();\n let hasChanges = false;\n\n items.forEach((item, index) => {\n if (isIntrinsicSize(item.defaultSize)) {\n const ref = elementRefs[index];\n if (ref?.current) {\n const measuredSize = measureIntrinsicSize(ref.current, item.defaultSize, layout);\n if (measuredSize > 0) {\n const currentSize = intrinsicSizes.get(index);\n if (currentSize === undefined || currentSize !== measuredSize) {\n newSizes.set(index, measuredSize);\n hasChanges = true;\n } else {\n newSizes.set(index, currentSize);\n }\n }\n }\n }\n });\n\n if (hasChanges) {\n setIntrinsicSizes(prev => new Map([...prev, ...newSizes]));\n }\n }, [items, elementRefs, layout, containerSize]); // Re-measure when container size changes for responsiveness\n const sizes = React.useMemo(() => {\n const mergedSizes: SplitterPanelProps[\"size\"][] = [];\n\n for (let i = 0; i < itemsCount; i += 1) {\n let size = propSizes[i] ?? innerSizes[i];\n \n // Replace intrinsic sizes with measured pixel values\n if (isIntrinsicSize(size) && intrinsicSizes.has(i)) {\n size = intrinsicSizes.get(i);\n }\n \n mergedSizes[i] = size;\n }\n\n return mergedSizes;\n }, [itemsCount, innerSizes, propSizes, intrinsicSizes]);\n\n // Post handle the size. Will do:\n // 1. Convert all the px into percentage if not empty.\n // 2. Get rest percentage for exist percentage.\n // 3. Fill the rest percentage into empty item.\n const postPercentSizes = React.useMemo(() => {\n let ptgList: (number | undefined)[] = [];\n let emptyCount = 0;\n\n // Fill default percentage\n for (let i = 0; i < itemsCount; i += 1) {\n const itemSize = sizes[i];\n\n if (isPtg(itemSize)) {\n ptgList[i] = getPtg(itemSize);\n } else if (itemSize || itemSize === 0) {\n const num = Number(itemSize);\n if (!Number.isNaN(num)) {\n ptgList[i] = num / mergedContainerSize;\n }\n } else {\n emptyCount += 1;\n ptgList[i] = undefined;\n }\n }\n\n const totalPtg = ptgList.reduce<number>((acc, ptg) => acc + (ptg || 0), 0);\n\n if (totalPtg > 1 || !emptyCount) {\n // If total percentage is larger than 1, we will scale it down.\n const scale = 1 / totalPtg;\n ptgList = ptgList.map((ptg) => (ptg === undefined ? 0 : ptg * scale));\n } else {\n // If total percentage is smaller than 1, we will fill the rest.\n const avgRest = (1 - totalPtg) / emptyCount;\n ptgList = ptgList.map((ptg) => (ptg === undefined ? avgRest : ptg));\n }\n\n return ptgList as number[];\n }, [sizes, mergedContainerSize]);\n\n const postPxSizes = React.useMemo(\n () => postPercentSizes.map(ptg2px),\n [postPercentSizes, mergedContainerSize]\n );\n\n const postPercentMinSizes = React.useMemo(\n () =>\n items.map((item) => {\n if (isPtg(item.min)) {\n return getPtg(item.min);\n }\n return (item.min || 0) / mergedContainerSize;\n }),\n [items, mergedContainerSize]\n );\n\n const postPercentMaxSizes = React.useMemo(\n () =>\n items.map((item) => {\n if (isPtg(item.max)) {\n return getPtg(item.max);\n }\n return (item.max || mergedContainerSize) / mergedContainerSize;\n }),\n [items, mergedContainerSize]\n );\n\n // If ssr, we will use the size from developer config first.\n const panelSizes = React.useMemo(\n () => (containerSize ? postPxSizes : sizes),\n [postPxSizes, containerSize]\n );\n\n return [\n panelSizes,\n postPxSizes,\n postPercentSizes,\n postPercentMinSizes,\n postPercentMaxSizes,\n setInnerSizes,\n ] as const;\n}\n"],"names":["measureIntrinsicSize","element","intrinsicType","layout","clonedElement","rect","size","getPtg","str","isPtg","itemSize","useSizes","items","containerSize","elementRefs","propSizes","item","itemsCount","mergedContainerSize","ptg2px","ptg","innerSizes","setInnerSizes","React","intrinsicSizes","setIntrinsicSizes","isIntrinsicSize","newSizes","hasChanges","index","ref","measuredSize","currentSize","prev","sizes","mergedSizes","postPercentSizes","ptgList","emptyCount","i","num","totalPtg","acc","scale","avgRest","postPxSizes","postPercentMinSizes","postPercentMaxSizes"],"mappings":"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"}