@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.
@@ -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: n,
9
- placeholder: b,
10
- disabled: p = !1,
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: i,
14
+ onValueChange: d,
15
15
  onChange: o,
16
16
  className: m
17
17
  }) {
18
- const u = D(), P = b ?? u.selectPlaceholder, [d, f] = j(t);
18
+ const u = D(), w = p ?? u.selectPlaceholder, [n, f] = j(t);
19
19
  $(() => {
20
20
  f(t);
21
21
  }, [t]);
22
- const w = _(() => {
22
+ const P = _(() => {
23
23
  var e;
24
- const c = [n];
25
- let s = n;
26
- for (const a of d) {
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
- }, [d, n]), h = _(() => {
32
+ }, [n, i]), h = _(() => {
33
33
  const c = [];
34
- let s = n;
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
- }, [n, t]), x = (c, s) => {
41
+ }, [i, t]), x = (c, s) => {
42
42
  var a;
43
43
  if (c.disabled) return;
44
- const e = [...d.slice(0, s), c.value];
45
- f(e), (!((a = c.children) != null && a.length) || y) && (i == null || i(e), o == null || o(e));
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: p,
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 || P }),
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: w.map((c, s) => /* @__PURE__ */ r("div", { className: "gcsa-cascader__column", role: "menu", children: c.length ? c.map((e) => {
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${d[s] === e.value ? " gcsa-cascader__option--active" : ""}`,
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),
@@ -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":";;;;;AAmBO,SAASA,EAAa;AAAA,EAC3B,OAAAC,IAAQ,CAAA;AAAA,EACR,SAAAC;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,SAAAC,IAAU;AAAA,EACV,gBAAAC,IAAiB;AAAA,EACjB,WAAAC,IAAY;AAAA,EACZ,eAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AACF,GAAsB;AACpB,QAAMC,IAAWC,EAAA,GACXC,IAAsBV,KAAeQ,EAAS,mBAC9C,CAACG,GAAYC,CAAa,IAAIC,EAASf,CAAK;AAElD,EAAAgB,EAAU,MAAM;AACd,IAAAF,EAAcd,CAAK;AAAA,EACrB,GAAG,CAACA,CAAK,CAAC;AAEV,QAAMiB,IAAUC,EAAQ,MAAM;;AAC5B,UAAMC,IAAiC,CAAClB,CAAO;AAC/C,QAAImB,IAAUnB;AACd,eAAWoB,KAAOR,GAAY;AAC5B,YAAMS,IAAWF,EAAQ,KAAK,CAAAG,MAAUA,EAAO,UAAUF,CAAG;AAC5D,UAAI,GAACG,IAAAF,KAAA,gBAAAA,EAAU,aAAV,QAAAE,EAAoB,QAAQ;AACjC,MAAAL,EAAO,KAAKG,EAAS,QAAQ,GAC7BF,IAAUE,EAAS;AAAA,IACrB;AACA,WAAOH;AAAA,EACT,GAAG,CAACN,GAAYZ,CAAO,CAAC,GAElBwB,IAAeP,EAAQ,MAAM;AACjC,UAAMQ,IAAmB,CAAA;AACzB,QAAIN,IAAUnB;AACd,eAAWoB,KAAOrB,GAAO;AACvB,YAAMsB,IAAWF,EAAQ,KAAK,CAAAG,MAAUA,EAAO,UAAUF,CAAG;AAC5D,UAAI,CAACC,EAAU;AACf,MAAAI,EAAO,KAAKJ,EAAS,KAAK,GAC1BF,IAAUE,EAAS,YAAY,CAAA;AAAA,IACjC;AACA,WAAOI,EAAO,KAAK,KAAK;AAAA,EAC1B,GAAG,CAACzB,GAASD,CAAK,CAAC,GAEb2B,IAAe,CAACJ,GAA4BK,MAAkB;;AAClE,QAAIL,EAAO,SAAU;AACrB,UAAMM,IAAO,CAAC,GAAGhB,EAAW,MAAM,GAAGe,CAAK,GAAGL,EAAO,KAAK;AACzD,IAAAT,EAAce,CAAI,IACd,GAACL,IAAAD,EAAO,aAAP,QAAAC,EAAiB,WAAUnB,OAC9BE,KAAA,QAAAA,EAAgBsB,IAChBrB,KAAA,QAAAA,EAAWqB;AAAA,EAEf;AAEA,SACE,gBAAAC;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,MACP,WAAAzB;AAAA,MACA,QAAQ;AAAA,MACR,aAAW;AAAA,MACX,WAAU;AAAA,MACV,SACE,gBAAA0B;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAW,yCAAyCvB,IAAY,IAAIA,CAAS,KAAK,EAAE;AAAA,UACpF,UAAAN;AAAA,UACA,gBAAcC,KAAW;AAAA,UAEzB,UAAA;AAAA,YAAA,gBAAA0B,EAAC,QAAA,EAAK,WAAU,wBAAuB,oBAAkB,CAACL,KAAgB,QACvE,eAAgBb,EAAA,CACnB;AAAA,8BACCqB,GAAA,EAAS,MAAK,eAAc,MAAK,MAAK,eAAY,OAAA,CAAO;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAI9D,4BAAC,OAAA,EAAI,WAAU,wBACZ,UAAAhB,EAAQ,IAAI,CAACiB,GAAQN,wBACnB,OAAA,EAAgB,WAAU,yBAAwB,MAAK,QACrD,YAAO,SACNM,EAAO,IAAI,CAAAX,MAAA;;AACT,+BAAAS;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,WAAW,wCAAwCnB,EAAWe,CAAK,MAAML,EAAO,QAAQ,mCAAmC,EAAE;AAAA,YAC7H,UAAUA,EAAO;AAAA,YACjB,MAAK;AAAA,YACL,SAAS,MAAMI,EAAaJ,GAAQK,CAAK;AAAA,YAEzC,UAAA;AAAA,cAAA,gBAAAE,EAAC,QAAA,EAAM,YAAO,MAAA,CAAM;AAAA,eACnBN,IAAAD,EAAO,aAAP,QAAAC,EAAiB,SAChB,gBAAAM,EAACG,GAAA,EAAS,MAAK,eAAc,MAAK,MAAK,WAAU,uBAAA,CAAuB,IACtE;AAAA,YAAA;AAAA,UAAA;AAAA,UAVCV,EAAO;AAAA,QAAA;AAAA,OAYf,IAED,gBAAAO,EAAC,QAAA,EAAK,WAAU,wBAAwB,UAAApB,EAAS,UAAA,CAAU,KAlBrDkB,CAoBV,CACD,EAAA,CACH;AAAA,IAAA;AAAA,EAAA;AAGN;"}
@@ -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;
@@ -1,57 +1,58 @@
1
1
  import { jsx as e, jsxs as f } from "react/jsx-runtime";
2
- import { useState as k, useMemo as E } from "react";
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 R } from "@ark-ui/react/portal";
5
- import { toCssLength as i, createGcsaPopupPositioning as Z } from "@gcsa/console-core";
6
- import { GcsaButton as q } from "./GcsaButton.js";
7
- import { useGcsaLocaleMessages as D } from "./hooks/useGcsaLocale.js";
8
- import { useGcsaPopupZIndex as F } from "./hooks/useGcsaPopupZIndex.js";
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: c,
16
+ open: a,
17
17
  onOpenChange: t,
18
- size: x = "default",
19
- width: a,
18
+ fitViewport: x = !1,
19
+ size: b = "default",
20
+ width: c,
20
21
  minWidth: p,
21
22
  maxWidth: d,
22
- contentClassName: b,
23
- className: w,
23
+ contentClassName: w,
24
+ className: C,
24
25
  footer: n,
25
- trigger: C,
26
- children: G
26
+ trigger: G,
27
+ children: M
27
28
  }) {
28
- const M = D(), { zIndex: r, onOpenChange: j } = F(), I = h ?? M.open, m = c !== void 0, [T, z] = k(!1), L = m ? c : T, O = C ?? /* @__PURE__ */ e(q, { variant: "secondary", children: I }), S = r == null ? void 0 : { zIndex: r }, W = E(() => {
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(a), g = i(p), v = i(d);
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, a, p, d]), A = [
34
+ }, [r, c, p, d]), B = [
34
35
  "gcsa-popover",
35
36
  "gcsa-ui-surface",
36
- x === "lg" ? "gcsa-popover--lg" : void 0,
37
+ b === "lg" ? "gcsa-popover--lg" : void 0,
37
38
  n ? "gcsa-popover--with-footer" : void 0,
38
- b
39
- ].filter(Boolean).join(" "), B = (o) => {
40
- m || z(o), t == null || t(o), j(o);
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: w, children: /* @__PURE__ */ f(
43
+ return /* @__PURE__ */ e("span", { className: C, children: /* @__PURE__ */ f(
43
44
  s.Root,
44
45
  {
45
- open: L,
46
+ open: O,
46
47
  lazyMount: !0,
47
48
  unmountOnExit: !0,
48
- positioning: Z({ placement: _, gutter: P }),
49
- onOpenChange: (o) => B(o.open),
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: O }),
52
- /* @__PURE__ */ e(R, { disabled: !N, children: /* @__PURE__ */ e(s.Positioner, { style: S, children: /* @__PURE__ */ f(s.Content, { className: A, style: W, children: [
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: G }),
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
- $ as GcsaPopover
64
+ oo as GcsaPopover
64
65
  };
65
66
  //# sourceMappingURL=GcsaPopover.js.map
@@ -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":"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"}
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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"}
@@ -1,76 +1,91 @@
1
- import { jsxs as i, jsx as s } from "react/jsx-runtime";
2
- import { useState as g, useMemo as T } from "react";
3
- import { GcsaInput as k } from "./GcsaInput.js";
4
- import { useGcsaLocaleMessages as $ } from "./hooks/useGcsaLocale.js";
5
- function z({
6
- options: u,
7
- value: t = [],
8
- sourceTitle: y,
9
- targetTitle: L,
10
- disabled: l = !1,
11
- onValueChange: m,
12
- onChange: _
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 c = $(), w = y ?? c.transferSourceTitle, x = L ?? c.transferTargetTitle, [d, b] = g([]), [f, N] = g([]), [h, M] = g(""), [p, Q] = g(""), G = T(
15
- () => u.filter(
16
- (e) => !t.includes(e.value) && e.label.toLowerCase().includes(h.trim().toLowerCase())
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
- [u, h, t]
19
- ), I = T(
20
- () => u.filter(
21
- (e) => t.includes(e.value) && e.label.toLowerCase().includes(p.trim().toLowerCase())
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
- [u, p, t]
24
- ), v = (e) => {
25
- m == null || m(e), _ == null || _(e), b([]), N([]);
26
- }, j = (e, n) => {
27
- const r = n === "source" ? d : f, a = r.includes(e) ? r.filter((o) => o !== e) : [...r, e];
28
- n === "source" ? b(a) : N(a);
29
- }, S = (e, n, r) => /* @__PURE__ */ i("section", { className: "gcsa-transfer__panel", "aria-label": n, children: [
30
- /* @__PURE__ */ i("header", { className: "gcsa-transfer__header", children: [
31
- /* @__PURE__ */ s("span", { children: n }),
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
- k,
39
+ K,
36
40
  {
37
- value: r === "source" ? h : p,
38
- placeholder: c.searchPlaceholder,
39
- disabled: l,
40
- onValueChange: r === "source" ? M : Q
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((a) => {
44
- const o = (r === "source" ? d : f).includes(a.value);
45
- return /* @__PURE__ */ i(
46
- "button",
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
- type: "button",
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
- "aria-selected": o,
53
- onClick: () => j(a.value, r),
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", "aria-hidden": "true", children: o ? "✓" : "" }),
56
- /* @__PURE__ */ s("span", { children: a.label })
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
- a.value
74
+ r.value
60
75
  );
61
- }) : /* @__PURE__ */ s("span", { className: "gcsa-transfer__empty", children: c.noOptions }) })
76
+ }) : /* @__PURE__ */ s("span", { className: "gcsa-transfer__empty", children: i.noOptions }) })
62
77
  ] });
63
- return /* @__PURE__ */ i("div", { className: `gcsa-transfer${l ? " gcsa-transfer--disabled" : ""}`, children: [
64
- S(G, w, "source"),
65
- /* @__PURE__ */ i("div", { className: "gcsa-transfer__actions", children: [
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: l || !d.length,
72
- "aria-label": c.transferMoveRight,
73
- onClick: () => v([...t, ...d]),
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: l || !f.length,
83
- "aria-label": c.transferMoveLeft,
84
- onClick: () => v(t.filter((e) => !f.includes(e))),
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
- S(I, x, "target")
104
+ T(R, D, "target")
90
105
  ] });
91
106
  }
92
107
  export {
93
- z as GcsaTransfer
108
+ F as GcsaTransfer
94
109
  };
95
110
  //# sourceMappingURL=GcsaTransfer.js.map
@@ -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 toggle = (key: string, side: 'source' | 'target') => {\n const current = side === 'source' ? sourceSelected : targetSelected;\n const next = current.includes(key) ? current.filter(item => item !== key) : [...current, key];\n if (side === 'source') setSourceSelected(next);\n else setTargetSelected(next);\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 return (\n <button\n key={item.value}\n type=\"button\"\n className={`gcsa-transfer__item gcsa-focus-ring${selected ? ' gcsa-transfer__item--selected' : ''}`}\n disabled={disabled || item.disabled}\n role=\"option\"\n aria-selected={selected}\n onClick={() => toggle(item.value, side)}\n >\n <span className=\"gcsa-transfer__check\" aria-hidden=\"true\">\n {selected ? '✓' : ''}\n </span>\n <span>{item.label}</span>\n </button>\n );\n })\n ) : (\n <span className=\"gcsa-transfer__empty\">{messages.noOptions}</span>\n )}\n </div>\n </section>\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","toggle","key","side","current","panel","items","title","jsxs","jsx","GcsaInput","selected"],"mappings":"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"}
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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"}
@@ -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: "plus" }) }),
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
  ]
@@ -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];
@@ -14,6 +14,7 @@ const e = [
14
14
  "close",
15
15
  "menu",
16
16
  "plus",
17
+ "upload",
17
18
  "resultEmpty"
18
19
  ], t = [...e, ...s];
19
20
  export {