vector-prototype-components 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Accordion/Accordion.js +79 -0
- package/Accordion/Accordion.js.map +1 -0
- package/Accordion/Accordion.module.css +1 -0
- package/Accordion/Accordion.module.css.js +36 -0
- package/Accordion/Accordion.module.css.js.map +1 -0
- package/ActionMenu/ActionMenu.js +49 -0
- package/ActionMenu/ActionMenu.js.map +1 -0
- package/ActionMenu/ActionMenu.module.css +1 -0
- package/ActionMenu/ActionMenu.module.css.js +16 -0
- package/ActionMenu/ActionMenu.module.css.js.map +1 -0
- package/Autocomplete/Autocomplete.js +226 -0
- package/Autocomplete/Autocomplete.js.map +1 -0
- package/Autocomplete/Autocomplete.module.css +1 -0
- package/Autocomplete/Autocomplete.module.css.js +46 -0
- package/Autocomplete/Autocomplete.module.css.js.map +1 -0
- package/Avatar/Avatar.js +66 -0
- package/Avatar/Avatar.js.map +1 -0
- package/Avatar/Avatar.module.css +1 -0
- package/Avatar/Avatar.module.css.js +26 -0
- package/Avatar/Avatar.module.css.js.map +1 -0
- package/Badge/Badge.js +40 -0
- package/Badge/Badge.js.map +1 -0
- package/Badge/Badge.module.css +1 -0
- package/Badge/Badge.module.css.js +24 -0
- package/Badge/Badge.module.css.js.map +1 -0
- package/BottomBar/BottomBar.js +19 -0
- package/BottomBar/BottomBar.js.map +1 -0
- package/BottomBar/BottomBar.module.css +1 -0
- package/BottomBar/BottomBar.module.css.js +10 -0
- package/BottomBar/BottomBar.module.css.js.map +1 -0
- package/Breadcrumbs/Breadcrumbs.js +40 -0
- package/Breadcrumbs/Breadcrumbs.js.map +1 -0
- package/Breadcrumbs/Breadcrumbs.module.css +1 -0
- package/Breadcrumbs/Breadcrumbs.module.css.js +18 -0
- package/Breadcrumbs/Breadcrumbs.module.css.js.map +1 -0
- package/Button/Button.js +53 -0
- package/Button/Button.js.map +1 -0
- package/Button/Button.module.css +1 -0
- package/Button/Button.module.css.js +24 -0
- package/Button/Button.module.css.js.map +1 -0
- package/Callout/Callout.js +66 -0
- package/Callout/Callout.js.map +1 -0
- package/Callout/Callout.module.css +1 -0
- package/Callout/Callout.module.css.js +28 -0
- package/Callout/Callout.module.css.js.map +1 -0
- package/Card/Card.js +39 -0
- package/Card/Card.js.map +1 -0
- package/Card/Card.module.css +1 -0
- package/Card/Card.module.css.js +18 -0
- package/Card/Card.module.css.js.map +1 -0
- package/Checkbox/Checkbox.js +90 -0
- package/Checkbox/Checkbox.js.map +1 -0
- package/Checkbox/Checkbox.module.css +1 -0
- package/Checkbox/Checkbox.module.css.js +22 -0
- package/Checkbox/Checkbox.module.css.js.map +1 -0
- package/Chip/Chip.js +62 -0
- package/Chip/Chip.js.map +1 -0
- package/Chip/Chip.module.css +1 -0
- package/Chip/Chip.module.css.js +24 -0
- package/Chip/Chip.module.css.js.map +1 -0
- package/DatePicker/DatePicker.js +157 -0
- package/DatePicker/DatePicker.js.map +1 -0
- package/DatePicker/DatePicker.module.css +1 -0
- package/DatePicker/DatePicker.module.css.js +48 -0
- package/DatePicker/DatePicker.module.css.js.map +1 -0
- package/DatePicker/DatePickerCalendar.js +94 -0
- package/DatePicker/DatePickerCalendar.js.map +1 -0
- package/DatePicker/DatePickerCalendar.module.css +1 -0
- package/DatePicker/DatePickerCalendar.module.css.js +32 -0
- package/DatePicker/DatePickerCalendar.module.css.js.map +1 -0
- package/Divider/Divider.js +22 -0
- package/Divider/Divider.js.map +1 -0
- package/Divider/Divider.module.css +1 -0
- package/Divider/Divider.module.css.js +12 -0
- package/Divider/Divider.module.css.js.map +1 -0
- package/Dropdown/Dropdown.js +100 -0
- package/Dropdown/Dropdown.js.map +1 -0
- package/Dropdown/Dropdown.module.css +1 -0
- package/Dropdown/Dropdown.module.css.js +20 -0
- package/Dropdown/Dropdown.module.css.js.map +1 -0
- package/Icon/Icon.js +8 -0
- package/Icon/Icon.js.map +1 -0
- package/IconButton/IconButton.js +42 -0
- package/IconButton/IconButton.js.map +1 -0
- package/IconButton/IconButton.module.css +1 -0
- package/IconButton/IconButton.module.css.js +20 -0
- package/IconButton/IconButton.module.css.js.map +1 -0
- package/InputNumber/InputNumber.js +106 -0
- package/InputNumber/InputNumber.js.map +1 -0
- package/InputNumber/InputNumber.module.css +1 -0
- package/InputNumber/InputNumber.module.css.js +30 -0
- package/InputNumber/InputNumber.module.css.js.map +1 -0
- package/Menu/Menu.js +182 -0
- package/Menu/Menu.js.map +1 -0
- package/Menu/Menu.module.css +1 -0
- package/Menu/Menu.module.css.js +56 -0
- package/Menu/Menu.module.css.js.map +1 -0
- package/Menu/menuData.js +188 -0
- package/Menu/menuData.js.map +1 -0
- package/Message/Message.js +88 -0
- package/Message/Message.js.map +1 -0
- package/Message/Message.module.css +1 -0
- package/Message/Message.module.css.js +32 -0
- package/Message/Message.module.css.js.map +1 -0
- package/Modal/Modal.js +186 -0
- package/Modal/Modal.js.map +1 -0
- package/Modal/Modal.module.css +1 -0
- package/Modal/Modal.module.css.js +44 -0
- package/Modal/Modal.module.css.js.map +1 -0
- package/Multiselect/Multiselect.js +249 -0
- package/Multiselect/Multiselect.js.map +1 -0
- package/Multiselect/Multiselect.module.css +1 -0
- package/Multiselect/Multiselect.module.css.js +64 -0
- package/Multiselect/Multiselect.module.css.js.map +1 -0
- package/Overlay/Overlay.js +18 -0
- package/Overlay/Overlay.js.map +1 -0
- package/Overlay/Overlay.module.css +1 -0
- package/Overlay/Overlay.module.css.js +8 -0
- package/Overlay/Overlay.module.css.js.map +1 -0
- package/Paginator/Paginator.js +118 -0
- package/Paginator/Paginator.js.map +1 -0
- package/Paginator/Paginator.module.css +1 -0
- package/Paginator/Paginator.module.css.js +22 -0
- package/Paginator/Paginator.module.css.js.map +1 -0
- package/Panel/Panel.js +38 -0
- package/Panel/Panel.js.map +1 -0
- package/Panel/Panel.module.css +1 -0
- package/Panel/Panel.module.css.js +16 -0
- package/Panel/Panel.module.css.js.map +1 -0
- package/ProgressSpinner/ProgressSpinner.js +64 -0
- package/ProgressSpinner/ProgressSpinner.js.map +1 -0
- package/ProgressSpinner/ProgressSpinner.module.css +1 -0
- package/ProgressSpinner/ProgressSpinner.module.css.js +16 -0
- package/ProgressSpinner/ProgressSpinner.module.css.js.map +1 -0
- package/Radio/Radio.js +44 -0
- package/Radio/Radio.js.map +1 -0
- package/Radio/Radio.module.css +1 -0
- package/Radio/Radio.module.css.js +18 -0
- package/Radio/Radio.module.css.js.map +1 -0
- package/SegmentControl/SegmentControl.js +74 -0
- package/SegmentControl/SegmentControl.js.map +1 -0
- package/SegmentControl/SegmentControl.module.css +1 -0
- package/SegmentControl/SegmentControl.module.css.js +16 -0
- package/SegmentControl/SegmentControl.module.css.js.map +1 -0
- package/Select/Select.js +153 -0
- package/Select/Select.js.map +1 -0
- package/Select/Select.module.css +1 -0
- package/Select/Select.module.css.js +46 -0
- package/Select/Select.module.css.js.map +1 -0
- package/Skeleton/Skeleton.js +78 -0
- package/Skeleton/Skeleton.js.map +1 -0
- package/Skeleton/Skeleton.module.css +1 -0
- package/Skeleton/Skeleton.module.css.js +18 -0
- package/Skeleton/Skeleton.module.css.js.map +1 -0
- package/Slider/Slider.js +116 -0
- package/Slider/Slider.js.map +1 -0
- package/Slider/Slider.module.css +1 -0
- package/Slider/Slider.module.css.js +24 -0
- package/Slider/Slider.module.css.js.map +1 -0
- package/Slot/Slot.js +25 -0
- package/Slot/Slot.js.map +1 -0
- package/Slot/Slot.module.css +1 -0
- package/Slot/Slot.module.css.js +16 -0
- package/Slot/Slot.module.css.js.map +1 -0
- package/Switch/Switch.js +42 -0
- package/Switch/Switch.js.map +1 -0
- package/Switch/Switch.module.css +1 -0
- package/Switch/Switch.module.css.js +11 -0
- package/Switch/Switch.module.css.js.map +1 -0
- package/Table/Table.js +268 -0
- package/Table/Table.js.map +1 -0
- package/Table/Table.module.css +1 -0
- package/Table/Table.module.css.js +64 -0
- package/Table/Table.module.css.js.map +1 -0
- package/TableTree/TableTree.js +139 -0
- package/TableTree/TableTree.js.map +1 -0
- package/TableTree/TableTree.module.css +1 -0
- package/TableTree/TableTree.module.css.js +62 -0
- package/TableTree/TableTree.module.css.js.map +1 -0
- package/Tabs/Tabs.js +92 -0
- package/Tabs/Tabs.js.map +1 -0
- package/Tabs/Tabs.module.css +1 -0
- package/Tabs/Tabs.module.css.js +18 -0
- package/Tabs/Tabs.module.css.js.map +1 -0
- package/Tag/Tag.js +48 -0
- package/Tag/Tag.js.map +1 -0
- package/Tag/Tag.module.css +1 -0
- package/Tag/Tag.module.css.js +30 -0
- package/Tag/Tag.module.css.js.map +1 -0
- package/TextField/TextField.js +93 -0
- package/TextField/TextField.js.map +1 -0
- package/TextField/TextField.module.css +1 -0
- package/TextField/TextField.module.css.js +36 -0
- package/TextField/TextField.module.css.js.map +1 -0
- package/Textarea/Textarea.js +52 -0
- package/Textarea/Textarea.js.map +1 -0
- package/Textarea/Textarea.module.css +1 -0
- package/Textarea/Textarea.module.css.js +32 -0
- package/Textarea/Textarea.module.css.js.map +1 -0
- package/Toast/Toast.js +82 -0
- package/Toast/Toast.js.map +1 -0
- package/Toast/Toast.module.css +1 -0
- package/Toast/Toast.module.css.js +28 -0
- package/Toast/Toast.module.css.js.map +1 -0
- package/Tooltip/Tooltip.js +61 -0
- package/Tooltip/Tooltip.js.map +1 -0
- package/Tooltip/Tooltip.module.css +1 -0
- package/Tooltip/Tooltip.module.css.js +26 -0
- package/Tooltip/Tooltip.module.css.js.map +1 -0
- package/TopBar/TopBar.js +87 -0
- package/TopBar/TopBar.js.map +1 -0
- package/TopBar/TopBar.module.css +1 -0
- package/TopBar/TopBar.module.css.js +30 -0
- package/TopBar/TopBar.module.css.js.map +1 -0
- package/index.js +90 -4157
- package/index.js.map +1 -1
- package/package.json +3 -4
- package/style.css +0 -1
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { jsxs as d, jsx as a } from "react/jsx-runtime";
|
|
2
|
+
import h, { useState as B } from "react";
|
|
3
|
+
import { Minus as E, Plus as W } from "@phosphor-icons/react";
|
|
4
|
+
import { Icon as S } from "../Icon/Icon.js";
|
|
5
|
+
import { Slot as k } from "../Slot/Slot.js";
|
|
6
|
+
import e from "./Accordion.module.css.js";
|
|
7
|
+
function q({
|
|
8
|
+
title: i,
|
|
9
|
+
description: s,
|
|
10
|
+
children: f,
|
|
11
|
+
type: u = "default",
|
|
12
|
+
defaultExpanded: x = !1,
|
|
13
|
+
expanded: t,
|
|
14
|
+
onToggle: o,
|
|
15
|
+
disabled: r = !1,
|
|
16
|
+
className: v
|
|
17
|
+
}) {
|
|
18
|
+
const [N, b] = B(x), l = t !== void 0, n = l ? t : N;
|
|
19
|
+
function y() {
|
|
20
|
+
if (r) return;
|
|
21
|
+
const m = !n;
|
|
22
|
+
l || b(m), o == null || o(m);
|
|
23
|
+
}
|
|
24
|
+
const j = [e.accordion, v].filter(Boolean).join(" "), C = [
|
|
25
|
+
e.header,
|
|
26
|
+
n ? e.headerExpanded : "",
|
|
27
|
+
r ? e.headerDisabled : ""
|
|
28
|
+
].filter(Boolean).join(" "), I = [e.chevron, n ? e.chevronExpanded : ""].filter(Boolean).join(" "), c = h.useId(), p = h.useId();
|
|
29
|
+
return /* @__PURE__ */ d(
|
|
30
|
+
"div",
|
|
31
|
+
{
|
|
32
|
+
className: j,
|
|
33
|
+
"aria-disabled": r || void 0,
|
|
34
|
+
"data-expanded": n,
|
|
35
|
+
children: [
|
|
36
|
+
/* @__PURE__ */ d(
|
|
37
|
+
"button",
|
|
38
|
+
{
|
|
39
|
+
id: c,
|
|
40
|
+
className: C,
|
|
41
|
+
onClick: y,
|
|
42
|
+
disabled: r,
|
|
43
|
+
"aria-expanded": n,
|
|
44
|
+
"aria-controls": p,
|
|
45
|
+
type: "button",
|
|
46
|
+
children: [
|
|
47
|
+
u === "slot" ? /* @__PURE__ */ a("div", { className: e.slotWrapper, children: i }) : /* @__PURE__ */ d("div", { className: e.headerText, children: [
|
|
48
|
+
/* @__PURE__ */ a("p", { className: e.title, children: i }),
|
|
49
|
+
s && /* @__PURE__ */ a("p", { className: e.description, children: s })
|
|
50
|
+
] }),
|
|
51
|
+
/* @__PURE__ */ a("span", { className: e.iconButton, "aria-hidden": "true", children: /* @__PURE__ */ a(S, { as: n ? E : W, size: 16, className: I }) })
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
),
|
|
55
|
+
/* @__PURE__ */ a(
|
|
56
|
+
"div",
|
|
57
|
+
{
|
|
58
|
+
className: [e.bodyWrapper, n ? e.bodyWrapperExpanded : ""].filter(Boolean).join(" "),
|
|
59
|
+
"aria-hidden": n ? void 0 : !0,
|
|
60
|
+
children: /* @__PURE__ */ a(
|
|
61
|
+
"div",
|
|
62
|
+
{
|
|
63
|
+
id: p,
|
|
64
|
+
role: "region",
|
|
65
|
+
"aria-labelledby": c,
|
|
66
|
+
className: e.body,
|
|
67
|
+
children: /* @__PURE__ */ a("div", { className: e.bodyContent, children: /* @__PURE__ */ a(k, { children: f }) })
|
|
68
|
+
}
|
|
69
|
+
)
|
|
70
|
+
}
|
|
71
|
+
)
|
|
72
|
+
]
|
|
73
|
+
}
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
export {
|
|
77
|
+
q as Accordion
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=Accordion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Accordion.js","sources":["../../src/Accordion/Accordion.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { Minus, Plus } from '@phosphor-icons/react';\nimport { Icon } from '../Icon/index.js';\nimport { Slot } from '../Slot/index.js';\nimport styles from './Accordion.module.css';\n\nexport type AccordionType = 'default' | 'slot';\n\nexport interface AccordionProps {\n /** The title shown in the accordion header */\n title: string;\n /** Optional subtitle / description shown below the title */\n description?: string;\n /** Content rendered inside the expanded body */\n children?: React.ReactNode;\n /**\n * When type=\"slot\", the header area renders `children` inside the header\n * instead of title/description text, mirroring the Figma \"Slot\" variant.\n * When type=\"default\" (the default), title/description is shown in the\n * header and children are rendered in the body once expanded.\n */\n type?: AccordionType;\n /** Whether the accordion starts expanded */\n defaultExpanded?: boolean;\n /** Controlled expanded state */\n expanded?: boolean;\n /** Callback fired when the header is toggled */\n onToggle?: (expanded: boolean) => void;\n /** Disables the accordion */\n disabled?: boolean;\n /** Additional class applied to the root element */\n className?: string;\n}\n\nexport function Accordion({\n title,\n description,\n children,\n type = 'default',\n defaultExpanded = false,\n expanded: controlledExpanded,\n onToggle,\n disabled = false,\n className,\n}: AccordionProps) {\n const [internalExpanded, setInternalExpanded] = useState(defaultExpanded);\n\n const isControlled = controlledExpanded !== undefined;\n const isExpanded = isControlled ? controlledExpanded : internalExpanded;\n\n function handleToggle() {\n if (disabled) return;\n const next = !isExpanded;\n if (!isControlled) {\n setInternalExpanded(next);\n }\n onToggle?.(next);\n }\n\n const rootCls = [styles.accordion, className].filter(Boolean).join(' ');\n const headerCls = [\n styles.header,\n isExpanded ? styles.headerExpanded : '',\n disabled ? styles.headerDisabled : '',\n ]\n .filter(Boolean)\n .join(' ');\n const chevronCls = [styles.chevron, isExpanded ? styles.chevronExpanded : '']\n .filter(Boolean)\n .join(' ');\n\n const headerId = React.useId();\n const panelId = React.useId();\n\n return (\n <div\n className={rootCls}\n aria-disabled={disabled || undefined}\n data-expanded={isExpanded}\n >\n <button\n id={headerId}\n className={headerCls}\n onClick={handleToggle}\n disabled={disabled}\n aria-expanded={isExpanded}\n aria-controls={panelId}\n type=\"button\"\n >\n {type === 'slot' ? (\n <div className={styles.slotWrapper}>{title}</div>\n ) : (\n <div className={styles.headerText}>\n <p className={styles.title}>{title}</p>\n {description && (\n <p className={styles.description}>{description}</p>\n )}\n </div>\n )}\n\n <span className={styles.iconButton} aria-hidden=\"true\">\n <Icon as={isExpanded ? Minus : Plus} size={16} className={chevronCls} />\n </span>\n </button>\n\n <div\n className={[styles.bodyWrapper, isExpanded ? styles.bodyWrapperExpanded : ''].filter(Boolean).join(' ')}\n aria-hidden={isExpanded ? undefined : true}\n >\n <div\n id={panelId}\n role=\"region\"\n aria-labelledby={headerId}\n className={styles.body}\n >\n <div className={styles.bodyContent}>\n <Slot>{children}</Slot>\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"names":["Accordion","title","description","children","type","defaultExpanded","controlledExpanded","onToggle","disabled","className","internalExpanded","setInternalExpanded","useState","isControlled","isExpanded","handleToggle","next","rootCls","styles","headerCls","chevronCls","headerId","React","panelId","jsxs","jsx","Icon","Minus","Plus","Slot"],"mappings":";;;;;;AAkCO,SAASA,EAAU;AAAA,EACxB,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,iBAAAC,IAAkB;AAAA,EAClB,UAAUC;AAAA,EACV,UAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,WAAAC;AACF,GAAmB;AACjB,QAAM,CAACC,GAAkBC,CAAmB,IAAIC,EAASP,CAAe,GAElEQ,IAAeP,MAAuB,QACtCQ,IAAaD,IAAeP,IAAqBI;AAEvD,WAASK,IAAe;AACtB,QAAIP,EAAU;AACd,UAAMQ,IAAO,CAACF;AACd,IAAKD,KACHF,EAAoBK,CAAI,GAE1BT,KAAA,QAAAA,EAAWS;AAAA,EACb;AAEA,QAAMC,IAAU,CAACC,EAAO,WAAWT,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GAChEU,IAAY;AAAA,IAChBD,EAAO;AAAA,IACPJ,IAAaI,EAAO,iBAAiB;AAAA,IACrCV,IAAWU,EAAO,iBAAiB;AAAA,EAAA,EAElC,OAAO,OAAO,EACd,KAAK,GAAG,GACLE,IAAa,CAACF,EAAO,SAASJ,IAAaI,EAAO,kBAAkB,EAAE,EACzE,OAAO,OAAO,EACd,KAAK,GAAG,GAELG,IAAWC,EAAM,MAAA,GACjBC,IAAUD,EAAM,MAAA;AAEtB,SACE,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWP;AAAA,MACX,iBAAeT,KAAY;AAAA,MAC3B,iBAAeM;AAAA,MAEf,UAAA;AAAA,QAAA,gBAAAU;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAIH;AAAA,YACJ,WAAWF;AAAA,YACX,SAASJ;AAAA,YACT,UAAAP;AAAA,YACA,iBAAeM;AAAA,YACf,iBAAeS;AAAA,YACf,MAAK;AAAA,YAEJ,UAAA;AAAA,cAAAnB,MAAS,SACR,gBAAAqB,EAAC,OAAA,EAAI,WAAWP,EAAO,aAAc,UAAAjB,EAAA,CAAM,IAE3C,gBAAAuB,EAAC,OAAA,EAAI,WAAWN,EAAO,YACrB,UAAA;AAAA,gBAAA,gBAAAO,EAAC,KAAA,EAAE,WAAWP,EAAO,OAAQ,UAAAjB,GAAM;AAAA,gBAClCC,KACC,gBAAAuB,EAAC,KAAA,EAAE,WAAWP,EAAO,aAAc,UAAAhB,EAAA,CAAY;AAAA,cAAA,GAEnD;AAAA,gCAGD,QAAA,EAAK,WAAWgB,EAAO,YAAY,eAAY,QAC9C,UAAA,gBAAAO,EAACC,GAAA,EAAK,IAAIZ,IAAaa,IAAQC,GAAM,MAAM,IAAI,WAAWR,GAAY,EAAA,CACxE;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGF,gBAAAK;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW,CAACP,EAAO,aAAaJ,IAAaI,EAAO,sBAAsB,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,YACtG,eAAaJ,IAAa,SAAY;AAAA,YAEtC,UAAA,gBAAAW;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,IAAIF;AAAA,gBACJ,MAAK;AAAA,gBACL,mBAAiBF;AAAA,gBACjB,WAAWH,EAAO;AAAA,gBAElB,UAAA,gBAAAO,EAAC,SAAI,WAAWP,EAAO,aACrB,UAAA,gBAAAO,EAACI,GAAA,EAAM,UAAA1B,GAAS,EAAA,CAClB;AAAA,cAAA;AAAA,YAAA;AAAA,UACF;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAGN;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._accordion_1xiav_2{border:1px solid var(--color-stroke-neutral-default);border-radius:12px;overflow:hidden;box-shadow:var(--shadow-layer-xs);width:100%;background-color:var(--color-canvas-neutral-white);transition:box-shadow .12s ease}._header_1xiav_13{display:flex;align-items:center;justify-content:space-between;width:100%;padding:16px 20px;background-color:var(--color-canvas-neutral-white);border:none;cursor:pointer;text-align:left;transition:background-color .12s ease,box-shadow .12s ease;border-bottom:1px solid transparent}._header_1xiav_13:focus-visible{outline:none;box-shadow:var(--shadow-focus)}._header_1xiav_13:hover:not(:disabled){background-color:var(--color-fill-neutral-subtle)}._headerExpanded_1xiav_41{border-bottom-color:var(--color-stroke-neutral-default)}._headerText_1xiav_46{display:flex;flex-direction:column;align-items:flex-start;justify-content:center;flex:1 0 0;min-width:0}._title_1xiav_55{font-family:var(--font-family-base, system-ui, sans-serif);font-size:var(--font-size-16);font-weight:var(--font-weight-semibold);line-height:var(--font-line-height-16);color:var(--color-text-brand-strong);width:100%;margin:0;word-break:break-word}._description_1xiav_66{font-family:var(--font-family-base, system-ui, sans-serif);font-size:var(--font-size-14);font-weight:var(--font-weight-regular);line-height:var(--font-line-height-14);color:var(--color-text-neutral-subtle);width:100%;margin:2px 0 0;word-break:break-word}._iconButton_1xiav_79{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:32px;height:32px;border-radius:9999px;border:none;background:transparent;cursor:pointer;color:var(--color-icon-neutral-default);transition:transform .2s ease,color .12s ease;padding:0}._iconButton_1xiav_79 svg{display:block}._chevron_1xiav_100{transition:transform .2s ease}._chevronExpanded_1xiav_104{transform:rotate(180deg)}._bodyWrapper_1xiav_110{display:grid;grid-template-rows:0fr;transition:grid-template-rows .22s ease}._bodyWrapperExpanded_1xiav_116{grid-template-rows:1fr}._body_1xiav_110{overflow:hidden;min-height:0}._bodyContent_1xiav_127{background-color:var(--color-canvas-neutral-white);padding:20px}._slotWrapper_1xiav_133{display:flex;align-items:center;flex:1 0 0;align-self:stretch}._accordion_1xiav_2[aria-disabled=true],._accordion_1xiav_2:has(._header_1xiav_13:disabled){opacity:.5;cursor:not-allowed;pointer-events:none}._headerDisabled_1xiav_148{opacity:.5;cursor:not-allowed;pointer-events:none}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import './Accordion.module.css';const e = "_accordion_1xiav_2", o = "_header_1xiav_13", a = "_headerExpanded_1xiav_41", d = "_headerText_1xiav_46", n = "_title_1xiav_55", t = "_description_1xiav_66", _ = "_iconButton_1xiav_79", r = "_chevron_1xiav_100", c = "_chevronExpanded_1xiav_104", i = "_bodyWrapper_1xiav_110", p = "_bodyWrapperExpanded_1xiav_116", s = "_body_1xiav_110", x = "_bodyContent_1xiav_127", v = "_slotWrapper_1xiav_133", h = "_headerDisabled_1xiav_148", b = {
|
|
2
|
+
accordion: e,
|
|
3
|
+
header: o,
|
|
4
|
+
headerExpanded: a,
|
|
5
|
+
headerText: d,
|
|
6
|
+
title: n,
|
|
7
|
+
description: t,
|
|
8
|
+
iconButton: _,
|
|
9
|
+
chevron: r,
|
|
10
|
+
chevronExpanded: c,
|
|
11
|
+
bodyWrapper: i,
|
|
12
|
+
bodyWrapperExpanded: p,
|
|
13
|
+
body: s,
|
|
14
|
+
bodyContent: x,
|
|
15
|
+
slotWrapper: v,
|
|
16
|
+
headerDisabled: h
|
|
17
|
+
};
|
|
18
|
+
export {
|
|
19
|
+
e as accordion,
|
|
20
|
+
s as body,
|
|
21
|
+
x as bodyContent,
|
|
22
|
+
i as bodyWrapper,
|
|
23
|
+
p as bodyWrapperExpanded,
|
|
24
|
+
r as chevron,
|
|
25
|
+
c as chevronExpanded,
|
|
26
|
+
b as default,
|
|
27
|
+
t as description,
|
|
28
|
+
o as header,
|
|
29
|
+
h as headerDisabled,
|
|
30
|
+
a as headerExpanded,
|
|
31
|
+
d as headerText,
|
|
32
|
+
_ as iconButton,
|
|
33
|
+
v as slotWrapper,
|
|
34
|
+
n as title
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=Accordion.module.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Accordion.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { jsx as n, jsxs as t } from "react/jsx-runtime";
|
|
2
|
+
import { Icon as a } from "../Icon/Icon.js";
|
|
3
|
+
import l from "./ActionMenu.module.css.js";
|
|
4
|
+
function m({
|
|
5
|
+
icon: i,
|
|
6
|
+
label: s,
|
|
7
|
+
disabled: o,
|
|
8
|
+
className: c,
|
|
9
|
+
...e
|
|
10
|
+
}) {
|
|
11
|
+
const r = [
|
|
12
|
+
l.item,
|
|
13
|
+
o ? l.itemDisabled : void 0,
|
|
14
|
+
c
|
|
15
|
+
].filter(Boolean).join(" ");
|
|
16
|
+
return /* @__PURE__ */ n("li", { role: "none", children: /* @__PURE__ */ t(
|
|
17
|
+
"button",
|
|
18
|
+
{
|
|
19
|
+
type: "button",
|
|
20
|
+
className: r,
|
|
21
|
+
disabled: o,
|
|
22
|
+
"aria-disabled": o,
|
|
23
|
+
...e,
|
|
24
|
+
children: [
|
|
25
|
+
i && /* @__PURE__ */ n("span", { className: l.itemIcon, children: /* @__PURE__ */ n(a, { as: i, size: 20 }) }),
|
|
26
|
+
/* @__PURE__ */ n("span", { className: l.itemLabel, children: s })
|
|
27
|
+
]
|
|
28
|
+
}
|
|
29
|
+
) });
|
|
30
|
+
}
|
|
31
|
+
function b({ items: i, className: s, ...o }) {
|
|
32
|
+
const c = [l.menu, s].filter(Boolean).join(" ");
|
|
33
|
+
return /* @__PURE__ */ n("ul", { role: "menu", className: c, ...o, children: i.map((e, r) => /* @__PURE__ */ n(
|
|
34
|
+
m,
|
|
35
|
+
{
|
|
36
|
+
icon: e.icon,
|
|
37
|
+
label: e.label,
|
|
38
|
+
disabled: e.disabled,
|
|
39
|
+
onClick: e.onClick,
|
|
40
|
+
role: "menuitem"
|
|
41
|
+
},
|
|
42
|
+
e.key ?? r
|
|
43
|
+
)) });
|
|
44
|
+
}
|
|
45
|
+
export {
|
|
46
|
+
b as ActionMenu,
|
|
47
|
+
m as ActionMenuItem
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=ActionMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActionMenu.js","sources":["../../src/ActionMenu/ActionMenu.tsx"],"sourcesContent":["import React from 'react';\nimport type { Icon as PhosphorIcon } from '@phosphor-icons/react';\nimport { Icon } from '../Icon/index.js';\nimport styles from './ActionMenu.module.css';\n\n/* ─── ActionMenuItem ─────────────────────────────────────────── */\n\nexport interface ActionMenuItemProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Optional leading icon from @phosphor-icons/react */\n icon?: PhosphorIcon;\n /** Text label for the item */\n label: string;\n /** Whether the item is disabled */\n disabled?: boolean;\n}\n\nexport function ActionMenuItem({\n icon,\n label,\n disabled,\n className,\n ...props\n}: ActionMenuItemProps) {\n const cls = [\n styles.item,\n disabled ? styles.itemDisabled : undefined,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <li role=\"none\">\n <button\n type=\"button\"\n className={cls}\n disabled={disabled}\n aria-disabled={disabled}\n {...props}\n >\n {icon && (\n <span className={styles.itemIcon}>\n <Icon as={icon} size={20} />\n </span>\n )}\n <span className={styles.itemLabel}>{label}</span>\n </button>\n </li>\n );\n}\n\n/* ─── ActionMenu ─────────────────────────────────────────────── */\n\nexport interface ActionMenuItemConfig {\n /** Unique key for the item */\n key?: string;\n /** Text label */\n label: string;\n /** Optional leading icon */\n icon?: PhosphorIcon;\n /** Whether the item is disabled */\n disabled?: boolean;\n /** Click handler */\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\n}\n\nexport interface ActionMenuProps extends React.HTMLAttributes<HTMLUListElement> {\n /** Array of menu item configurations */\n items: ActionMenuItemConfig[];\n}\n\nexport function ActionMenu({ items, className, ...props }: ActionMenuProps) {\n const cls = [styles.menu, className].filter(Boolean).join(' ');\n\n return (\n <ul role=\"menu\" className={cls} {...props}>\n {items.map((item, index) => (\n <ActionMenuItem\n key={item.key ?? index}\n icon={item.icon}\n label={item.label}\n disabled={item.disabled}\n onClick={item.onClick}\n role=\"menuitem\"\n />\n ))}\n </ul>\n );\n}\n"],"names":["ActionMenuItem","icon","label","disabled","className","props","cls","styles","jsx","jsxs","Icon","ActionMenu","items","item","index"],"mappings":";;;AAiBO,SAASA,EAAe;AAAA,EAC7B,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,GAAGC;AACL,GAAwB;AACtB,QAAMC,IAAM;AAAA,IACVC,EAAO;AAAA,IACPJ,IAAWI,EAAO,eAAe;AAAA,IACjCH;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACE,gBAAAI,EAAC,MAAA,EAAG,MAAK,QACP,UAAA,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAWH;AAAA,MACX,UAAAH;AAAA,MACA,iBAAeA;AAAA,MACd,GAAGE;AAAA,MAEH,UAAA;AAAA,QAAAJ,KACC,gBAAAO,EAAC,QAAA,EAAK,WAAWD,EAAO,UACtB,UAAA,gBAAAC,EAACE,GAAA,EAAK,IAAIT,GAAM,MAAM,GAAA,CAAI,GAC5B;AAAA,QAEF,gBAAAO,EAAC,QAAA,EAAK,WAAWD,EAAO,WAAY,UAAAL,EAAA,CAAM;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,GAE9C;AAEJ;AAsBO,SAASS,EAAW,EAAE,OAAAC,GAAO,WAAAR,GAAW,GAAGC,KAA0B;AAC1E,QAAMC,IAAM,CAACC,EAAO,MAAMH,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE7D,SACE,gBAAAI,EAAC,MAAA,EAAG,MAAK,QAAO,WAAWF,GAAM,GAAGD,GACjC,UAAAO,EAAM,IAAI,CAACC,GAAMC,MAChB,gBAAAN;AAAA,IAACR;AAAA,IAAA;AAAA,MAEC,MAAMa,EAAK;AAAA,MACX,OAAOA,EAAK;AAAA,MACZ,UAAUA,EAAK;AAAA,MACf,SAASA,EAAK;AAAA,MACd,MAAK;AAAA,IAAA;AAAA,IALAA,EAAK,OAAOC;AAAA,EAAA,CAOpB,GACH;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._menu_1fv7c_2{display:inline-flex;flex-direction:column;background-color:var(--color-canvas-neutral-white);border:1px solid var(--color-stroke-neutral-default);border-radius:8px;padding:8px;min-width:220px;box-shadow:var(--shadow-layer-sm);list-style:none;margin:0}._item_1fv7c_16{box-sizing:border-box;display:flex;align-items:center;gap:8px;height:44px;padding:12px 16px;border-radius:4px;background-color:transparent;color:var(--color-text-neutral-mudle);font-family:var(--font-family-base, system-ui, sans-serif);font-size:var(--font-size-14);font-weight:var(--font-weight-medium);line-height:var(--font-line-height-14);cursor:pointer;border:none;text-align:left;width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:background-color .12s ease,color .12s ease,box-shadow .12s ease}._item_1fv7c_16:hover:not(._itemDisabled_1fv7c_43){background-color:var(--color-fill-interaction-brand-hover);color:var(--color-text-neutral-inverse)}._item_1fv7c_16:hover:not(._itemDisabled_1fv7c_43) ._itemIcon_1fv7c_48{color:var(--color-icon-neutral-inverse)}._item_1fv7c_16:focus-visible{outline:none;box-shadow:var(--shadow-focus)}._itemDisabled_1fv7c_43{opacity:.5;cursor:not-allowed;pointer-events:none}._itemIcon_1fv7c_48{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--color-icon-neutral-default);transition:color .12s ease}._itemLabel_1fv7c_74{flex:1 0 0;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import './ActionMenu.module.css';const e = "_menu_1fv7c_2", t = "_item_1fv7c_16", i = "_itemDisabled_1fv7c_43", m = "_itemIcon_1fv7c_48", _ = "_itemLabel_1fv7c_74", c = {
|
|
2
|
+
menu: e,
|
|
3
|
+
item: t,
|
|
4
|
+
itemDisabled: i,
|
|
5
|
+
itemIcon: m,
|
|
6
|
+
itemLabel: _
|
|
7
|
+
};
|
|
8
|
+
export {
|
|
9
|
+
c as default,
|
|
10
|
+
t as item,
|
|
11
|
+
i as itemDisabled,
|
|
12
|
+
m as itemIcon,
|
|
13
|
+
_ as itemLabel,
|
|
14
|
+
e as menu
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=ActionMenu.module.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActionMenu.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { jsxs as I, jsx as u } from "react/jsx-runtime";
|
|
2
|
+
import { useId as ee, useState as g, useRef as H, useCallback as S, useEffect as te } from "react";
|
|
3
|
+
import { CaretDown as re, Warning as ne, CheckCircle as se, XCircle as ce, Info as ae } from "@phosphor-icons/react";
|
|
4
|
+
import { Icon as E } from "../Icon/Icon.js";
|
|
5
|
+
import { Dropdown as oe } from "../Dropdown/Dropdown.js";
|
|
6
|
+
import r from "./Autocomplete.module.css.js";
|
|
7
|
+
const ie = {
|
|
8
|
+
default: ae,
|
|
9
|
+
danger: ce,
|
|
10
|
+
success: se,
|
|
11
|
+
warning: ne
|
|
12
|
+
}, le = {
|
|
13
|
+
default: "",
|
|
14
|
+
danger: r.hintDanger,
|
|
15
|
+
success: r.hintSuccess,
|
|
16
|
+
warning: r.hintWarning
|
|
17
|
+
};
|
|
18
|
+
function ue(c) {
|
|
19
|
+
return c === "danger" ? "danger" : c === "success" ? "success" : "default";
|
|
20
|
+
}
|
|
21
|
+
function ve({
|
|
22
|
+
options: c,
|
|
23
|
+
value: x,
|
|
24
|
+
onChange: n,
|
|
25
|
+
placeholder: P = "Digite para buscar",
|
|
26
|
+
label: L = "Label",
|
|
27
|
+
showLabel: M = !0,
|
|
28
|
+
hint: T,
|
|
29
|
+
state: k = "default",
|
|
30
|
+
disabled: i = !1,
|
|
31
|
+
leadingIcon: V,
|
|
32
|
+
className: R,
|
|
33
|
+
"aria-label": z,
|
|
34
|
+
id: F
|
|
35
|
+
}) {
|
|
36
|
+
const W = ee(), y = F ?? `autocomplete-${W}`, m = `${y}-listbox`, [h, D] = g(""), [s, $] = g(!1), [w, f] = g(-1), O = H(null), d = H(null), p = H(""), C = c.find((e) => e.value === x), b = h.trim() ? c.filter(
|
|
37
|
+
(e) => e.label.toLowerCase().includes(h.toLowerCase())
|
|
38
|
+
) : c, N = S(() => {
|
|
39
|
+
i || ($(!0), f(-1));
|
|
40
|
+
}, [i]), l = S((e = !0) => {
|
|
41
|
+
if (e) {
|
|
42
|
+
const t = p.current.trim();
|
|
43
|
+
if (t) {
|
|
44
|
+
const a = c.find(
|
|
45
|
+
(v) => v.label.toLowerCase() === t.toLowerCase()
|
|
46
|
+
);
|
|
47
|
+
n == null || n(a ? a.value : t);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
$(!1), f(-1), p.current = "", D("");
|
|
51
|
+
}, [c, n]), j = S(
|
|
52
|
+
(e) => {
|
|
53
|
+
var t;
|
|
54
|
+
n == null || n(e.value), l(!1), (t = d.current) == null || t.blur();
|
|
55
|
+
},
|
|
56
|
+
[n, l]
|
|
57
|
+
);
|
|
58
|
+
te(() => {
|
|
59
|
+
function e(t) {
|
|
60
|
+
O.current && !O.current.contains(t.target) && l();
|
|
61
|
+
}
|
|
62
|
+
return s && document.addEventListener("mousedown", e), () => {
|
|
63
|
+
document.removeEventListener("mousedown", e);
|
|
64
|
+
};
|
|
65
|
+
}, [s, l]);
|
|
66
|
+
function _(e) {
|
|
67
|
+
const t = e.target.value;
|
|
68
|
+
p.current = t, D(t), f(-1), !s && t.trim() && c.some(
|
|
69
|
+
(v) => v.label.toLowerCase().includes(t.toLowerCase())
|
|
70
|
+
) && N();
|
|
71
|
+
}
|
|
72
|
+
function K() {
|
|
73
|
+
const e = p.current.trim();
|
|
74
|
+
if (e) {
|
|
75
|
+
const t = c.find(
|
|
76
|
+
(a) => a.label.toLowerCase() === e.toLowerCase()
|
|
77
|
+
);
|
|
78
|
+
n == null || n(t ? t.value : e);
|
|
79
|
+
}
|
|
80
|
+
p.current = "", D(""), $(!1), f(-1);
|
|
81
|
+
}
|
|
82
|
+
function G(e) {
|
|
83
|
+
var t;
|
|
84
|
+
e.stopPropagation(), !i && ((t = d.current) == null || t.focus(), s ? l(!1) : N());
|
|
85
|
+
}
|
|
86
|
+
function U(e) {
|
|
87
|
+
var t, a, v;
|
|
88
|
+
if (!i)
|
|
89
|
+
switch (e.key) {
|
|
90
|
+
case "ArrowDown": {
|
|
91
|
+
e.preventDefault(), s || N(), f(
|
|
92
|
+
(o) => o < b.length - 1 ? o + 1 : 0
|
|
93
|
+
);
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
case "ArrowUp": {
|
|
97
|
+
e.preventDefault(), s || N(), f(
|
|
98
|
+
(o) => o > 0 ? o - 1 : b.length - 1
|
|
99
|
+
);
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
case "Enter": {
|
|
103
|
+
if (e.preventDefault(), s && w >= 0 && b[w])
|
|
104
|
+
j(b[w]);
|
|
105
|
+
else if (s)
|
|
106
|
+
l(!0), (t = d.current) == null || t.blur();
|
|
107
|
+
else {
|
|
108
|
+
const o = p.current.trim();
|
|
109
|
+
if (o) {
|
|
110
|
+
const B = c.find(
|
|
111
|
+
(Z) => Z.label.toLowerCase() === o.toLowerCase()
|
|
112
|
+
);
|
|
113
|
+
n == null || n(B ? B.value : o), p.current = "", D("");
|
|
114
|
+
}
|
|
115
|
+
(a = d.current) == null || a.blur();
|
|
116
|
+
}
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
case "Escape": {
|
|
120
|
+
l(!1), (v = d.current) == null || v.blur();
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
case "Tab": {
|
|
124
|
+
l(!0);
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function X() {
|
|
130
|
+
var e;
|
|
131
|
+
i || (e = d.current) == null || e.focus();
|
|
132
|
+
}
|
|
133
|
+
const A = ue(k), q = ie[A], J = [
|
|
134
|
+
r.field,
|
|
135
|
+
k === "danger" ? r.fieldDanger : "",
|
|
136
|
+
k === "success" ? r.fieldSuccess : "",
|
|
137
|
+
i ? r.fieldDisabled : "",
|
|
138
|
+
s ? r.fieldOpen : ""
|
|
139
|
+
].filter(Boolean).join(" "), Q = [
|
|
140
|
+
r.autocomplete,
|
|
141
|
+
i ? r.autocompleteDisabled : "",
|
|
142
|
+
R
|
|
143
|
+
].filter(Boolean).join(" "), Y = h !== "" ? h : (C == null ? void 0 : C.label) ?? x ?? "";
|
|
144
|
+
return /* @__PURE__ */ I("div", { className: Q, ref: O, children: [
|
|
145
|
+
/* @__PURE__ */ I("div", { className: r.topGroup, children: [
|
|
146
|
+
M && /* @__PURE__ */ u("label", { className: r.label, htmlFor: y, children: L }),
|
|
147
|
+
/* @__PURE__ */ I("div", { className: r.menuWrapper, children: [
|
|
148
|
+
/* @__PURE__ */ I(
|
|
149
|
+
"div",
|
|
150
|
+
{
|
|
151
|
+
className: J,
|
|
152
|
+
onClick: X,
|
|
153
|
+
role: "combobox",
|
|
154
|
+
"aria-expanded": s,
|
|
155
|
+
"aria-haspopup": "listbox",
|
|
156
|
+
"aria-owns": m,
|
|
157
|
+
"aria-controls": m,
|
|
158
|
+
children: [
|
|
159
|
+
V && /* @__PURE__ */ u(E, { as: V, size: 16 }),
|
|
160
|
+
/* @__PURE__ */ u("div", { className: r.fieldContent, children: /* @__PURE__ */ u(
|
|
161
|
+
"input",
|
|
162
|
+
{
|
|
163
|
+
ref: d,
|
|
164
|
+
id: y,
|
|
165
|
+
className: r.input,
|
|
166
|
+
type: "text",
|
|
167
|
+
role: "searchbox",
|
|
168
|
+
autoComplete: "off",
|
|
169
|
+
"aria-autocomplete": "list",
|
|
170
|
+
"aria-controls": m,
|
|
171
|
+
"aria-activedescendant": w >= 0 ? `${m}-option-${w}` : void 0,
|
|
172
|
+
"aria-label": M ? void 0 : z ?? L,
|
|
173
|
+
disabled: i,
|
|
174
|
+
value: Y,
|
|
175
|
+
placeholder: P,
|
|
176
|
+
onChange: _,
|
|
177
|
+
onBlur: K,
|
|
178
|
+
onKeyDown: U
|
|
179
|
+
}
|
|
180
|
+
) }),
|
|
181
|
+
/* @__PURE__ */ u(
|
|
182
|
+
E,
|
|
183
|
+
{
|
|
184
|
+
as: re,
|
|
185
|
+
size: 16,
|
|
186
|
+
className: `${r.caretIcon}${s ? ` ${r.caretIconOpen}` : ""}`,
|
|
187
|
+
weight: "bold",
|
|
188
|
+
onClick: G
|
|
189
|
+
}
|
|
190
|
+
)
|
|
191
|
+
]
|
|
192
|
+
}
|
|
193
|
+
),
|
|
194
|
+
s && /* @__PURE__ */ u(
|
|
195
|
+
oe,
|
|
196
|
+
{
|
|
197
|
+
id: m,
|
|
198
|
+
"aria-label": L,
|
|
199
|
+
className: r.menuPanel,
|
|
200
|
+
fluid: !0,
|
|
201
|
+
options: b,
|
|
202
|
+
selectedValue: x,
|
|
203
|
+
activeIndex: w,
|
|
204
|
+
getOptionId: (e, t) => `${m}-option-${t}`,
|
|
205
|
+
optionsFocusable: !1,
|
|
206
|
+
selectOnPointerDown: !0,
|
|
207
|
+
onOptionHover: f,
|
|
208
|
+
onSelect: (e) => {
|
|
209
|
+
const t = b.find((a) => a.value === e);
|
|
210
|
+
t && j(t);
|
|
211
|
+
},
|
|
212
|
+
emptyMessage: "No options found"
|
|
213
|
+
}
|
|
214
|
+
)
|
|
215
|
+
] })
|
|
216
|
+
] }),
|
|
217
|
+
T && /* @__PURE__ */ I("div", { className: `${r.hint} ${le[A]}`, children: [
|
|
218
|
+
/* @__PURE__ */ u(E, { as: q, size: 16, className: r.hintIcon }),
|
|
219
|
+
/* @__PURE__ */ u("span", { children: T })
|
|
220
|
+
] })
|
|
221
|
+
] });
|
|
222
|
+
}
|
|
223
|
+
export {
|
|
224
|
+
ve as Autocomplete
|
|
225
|
+
};
|
|
226
|
+
//# sourceMappingURL=Autocomplete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Autocomplete.js","sources":["../../src/Autocomplete/Autocomplete.tsx"],"sourcesContent":["import React, { useRef, useState, useId, useCallback, useEffect } from 'react';\nimport type { Icon as PhosphorIcon } from '@phosphor-icons/react';\nimport { CaretDown, Info, XCircle, CheckCircle, Warning } from '@phosphor-icons/react';\nimport { Icon } from '../Icon/index.js';\nimport { Dropdown } from '../Dropdown/index.js';\nimport styles from './Autocomplete.module.css';\n\nexport type AutocompleteState = 'default' | 'danger' | 'success';\nexport type AutocompleteHintType = 'default' | 'danger' | 'success' | 'warning';\n\nexport interface AutocompleteOption {\n label: string;\n value: string;\n}\n\nexport interface AutocompleteProps {\n /** Options to display in the dropdown */\n options: AutocompleteOption[];\n /** Currently selected value */\n value?: string;\n /** Callback when selection changes */\n onChange?: (value: string) => void;\n /** Placeholder text shown when no value is selected */\n placeholder?: string;\n /** Field label */\n label?: string;\n /** Whether to show the label */\n showLabel?: boolean;\n /** Hint message shown below the field */\n hint?: string;\n /** Visual validation state */\n state?: AutocompleteState;\n /** Disabled state */\n disabled?: boolean;\n /** Leading icon in the field */\n leadingIcon?: PhosphorIcon;\n /** Additional class name */\n className?: string;\n /** aria-label for the input (used when label is hidden) */\n 'aria-label'?: string;\n /** ID for the input element */\n id?: string;\n}\n\nconst HINT_ICON: Record<AutocompleteHintType, PhosphorIcon> = {\n default: Info,\n danger: XCircle,\n success: CheckCircle,\n warning: Warning,\n};\n\nconst HINT_CLASS: Record<AutocompleteHintType, string> = {\n default: '',\n danger: styles.hintDanger,\n success: styles.hintSuccess,\n warning: styles.hintWarning,\n};\n\nfunction getHintType(state: AutocompleteState): AutocompleteHintType {\n if (state === 'danger') return 'danger';\n if (state === 'success') return 'success';\n return 'default';\n}\n\nexport function Autocomplete({\n options,\n value,\n onChange,\n placeholder = 'Digite para buscar',\n label = 'Label',\n showLabel = true,\n hint,\n state = 'default',\n disabled = false,\n leadingIcon,\n className,\n 'aria-label': ariaLabel,\n id: idProp,\n}: AutocompleteProps) {\n const generatedId = useId();\n const inputId = idProp ?? `autocomplete-${generatedId}`;\n const listboxId = `${inputId}-listbox`;\n\n const [inputValue, setInputValue] = useState('');\n const [isOpen, setIsOpen] = useState(false);\n const [highlightedIndex, setHighlightedIndex] = useState<number>(-1);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const inputValueRef = useRef('');\n\n // Derive display value: when closed and a value is selected, show its label\n const selectedOption = options.find((o) => o.value === value);\n\n const filteredOptions = inputValue.trim()\n ? options.filter((o) =>\n o.label.toLowerCase().includes(inputValue.toLowerCase())\n )\n : options;\n\n const openMenu = useCallback(() => {\n if (!disabled) {\n setIsOpen(true);\n setHighlightedIndex(-1);\n }\n }, [disabled]);\n\n const closeMenu = useCallback((commit = true) => {\n if (commit) {\n const typed = inputValueRef.current.trim();\n if (typed) {\n const matchedOption = options.find(\n (o) => o.label.toLowerCase() === typed.toLowerCase()\n );\n onChange?.(matchedOption ? matchedOption.value : typed);\n }\n }\n setIsOpen(false);\n setHighlightedIndex(-1);\n inputValueRef.current = '';\n setInputValue('');\n }, [options, onChange]);\n\n const selectOption = useCallback(\n (option: AutocompleteOption) => {\n onChange?.(option.value);\n closeMenu(false);\n inputRef.current?.blur();\n },\n [onChange, closeMenu]\n );\n\n // Close on outside click\n useEffect(() => {\n function handlePointerDown(e: MouseEvent) {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n closeMenu();\n }\n }\n if (isOpen) {\n document.addEventListener('mousedown', handlePointerDown);\n }\n return () => {\n document.removeEventListener('mousedown', handlePointerDown);\n };\n }, [isOpen, closeMenu]);\n\n function handleInputChange(e: React.ChangeEvent<HTMLInputElement>) {\n const val = e.target.value;\n inputValueRef.current = val;\n setInputValue(val);\n setHighlightedIndex(-1);\n if (!isOpen && val.trim()) {\n const hasMatches = options.some((o) =>\n o.label.toLowerCase().includes(val.toLowerCase())\n );\n if (hasMatches) openMenu();\n }\n }\n\n function handleInputBlur() {\n const typed = inputValueRef.current.trim();\n if (typed) {\n const matched = options.find(\n (o) => o.label.toLowerCase() === typed.toLowerCase()\n );\n onChange?.(matched ? matched.value : typed);\n }\n inputValueRef.current = '';\n setInputValue('');\n setIsOpen(false);\n setHighlightedIndex(-1);\n }\n\n function handleCaretClick(e: React.MouseEvent) {\n e.stopPropagation();\n if (disabled) return;\n inputRef.current?.focus();\n if (isOpen) {\n closeMenu(false);\n } else {\n openMenu();\n }\n }\n\n function handleKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n if (disabled) return;\n switch (e.key) {\n case 'ArrowDown': {\n e.preventDefault();\n if (!isOpen) openMenu();\n setHighlightedIndex((prev) =>\n prev < filteredOptions.length - 1 ? prev + 1 : 0\n );\n break;\n }\n case 'ArrowUp': {\n e.preventDefault();\n if (!isOpen) openMenu();\n setHighlightedIndex((prev) =>\n prev > 0 ? prev - 1 : filteredOptions.length - 1\n );\n break;\n }\n case 'Enter': {\n e.preventDefault();\n if (isOpen && highlightedIndex >= 0 && filteredOptions[highlightedIndex]) {\n selectOption(filteredOptions[highlightedIndex]);\n } else if (isOpen) {\n closeMenu(true);\n inputRef.current?.blur();\n } else {\n // Dropdown closed (e.g. no matches): commit whatever was typed\n const typed = inputValueRef.current.trim();\n if (typed) {\n const matched = options.find(\n (o) => o.label.toLowerCase() === typed.toLowerCase()\n );\n onChange?.(matched ? matched.value : typed);\n inputValueRef.current = '';\n setInputValue('');\n }\n inputRef.current?.blur();\n }\n break;\n }\n case 'Escape': {\n closeMenu(false);\n inputRef.current?.blur();\n break;\n }\n case 'Tab': {\n closeMenu(true);\n break;\n }\n }\n }\n\n function handleFieldClick() {\n if (disabled) return;\n inputRef.current?.focus();\n }\n\n const hintType = getHintType(state);\n const HintIcon = HINT_ICON[hintType];\n\n const fieldClasses = [\n styles.field,\n state === 'danger' ? styles.fieldDanger : '',\n state === 'success' ? styles.fieldSuccess : '',\n disabled ? styles.fieldDisabled : '',\n isOpen ? styles.fieldOpen : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n const rootClasses = [\n styles.autocomplete,\n disabled ? styles.autocompleteDisabled : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n // Show typed text if user is typing; otherwise show committed value (option label or free-form)\n const inputDisplayValue = inputValue !== '' ? inputValue : (selectedOption?.label ?? value ?? '');\n\n return (\n <div className={rootClasses} ref={containerRef}>\n <div className={styles.topGroup}>\n {showLabel && (\n <label className={styles.label} htmlFor={inputId}>\n {label}\n </label>\n )}\n\n <div className={styles.menuWrapper}>\n <div\n className={fieldClasses}\n onClick={handleFieldClick}\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-owns={listboxId}\n aria-controls={listboxId}\n >\n {leadingIcon && <Icon as={leadingIcon} size={16} />}\n\n <div className={styles.fieldContent}>\n <input\n ref={inputRef}\n id={inputId}\n className={styles.input}\n type=\"text\"\n role=\"searchbox\"\n autoComplete=\"off\"\n aria-autocomplete=\"list\"\n aria-controls={listboxId}\n aria-activedescendant={\n highlightedIndex >= 0\n ? `${listboxId}-option-${highlightedIndex}`\n : undefined\n }\n aria-label={!showLabel ? (ariaLabel ?? label) : undefined}\n disabled={disabled}\n value={inputDisplayValue}\n placeholder={placeholder}\n onChange={handleInputChange}\n onBlur={handleInputBlur}\n onKeyDown={handleKeyDown}\n />\n </div>\n\n <Icon\n as={CaretDown}\n size={16}\n className={`${styles.caretIcon}${isOpen ? ` ${styles.caretIconOpen}` : ''}`}\n weight=\"bold\"\n onClick={handleCaretClick}\n />\n </div>\n\n {isOpen && (\n <Dropdown\n id={listboxId}\n aria-label={label}\n className={styles.menuPanel}\n fluid\n options={filteredOptions}\n selectedValue={value}\n activeIndex={highlightedIndex}\n getOptionId={(_v, index) => `${listboxId}-option-${index}`}\n optionsFocusable={false}\n selectOnPointerDown\n onOptionHover={setHighlightedIndex}\n onSelect={(v) => {\n const opt = filteredOptions.find((o) => o.value === v);\n if (opt) selectOption(opt);\n }}\n emptyMessage=\"No options found\"\n />\n )}\n </div>\n </div>\n\n {hint && (\n <div className={`${styles.hint} ${HINT_CLASS[hintType]}`}>\n <Icon as={HintIcon} size={16} className={styles.hintIcon} />\n <span>{hint}</span>\n </div>\n )}\n </div>\n );\n}\n"],"names":["HINT_ICON","Info","XCircle","CheckCircle","Warning","HINT_CLASS","styles","getHintType","state","Autocomplete","options","value","onChange","placeholder","label","showLabel","hint","disabled","leadingIcon","className","ariaLabel","idProp","generatedId","useId","inputId","listboxId","inputValue","setInputValue","useState","isOpen","setIsOpen","highlightedIndex","setHighlightedIndex","containerRef","useRef","inputRef","inputValueRef","selectedOption","o","filteredOptions","openMenu","useCallback","closeMenu","commit","typed","matchedOption","selectOption","option","_a","useEffect","handlePointerDown","e","handleInputChange","val","handleInputBlur","matched","handleCaretClick","handleKeyDown","prev","_b","_c","handleFieldClick","hintType","HintIcon","fieldClasses","rootClasses","inputDisplayValue","jsxs","jsx","Icon","CaretDown","Dropdown","_v","index","v","opt"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._autocomplete_5hy8i_2{display:flex;flex-direction:column;gap:4px;align-items:flex-start;width:100%;font-family:var(--font-family-base, system-ui, sans-serif)}._topGroup_5hy8i_12{display:flex;flex-direction:column;gap:8px;align-items:flex-start;width:100%}._label_5hy8i_21{display:flex;gap:4px;align-items:center;font-size:var(--font-size-14);font-weight:var(--font-weight-medium);line-height:var(--font-line-height-14);color:var(--color-text-neutral-mudle)}._field_5hy8i_32{box-sizing:border-box;display:flex;gap:8px;height:42px;align-items:center;padding:4px 12px;border-radius:8px;width:100%;border:1px solid transparent;cursor:text;background-color:var(--color-fill-neutral-muted);transition:background-color .12s ease,border-color .12s ease,box-shadow .12s ease,opacity .12s ease;position:relative}._fieldContent_5hy8i_52{display:flex;flex:1 0 0;flex-direction:column;align-items:flex-start;min-width:1px;position:relative;overflow:hidden}._input_5hy8i_63{width:100%;border:none;background:transparent;outline:none;font-family:var(--font-family-base, system-ui, sans-serif);font-size:var(--font-size-14);font-weight:var(--font-weight-regular);line-height:var(--font-line-height-14);color:var(--color-text-neutral-mudle);cursor:text}._input_5hy8i_63::placeholder{color:var(--color-text-neutral-subtlest);font-weight:var(--font-weight-regular)}._caretIcon_5hy8i_82{flex-shrink:0;color:var(--color-icon-neutral-default);transition:transform .12s ease;cursor:pointer}._caretIconOpen_5hy8i_89{transform:rotate(180deg)}._hint_5hy8i_94{display:flex;gap:4px;align-items:center;width:100%;font-size:var(--font-size-12);font-weight:var(--font-weight-regular);line-height:var(--font-line-height-12);color:var(--color-text-neutral-mudle)}._hintIcon_5hy8i_105{flex-shrink:0}._menuPanel_5hy8i_112{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:100}._menuWrapper_5hy8i_120{position:relative;width:100%}._field_5hy8i_32:hover:not(._fieldDisabled_5hy8i_126):not(._fieldDanger_5hy8i_126):not(._fieldSuccess_5hy8i_126):not(._fieldOpen_5hy8i_126):not(:focus-within){background-color:var(--color-fill-interaction-neutral-muted-hover)}._fieldOpen_5hy8i_126,._field_5hy8i_32:focus-within:not(._fieldDisabled_5hy8i_126){background-color:var(--color-canvas-neutral-white);border-color:var(--color-stroke-brand-default);box-shadow:var(--shadow-focus)}._fieldDanger_5hy8i_126{background-color:var(--color-fill-feedback-danger-subtle);border-color:var(--color-stroke-feedback-danger-default)}._fieldDanger_5hy8i_126:focus-within{box-shadow:var(--shadow-focus)}._hintDanger_5hy8i_148{color:var(--color-text-feedback-danger-default)}._fieldSuccess_5hy8i_126{background-color:var(--color-fill-feedback-success-subtle);border-color:var(--color-stroke-feedback-success-subtle)}._fieldSuccess_5hy8i_126:focus-within{box-shadow:var(--shadow-focus)}._hintSuccess_5hy8i_162{color:var(--color-text-feedback-success-default)}._hintWarning_5hy8i_167{color:var(--color-text-feedback-warning-default)}._autocompleteDisabled_5hy8i_172{opacity:.5;cursor:not-allowed;pointer-events:none}._fieldDisabled_5hy8i_126,._fieldDisabled_5hy8i_126 ._input_5hy8i_63{cursor:not-allowed}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import './Autocomplete.module.css';const e = "_autocomplete_5hy8i_2", n = "_topGroup_5hy8i_12", t = "_label_5hy8i_21", i = "_field_5hy8i_32", _ = "_fieldContent_5hy8i_52", c = "_input_5hy8i_63", o = "_caretIcon_5hy8i_82", s = "_caretIconOpen_5hy8i_89", l = "_hint_5hy8i_94", a = "_hintIcon_5hy8i_105", h = "_menuPanel_5hy8i_112", p = "_menuWrapper_5hy8i_120", d = "_fieldDisabled_5hy8i_126", r = "_fieldDanger_5hy8i_126", u = "_fieldSuccess_5hy8i_126", y = "_fieldOpen_5hy8i_126", f = "_hintDanger_5hy8i_148", m = "_hintSuccess_5hy8i_162", D = "_hintWarning_5hy8i_167", b = "_autocompleteDisabled_5hy8i_172", g = {
|
|
2
|
+
autocomplete: e,
|
|
3
|
+
topGroup: n,
|
|
4
|
+
label: t,
|
|
5
|
+
field: i,
|
|
6
|
+
fieldContent: _,
|
|
7
|
+
input: c,
|
|
8
|
+
caretIcon: o,
|
|
9
|
+
caretIconOpen: s,
|
|
10
|
+
hint: l,
|
|
11
|
+
hintIcon: a,
|
|
12
|
+
menuPanel: h,
|
|
13
|
+
menuWrapper: p,
|
|
14
|
+
fieldDisabled: d,
|
|
15
|
+
fieldDanger: r,
|
|
16
|
+
fieldSuccess: u,
|
|
17
|
+
fieldOpen: y,
|
|
18
|
+
hintDanger: f,
|
|
19
|
+
hintSuccess: m,
|
|
20
|
+
hintWarning: D,
|
|
21
|
+
autocompleteDisabled: b
|
|
22
|
+
};
|
|
23
|
+
export {
|
|
24
|
+
e as autocomplete,
|
|
25
|
+
b as autocompleteDisabled,
|
|
26
|
+
o as caretIcon,
|
|
27
|
+
s as caretIconOpen,
|
|
28
|
+
g as default,
|
|
29
|
+
i as field,
|
|
30
|
+
_ as fieldContent,
|
|
31
|
+
r as fieldDanger,
|
|
32
|
+
d as fieldDisabled,
|
|
33
|
+
y as fieldOpen,
|
|
34
|
+
u as fieldSuccess,
|
|
35
|
+
l as hint,
|
|
36
|
+
f as hintDanger,
|
|
37
|
+
a as hintIcon,
|
|
38
|
+
m as hintSuccess,
|
|
39
|
+
D as hintWarning,
|
|
40
|
+
c as input,
|
|
41
|
+
t as label,
|
|
42
|
+
h as menuPanel,
|
|
43
|
+
p as menuWrapper,
|
|
44
|
+
n as topGroup
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=Autocomplete.module.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Autocomplete.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;"}
|
package/Avatar/Avatar.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { jsxs as x, jsx as m } from "react/jsx-runtime";
|
|
2
|
+
import S from "react";
|
|
3
|
+
import { User as z } from "@phosphor-icons/react";
|
|
4
|
+
import { Icon as I } from "../Icon/Icon.js";
|
|
5
|
+
import i from "./Avatar.module.css.js";
|
|
6
|
+
const E = {
|
|
7
|
+
xsmall: i.sizeXsmall,
|
|
8
|
+
small: i.sizeSmall,
|
|
9
|
+
medium: i.sizeMedium,
|
|
10
|
+
large: i.sizeLarge,
|
|
11
|
+
xlarge: i.sizeXlarge
|
|
12
|
+
}, h = {
|
|
13
|
+
xsmall: 12,
|
|
14
|
+
small: 16,
|
|
15
|
+
medium: 20,
|
|
16
|
+
large: 24,
|
|
17
|
+
xlarge: 28
|
|
18
|
+
};
|
|
19
|
+
function N({
|
|
20
|
+
size: l = "medium",
|
|
21
|
+
type: o = "icon",
|
|
22
|
+
src: a,
|
|
23
|
+
alt: n = "",
|
|
24
|
+
initials: r,
|
|
25
|
+
icon: c,
|
|
26
|
+
disabled: t = !1,
|
|
27
|
+
className: d,
|
|
28
|
+
...g
|
|
29
|
+
}) {
|
|
30
|
+
const [s, f] = S.useState(!1), e = o === "image" && (s || !a) ? "icon" : o, p = [
|
|
31
|
+
i.avatar,
|
|
32
|
+
E[l],
|
|
33
|
+
e === "image" && !s && a ? i.image : void 0,
|
|
34
|
+
e === "initials" ? i.initials : void 0,
|
|
35
|
+
e === "icon" ? i.icon : void 0,
|
|
36
|
+
t ? i.disabled : void 0,
|
|
37
|
+
d
|
|
38
|
+
].filter(Boolean).join(" "), u = h[l], v = c ?? z;
|
|
39
|
+
return /* @__PURE__ */ x(
|
|
40
|
+
"span",
|
|
41
|
+
{
|
|
42
|
+
className: p,
|
|
43
|
+
"aria-disabled": t || void 0,
|
|
44
|
+
role: "img",
|
|
45
|
+
"aria-label": n || (o === "initials" && r ? r : void 0) || "avatar",
|
|
46
|
+
...g,
|
|
47
|
+
children: [
|
|
48
|
+
e === "image" && a && !s && /* @__PURE__ */ m(
|
|
49
|
+
"img",
|
|
50
|
+
{
|
|
51
|
+
src: a,
|
|
52
|
+
alt: n,
|
|
53
|
+
"aria-hidden": "true",
|
|
54
|
+
onError: () => f(!0)
|
|
55
|
+
}
|
|
56
|
+
),
|
|
57
|
+
e === "initials" && /* @__PURE__ */ m("span", { "aria-hidden": "true", children: (r ?? "").slice(0, 2).toUpperCase() }),
|
|
58
|
+
e === "icon" && /* @__PURE__ */ m(I, { as: v, size: u })
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
export {
|
|
64
|
+
N as Avatar
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=Avatar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Avatar.js","sources":["../../src/Avatar/Avatar.tsx"],"sourcesContent":["import React from 'react';\nimport type { Icon as PhosphorIcon } from '@phosphor-icons/react';\nimport { User } from '@phosphor-icons/react';\nimport { Icon } from '../Icon/index.js';\nimport styles from './Avatar.module.css';\n\nexport type AvatarSize = 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge';\nexport type AvatarType = 'image' | 'initials' | 'icon';\n\nexport interface AvatarProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** Visual size of the avatar */\n size?: AvatarSize;\n /**\n * Display type:\n * - \"image\" → renders a photo (requires `src`)\n * - \"initials\" → renders up to 2 letters of text (requires `initials`)\n * - \"icon\" → renders a phosphor icon (defaults to User icon)\n */\n type?: AvatarType;\n /**\n * Image URL. Only used when type=\"image\".\n * Falls back to icon when the image fails to load.\n */\n src?: string;\n /** Alt text for the image when type=\"image\". */\n alt?: string;\n /**\n * Text shown inside the avatar when type=\"initials\".\n * Only the first 2 characters are rendered.\n */\n initials?: string;\n /**\n * Phosphor icon component rendered when type=\"icon\".\n * Defaults to the User icon.\n */\n icon?: PhosphorIcon;\n /** Whether the avatar is in a disabled state */\n disabled?: boolean;\n}\n\nconst SIZE_CLASS: Record<AvatarSize, string> = {\n xsmall: styles.sizeXsmall,\n small: styles.sizeSmall,\n medium: styles.sizeMedium,\n large: styles.sizeLarge,\n xlarge: styles.sizeXlarge,\n};\n\nconst ICON_SIZE: Record<AvatarSize, number> = {\n xsmall: 12,\n small: 16,\n medium: 20,\n large: 24,\n xlarge: 28,\n};\n\nexport function Avatar({\n size = 'medium',\n type = 'icon',\n src,\n alt = '',\n initials,\n icon,\n disabled = false,\n className,\n ...props\n}: AvatarProps) {\n const [imgError, setImgError] = React.useState(false);\n\n // Determine effective type: fall back to icon if image fails to load\n const effectiveType: AvatarType =\n type === 'image' && (imgError || !src) ? 'icon' : type;\n\n const cls = [\n styles.avatar,\n SIZE_CLASS[size],\n effectiveType === 'image' && !imgError && src ? styles.image : undefined,\n effectiveType === 'initials' ? styles.initials : undefined,\n effectiveType === 'icon' ? styles.icon : undefined,\n disabled ? styles.disabled : undefined,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const iconSize = ICON_SIZE[size];\n const IconComponent = icon ?? User;\n\n return (\n <span\n className={cls}\n aria-disabled={disabled || undefined}\n role=\"img\"\n aria-label={\n alt ||\n (type === 'initials' && initials ? initials : undefined) ||\n 'avatar'\n }\n {...props}\n >\n {effectiveType === 'image' && src && !imgError && (\n <img\n src={src}\n alt={alt}\n aria-hidden=\"true\"\n onError={() => setImgError(true)}\n />\n )}\n {effectiveType === 'initials' && (\n <span aria-hidden=\"true\">\n {(initials ?? '').slice(0, 2).toUpperCase()}\n </span>\n )}\n {effectiveType === 'icon' && (\n <Icon as={IconComponent} size={iconSize} />\n )}\n </span>\n );\n}\n"],"names":["SIZE_CLASS","styles","ICON_SIZE","Avatar","size","type","src","alt","initials","icon","disabled","className","props","imgError","setImgError","React","effectiveType","cls","iconSize","IconComponent","User","jsxs","jsx","Icon"],"mappings":";;;;;AAwCA,MAAMA,IAAyC;AAAA,EAC7C,QAAQC,EAAO;AAAA,EACf,OAAQA,EAAO;AAAA,EACf,QAAQA,EAAO;AAAA,EACf,OAAQA,EAAO;AAAA,EACf,QAAQA,EAAO;AACjB,GAEMC,IAAwC;AAAA,EAC5C,QAAQ;AAAA,EACR,OAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAQ;AAAA,EACR,QAAQ;AACV;AAEO,SAASC,EAAO;AAAA,EACrB,MAAAC,IAAO;AAAA,EACP,MAAAC,IAAO;AAAA,EACP,KAAAC;AAAA,EACA,KAAAC,IAAM;AAAA,EACN,UAAAC;AAAA,EACA,MAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,WAAAC;AAAA,EACA,GAAGC;AACL,GAAgB;AACd,QAAM,CAACC,GAAUC,CAAW,IAAIC,EAAM,SAAS,EAAK,GAG9CC,IACJX,MAAS,YAAYQ,KAAY,CAACP,KAAO,SAASD,GAE9CY,IAAM;AAAA,IACVhB,EAAO;AAAA,IACPD,EAAWI,CAAI;AAAA,IACfY,MAAkB,WAAW,CAACH,KAAYP,IAAML,EAAO,QAAQ;AAAA,IAC/De,MAAkB,aAAaf,EAAO,WAAW;AAAA,IACjDe,MAAkB,SAASf,EAAO,OAAO;AAAA,IACzCS,IAAWT,EAAO,WAAW;AAAA,IAC7BU;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,GAELO,IAAWhB,EAAUE,CAAI,GACzBe,IAAgBV,KAAQW;AAE9B,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWJ;AAAA,MACX,iBAAeP,KAAY;AAAA,MAC3B,MAAK;AAAA,MACL,cACEH,MACCF,MAAS,cAAcG,IAAWA,IAAW,WAC9C;AAAA,MAED,GAAGI;AAAA,MAEH,UAAA;AAAA,QAAAI,MAAkB,WAAWV,KAAO,CAACO,KACpC,gBAAAS;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,KAAAhB;AAAA,YACA,KAAAC;AAAA,YACA,eAAY;AAAA,YACZ,SAAS,MAAMO,EAAY,EAAI;AAAA,UAAA;AAAA,QAAA;AAAA,QAGlCE,MAAkB,cACjB,gBAAAM,EAAC,QAAA,EAAK,eAAY,QACd,WAAAd,KAAY,IAAI,MAAM,GAAG,CAAC,EAAE,eAChC;AAAA,QAEDQ,MAAkB,UACjB,gBAAAM,EAACC,KAAK,IAAIJ,GAAe,MAAMD,EAAA,CAAU;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIjD;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._avatar_155i1_20{display:inline-flex;align-items:center;justify-content:center;border-radius:9999px;flex-shrink:0;overflow:hidden;font-family:var(--font-family-base, system-ui, sans-serif);font-weight:var(--font-weight-semibold);line-height:1;-webkit-user-select:none;user-select:none;transition:opacity .12s ease,box-shadow .12s ease}._avatar_155i1_20:focus-visible{outline:none;box-shadow:var(--shadow-focus)}._avatar_155i1_20[aria-disabled=true],._avatar_155i1_20._disabled_155i1_43{opacity:.5;cursor:not-allowed;pointer-events:none}._sizeXsmall_155i1_50{width:24px;height:24px;font-size:var(--font-size-10)}._sizeSmall_155i1_56{width:32px;height:32px;font-size:var(--font-size-12)}._sizeMedium_155i1_62{width:40px;height:40px;font-size:var(--font-size-14)}._sizeLarge_155i1_68{width:48px;height:48px;font-size:var(--font-size-16)}._sizeXlarge_155i1_74{width:64px;height:64px;font-size:var(--font-size-20)}._image_155i1_82{background-color:var(--color-fill-neutral-muted)}._image_155i1_82 img{width:100%;height:100%;object-fit:cover;display:block}._initials_155i1_95{background-color:var(--color-fill-brand-muted);color:var(--color-text-brand-default);letter-spacing:.02em}._icon_155i1_103{background-color:var(--color-fill-neutral-muted);color:var(--color-icon-neutral-default)}
|