@gcsa/console-react 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/GcsaCascader.js +19 -18
- package/dist/GcsaCascader.js.map +1 -1
- package/dist/GcsaPopover.d.ts +3 -1
- package/dist/GcsaPopover.js +30 -29
- package/dist/GcsaPopover.js.map +1 -1
- package/dist/GcsaTransfer.js +72 -57
- package/dist/GcsaTransfer.js.map +1 -1
- package/dist/GcsaUpload.js +1 -1
- package/dist/GcsaUpload.js.map +1 -1
- package/dist/icons/iconNames.d.ts +2 -2
- package/dist/icons/iconNames.js +1 -0
- package/dist/icons/iconNames.js.map +1 -1
- package/dist/icons/registry.d.ts +1 -1
- package/dist/icons/registry.js +38 -35
- package/dist/icons/registry.js.map +1 -1
- package/dist/icons/svg/result-empty.svg.js +12 -2
- package/dist/icons/svg/result-empty.svg.js.map +1 -1
- package/dist/icons/svg/upload.svg.js +10 -0
- package/dist/icons/svg/upload.svg.js.map +1 -0
- package/dist/icons/svg/users.svg.js.map +1 -1
- package/dist/style.css +264 -145
- package/package.json +3 -3
- package/src/GcsaCascader.tsx +1 -0
- package/src/GcsaPopover.tsx +4 -1
- package/src/GcsaTransfer.tsx +41 -13
- package/src/GcsaUpload.tsx +1 -1
- package/src/icons/iconNames.ts +1 -0
- package/src/icons/registry.ts +3 -1
- package/src/icons/svg/result-empty.svg +11 -1
- package/src/icons/svg/upload.svg +5 -0
package/dist/GcsaCascader.js
CHANGED
|
@@ -5,44 +5,44 @@ import { GcsaPopover as z } from "./GcsaPopover.js";
|
|
|
5
5
|
import { useGcsaLocaleMessages as D } from "./hooks/useGcsaLocale.js";
|
|
6
6
|
function I({
|
|
7
7
|
value: t = [],
|
|
8
|
-
options:
|
|
9
|
-
placeholder:
|
|
10
|
-
disabled:
|
|
8
|
+
options: i,
|
|
9
|
+
placeholder: p,
|
|
10
|
+
disabled: b = !1,
|
|
11
11
|
invalid: N = !1,
|
|
12
12
|
changeOnSelect: y = !1,
|
|
13
13
|
portalled: k = !0,
|
|
14
|
-
onValueChange:
|
|
14
|
+
onValueChange: d,
|
|
15
15
|
onChange: o,
|
|
16
16
|
className: m
|
|
17
17
|
}) {
|
|
18
|
-
const u = D(),
|
|
18
|
+
const u = D(), w = p ?? u.selectPlaceholder, [n, f] = j(t);
|
|
19
19
|
$(() => {
|
|
20
20
|
f(t);
|
|
21
21
|
}, [t]);
|
|
22
|
-
const
|
|
22
|
+
const P = _(() => {
|
|
23
23
|
var e;
|
|
24
|
-
const c = [
|
|
25
|
-
let s =
|
|
26
|
-
for (const a of
|
|
24
|
+
const c = [i];
|
|
25
|
+
let s = i;
|
|
26
|
+
for (const a of n) {
|
|
27
27
|
const l = s.find((G) => G.value === a);
|
|
28
28
|
if (!((e = l == null ? void 0 : l.children) != null && e.length)) break;
|
|
29
29
|
c.push(l.children), s = l.children;
|
|
30
30
|
}
|
|
31
31
|
return c;
|
|
32
|
-
}, [
|
|
32
|
+
}, [n, i]), h = _(() => {
|
|
33
33
|
const c = [];
|
|
34
|
-
let s =
|
|
34
|
+
let s = i;
|
|
35
35
|
for (const e of t) {
|
|
36
36
|
const a = s.find((l) => l.value === e);
|
|
37
37
|
if (!a) break;
|
|
38
38
|
c.push(a.label), s = a.children ?? [];
|
|
39
39
|
}
|
|
40
40
|
return c.join(" / ");
|
|
41
|
-
}, [
|
|
41
|
+
}, [i, t]), x = (c, s) => {
|
|
42
42
|
var a;
|
|
43
43
|
if (c.disabled) return;
|
|
44
|
-
const e = [...
|
|
45
|
-
f(e), (!((a = c.children) != null && a.length) || y) && (
|
|
44
|
+
const e = [...n.slice(0, s), c.value];
|
|
45
|
+
f(e), (!((a = c.children) != null && a.length) || y) && (d == null || d(e), o == null || o(e));
|
|
46
46
|
};
|
|
47
47
|
return /* @__PURE__ */ r(
|
|
48
48
|
z,
|
|
@@ -50,27 +50,28 @@ function I({
|
|
|
50
50
|
arrow: !1,
|
|
51
51
|
portalled: k,
|
|
52
52
|
gutter: 6,
|
|
53
|
+
fitViewport: !0,
|
|
53
54
|
className: "gcsa-cascader-popover",
|
|
54
55
|
trigger: /* @__PURE__ */ g(
|
|
55
56
|
"button",
|
|
56
57
|
{
|
|
57
58
|
type: "button",
|
|
58
59
|
className: `gcsa-cascader__trigger gcsa-focus-ring${m ? ` ${m}` : ""}`,
|
|
59
|
-
disabled:
|
|
60
|
+
disabled: b,
|
|
60
61
|
"data-invalid": N || void 0,
|
|
61
62
|
children: [
|
|
62
|
-
/* @__PURE__ */ r("span", { className: "gcsa-cascader__value", "data-placeholder": !h || void 0, children: h ||
|
|
63
|
+
/* @__PURE__ */ r("span", { className: "gcsa-cascader__value", "data-placeholder": !h || void 0, children: h || w }),
|
|
63
64
|
/* @__PURE__ */ r(v, { name: "chevronDown", size: "sm", "aria-hidden": "true" })
|
|
64
65
|
]
|
|
65
66
|
}
|
|
66
67
|
),
|
|
67
|
-
children: /* @__PURE__ */ r("div", { className: "gcsa-cascader__panel", children:
|
|
68
|
+
children: /* @__PURE__ */ r("div", { className: "gcsa-cascader__panel", children: P.map((c, s) => /* @__PURE__ */ r("div", { className: "gcsa-cascader__column", role: "menu", children: c.length ? c.map((e) => {
|
|
68
69
|
var a;
|
|
69
70
|
return /* @__PURE__ */ g(
|
|
70
71
|
"button",
|
|
71
72
|
{
|
|
72
73
|
type: "button",
|
|
73
|
-
className: `gcsa-cascader__option gcsa-focus-ring${
|
|
74
|
+
className: `gcsa-cascader__option gcsa-focus-ring${n[s] === e.value ? " gcsa-cascader__option--active" : ""}`,
|
|
74
75
|
disabled: e.disabled,
|
|
75
76
|
role: "menuitem",
|
|
76
77
|
onClick: () => x(e, s),
|
package/dist/GcsaCascader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GcsaCascader.js","sources":["../src/GcsaCascader.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\nimport type { GcsaCascaderOption } from '@gcsa/console-core';\nimport { GcsaIcon } from './GcsaIcon';\nimport { GcsaPopover } from './GcsaPopover';\nimport { useGcsaLocaleMessages } from './hooks/useGcsaLocale';\n\nexport type GcsaCascaderProps = {\n value?: string[];\n options: GcsaCascaderOption[];\n placeholder?: string;\n disabled?: boolean;\n invalid?: boolean;\n changeOnSelect?: boolean;\n portalled?: boolean;\n onValueChange?: (value: string[]) => void;\n onChange?: (value: string[]) => void;\n className?: string;\n};\n\nexport function GcsaCascader({\n value = [],\n options,\n placeholder,\n disabled = false,\n invalid = false,\n changeOnSelect = false,\n portalled = true,\n onValueChange,\n onChange,\n className\n}: GcsaCascaderProps) {\n const messages = useGcsaLocaleMessages();\n const resolvedPlaceholder = placeholder ?? messages.selectPlaceholder;\n const [activePath, setActivePath] = useState(value);\n\n useEffect(() => {\n setActivePath(value);\n }, [value]);\n\n const columns = useMemo(() => {\n const result: GcsaCascaderOption[][] = [options];\n let current = options;\n for (const key of activePath) {\n const selected = current.find(option => option.value === key);\n if (!selected?.children?.length) break;\n result.push(selected.children);\n current = selected.children;\n }\n return result;\n }, [activePath, options]);\n\n const displayLabel = useMemo(() => {\n const labels: string[] = [];\n let current = options;\n for (const key of value) {\n const selected = current.find(option => option.value === key);\n if (!selected) break;\n labels.push(selected.label);\n current = selected.children ?? [];\n }\n return labels.join(' / ');\n }, [options, value]);\n\n const selectOption = (option: GcsaCascaderOption, depth: number) => {\n if (option.disabled) return;\n const next = [...activePath.slice(0, depth), option.value];\n setActivePath(next);\n if (!option.children?.length || changeOnSelect) {\n onValueChange?.(next);\n onChange?.(next);\n }\n };\n\n return (\n <GcsaPopover\n arrow={false}\n portalled={portalled}\n gutter={6}\n className=\"gcsa-cascader-popover\"\n trigger={\n <button\n type=\"button\"\n className={`gcsa-cascader__trigger gcsa-focus-ring${className ? ` ${className}` : ''}`}\n disabled={disabled}\n data-invalid={invalid || undefined}\n >\n <span className=\"gcsa-cascader__value\" data-placeholder={!displayLabel || undefined}>\n {displayLabel || resolvedPlaceholder}\n </span>\n <GcsaIcon name=\"chevronDown\" size=\"sm\" aria-hidden=\"true\" />\n </button>\n }\n >\n <div className=\"gcsa-cascader__panel\">\n {columns.map((column, depth) => (\n <div key={depth} className=\"gcsa-cascader__column\" role=\"menu\">\n {column.length ? (\n column.map(option => (\n <button\n key={option.value}\n type=\"button\"\n className={`gcsa-cascader__option gcsa-focus-ring${activePath[depth] === option.value ? ' gcsa-cascader__option--active' : ''}`}\n disabled={option.disabled}\n role=\"menuitem\"\n onClick={() => selectOption(option, depth)}\n >\n <span>{option.label}</span>\n {option.children?.length ? (\n <GcsaIcon name=\"chevronDown\" size=\"sm\" className=\"gcsa-cascader__arrow\" />\n ) : null}\n </button>\n ))\n ) : (\n <span className=\"gcsa-cascader__empty\">{messages.noOptions}</span>\n )}\n </div>\n ))}\n </div>\n </GcsaPopover>\n );\n}\n"],"names":["GcsaCascader","value","options","placeholder","disabled","invalid","changeOnSelect","portalled","onValueChange","onChange","className","messages","useGcsaLocaleMessages","resolvedPlaceholder","activePath","setActivePath","useState","useEffect","columns","useMemo","result","current","key","selected","option","_a","displayLabel","labels","selectOption","depth","next","jsx","GcsaPopover","jsxs","GcsaIcon","column"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"GcsaCascader.js","sources":["../src/GcsaCascader.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\nimport type { GcsaCascaderOption } from '@gcsa/console-core';\nimport { GcsaIcon } from './GcsaIcon';\nimport { GcsaPopover } from './GcsaPopover';\nimport { useGcsaLocaleMessages } from './hooks/useGcsaLocale';\n\nexport type GcsaCascaderProps = {\n value?: string[];\n options: GcsaCascaderOption[];\n placeholder?: string;\n disabled?: boolean;\n invalid?: boolean;\n changeOnSelect?: boolean;\n portalled?: boolean;\n onValueChange?: (value: string[]) => void;\n onChange?: (value: string[]) => void;\n className?: string;\n};\n\nexport function GcsaCascader({\n value = [],\n options,\n placeholder,\n disabled = false,\n invalid = false,\n changeOnSelect = false,\n portalled = true,\n onValueChange,\n onChange,\n className\n}: GcsaCascaderProps) {\n const messages = useGcsaLocaleMessages();\n const resolvedPlaceholder = placeholder ?? messages.selectPlaceholder;\n const [activePath, setActivePath] = useState(value);\n\n useEffect(() => {\n setActivePath(value);\n }, [value]);\n\n const columns = useMemo(() => {\n const result: GcsaCascaderOption[][] = [options];\n let current = options;\n for (const key of activePath) {\n const selected = current.find(option => option.value === key);\n if (!selected?.children?.length) break;\n result.push(selected.children);\n current = selected.children;\n }\n return result;\n }, [activePath, options]);\n\n const displayLabel = useMemo(() => {\n const labels: string[] = [];\n let current = options;\n for (const key of value) {\n const selected = current.find(option => option.value === key);\n if (!selected) break;\n labels.push(selected.label);\n current = selected.children ?? [];\n }\n return labels.join(' / ');\n }, [options, value]);\n\n const selectOption = (option: GcsaCascaderOption, depth: number) => {\n if (option.disabled) return;\n const next = [...activePath.slice(0, depth), option.value];\n setActivePath(next);\n if (!option.children?.length || changeOnSelect) {\n onValueChange?.(next);\n onChange?.(next);\n }\n };\n\n return (\n <GcsaPopover\n arrow={false}\n portalled={portalled}\n gutter={6}\n fitViewport\n className=\"gcsa-cascader-popover\"\n trigger={\n <button\n type=\"button\"\n className={`gcsa-cascader__trigger gcsa-focus-ring${className ? ` ${className}` : ''}`}\n disabled={disabled}\n data-invalid={invalid || undefined}\n >\n <span className=\"gcsa-cascader__value\" data-placeholder={!displayLabel || undefined}>\n {displayLabel || resolvedPlaceholder}\n </span>\n <GcsaIcon name=\"chevronDown\" size=\"sm\" aria-hidden=\"true\" />\n </button>\n }\n >\n <div className=\"gcsa-cascader__panel\">\n {columns.map((column, depth) => (\n <div key={depth} className=\"gcsa-cascader__column\" role=\"menu\">\n {column.length ? (\n column.map(option => (\n <button\n key={option.value}\n type=\"button\"\n className={`gcsa-cascader__option gcsa-focus-ring${activePath[depth] === option.value ? ' gcsa-cascader__option--active' : ''}`}\n disabled={option.disabled}\n role=\"menuitem\"\n onClick={() => selectOption(option, depth)}\n >\n <span>{option.label}</span>\n {option.children?.length ? (\n <GcsaIcon name=\"chevronDown\" size=\"sm\" className=\"gcsa-cascader__arrow\" />\n ) : null}\n </button>\n ))\n ) : (\n <span className=\"gcsa-cascader__empty\">{messages.noOptions}</span>\n )}\n </div>\n ))}\n </div>\n </GcsaPopover>\n );\n}\n"],"names":["GcsaCascader","value","options","placeholder","disabled","invalid","changeOnSelect","portalled","onValueChange","onChange","className","messages","useGcsaLocaleMessages","resolvedPlaceholder","activePath","setActivePath","useState","useEffect","columns","useMemo","result","current","key","selected","option","_a","displayLabel","labels","selectOption","depth","next","jsx","GcsaPopover","jsxs","GcsaIcon","column"],"mappings":"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"}
|
package/dist/GcsaPopover.d.ts
CHANGED
|
@@ -13,6 +13,8 @@ export type GcsaPopoverProps = {
|
|
|
13
13
|
/** 受控开关;不传则为非受控 */
|
|
14
14
|
open?: boolean;
|
|
15
15
|
onOpenChange?: (open: boolean) => void;
|
|
16
|
+
/** 启用 size middleware,写入 --reference-width */
|
|
17
|
+
fitViewport?: boolean;
|
|
16
18
|
/** 预设尺寸;与 minWidth / maxWidth / width 可同时使用,inline 优先生效 */
|
|
17
19
|
size?: GcsaPopoverSize;
|
|
18
20
|
/** 面板宽度,如 560 或 '560px' */
|
|
@@ -27,4 +29,4 @@ export type GcsaPopoverProps = {
|
|
|
27
29
|
trigger?: ReactNode;
|
|
28
30
|
children?: ReactNode;
|
|
29
31
|
};
|
|
30
|
-
export declare function GcsaPopover({ title, triggerLabel, placement, arrow, portalled, gutter, open, onOpenChange, size, width, minWidth, maxWidth, contentClassName, className, footer, trigger, children }: GcsaPopoverProps): import("react").JSX.Element;
|
|
32
|
+
export declare function GcsaPopover({ title, triggerLabel, placement, arrow, portalled, gutter, open, onOpenChange, fitViewport, size, width, minWidth, maxWidth, contentClassName, className, footer, trigger, children }: GcsaPopoverProps): import("react").JSX.Element;
|
package/dist/GcsaPopover.js
CHANGED
|
@@ -1,57 +1,58 @@
|
|
|
1
1
|
import { jsx as e, jsxs as f } from "react/jsx-runtime";
|
|
2
|
-
import { useState as
|
|
2
|
+
import { useState as E, useMemo as R } from "react";
|
|
3
3
|
import { Popover as s } from "@ark-ui/react/popover";
|
|
4
|
-
import { Portal as
|
|
5
|
-
import { toCssLength as i, createGcsaPopupPositioning as
|
|
6
|
-
import { GcsaButton as
|
|
7
|
-
import { useGcsaLocaleMessages as
|
|
8
|
-
import { useGcsaPopupZIndex as
|
|
9
|
-
function
|
|
4
|
+
import { Portal as Z } from "@ark-ui/react/portal";
|
|
5
|
+
import { toCssLength as i, createGcsaPopupPositioning as q } from "@gcsa/console-core";
|
|
6
|
+
import { GcsaButton as D } from "./GcsaButton.js";
|
|
7
|
+
import { useGcsaLocaleMessages as F } from "./hooks/useGcsaLocale.js";
|
|
8
|
+
import { useGcsaPopupZIndex as H } from "./hooks/useGcsaPopupZIndex.js";
|
|
9
|
+
function oo({
|
|
10
10
|
title: l,
|
|
11
11
|
triggerLabel: h,
|
|
12
12
|
placement: _ = "bottom",
|
|
13
13
|
arrow: y = !0,
|
|
14
14
|
portalled: N = !0,
|
|
15
15
|
gutter: P = 8,
|
|
16
|
-
open:
|
|
16
|
+
open: a,
|
|
17
17
|
onOpenChange: t,
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
fitViewport: x = !1,
|
|
19
|
+
size: b = "default",
|
|
20
|
+
width: c,
|
|
20
21
|
minWidth: p,
|
|
21
22
|
maxWidth: d,
|
|
22
|
-
contentClassName:
|
|
23
|
-
className:
|
|
23
|
+
contentClassName: w,
|
|
24
|
+
className: C,
|
|
24
25
|
footer: n,
|
|
25
|
-
trigger:
|
|
26
|
-
children:
|
|
26
|
+
trigger: G,
|
|
27
|
+
children: M
|
|
27
28
|
}) {
|
|
28
|
-
const
|
|
29
|
+
const j = F(), { zIndex: r, onOpenChange: I } = H(), T = h ?? j.open, m = a !== void 0, [z, L] = E(!1), O = m ? a : z, S = G ?? /* @__PURE__ */ e(D, { variant: "secondary", children: T }), W = r == null ? void 0 : { zIndex: r }, A = R(() => {
|
|
29
30
|
const o = {};
|
|
30
31
|
r != null && (o.zIndex = r);
|
|
31
|
-
const u = i(
|
|
32
|
+
const u = i(c), g = i(p), v = i(d);
|
|
32
33
|
return u && (o.width = u), g && (o.minWidth = g), v && (o.maxWidth = v), Object.keys(o).length ? o : void 0;
|
|
33
|
-
}, [r,
|
|
34
|
+
}, [r, c, p, d]), B = [
|
|
34
35
|
"gcsa-popover",
|
|
35
36
|
"gcsa-ui-surface",
|
|
36
|
-
|
|
37
|
+
b === "lg" ? "gcsa-popover--lg" : void 0,
|
|
37
38
|
n ? "gcsa-popover--with-footer" : void 0,
|
|
38
|
-
|
|
39
|
-
].filter(Boolean).join(" "),
|
|
40
|
-
m ||
|
|
39
|
+
w
|
|
40
|
+
].filter(Boolean).join(" "), k = (o) => {
|
|
41
|
+
m || L(o), t == null || t(o), I(o);
|
|
41
42
|
};
|
|
42
|
-
return /* @__PURE__ */ e("span", { className:
|
|
43
|
+
return /* @__PURE__ */ e("span", { className: C, children: /* @__PURE__ */ f(
|
|
43
44
|
s.Root,
|
|
44
45
|
{
|
|
45
|
-
open:
|
|
46
|
+
open: O,
|
|
46
47
|
lazyMount: !0,
|
|
47
48
|
unmountOnExit: !0,
|
|
48
|
-
positioning:
|
|
49
|
-
onOpenChange: (o) =>
|
|
49
|
+
positioning: q({ placement: _, gutter: P, fitViewport: x }),
|
|
50
|
+
onOpenChange: (o) => k(o.open),
|
|
50
51
|
children: [
|
|
51
|
-
/* @__PURE__ */ e(s.Trigger, { asChild: !0, children:
|
|
52
|
-
/* @__PURE__ */ e(
|
|
52
|
+
/* @__PURE__ */ e(s.Trigger, { asChild: !0, children: S }),
|
|
53
|
+
/* @__PURE__ */ e(Z, { disabled: !N, children: /* @__PURE__ */ e(s.Positioner, { style: W, children: /* @__PURE__ */ f(s.Content, { className: B, style: A, children: [
|
|
53
54
|
l ? /* @__PURE__ */ e(s.Title, { className: "gcsa-popover__title", children: l }) : null,
|
|
54
|
-
/* @__PURE__ */ e("div", { className: "gcsa-popover__body", children:
|
|
55
|
+
/* @__PURE__ */ e("div", { className: "gcsa-popover__body", children: M }),
|
|
55
56
|
n ? /* @__PURE__ */ e("div", { className: "gcsa-popover__footer", children: n }) : null,
|
|
56
57
|
y ? /* @__PURE__ */ e(s.Arrow, { className: "gcsa-popover__arrow", children: /* @__PURE__ */ e(s.ArrowTip, { className: "gcsa-popover__arrow-tip" }) }) : null
|
|
57
58
|
] }) }) })
|
|
@@ -60,6 +61,6 @@ function $({
|
|
|
60
61
|
) });
|
|
61
62
|
}
|
|
62
63
|
export {
|
|
63
|
-
|
|
64
|
+
oo as GcsaPopover
|
|
64
65
|
};
|
|
65
66
|
//# sourceMappingURL=GcsaPopover.js.map
|
package/dist/GcsaPopover.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GcsaPopover.js","sources":["../src/GcsaPopover.tsx"],"sourcesContent":["import { useMemo, useState, type CSSProperties, type ReactNode } from 'react';\nimport { Popover } from '@ark-ui/react/popover';\nimport { Portal } from '@ark-ui/react/portal';\nimport { createGcsaPopupPositioning, toCssLength } from '@gcsa/console-core';\nimport { GcsaButton } from './GcsaButton';\nimport { useGcsaLocaleMessages } from './hooks/useGcsaLocale';\nimport { useGcsaPopupZIndex } from './hooks/useGcsaPopupZIndex';\nimport type { GcsaTooltipPlacement } from './GcsaTooltip';\n\nexport type GcsaPopoverPlacement = GcsaTooltipPlacement;\n\n/** default=320px 上限;lg=表单类 Popover(560–680px,内容区可滚动) */\nexport type GcsaPopoverSize = 'default' | 'lg';\n\nexport type GcsaPopoverProps = {\n title?: string;\n triggerLabel?: string;\n placement?: GcsaPopoverPlacement;\n arrow?: boolean;\n portalled?: boolean;\n gutter?: number;\n /** 受控开关;不传则为非受控 */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** 预设尺寸;与 minWidth / maxWidth / width 可同时使用,inline 优先生效 */\n size?: GcsaPopoverSize;\n /** 面板宽度,如 560 或 '560px' */\n width?: string | number;\n minWidth?: string | number;\n maxWidth?: string | number;\n /** 追加到 Popover.Content 的 class */\n contentClassName?: string;\n className?: string;\n /** 固定在面板底部、不参与 body 滚动的操作区 */\n footer?: ReactNode;\n trigger?: ReactNode;\n children?: ReactNode;\n};\n\nexport function GcsaPopover({\n title,\n triggerLabel,\n placement = 'bottom',\n arrow = true,\n portalled = true,\n gutter = 8,\n open,\n onOpenChange,\n size = 'default',\n width,\n minWidth,\n maxWidth,\n contentClassName,\n className,\n footer,\n trigger,\n children\n}: GcsaPopoverProps) {\n const messages = useGcsaLocaleMessages();\n const { zIndex, onOpenChange: onPopupOpenChange } = useGcsaPopupZIndex();\n const resolvedTriggerLabel = triggerLabel ?? messages.open;\n const isControlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState(false);\n const resolvedOpen = isControlled ? open : internalOpen;\n\n const triggerNode = trigger ?? (\n <GcsaButton variant=\"secondary\">\n {resolvedTriggerLabel}\n </GcsaButton>\n );\n\n const positionerStyle = (zIndex == null ? undefined : { zIndex }) as CSSProperties | undefined;\n\n const contentStyle = useMemo(() => {\n const style: CSSProperties = {};\n if (zIndex != null) style.zIndex = zIndex;\n const resolvedWidth = toCssLength(width);\n const resolvedMinWidth = toCssLength(minWidth);\n const resolvedMaxWidth = toCssLength(maxWidth);\n if (resolvedWidth) style.width = resolvedWidth;\n if (resolvedMinWidth) style.minWidth = resolvedMinWidth;\n if (resolvedMaxWidth) style.maxWidth = resolvedMaxWidth;\n return Object.keys(style).length ? style : undefined;\n }, [zIndex, width, minWidth, maxWidth]);\n\n const contentClassNames = [\n 'gcsa-popover',\n 'gcsa-ui-surface',\n size === 'lg' ? 'gcsa-popover--lg' : undefined,\n footer ? 'gcsa-popover--with-footer' : undefined,\n contentClassName\n ]\n .filter(Boolean)\n .join(' ');\n\n const handleOpenChange = (nextOpen: boolean) => {\n if (!isControlled) {\n setInternalOpen(nextOpen);\n }\n onOpenChange?.(nextOpen);\n onPopupOpenChange(nextOpen);\n };\n\n return (\n <span className={className}>\n <Popover.Root\n open={resolvedOpen}\n lazyMount\n unmountOnExit\n positioning={createGcsaPopupPositioning({ placement, gutter })}\n onOpenChange={details => handleOpenChange(details.open)}\n >\n <Popover.Trigger asChild>{triggerNode}</Popover.Trigger>\n <Portal disabled={!portalled}>\n <Popover.Positioner style={positionerStyle}>\n <Popover.Content className={contentClassNames} style={contentStyle}>\n {title ? <Popover.Title className=\"gcsa-popover__title\">{title}</Popover.Title> : null}\n <div className=\"gcsa-popover__body\">{children}</div>\n {footer ? <div className=\"gcsa-popover__footer\">{footer}</div> : null}\n {arrow ? (\n <Popover.Arrow className=\"gcsa-popover__arrow\">\n <Popover.ArrowTip className=\"gcsa-popover__arrow-tip\" />\n </Popover.Arrow>\n ) : null}\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n </span>\n );\n}\n"],"names":["GcsaPopover","title","triggerLabel","placement","arrow","portalled","gutter","open","onOpenChange","size","width","minWidth","maxWidth","contentClassName","className","footer","trigger","children","messages","useGcsaLocaleMessages","zIndex","onPopupOpenChange","useGcsaPopupZIndex","resolvedTriggerLabel","isControlled","internalOpen","setInternalOpen","useState","resolvedOpen","triggerNode","jsx","GcsaButton","positionerStyle","contentStyle","useMemo","style","resolvedWidth","toCssLength","resolvedMinWidth","resolvedMaxWidth","contentClassNames","handleOpenChange","nextOpen","jsxs","Popover","createGcsaPopupPositioning","details","Portal"],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"GcsaPopover.js","sources":["../src/GcsaPopover.tsx"],"sourcesContent":["import { useMemo, useState, type CSSProperties, type ReactNode } from 'react';\nimport { Popover } from '@ark-ui/react/popover';\nimport { Portal } from '@ark-ui/react/portal';\nimport { createGcsaPopupPositioning, toCssLength } from '@gcsa/console-core';\nimport { GcsaButton } from './GcsaButton';\nimport { useGcsaLocaleMessages } from './hooks/useGcsaLocale';\nimport { useGcsaPopupZIndex } from './hooks/useGcsaPopupZIndex';\nimport type { GcsaTooltipPlacement } from './GcsaTooltip';\n\nexport type GcsaPopoverPlacement = GcsaTooltipPlacement;\n\n/** default=320px 上限;lg=表单类 Popover(560–680px,内容区可滚动) */\nexport type GcsaPopoverSize = 'default' | 'lg';\n\nexport type GcsaPopoverProps = {\n title?: string;\n triggerLabel?: string;\n placement?: GcsaPopoverPlacement;\n arrow?: boolean;\n portalled?: boolean;\n gutter?: number;\n /** 受控开关;不传则为非受控 */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** 启用 size middleware,写入 --reference-width */\n fitViewport?: boolean;\n /** 预设尺寸;与 minWidth / maxWidth / width 可同时使用,inline 优先生效 */\n size?: GcsaPopoverSize;\n /** 面板宽度,如 560 或 '560px' */\n width?: string | number;\n minWidth?: string | number;\n maxWidth?: string | number;\n /** 追加到 Popover.Content 的 class */\n contentClassName?: string;\n className?: string;\n /** 固定在面板底部、不参与 body 滚动的操作区 */\n footer?: ReactNode;\n trigger?: ReactNode;\n children?: ReactNode;\n};\n\nexport function GcsaPopover({\n title,\n triggerLabel,\n placement = 'bottom',\n arrow = true,\n portalled = true,\n gutter = 8,\n open,\n onOpenChange,\n fitViewport = false,\n size = 'default',\n width,\n minWidth,\n maxWidth,\n contentClassName,\n className,\n footer,\n trigger,\n children\n}: GcsaPopoverProps) {\n const messages = useGcsaLocaleMessages();\n const { zIndex, onOpenChange: onPopupOpenChange } = useGcsaPopupZIndex();\n const resolvedTriggerLabel = triggerLabel ?? messages.open;\n const isControlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState(false);\n const resolvedOpen = isControlled ? open : internalOpen;\n\n const triggerNode = trigger ?? (\n <GcsaButton variant=\"secondary\">\n {resolvedTriggerLabel}\n </GcsaButton>\n );\n\n const positionerStyle = (zIndex == null ? undefined : { zIndex }) as CSSProperties | undefined;\n\n const contentStyle = useMemo(() => {\n const style: CSSProperties = {};\n if (zIndex != null) style.zIndex = zIndex;\n const resolvedWidth = toCssLength(width);\n const resolvedMinWidth = toCssLength(minWidth);\n const resolvedMaxWidth = toCssLength(maxWidth);\n if (resolvedWidth) style.width = resolvedWidth;\n if (resolvedMinWidth) style.minWidth = resolvedMinWidth;\n if (resolvedMaxWidth) style.maxWidth = resolvedMaxWidth;\n return Object.keys(style).length ? style : undefined;\n }, [zIndex, width, minWidth, maxWidth]);\n\n const contentClassNames = [\n 'gcsa-popover',\n 'gcsa-ui-surface',\n size === 'lg' ? 'gcsa-popover--lg' : undefined,\n footer ? 'gcsa-popover--with-footer' : undefined,\n contentClassName\n ]\n .filter(Boolean)\n .join(' ');\n\n const handleOpenChange = (nextOpen: boolean) => {\n if (!isControlled) {\n setInternalOpen(nextOpen);\n }\n onOpenChange?.(nextOpen);\n onPopupOpenChange(nextOpen);\n };\n\n return (\n <span className={className}>\n <Popover.Root\n open={resolvedOpen}\n lazyMount\n unmountOnExit\n positioning={createGcsaPopupPositioning({ placement, gutter, fitViewport })}\n onOpenChange={details => handleOpenChange(details.open)}\n >\n <Popover.Trigger asChild>{triggerNode}</Popover.Trigger>\n <Portal disabled={!portalled}>\n <Popover.Positioner style={positionerStyle}>\n <Popover.Content className={contentClassNames} style={contentStyle}>\n {title ? <Popover.Title className=\"gcsa-popover__title\">{title}</Popover.Title> : null}\n <div className=\"gcsa-popover__body\">{children}</div>\n {footer ? <div className=\"gcsa-popover__footer\">{footer}</div> : null}\n {arrow ? (\n <Popover.Arrow className=\"gcsa-popover__arrow\">\n <Popover.ArrowTip className=\"gcsa-popover__arrow-tip\" />\n </Popover.Arrow>\n ) : null}\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n </span>\n );\n}\n"],"names":["GcsaPopover","title","triggerLabel","placement","arrow","portalled","gutter","open","onOpenChange","fitViewport","size","width","minWidth","maxWidth","contentClassName","className","footer","trigger","children","messages","useGcsaLocaleMessages","zIndex","onPopupOpenChange","useGcsaPopupZIndex","resolvedTriggerLabel","isControlled","internalOpen","setInternalOpen","useState","resolvedOpen","triggerNode","jsx","GcsaButton","positionerStyle","contentStyle","useMemo","style","resolvedWidth","toCssLength","resolvedMinWidth","resolvedMaxWidth","contentClassNames","handleOpenChange","nextOpen","jsxs","Popover","createGcsaPopupPositioning","details","Portal"],"mappings":"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"}
|
package/dist/GcsaTransfer.js
CHANGED
|
@@ -1,76 +1,91 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { useState as
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
import { jsxs as u, jsx as s } from "react/jsx-runtime";
|
|
2
|
+
import { useState as h, useMemo as L } from "react";
|
|
3
|
+
import { GcsaCheckbox as j } from "./GcsaCheckbox.js";
|
|
4
|
+
import { GcsaInput as K } from "./GcsaInput.js";
|
|
5
|
+
import { useGcsaLocaleMessages as P } from "./hooks/useGcsaLocale.js";
|
|
6
|
+
function F({
|
|
7
|
+
options: f,
|
|
8
|
+
value: n = [],
|
|
9
|
+
sourceTitle: C,
|
|
10
|
+
targetTitle: x,
|
|
11
|
+
disabled: o = !1,
|
|
12
|
+
onValueChange: p,
|
|
13
|
+
onChange: m
|
|
13
14
|
}) {
|
|
14
|
-
const
|
|
15
|
-
() =>
|
|
16
|
-
(e) => !
|
|
15
|
+
const i = P(), I = C ?? i.transferSourceTitle, D = x ?? i.transferTargetTitle, [g, N] = h([]), [_, k] = h([]), [b, G] = h(""), [v, M] = h(""), Q = L(
|
|
16
|
+
() => f.filter(
|
|
17
|
+
(e) => !n.includes(e.value) && e.label.toLowerCase().includes(b.trim().toLowerCase())
|
|
17
18
|
),
|
|
18
|
-
[
|
|
19
|
-
),
|
|
20
|
-
() =>
|
|
21
|
-
(e) =>
|
|
19
|
+
[f, b, n]
|
|
20
|
+
), R = L(
|
|
21
|
+
() => f.filter(
|
|
22
|
+
(e) => n.includes(e.value) && e.label.toLowerCase().includes(v.trim().toLowerCase())
|
|
22
23
|
),
|
|
23
|
-
[
|
|
24
|
-
),
|
|
25
|
-
|
|
26
|
-
},
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
24
|
+
[f, v, n]
|
|
25
|
+
), S = (e) => {
|
|
26
|
+
p == null || p(e), m == null || m(e), N([]), k([]);
|
|
27
|
+
}, w = (e, t, a) => {
|
|
28
|
+
(t === "source" ? N : k)((c) => a ? c.includes(e) ? c : [...c, e] : c.filter((d) => d !== e));
|
|
29
|
+
}, y = (e, t) => {
|
|
30
|
+
if (o || e.disabled) return;
|
|
31
|
+
const a = t === "source" ? g : _;
|
|
32
|
+
w(e.value, t, !a.includes(e.value));
|
|
33
|
+
}, T = (e, t, a) => /* @__PURE__ */ u("section", { className: "gcsa-transfer__panel", "aria-label": t, children: [
|
|
34
|
+
/* @__PURE__ */ u("header", { className: "gcsa-transfer__header", children: [
|
|
35
|
+
/* @__PURE__ */ s("span", { children: t }),
|
|
32
36
|
/* @__PURE__ */ s("span", { children: e.length })
|
|
33
37
|
] }),
|
|
34
38
|
/* @__PURE__ */ s("div", { className: "gcsa-transfer__search", children: /* @__PURE__ */ s(
|
|
35
|
-
|
|
39
|
+
K,
|
|
36
40
|
{
|
|
37
|
-
value:
|
|
38
|
-
placeholder:
|
|
39
|
-
disabled:
|
|
40
|
-
onValueChange:
|
|
41
|
+
value: a === "source" ? b : v,
|
|
42
|
+
placeholder: i.searchPlaceholder,
|
|
43
|
+
disabled: o,
|
|
44
|
+
onValueChange: a === "source" ? G : M
|
|
41
45
|
}
|
|
42
46
|
) }),
|
|
43
|
-
/* @__PURE__ */ s("div", { className: "gcsa-transfer__list", role: "listbox", "aria-multiselectable": "true", children: e.length ? e.map((
|
|
44
|
-
const
|
|
45
|
-
return /* @__PURE__ */
|
|
46
|
-
"
|
|
47
|
+
/* @__PURE__ */ s("div", { className: "gcsa-transfer__list", role: "listbox", "aria-multiselectable": "true", children: e.length ? e.map((r) => {
|
|
48
|
+
const c = (a === "source" ? g : _).includes(r.value), d = o || !!r.disabled;
|
|
49
|
+
return /* @__PURE__ */ u(
|
|
50
|
+
"div",
|
|
47
51
|
{
|
|
48
|
-
|
|
49
|
-
className: `gcsa-transfer__item gcsa-focus-ring${o ? " gcsa-transfer__item--selected" : ""}`,
|
|
50
|
-
disabled: l || a.disabled,
|
|
52
|
+
className: `gcsa-transfer__item gcsa-focus-ring${c ? " gcsa-transfer__item--selected" : ""}`,
|
|
51
53
|
role: "option",
|
|
52
|
-
|
|
53
|
-
|
|
54
|
+
tabIndex: d ? -1 : 0,
|
|
55
|
+
"aria-selected": c,
|
|
56
|
+
"aria-disabled": d || void 0,
|
|
57
|
+
onClick: () => y(r, a),
|
|
58
|
+
onKeyDown: (l) => {
|
|
59
|
+
(l.key === "Enter" || l.key === " ") && (l.preventDefault(), y(r, a));
|
|
60
|
+
},
|
|
54
61
|
children: [
|
|
55
|
-
/* @__PURE__ */ s("span", { className: "gcsa-transfer__check",
|
|
56
|
-
|
|
62
|
+
/* @__PURE__ */ s("span", { className: "gcsa-transfer__check-wrap", onClick: (l) => l.stopPropagation(), children: /* @__PURE__ */ s(
|
|
63
|
+
j,
|
|
64
|
+
{
|
|
65
|
+
checked: c,
|
|
66
|
+
disabled: d,
|
|
67
|
+
ariaLabel: r.label,
|
|
68
|
+
onCheckedChange: (l) => w(r.value, a, l)
|
|
69
|
+
}
|
|
70
|
+
) }),
|
|
71
|
+
/* @__PURE__ */ s("span", { className: "gcsa-transfer__label", children: r.label })
|
|
57
72
|
]
|
|
58
73
|
},
|
|
59
|
-
|
|
74
|
+
r.value
|
|
60
75
|
);
|
|
61
|
-
}) : /* @__PURE__ */ s("span", { className: "gcsa-transfer__empty", children:
|
|
76
|
+
}) : /* @__PURE__ */ s("span", { className: "gcsa-transfer__empty", children: i.noOptions }) })
|
|
62
77
|
] });
|
|
63
|
-
return /* @__PURE__ */
|
|
64
|
-
|
|
65
|
-
/* @__PURE__ */
|
|
78
|
+
return /* @__PURE__ */ u("div", { className: `gcsa-transfer${o ? " gcsa-transfer--disabled" : ""}`, children: [
|
|
79
|
+
T(Q, I, "source"),
|
|
80
|
+
/* @__PURE__ */ u("div", { className: "gcsa-transfer__actions", children: [
|
|
66
81
|
/* @__PURE__ */ s(
|
|
67
82
|
"button",
|
|
68
83
|
{
|
|
69
84
|
type: "button",
|
|
70
85
|
className: "gcsa-transfer__action gcsa-focus-ring",
|
|
71
|
-
disabled:
|
|
72
|
-
"aria-label":
|
|
73
|
-
onClick: () =>
|
|
86
|
+
disabled: o || !g.length,
|
|
87
|
+
"aria-label": i.transferMoveRight,
|
|
88
|
+
onClick: () => S([...n, ...g]),
|
|
74
89
|
children: "›"
|
|
75
90
|
}
|
|
76
91
|
),
|
|
@@ -79,17 +94,17 @@ function z({
|
|
|
79
94
|
{
|
|
80
95
|
type: "button",
|
|
81
96
|
className: "gcsa-transfer__action gcsa-focus-ring",
|
|
82
|
-
disabled:
|
|
83
|
-
"aria-label":
|
|
84
|
-
onClick: () =>
|
|
97
|
+
disabled: o || !_.length,
|
|
98
|
+
"aria-label": i.transferMoveLeft,
|
|
99
|
+
onClick: () => S(n.filter((e) => !_.includes(e))),
|
|
85
100
|
children: "‹"
|
|
86
101
|
}
|
|
87
102
|
)
|
|
88
103
|
] }),
|
|
89
|
-
|
|
104
|
+
T(R, D, "target")
|
|
90
105
|
] });
|
|
91
106
|
}
|
|
92
107
|
export {
|
|
93
|
-
|
|
108
|
+
F as GcsaTransfer
|
|
94
109
|
};
|
|
95
110
|
//# sourceMappingURL=GcsaTransfer.js.map
|
package/dist/GcsaTransfer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GcsaTransfer.js","sources":["../src/GcsaTransfer.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport type { GcsaTransferOption } from '@gcsa/console-core';\nimport { GcsaInput } from './GcsaInput';\nimport { useGcsaLocaleMessages } from './hooks/useGcsaLocale';\n\nexport type GcsaTransferProps = {\n options: GcsaTransferOption[];\n value?: string[];\n sourceTitle?: string;\n targetTitle?: string;\n disabled?: boolean;\n onValueChange?: (keys: string[]) => void;\n onChange?: (keys: string[]) => void;\n};\n\nexport function GcsaTransfer({\n options,\n value = [],\n sourceTitle,\n targetTitle,\n disabled = false,\n onValueChange,\n onChange\n}: GcsaTransferProps) {\n const messages = useGcsaLocaleMessages();\n const resolvedSourceTitle = sourceTitle ?? messages.transferSourceTitle;\n const resolvedTargetTitle = targetTitle ?? messages.transferTargetTitle;\n const [sourceSelected, setSourceSelected] = useState<string[]>([]);\n const [targetSelected, setTargetSelected] = useState<string[]>([]);\n const [sourceQuery, setSourceQuery] = useState('');\n const [targetQuery, setTargetQuery] = useState('');\n const availableItems = useMemo(\n () =>\n options.filter(\n item =>\n !value.includes(item.value) &&\n item.label.toLowerCase().includes(sourceQuery.trim().toLowerCase())\n ),\n [options, sourceQuery, value]\n );\n const targetItems = useMemo(\n () =>\n options.filter(\n item =>\n value.includes(item.value) &&\n item.label.toLowerCase().includes(targetQuery.trim().toLowerCase())\n ),\n [options, targetQuery, value]\n );\n const update = (next: string[]) => {\n onValueChange?.(next);\n onChange?.(next);\n setSourceSelected([]);\n setTargetSelected([]);\n };\n const
|
|
1
|
+
{"version":3,"file":"GcsaTransfer.js","sources":["../src/GcsaTransfer.tsx"],"sourcesContent":["import { useMemo, useState, type KeyboardEvent } from 'react';\nimport type { GcsaTransferOption } from '@gcsa/console-core';\nimport { GcsaCheckbox } from './GcsaCheckbox';\nimport { GcsaInput } from './GcsaInput';\nimport { useGcsaLocaleMessages } from './hooks/useGcsaLocale';\n\nexport type GcsaTransferProps = {\n options: GcsaTransferOption[];\n value?: string[];\n sourceTitle?: string;\n targetTitle?: string;\n disabled?: boolean;\n onValueChange?: (keys: string[]) => void;\n onChange?: (keys: string[]) => void;\n};\n\nexport function GcsaTransfer({\n options,\n value = [],\n sourceTitle,\n targetTitle,\n disabled = false,\n onValueChange,\n onChange\n}: GcsaTransferProps) {\n const messages = useGcsaLocaleMessages();\n const resolvedSourceTitle = sourceTitle ?? messages.transferSourceTitle;\n const resolvedTargetTitle = targetTitle ?? messages.transferTargetTitle;\n const [sourceSelected, setSourceSelected] = useState<string[]>([]);\n const [targetSelected, setTargetSelected] = useState<string[]>([]);\n const [sourceQuery, setSourceQuery] = useState('');\n const [targetQuery, setTargetQuery] = useState('');\n\n const availableItems = useMemo(\n () =>\n options.filter(\n item =>\n !value.includes(item.value) &&\n item.label.toLowerCase().includes(sourceQuery.trim().toLowerCase())\n ),\n [options, sourceQuery, value]\n );\n\n const targetItems = useMemo(\n () =>\n options.filter(\n item =>\n value.includes(item.value) &&\n item.label.toLowerCase().includes(targetQuery.trim().toLowerCase())\n ),\n [options, targetQuery, value]\n );\n\n const update = (next: string[]) => {\n onValueChange?.(next);\n onChange?.(next);\n setSourceSelected([]);\n setTargetSelected([]);\n };\n\n const setSelected = (key: string, side: 'source' | 'target', checked: boolean) => {\n const setter = side === 'source' ? setSourceSelected : setTargetSelected;\n setter(current => {\n if (checked) return current.includes(key) ? current : [...current, key];\n return current.filter(item => item !== key);\n });\n };\n\n const onItemActivate = (item: GcsaTransferOption, side: 'source' | 'target') => {\n if (disabled || item.disabled) return;\n const current = side === 'source' ? sourceSelected : targetSelected;\n setSelected(item.value, side, !current.includes(item.value));\n };\n\n const panel = (items: GcsaTransferOption[], title: string, side: 'source' | 'target') => (\n <section className=\"gcsa-transfer__panel\" aria-label={title}>\n <header className=\"gcsa-transfer__header\">\n <span>{title}</span>\n <span>{items.length}</span>\n </header>\n <div className=\"gcsa-transfer__search\">\n <GcsaInput\n value={side === 'source' ? sourceQuery : targetQuery}\n placeholder={messages.searchPlaceholder}\n disabled={disabled}\n onValueChange={side === 'source' ? setSourceQuery : setTargetQuery}\n />\n </div>\n <div className=\"gcsa-transfer__list\" role=\"listbox\" aria-multiselectable=\"true\">\n {items.length ? (\n items.map(item => {\n const selected = (side === 'source' ? sourceSelected : targetSelected).includes(item.value);\n const itemDisabled = disabled || Boolean(item.disabled);\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onItemActivate(item, side);\n }\n };\n const onRowClick = () => onItemActivate(item, side);\n return (\n <div\n key={item.value}\n className={`gcsa-transfer__item gcsa-focus-ring${selected ? ' gcsa-transfer__item--selected' : ''}`}\n role=\"option\"\n tabIndex={itemDisabled ? -1 : 0}\n aria-selected={selected}\n aria-disabled={itemDisabled || undefined}\n onClick={onRowClick}\n onKeyDown={onKeyDown}\n >\n <span className=\"gcsa-transfer__check-wrap\" onClick={event => event.stopPropagation()}>\n <GcsaCheckbox\n checked={selected}\n disabled={itemDisabled}\n ariaLabel={item.label}\n onCheckedChange={checked => setSelected(item.value, side, checked)}\n />\n </span>\n <span className=\"gcsa-transfer__label\">{item.label}</span>\n </div>\n );\n })\n ) : (\n <span className=\"gcsa-transfer__empty\">{messages.noOptions}</span>\n )}\n </div>\n </section>\n );\n\n return (\n <div className={`gcsa-transfer${disabled ? ' gcsa-transfer--disabled' : ''}`}>\n {panel(availableItems, resolvedSourceTitle, 'source')}\n <div className=\"gcsa-transfer__actions\">\n <button\n type=\"button\"\n className=\"gcsa-transfer__action gcsa-focus-ring\"\n disabled={disabled || !sourceSelected.length}\n aria-label={messages.transferMoveRight}\n onClick={() => update([...value, ...sourceSelected])}\n >\n ›\n </button>\n <button\n type=\"button\"\n className=\"gcsa-transfer__action gcsa-focus-ring\"\n disabled={disabled || !targetSelected.length}\n aria-label={messages.transferMoveLeft}\n onClick={() => update(value.filter(key => !targetSelected.includes(key)))}\n >\n ‹\n </button>\n </div>\n {panel(targetItems, resolvedTargetTitle, 'target')}\n </div>\n );\n}\n"],"names":["GcsaTransfer","options","value","sourceTitle","targetTitle","disabled","onValueChange","onChange","messages","useGcsaLocaleMessages","resolvedSourceTitle","resolvedTargetTitle","sourceSelected","setSourceSelected","useState","targetSelected","setTargetSelected","sourceQuery","setSourceQuery","targetQuery","setTargetQuery","availableItems","useMemo","item","targetItems","update","next","setSelected","key","side","checked","current","onItemActivate","panel","items","title","jsxs","jsx","GcsaInput","selected","itemDisabled","event","GcsaCheckbox"],"mappings":"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"}
|
package/dist/GcsaUpload.js
CHANGED
|
@@ -97,7 +97,7 @@ function sa({
|
|
|
97
97
|
onDragLeave: () => v(!1),
|
|
98
98
|
onDrop: Y,
|
|
99
99
|
children: [
|
|
100
|
-
/* @__PURE__ */ t("span", { className: "gcsa-upload__icon", "aria-hidden": "true", children: /* @__PURE__ */ t(C, { name: "
|
|
100
|
+
/* @__PURE__ */ t("span", { className: "gcsa-upload__icon", "aria-hidden": "true", children: /* @__PURE__ */ t(C, { name: "upload" }) }),
|
|
101
101
|
/* @__PURE__ */ t("span", { className: "gcsa-upload__title", children: q }),
|
|
102
102
|
k ? /* @__PURE__ */ t("p", { className: "gcsa-upload__hint", children: k }) : null
|
|
103
103
|
]
|
package/dist/GcsaUpload.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GcsaUpload.js","sources":["../src/GcsaUpload.tsx"],"sourcesContent":["import { useRef, useState } from 'react';\nimport { GcsaIcon } from './GcsaIcon';\nimport { useGcsaLocaleMessages } from './hooks/useGcsaLocale';\n\nexport type GcsaUploadProps = {\n files?: File[];\n accept?: string;\n multiple?: boolean;\n disabled?: boolean;\n buttonLabel?: string;\n hint?: string;\n maxCount?: number;\n maxSize?: number;\n drag?: boolean;\n directory?: boolean;\n dragLabel?: string;\n uploadingLabel?: string;\n uploadErrorLabel?: string;\n upload?: (file: File, onProgress?: (percent: number) => void) => Promise<void> | void;\n retryLabel?: string;\n onProgress?: (file: File, percent: number) => void;\n onUploadStart?: (file: File) => void;\n onUploadSuccess?: (file: File) => void;\n onUploadError?: (file: File, error: unknown) => void;\n className?: string;\n onFilesChange?: (files: File[]) => void;\n};\n\nexport function GcsaUpload({\n files = [],\n accept,\n multiple = false,\n disabled,\n buttonLabel,\n hint,\n maxCount,\n className,\n onFilesChange,\n maxSize,\n drag = false,\n directory = false,\n dragLabel,\n uploadingLabel,\n uploadErrorLabel,\n upload,\n retryLabel,\n onProgress,\n onUploadStart,\n onUploadSuccess,\n onUploadError\n}: GcsaUploadProps) {\n const messages = useGcsaLocaleMessages();\n const resolvedButtonLabel = buttonLabel ?? messages.uploadSelectFile;\n const resolvedDragLabel = dragLabel ?? messages.uploadDragHint;\n const resolvedUploadingLabel = uploadingLabel ?? messages.uploadUploading;\n const resolvedUploadErrorLabel = uploadErrorLabel ?? messages.uploadFailed;\n const resolvedRetryLabel = retryLabel ?? messages.uploadRetry;\n const resolvedHint = hint || (drag ? resolvedDragLabel : undefined);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const [dragging, setDragging] = useState(false);\n const [statuses, setStatuses] = useState<Map<File, 'uploading' | 'success' | 'error'>>(new Map());\n const [progress, setProgress] = useState<Map<File, number>>(new Map());\n\n function openPicker() {\n inputRef.current?.click();\n }\n\n function onNativeChange(event: React.ChangeEvent<HTMLInputElement>) {\n const picked = Array.from(event.target.files ?? []);\n event.target.value = '';\n if (!picked.length) return;\n\n acceptFiles(picked);\n }\n\n function acceptFiles(picked: File[]) {\n const valid = maxSize == null ? picked : picked.filter(file => file.size <= maxSize);\n let next = multiple ? [...files, ...valid] : valid.slice(0, 1);\n if (maxCount != null) next = next.slice(0, maxCount);\n onFilesChange?.(next);\n if (upload) next.filter(file => valid.includes(file)).forEach(uploadFile);\n }\n\n function onDragEnter(event: React.DragEvent<HTMLDivElement>) {\n event.preventDefault();\n if (!drag || disabled) return;\n setDragging(true);\n }\n\n function onDrop(event: React.DragEvent<HTMLDivElement>) {\n event.preventDefault();\n setDragging(false);\n if (!drag || disabled) return;\n acceptFiles(Array.from(event.dataTransfer.files));\n }\n\n async function uploadFile(file: File) {\n if (!upload) return;\n setStatuses(current => new Map(current).set(file, 'uploading'));\n setProgress(current => new Map(current).set(file, 0));\n onUploadStart?.(file);\n try {\n await upload(file, percent => {\n const next = Math.max(0, Math.min(100, Math.round(percent)));\n setProgress(current => new Map(current).set(file, next));\n onProgress?.(file, next);\n });\n setStatuses(current => new Map(current).set(file, 'success'));\n setProgress(current => new Map(current).set(file, 100));\n onUploadSuccess?.(file);\n } catch (error) {\n setStatuses(current => new Map(current).set(file, 'error'));\n onUploadError?.(file, error);\n }\n }\n\n function removeAt(index: number) {\n onFilesChange?.(files.filter((_, i) => i !== index));\n }\n\n function formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n }\n\n return (\n <div\n className={`gcsa-upload${disabled ? ' gcsa-upload--disabled' : ''}${dragging ? ' gcsa-upload--dragging' : ''}${className ? ` ${className}` : ''}`}\n >\n <input\n ref={inputRef}\n type=\"file\"\n className=\"gcsa-upload__native\"\n accept={accept}\n multiple={multiple}\n {...(directory ? { webkitdirectory: '' } : {})}\n disabled={disabled}\n onChange={onNativeChange}\n />\n <div\n className=\"gcsa-upload__dropzone\"\n role=\"button\"\n tabIndex={0}\n onClick={openPicker}\n onKeyDown={event => {\n if (event.key === 'Enter' || event.key === ' ') openPicker();\n }}\n onDragEnter={onDragEnter}\n onDragOver={onDragEnter}\n onDragLeave={() => setDragging(false)}\n onDrop={onDrop}\n >\n <span className=\"gcsa-upload__icon\" aria-hidden=\"true\">\n <GcsaIcon name=\"plus\" />\n </span>\n <span className=\"gcsa-upload__title\">{resolvedButtonLabel}</span>\n {resolvedHint ? <p className=\"gcsa-upload__hint\">{resolvedHint}</p> : null}\n </div>\n {files.length > 0 ? (\n <ul className=\"gcsa-upload__list\">\n {files.map((file, index) => (\n <li key={`${file.name}-${index}`} className=\"gcsa-upload__item\">\n <span className=\"gcsa-upload__name\">{file.name}</span>\n <span className=\"gcsa-upload__size\">{formatSize(file.size)}</span>\n {statuses.get(file) === 'uploading' ? (\n <span className=\"gcsa-upload__status\" role=\"status\">\n {resolvedUploadingLabel} {progress.get(file) ?? 0}%\n </span>\n ) : null}\n {statuses.get(file) === 'error' ? (\n <span className=\"gcsa-upload__status gcsa-upload__status--error\" role=\"alert\">\n {resolvedUploadErrorLabel}\n </span>\n ) : null}\n {statuses.get(file) === 'uploading' ? (\n <div className=\"gcsa-upload__progress\" aria-hidden=\"true\">\n <span style={{ width: `${progress.get(file) ?? 0}%` }} />\n </div>\n ) : null}\n {statuses.get(file) === 'error' ? (\n <button\n type=\"button\"\n className=\"gcsa-upload__retry gcsa-focus-ring\"\n disabled={disabled}\n onClick={() => uploadFile(file)}\n >\n {resolvedRetryLabel}\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"gcsa-upload__remove gcsa-focus-ring\"\n disabled={disabled}\n aria-label={messages.uploadRemoveFile}\n onClick={() => removeAt(index)}\n >\n {messages.remove}\n </button>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n"],"names":["GcsaUpload","files","accept","multiple","disabled","buttonLabel","hint","maxCount","className","onFilesChange","maxSize","drag","directory","dragLabel","uploadingLabel","uploadErrorLabel","upload","retryLabel","onProgress","onUploadStart","onUploadSuccess","onUploadError","messages","useGcsaLocaleMessages","resolvedButtonLabel","resolvedDragLabel","resolvedUploadingLabel","resolvedUploadErrorLabel","resolvedRetryLabel","resolvedHint","inputRef","useRef","dragging","setDragging","useState","statuses","setStatuses","progress","setProgress","openPicker","_a","onNativeChange","event","picked","acceptFiles","valid","file","next","uploadFile","onDragEnter","onDrop","current","percent","error","removeAt","index","_","i","formatSize","bytes","jsxs","jsx","GcsaIcon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"GcsaUpload.js","sources":["../src/GcsaUpload.tsx"],"sourcesContent":["import { useRef, useState } from 'react';\nimport { GcsaIcon } from './GcsaIcon';\nimport { useGcsaLocaleMessages } from './hooks/useGcsaLocale';\n\nexport type GcsaUploadProps = {\n files?: File[];\n accept?: string;\n multiple?: boolean;\n disabled?: boolean;\n buttonLabel?: string;\n hint?: string;\n maxCount?: number;\n maxSize?: number;\n drag?: boolean;\n directory?: boolean;\n dragLabel?: string;\n uploadingLabel?: string;\n uploadErrorLabel?: string;\n upload?: (file: File, onProgress?: (percent: number) => void) => Promise<void> | void;\n retryLabel?: string;\n onProgress?: (file: File, percent: number) => void;\n onUploadStart?: (file: File) => void;\n onUploadSuccess?: (file: File) => void;\n onUploadError?: (file: File, error: unknown) => void;\n className?: string;\n onFilesChange?: (files: File[]) => void;\n};\n\nexport function GcsaUpload({\n files = [],\n accept,\n multiple = false,\n disabled,\n buttonLabel,\n hint,\n maxCount,\n className,\n onFilesChange,\n maxSize,\n drag = false,\n directory = false,\n dragLabel,\n uploadingLabel,\n uploadErrorLabel,\n upload,\n retryLabel,\n onProgress,\n onUploadStart,\n onUploadSuccess,\n onUploadError\n}: GcsaUploadProps) {\n const messages = useGcsaLocaleMessages();\n const resolvedButtonLabel = buttonLabel ?? messages.uploadSelectFile;\n const resolvedDragLabel = dragLabel ?? messages.uploadDragHint;\n const resolvedUploadingLabel = uploadingLabel ?? messages.uploadUploading;\n const resolvedUploadErrorLabel = uploadErrorLabel ?? messages.uploadFailed;\n const resolvedRetryLabel = retryLabel ?? messages.uploadRetry;\n const resolvedHint = hint || (drag ? resolvedDragLabel : undefined);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const [dragging, setDragging] = useState(false);\n const [statuses, setStatuses] = useState<Map<File, 'uploading' | 'success' | 'error'>>(new Map());\n const [progress, setProgress] = useState<Map<File, number>>(new Map());\n\n function openPicker() {\n inputRef.current?.click();\n }\n\n function onNativeChange(event: React.ChangeEvent<HTMLInputElement>) {\n const picked = Array.from(event.target.files ?? []);\n event.target.value = '';\n if (!picked.length) return;\n\n acceptFiles(picked);\n }\n\n function acceptFiles(picked: File[]) {\n const valid = maxSize == null ? picked : picked.filter(file => file.size <= maxSize);\n let next = multiple ? [...files, ...valid] : valid.slice(0, 1);\n if (maxCount != null) next = next.slice(0, maxCount);\n onFilesChange?.(next);\n if (upload) next.filter(file => valid.includes(file)).forEach(uploadFile);\n }\n\n function onDragEnter(event: React.DragEvent<HTMLDivElement>) {\n event.preventDefault();\n if (!drag || disabled) return;\n setDragging(true);\n }\n\n function onDrop(event: React.DragEvent<HTMLDivElement>) {\n event.preventDefault();\n setDragging(false);\n if (!drag || disabled) return;\n acceptFiles(Array.from(event.dataTransfer.files));\n }\n\n async function uploadFile(file: File) {\n if (!upload) return;\n setStatuses(current => new Map(current).set(file, 'uploading'));\n setProgress(current => new Map(current).set(file, 0));\n onUploadStart?.(file);\n try {\n await upload(file, percent => {\n const next = Math.max(0, Math.min(100, Math.round(percent)));\n setProgress(current => new Map(current).set(file, next));\n onProgress?.(file, next);\n });\n setStatuses(current => new Map(current).set(file, 'success'));\n setProgress(current => new Map(current).set(file, 100));\n onUploadSuccess?.(file);\n } catch (error) {\n setStatuses(current => new Map(current).set(file, 'error'));\n onUploadError?.(file, error);\n }\n }\n\n function removeAt(index: number) {\n onFilesChange?.(files.filter((_, i) => i !== index));\n }\n\n function formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n }\n\n return (\n <div\n className={`gcsa-upload${disabled ? ' gcsa-upload--disabled' : ''}${dragging ? ' gcsa-upload--dragging' : ''}${className ? ` ${className}` : ''}`}\n >\n <input\n ref={inputRef}\n type=\"file\"\n className=\"gcsa-upload__native\"\n accept={accept}\n multiple={multiple}\n {...(directory ? { webkitdirectory: '' } : {})}\n disabled={disabled}\n onChange={onNativeChange}\n />\n <div\n className=\"gcsa-upload__dropzone\"\n role=\"button\"\n tabIndex={0}\n onClick={openPicker}\n onKeyDown={event => {\n if (event.key === 'Enter' || event.key === ' ') openPicker();\n }}\n onDragEnter={onDragEnter}\n onDragOver={onDragEnter}\n onDragLeave={() => setDragging(false)}\n onDrop={onDrop}\n >\n <span className=\"gcsa-upload__icon\" aria-hidden=\"true\">\n <GcsaIcon name=\"upload\" />\n </span>\n <span className=\"gcsa-upload__title\">{resolvedButtonLabel}</span>\n {resolvedHint ? <p className=\"gcsa-upload__hint\">{resolvedHint}</p> : null}\n </div>\n {files.length > 0 ? (\n <ul className=\"gcsa-upload__list\">\n {files.map((file, index) => (\n <li key={`${file.name}-${index}`} className=\"gcsa-upload__item\">\n <span className=\"gcsa-upload__name\">{file.name}</span>\n <span className=\"gcsa-upload__size\">{formatSize(file.size)}</span>\n {statuses.get(file) === 'uploading' ? (\n <span className=\"gcsa-upload__status\" role=\"status\">\n {resolvedUploadingLabel} {progress.get(file) ?? 0}%\n </span>\n ) : null}\n {statuses.get(file) === 'error' ? (\n <span className=\"gcsa-upload__status gcsa-upload__status--error\" role=\"alert\">\n {resolvedUploadErrorLabel}\n </span>\n ) : null}\n {statuses.get(file) === 'uploading' ? (\n <div className=\"gcsa-upload__progress\" aria-hidden=\"true\">\n <span style={{ width: `${progress.get(file) ?? 0}%` }} />\n </div>\n ) : null}\n {statuses.get(file) === 'error' ? (\n <button\n type=\"button\"\n className=\"gcsa-upload__retry gcsa-focus-ring\"\n disabled={disabled}\n onClick={() => uploadFile(file)}\n >\n {resolvedRetryLabel}\n </button>\n ) : null}\n <button\n type=\"button\"\n className=\"gcsa-upload__remove gcsa-focus-ring\"\n disabled={disabled}\n aria-label={messages.uploadRemoveFile}\n onClick={() => removeAt(index)}\n >\n {messages.remove}\n </button>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n"],"names":["GcsaUpload","files","accept","multiple","disabled","buttonLabel","hint","maxCount","className","onFilesChange","maxSize","drag","directory","dragLabel","uploadingLabel","uploadErrorLabel","upload","retryLabel","onProgress","onUploadStart","onUploadSuccess","onUploadError","messages","useGcsaLocaleMessages","resolvedButtonLabel","resolvedDragLabel","resolvedUploadingLabel","resolvedUploadErrorLabel","resolvedRetryLabel","resolvedHint","inputRef","useRef","dragging","setDragging","useState","statuses","setStatuses","progress","setProgress","openPicker","_a","onNativeChange","event","picked","acceptFiles","valid","file","next","uploadFile","onDragEnter","onDrop","current","percent","error","removeAt","index","_","i","formatSize","bytes","jsxs","jsx","GcsaIcon"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** 导航侧栏图标 — 与 @gcsa/console-core GcsaNavItem.iconKey 对齐 */
|
|
2
2
|
export declare const GCSA_NAV_ICON_NAMES: readonly ["dashboard", "alert", "assets", "settings", "users", "chat"];
|
|
3
3
|
/** 组件内部 UI 图标(文件名 kebab-case → 注册为 camelCase key) */
|
|
4
|
-
export declare const GCSA_UI_ICON_NAMES: readonly ["chevronDown", "chevronUp", "chevronLeft", "chevronRight", "check", "close", "menu", "plus", "resultEmpty"];
|
|
5
|
-
export declare const GCSA_ICON_NAMES: readonly ["dashboard", "alert", "assets", "settings", "users", "chat", "chevronDown", "chevronUp", "chevronLeft", "chevronRight", "check", "close", "menu", "plus", "resultEmpty"];
|
|
4
|
+
export declare const GCSA_UI_ICON_NAMES: readonly ["chevronDown", "chevronUp", "chevronLeft", "chevronRight", "check", "close", "menu", "plus", "upload", "resultEmpty"];
|
|
5
|
+
export declare const GCSA_ICON_NAMES: readonly ["dashboard", "alert", "assets", "settings", "users", "chat", "chevronDown", "chevronUp", "chevronLeft", "chevronRight", "check", "close", "menu", "plus", "upload", "resultEmpty"];
|
|
6
6
|
export type GcsaNavIconName = (typeof GCSA_NAV_ICON_NAMES)[number];
|
|
7
7
|
export type GcsaIconName = (typeof GCSA_ICON_NAMES)[number];
|