@bioturing/components 0.25.0 → 0.27.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 (48) hide show
  1. package/dist/components/checkbox/component.js +12 -4
  2. package/dist/components/checkbox/component.js.map +1 -1
  3. package/dist/components/checkbox/style.css +1 -1
  4. package/dist/components/choice-list/component.js +24 -21
  5. package/dist/components/choice-list/component.js.map +1 -1
  6. package/dist/components/cmdk/index.js.map +1 -1
  7. package/dist/components/dropdown-menu/component.js +16 -15
  8. package/dist/components/dropdown-menu/component.js.map +1 -1
  9. package/dist/components/form/item.js +31 -28
  10. package/dist/components/form/item.js.map +1 -1
  11. package/dist/components/form/style.css +1 -1
  12. package/dist/components/popup-panel/component.js +142 -164
  13. package/dist/components/popup-panel/component.js.map +1 -1
  14. package/dist/components/popup-panel/style.css +1 -1
  15. package/dist/components/resizable/component.js +171 -0
  16. package/dist/components/resizable/component.js.map +1 -0
  17. package/dist/components/resizable/style.css +1 -0
  18. package/dist/components/segmented/component.js +3 -3
  19. package/dist/components/segmented/component.js.map +1 -1
  20. package/dist/components/spin/component.js +9 -8
  21. package/dist/components/spin/component.js.map +1 -1
  22. package/dist/components/splitter/component.js +7 -36
  23. package/dist/components/splitter/component.js.map +1 -1
  24. package/dist/components/splitter/context.js +6 -0
  25. package/dist/components/splitter/context.js.map +1 -0
  26. package/dist/components/splitter/splitter-panel.js +35 -0
  27. package/dist/components/splitter/splitter-panel.js.map +1 -0
  28. package/dist/components/splitter/splitter.js +158 -0
  29. package/dist/components/splitter/splitter.js.map +1 -0
  30. package/dist/components/splitter/style.css +1 -1
  31. package/dist/components/splitter/useSizes.js +86 -0
  32. package/dist/components/splitter/useSizes.js.map +1 -0
  33. package/dist/components/upload/dragger.js +19 -10
  34. package/dist/components/upload/dragger.js.map +1 -1
  35. package/dist/components/upload/item.js +21 -18
  36. package/dist/components/upload/item.js.map +1 -1
  37. package/dist/components/utils/antdUtils.js +18 -56
  38. package/dist/components/utils/antdUtils.js.map +1 -1
  39. package/dist/components/utils/placement.js +58 -0
  40. package/dist/components/utils/placement.js.map +1 -0
  41. package/dist/components/utils/reactElement.js +5 -0
  42. package/dist/components/utils/reactElement.js.map +1 -0
  43. package/dist/index.d.ts +196 -25
  44. package/dist/index.js +164 -158
  45. package/dist/index.js.map +1 -1
  46. package/dist/metadata.js +22 -2
  47. package/dist/metadata.js.map +1 -1
  48. package/package.json +4 -2
@@ -0,0 +1,86 @@
1
+ import u from "react";
2
+ const I = (s, l, p) => {
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;
6
+ return document.body.removeChild(o), a > 0 ? Math.ceil(a) : 0;
7
+ };
8
+ function y(s) {
9
+ return Number(s.slice(0, -1)) / 100;
10
+ }
11
+ function M(s) {
12
+ return typeof s == "string" && s.endsWith("%");
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";
16
+ u.useEffect(() => {
17
+ const e = /* @__PURE__ */ new Map();
18
+ let i = !1;
19
+ s.forEach((r, n) => {
20
+ if (b(r.defaultSize)) {
21
+ const t = o[n];
22
+ if (t != null && t.current) {
23
+ const f = I(t.current, r.defaultSize, p);
24
+ if (f > 0) {
25
+ const g = z.get(n);
26
+ g === void 0 || g !== f ? (e.set(n, f), i = !0) : e.set(n, g);
27
+ }
28
+ }
29
+ }
30
+ }), i && P((r) => new Map([...r, ...e]));
31
+ }, [s, o, p, l]);
32
+ const m = u.useMemo(() => {
33
+ const e = [];
34
+ for (let i = 0; i < a; i += 1) {
35
+ let r = d[i] ?? v[i];
36
+ b(r) && z.has(i) && (r = z.get(i)), e[i] = r;
37
+ }
38
+ return e;
39
+ }, [a, v, d, z]), h = u.useMemo(() => {
40
+ let e = [], i = 0;
41
+ for (let n = 0; n < a; n += 1) {
42
+ const t = m[n];
43
+ if (M(t))
44
+ e[n] = y(t);
45
+ else if (t || t === 0) {
46
+ const f = Number(t);
47
+ Number.isNaN(f) || (e[n] = f / c);
48
+ } else
49
+ i += 1, e[n] = void 0;
50
+ }
51
+ const r = e.reduce((n, t) => n + (t || 0), 0);
52
+ if (r > 1 || !i) {
53
+ const n = 1 / r;
54
+ e = e.map((t) => t === void 0 ? 0 : t * n);
55
+ } else {
56
+ const n = (1 - r) / i;
57
+ e = e.map((t) => t === void 0 ? n : t);
58
+ }
59
+ return e;
60
+ }, [m, c]), S = u.useMemo(
61
+ () => h.map(w),
62
+ [h, c]
63
+ ), x = u.useMemo(
64
+ () => s.map((e) => M(e.min) ? y(e.min) : (e.min || 0) / c),
65
+ [s, c]
66
+ ), N = u.useMemo(
67
+ () => s.map((e) => M(e.max) ? y(e.max) : (e.max || c) / c),
68
+ [s, c]
69
+ );
70
+ return [
71
+ u.useMemo(
72
+ () => l ? S : m,
73
+ [S, l]
74
+ ),
75
+ S,
76
+ h,
77
+ x,
78
+ N,
79
+ C
80
+ ];
81
+ }
82
+ export {
83
+ B as default,
84
+ y as getPtg
85
+ };
86
+ //# sourceMappingURL=useSizes.js.map
@@ -0,0 +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,22 +1,31 @@
1
1
  "use client";
2
- import { jsx as r, jsxs as i, Fragment as p } from "react/jsx-runtime";
3
- import m from "antd/es/upload";
4
- import { CloudArrowUp as u } from "@bioturing/assets";
5
- import { useUploadItemRender as c } from "./hooks.js";
6
- import { useCls as f } from "../utils/antdUtils.js";
2
+ import { jsx as r, jsxs as p, Fragment as m } from "react/jsx-runtime";
3
+ import c from "antd/es/upload";
4
+ import { CloudArrowUpIcon as u } from "@bioturing/assets";
5
+ import { useUploadItemRender as f } from "./hooks.js";
6
+ import { useCls as g } from "../utils/antdUtils.js";
7
7
  const N = ({
8
8
  children: o,
9
9
  uploadTitle: t = "Click or drag file to this area to upload",
10
10
  uploadDescription: l = "Support for a single or bulk upload.",
11
- itemRender: a,
12
- ...n
11
+ itemRender: n,
12
+ className: a,
13
+ ...s
13
14
  }) => {
14
- const e = f(), s = () => /* @__PURE__ */ i(p, { children: [
15
+ const e = g(), d = () => /* @__PURE__ */ p(m, { children: [
15
16
  /* @__PURE__ */ r("p", { className: e("upload-drag-icon"), children: /* @__PURE__ */ r(u, { size: 40 }) }),
16
17
  /* @__PURE__ */ r("p", { className: e("upload-text"), children: t }),
17
18
  /* @__PURE__ */ r("p", { className: e("upload-hint"), children: l })
18
- ] }), d = c({ showRemoveButton: !0 });
19
- return /* @__PURE__ */ r(m.Dragger, { itemRender: a || d, ...n, children: o || s() });
19
+ ] }), i = f({ showRemoveButton: !0 });
20
+ return /* @__PURE__ */ r(
21
+ c.Dragger,
22
+ {
23
+ className: a,
24
+ itemRender: n || i,
25
+ ...s,
26
+ children: o || d()
27
+ }
28
+ );
20
29
  };
21
30
  export {
22
31
  N as Dragger
@@ -1 +1 @@
1
- {"version":3,"file":"dragger.js","sources":["../../../src/components/upload/dragger.tsx"],"sourcesContent":["\"use client\";\nimport {\n default as AntUpload,\n type DraggerProps as AntDraggerProps,\n} from \"antd/es/upload\";\nimport React from \"react\";\nimport { CloudArrowUp } from \"@bioturing/assets\";\nimport { useCls } from \"../utils\";\nimport { useUploadItemRender } from \"./hooks\";\n\nexport interface DraggerProps extends AntDraggerProps {\n /**\n * Custom title for the upload component\n */\n uploadTitle?: React.ReactNode;\n /**\n * Custom description for the upload component\n **/\n uploadDescription?: React.ReactNode;\n}\n\nexport const Dragger = ({\n children,\n uploadTitle = \"Click or drag file to this area to upload\",\n uploadDescription = \"Support for a single or bulk upload.\",\n itemRender,\n ...rest\n}: DraggerProps) => {\n const cls = useCls();\n const renderChildren = () => {\n return (\n <>\n <p className={cls(\"upload-drag-icon\")}>\n <CloudArrowUp size={40} />\n </p>\n <p className={cls(\"upload-text\")}>{uploadTitle}</p>\n <p className={cls(\"upload-hint\")}>{uploadDescription}</p>\n </>\n );\n };\n const defaultItemRender = useUploadItemRender({ showRemoveButton: true });\n return (\n <AntUpload.Dragger itemRender={itemRender || defaultItemRender} {...rest}>\n {children ? children : renderChildren()}\n </AntUpload.Dragger>\n );\n};\n"],"names":["Dragger","children","uploadTitle","uploadDescription","itemRender","rest","cls","useCls","renderChildren","jsxs","Fragment","jsx","CloudArrowUp","defaultItemRender","useUploadItemRender","AntUpload"],"mappings":";;;;;;AAqBO,MAAMA,IAAU,CAAC;AAAA,EACtB,UAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,mBAAAC,IAAoB;AAAA,EACpB,YAAAC;AAAA,EACA,GAAGC;AACL,MAAoB;AAClB,QAAMC,IAAMC,EAAO,GACbC,IAAiB,MAGjB,gBAAAC,EAAAC,GAAA,EAAA,UAAA;AAAA,IAAC,gBAAAC,EAAA,KAAA,EAAE,WAAWL,EAAI,kBAAkB,GAClC,UAAC,gBAAAK,EAAAC,GAAA,EAAa,MAAM,GAAA,CAAI,EAC1B,CAAA;AAAA,sBACC,KAAE,EAAA,WAAWN,EAAI,aAAa,GAAI,UAAYJ,GAAA;AAAA,sBAC9C,KAAE,EAAA,WAAWI,EAAI,aAAa,GAAI,UAAkBH,EAAA,CAAA;AAAA,EAAA,GACvD,GAGEU,IAAoBC,EAAoB,EAAE,kBAAkB,IAAM;AACxE,SACG,gBAAAH,EAAAI,EAAU,SAAV,EAAkB,YAAYX,KAAcS,GAAoB,GAAGR,GACjE,UAAAJ,KAAsBO,EACzB,EAAA,CAAA;AAEJ;"}
1
+ {"version":3,"file":"dragger.js","sources":["../../../src/components/upload/dragger.tsx"],"sourcesContent":["\"use client\";\nimport {\n default as AntUpload,\n type DraggerProps as AntDraggerProps,\n} from \"antd/es/upload\";\nimport React from \"react\";\nimport { CloudArrowUpIcon } from \"@bioturing/assets\";\nimport { useCls } from \"../utils\";\nimport { useUploadItemRender } from \"./hooks\";\n\nexport interface DraggerProps extends AntDraggerProps {\n /**\n * Custom title for the upload component\n */\n uploadTitle?: React.ReactNode;\n /**\n * Custom description for the upload component\n **/\n uploadDescription?: React.ReactNode;\n}\n\nexport const Dragger = ({\n children,\n uploadTitle = \"Click or drag file to this area to upload\",\n uploadDescription = \"Support for a single or bulk upload.\",\n itemRender,\n className,\n ...rest\n}: DraggerProps) => {\n const cls = useCls();\n const renderChildren = () => {\n return (\n <>\n <p className={cls(\"upload-drag-icon\")}>\n <CloudArrowUpIcon size={40} />\n </p>\n <p className={cls(\"upload-text\")}>{uploadTitle}</p>\n <p className={cls(\"upload-hint\")}>{uploadDescription}</p>\n </>\n );\n };\n const defaultItemRender = useUploadItemRender({ showRemoveButton: true });\n return (\n <AntUpload.Dragger \n className={className}\n itemRender={itemRender || defaultItemRender} \n {...rest}\n >\n {children ? children : renderChildren()}\n </AntUpload.Dragger>\n );\n};\n"],"names":["Dragger","children","uploadTitle","uploadDescription","itemRender","className","rest","cls","useCls","renderChildren","jsxs","Fragment","jsx","CloudArrowUpIcon","defaultItemRender","useUploadItemRender","AntUpload"],"mappings":";;;;;;AAqBO,MAAMA,IAAU,CAAC;AAAA,EACtB,UAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,mBAAAC,IAAoB;AAAA,EACpB,YAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,MAAoB;AAClB,QAAMC,IAAMC,EAAO,GACbC,IAAiB,MAGjB,gBAAAC,EAAAC,GAAA,EAAA,UAAA;AAAA,IAAC,gBAAAC,EAAA,KAAA,EAAE,WAAWL,EAAI,kBAAkB,GAClC,UAAC,gBAAAK,EAAAC,GAAA,EAAiB,MAAM,GAAA,CAAI,EAC9B,CAAA;AAAA,sBACC,KAAE,EAAA,WAAWN,EAAI,aAAa,GAAI,UAAYL,GAAA;AAAA,sBAC9C,KAAE,EAAA,WAAWK,EAAI,aAAa,GAAI,UAAkBJ,EAAA,CAAA;AAAA,EAAA,GACvD,GAGEW,IAAoBC,EAAoB,EAAE,kBAAkB,IAAM;AAEtE,SAAA,gBAAAH;AAAA,IAACI,EAAU;AAAA,IAAV;AAAA,MACC,WAAAX;AAAA,MACA,YAAYD,KAAcU;AAAA,MACzB,GAAGR;AAAA,MAEH,UAAAL,KAAsBQ,EAAe;AAAA,IAAA;AAAA,EACxC;AAEJ;"}
@@ -1,23 +1,25 @@
1
1
  "use client";
2
2
  import { jsx as e, jsxs as i } from "react/jsx-runtime";
3
3
  import n from "antd/es/flex";
4
- import u from "antd/es/progress";
5
- import { Trash as g } from "@bioturing/assets";
6
- import { Truncate as f } from "../truncate/component.js";
7
- import { getUploadFileIcon as h } from "./utils.js";
8
- import { useCls as x } from "../utils/antdUtils.js";
9
- import { clsx as N } from "../utils/cn.js";
10
- import { IconButton as v } from "../icon-button/component.js";
11
- const U = ({
4
+ import f from "antd/es/progress";
5
+ import { Trash as h } from "@bioturing/assets";
6
+ import { Truncate as x } from "../truncate/component.js";
7
+ import { getUploadFileIcon as N } from "./utils.js";
8
+ import { useCls as v } from "../utils/antdUtils.js";
9
+ import { clsx as j } from "../utils/cn.js";
10
+ import { IconButton as z } from "../icon-button/component.js";
11
+ const y = ({
12
12
  fileName: t,
13
13
  fileType: s,
14
14
  status: o = "pending",
15
15
  percent: a,
16
16
  removable: m = !0,
17
17
  onRemove: c,
18
- extraActions: p
18
+ extraActions: p,
19
+ className: d,
20
+ ...u
19
21
  }) => {
20
- const r = x(), d = Math.round(a || 0), l = {
22
+ const r = v(), g = Math.round(a || 0), l = {
21
23
  done: "success",
22
24
  error: "exception",
23
25
  uploading: "active",
@@ -27,10 +29,11 @@ const U = ({
27
29
  return /* @__PURE__ */ e(
28
30
  n,
29
31
  {
30
- className: N(r("upload-item")),
32
+ className: j(r("upload-item"), d),
31
33
  justify: "space-between",
32
34
  align: "center",
33
35
  "data-error": o === "error",
36
+ ...u,
34
37
  children: /* @__PURE__ */ i(
35
38
  n,
36
39
  {
@@ -39,7 +42,7 @@ const U = ({
39
42
  flex: 1,
40
43
  className: r("upload-item-content"),
41
44
  children: [
42
- /* @__PURE__ */ e("span", { className: r("upload-item-icon"), children: h(s) }),
45
+ /* @__PURE__ */ e("span", { className: r("upload-item-icon"), children: N(s) }),
43
46
  /* @__PURE__ */ i(
44
47
  n,
45
48
  {
@@ -48,11 +51,11 @@ const U = ({
48
51
  flex: 1,
49
52
  className: r("upload-item-name-progress"),
50
53
  children: [
51
- /* @__PURE__ */ e(f, { position: "middle", children: t }),
54
+ /* @__PURE__ */ e(x, { position: "middle", children: t }),
52
55
  /* @__PURE__ */ e(
53
- u,
56
+ f,
54
57
  {
55
- percent: d,
58
+ percent: g,
56
59
  size: "small",
57
60
  className: r("upload-item-progress"),
58
61
  status: o && o in l ? l[o] : "normal"
@@ -64,10 +67,10 @@ const U = ({
64
67
  /* @__PURE__ */ i(n, { gap: 8, align: "center", children: [
65
68
  p,
66
69
  m && /* @__PURE__ */ e(
67
- v,
70
+ z,
68
71
  {
69
72
  label: "Remove",
70
- children: /* @__PURE__ */ e(g, { size: 16 }),
73
+ children: /* @__PURE__ */ e(h, { size: 16 }),
71
74
  onClick: c,
72
75
  size: "small"
73
76
  }
@@ -80,6 +83,6 @@ const U = ({
80
83
  );
81
84
  };
82
85
  export {
83
- U as UploadItem
86
+ y as UploadItem
84
87
  };
85
88
  //# sourceMappingURL=item.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"item.js","sources":["../../../src/components/upload/item.tsx"],"sourcesContent":["\"use client\";\nimport Flex from \"antd/es/flex\";\nimport Progress from \"antd/es/progress\";\nimport { type ProgressProps } from \"antd/es/progress\";\nimport { Trash } from \"@bioturing/assets\";\nimport { IconButton } from \"../icon-button\";\nimport { Truncate } from \"../truncate/component\";\nimport { clsx, useCls } from \"../utils\";\nimport { getUploadFileIcon } from \"./utils\";\n\nexport type UploadFileStatus =\n | \"error\"\n | \"done\"\n | \"uploading\"\n | \"removed\"\n | \"pending\";\n\nexport interface UploadItemProps {\n fileName: string;\n fileType?: string;\n status?: UploadFileStatus;\n percent?: number;\n removable?: boolean;\n onRemove?: () => void;\n extraActions?: React.ReactNode;\n}\n\nexport const UploadItem = ({\n fileName,\n fileType,\n status = \"pending\",\n percent,\n removable = true,\n onRemove,\n extraActions,\n}: UploadItemProps) => {\n const cls = useCls();\n const showPercent = Math.round(percent || 0);\n const statusWithProgress: Record<UploadFileStatus, ProgressProps[\"status\"]> =\n {\n done: \"success\",\n error: \"exception\",\n uploading: \"active\",\n removed: \"normal\",\n pending: \"normal\",\n };\n return (\n <Flex\n className={clsx(cls(\"upload-item\"))}\n justify=\"space-between\"\n align=\"center\"\n data-error={status === \"error\"}\n >\n <Flex\n align=\"center\"\n gap={16}\n flex={1}\n className={cls(\"upload-item-content\")}\n >\n <span className={cls(\"upload-item-icon\")}>\n {getUploadFileIcon(fileType)}\n </span>\n <Flex\n align=\"start\"\n vertical\n flex={1}\n className={cls(\"upload-item-name-progress\")}\n >\n <Truncate position=\"middle\">{fileName}</Truncate>\n <Progress\n percent={showPercent}\n size=\"small\"\n className={cls(\"upload-item-progress\")}\n status={\n status && status in statusWithProgress\n ? statusWithProgress[status]\n : \"normal\"\n }\n />\n </Flex>\n <Flex gap={8} align=\"center\">\n {extraActions}\n {removable && (\n <IconButton\n label=\"Remove\"\n children={<Trash size={16} />}\n onClick={onRemove}\n size=\"small\"\n />\n )}\n </Flex>\n </Flex>\n </Flex>\n );\n};\n"],"names":["UploadItem","fileName","fileType","status","percent","removable","onRemove","extraActions","cls","useCls","showPercent","statusWithProgress","jsx","Flex","clsx","jsxs","getUploadFileIcon","Truncate","Progress","IconButton","Trash"],"mappings":";;;;;;;;;;AA2BO,MAAMA,IAAa,CAAC;AAAA,EACzB,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,QAAAC,IAAS;AAAA,EACT,SAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,UAAAC;AAAA,EACA,cAAAC;AACF,MAAuB;AACrB,QAAMC,IAAMC,EAAO,GACbC,IAAc,KAAK,MAAMN,KAAW,CAAC,GACrCO,IACJ;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AAEA,SAAA,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,WAAWC,EAAKN,EAAI,aAAa,CAAC;AAAA,MAClC,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,cAAYL,MAAW;AAAA,MAEvB,UAAA,gBAAAY;AAAA,QAACF;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,KAAK;AAAA,UACL,MAAM;AAAA,UACN,WAAWL,EAAI,qBAAqB;AAAA,UAEpC,UAAA;AAAA,YAAA,gBAAAI,EAAC,UAAK,WAAWJ,EAAI,kBAAkB,GACpC,UAAAQ,EAAkBd,CAAQ,GAC7B;AAAA,YACA,gBAAAa;AAAA,cAACF;AAAA,cAAA;AAAA,gBACC,OAAM;AAAA,gBACN,UAAQ;AAAA,gBACR,MAAM;AAAA,gBACN,WAAWL,EAAI,2BAA2B;AAAA,gBAE1C,UAAA;AAAA,kBAAC,gBAAAI,EAAAK,GAAA,EAAS,UAAS,UAAU,UAAShB,GAAA;AAAA,kBACtC,gBAAAW;AAAA,oBAACM;AAAA,oBAAA;AAAA,sBACC,SAASR;AAAA,sBACT,MAAK;AAAA,sBACL,WAAWF,EAAI,sBAAsB;AAAA,sBACrC,QACEL,KAAUA,KAAUQ,IAChBA,EAAmBR,CAAM,IACzB;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAER;AAAA,cAAA;AAAA,YACF;AAAA,YACC,gBAAAY,EAAAF,GAAA,EAAK,KAAK,GAAG,OAAM,UACjB,UAAA;AAAA,cAAAN;AAAA,cACAF,KACC,gBAAAO;AAAA,gBAACO;AAAA,gBAAA;AAAA,kBACC,OAAM;AAAA,kBACN,UAAU,gBAAAP,EAACQ,GAAM,EAAA,MAAM,GAAI,CAAA;AAAA,kBAC3B,SAASd;AAAA,kBACT,MAAK;AAAA,gBAAA;AAAA,cAAA;AAAA,YACP,EAEJ,CAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACF;AAAA,EACF;AAEJ;"}
1
+ {"version":3,"file":"item.js","sources":["../../../src/components/upload/item.tsx"],"sourcesContent":["\"use client\";\nimport Flex from \"antd/es/flex\";\nimport Progress from \"antd/es/progress\";\nimport { type ProgressProps } from \"antd/es/progress\";\nimport { Trash } from \"@bioturing/assets\";\nimport { IconButton } from \"../icon-button\";\nimport { Truncate } from \"../truncate/component\";\nimport { clsx, useCls } from \"../utils\";\nimport { getUploadFileIcon } from \"./utils\";\n\nexport type UploadFileStatus =\n | \"error\"\n | \"done\"\n | \"uploading\"\n | \"removed\"\n | \"pending\";\n\nexport interface UploadItemProps extends React.HTMLAttributes<HTMLDivElement> {\n fileName: string;\n fileType?: string;\n status?: UploadFileStatus;\n percent?: number;\n removable?: boolean;\n onRemove?: () => void;\n extraActions?: React.ReactNode;\n}\n\nexport const UploadItem = ({\n fileName,\n fileType,\n status = \"pending\",\n percent,\n removable = true,\n onRemove,\n extraActions,\n className,\n ...rest\n}: UploadItemProps) => {\n const cls = useCls();\n const showPercent = Math.round(percent || 0);\n const statusWithProgress: Record<UploadFileStatus, ProgressProps[\"status\"]> =\n {\n done: \"success\",\n error: \"exception\",\n uploading: \"active\",\n removed: \"normal\",\n pending: \"normal\",\n };\n return (\n <Flex\n className={clsx(cls(\"upload-item\"), className)}\n justify=\"space-between\"\n align=\"center\"\n data-error={status === \"error\"}\n {...rest}\n >\n <Flex\n align=\"center\"\n gap={16}\n flex={1}\n className={cls(\"upload-item-content\")}\n >\n <span className={cls(\"upload-item-icon\")}>\n {getUploadFileIcon(fileType)}\n </span>\n <Flex\n align=\"start\"\n vertical\n flex={1}\n className={cls(\"upload-item-name-progress\")}\n >\n <Truncate position=\"middle\">{fileName}</Truncate>\n <Progress\n percent={showPercent}\n size=\"small\"\n className={cls(\"upload-item-progress\")}\n status={\n status && status in statusWithProgress\n ? statusWithProgress[status]\n : \"normal\"\n }\n />\n </Flex>\n <Flex gap={8} align=\"center\">\n {extraActions}\n {removable && (\n <IconButton\n label=\"Remove\"\n children={<Trash size={16} />}\n onClick={onRemove}\n size=\"small\"\n />\n )}\n </Flex>\n </Flex>\n </Flex>\n );\n};\n"],"names":["UploadItem","fileName","fileType","status","percent","removable","onRemove","extraActions","className","rest","cls","useCls","showPercent","statusWithProgress","jsx","Flex","clsx","jsxs","getUploadFileIcon","Truncate","Progress","IconButton","Trash"],"mappings":";;;;;;;;;;AA2BO,MAAMA,IAAa,CAAC;AAAA,EACzB,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,QAAAC,IAAS;AAAA,EACT,SAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,UAAAC;AAAA,EACA,cAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,MAAuB;AACrB,QAAMC,IAAMC,EAAO,GACbC,IAAc,KAAK,MAAMR,KAAW,CAAC,GACrCS,IACJ;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AAEA,SAAA,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,WAAWC,EAAKN,EAAI,aAAa,GAAGF,CAAS;AAAA,MAC7C,SAAQ;AAAA,MACR,OAAM;AAAA,MACN,cAAYL,MAAW;AAAA,MACtB,GAAGM;AAAA,MAEJ,UAAA,gBAAAQ;AAAA,QAACF;AAAA,QAAA;AAAA,UACC,OAAM;AAAA,UACN,KAAK;AAAA,UACL,MAAM;AAAA,UACN,WAAWL,EAAI,qBAAqB;AAAA,UAEpC,UAAA;AAAA,YAAA,gBAAAI,EAAC,UAAK,WAAWJ,EAAI,kBAAkB,GACpC,UAAAQ,EAAkBhB,CAAQ,GAC7B;AAAA,YACA,gBAAAe;AAAA,cAACF;AAAA,cAAA;AAAA,gBACC,OAAM;AAAA,gBACN,UAAQ;AAAA,gBACR,MAAM;AAAA,gBACN,WAAWL,EAAI,2BAA2B;AAAA,gBAE1C,UAAA;AAAA,kBAAC,gBAAAI,EAAAK,GAAA,EAAS,UAAS,UAAU,UAASlB,GAAA;AAAA,kBACtC,gBAAAa;AAAA,oBAACM;AAAA,oBAAA;AAAA,sBACC,SAASR;AAAA,sBACT,MAAK;AAAA,sBACL,WAAWF,EAAI,sBAAsB;AAAA,sBACrC,QACEP,KAAUA,KAAUU,IAChBA,EAAmBV,CAAM,IACzB;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAER;AAAA,cAAA;AAAA,YACF;AAAA,YACC,gBAAAc,EAAAF,GAAA,EAAK,KAAK,GAAG,OAAM,UACjB,UAAA;AAAA,cAAAR;AAAA,cACAF,KACC,gBAAAS;AAAA,gBAACO;AAAA,gBAAA;AAAA,kBACC,OAAM;AAAA,kBACN,UAAU,gBAAAP,EAACQ,GAAM,EAAA,MAAM,GAAI,CAAA;AAAA,kBAC3B,SAAShB;AAAA,kBACT,MAAK;AAAA,gBAAA;AAAA,cAAA;AAAA,YACP,EAEJ,CAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACF;AAAA,EACF;AAEJ;"}
@@ -1,62 +1,24 @@
1
1
  "use client";
2
- import n from "antd/es/config-provider";
3
- import c from "antd/es/theme/useToken";
4
- import { useContext as i, useCallback as a } from "react";
5
- import { cx as l } from "./cn.js";
6
- const b = () => {
7
- const { getPrefixCls: s } = i(n.ConfigContext);
8
- return { getPrefixCls: s };
9
- }, g = () => {
10
- var t;
11
- return (t = c()[4]) == null ? void 0 : t.key;
12
- }, k = () => {
13
- const { getPrefixCls: s } = i(n.ConfigContext);
14
- return a(
15
- (...e) => l(...e).map((o) => s(o)).join(" "),
16
- [s]
2
+ import o from "antd/es/config-provider";
3
+ import i from "antd/es/theme/useToken";
4
+ import { useContext as n, useCallback as C } from "react";
5
+ import { cx as c } from "./cn.js";
6
+ const x = () => {
7
+ const { getPrefixCls: t } = n(o.ConfigContext);
8
+ return { getPrefixCls: t };
9
+ }, a = () => {
10
+ var e;
11
+ return (e = i()[4]) == null ? void 0 : e.key;
12
+ }, p = () => {
13
+ const { getPrefixCls: t } = n(o.ConfigContext);
14
+ return C(
15
+ (...s) => c(...s).map((r) => t(r)).join(" "),
16
+ [t]
17
17
  );
18
18
  };
19
- function f(s) {
20
- const t = [];
21
- let e = "";
22
- for (const o of s)
23
- o >= "A" && o <= "Z" ? (e && t.push(e), e = o.toLowerCase()) : e += o;
24
- return e && t.push(e), t.length > 0 ? t : [s];
25
- }
26
- const h = (s = "bottomLeft") => {
27
- const [t, e] = f(s);
28
- let o, r = "center";
29
- if (t === "top" || t === "bottom") {
30
- if (o = t, e)
31
- switch (e) {
32
- case "left":
33
- r = "start";
34
- break;
35
- case "right":
36
- r = "end";
37
- break;
38
- }
39
- } else if (t === "left" || t === "right") {
40
- if (o = t, e)
41
- switch (e) {
42
- case "top":
43
- r = "start";
44
- break;
45
- case "bottom":
46
- r = "end";
47
- break;
48
- }
49
- } else
50
- o = "bottom";
51
- return {
52
- placement: o,
53
- align: r
54
- };
55
- };
56
19
  export {
57
- h as parseAntdPlacement,
58
- g as useAntdCssVarClassname,
59
- k as useCls,
60
- b as useGetPrefixCls
20
+ a as useAntdCssVarClassname,
21
+ p as useCls,
22
+ x as useGetPrefixCls
61
23
  };
62
24
  //# sourceMappingURL=antdUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"antdUtils.js","sources":["../../../src/components/utils/antdUtils.ts"],"sourcesContent":["\"use client\";\nimport { default as ConfigProvider } from \"antd/es/config-provider\";\nimport useToken from \"antd/es/theme/useToken\";\nimport { useCallback, useContext } from \"react\";\nimport type { ClassValue } from \"./types\";\nimport { cx } from \"./cn\";\nimport { PopoverProps } from \"antd/es/popover\";\n\nexport const useGetPrefixCls = () => {\n const { getPrefixCls } = useContext(ConfigProvider.ConfigContext);\n return { getPrefixCls };\n};\n\n/**\n *\n * @returns the antd classname providing css variables\n */\nexport const useAntdCssVarClassname = () => {\n const token = useToken();\n return token[4]?.key;\n};\n\nexport const useCls = () => {\n const { getPrefixCls } = useContext(ConfigProvider.ConfigContext);\n const cls = useCallback(\n (...args: ClassValue[]) => {\n return cx(...args)\n .map((cls) => getPrefixCls(cls))\n .join(\" \");\n },\n [getPrefixCls]\n );\n return cls;\n};\n\nfunction splitCamelCase(text: string): string[] {\n const result: string[] = [];\n let currentWord = \"\";\n\n for (const char of text) {\n if (char >= \"A\" && char <= \"Z\") {\n if (currentWord) {\n result.push(currentWord);\n }\n currentWord = char.toLowerCase();\n } else {\n currentWord += char;\n }\n }\n\n if (currentWord) {\n result.push(currentWord);\n }\n\n return result.length > 0 ? result : [text];\n}\n\nexport const parseAntdPlacement = (\n placement: PopoverProps[\"placement\"] = \"bottomLeft\"\n): {\n placement: \"top\" | \"bottom\" | \"left\" | \"right\";\n align: \"start\" | \"end\" | \"center\";\n} => {\n const [position1, position2] = splitCamelCase(placement);\n\n // Determine primary placement\n let primaryPlacement: \"top\" | \"bottom\" | \"left\" | \"right\";\n let align: \"start\" | \"end\" | \"center\" = \"center\";\n\n // First check if it's a vertical or horizontal primary placement\n if (position1 === \"top\" || position1 === \"bottom\") {\n primaryPlacement = position1;\n if (position2) {\n switch (position2) {\n case \"left\":\n align = \"start\";\n break;\n case \"right\":\n align = \"end\";\n break;\n // \"top\" or \"bottom\" as second position is invalid, defaults to center\n }\n }\n } else if (position1 === \"left\" || position1 === \"right\") {\n primaryPlacement = position1;\n if (position2) {\n switch (position2) {\n case \"top\":\n align = \"start\";\n break;\n case \"bottom\":\n align = \"end\";\n break;\n // \"left\" or \"right\" as second position is invalid, defaults to center\n }\n }\n } else {\n // Fallback for invalid placement\n primaryPlacement = \"bottom\";\n }\n\n return {\n placement: primaryPlacement,\n align,\n };\n};\n"],"names":["useGetPrefixCls","getPrefixCls","useContext","ConfigProvider","useAntdCssVarClassname","_a","useToken","useCls","useCallback","args","cx","cls","splitCamelCase","text","result","currentWord","char","parseAntdPlacement","placement","position1","position2","primaryPlacement","align"],"mappings":";;;;;AAQO,MAAMA,IAAkB,MAAM;AACnC,QAAM,EAAE,cAAAC,EAAiB,IAAAC,EAAWC,EAAe,aAAa;AAChE,SAAO,EAAE,cAAAF,EAAa;AACxB,GAMaG,IAAyB,MAAM;;AAEnC,UAAAC,IADOC,EAAS,EACV,CAAC,MAAP,gBAAAD,EAAU;AACnB,GAEaE,IAAS,MAAM;AAC1B,QAAM,EAAE,cAAAN,EAAiB,IAAAC,EAAWC,EAAe,aAAa;AASzD,SARKK;AAAA,IACV,IAAIC,MACKC,EAAG,GAAGD,CAAI,EACd,IAAI,CAACE,MAAQV,EAAaU,CAAG,CAAC,EAC9B,KAAK,GAAG;AAAA,IAEb,CAACV,CAAY;AAAA,EACf;AAEF;AAEA,SAASW,EAAeC,GAAwB;AAC9C,QAAMC,IAAmB,CAAC;AAC1B,MAAIC,IAAc;AAElB,aAAWC,KAAQH;AACb,IAAAG,KAAQ,OAAOA,KAAQ,OACrBD,KACFD,EAAO,KAAKC,CAAW,GAEzBA,IAAcC,EAAK,YAAY,KAEhBD,KAAAC;AAInB,SAAID,KACFD,EAAO,KAAKC,CAAW,GAGlBD,EAAO,SAAS,IAAIA,IAAS,CAACD,CAAI;AAC3C;AAEa,MAAAI,IAAqB,CAChCC,IAAuC,iBAIpC;AACH,QAAM,CAACC,GAAWC,CAAS,IAAIR,EAAeM,CAAS;AAGnD,MAAAG,GACAC,IAAoC;AAGpC,MAAAH,MAAc,SAASA,MAAc;AAEvC,QADmBE,IAAAF,GACfC;AACF,cAAQA,GAAW;AAAA,QACjB,KAAK;AACK,UAAAE,IAAA;AACR;AAAA,QACF,KAAK;AACK,UAAAA,IAAA;AACR;AAAA,MAAA;AAAA,aAIGH,MAAc,UAAUA,MAAc;AAE/C,QADmBE,IAAAF,GACfC;AACF,cAAQA,GAAW;AAAA,QACjB,KAAK;AACK,UAAAE,IAAA;AACR;AAAA,QACF,KAAK;AACK,UAAAA,IAAA;AACR;AAAA,MAAA;AAAA;AAMa,IAAAD,IAAA;AAGd,SAAA;AAAA,IACL,WAAWA;AAAA,IACX,OAAAC;AAAA,EACF;AACF;"}
1
+ {"version":3,"file":"antdUtils.js","sources":["../../../src/components/utils/antdUtils.ts"],"sourcesContent":["\"use client\";\nimport { default as ConfigProvider } from \"antd/es/config-provider\";\nimport useToken from \"antd/es/theme/useToken\";\nimport { useCallback, useContext } from \"react\";\nimport type { ClassValue } from \"./types\";\nimport { cx } from \"./cn\";\nimport { PopoverProps } from \"antd/es/popover\";\n\nexport const useGetPrefixCls = () => {\n const { getPrefixCls } = useContext(ConfigProvider.ConfigContext);\n return { getPrefixCls };\n};\n\n/**\n *\n * @returns the antd classname providing css variables\n */\nexport const useAntdCssVarClassname = () => {\n const token = useToken();\n return token[4]?.key;\n};\n\nexport const useCls = () => {\n const { getPrefixCls } = useContext(ConfigProvider.ConfigContext);\n const cls = useCallback(\n (...args: ClassValue[]) => {\n return cx(...args)\n .map((cls) => getPrefixCls(cls))\n .join(\" \");\n },\n [getPrefixCls]\n );\n return cls;\n};\n\n// Placement utilities moved to ./placement.ts\n"],"names":["useGetPrefixCls","getPrefixCls","useContext","ConfigProvider","useAntdCssVarClassname","_a","useToken","useCls","useCallback","args","cx","cls"],"mappings":";;;;;AAQO,MAAMA,IAAkB,MAAM;AACnC,QAAM,EAAE,cAAAC,EAAiB,IAAAC,EAAWC,EAAe,aAAa;AAChE,SAAO,EAAE,cAAAF,EAAa;AACxB,GAMaG,IAAyB,MAAM;;AAEnC,UAAAC,IADOC,EAAS,EACV,CAAC,MAAP,gBAAAD,EAAU;AACnB,GAEaE,IAAS,MAAM;AAC1B,QAAM,EAAE,cAAAN,EAAiB,IAAAC,EAAWC,EAAe,aAAa;AASzD,SARKK;AAAA,IACV,IAAIC,MACKC,EAAG,GAAGD,CAAI,EACd,IAAI,CAACE,MAAQV,EAAaU,CAAG,CAAC,EAC9B,KAAK,GAAG;AAAA,IAEb,CAACV,CAAY;AAAA,EACf;AAEF;"}
@@ -0,0 +1,58 @@
1
+ function i(r) {
2
+ const e = [];
3
+ let o = "";
4
+ for (let t = 0; t < r.length; t++) {
5
+ const n = r[t];
6
+ n >= "A" && n <= "Z" && o.length > 0 ? (e.push(o), o = n) : o += n;
7
+ }
8
+ return o && e.push(o), e.length > 0 ? e : [r];
9
+ }
10
+ function a(r = "bottomLeft") {
11
+ const [e, o] = i(r);
12
+ let t, n = "center";
13
+ if (["top", "bottom", "left", "right"].includes(e.toLowerCase())) {
14
+ if (t = e.toLowerCase(), o) {
15
+ const s = o.toLowerCase();
16
+ t === "top" || t === "bottom" ? s === "left" ? n = "start" : s === "right" && (n = "end") : s === "top" ? n = "start" : s === "bottom" && (n = "end");
17
+ }
18
+ } else
19
+ t = "bottom";
20
+ return {
21
+ side: t,
22
+ align: n
23
+ };
24
+ }
25
+ function l(r) {
26
+ const { side: e = "bottom", align: o = "center" } = r;
27
+ if (o === "center")
28
+ return e;
29
+ let t;
30
+ if (e === "top" || e === "bottom")
31
+ switch (o) {
32
+ case "start":
33
+ t = "Left";
34
+ break;
35
+ case "end":
36
+ t = "Right";
37
+ break;
38
+ default:
39
+ return e;
40
+ }
41
+ else
42
+ switch (o) {
43
+ case "start":
44
+ t = "Top";
45
+ break;
46
+ case "end":
47
+ t = "Bottom";
48
+ break;
49
+ default:
50
+ return e;
51
+ }
52
+ return `${e}${t}`;
53
+ }
54
+ export {
55
+ l as buildAntdPlacement,
56
+ a as parseAntdPlacement
57
+ };
58
+ //# sourceMappingURL=placement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"placement.js","sources":["../../../src/components/utils/placement.ts"],"sourcesContent":["import type { PopoverProps } from \"antd/es/popover\";\n\n// Base UI placement types\nexport type BaseUISide = \"top\" | \"bottom\" | \"left\" | \"right\";\nexport type BaseUIAlign = \"start\" | \"end\" | \"center\";\n\n// Antd placement type (re-export for convenience)\nexport type AntdPlacement = PopoverProps[\"placement\"];\n\n// Base UI placement interface - used for both parsing and building\nexport interface BaseUIPlacement {\n side: BaseUISide;\n align: BaseUIAlign;\n}\n\n/**\n * Utility to split camelCase strings into parts\n * e.g., \"bottomLeft\" -> [\"bottom\", \"Left\"]\n */\nfunction splitCamelCase(text: string): string[] {\n const result: string[] = [];\n let currentWord = \"\";\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n\n if (char >= \"A\" && char <= \"Z\" && currentWord.length > 0) {\n result.push(currentWord);\n currentWord = char;\n } else {\n currentWord += char;\n }\n }\n\n if (currentWord) {\n result.push(currentWord);\n }\n\n return result.length > 0 ? result : [text];\n}\n\n/**\n * Parse Antd placement string into BaseUI side and align values\n * @param placement - Antd placement string (e.g., \"bottomLeft\", \"top\", \"rightTop\")\n * @returns Object with side and align properties for BaseUI components\n */\nexport function parseAntdPlacement(\n placement: AntdPlacement = \"bottomLeft\"\n): BaseUIPlacement {\n const [position1, position2] = splitCamelCase(placement);\n\n // Determine primary placement\n let side: BaseUISide;\n let align: BaseUIAlign = \"center\";\n\n // Check if first position is a side\n if ([\"top\", \"bottom\", \"left\", \"right\"].includes(position1.toLowerCase())) {\n side = position1.toLowerCase() as BaseUISide;\n\n // Determine alignment based on side and secondary position\n if (position2) {\n const secondaryLower = position2.toLowerCase();\n \n if (side === \"top\" || side === \"bottom\") {\n // For vertical sides, Left/Right become start/end\n if (secondaryLower === \"left\") align = \"start\";\n else if (secondaryLower === \"right\") align = \"end\";\n } else {\n // For horizontal sides, Top/Bottom become start/end\n if (secondaryLower === \"top\") align = \"start\";\n else if (secondaryLower === \"bottom\") align = \"end\";\n }\n }\n } else {\n // Fallback for invalid placement\n side = \"bottom\";\n }\n\n return {\n side,\n align,\n };\n}\n\n/**\n * Build Antd placement string from BaseUI side and align values\n * @param placement - Object with side and align properties\n * @returns Antd placement string\n */\nexport function buildAntdPlacement(placement: BaseUIPlacement): AntdPlacement {\n const { side = \"bottom\", align = \"center\" } = placement;\n \n if (align === \"center\") {\n return side;\n }\n\n let alignmentPart: string;\n\n // For vertical sides (top/bottom), alignment is horizontal\n if (side === \"top\" || side === \"bottom\") {\n switch (align) {\n case \"start\":\n alignmentPart = \"Left\";\n break;\n case \"end\":\n alignmentPart = \"Right\";\n break;\n default:\n return side;\n }\n }\n // For horizontal sides (left/right), alignment is vertical\n else {\n switch (align) {\n case \"start\":\n alignmentPart = \"Top\";\n break;\n case \"end\":\n alignmentPart = \"Bottom\";\n break;\n default:\n return side;\n }\n }\n\n return `${side}${alignmentPart}` as AntdPlacement;\n}"],"names":["splitCamelCase","text","result","currentWord","i","char","parseAntdPlacement","placement","position1","position2","side","align","secondaryLower","buildAntdPlacement","alignmentPart"],"mappings":"AAmBA,SAASA,EAAeC,GAAwB;AAC9C,QAAMC,IAAmB,CAAC;AAC1B,MAAIC,IAAc;AAElB,WAASC,IAAI,GAAGA,IAAIH,EAAK,QAAQG,KAAK;AAC9B,UAAAC,IAAOJ,EAAKG,CAAC;AAEnB,IAAIC,KAAQ,OAAOA,KAAQ,OAAOF,EAAY,SAAS,KACrDD,EAAO,KAAKC,CAAW,GACTA,IAAAE,KAECF,KAAAE;AAAA,EACjB;AAGF,SAAIF,KACFD,EAAO,KAAKC,CAAW,GAGlBD,EAAO,SAAS,IAAIA,IAAS,CAACD,CAAI;AAC3C;AAOgB,SAAAK,EACdC,IAA2B,cACV;AACjB,QAAM,CAACC,GAAWC,CAAS,IAAIT,EAAeO,CAAS;AAGnD,MAAAG,GACAC,IAAqB;AAGrB,MAAA,CAAC,OAAO,UAAU,QAAQ,OAAO,EAAE,SAASH,EAAU,YAAY,CAAC;AAIrE,QAHAE,IAAOF,EAAU,YAAY,GAGzBC,GAAW;AACP,YAAAG,IAAiBH,EAAU,YAAY;AAEzC,MAAAC,MAAS,SAASA,MAAS,WAEzBE,MAAmB,SAAgBD,IAAA,UAC9BC,MAAmB,YAAiBD,IAAA,SAGzCC,MAAmB,QAAeD,IAAA,UAC7BC,MAAmB,aAAkBD,IAAA;AAAA,IAChD;AAAA;AAIK,IAAAD,IAAA;AAGF,SAAA;AAAA,IACL,MAAAA;AAAA,IACA,OAAAC;AAAA,EACF;AACF;AAOO,SAASE,EAAmBN,GAA2C;AAC5E,QAAM,EAAE,MAAAG,IAAO,UAAU,OAAAC,IAAQ,SAAa,IAAAJ;AAE9C,MAAII,MAAU;AACL,WAAAD;AAGL,MAAAI;AAGA,MAAAJ,MAAS,SAASA,MAAS;AAC7B,YAAQC,GAAO;AAAA,MACb,KAAK;AACa,QAAAG,IAAA;AAChB;AAAA,MACF,KAAK;AACa,QAAAA,IAAA;AAChB;AAAA,MACF;AACS,eAAAJ;AAAA,IAAA;AAAA;AAKX,YAAQC,GAAO;AAAA,MACb,KAAK;AACa,QAAAG,IAAA;AAChB;AAAA,MACF,KAAK;AACa,QAAAA,IAAA;AAChB;AAAA,MACF;AACS,eAAAJ;AAAA,IAAA;AAIN,SAAA,GAAGA,CAAI,GAAGI,CAAa;AAChC;"}
@@ -0,0 +1,5 @@
1
+ const r = (o, p, t) => o.props && typeof o.props == "object" && p in o.props && o.props[p] !== void 0 ? o.props[p] : t;
2
+ export {
3
+ r as getReactElementProp
4
+ };
5
+ //# sourceMappingURL=reactElement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reactElement.js","sources":["../../../src/components/utils/reactElement.ts"],"sourcesContent":["export const getReactElementProp = <T>(\n el: React.ReactElement,\n propKey: string,\n defaultValue?: T\n) => {\n return el.props &&\n typeof el.props === \"object\" &&\n propKey in el.props &&\n el.props[propKey] !== undefined\n ? (el.props[propKey] as T)\n : defaultValue;\n};\n"],"names":["getReactElementProp","el","propKey","defaultValue"],"mappings":"AAAO,MAAMA,IAAsB,CACjCC,GACAC,GACAC,MAEOF,EAAG,SACR,OAAOA,EAAG,SAAU,YACpBC,KAAWD,EAAG,SACdA,EAAG,MAAMC,CAAO,MAAM,SACnBD,EAAG,MAAMC,CAAO,IACjBC;"}