@protonradio/proton-ui 0.11.26 → 0.11.27
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/components/Input/CheckboxInput/CheckboxInput.cjs.js +2 -0
- package/dist/components/Input/CheckboxInput/CheckboxInput.cjs.js.map +1 -0
- package/dist/components/Input/CheckboxInput/CheckboxInput.es.js +83 -0
- package/dist/components/Input/CheckboxInput/CheckboxInput.es.js.map +1 -0
- package/dist/components/Menu/MenuTrigger.cjs.js +1 -1
- package/dist/components/Menu/MenuTrigger.cjs.js.map +1 -1
- package/dist/components/Menu/MenuTrigger.es.js +15 -15
- package/dist/components/Menu/MenuTrigger.es.js.map +1 -1
- package/dist/components/Select/Select.cjs.js +1 -1
- package/dist/components/Select/Select.cjs.js.map +1 -1
- package/dist/components/Select/Select.es.js +9 -9
- package/dist/components/Select/Select.es.js.map +1 -1
- package/dist/components/Table/BaseTable/Collection/CompoundComponents.cjs.js +2 -0
- package/dist/components/Table/BaseTable/Collection/CompoundComponents.cjs.js.map +1 -0
- package/dist/components/Table/BaseTable/Collection/CompoundComponents.es.js +9 -0
- package/dist/components/Table/BaseTable/Collection/CompoundComponents.es.js.map +1 -0
- package/dist/components/Table/BaseTable/Collection/collectionParser.cjs.js +2 -0
- package/dist/components/Table/BaseTable/Collection/collectionParser.cjs.js.map +1 -0
- package/dist/components/Table/BaseTable/Collection/collectionParser.es.js +67 -0
- package/dist/components/Table/BaseTable/Collection/collectionParser.es.js.map +1 -0
- package/dist/components/Table/BaseTable/Collection/useTableCollection.cjs.js +2 -0
- package/dist/components/Table/BaseTable/Collection/useTableCollection.cjs.js.map +1 -0
- package/dist/components/Table/BaseTable/Collection/useTableCollection.es.js +27 -0
- package/dist/components/Table/BaseTable/Collection/useTableCollection.es.js.map +1 -0
- package/dist/components/Table/BaseTable/Table.cjs.js +2 -0
- package/dist/components/Table/BaseTable/Table.cjs.js.map +1 -0
- package/dist/components/Table/BaseTable/Table.es.js +80 -0
- package/dist/components/Table/BaseTable/Table.es.js.map +1 -0
- package/dist/components/Table/BaseTable/elements/TableBody.cjs.js +2 -0
- package/dist/components/Table/BaseTable/elements/TableBody.cjs.js.map +1 -0
- package/dist/components/Table/BaseTable/elements/TableBody.es.js +7 -0
- package/dist/components/Table/BaseTable/elements/TableBody.es.js.map +1 -0
- package/dist/components/Table/BaseTable/elements/TableCell.cjs.js +2 -0
- package/dist/components/Table/BaseTable/elements/TableCell.cjs.js.map +1 -0
- package/dist/components/Table/BaseTable/elements/TableCell.es.js +22 -0
- package/dist/components/Table/BaseTable/elements/TableCell.es.js.map +1 -0
- package/dist/components/Table/BaseTable/elements/TableHeader.cjs.js +2 -0
- package/dist/components/Table/BaseTable/elements/TableHeader.cjs.js.map +1 -0
- package/dist/components/Table/BaseTable/elements/TableHeader.es.js +15 -0
- package/dist/components/Table/BaseTable/elements/TableHeader.es.js.map +1 -0
- package/dist/components/Table/BaseTable/elements/TableHeaderCell.cjs.js +2 -0
- package/dist/components/Table/BaseTable/elements/TableHeaderCell.cjs.js.map +1 -0
- package/dist/components/Table/BaseTable/elements/TableHeaderCell.es.js +23 -0
- package/dist/components/Table/BaseTable/elements/TableHeaderCell.es.js.map +1 -0
- package/dist/components/Table/BaseTable/elements/TableHeaderRow.cjs.js +2 -0
- package/dist/components/Table/BaseTable/elements/TableHeaderRow.cjs.js.map +1 -0
- package/dist/components/Table/BaseTable/elements/TableHeaderRow.es.js +18 -0
- package/dist/components/Table/BaseTable/elements/TableHeaderRow.es.js.map +1 -0
- package/dist/components/Table/BaseTable/elements/TableRoot.cjs.js +2 -0
- package/dist/components/Table/BaseTable/elements/TableRoot.cjs.js.map +1 -0
- package/dist/components/Table/BaseTable/elements/TableRoot.es.js +27 -0
- package/dist/components/Table/BaseTable/elements/TableRoot.es.js.map +1 -0
- package/dist/components/Table/BaseTable/elements/TableRow.cjs.js +2 -0
- package/dist/components/Table/BaseTable/elements/TableRow.cjs.js.map +1 -0
- package/dist/components/Table/BaseTable/elements/TableRow.es.js +26 -0
- package/dist/components/Table/BaseTable/elements/TableRow.es.js.map +1 -0
- package/dist/components/Table/DataTable/DataTable.cjs.js +2 -0
- package/dist/components/Table/DataTable/DataTable.cjs.js.map +1 -0
- package/dist/components/Table/DataTable/DataTable.es.js +140 -0
- package/dist/components/Table/DataTable/DataTable.es.js.map +1 -0
- package/dist/components/Table/DataTable/DataTableRow.cjs.js +2 -0
- package/dist/components/Table/DataTable/DataTableRow.cjs.js.map +1 -0
- package/dist/components/Table/DataTable/DataTableRow.es.js +32 -0
- package/dist/components/Table/DataTable/DataTableRow.es.js.map +1 -0
- package/dist/components/Text/TextEmphasis/TextEmphasis.cjs.js +1 -1
- package/dist/components/Text/TextEmphasis/TextEmphasis.cjs.js.map +1 -1
- package/dist/components/Text/TextEmphasis/TextEmphasis.es.js +14 -14
- package/dist/components/Text/TextEmphasis/TextEmphasis.es.js.map +1 -1
- package/dist/hooks.cjs.js +1 -1
- package/dist/hooks.d.ts +0 -18
- package/dist/hooks.es.js +5 -9
- package/dist/hooks.es.js.map +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.d.ts +322 -240
- package/dist/index.es.js +69 -52
- package/dist/index.es.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/utils/deepEqual.cjs.js +2 -0
- package/dist/utils/deepEqual.cjs.js.map +1 -0
- package/dist/utils/deepEqual.es.js +31 -0
- package/dist/utils/deepEqual.es.js.map +1 -0
- package/dist/utils.cjs.js +1 -1
- package/dist/utils.d.ts +11 -0
- package/dist/utils.es.js +19 -17
- package/dist/utils.es.js.map +1 -1
- package/package.json +1 -1
- package/dist/components/Checkbox/CheckboxInput/CheckboxInput.cjs.js +0 -2
- package/dist/components/Checkbox/CheckboxInput/CheckboxInput.cjs.js.map +0 -1
- package/dist/components/Checkbox/CheckboxInput/CheckboxInput.es.js +0 -94
- package/dist/components/Checkbox/CheckboxInput/CheckboxInput.es.js.map +0 -1
- package/dist/components/Checkbox/CheckboxRadioGroup/CheckboxRadioGroup.cjs.js +0 -2
- package/dist/components/Checkbox/CheckboxRadioGroup/CheckboxRadioGroup.cjs.js.map +0 -1
- package/dist/components/Checkbox/CheckboxRadioGroup/CheckboxRadioGroup.es.js +0 -115
- package/dist/components/Checkbox/CheckboxRadioGroup/CheckboxRadioGroup.es.js.map +0 -1
- package/dist/components/DataTable/DataTable.cjs.js +0 -2
- package/dist/components/DataTable/DataTable.cjs.js.map +0 -1
- package/dist/components/DataTable/DataTable.es.js +0 -137
- package/dist/components/DataTable/DataTable.es.js.map +0 -1
- package/dist/components/Table/Collection/CompoundComponents.cjs.js +0 -2
- package/dist/components/Table/Collection/CompoundComponents.cjs.js.map +0 -1
- package/dist/components/Table/Collection/CompoundComponents.es.js +0 -9
- package/dist/components/Table/Collection/CompoundComponents.es.js.map +0 -1
- package/dist/components/Table/Collection/collectionParser.cjs.js +0 -2
- package/dist/components/Table/Collection/collectionParser.cjs.js.map +0 -1
- package/dist/components/Table/Collection/collectionParser.es.js +0 -54
- package/dist/components/Table/Collection/collectionParser.es.js.map +0 -1
- package/dist/components/Table/Collection/useTableCollection.cjs.js +0 -2
- package/dist/components/Table/Collection/useTableCollection.cjs.js.map +0 -1
- package/dist/components/Table/Collection/useTableCollection.es.js +0 -59
- package/dist/components/Table/Collection/useTableCollection.es.js.map +0 -1
- package/dist/components/Table/Table.cjs.js +0 -2
- package/dist/components/Table/Table.cjs.js.map +0 -1
- package/dist/components/Table/Table.es.js +0 -89
- package/dist/components/Table/Table.es.js.map +0 -1
- package/dist/components/Tooltip/ResponsiveTooltip.cjs.js +0 -2
- package/dist/components/Tooltip/ResponsiveTooltip.cjs.js.map +0 -1
- package/dist/components/Tooltip/ResponsiveTooltip.es.js +0 -68
- package/dist/components/Tooltip/ResponsiveTooltip.es.js.map +0 -1
- package/dist/hooks/useResponsiveDevice.cjs.js +0 -2
- package/dist/hooks/useResponsiveDevice.cjs.js.map +0 -1
- package/dist/hooks/useResponsiveDevice.es.js +0 -14
- package/dist/hooks/useResponsiveDevice.es.js.map +0 -1
- package/dist/hooks/useTouchDevice.cjs.js +0 -2
- package/dist/hooks/useTouchDevice.cjs.js.map +0 -1
- package/dist/hooks/useTouchDevice.es.js +0 -13
- package/dist/hooks/useTouchDevice.es.js.map +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../../../node_modules/react/jsx-runtime.cjs.js"),d=require("react");;/* empty css */const x=require("../../../utils/string.cjs.js"),b=d.forwardRef(({checked:a,defaultChecked:k,onChange:n,name:s,value:v,isDisabled:u=!1,isRequired:p=!1,id:m,"data-testid":I,label:o,description:i,error:t,indeterminate:l=!1},R)=>{const y=d.useRef(null),r=R||y,h=a!==void 0;d.useEffect(()=>{r.current&&(r.current.indeterminate=l)},[l,r]);const _=g=>{n==null||n(g.target.checked)},f=m||`${s}-checkbox`,c=typeof t=="string"?`${s}-error`:void 0,j=typeof i=="string"?`${s}-description`:void 0;return e.jsxRuntimeExports.jsxs("div",{children:[e.jsxRuntimeExports.jsx("div",{className:x.csx(u&&"proton-CheckboxInput--disabled"),children:e.jsxRuntimeExports.jsxs("div",{className:"proton-CheckboxInput__container",children:[typeof o=="string"?e.jsxRuntimeExports.jsx("label",{htmlFor:f,className:"proton-CheckboxInput__label",children:o}):o,e.jsxRuntimeExports.jsx("input",{ref:r,id:f,name:s,type:"checkbox",checked:h?a:void 0,defaultChecked:h?void 0:k,value:v,disabled:u,required:p,onChange:_,className:x.csx("proton-CheckboxInput__input",t&&"proton-CheckboxInput__input--error"),"aria-label":o?void 0:s,"aria-invalid":!!t,"aria-errormessage":c,"aria-describedby":[c,j].filter(Boolean).join(" ")||void 0,"data-testid":I}),typeof i=="string"?e.jsxRuntimeExports.jsxs("div",{id:j,"aria-live":"polite",children:[i,p&&e.jsxRuntimeExports.jsx("span",{"aria-hidden":"true",children:" *"})]}):i]})}),typeof t=="string"?e.jsxRuntimeExports.jsx("div",{role:"alert",className:x.csx("proton-CheckboxInput__error"),id:c,children:t}):t]})});b.displayName="ProtonUICheckboxInput";exports.CheckboxInput=b;
|
|
2
|
+
//# sourceMappingURL=CheckboxInput.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CheckboxInput.cjs.js","sources":["../../../../src/components/Input/CheckboxInput/CheckboxInput.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { forwardRef, useEffect, useRef } from \"react\";\n\nimport { csx } from \"../../../utils\";\nimport \"./CheckboxInput.css\";\n\nexport interface CheckboxInputProps {\n /**\n * Whether the checkbox is checked (controlled mode).\n */\n checked?: boolean;\n\n /**\n * Whether the checkbox is checked by default (uncontrolled mode).\n */\n defaultChecked?: boolean;\n\n /** The error attribute of the checkbox input. */\n error?: React.ReactNode | string;\n\n /** The description attribute of the checkbox input. */\n description?: React.ReactNode | string;\n\n /** The test id attribute of the checkbox input. */\n \"data-testid\"?: string;\n\n /**\n * Callback fired when the checkbox state changes.\n */\n onChange?: (checked: boolean) => void;\n\n /**\n * Whether the checkbox is in an indeterminate state. Used for checkboxes that are neither checked nor unchecked.\n * @default false\n * @external https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/indeterminate\n * @reference @external https://medium.com/indigoag-eng/indeterminate-checkboxes-are-weird-704b246c0f19\n */\n indeterminate?: boolean;\n\n /** The id attribute of the checkbox input. */\n id?: string;\n\n /** Whether the checkbox is disabled. \n * @default false\n */\n isDisabled?: boolean;\n\n /** Whether the checkbox is required. \n * @default false\n */\n isRequired?: boolean;\n\n /** The name attribute of the checkbox input. */\n name: string;\n\n /** The label attribute of the checkbox input. */\n label?: string | React.ReactNode;\n\n /**\n * The value attribute of the checkbox input (for form submission).\n * @external https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/checkbox#value\n */\n value?: string;\n}\n\n/**\n * A checkbox input component with support for labels, descriptions, error states, and controlled/uncontrolled modes.\n *\n * API:\n * - {@link CheckboxInputProps}\n */\nexport const CheckboxInput = forwardRef<HTMLInputElement, CheckboxInputProps>(\n (\n {\n checked: controlledChecked,\n defaultChecked,\n onChange,\n name,\n value,\n isDisabled = false,\n isRequired = false,\n id,\n \"data-testid\": testId,\n label,\n description,\n error,\n indeterminate = false,\n },\n forwardedRef: React.RefObject<HTMLInputElement>\n ) => {\n const checkboxRef = useRef<HTMLInputElement>(null);\n const ref = forwardedRef || checkboxRef;\n const isControlled = controlledChecked !== undefined;\n\n // indeterminate state can only be set via JS\n useEffect(() => {\n if (ref.current) {\n ref.current.indeterminate = indeterminate;\n }\n }, [indeterminate, ref]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(e.target.checked);\n };\n\n const checkboxId = id || `${name}-checkbox`;\n const errorId = typeof error === \"string\" ? `${name}-error` : undefined;\n const descriptionId =\n typeof description === \"string\" ? `${name}-description` : undefined;\n\n return (\n <div>\n <div className={csx(isDisabled && \"proton-CheckboxInput--disabled\")}>\n <div className=\"proton-CheckboxInput__container\">\n {typeof label === \"string\" ? (\n <label\n htmlFor={checkboxId}\n className=\"proton-CheckboxInput__label\"\n >\n {label}\n </label>\n ) : (\n label\n )}\n\n <input\n ref={ref}\n id={checkboxId}\n name={name}\n type=\"checkbox\"\n checked={isControlled ? controlledChecked : undefined}\n defaultChecked={!isControlled ? defaultChecked : undefined}\n value={value}\n disabled={isDisabled}\n required={isRequired}\n onChange={handleChange}\n className={csx(\n \"proton-CheckboxInput__input\",\n error && \"proton-CheckboxInput__input--error\"\n )}\n aria-label={!label ? name : undefined}\n aria-invalid={Boolean(error)}\n aria-errormessage={errorId}\n aria-describedby={\n [errorId, descriptionId].filter(Boolean).join(\" \") || undefined\n }\n data-testid={testId}\n />\n\n {typeof description === \"string\" ? (\n <div id={descriptionId} aria-live=\"polite\">\n {description}\n {isRequired && <span aria-hidden=\"true\"> *</span>}\n </div>\n ) : (\n description\n )}\n </div>\n </div>\n\n {typeof error === \"string\" ? (\n <div\n role=\"alert\"\n className={csx(\"proton-CheckboxInput__error\")}\n id={errorId}\n >\n {error}\n </div>\n ) : (\n error\n )}\n </div>\n );\n }\n);\n\nCheckboxInput.displayName = \"ProtonUICheckboxInput\";\n"],"names":["CheckboxInput","forwardRef","controlledChecked","defaultChecked","onChange","name","value","isDisabled","isRequired","id","testId","label","description","error","indeterminate","forwardedRef","checkboxRef","useRef","ref","isControlled","useEffect","handleChange","e","checkboxId","errorId","descriptionId","jsx","csx","jsxs"],"mappings":"2PAwEaA,EAAgBC,EAAA,WAC3B,CACE,CACE,QAASC,EACT,eAAAC,EACA,SAAAC,EACA,KAAAC,EACA,MAAAC,EACA,WAAAC,EAAa,GACb,WAAAC,EAAa,GACb,GAAAC,EACA,cAAeC,EACf,MAAAC,EACA,YAAAC,EACA,MAAAC,EACA,cAAAC,EAAgB,IAElBC,IACG,CACG,MAAAC,EAAcC,SAAyB,IAAI,EAC3CC,EAAMH,GAAgBC,EACtBG,EAAejB,IAAsB,OAG3CkB,EAAAA,UAAU,IAAM,CACVF,EAAI,UACNA,EAAI,QAAQ,cAAgBJ,EAC9B,EACC,CAACA,EAAeI,CAAG,CAAC,EAEjB,MAAAG,EAAgBC,GAA2C,CACpDlB,GAAA,MAAAA,EAAAkB,EAAE,OAAO,QAAO,EAGvBC,EAAad,GAAM,GAAGJ,CAAI,YAC1BmB,EAAU,OAAOX,GAAU,SAAW,GAAGR,CAAI,SAAW,OACxDoB,EACJ,OAAOb,GAAgB,SAAW,GAAGP,CAAI,eAAiB,OAE5D,gCACG,MACC,CAAA,SAAA,CAACqB,EAAAA,kBAAAA,IAAA,MAAA,CAAI,UAAWC,EAAI,IAAApB,GAAc,gCAAgC,EAChE,SAAAqB,EAAA,kBAAA,KAAC,MAAI,CAAA,UAAU,kCACZ,SAAA,CAAA,OAAOjB,GAAU,SAChBe,EAAA,kBAAA,IAAC,QAAA,CACC,QAASH,EACT,UAAU,8BAET,SAAAZ,CAAA,CAAA,EAGHA,EAGFe,EAAA,kBAAA,IAAC,QAAA,CACC,IAAAR,EACA,GAAIK,EACJ,KAAAlB,EACA,KAAK,WACL,QAASc,EAAejB,EAAoB,OAC5C,eAAiBiB,EAAgC,OAAjBhB,EAChC,MAAAG,EACA,SAAUC,EACV,SAAUC,EACV,SAAUa,EACV,UAAWM,EAAA,IACT,8BACAd,GAAS,oCACX,EACA,aAAaF,EAAe,OAAPN,EACrB,eAAc,EAAQQ,EACtB,oBAAmBW,EACnB,mBACE,CAACA,EAASC,CAAa,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAAK,OAExD,cAAaf,CAAA,CACf,EAEC,OAAOE,GAAgB,SACtBgB,EAAAA,kBAAAA,KAAC,OAAI,GAAIH,EAAe,YAAU,SAC/B,SAAA,CAAAb,EACAJ,GAAckB,EAAA,kBAAA,IAAC,OAAK,CAAA,cAAY,OAAO,SAAO,KAAA,CAAA,CAAA,CACjD,EAEAd,CAAA,CAAA,CAEJ,CACF,CAAA,EAEC,OAAOC,GAAU,SAChBa,EAAA,kBAAA,IAAC,MAAA,CACC,KAAK,QACL,UAAWC,MAAI,6BAA6B,EAC5C,GAAIH,EAEH,SAAAX,CAAA,CAAA,EAGHA,CAEJ,CAAA,CAAA,CAEJ,CACF,EAEAb,EAAc,YAAc"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { j as e } from "../../../node_modules/react/jsx-runtime.es.js";
|
|
2
|
+
import { forwardRef as C, useRef as N, useEffect as g } from "react";
|
|
3
|
+
/* empty css */
|
|
4
|
+
import { csx as n } from "../../../utils/string.es.js";
|
|
5
|
+
const R = C(
|
|
6
|
+
({
|
|
7
|
+
checked: a,
|
|
8
|
+
defaultChecked: b,
|
|
9
|
+
onChange: c,
|
|
10
|
+
name: o,
|
|
11
|
+
value: k,
|
|
12
|
+
isDisabled: p = !1,
|
|
13
|
+
isRequired: l = !1,
|
|
14
|
+
id: v,
|
|
15
|
+
"data-testid": m,
|
|
16
|
+
label: i,
|
|
17
|
+
description: r,
|
|
18
|
+
error: t,
|
|
19
|
+
indeterminate: x = !1
|
|
20
|
+
}, I) => {
|
|
21
|
+
const j = N(null), s = I || j, h = a !== void 0;
|
|
22
|
+
g(() => {
|
|
23
|
+
s.current && (s.current.indeterminate = x);
|
|
24
|
+
}, [x, s]);
|
|
25
|
+
const _ = (y) => {
|
|
26
|
+
c == null || c(y.target.checked);
|
|
27
|
+
}, f = v || `${o}-checkbox`, d = typeof t == "string" ? `${o}-error` : void 0, u = typeof r == "string" ? `${o}-description` : void 0;
|
|
28
|
+
return /* @__PURE__ */ e.jsxs("div", { children: [
|
|
29
|
+
/* @__PURE__ */ e.jsx("div", { className: n(p && "proton-CheckboxInput--disabled"), children: /* @__PURE__ */ e.jsxs("div", { className: "proton-CheckboxInput__container", children: [
|
|
30
|
+
typeof i == "string" ? /* @__PURE__ */ e.jsx(
|
|
31
|
+
"label",
|
|
32
|
+
{
|
|
33
|
+
htmlFor: f,
|
|
34
|
+
className: "proton-CheckboxInput__label",
|
|
35
|
+
children: i
|
|
36
|
+
}
|
|
37
|
+
) : i,
|
|
38
|
+
/* @__PURE__ */ e.jsx(
|
|
39
|
+
"input",
|
|
40
|
+
{
|
|
41
|
+
ref: s,
|
|
42
|
+
id: f,
|
|
43
|
+
name: o,
|
|
44
|
+
type: "checkbox",
|
|
45
|
+
checked: h ? a : void 0,
|
|
46
|
+
defaultChecked: h ? void 0 : b,
|
|
47
|
+
value: k,
|
|
48
|
+
disabled: p,
|
|
49
|
+
required: l,
|
|
50
|
+
onChange: _,
|
|
51
|
+
className: n(
|
|
52
|
+
"proton-CheckboxInput__input",
|
|
53
|
+
t && "proton-CheckboxInput__input--error"
|
|
54
|
+
),
|
|
55
|
+
"aria-label": i ? void 0 : o,
|
|
56
|
+
"aria-invalid": !!t,
|
|
57
|
+
"aria-errormessage": d,
|
|
58
|
+
"aria-describedby": [d, u].filter(Boolean).join(" ") || void 0,
|
|
59
|
+
"data-testid": m
|
|
60
|
+
}
|
|
61
|
+
),
|
|
62
|
+
typeof r == "string" ? /* @__PURE__ */ e.jsxs("div", { id: u, "aria-live": "polite", children: [
|
|
63
|
+
r,
|
|
64
|
+
l && /* @__PURE__ */ e.jsx("span", { "aria-hidden": "true", children: " *" })
|
|
65
|
+
] }) : r
|
|
66
|
+
] }) }),
|
|
67
|
+
typeof t == "string" ? /* @__PURE__ */ e.jsx(
|
|
68
|
+
"div",
|
|
69
|
+
{
|
|
70
|
+
role: "alert",
|
|
71
|
+
className: n("proton-CheckboxInput__error"),
|
|
72
|
+
id: d,
|
|
73
|
+
children: t
|
|
74
|
+
}
|
|
75
|
+
) : t
|
|
76
|
+
] });
|
|
77
|
+
}
|
|
78
|
+
);
|
|
79
|
+
R.displayName = "ProtonUICheckboxInput";
|
|
80
|
+
export {
|
|
81
|
+
R as CheckboxInput
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=CheckboxInput.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CheckboxInput.es.js","sources":["../../../../src/components/Input/CheckboxInput/CheckboxInput.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { forwardRef, useEffect, useRef } from \"react\";\n\nimport { csx } from \"../../../utils\";\nimport \"./CheckboxInput.css\";\n\nexport interface CheckboxInputProps {\n /**\n * Whether the checkbox is checked (controlled mode).\n */\n checked?: boolean;\n\n /**\n * Whether the checkbox is checked by default (uncontrolled mode).\n */\n defaultChecked?: boolean;\n\n /** The error attribute of the checkbox input. */\n error?: React.ReactNode | string;\n\n /** The description attribute of the checkbox input. */\n description?: React.ReactNode | string;\n\n /** The test id attribute of the checkbox input. */\n \"data-testid\"?: string;\n\n /**\n * Callback fired when the checkbox state changes.\n */\n onChange?: (checked: boolean) => void;\n\n /**\n * Whether the checkbox is in an indeterminate state. Used for checkboxes that are neither checked nor unchecked.\n * @default false\n * @external https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/indeterminate\n * @reference @external https://medium.com/indigoag-eng/indeterminate-checkboxes-are-weird-704b246c0f19\n */\n indeterminate?: boolean;\n\n /** The id attribute of the checkbox input. */\n id?: string;\n\n /** Whether the checkbox is disabled. \n * @default false\n */\n isDisabled?: boolean;\n\n /** Whether the checkbox is required. \n * @default false\n */\n isRequired?: boolean;\n\n /** The name attribute of the checkbox input. */\n name: string;\n\n /** The label attribute of the checkbox input. */\n label?: string | React.ReactNode;\n\n /**\n * The value attribute of the checkbox input (for form submission).\n * @external https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/checkbox#value\n */\n value?: string;\n}\n\n/**\n * A checkbox input component with support for labels, descriptions, error states, and controlled/uncontrolled modes.\n *\n * API:\n * - {@link CheckboxInputProps}\n */\nexport const CheckboxInput = forwardRef<HTMLInputElement, CheckboxInputProps>(\n (\n {\n checked: controlledChecked,\n defaultChecked,\n onChange,\n name,\n value,\n isDisabled = false,\n isRequired = false,\n id,\n \"data-testid\": testId,\n label,\n description,\n error,\n indeterminate = false,\n },\n forwardedRef: React.RefObject<HTMLInputElement>\n ) => {\n const checkboxRef = useRef<HTMLInputElement>(null);\n const ref = forwardedRef || checkboxRef;\n const isControlled = controlledChecked !== undefined;\n\n // indeterminate state can only be set via JS\n useEffect(() => {\n if (ref.current) {\n ref.current.indeterminate = indeterminate;\n }\n }, [indeterminate, ref]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange?.(e.target.checked);\n };\n\n const checkboxId = id || `${name}-checkbox`;\n const errorId = typeof error === \"string\" ? `${name}-error` : undefined;\n const descriptionId =\n typeof description === \"string\" ? `${name}-description` : undefined;\n\n return (\n <div>\n <div className={csx(isDisabled && \"proton-CheckboxInput--disabled\")}>\n <div className=\"proton-CheckboxInput__container\">\n {typeof label === \"string\" ? (\n <label\n htmlFor={checkboxId}\n className=\"proton-CheckboxInput__label\"\n >\n {label}\n </label>\n ) : (\n label\n )}\n\n <input\n ref={ref}\n id={checkboxId}\n name={name}\n type=\"checkbox\"\n checked={isControlled ? controlledChecked : undefined}\n defaultChecked={!isControlled ? defaultChecked : undefined}\n value={value}\n disabled={isDisabled}\n required={isRequired}\n onChange={handleChange}\n className={csx(\n \"proton-CheckboxInput__input\",\n error && \"proton-CheckboxInput__input--error\"\n )}\n aria-label={!label ? name : undefined}\n aria-invalid={Boolean(error)}\n aria-errormessage={errorId}\n aria-describedby={\n [errorId, descriptionId].filter(Boolean).join(\" \") || undefined\n }\n data-testid={testId}\n />\n\n {typeof description === \"string\" ? (\n <div id={descriptionId} aria-live=\"polite\">\n {description}\n {isRequired && <span aria-hidden=\"true\"> *</span>}\n </div>\n ) : (\n description\n )}\n </div>\n </div>\n\n {typeof error === \"string\" ? (\n <div\n role=\"alert\"\n className={csx(\"proton-CheckboxInput__error\")}\n id={errorId}\n >\n {error}\n </div>\n ) : (\n error\n )}\n </div>\n );\n }\n);\n\nCheckboxInput.displayName = \"ProtonUICheckboxInput\";\n"],"names":["CheckboxInput","forwardRef","controlledChecked","defaultChecked","onChange","name","value","isDisabled","isRequired","id","testId","label","description","error","indeterminate","forwardedRef","checkboxRef","useRef","ref","isControlled","useEffect","handleChange","e","checkboxId","errorId","descriptionId","jsx","csx","jsxs"],"mappings":";;;;AAwEO,MAAMA,IAAgBC;AAAA,EAC3B,CACE;AAAA,IACE,SAASC;AAAA,IACT,gBAAAC;AAAA,IACA,UAAAC;AAAA,IACA,MAAAC;AAAA,IACA,OAAAC;AAAA,IACA,YAAAC,IAAa;AAAA,IACb,YAAAC,IAAa;AAAA,IACb,IAAAC;AAAA,IACA,eAAeC;AAAA,IACf,OAAAC;AAAA,IACA,aAAAC;AAAA,IACA,OAAAC;AAAA,IACA,eAAAC,IAAgB;AAAA,KAElBC,MACG;AACG,UAAAC,IAAcC,EAAyB,IAAI,GAC3CC,IAAMH,KAAgBC,GACtBG,IAAejB,MAAsB;AAG3C,IAAAkB,EAAU,MAAM;AACd,MAAIF,EAAI,YACNA,EAAI,QAAQ,gBAAgBJ;AAAA,IAC9B,GACC,CAACA,GAAeI,CAAG,CAAC;AAEjB,UAAAG,IAAe,CAACC,MAA2C;AACpD,MAAAlB,KAAA,QAAAA,EAAAkB,EAAE,OAAO;AAAA,IAAO,GAGvBC,IAAad,KAAM,GAAGJ,CAAI,aAC1BmB,IAAU,OAAOX,KAAU,WAAW,GAAGR,CAAI,WAAW,QACxDoB,IACJ,OAAOb,KAAgB,WAAW,GAAGP,CAAI,iBAAiB;AAE5D,kCACG,OACC,EAAA,UAAA;AAAA,MAACqB,gBAAAA,EAAAA,IAAA,OAAA,EAAI,WAAWC,EAAIpB,KAAc,gCAAgC,GAChE,UAAAqB,gBAAAA,EAAA,KAAC,OAAI,EAAA,WAAU,mCACZ,UAAA;AAAA,QAAA,OAAOjB,KAAU,WAChBe,gBAAAA,EAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAASH;AAAA,YACT,WAAU;AAAA,YAET,UAAAZ;AAAA,UAAA;AAAA,QAAA,IAGHA;AAAA,QAGFe,gBAAAA,EAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAAR;AAAA,YACA,IAAIK;AAAA,YACJ,MAAAlB;AAAA,YACA,MAAK;AAAA,YACL,SAASc,IAAejB,IAAoB;AAAA,YAC5C,gBAAiBiB,IAAgC,SAAjBhB;AAAA,YAChC,OAAAG;AAAA,YACA,UAAUC;AAAA,YACV,UAAUC;AAAA,YACV,UAAUa;AAAA,YACV,WAAWM;AAAA,cACT;AAAA,cACAd,KAAS;AAAA,YACX;AAAA,YACA,cAAaF,IAAe,SAAPN;AAAA,YACrB,gBAAc,EAAQQ;AAAA,YACtB,qBAAmBW;AAAA,YACnB,oBACE,CAACA,GAASC,CAAa,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,KAAK;AAAA,YAExD,eAAaf;AAAA,UAAA;AAAA,QACf;AAAA,QAEC,OAAOE,KAAgB,WACtBgB,gBAAAA,EAAAA,KAAC,SAAI,IAAIH,GAAe,aAAU,UAC/B,UAAA;AAAA,UAAAb;AAAA,UACAJ,KAAckB,gBAAAA,EAAA,IAAC,QAAK,EAAA,eAAY,QAAO,UAAO,MAAA;AAAA,QAAA,EAAA,CACjD,IAEAd;AAAA,MAAA,EAAA,CAEJ,EACF,CAAA;AAAA,MAEC,OAAOC,KAAU,WAChBa,gBAAAA,EAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAWC,EAAI,6BAA6B;AAAA,UAC5C,IAAIH;AAAA,UAEH,UAAAX;AAAA,QAAA;AAAA,MAAA,IAGHA;AAAA,IAEJ,EAAA,CAAA;AAAA,EAEJ;AACF;AAEAb,EAAc,cAAc;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../../node_modules/react/jsx-runtime.cjs.js"),c=require("react"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../../node_modules/react/jsx-runtime.cjs.js"),c=require("react"),q=require("../../hooks/useBreakpoint.cjs.js"),v=require("../ActionMenu/ActionMenu.cjs.js"),B=require("./PopoverMenu.cjs.js");;/* empty css */;/* empty css */const T=require("../../constants/breakpoint.cjs.js");function b({renderTrigger:r,size:f=24,title:x,items:p,disabled:a,onClose:i,triggerTestId:R="MenuTrigger-Trigger",menuTestId:E,onSelectionChange:o,selectedKey:u,disabledKeys:g}){const d=q.useBreakpoint(T.BREAKPOINTS.SMALL),[s,n]=c.useState(!1),h=c.useRef(null),m=c.useMemo(()=>p.map(t=>({...t,id:t.key})),[p]),j=t=>{o==null||o(t),n(!1)},l=r?r({isOpen:s,disabled:a,setIsOpen:n}):e.jsxRuntimeExports.jsx("button",{"data-testid":R,disabled:a,className:"proton-MenuTrigger__button",ref:h,onClick:()=>n(!s),type:"button",children:e.jsxRuntimeExports.jsx(k,{size:f})});return d?e.jsxRuntimeExports.jsxs(e.jsxRuntimeExports.Fragment,{children:[l,s&&e.jsxRuntimeExports.jsx(v.ActionMenu,{actions:m,title:x,isOpen:s,onClose:()=>{n(!1),i==null||i()},showCancel:!0,"data-testid":E,selectionMode:"single",onSelectionChange:t=>{const M=Array.from(t)[0];M&&j(M)},selectedKeys:u?[u]:void 0,disabledKeys:g})]}):e.jsxRuntimeExports.jsx(B.PopoverMenu,{trigger:l,items:m,isOpen:s,onOpenChange:n,selectedKey:u,onSelectionChange:j,disabledKeys:g,title:x})}const k=({size:r})=>e.jsxRuntimeExports.jsx("svg",{viewBox:"0 0 24 24",width:r,height:r,children:e.jsxRuntimeExports.jsx("path",{fill:"currentColor",d:"M4 14c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm8 0c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm8 0c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z"})});exports.MenuTrigger=b;
|
|
2
2
|
//# sourceMappingURL=MenuTrigger.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MenuTrigger.cjs.js","sources":["../../../src/components/Menu/MenuTrigger.tsx"],"sourcesContent":["\"use client\";\n\nimport { ReactNode, useMemo, useRef, useState } from \"react\";\n\nimport { BREAKPOINTS } from \"../../constants\";\nimport {
|
|
1
|
+
{"version":3,"file":"MenuTrigger.cjs.js","sources":["../../../src/components/Menu/MenuTrigger.tsx"],"sourcesContent":["\"use client\";\n\nimport { ReactNode, useMemo, useRef, useState } from \"react\";\n\nimport { BREAKPOINTS } from \"../../constants\";\nimport { useBreakpoint } from \"../../hooks/useBreakpoint\";\nimport { ActionMenu, ActionMenuAction } from \"../ActionMenu/ActionMenu\";\nimport { PopoverMenu } from \"./PopoverMenu\";\n\nimport \"./MenuTrigger.css\";\nimport \"./Menu.css\";\n\nexport interface MenuTriggerProps {\n disabled?: boolean;\n isOpen?: boolean;\n setIsOpen: (isOpen: boolean) => void;\n}\n\nexport interface MenuProps {\n /** Custom trigger component. If not provided, defaults to ellipsis icon.\n * - @prop triggerProps {@link TriggerProps}\n */\n renderTrigger?: (triggerProps: MenuTriggerProps) => ReactNode;\n\n /** Size of the trigger icon\n * @default 24\n */\n size?: number;\n\n /** Title of the parent menu */\n title?: string;\n\n /** Array of menu actions/items to display\n * - type {@link ActionMenuAction}[]\n */\n items: ActionMenuAction[];\n\n /** Whether the menu is disabled\n * @default false\n */\n disabled?: boolean;\n\n /** Callback when the menu closes */\n onClose?: () => void;\n\n /** Test ID for the trigger button */\n triggerTestId?: string;\n\n /** Test ID for the menu */\n menuTestId?: string;\n\n /** Callback when the selection changes */\n onSelectionChange?: (key: string) => void;\n\n /** The key of the selected item */\n selectedKey?: string;\n\n /** The keys of the disabled items */\n disabledKeys?: string[];\n}\n\n/**\n * An uncontrolled component that displays either a popover menu or an action menu\n * depending on the screen size when the menu trigger is pressed.\n *\n * API:\n * - {@link MenuProps}\n */\nexport function MenuTrigger({\n renderTrigger,\n size = 24,\n title,\n items,\n disabled,\n onClose,\n triggerTestId = \"MenuTrigger-Trigger\",\n menuTestId,\n onSelectionChange,\n selectedKey,\n disabledKeys,\n}: MenuProps) {\n const isMobile = useBreakpoint(BREAKPOINTS.SMALL);\n const [isOpen, setIsOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n\n const menuItems = useMemo(\n () => items.map((item) => ({ ...item, id: item.key })),\n [items]\n );\n\n const handleSelectionChange = (key: string) => {\n onSelectionChange?.(key);\n setIsOpen(false);\n };\n\n const triggerButton = renderTrigger ? (\n renderTrigger({\n isOpen,\n disabled,\n setIsOpen,\n })\n ) : (\n <button\n data-testid={triggerTestId}\n disabled={disabled}\n className=\"proton-MenuTrigger__button\"\n ref={triggerRef}\n onClick={() => setIsOpen(!isOpen)}\n type=\"button\"\n >\n <EllipsisIcon size={size} />\n </button>\n );\n\n if (isMobile) {\n return (\n <>\n {triggerButton}\n {isOpen && (\n <ActionMenu\n actions={menuItems}\n title={title}\n isOpen={isOpen}\n onClose={() => {\n setIsOpen(false);\n onClose?.();\n }}\n showCancel\n data-testid={menuTestId}\n selectionMode=\"single\"\n onSelectionChange={(keys) => {\n const nextKey = Array.from(keys)[0];\n if (nextKey) handleSelectionChange(nextKey as string);\n }}\n selectedKeys={selectedKey ? [selectedKey] : undefined}\n disabledKeys={disabledKeys}\n />\n )}\n </>\n );\n }\n\n return (\n <PopoverMenu\n trigger={triggerButton}\n items={menuItems}\n isOpen={isOpen}\n onOpenChange={setIsOpen}\n selectedKey={selectedKey}\n onSelectionChange={handleSelectionChange}\n disabledKeys={disabledKeys}\n title={title}\n />\n );\n}\n\nconst EllipsisIcon = ({ size }: { size: number }) => (\n <svg viewBox=\"0 0 24 24\" width={size} height={size}>\n <path\n fill=\"currentColor\"\n d=\"M4 14c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm8 0c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm8 0c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\"\n />\n </svg>\n);\n"],"names":["MenuTrigger","renderTrigger","size","title","items","disabled","onClose","triggerTestId","menuTestId","onSelectionChange","selectedKey","disabledKeys","isMobile","useBreakpoint","BREAKPOINTS","isOpen","setIsOpen","useState","triggerRef","useRef","menuItems","useMemo","item","handleSelectionChange","key","triggerButton","jsx","EllipsisIcon","jsxs","Fragment","ActionMenu","keys","nextKey","PopoverMenu"],"mappings":"qZAoEO,SAASA,EAAY,CAC1B,cAAAC,EACA,KAAAC,EAAO,GACP,MAAAC,EACA,MAAAC,EACA,SAAAC,EACA,QAAAC,EACA,cAAAC,EAAgB,sBAChB,WAAAC,EACA,kBAAAC,EACA,YAAAC,EACA,aAAAC,CACF,EAAc,CACN,MAAAC,EAAWC,EAAAA,cAAcC,EAAA,YAAY,KAAK,EAC1C,CAACC,EAAQC,CAAS,EAAIC,WAAS,EAAK,EACpCC,EAAaC,SAA0B,IAAI,EAE3CC,EAAYC,EAAA,QAChB,IAAMjB,EAAM,IAAKkB,IAAU,CAAE,GAAGA,EAAM,GAAIA,EAAK,GAAA,EAAM,EACrD,CAAClB,CAAK,CAAA,EAGFmB,EAAyBC,GAAgB,CAC7Cf,GAAA,MAAAA,EAAoBe,GACpBR,EAAU,EAAK,CAAA,EAGXS,EAAgBxB,EACpBA,EAAc,CACZ,OAAAc,EACA,SAAAV,EACA,UAAAW,CACD,CAAA,EAEDU,EAAA,kBAAA,IAAC,SAAA,CACC,cAAanB,EACb,SAAAF,EACA,UAAU,6BACV,IAAKa,EACL,QAAS,IAAMF,EAAU,CAACD,CAAM,EAChC,KAAK,SAEL,SAAAW,EAAA,kBAAA,IAACC,GAAa,KAAAzB,CAAY,CAAA,CAAA,CAAA,EAI9B,OAAIU,EAGGgB,EAAA,kBAAA,KAAAC,6BAAA,CAAA,SAAA,CAAAJ,EACAV,GACCW,EAAA,kBAAA,IAACI,EAAA,WAAA,CACC,QAASV,EACT,MAAAjB,EACA,OAAAY,EACA,QAAS,IAAM,CACbC,EAAU,EAAK,EACLV,GAAA,MAAAA,GACZ,EACA,WAAU,GACV,cAAaE,EACb,cAAc,SACd,kBAAoBuB,GAAS,CAC3B,MAAMC,EAAU,MAAM,KAAKD,CAAI,EAAE,CAAC,EAC9BC,KAA+BA,CAAiB,CACtD,EACA,aAActB,EAAc,CAACA,CAAW,EAAI,OAC5C,aAAAC,CAAA,CACF,CAEJ,CAAA,CAAA,EAKFe,EAAA,kBAAA,IAACO,EAAA,YAAA,CACC,QAASR,EACT,MAAOL,EACP,OAAAL,EACA,aAAcC,EACd,YAAAN,EACA,kBAAmBa,EACnB,aAAAZ,EACA,MAAAR,CAAA,CAAA,CAGN,CAEA,MAAMwB,EAAe,CAAC,CAAE,KAAAzB,CACtB,IAAAwB,EAAA,kBAAA,IAAC,MAAI,CAAA,QAAQ,YAAY,MAAOxB,EAAM,OAAQA,EAC5C,SAAAwB,EAAA,kBAAA,IAAC,OAAA,CACC,KAAK,eACL,EAAE,mJAAA,CACJ,EACF"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { j as t } from "../../node_modules/react/jsx-runtime.es.js";
|
|
2
|
-
import { useState as
|
|
3
|
-
import {
|
|
4
|
-
import { ActionMenu as
|
|
5
|
-
import { PopoverMenu as
|
|
2
|
+
import { useState as A, useRef as B, useMemo as I } from "react";
|
|
3
|
+
import { useBreakpoint as O } from "../../hooks/useBreakpoint.es.js";
|
|
4
|
+
import { ActionMenu as R } from "../ActionMenu/ActionMenu.es.js";
|
|
5
|
+
import { PopoverMenu as T } from "./PopoverMenu.es.js";
|
|
6
6
|
/* empty css */
|
|
7
7
|
/* empty css */
|
|
8
|
-
import { BREAKPOINTS as
|
|
8
|
+
import { BREAKPOINTS as k } from "../../constants/breakpoint.es.js";
|
|
9
9
|
function _({
|
|
10
10
|
renderTrigger: e,
|
|
11
11
|
size: M = 24,
|
|
@@ -17,9 +17,9 @@ function _({
|
|
|
17
17
|
menuTestId: j,
|
|
18
18
|
onSelectionChange: i,
|
|
19
19
|
selectedKey: m,
|
|
20
|
-
disabledKeys:
|
|
20
|
+
disabledKeys: a
|
|
21
21
|
}) {
|
|
22
|
-
const d = O(
|
|
22
|
+
const d = O(k.SMALL), [o, s] = A(!1), v = B(null), f = I(
|
|
23
23
|
() => u.map((r) => ({ ...r, id: r.key })),
|
|
24
24
|
[u]
|
|
25
25
|
), g = (r) => {
|
|
@@ -37,15 +37,15 @@ function _({
|
|
|
37
37
|
ref: v,
|
|
38
38
|
onClick: () => s(!o),
|
|
39
39
|
type: "button",
|
|
40
|
-
children: /* @__PURE__ */ t.jsx(
|
|
40
|
+
children: /* @__PURE__ */ t.jsx(w, { size: M })
|
|
41
41
|
}
|
|
42
42
|
);
|
|
43
43
|
return d ? /* @__PURE__ */ t.jsxs(t.Fragment, { children: [
|
|
44
44
|
l,
|
|
45
45
|
o && /* @__PURE__ */ t.jsx(
|
|
46
|
-
|
|
46
|
+
R,
|
|
47
47
|
{
|
|
48
|
-
actions:
|
|
48
|
+
actions: f,
|
|
49
49
|
title: c,
|
|
50
50
|
isOpen: o,
|
|
51
51
|
onClose: () => {
|
|
@@ -59,24 +59,24 @@ function _({
|
|
|
59
59
|
x && g(x);
|
|
60
60
|
},
|
|
61
61
|
selectedKeys: m ? [m] : void 0,
|
|
62
|
-
disabledKeys:
|
|
62
|
+
disabledKeys: a
|
|
63
63
|
}
|
|
64
64
|
)
|
|
65
65
|
] }) : /* @__PURE__ */ t.jsx(
|
|
66
|
-
|
|
66
|
+
T,
|
|
67
67
|
{
|
|
68
68
|
trigger: l,
|
|
69
|
-
items:
|
|
69
|
+
items: f,
|
|
70
70
|
isOpen: o,
|
|
71
71
|
onOpenChange: s,
|
|
72
72
|
selectedKey: m,
|
|
73
73
|
onSelectionChange: g,
|
|
74
|
-
disabledKeys:
|
|
74
|
+
disabledKeys: a,
|
|
75
75
|
title: c
|
|
76
76
|
}
|
|
77
77
|
);
|
|
78
78
|
}
|
|
79
|
-
const
|
|
79
|
+
const w = ({ size: e }) => /* @__PURE__ */ t.jsx("svg", { viewBox: "0 0 24 24", width: e, height: e, children: /* @__PURE__ */ t.jsx(
|
|
80
80
|
"path",
|
|
81
81
|
{
|
|
82
82
|
fill: "currentColor",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MenuTrigger.es.js","sources":["../../../src/components/Menu/MenuTrigger.tsx"],"sourcesContent":["\"use client\";\n\nimport { ReactNode, useMemo, useRef, useState } from \"react\";\n\nimport { BREAKPOINTS } from \"../../constants\";\nimport {
|
|
1
|
+
{"version":3,"file":"MenuTrigger.es.js","sources":["../../../src/components/Menu/MenuTrigger.tsx"],"sourcesContent":["\"use client\";\n\nimport { ReactNode, useMemo, useRef, useState } from \"react\";\n\nimport { BREAKPOINTS } from \"../../constants\";\nimport { useBreakpoint } from \"../../hooks/useBreakpoint\";\nimport { ActionMenu, ActionMenuAction } from \"../ActionMenu/ActionMenu\";\nimport { PopoverMenu } from \"./PopoverMenu\";\n\nimport \"./MenuTrigger.css\";\nimport \"./Menu.css\";\n\nexport interface MenuTriggerProps {\n disabled?: boolean;\n isOpen?: boolean;\n setIsOpen: (isOpen: boolean) => void;\n}\n\nexport interface MenuProps {\n /** Custom trigger component. If not provided, defaults to ellipsis icon.\n * - @prop triggerProps {@link TriggerProps}\n */\n renderTrigger?: (triggerProps: MenuTriggerProps) => ReactNode;\n\n /** Size of the trigger icon\n * @default 24\n */\n size?: number;\n\n /** Title of the parent menu */\n title?: string;\n\n /** Array of menu actions/items to display\n * - type {@link ActionMenuAction}[]\n */\n items: ActionMenuAction[];\n\n /** Whether the menu is disabled\n * @default false\n */\n disabled?: boolean;\n\n /** Callback when the menu closes */\n onClose?: () => void;\n\n /** Test ID for the trigger button */\n triggerTestId?: string;\n\n /** Test ID for the menu */\n menuTestId?: string;\n\n /** Callback when the selection changes */\n onSelectionChange?: (key: string) => void;\n\n /** The key of the selected item */\n selectedKey?: string;\n\n /** The keys of the disabled items */\n disabledKeys?: string[];\n}\n\n/**\n * An uncontrolled component that displays either a popover menu or an action menu\n * depending on the screen size when the menu trigger is pressed.\n *\n * API:\n * - {@link MenuProps}\n */\nexport function MenuTrigger({\n renderTrigger,\n size = 24,\n title,\n items,\n disabled,\n onClose,\n triggerTestId = \"MenuTrigger-Trigger\",\n menuTestId,\n onSelectionChange,\n selectedKey,\n disabledKeys,\n}: MenuProps) {\n const isMobile = useBreakpoint(BREAKPOINTS.SMALL);\n const [isOpen, setIsOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n\n const menuItems = useMemo(\n () => items.map((item) => ({ ...item, id: item.key })),\n [items]\n );\n\n const handleSelectionChange = (key: string) => {\n onSelectionChange?.(key);\n setIsOpen(false);\n };\n\n const triggerButton = renderTrigger ? (\n renderTrigger({\n isOpen,\n disabled,\n setIsOpen,\n })\n ) : (\n <button\n data-testid={triggerTestId}\n disabled={disabled}\n className=\"proton-MenuTrigger__button\"\n ref={triggerRef}\n onClick={() => setIsOpen(!isOpen)}\n type=\"button\"\n >\n <EllipsisIcon size={size} />\n </button>\n );\n\n if (isMobile) {\n return (\n <>\n {triggerButton}\n {isOpen && (\n <ActionMenu\n actions={menuItems}\n title={title}\n isOpen={isOpen}\n onClose={() => {\n setIsOpen(false);\n onClose?.();\n }}\n showCancel\n data-testid={menuTestId}\n selectionMode=\"single\"\n onSelectionChange={(keys) => {\n const nextKey = Array.from(keys)[0];\n if (nextKey) handleSelectionChange(nextKey as string);\n }}\n selectedKeys={selectedKey ? [selectedKey] : undefined}\n disabledKeys={disabledKeys}\n />\n )}\n </>\n );\n }\n\n return (\n <PopoverMenu\n trigger={triggerButton}\n items={menuItems}\n isOpen={isOpen}\n onOpenChange={setIsOpen}\n selectedKey={selectedKey}\n onSelectionChange={handleSelectionChange}\n disabledKeys={disabledKeys}\n title={title}\n />\n );\n}\n\nconst EllipsisIcon = ({ size }: { size: number }) => (\n <svg viewBox=\"0 0 24 24\" width={size} height={size}>\n <path\n fill=\"currentColor\"\n d=\"M4 14c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm8 0c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm8 0c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z\"\n />\n </svg>\n);\n"],"names":["MenuTrigger","renderTrigger","size","title","items","disabled","onClose","triggerTestId","menuTestId","onSelectionChange","selectedKey","disabledKeys","isMobile","useBreakpoint","BREAKPOINTS","isOpen","setIsOpen","useState","triggerRef","useRef","menuItems","useMemo","item","handleSelectionChange","key","triggerButton","jsx","EllipsisIcon","jsxs","Fragment","ActionMenu","keys","nextKey","PopoverMenu"],"mappings":";;;;;;;;AAoEO,SAASA,EAAY;AAAA,EAC1B,eAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,eAAAC,IAAgB;AAAA,EAChB,YAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,cAAAC;AACF,GAAc;AACN,QAAAC,IAAWC,EAAcC,EAAY,KAAK,GAC1C,CAACC,GAAQC,CAAS,IAAIC,EAAS,EAAK,GACpCC,IAAaC,EAA0B,IAAI,GAE3CC,IAAYC;AAAA,IAChB,MAAMjB,EAAM,IAAI,CAACkB,OAAU,EAAE,GAAGA,GAAM,IAAIA,EAAK,IAAA,EAAM;AAAA,IACrD,CAAClB,CAAK;AAAA,EAAA,GAGFmB,IAAwB,CAACC,MAAgB;AAC7C,IAAAf,KAAA,QAAAA,EAAoBe,IACpBR,EAAU,EAAK;AAAA,EAAA,GAGXS,IAAgBxB,IACpBA,EAAc;AAAA,IACZ,QAAAc;AAAA,IACA,UAAAV;AAAA,IACA,WAAAW;AAAA,EACD,CAAA,IAEDU,gBAAAA,EAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,eAAanB;AAAA,MACb,UAAAF;AAAA,MACA,WAAU;AAAA,MACV,KAAKa;AAAA,MACL,SAAS,MAAMF,EAAU,CAACD,CAAM;AAAA,MAChC,MAAK;AAAA,MAEL,UAAAW,gBAAAA,EAAA,IAACC,KAAa,MAAAzB,EAAY,CAAA;AAAA,IAAA;AAAA,EAAA;AAI9B,SAAIU,IAGGgB,gBAAAA,EAAA,KAAAC,YAAA,EAAA,UAAA;AAAA,IAAAJ;AAAA,IACAV,KACCW,gBAAAA,EAAA;AAAA,MAACI;AAAA,MAAA;AAAA,QACC,SAASV;AAAA,QACT,OAAAjB;AAAA,QACA,QAAAY;AAAA,QACA,SAAS,MAAM;AACb,UAAAC,EAAU,EAAK,GACLV,KAAA,QAAAA;AAAA,QACZ;AAAA,QACA,YAAU;AAAA,QACV,eAAaE;AAAA,QACb,eAAc;AAAA,QACd,mBAAmB,CAACuB,MAAS;AAC3B,gBAAMC,IAAU,MAAM,KAAKD,CAAI,EAAE,CAAC;AAC9B,UAAAC,OAA+BA,CAAiB;AAAA,QACtD;AAAA,QACA,cAActB,IAAc,CAACA,CAAW,IAAI;AAAA,QAC5C,cAAAC;AAAA,MAAA;AAAA,IACF;AAAA,EAEJ,EAAA,CAAA,IAKFe,gBAAAA,EAAA;AAAA,IAACO;AAAA,IAAA;AAAA,MACC,SAASR;AAAA,MACT,OAAOL;AAAA,MACP,QAAAL;AAAA,MACA,cAAcC;AAAA,MACd,aAAAN;AAAA,MACA,mBAAmBa;AAAA,MACnB,cAAAZ;AAAA,MACA,OAAAR;AAAA,IAAA;AAAA,EAAA;AAGN;AAEA,MAAMwB,IAAe,CAAC,EAAE,MAAAzB,EACtB,MAAAwB,gBAAAA,EAAA,IAAC,OAAI,EAAA,SAAQ,aAAY,OAAOxB,GAAM,QAAQA,GAC5C,UAAAwB,gBAAAA,EAAA;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,MAAK;AAAA,IACL,GAAE;AAAA,EAAA;AACJ,GACF;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../../node_modules/react/jsx-runtime.cjs.js"),a=require("react"),n=require("radix-ui"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../../node_modules/react/jsx-runtime.cjs.js"),a=require("react"),n=require("radix-ui"),T=require("../../hooks/useBreakpoint.cjs.js"),P=require("../ActionMenu/ActionMenu.cjs.js");;/* empty css */;/* empty css */const A=require("../ThemeProvider.cjs.js"),m=require("../../utils/string.cjs.js"),C=require("../../constants/breakpoint.cjs.js"),E=a.forwardRef(({disabled:r,isOpen:i,children:o,onClick:l,isRounded:s,...x},h)=>e.jsxRuntimeExports.jsx("button",{...x,ref:h,disabled:r,onClick:l,className:m.csx("proton-Select__trigger",r&&"proton-Select__trigger--disabled",!i&&"proton-Select__trigger--closed",i&&"proton-Select__trigger--opened",s&&"proton-Select__trigger--rounded"),children:o}));E.displayName="ProtonUISelectButton";function k({label:r,name:i,isDisabled:o,disabledKeys:l,selectedKey:s,onSelectionChange:x,defaultSelectedKey:h,onOpen:S,onClose:R,items:_,isRounded:g=!1,"data-testid":f}){const[c,p]=a.useState(!1),[I,v]=a.useState(s||h||""),{className:M,style:q}=A.useTheme(),w=T.useBreakpoint(C.BREAKPOINTS.MEDIUM),N=a.useRef(null),u=a.useRef(null),d=s!==void 0?s:I,j=_.find(t=>t.key===d),b=t=>{s===void 0&&v(t),x==null||x(t),u.current&&(u.current.value=t,u.current.dispatchEvent(new Event("change",{bubbles:!0})))},y=t=>{p(t),t?S==null||S():R==null||R()};a.useEffect(()=>{s!==void 0&&v(s)},[s]);const B=_.map(t=>({key:t.key,label:t.label,to:t.to,onAction:()=>{b(t.key),p(!1)}}));return w?e.jsxRuntimeExports.jsxs("div",{className:"proton-Select","aria-label":r||i,"aria-disabled":o,children:[r&&e.jsxRuntimeExports.jsx("div",{className:"proton-Select__label","data-testid":"select-label",children:r}),e.jsxRuntimeExports.jsx("input",{ref:u,type:"hidden",name:i,value:d,"data-testid":"hidden-select-container"}),e.jsxRuntimeExports.jsxs(E,{isOpen:c,isRounded:g,ref:N,disabled:o,"data-testid":f,onClick:()=>p(!0),children:[e.jsxRuntimeExports.jsx("div",{className:"proton-Select__value",children:j?j.label:"Select an option"}),e.jsxRuntimeExports.jsx("div",{className:m.csx("proton-Select__trigger_icon",c&&"proton-Select__trigger_icon--flipped"),"aria-hidden":"true",children:e.jsxRuntimeExports.jsxs("svg",{id:"caret-down",viewBox:"0 0 512 512",children:[e.jsxRuntimeExports.jsx("title",{children:c?"caret down":"caret up"}),e.jsxRuntimeExports.jsx("path",{fill:"currentColor",d:"M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7L86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z"})]})})]}),e.jsxRuntimeExports.jsx(P.ActionMenu,{isOpen:c,onClose:()=>p(!1),actions:B,selectedKeys:[d],disabledKeys:l})]}):e.jsxRuntimeExports.jsxs("div",{className:"proton-Select","aria-label":r||i,"aria-disabled":o,children:[r&&e.jsxRuntimeExports.jsx("div",{className:"proton-Select__label","data-testid":"select-label",children:r}),e.jsxRuntimeExports.jsx("input",{ref:u,type:"hidden",name:i,value:d,"data-testid":"hidden-select-container"}),e.jsxRuntimeExports.jsxs(n.Select.Root,{value:d,onValueChange:b,onOpenChange:y,disabled:o,children:[e.jsxRuntimeExports.jsx(n.Select.Trigger,{asChild:!0,children:e.jsxRuntimeExports.jsxs(E,{isRounded:g,isOpen:c,ref:N,disabled:o,"data-testid":f,children:[e.jsxRuntimeExports.jsx(n.Select.Value,{className:"proton-Select__value",placeholder:"Select an option",children:j?j.label:"Select an option"}),e.jsxRuntimeExports.jsx(n.Select.Icon,{asChild:!0,children:e.jsxRuntimeExports.jsx("div",{className:m.csx("proton-Select__trigger_icon",c&&"proton-Select__trigger_icon--flipped"),"aria-hidden":"true",children:e.jsxRuntimeExports.jsxs("svg",{id:"caret-down",viewBox:"0 0 512 512",children:[e.jsxRuntimeExports.jsx("title",{children:c?"caret down":"caret up"}),e.jsxRuntimeExports.jsx("path",{fill:"currentColor",d:"M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7L86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z"})]})})})]})}),e.jsxRuntimeExports.jsx(n.Select.Portal,{children:e.jsxRuntimeExports.jsx(n.Select.Content,{className:m.csx("proton-Menu","proton-MenuTrigger__menu",M),style:q,position:"popper",children:e.jsxRuntimeExports.jsx(n.Select.Viewport,{children:_.map(t=>e.jsxRuntimeExports.jsx(n.Select.Item,{value:t.key,disabled:l==null?void 0:l.includes(t.key),className:"proton-Menu__item",children:e.jsxRuntimeExports.jsx(n.Select.ItemText,{children:t.label})},t.key))})})})]})]})}k.displayName="ProtonUISelect";exports.Select=k;
|
|
2
2
|
//# sourceMappingURL=Select.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Select.cjs.js","sources":["../../../src/components/Select/Select.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n forwardRef,\n ReactNode,\n RefObject,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { Select as RadixSelect } from \"radix-ui\";\n\nimport { BREAKPOINTS } from \"../../constants\";\nimport { useResponsiveDevice } from \"../../hooks/useResponsiveDevice\";\nimport { csx } from \"../../utils\";\nimport { ActionMenu, ActionMenuAction } from \"../ActionMenu/ActionMenu\";\n\nimport \"./Select.css\";\nimport \"../Menu/Menu.css\";\nimport { useTheme } from \"../ThemeProvider\";\n\ninterface SelectButtonProps {\n disabled?: boolean;\n isOpen?: boolean;\n children?: ReactNode;\n onClick?: () => void;\n isRounded?: boolean;\n}\n\nconst SelectButton = forwardRef<HTMLButtonElement, SelectButtonProps>(\n (\n { disabled, isOpen, children, onClick, isRounded, ...props },\n ref: RefObject<HTMLButtonElement>\n ) => {\n return (\n <button\n {...props}\n ref={ref}\n disabled={disabled}\n onClick={onClick}\n className={csx(\n \"proton-Select__trigger\",\n disabled && \"proton-Select__trigger--disabled\",\n !isOpen && \"proton-Select__trigger--closed\",\n isOpen && \"proton-Select__trigger--opened\",\n isRounded && \"proton-Select__trigger--rounded\"\n )}\n >\n {children}\n </button>\n );\n }\n);\nSelectButton.displayName = \"ProtonUISelectButton\";\n\nexport interface SelectItem {\n /** The label to display for the item */\n label: string;\n\n /** The key of the item */\n key: string;\n\n /** The URL to navigate to when the item is clicked, turns item into an a tag */\n to?: string;\n}\n\nexport interface SelectProps {\n /** Array of keys that should be disabled\n * @example [\"Thing 1\", \"Thing 2\"]\n */\n disabledKeys?: string[];\n\n /** The key of the default selected item */\n defaultSelectedKey?: string;\n\n /** Test ID for the select */\n \"data-testid\"?: string;\n\n /** Whether the select is disabled */\n isDisabled?: boolean;\n\n /** Array of items to display\n * @example [{ key: \"thing-1\", label: \"Thing 1\" }, { key: \"thing-2\", label: \"Thing 2\" }]\n * @see {@link SelectItem}\n */\n items: SelectItem[];\n\n /** Whether the select button is rounded\n * @default false\n */\n isRounded?: boolean;\n\n /** Label to display above the select\n * @external https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label#text\n */\n label?: string;\n\n /** The name of the select field */\n name: string;\n\n /** Callback fired when the menu closes */\n onClose?: () => void;\n\n /** Callback fired when the menu opens */\n onOpen?: () => void;\n\n /** Callback fired when selection changes */\n onSelectionChange?: (key: string) => void;\n\n /** Currently selected key */\n selectedKey?: string;\n}\n\n/**\n * A dropdown select menu that opens a popover on desktop and an action menu on mobile/touch devices.\n * Supports controlled and uncontrolled modes.\n *\n * API:\n * - {@link SelectProps}\n */\nexport function Select({\n label,\n name,\n isDisabled,\n disabledKeys,\n selectedKey,\n onSelectionChange,\n defaultSelectedKey,\n onOpen, \n onClose,\n items,\n isRounded = false,\n \"data-testid\": testId,\n}: SelectProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [internalSelectedKey, setInternalSelectedKey] = useState(\n selectedKey || defaultSelectedKey || \"\"\n );\n const { className: themeClass, style: themeStyle } = useTheme();\n const isMobile = useResponsiveDevice(BREAKPOINTS.MEDIUM);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const hiddenInputRef = useRef<HTMLInputElement>(null);\n\n // Handle controlled vs uncontrolled state\n const currentSelectedKey =\n selectedKey !== undefined ? selectedKey : internalSelectedKey;\n const selectedItem = items.find((item) => item.key === currentSelectedKey);\n\n const handleValueChange = (value: string) => {\n if (selectedKey === undefined) {\n setInternalSelectedKey(value);\n }\n onSelectionChange?.(value);\n\n // Update hidden input for form submission\n if (hiddenInputRef.current) {\n hiddenInputRef.current.value = value;\n hiddenInputRef.current.dispatchEvent(\n new Event(\"change\", { bubbles: true })\n );\n }\n };\n\n const handleOpenChange = (open: boolean) => {\n setIsOpen(open);\n if (open) {\n onOpen?.();\n } else {\n onClose?.();\n }\n };\n\n // Update internal state when controlled selectedKey changes\n useEffect(() => {\n if (selectedKey !== undefined) {\n setInternalSelectedKey(selectedKey);\n }\n }, [selectedKey]);\n\n const actionItems: ActionMenuAction[] = items.map((item) => ({\n key: item.key,\n label: item.label,\n to: item.to,\n onAction: () => {\n handleValueChange(item.key);\n setIsOpen(false);\n },\n }));\n\n if (isMobile) {\n return (\n <div\n className=\"proton-Select\"\n aria-label={label || name}\n aria-disabled={isDisabled}\n >\n {label && (\n <div className=\"proton-Select__label\" data-testid=\"select-label\">\n {label}\n </div>\n )}\n\n {/* Hidden input for form submission */}\n <input\n ref={hiddenInputRef}\n type=\"hidden\"\n name={name}\n value={currentSelectedKey}\n data-testid=\"hidden-select-container\"\n />\n\n <SelectButton\n isOpen={isOpen}\n isRounded={isRounded}\n ref={triggerRef}\n disabled={isDisabled}\n data-testid={testId}\n onClick={() => setIsOpen(true)}\n >\n <div className=\"proton-Select__value\">\n {selectedItem ? selectedItem.label : \"Select an option\"}\n </div>\n <div\n className={csx(\n \"proton-Select__trigger_icon\",\n isOpen && \"proton-Select__trigger_icon--flipped\"\n )}\n aria-hidden=\"true\"\n >\n <svg id=\"caret-down\" viewBox=\"0 0 512 512\">\n <title>{isOpen ? \"caret down\" : \"caret up\"}</title>\n <path\n fill=\"currentColor\"\n d=\"M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7L86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z\"\n />\n </svg>\n </div>\n </SelectButton>\n\n <ActionMenu\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n actions={actionItems}\n selectedKeys={[currentSelectedKey]}\n disabledKeys={disabledKeys}\n />\n </div>\n );\n }\n\n return (\n <div\n className=\"proton-Select\"\n aria-label={label || name}\n aria-disabled={isDisabled}\n >\n {label && (\n <div className=\"proton-Select__label\" data-testid=\"select-label\">\n {label}\n </div>\n )}\n\n {/* Hidden input for form submission */}\n <input\n ref={hiddenInputRef}\n type=\"hidden\"\n name={name}\n value={currentSelectedKey}\n data-testid=\"hidden-select-container\"\n />\n\n <RadixSelect.Root\n value={currentSelectedKey}\n onValueChange={handleValueChange}\n onOpenChange={handleOpenChange}\n disabled={isDisabled}\n >\n <RadixSelect.Trigger asChild>\n <SelectButton\n isRounded={isRounded}\n isOpen={isOpen}\n ref={triggerRef}\n disabled={isDisabled}\n data-testid={testId}\n >\n <RadixSelect.Value\n className=\"proton-Select__value\"\n placeholder=\"Select an option\"\n >\n {selectedItem ? selectedItem.label : \"Select an option\"}\n </RadixSelect.Value>\n <RadixSelect.Icon asChild>\n <div\n className={csx(\n \"proton-Select__trigger_icon\",\n isOpen && \"proton-Select__trigger_icon--flipped\"\n )}\n aria-hidden=\"true\"\n >\n <svg id=\"caret-down\" viewBox=\"0 0 512 512\">\n <title>{isOpen ? \"caret down\" : \"caret up\"}</title>\n <path\n fill=\"currentColor\"\n d=\"M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7L86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z\"\n />\n </svg>\n </div>\n </RadixSelect.Icon>\n </SelectButton>\n </RadixSelect.Trigger>\n\n <RadixSelect.Portal>\n <RadixSelect.Content\n className={csx(\n \"proton-Menu\",\n \"proton-MenuTrigger__menu\",\n themeClass\n )}\n style={themeStyle as React.CSSProperties}\n position=\"popper\"\n >\n <RadixSelect.Viewport>\n {items.map((item) => (\n <RadixSelect.Item\n key={item.key}\n value={item.key}\n disabled={disabledKeys?.includes(item.key)}\n className=\"proton-Menu__item\"\n >\n <RadixSelect.ItemText>{item.label}</RadixSelect.ItemText>\n </RadixSelect.Item>\n ))}\n </RadixSelect.Viewport>\n </RadixSelect.Content>\n </RadixSelect.Portal>\n </RadixSelect.Root>\n </div>\n );\n}\n\nSelect.displayName = \"ProtonUISelect\";\n"],"names":["SelectButton","forwardRef","disabled","isOpen","children","onClick","isRounded","props","ref","jsx","csx","Select","label","name","isDisabled","disabledKeys","selectedKey","onSelectionChange","defaultSelectedKey","onOpen","onClose","items","testId","setIsOpen","useState","internalSelectedKey","setInternalSelectedKey","themeClass","themeStyle","useTheme","isMobile","useResponsiveDevice","BREAKPOINTS","triggerRef","useRef","hiddenInputRef","currentSelectedKey","selectedItem","item","handleValueChange","value","handleOpenChange","open","useEffect","actionItems","jsxs","ActionMenu","RadixSelect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Select.cjs.js","sources":["../../../src/components/Select/Select.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n forwardRef,\n ReactNode,\n RefObject,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { Select as RadixSelect } from \"radix-ui\";\n\nimport { BREAKPOINTS } from \"../../constants\";\nimport { useBreakpoint } from \"../../hooks/useBreakpoint\";\nimport { csx } from \"../../utils\";\nimport { ActionMenu, ActionMenuAction } from \"../ActionMenu/ActionMenu\";\n\nimport \"./Select.css\";\nimport \"../Menu/Menu.css\";\nimport { useTheme } from \"../ThemeProvider\";\n\ninterface SelectButtonProps {\n disabled?: boolean;\n isOpen?: boolean;\n children?: ReactNode;\n onClick?: () => void;\n isRounded?: boolean;\n}\n\nconst SelectButton = forwardRef<HTMLButtonElement, SelectButtonProps>(\n (\n { disabled, isOpen, children, onClick, isRounded, ...props },\n ref: RefObject<HTMLButtonElement>\n ) => {\n return (\n <button\n {...props}\n ref={ref}\n disabled={disabled}\n onClick={onClick}\n className={csx(\n \"proton-Select__trigger\",\n disabled && \"proton-Select__trigger--disabled\",\n !isOpen && \"proton-Select__trigger--closed\",\n isOpen && \"proton-Select__trigger--opened\",\n isRounded && \"proton-Select__trigger--rounded\"\n )}\n >\n {children}\n </button>\n );\n }\n);\nSelectButton.displayName = \"ProtonUISelectButton\";\n\nexport interface SelectItem {\n /** The label to display for the item */\n label: string;\n\n /** The key of the item */\n key: string;\n\n /** The URL to navigate to when the item is clicked, turns item into an a tag */\n to?: string;\n}\n\nexport interface SelectProps {\n /** Array of keys that should be disabled\n * @example [\"Thing 1\", \"Thing 2\"]\n */\n disabledKeys?: string[];\n\n /** The key of the default selected item */\n defaultSelectedKey?: string;\n\n /** Test ID for the select */\n \"data-testid\"?: string;\n\n /** Whether the select is disabled */\n isDisabled?: boolean;\n\n /** Array of items to display\n * @example [{ key: \"thing-1\", label: \"Thing 1\" }, { key: \"thing-2\", label: \"Thing 2\" }]\n * @see {@link SelectItem}\n */\n items: SelectItem[];\n\n /** Whether the select button is rounded\n * @default false\n */\n isRounded?: boolean;\n\n /** Label to display above the select\n * @external https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label#text\n */\n label?: string;\n\n /** The name of the select field */\n name: string;\n\n /** Callback fired when the menu closes */\n onClose?: () => void;\n\n /** Callback fired when the menu opens */\n onOpen?: () => void;\n\n /** Callback fired when selection changes */\n onSelectionChange?: (key: string) => void;\n\n /** Currently selected key */\n selectedKey?: string;\n}\n\n/**\n * A dropdown select menu that opens a popover on desktop and an action menu on mobile.\n * Supports controlled and uncontrolled modes.\n *\n * API:\n * - {@link SelectProps}\n */\nexport function Select({\n label,\n name,\n isDisabled,\n disabledKeys,\n selectedKey,\n onSelectionChange,\n defaultSelectedKey,\n onOpen, \n onClose,\n items,\n isRounded = false,\n \"data-testid\": testId,\n}: SelectProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [internalSelectedKey, setInternalSelectedKey] = useState(\n selectedKey || defaultSelectedKey || \"\"\n );\n const { className: themeClass, style: themeStyle } = useTheme();\n const isMobile = useBreakpoint(BREAKPOINTS.MEDIUM);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const hiddenInputRef = useRef<HTMLInputElement>(null);\n\n // Handle controlled vs uncontrolled state\n const currentSelectedKey =\n selectedKey !== undefined ? selectedKey : internalSelectedKey;\n const selectedItem = items.find((item) => item.key === currentSelectedKey);\n\n const handleValueChange = (value: string) => {\n if (selectedKey === undefined) {\n setInternalSelectedKey(value);\n }\n onSelectionChange?.(value);\n\n // Update hidden input for form submission\n if (hiddenInputRef.current) {\n hiddenInputRef.current.value = value;\n hiddenInputRef.current.dispatchEvent(\n new Event(\"change\", { bubbles: true })\n );\n }\n };\n\n const handleOpenChange = (open: boolean) => {\n setIsOpen(open);\n if (open) {\n onOpen?.();\n } else {\n onClose?.();\n }\n };\n\n // Update internal state when controlled selectedKey changes\n useEffect(() => {\n if (selectedKey !== undefined) {\n setInternalSelectedKey(selectedKey);\n }\n }, [selectedKey]);\n\n const actionItems: ActionMenuAction[] = items.map((item) => ({\n key: item.key,\n label: item.label,\n to: item.to,\n onAction: () => {\n handleValueChange(item.key);\n setIsOpen(false);\n },\n }));\n\n if (isMobile) {\n return (\n <div\n className=\"proton-Select\"\n aria-label={label || name}\n aria-disabled={isDisabled}\n >\n {label && (\n <div className=\"proton-Select__label\" data-testid=\"select-label\">\n {label}\n </div>\n )}\n\n {/* Hidden input for form submission */}\n <input\n ref={hiddenInputRef}\n type=\"hidden\"\n name={name}\n value={currentSelectedKey}\n data-testid=\"hidden-select-container\"\n />\n\n <SelectButton\n isOpen={isOpen}\n isRounded={isRounded}\n ref={triggerRef}\n disabled={isDisabled}\n data-testid={testId}\n onClick={() => setIsOpen(true)}\n >\n <div className=\"proton-Select__value\">\n {selectedItem ? selectedItem.label : \"Select an option\"}\n </div>\n <div\n className={csx(\n \"proton-Select__trigger_icon\",\n isOpen && \"proton-Select__trigger_icon--flipped\"\n )}\n aria-hidden=\"true\"\n >\n <svg id=\"caret-down\" viewBox=\"0 0 512 512\">\n <title>{isOpen ? \"caret down\" : \"caret up\"}</title>\n <path\n fill=\"currentColor\"\n d=\"M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7L86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z\"\n />\n </svg>\n </div>\n </SelectButton>\n\n <ActionMenu\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n actions={actionItems}\n selectedKeys={[currentSelectedKey]}\n disabledKeys={disabledKeys}\n />\n </div>\n );\n }\n\n return (\n <div\n className=\"proton-Select\"\n aria-label={label || name}\n aria-disabled={isDisabled}\n >\n {label && (\n <div className=\"proton-Select__label\" data-testid=\"select-label\">\n {label}\n </div>\n )}\n\n {/* Hidden input for form submission */}\n <input\n ref={hiddenInputRef}\n type=\"hidden\"\n name={name}\n value={currentSelectedKey}\n data-testid=\"hidden-select-container\"\n />\n\n <RadixSelect.Root\n value={currentSelectedKey}\n onValueChange={handleValueChange}\n onOpenChange={handleOpenChange}\n disabled={isDisabled}\n >\n <RadixSelect.Trigger asChild>\n <SelectButton\n isRounded={isRounded}\n isOpen={isOpen}\n ref={triggerRef}\n disabled={isDisabled}\n data-testid={testId}\n >\n <RadixSelect.Value\n className=\"proton-Select__value\"\n placeholder=\"Select an option\"\n >\n {selectedItem ? selectedItem.label : \"Select an option\"}\n </RadixSelect.Value>\n <RadixSelect.Icon asChild>\n <div\n className={csx(\n \"proton-Select__trigger_icon\",\n isOpen && \"proton-Select__trigger_icon--flipped\"\n )}\n aria-hidden=\"true\"\n >\n <svg id=\"caret-down\" viewBox=\"0 0 512 512\">\n <title>{isOpen ? \"caret down\" : \"caret up\"}</title>\n <path\n fill=\"currentColor\"\n d=\"M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7L86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z\"\n />\n </svg>\n </div>\n </RadixSelect.Icon>\n </SelectButton>\n </RadixSelect.Trigger>\n\n <RadixSelect.Portal>\n <RadixSelect.Content\n className={csx(\n \"proton-Menu\",\n \"proton-MenuTrigger__menu\",\n themeClass\n )}\n style={themeStyle as React.CSSProperties}\n position=\"popper\"\n >\n <RadixSelect.Viewport>\n {items.map((item) => (\n <RadixSelect.Item\n key={item.key}\n value={item.key}\n disabled={disabledKeys?.includes(item.key)}\n className=\"proton-Menu__item\"\n >\n <RadixSelect.ItemText>{item.label}</RadixSelect.ItemText>\n </RadixSelect.Item>\n ))}\n </RadixSelect.Viewport>\n </RadixSelect.Content>\n </RadixSelect.Portal>\n </RadixSelect.Root>\n </div>\n );\n}\n\nSelect.displayName = \"ProtonUISelect\";\n"],"names":["SelectButton","forwardRef","disabled","isOpen","children","onClick","isRounded","props","ref","jsx","csx","Select","label","name","isDisabled","disabledKeys","selectedKey","onSelectionChange","defaultSelectedKey","onOpen","onClose","items","testId","setIsOpen","useState","internalSelectedKey","setInternalSelectedKey","themeClass","themeStyle","useTheme","isMobile","useBreakpoint","BREAKPOINTS","triggerRef","useRef","hiddenInputRef","currentSelectedKey","selectedItem","item","handleValueChange","value","handleOpenChange","open","useEffect","actionItems","jsxs","ActionMenu","RadixSelect"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { j as e } from "../../node_modules/react/jsx-runtime.es.js";
|
|
2
|
-
import { forwardRef as C, useState as
|
|
2
|
+
import { forwardRef as C, useState as w, useRef as M, useEffect as L } from "react";
|
|
3
3
|
import { Select as n } from "radix-ui";
|
|
4
|
-
import {
|
|
4
|
+
import { useBreakpoint as P } from "../../hooks/useBreakpoint.es.js";
|
|
5
5
|
import { ActionMenu as V } from "../ActionMenu/ActionMenu.es.js";
|
|
6
6
|
/* empty css */
|
|
7
7
|
/* empty css */
|
|
@@ -42,13 +42,13 @@ function z({
|
|
|
42
42
|
isRounded: S = !1,
|
|
43
43
|
"data-testid": v
|
|
44
44
|
}) {
|
|
45
|
-
const [i, u] =
|
|
45
|
+
const [i, u] = w(!1), [b, N] = w(
|
|
46
46
|
l || f || ""
|
|
47
|
-
), { className: y, style:
|
|
47
|
+
), { className: y, style: B } = A(), E = P(U.MEDIUM), I = M(null), d = M(null), p = l !== void 0 ? l : b, h = j.find((t) => t.key === p), k = (t) => {
|
|
48
48
|
l === void 0 && N(t), a == null || a(t), d.current && (d.current.value = t, d.current.dispatchEvent(
|
|
49
49
|
new Event("change", { bubbles: !0 })
|
|
50
50
|
));
|
|
51
|
-
},
|
|
51
|
+
}, R = (t) => {
|
|
52
52
|
u(t), t ? _ == null || _() : m == null || m();
|
|
53
53
|
};
|
|
54
54
|
L(() => {
|
|
@@ -59,7 +59,7 @@ function z({
|
|
|
59
59
|
label: t.label,
|
|
60
60
|
to: t.to,
|
|
61
61
|
onAction: () => {
|
|
62
|
-
|
|
62
|
+
k(t.key), u(!1);
|
|
63
63
|
}
|
|
64
64
|
}));
|
|
65
65
|
return E ? /* @__PURE__ */ e.jsxs(
|
|
@@ -148,8 +148,8 @@ function z({
|
|
|
148
148
|
n.Root,
|
|
149
149
|
{
|
|
150
150
|
value: p,
|
|
151
|
-
onValueChange:
|
|
152
|
-
onOpenChange:
|
|
151
|
+
onValueChange: k,
|
|
152
|
+
onOpenChange: R,
|
|
153
153
|
disabled: o,
|
|
154
154
|
children: [
|
|
155
155
|
/* @__PURE__ */ e.jsx(n.Trigger, { asChild: !0, children: /* @__PURE__ */ e.jsxs(
|
|
@@ -200,7 +200,7 @@ function z({
|
|
|
200
200
|
"proton-MenuTrigger__menu",
|
|
201
201
|
y
|
|
202
202
|
),
|
|
203
|
-
style:
|
|
203
|
+
style: B,
|
|
204
204
|
position: "popper",
|
|
205
205
|
children: /* @__PURE__ */ e.jsx(n.Viewport, { children: j.map((t) => /* @__PURE__ */ e.jsx(
|
|
206
206
|
n.Item,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Select.es.js","sources":["../../../src/components/Select/Select.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n forwardRef,\n ReactNode,\n RefObject,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { Select as RadixSelect } from \"radix-ui\";\n\nimport { BREAKPOINTS } from \"../../constants\";\nimport { useResponsiveDevice } from \"../../hooks/useResponsiveDevice\";\nimport { csx } from \"../../utils\";\nimport { ActionMenu, ActionMenuAction } from \"../ActionMenu/ActionMenu\";\n\nimport \"./Select.css\";\nimport \"../Menu/Menu.css\";\nimport { useTheme } from \"../ThemeProvider\";\n\ninterface SelectButtonProps {\n disabled?: boolean;\n isOpen?: boolean;\n children?: ReactNode;\n onClick?: () => void;\n isRounded?: boolean;\n}\n\nconst SelectButton = forwardRef<HTMLButtonElement, SelectButtonProps>(\n (\n { disabled, isOpen, children, onClick, isRounded, ...props },\n ref: RefObject<HTMLButtonElement>\n ) => {\n return (\n <button\n {...props}\n ref={ref}\n disabled={disabled}\n onClick={onClick}\n className={csx(\n \"proton-Select__trigger\",\n disabled && \"proton-Select__trigger--disabled\",\n !isOpen && \"proton-Select__trigger--closed\",\n isOpen && \"proton-Select__trigger--opened\",\n isRounded && \"proton-Select__trigger--rounded\"\n )}\n >\n {children}\n </button>\n );\n }\n);\nSelectButton.displayName = \"ProtonUISelectButton\";\n\nexport interface SelectItem {\n /** The label to display for the item */\n label: string;\n\n /** The key of the item */\n key: string;\n\n /** The URL to navigate to when the item is clicked, turns item into an a tag */\n to?: string;\n}\n\nexport interface SelectProps {\n /** Array of keys that should be disabled\n * @example [\"Thing 1\", \"Thing 2\"]\n */\n disabledKeys?: string[];\n\n /** The key of the default selected item */\n defaultSelectedKey?: string;\n\n /** Test ID for the select */\n \"data-testid\"?: string;\n\n /** Whether the select is disabled */\n isDisabled?: boolean;\n\n /** Array of items to display\n * @example [{ key: \"thing-1\", label: \"Thing 1\" }, { key: \"thing-2\", label: \"Thing 2\" }]\n * @see {@link SelectItem}\n */\n items: SelectItem[];\n\n /** Whether the select button is rounded\n * @default false\n */\n isRounded?: boolean;\n\n /** Label to display above the select\n * @external https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label#text\n */\n label?: string;\n\n /** The name of the select field */\n name: string;\n\n /** Callback fired when the menu closes */\n onClose?: () => void;\n\n /** Callback fired when the menu opens */\n onOpen?: () => void;\n\n /** Callback fired when selection changes */\n onSelectionChange?: (key: string) => void;\n\n /** Currently selected key */\n selectedKey?: string;\n}\n\n/**\n * A dropdown select menu that opens a popover on desktop and an action menu on mobile/touch devices.\n * Supports controlled and uncontrolled modes.\n *\n * API:\n * - {@link SelectProps}\n */\nexport function Select({\n label,\n name,\n isDisabled,\n disabledKeys,\n selectedKey,\n onSelectionChange,\n defaultSelectedKey,\n onOpen, \n onClose,\n items,\n isRounded = false,\n \"data-testid\": testId,\n}: SelectProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [internalSelectedKey, setInternalSelectedKey] = useState(\n selectedKey || defaultSelectedKey || \"\"\n );\n const { className: themeClass, style: themeStyle } = useTheme();\n const isMobile = useResponsiveDevice(BREAKPOINTS.MEDIUM);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const hiddenInputRef = useRef<HTMLInputElement>(null);\n\n // Handle controlled vs uncontrolled state\n const currentSelectedKey =\n selectedKey !== undefined ? selectedKey : internalSelectedKey;\n const selectedItem = items.find((item) => item.key === currentSelectedKey);\n\n const handleValueChange = (value: string) => {\n if (selectedKey === undefined) {\n setInternalSelectedKey(value);\n }\n onSelectionChange?.(value);\n\n // Update hidden input for form submission\n if (hiddenInputRef.current) {\n hiddenInputRef.current.value = value;\n hiddenInputRef.current.dispatchEvent(\n new Event(\"change\", { bubbles: true })\n );\n }\n };\n\n const handleOpenChange = (open: boolean) => {\n setIsOpen(open);\n if (open) {\n onOpen?.();\n } else {\n onClose?.();\n }\n };\n\n // Update internal state when controlled selectedKey changes\n useEffect(() => {\n if (selectedKey !== undefined) {\n setInternalSelectedKey(selectedKey);\n }\n }, [selectedKey]);\n\n const actionItems: ActionMenuAction[] = items.map((item) => ({\n key: item.key,\n label: item.label,\n to: item.to,\n onAction: () => {\n handleValueChange(item.key);\n setIsOpen(false);\n },\n }));\n\n if (isMobile) {\n return (\n <div\n className=\"proton-Select\"\n aria-label={label || name}\n aria-disabled={isDisabled}\n >\n {label && (\n <div className=\"proton-Select__label\" data-testid=\"select-label\">\n {label}\n </div>\n )}\n\n {/* Hidden input for form submission */}\n <input\n ref={hiddenInputRef}\n type=\"hidden\"\n name={name}\n value={currentSelectedKey}\n data-testid=\"hidden-select-container\"\n />\n\n <SelectButton\n isOpen={isOpen}\n isRounded={isRounded}\n ref={triggerRef}\n disabled={isDisabled}\n data-testid={testId}\n onClick={() => setIsOpen(true)}\n >\n <div className=\"proton-Select__value\">\n {selectedItem ? selectedItem.label : \"Select an option\"}\n </div>\n <div\n className={csx(\n \"proton-Select__trigger_icon\",\n isOpen && \"proton-Select__trigger_icon--flipped\"\n )}\n aria-hidden=\"true\"\n >\n <svg id=\"caret-down\" viewBox=\"0 0 512 512\">\n <title>{isOpen ? \"caret down\" : \"caret up\"}</title>\n <path\n fill=\"currentColor\"\n d=\"M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7L86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z\"\n />\n </svg>\n </div>\n </SelectButton>\n\n <ActionMenu\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n actions={actionItems}\n selectedKeys={[currentSelectedKey]}\n disabledKeys={disabledKeys}\n />\n </div>\n );\n }\n\n return (\n <div\n className=\"proton-Select\"\n aria-label={label || name}\n aria-disabled={isDisabled}\n >\n {label && (\n <div className=\"proton-Select__label\" data-testid=\"select-label\">\n {label}\n </div>\n )}\n\n {/* Hidden input for form submission */}\n <input\n ref={hiddenInputRef}\n type=\"hidden\"\n name={name}\n value={currentSelectedKey}\n data-testid=\"hidden-select-container\"\n />\n\n <RadixSelect.Root\n value={currentSelectedKey}\n onValueChange={handleValueChange}\n onOpenChange={handleOpenChange}\n disabled={isDisabled}\n >\n <RadixSelect.Trigger asChild>\n <SelectButton\n isRounded={isRounded}\n isOpen={isOpen}\n ref={triggerRef}\n disabled={isDisabled}\n data-testid={testId}\n >\n <RadixSelect.Value\n className=\"proton-Select__value\"\n placeholder=\"Select an option\"\n >\n {selectedItem ? selectedItem.label : \"Select an option\"}\n </RadixSelect.Value>\n <RadixSelect.Icon asChild>\n <div\n className={csx(\n \"proton-Select__trigger_icon\",\n isOpen && \"proton-Select__trigger_icon--flipped\"\n )}\n aria-hidden=\"true\"\n >\n <svg id=\"caret-down\" viewBox=\"0 0 512 512\">\n <title>{isOpen ? \"caret down\" : \"caret up\"}</title>\n <path\n fill=\"currentColor\"\n d=\"M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7L86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z\"\n />\n </svg>\n </div>\n </RadixSelect.Icon>\n </SelectButton>\n </RadixSelect.Trigger>\n\n <RadixSelect.Portal>\n <RadixSelect.Content\n className={csx(\n \"proton-Menu\",\n \"proton-MenuTrigger__menu\",\n themeClass\n )}\n style={themeStyle as React.CSSProperties}\n position=\"popper\"\n >\n <RadixSelect.Viewport>\n {items.map((item) => (\n <RadixSelect.Item\n key={item.key}\n value={item.key}\n disabled={disabledKeys?.includes(item.key)}\n className=\"proton-Menu__item\"\n >\n <RadixSelect.ItemText>{item.label}</RadixSelect.ItemText>\n </RadixSelect.Item>\n ))}\n </RadixSelect.Viewport>\n </RadixSelect.Content>\n </RadixSelect.Portal>\n </RadixSelect.Root>\n </div>\n );\n}\n\nSelect.displayName = \"ProtonUISelect\";\n"],"names":["SelectButton","forwardRef","disabled","isOpen","children","onClick","isRounded","props","ref","jsx","csx","Select","label","name","isDisabled","disabledKeys","selectedKey","onSelectionChange","defaultSelectedKey","onOpen","onClose","items","testId","setIsOpen","useState","internalSelectedKey","setInternalSelectedKey","themeClass","themeStyle","useTheme","isMobile","useResponsiveDevice","BREAKPOINTS","triggerRef","useRef","hiddenInputRef","currentSelectedKey","selectedItem","item","handleValueChange","value","handleOpenChange","open","useEffect","actionItems","jsxs","ActionMenu","RadixSelect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Select.es.js","sources":["../../../src/components/Select/Select.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n forwardRef,\n ReactNode,\n RefObject,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { Select as RadixSelect } from \"radix-ui\";\n\nimport { BREAKPOINTS } from \"../../constants\";\nimport { useBreakpoint } from \"../../hooks/useBreakpoint\";\nimport { csx } from \"../../utils\";\nimport { ActionMenu, ActionMenuAction } from \"../ActionMenu/ActionMenu\";\n\nimport \"./Select.css\";\nimport \"../Menu/Menu.css\";\nimport { useTheme } from \"../ThemeProvider\";\n\ninterface SelectButtonProps {\n disabled?: boolean;\n isOpen?: boolean;\n children?: ReactNode;\n onClick?: () => void;\n isRounded?: boolean;\n}\n\nconst SelectButton = forwardRef<HTMLButtonElement, SelectButtonProps>(\n (\n { disabled, isOpen, children, onClick, isRounded, ...props },\n ref: RefObject<HTMLButtonElement>\n ) => {\n return (\n <button\n {...props}\n ref={ref}\n disabled={disabled}\n onClick={onClick}\n className={csx(\n \"proton-Select__trigger\",\n disabled && \"proton-Select__trigger--disabled\",\n !isOpen && \"proton-Select__trigger--closed\",\n isOpen && \"proton-Select__trigger--opened\",\n isRounded && \"proton-Select__trigger--rounded\"\n )}\n >\n {children}\n </button>\n );\n }\n);\nSelectButton.displayName = \"ProtonUISelectButton\";\n\nexport interface SelectItem {\n /** The label to display for the item */\n label: string;\n\n /** The key of the item */\n key: string;\n\n /** The URL to navigate to when the item is clicked, turns item into an a tag */\n to?: string;\n}\n\nexport interface SelectProps {\n /** Array of keys that should be disabled\n * @example [\"Thing 1\", \"Thing 2\"]\n */\n disabledKeys?: string[];\n\n /** The key of the default selected item */\n defaultSelectedKey?: string;\n\n /** Test ID for the select */\n \"data-testid\"?: string;\n\n /** Whether the select is disabled */\n isDisabled?: boolean;\n\n /** Array of items to display\n * @example [{ key: \"thing-1\", label: \"Thing 1\" }, { key: \"thing-2\", label: \"Thing 2\" }]\n * @see {@link SelectItem}\n */\n items: SelectItem[];\n\n /** Whether the select button is rounded\n * @default false\n */\n isRounded?: boolean;\n\n /** Label to display above the select\n * @external https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label#text\n */\n label?: string;\n\n /** The name of the select field */\n name: string;\n\n /** Callback fired when the menu closes */\n onClose?: () => void;\n\n /** Callback fired when the menu opens */\n onOpen?: () => void;\n\n /** Callback fired when selection changes */\n onSelectionChange?: (key: string) => void;\n\n /** Currently selected key */\n selectedKey?: string;\n}\n\n/**\n * A dropdown select menu that opens a popover on desktop and an action menu on mobile.\n * Supports controlled and uncontrolled modes.\n *\n * API:\n * - {@link SelectProps}\n */\nexport function Select({\n label,\n name,\n isDisabled,\n disabledKeys,\n selectedKey,\n onSelectionChange,\n defaultSelectedKey,\n onOpen, \n onClose,\n items,\n isRounded = false,\n \"data-testid\": testId,\n}: SelectProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [internalSelectedKey, setInternalSelectedKey] = useState(\n selectedKey || defaultSelectedKey || \"\"\n );\n const { className: themeClass, style: themeStyle } = useTheme();\n const isMobile = useBreakpoint(BREAKPOINTS.MEDIUM);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const hiddenInputRef = useRef<HTMLInputElement>(null);\n\n // Handle controlled vs uncontrolled state\n const currentSelectedKey =\n selectedKey !== undefined ? selectedKey : internalSelectedKey;\n const selectedItem = items.find((item) => item.key === currentSelectedKey);\n\n const handleValueChange = (value: string) => {\n if (selectedKey === undefined) {\n setInternalSelectedKey(value);\n }\n onSelectionChange?.(value);\n\n // Update hidden input for form submission\n if (hiddenInputRef.current) {\n hiddenInputRef.current.value = value;\n hiddenInputRef.current.dispatchEvent(\n new Event(\"change\", { bubbles: true })\n );\n }\n };\n\n const handleOpenChange = (open: boolean) => {\n setIsOpen(open);\n if (open) {\n onOpen?.();\n } else {\n onClose?.();\n }\n };\n\n // Update internal state when controlled selectedKey changes\n useEffect(() => {\n if (selectedKey !== undefined) {\n setInternalSelectedKey(selectedKey);\n }\n }, [selectedKey]);\n\n const actionItems: ActionMenuAction[] = items.map((item) => ({\n key: item.key,\n label: item.label,\n to: item.to,\n onAction: () => {\n handleValueChange(item.key);\n setIsOpen(false);\n },\n }));\n\n if (isMobile) {\n return (\n <div\n className=\"proton-Select\"\n aria-label={label || name}\n aria-disabled={isDisabled}\n >\n {label && (\n <div className=\"proton-Select__label\" data-testid=\"select-label\">\n {label}\n </div>\n )}\n\n {/* Hidden input for form submission */}\n <input\n ref={hiddenInputRef}\n type=\"hidden\"\n name={name}\n value={currentSelectedKey}\n data-testid=\"hidden-select-container\"\n />\n\n <SelectButton\n isOpen={isOpen}\n isRounded={isRounded}\n ref={triggerRef}\n disabled={isDisabled}\n data-testid={testId}\n onClick={() => setIsOpen(true)}\n >\n <div className=\"proton-Select__value\">\n {selectedItem ? selectedItem.label : \"Select an option\"}\n </div>\n <div\n className={csx(\n \"proton-Select__trigger_icon\",\n isOpen && \"proton-Select__trigger_icon--flipped\"\n )}\n aria-hidden=\"true\"\n >\n <svg id=\"caret-down\" viewBox=\"0 0 512 512\">\n <title>{isOpen ? \"caret down\" : \"caret up\"}</title>\n <path\n fill=\"currentColor\"\n d=\"M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7L86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z\"\n />\n </svg>\n </div>\n </SelectButton>\n\n <ActionMenu\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n actions={actionItems}\n selectedKeys={[currentSelectedKey]}\n disabledKeys={disabledKeys}\n />\n </div>\n );\n }\n\n return (\n <div\n className=\"proton-Select\"\n aria-label={label || name}\n aria-disabled={isDisabled}\n >\n {label && (\n <div className=\"proton-Select__label\" data-testid=\"select-label\">\n {label}\n </div>\n )}\n\n {/* Hidden input for form submission */}\n <input\n ref={hiddenInputRef}\n type=\"hidden\"\n name={name}\n value={currentSelectedKey}\n data-testid=\"hidden-select-container\"\n />\n\n <RadixSelect.Root\n value={currentSelectedKey}\n onValueChange={handleValueChange}\n onOpenChange={handleOpenChange}\n disabled={isDisabled}\n >\n <RadixSelect.Trigger asChild>\n <SelectButton\n isRounded={isRounded}\n isOpen={isOpen}\n ref={triggerRef}\n disabled={isDisabled}\n data-testid={testId}\n >\n <RadixSelect.Value\n className=\"proton-Select__value\"\n placeholder=\"Select an option\"\n >\n {selectedItem ? selectedItem.label : \"Select an option\"}\n </RadixSelect.Value>\n <RadixSelect.Icon asChild>\n <div\n className={csx(\n \"proton-Select__trigger_icon\",\n isOpen && \"proton-Select__trigger_icon--flipped\"\n )}\n aria-hidden=\"true\"\n >\n <svg id=\"caret-down\" viewBox=\"0 0 512 512\">\n <title>{isOpen ? \"caret down\" : \"caret up\"}</title>\n <path\n fill=\"currentColor\"\n d=\"M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7L86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z\"\n />\n </svg>\n </div>\n </RadixSelect.Icon>\n </SelectButton>\n </RadixSelect.Trigger>\n\n <RadixSelect.Portal>\n <RadixSelect.Content\n className={csx(\n \"proton-Menu\",\n \"proton-MenuTrigger__menu\",\n themeClass\n )}\n style={themeStyle as React.CSSProperties}\n position=\"popper\"\n >\n <RadixSelect.Viewport>\n {items.map((item) => (\n <RadixSelect.Item\n key={item.key}\n value={item.key}\n disabled={disabledKeys?.includes(item.key)}\n className=\"proton-Menu__item\"\n >\n <RadixSelect.ItemText>{item.label}</RadixSelect.ItemText>\n </RadixSelect.Item>\n ))}\n </RadixSelect.Viewport>\n </RadixSelect.Content>\n </RadixSelect.Portal>\n </RadixSelect.Root>\n </div>\n );\n}\n\nSelect.displayName = \"ProtonUISelect\";\n"],"names":["SelectButton","forwardRef","disabled","isOpen","children","onClick","isRounded","props","ref","jsx","csx","Select","label","name","isDisabled","disabledKeys","selectedKey","onSelectionChange","defaultSelectedKey","onOpen","onClose","items","testId","setIsOpen","useState","internalSelectedKey","setInternalSelectedKey","themeClass","themeStyle","useTheme","isMobile","useBreakpoint","BREAKPOINTS","triggerRef","useRef","hiddenInputRef","currentSelectedKey","selectedItem","item","handleValueChange","value","handleOpenChange","open","useEffect","actionItems","jsxs","ActionMenu","RadixSelect"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=o=>null,n=o=>null,e=o=>null,u=o=>null,d=o=>null;exports.TableBodyCompound=e;exports.TableCellCompound=d;exports.TableColumnCompound=n;exports.TableHeaderCompound=l;exports.TableRowCompound=u;
|
|
2
|
+
//# sourceMappingURL=CompoundComponents.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CompoundComponents.cjs.js","sources":["../../../../../src/components/Table/BaseTable/Collection/CompoundComponents.tsx"],"sourcesContent":["import { AriaAttributes, ReactElement, ReactNode } from \"react\";\n\n/*\n Compound reference components used to build the table collection.\n They are not rendered, but used to parse the table structure.\n*/\n\ntype TableColumnElement = ReactElement<\n TableColumnProps,\n typeof TableColumnCompound\n>;\ntype TableRowElement = ReactElement<TableRowProps, typeof TableRowCompound>;\ntype TableCellElement = ReactElement<TableCellProps, typeof TableCellCompound>;\n\nexport interface TableHeaderProps {\n children: TableColumnElement | TableColumnElement[];\n isHidden?: boolean;\n \"data-testid\"?: string;\n}\n\nexport interface TableColumnProps {\n id: string;\n children: ReactNode;\n \"aria-sort\"?: AriaAttributes[\"aria-sort\"];\n}\n\nexport interface TableBodyProps {\n children: TableRowElement | TableRowElement[] | ReactElement | ReactElement[];\n}\n\nexport interface TableRowProps {\n key?: string | number;\n children: TableCellElement | TableCellElement[];\n onClick?: () => void;\n \"data-testid\"?: string;\n}\n\nexport interface TableCellProps {\n columnKey?: string;\n children?: ReactNode;\n colSpan?: number;\n \"data-testid\"?: string;\n}\n\n// Type-safe component definitions that enforce proper children\nexport const TableHeaderCompound = (_: TableHeaderProps) => {\n return null; // This is just a marker component for parsing\n};\n\nexport const TableColumnCompound = (_: TableColumnProps) => {\n return null; // This is just a marker component for parsing\n};\n\nexport const TableBodyCompound = (_: TableBodyProps) => {\n return null; // This is just a marker component for parsing\n};\n\nexport const TableRowCompound = (_: TableRowProps) => {\n return null; // This is just a marker component for parsing\n};\n\nexport const TableCellCompound = (_: TableCellProps) => {\n return null; // This is just a marker component for parsing\n};\n"],"names":["TableHeaderCompound","_","TableColumnCompound","TableBodyCompound","TableRowCompound","TableCellCompound"],"mappings":"gFA6Ca,MAAAA,EAAuBC,GAC3B,KAGIC,EAAuBD,GAC3B,KAGIE,EAAqBF,GACzB,KAGIG,EAAoBH,GACxB,KAGII,EAAqBJ,GACzB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
const o = (n) => null, l = (n) => null, u = (n) => null, e = (n) => null, r = (n) => null;
|
|
2
|
+
export {
|
|
3
|
+
u as TableBodyCompound,
|
|
4
|
+
r as TableCellCompound,
|
|
5
|
+
l as TableColumnCompound,
|
|
6
|
+
o as TableHeaderCompound,
|
|
7
|
+
e as TableRowCompound
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=CompoundComponents.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CompoundComponents.es.js","sources":["../../../../../src/components/Table/BaseTable/Collection/CompoundComponents.tsx"],"sourcesContent":["import { AriaAttributes, ReactElement, ReactNode } from \"react\";\n\n/*\n Compound reference components used to build the table collection.\n They are not rendered, but used to parse the table structure.\n*/\n\ntype TableColumnElement = ReactElement<\n TableColumnProps,\n typeof TableColumnCompound\n>;\ntype TableRowElement = ReactElement<TableRowProps, typeof TableRowCompound>;\ntype TableCellElement = ReactElement<TableCellProps, typeof TableCellCompound>;\n\nexport interface TableHeaderProps {\n children: TableColumnElement | TableColumnElement[];\n isHidden?: boolean;\n \"data-testid\"?: string;\n}\n\nexport interface TableColumnProps {\n id: string;\n children: ReactNode;\n \"aria-sort\"?: AriaAttributes[\"aria-sort\"];\n}\n\nexport interface TableBodyProps {\n children: TableRowElement | TableRowElement[] | ReactElement | ReactElement[];\n}\n\nexport interface TableRowProps {\n key?: string | number;\n children: TableCellElement | TableCellElement[];\n onClick?: () => void;\n \"data-testid\"?: string;\n}\n\nexport interface TableCellProps {\n columnKey?: string;\n children?: ReactNode;\n colSpan?: number;\n \"data-testid\"?: string;\n}\n\n// Type-safe component definitions that enforce proper children\nexport const TableHeaderCompound = (_: TableHeaderProps) => {\n return null; // This is just a marker component for parsing\n};\n\nexport const TableColumnCompound = (_: TableColumnProps) => {\n return null; // This is just a marker component for parsing\n};\n\nexport const TableBodyCompound = (_: TableBodyProps) => {\n return null; // This is just a marker component for parsing\n};\n\nexport const TableRowCompound = (_: TableRowProps) => {\n return null; // This is just a marker component for parsing\n};\n\nexport const TableCellCompound = (_: TableCellProps) => {\n return null; // This is just a marker component for parsing\n};\n"],"names":["TableHeaderCompound","_","TableColumnCompound","TableBodyCompound","TableRowCompound","TableCellCompound"],"mappings":"AA6Ca,MAAAA,IAAsB,CAACC,MAC3B,MAGIC,IAAsB,CAACD,MAC3B,MAGIE,IAAoB,CAACF,MACzB,MAGIG,IAAmB,CAACH,MACxB,MAGII,IAAoB,CAACJ,MACzB;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("react"),a=require("./CompoundComponents.cjs.js"),p=(t,s)=>t.type===s,h=(t,s)=>{const n=[],d=l.Children.toArray(t);for(const o of d)if(l.isValidElement(o)&&p(o,a.TableColumnCompound)){const e=o.props;n.push({key:e.id,header:e.children,isHidden:s,ariaSort:e["aria-sort"]})}return n},C=(t,s)=>{var e;const n=[],d=l.Children.toArray(t);let o=0;for(const c of d)if(l.isValidElement(c)&&p(c,a.TableCellCompound)){const r=c.props,i=r.columnKey??((e=s[o])==null?void 0:e.key);i&&n.push({columnKey:i,value:r.children,colSpan:r.colSpan,dataTestId:r["data-testid"]}),o++}return n},m=t=>{const s=[],n=[],d=l.Children.toArray(t);for(const o of d)if(l.isValidElement(o)){if(p(o,a.TableHeaderCompound)){const e=o.props,c=h(e.children,e.isHidden||!1);s.push(...c);continue}if(p(o,a.TableBodyCompound)){const e=o.props,c=l.Children.toArray(e.children);for(const r of c)if(l.isValidElement(r))if(p(r,a.TableRowCompound)){const i=r.props,u=C(i.children,s);n.push({key:r.key??i.key??String(n.length),cells:u,onClick:i.onClick,dataTestId:i["data-testid"]})}else n.push(r)}}return{columns:s,rows:n}};exports.parseTableChildren=m;
|
|
2
|
+
//# sourceMappingURL=collectionParser.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collectionParser.cjs.js","sources":["../../../../../src/components/Table/BaseTable/Collection/collectionParser.ts"],"sourcesContent":["import {\n Children,\n isValidElement,\n ReactElement,\n ReactNode,\n ComponentType,\n} from \"react\";\n\nimport {\n TableHeaderCompound,\n TableColumnCompound,\n TableBodyCompound,\n TableRowCompound,\n TableCellCompound,\n} from \"./CompoundComponents\";\nimport type {\n TableColumnData,\n TableData,\n TableRowData,\n TableCellData,\n} from \"../types\";\n\nconst isComponentType = (\n element: ReactElement,\n componentType: ComponentType<any>,\n): boolean => element.type === componentType;\n\n/**\n * Parses columns from Table.Header children\n */\nconst parseColumns = (\n headerChildren: ReactNode,\n isHeaderHidden: boolean,\n): TableColumnData[] => {\n const columns: TableColumnData[] = [];\n const childrenArray = Children.toArray(headerChildren);\n\n for (const columnChild of childrenArray) {\n if (\n isValidElement(columnChild) &&\n isComponentType(columnChild, TableColumnCompound)\n ) {\n const columnProps = columnChild.props;\n columns.push({\n key: columnProps.id,\n header: columnProps.children,\n isHidden: isHeaderHidden,\n ariaSort: columnProps[\"aria-sort\"],\n });\n }\n }\n\n return columns;\n};\n\n/**\n * Parses cells from Table.Row children\n */\nconst parseCells = (\n rowChildren: ReactNode,\n columns: TableColumnData[],\n): TableCellData[] => {\n const cells: TableCellData[] = [];\n const childrenArray = Children.toArray(rowChildren);\n let cellIndex = 0;\n\n for (const cellChild of childrenArray) {\n if (\n isValidElement(cellChild) &&\n isComponentType(cellChild, TableCellCompound)\n ) {\n const cellProps = cellChild.props;\n const columnKey = cellProps.columnKey ?? columns[cellIndex]?.key;\n\n if (columnKey) {\n cells.push({\n columnKey,\n value: cellProps.children,\n colSpan: cellProps.colSpan,\n dataTestId: cellProps[\"data-testid\"],\n });\n }\n cellIndex++;\n }\n }\n\n return cells;\n};\n\n/**\n * Parses JSX table structure into collection data format.\n *\n * @returns parsed table data\n * @see {@link TableData} for the parsed table data structure\n */\nexport const parseTableChildren = (children: ReactNode): TableData => {\n const columns: TableColumnData[] = [];\n const rows: (TableRowData | ReactElement)[] = [];\n const childrenArray = Children.toArray(children);\n\n for (const child of childrenArray) {\n if (!isValidElement(child)) continue;\n\n // Parse columns from header\n if (isComponentType(child, TableHeaderCompound)) {\n const headerProps = child.props;\n const parsedColumns = parseColumns(\n headerProps.children,\n headerProps.isHidden || false,\n );\n columns.push(...parsedColumns);\n continue;\n }\n\n // Parse rows from body\n if (isComponentType(child, TableBodyCompound)) {\n const bodyProps = child.props;\n const bodyChildren = Children.toArray(bodyProps.children);\n\n for (const rowChild of bodyChildren) {\n if (!isValidElement(rowChild)) continue;\n\n if (isComponentType(rowChild, TableRowCompound)) {\n const rowProps = rowChild.props;\n const cells = parseCells(rowProps.children, columns);\n\n rows.push({\n key: rowChild.key ?? rowProps.key ?? String(rows.length),\n cells,\n onClick: rowProps.onClick,\n dataTestId: rowProps[\"data-testid\"],\n });\n } else {\n rows.push(rowChild);\n }\n }\n }\n }\n\n return {\n columns,\n rows,\n };\n};\n"],"names":["isComponentType","element","componentType","parseColumns","headerChildren","isHeaderHidden","columns","childrenArray","Children","columnChild","isValidElement","TableColumnCompound","columnProps","parseCells","rowChildren","cells","cellIndex","cellChild","TableCellCompound","cellProps","columnKey","_a","parseTableChildren","children","rows","child","TableHeaderCompound","headerProps","parsedColumns","TableBodyCompound","bodyProps","bodyChildren","rowChild","TableRowCompound","rowProps"],"mappings":"kJAsBMA,EAAkB,CACtBC,EACAC,IACYD,EAAQ,OAASC,EAKzBC,EAAe,CACnBC,EACAC,IACsB,CACtB,MAAMC,EAA6B,CAAA,EAC7BC,EAAgBC,EAAAA,SAAS,QAAQJ,CAAc,EAErD,UAAWK,KAAeF,EACxB,GACEG,EAAAA,eAAeD,CAAW,GAC1BT,EAAgBS,EAAaE,EAAmB,mBAAA,EAChD,CACA,MAAMC,EAAcH,EAAY,MAChCH,EAAQ,KAAK,CACX,IAAKM,EAAY,GACjB,OAAQA,EAAY,SACpB,SAAUP,EACV,SAAUO,EAAY,WAAW,CAAA,CAClC,CACH,CAGK,OAAAN,CACT,EAKMO,EAAa,CACjBC,EACAR,IACoB,OACpB,MAAMS,EAAyB,CAAA,EACzBR,EAAgBC,EAAAA,SAAS,QAAQM,CAAW,EAClD,IAAIE,EAAY,EAEhB,UAAWC,KAAaV,EACtB,GACEG,EAAAA,eAAeO,CAAS,GACxBjB,EAAgBiB,EAAWC,EAAiB,iBAAA,EAC5C,CACA,MAAMC,EAAYF,EAAU,MACtBG,EAAYD,EAAU,aAAaE,EAAAf,EAAQU,CAAS,IAAjB,YAAAK,EAAoB,KAEzDD,GACFL,EAAM,KAAK,CACT,UAAAK,EACA,MAAOD,EAAU,SACjB,QAASA,EAAU,QACnB,WAAYA,EAAU,aAAa,CAAA,CACpC,EAEHH,GACF,CAGK,OAAAD,CACT,EAQaO,EAAsBC,GAAmC,CACpE,MAAMjB,EAA6B,CAAA,EAC7BkB,EAAwC,CAAA,EACxCjB,EAAgBC,EAAAA,SAAS,QAAQe,CAAQ,EAE/C,UAAWE,KAASlB,EACd,GAACG,EAAAA,eAAee,CAAK,EAGrB,IAAAzB,EAAgByB,EAAOC,EAAAA,mBAAmB,EAAG,CAC/C,MAAMC,EAAcF,EAAM,MACpBG,EAAgBzB,EACpBwB,EAAY,SACZA,EAAY,UAAY,EAAA,EAElBrB,EAAA,KAAK,GAAGsB,CAAa,EAC7B,QACF,CAGI,GAAA5B,EAAgByB,EAAOI,EAAAA,iBAAiB,EAAG,CAC7C,MAAMC,EAAYL,EAAM,MAClBM,EAAevB,EAAA,SAAS,QAAQsB,EAAU,QAAQ,EAExD,UAAWE,KAAYD,EACjB,GAACrB,EAAAA,eAAesB,CAAQ,EAExB,GAAAhC,EAAgBgC,EAAUC,EAAAA,gBAAgB,EAAG,CAC/C,MAAMC,EAAWF,EAAS,MACpBjB,EAAQF,EAAWqB,EAAS,SAAU5B,CAAO,EAEnDkB,EAAK,KAAK,CACR,IAAKQ,EAAS,KAAOE,EAAS,KAAO,OAAOV,EAAK,MAAM,EACvD,MAAAT,EACA,QAASmB,EAAS,QAClB,WAAYA,EAAS,aAAa,CAAA,CACnC,CAAA,MAEDV,EAAK,KAAKQ,CAAQ,CAGxB,EAGK,MAAA,CACL,QAAA1B,EACA,KAAAkB,CAAA,CAEJ"}
|