vector-prototype-components 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 @@
|
|
|
1
|
+
{"version":3,"file":"Paginator.js","sources":["../../src/Paginator/Paginator.tsx"],"sourcesContent":["import React from 'react';\nimport {\n CaretDoubleLeft,\n CaretLeft,\n CaretRight,\n CaretDoubleRight,\n CaretDown,\n} from '@phosphor-icons/react';\nimport { Icon } from '../Icon/index.js';\nimport styles from './Paginator.module.css';\n\nexport type PaginatorPageSize = 10 | 20 | 30 | 50 | 100;\n\nexport interface PaginatorProps {\n /** Current page (1-based). */\n currentPage: number;\n /** Total number of pages. */\n totalPages: number;\n /** Number of page-number buttons to show (excluding first/last navigation arrows). Defaults to 3. */\n pageWindowSize?: number;\n /** Selected page size (rows per page). */\n pageSize?: PaginatorPageSize;\n /** Available page-size options. Defaults to [10, 20, 30, 50, 100]. */\n pageSizeOptions?: PaginatorPageSize[];\n /** Called when the user navigates to a different page. */\n onPageChange?: (page: number) => void;\n /** Called when the user selects a different page size. */\n onPageSizeChange?: (pageSize: PaginatorPageSize) => void;\n /** Whether to show the page-size selector. Defaults to true. */\n showPageSizeSelect?: boolean;\n /** Optional extra CSS class for the root element. */\n className?: string;\n}\n\nexport function Paginator({\n currentPage,\n totalPages,\n pageWindowSize = 3,\n pageSize = 10,\n pageSizeOptions = [10, 20, 30, 50, 100],\n onPageChange,\n onPageSizeChange,\n showPageSizeSelect = true,\n className,\n}: PaginatorProps) {\n const isFirst = currentPage <= 1;\n const isLast = currentPage >= totalPages;\n\n // Build the window of page numbers around the current page\n const pages = buildPageWindow(currentPage, totalPages, pageWindowSize);\n\n function go(page: number) {\n if (page < 1 || page > totalPages || page === currentPage) return;\n onPageChange?.(page);\n }\n\n function handlePageSizeChange(e: React.ChangeEvent<HTMLSelectElement>) {\n const val = Number(e.target.value) as PaginatorPageSize;\n onPageSizeChange?.(val);\n }\n\n const rootCls = [styles.paginator, className].filter(Boolean).join(' ');\n\n return (\n <nav className={rootCls} aria-label=\"Pagination\">\n {/* First page */}\n <button\n className={[styles.btn, styles.btnArrow].join(' ')}\n onClick={() => go(1)}\n disabled={isFirst}\n aria-disabled={isFirst}\n aria-label=\"First page\"\n >\n <Icon as={CaretDoubleLeft} size={16} weight=\"bold\" />\n </button>\n\n {/* Previous page */}\n <button\n className={[styles.btn, styles.btnArrow].join(' ')}\n onClick={() => go(currentPage - 1)}\n disabled={isFirst}\n aria-disabled={isFirst}\n aria-label=\"Previous page\"\n >\n <Icon as={CaretLeft} size={16} weight=\"bold\" />\n </button>\n\n {/* Page number buttons */}\n {pages.map((page) => {\n const isActive = page === currentPage;\n const cls = [\n styles.btn,\n styles.btnNumber,\n isActive ? styles.btnNumberActive : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button\n key={page}\n className={cls}\n onClick={() => go(page)}\n disabled={isActive}\n aria-disabled={isActive}\n aria-label={`Page ${page}`}\n aria-current={isActive ? 'page' : undefined}\n >\n {page}\n </button>\n );\n })}\n\n {/* Next page */}\n <button\n className={[styles.btn, styles.btnArrow].join(' ')}\n onClick={() => go(currentPage + 1)}\n disabled={isLast}\n aria-disabled={isLast}\n aria-label=\"Next page\"\n >\n <Icon as={CaretRight} size={16} weight=\"bold\" />\n </button>\n\n {/* Last page */}\n <button\n className={[styles.btn, styles.btnArrow].join(' ')}\n onClick={() => go(totalPages)}\n disabled={isLast}\n aria-disabled={isLast}\n aria-label=\"Last page\"\n >\n <Icon as={CaretDoubleRight} size={16} weight=\"bold\" />\n </button>\n\n {/* Page-size selector — native <select> with OS arrow hidden and the\n Figma CaretDown overlaid (matches .Paginator / Select) */}\n {showPageSizeSelect && (\n <div className={styles.selectWrap}>\n <select\n className={styles.select}\n value={pageSize}\n onChange={handlePageSizeChange}\n aria-label=\"Rows per page\"\n >\n {pageSizeOptions.map((opt) => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </select>\n <span className={styles.selectCaret} aria-hidden=\"true\">\n <Icon as={CaretDown} size={16} />\n </span>\n </div>\n )}\n </nav>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Returns an array of page numbers centred on `current` with `windowSize` items. */\nfunction buildPageWindow(\n current: number,\n total: number,\n windowSize: number,\n): number[] {\n if (total <= 0) return [];\n const half = Math.floor(windowSize / 2);\n let start = current - half;\n let end = start + windowSize - 1;\n\n if (start < 1) {\n start = 1;\n end = Math.min(windowSize, total);\n }\n if (end > total) {\n end = total;\n start = Math.max(1, end - windowSize + 1);\n }\n\n const pages: number[] = [];\n for (let i = start; i <= end; i++) {\n pages.push(i);\n }\n return pages;\n}\n"],"names":["Paginator","currentPage","totalPages","pageWindowSize","pageSize","pageSizeOptions","onPageChange","onPageSizeChange","showPageSizeSelect","className","isFirst","isLast","pages","buildPageWindow","go","page","handlePageSizeChange","e","val","rootCls","styles","jsxs","jsx","Icon","CaretDoubleLeft","CaretLeft","isActive","cls","CaretRight","CaretDoubleRight","opt","CaretDown","current","total","windowSize","half","start","end","i"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._paginator_xil1m_2{display:inline-flex;align-items:center;gap:8px;font-family:var(--font-family-base, system-ui, sans-serif)}._btn_xil1m_10{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:8px;border:none;background-color:var(--color-canvas-neutral-white);color:var(--color-icon-neutral-default);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);cursor:pointer;padding:0;flex-shrink:0;transition:background-color .12s ease,color .12s ease,box-shadow .12s ease,opacity .12s ease}._btn_xil1m_10:focus-visible{outline:none;box-shadow:var(--shadow-focus)}._btn_xil1m_10:disabled,._btn_xil1m_10[aria-disabled=true]{opacity:.5;cursor:not-allowed;pointer-events:none}._btnArrow_xil1m_47:hover:not(:disabled){background-color:var(--color-fill-neutral-subtle)}._btnNumber_xil1m_52{color:var(--color-text-neutral-mudle);font-weight:var(--font-weight-regular)}._btnNumber_xil1m_52:hover:not(:disabled){background-color:var(--color-fill-neutral-subtle)}._btnNumberActive_xil1m_62{background-color:var(--color-fill-neutral-muted);color:var(--color-text-neutral-mudle);font-weight:var(--font-weight-semibold);cursor:default}._btnNumberActive_xil1m_62:hover:not(:disabled){background-color:var(--color-fill-neutral-muted)}._selectWrap_xil1m_74{position:relative;display:inline-flex;flex-shrink:0}._select_xil1m_74{-moz-appearance:none;appearance:none;-webkit-appearance:none;height:36px;width:70px;padding:0 30px 0 8px;border-radius:8px;border:none;background-color:var(--color-fill-neutral-muted);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-regular);line-height:var(--font-line-height-14);cursor:pointer;flex-shrink:0;transition:background-color .12s ease,box-shadow .12s ease}._select_xil1m_74:focus-visible{outline:none;box-shadow:var(--shadow-focus)}._select_xil1m_74:disabled{opacity:.5;cursor:not-allowed;pointer-events:none}._selectLabel_xil1m_113{white-space:nowrap}._selectCaret_xil1m_117{position:absolute;right:8px;top:50%;transform:translateY(-50%);display:flex;align-items:center;pointer-events:none;color:var(--color-icon-neutral-default)}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import './Paginator.module.css';const t = "_paginator_xil1m_2", e = "_btn_xil1m_10", n = "_btnArrow_xil1m_47", _ = "_btnNumber_xil1m_52", r = "_btnNumberActive_xil1m_62", c = "_selectWrap_xil1m_74", s = "_select_xil1m_74", l = "_selectCaret_xil1m_117", b = {
|
|
2
|
+
paginator: t,
|
|
3
|
+
btn: e,
|
|
4
|
+
btnArrow: n,
|
|
5
|
+
btnNumber: _,
|
|
6
|
+
btnNumberActive: r,
|
|
7
|
+
selectWrap: c,
|
|
8
|
+
select: s,
|
|
9
|
+
selectCaret: l
|
|
10
|
+
};
|
|
11
|
+
export {
|
|
12
|
+
e as btn,
|
|
13
|
+
n as btnArrow,
|
|
14
|
+
_ as btnNumber,
|
|
15
|
+
r as btnNumberActive,
|
|
16
|
+
b as default,
|
|
17
|
+
t as paginator,
|
|
18
|
+
s as select,
|
|
19
|
+
l as selectCaret,
|
|
20
|
+
c as selectWrap
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=Paginator.module.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Paginator.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
|
package/Panel/Panel.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import { Slot as c } from "../Slot/Slot.js";
|
|
3
|
+
import o from "./Panel.module.css.js";
|
|
4
|
+
const d = {
|
|
5
|
+
shadow: o.styleShadow,
|
|
6
|
+
line: o.styleLine
|
|
7
|
+
}, S = {
|
|
8
|
+
section: o.typeSection,
|
|
9
|
+
container: o.typeContainer
|
|
10
|
+
};
|
|
11
|
+
function y({
|
|
12
|
+
panelStyle: t = "shadow",
|
|
13
|
+
type: n = "section",
|
|
14
|
+
disabled: i = !1,
|
|
15
|
+
className: s,
|
|
16
|
+
children: a,
|
|
17
|
+
...l
|
|
18
|
+
}) {
|
|
19
|
+
const r = [
|
|
20
|
+
o.panel,
|
|
21
|
+
d[t],
|
|
22
|
+
S[n],
|
|
23
|
+
s
|
|
24
|
+
].filter(Boolean).join(" ");
|
|
25
|
+
return /* @__PURE__ */ e(
|
|
26
|
+
"div",
|
|
27
|
+
{
|
|
28
|
+
className: r,
|
|
29
|
+
"aria-disabled": i || void 0,
|
|
30
|
+
...l,
|
|
31
|
+
children: /* @__PURE__ */ e(c, { children: a })
|
|
32
|
+
}
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
export {
|
|
36
|
+
y as Panel
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=Panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Panel.js","sources":["../../src/Panel/Panel.tsx"],"sourcesContent":["import React from 'react';\nimport { Slot } from '../Slot/index.js';\nimport styles from './Panel.module.css';\n\nexport type PanelStyle = 'shadow' | 'line';\nexport type PanelType = 'section' | 'container';\n\nexport interface PanelProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Visual style of the panel: shadow uses drop-shadow, line uses a border stroke */\n panelStyle?: PanelStyle;\n /** Semantic type: section adds extra bottom padding (32px) for grouping content; container uses uniform padding (16px) */\n type?: PanelType;\n /** Whether the panel is in a disabled state */\n disabled?: boolean;\n}\n\nconst STYLE_CLASS: Record<PanelStyle, string> = {\n shadow: styles.styleShadow,\n line: styles.styleLine,\n};\n\nconst TYPE_CLASS: Record<PanelType, string> = {\n section: styles.typeSection,\n container: styles.typeContainer,\n};\n\nexport function Panel({\n panelStyle = 'shadow',\n type = 'section',\n disabled = false,\n className,\n children,\n ...props\n}: PanelProps) {\n const cls = [\n styles.panel,\n STYLE_CLASS[panelStyle],\n TYPE_CLASS[type],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n className={cls}\n aria-disabled={disabled || undefined}\n {...props}\n >\n <Slot>{children}</Slot>\n </div>\n );\n}\n"],"names":["STYLE_CLASS","styles","TYPE_CLASS","Panel","panelStyle","type","disabled","className","children","props","cls","jsx","Slot"],"mappings":";;;AAgBA,MAAMA,IAA0C;AAAA,EAC9C,QAAQC,EAAO;AAAA,EACf,MAAQA,EAAO;AACjB,GAEMC,IAAwC;AAAA,EAC5C,SAAWD,EAAO;AAAA,EAClB,WAAWA,EAAO;AACpB;AAEO,SAASE,EAAM;AAAA,EACpB,YAAAC,IAAa;AAAA,EACb,MAAAC,IAAO;AAAA,EACP,UAAAC,IAAW;AAAA,EACX,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,GAAGC;AACL,GAAe;AACb,QAAMC,IAAM;AAAA,IACVT,EAAO;AAAA,IACPD,EAAYI,CAAU;AAAA,IACtBF,EAAWG,CAAI;AAAA,IACfE;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACE,gBAAAI;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWD;AAAA,MACX,iBAAeJ,KAAY;AAAA,MAC1B,GAAGG;AAAA,MAEJ,UAAA,gBAAAE,EAACC,KAAM,UAAAJ,EAAA,CAAS;AAAA,IAAA;AAAA,EAAA;AAGtB;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._panel_2r8qs_2{display:flex;flex-direction:column;align-items:stretch;background-color:var(--color-canvas-neutral-white);border:1px solid transparent;box-sizing:border-box;width:100%;gap:10px;transition:box-shadow .12s ease,border-color .12s ease,opacity .12s ease}._panel_2r8qs_2:focus-visible{outline:none;box-shadow:var(--shadow-focus)}._panel_2r8qs_2[aria-disabled=true]{opacity:.5;cursor:not-allowed;pointer-events:none}._styleShadow_2r8qs_31{border-color:transparent}._styleLine_2r8qs_37{box-shadow:none;border-color:var(--color-stroke-neutral-default)}._typeSection_2r8qs_44{border-radius:12px;padding:16px 16px 32px}._typeContainer_2r8qs_51{padding:16px}._styleShadow_2r8qs_31._typeContainer_2r8qs_51{border-radius:8px;box-shadow:var(--shadow-layer-md)}._styleShadow_2r8qs_31._typeSection_2r8qs_44{border-radius:12px;box-shadow:var(--shadow-layer-sm)}._styleLine_2r8qs_37._typeContainer_2r8qs_51{border-radius:12px}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import './Panel.module.css';const e = "_panel_2r8qs_2", t = "_styleShadow_2r8qs_31", n = "_styleLine_2r8qs_37", s = "_typeSection_2r8qs_44", o = "_typeContainer_2r8qs_51", _ = {
|
|
2
|
+
panel: e,
|
|
3
|
+
styleShadow: t,
|
|
4
|
+
styleLine: n,
|
|
5
|
+
typeSection: s,
|
|
6
|
+
typeContainer: o
|
|
7
|
+
};
|
|
8
|
+
export {
|
|
9
|
+
_ as default,
|
|
10
|
+
e as panel,
|
|
11
|
+
n as styleLine,
|
|
12
|
+
t as styleShadow,
|
|
13
|
+
o as typeContainer,
|
|
14
|
+
s as typeSection
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=Panel.module.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Panel.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { jsx as t, jsxs as m } from "react/jsx-runtime";
|
|
2
|
+
import r from "./ProgressSpinner.module.css.js";
|
|
3
|
+
const s = 42, o = 17, l = 4;
|
|
4
|
+
function u({
|
|
5
|
+
label: d = "Loading…",
|
|
6
|
+
disabled: c = !1,
|
|
7
|
+
className: h
|
|
8
|
+
}) {
|
|
9
|
+
const e = s / 2, a = s / 2, i = 2 * Math.PI * o, n = i * 0.75, f = [
|
|
10
|
+
r.spinner,
|
|
11
|
+
c ? r.disabled : void 0,
|
|
12
|
+
h
|
|
13
|
+
].filter(Boolean).join(" ");
|
|
14
|
+
return /* @__PURE__ */ t(
|
|
15
|
+
"span",
|
|
16
|
+
{
|
|
17
|
+
className: f,
|
|
18
|
+
role: "status",
|
|
19
|
+
"aria-label": d,
|
|
20
|
+
"aria-disabled": c || void 0,
|
|
21
|
+
children: /* @__PURE__ */ m(
|
|
22
|
+
"svg",
|
|
23
|
+
{
|
|
24
|
+
className: r.spinnerSvg,
|
|
25
|
+
viewBox: `0 0 ${s} ${s}`,
|
|
26
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
27
|
+
"aria-hidden": "true",
|
|
28
|
+
focusable: "false",
|
|
29
|
+
width: s,
|
|
30
|
+
height: s,
|
|
31
|
+
children: [
|
|
32
|
+
/* @__PURE__ */ t(
|
|
33
|
+
"circle",
|
|
34
|
+
{
|
|
35
|
+
className: r.arcTrack,
|
|
36
|
+
cx: e,
|
|
37
|
+
cy: a,
|
|
38
|
+
r: o,
|
|
39
|
+
strokeWidth: l
|
|
40
|
+
}
|
|
41
|
+
),
|
|
42
|
+
/* @__PURE__ */ t(
|
|
43
|
+
"circle",
|
|
44
|
+
{
|
|
45
|
+
className: r.arcFill,
|
|
46
|
+
cx: e,
|
|
47
|
+
cy: a,
|
|
48
|
+
r: o,
|
|
49
|
+
strokeWidth: l,
|
|
50
|
+
strokeDasharray: `${n} ${i - n}`,
|
|
51
|
+
strokeDashoffset: 0,
|
|
52
|
+
transform: `rotate(-90 ${e} ${a})`
|
|
53
|
+
}
|
|
54
|
+
)
|
|
55
|
+
]
|
|
56
|
+
}
|
|
57
|
+
)
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
export {
|
|
62
|
+
u as ProgressSpinner
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=ProgressSpinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProgressSpinner.js","sources":["../../src/ProgressSpinner/ProgressSpinner.tsx"],"sourcesContent":["import React from 'react';\nimport styles from './ProgressSpinner.module.css';\n\nexport interface ProgressSpinnerProps {\n /** Accessible label announced by screen readers. */\n label?: string;\n /** Whether the spinner is in a disabled / inactive state. */\n disabled?: boolean;\n /** Additional CSS class names. */\n className?: string;\n}\n\n/* Figma spec: 42×42px container, 17px radius arc, strokeWeight 4px, 270° arc. */\nconst VIEWBOX = 42;\nconst RADIUS = 17;\nconst STROKE_WIDTH = 4;\n\nexport function ProgressSpinner({\n label = 'Loading…',\n disabled = false,\n className,\n}: ProgressSpinnerProps) {\n const cx = VIEWBOX / 2;\n const cy = VIEWBOX / 2;\n const circumference = 2 * Math.PI * RADIUS;\n const dashArray = circumference * 0.75;\n\n const cls = [\n styles.spinner,\n disabled ? styles.disabled : undefined,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <span\n className={cls}\n role=\"status\"\n aria-label={label}\n aria-disabled={disabled || undefined}\n >\n <svg\n className={styles.spinnerSvg}\n viewBox={`0 0 ${VIEWBOX} ${VIEWBOX}`}\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n focusable=\"false\"\n width={VIEWBOX}\n height={VIEWBOX}\n >\n <circle\n className={styles.arcTrack}\n cx={cx} cy={cy} r={RADIUS}\n strokeWidth={STROKE_WIDTH}\n />\n <circle\n className={styles.arcFill}\n cx={cx} cy={cy} r={RADIUS}\n strokeWidth={STROKE_WIDTH}\n strokeDasharray={`${dashArray} ${circumference - dashArray}`}\n strokeDashoffset={0}\n transform={`rotate(-90 ${cx} ${cy})`}\n />\n </svg>\n </span>\n );\n}\n"],"names":["VIEWBOX","RADIUS","STROKE_WIDTH","ProgressSpinner","label","disabled","className","cx","cy","circumference","dashArray","cls","styles","jsx","jsxs"],"mappings":";;AAaA,MAAMA,IAAe,IACfC,IAAe,IACfC,IAAe;AAEd,SAASC,EAAgB;AAAA,EAC9B,OAAAC,IAAQ;AAAA,EACR,UAAAC,IAAW;AAAA,EACX,WAAAC;AACF,GAAyB;AACvB,QAAMC,IAAeP,IAAU,GACzBQ,IAAeR,IAAU,GACzBS,IAAgB,IAAI,KAAK,KAAKR,GAC9BS,IAAeD,IAAgB,MAE/BE,IAAM;AAAA,IACVC,EAAO;AAAA,IACPP,IAAWO,EAAO,WAAW;AAAA,IAC7BN;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACE,gBAAAO;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWF;AAAA,MACX,MAAK;AAAA,MACL,cAAYP;AAAA,MACZ,iBAAeC,KAAY;AAAA,MAE3B,UAAA,gBAAAS;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWF,EAAO;AAAA,UAClB,SAAS,OAAOZ,CAAO,IAAIA,CAAO;AAAA,UAClC,OAAM;AAAA,UACN,eAAY;AAAA,UACZ,WAAU;AAAA,UACV,OAAOA;AAAA,UACP,QAAQA;AAAA,UAER,UAAA;AAAA,YAAA,gBAAAa;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAWD,EAAO;AAAA,gBAClB,IAAAL;AAAA,gBAAQ,IAAAC;AAAA,gBAAQ,GAAGP;AAAA,gBACnB,aAAaC;AAAA,cAAA;AAAA,YAAA;AAAA,YAEf,gBAAAW;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAWD,EAAO;AAAA,gBAClB,IAAAL;AAAA,gBAAQ,IAAAC;AAAA,gBAAQ,GAAGP;AAAA,gBACnB,aAAaC;AAAA,gBACb,iBAAiB,GAAGQ,CAAS,IAAID,IAAgBC,CAAS;AAAA,gBAC1D,kBAAkB;AAAA,gBAClB,WAAW,cAAcH,CAAE,IAAIC,CAAE;AAAA,cAAA;AAAA,YAAA;AAAA,UACnC;AAAA,QAAA;AAAA,MAAA;AAAA,IACF;AAAA,EAAA;AAGN;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@keyframes _spinner-rotate_vv8x4_1{0%{transform:rotate(0)}to{transform:rotate(360deg)}}._spinner_vv8x4_7{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:42px;height:42px}._spinnerSvg_vv8x4_16{animation:_spinner-rotate_vv8x4_1 .9s linear infinite;display:block}._arcTrack_vv8x4_22{fill:none;stroke:transparent}._arcFill_vv8x4_27{fill:none;stroke:var(--color-stroke-brand-default);stroke-linecap:round}._spinner_vv8x4_7[aria-disabled=true],._spinner_vv8x4_7._disabled_vv8x4_35{opacity:.5;cursor:not-allowed;pointer-events:none}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import './ProgressSpinner.module.css';const n = "_spinner_vv8x4_7", s = "_spinnerSvg_vv8x4_16", r = "_arcTrack_vv8x4_22", c = "_arcFill_vv8x4_27", _ = "_disabled_vv8x4_35", a = {
|
|
2
|
+
spinner: n,
|
|
3
|
+
spinnerSvg: s,
|
|
4
|
+
arcTrack: r,
|
|
5
|
+
arcFill: c,
|
|
6
|
+
disabled: _
|
|
7
|
+
};
|
|
8
|
+
export {
|
|
9
|
+
c as arcFill,
|
|
10
|
+
r as arcTrack,
|
|
11
|
+
a as default,
|
|
12
|
+
_ as disabled,
|
|
13
|
+
n as spinner,
|
|
14
|
+
s as spinnerSvg
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=ProgressSpinner.module.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProgressSpinner.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
|
package/Radio/Radio.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { jsxs as j, jsx as i } from "react/jsx-runtime";
|
|
2
|
+
import { useId as C } from "react";
|
|
3
|
+
import e from "./Radio.module.css.js";
|
|
4
|
+
function x({
|
|
5
|
+
checked: l,
|
|
6
|
+
defaultChecked: r,
|
|
7
|
+
label: a,
|
|
8
|
+
disabled: n = !1,
|
|
9
|
+
className: t,
|
|
10
|
+
id: d,
|
|
11
|
+
onChange: m,
|
|
12
|
+
...p
|
|
13
|
+
}) {
|
|
14
|
+
const f = C(), c = d ?? f, o = l !== void 0, s = o ? l : r ?? !1, u = [
|
|
15
|
+
e.circle,
|
|
16
|
+
s ? e.checked : null
|
|
17
|
+
].filter(Boolean).join(" "), h = [
|
|
18
|
+
e.radio,
|
|
19
|
+
n ? e.disabled : null,
|
|
20
|
+
t
|
|
21
|
+
].filter(Boolean).join(" ");
|
|
22
|
+
return /* @__PURE__ */ j("label", { className: h, htmlFor: c, children: [
|
|
23
|
+
/* @__PURE__ */ i(
|
|
24
|
+
"input",
|
|
25
|
+
{
|
|
26
|
+
id: c,
|
|
27
|
+
type: "radio",
|
|
28
|
+
className: e.input,
|
|
29
|
+
checked: o ? s : void 0,
|
|
30
|
+
defaultChecked: o ? void 0 : r,
|
|
31
|
+
disabled: n,
|
|
32
|
+
"aria-checked": s,
|
|
33
|
+
onChange: m,
|
|
34
|
+
...p
|
|
35
|
+
}
|
|
36
|
+
),
|
|
37
|
+
/* @__PURE__ */ i("span", { className: u, "aria-hidden": "true" }),
|
|
38
|
+
a && /* @__PURE__ */ i("span", { className: e.label, children: a })
|
|
39
|
+
] });
|
|
40
|
+
}
|
|
41
|
+
export {
|
|
42
|
+
x as Radio
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=Radio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Radio.js","sources":["../../src/Radio/Radio.tsx"],"sourcesContent":["import React, { useId } from 'react';\nimport styles from './Radio.module.css';\n\nexport interface RadioProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'type'> {\n /** Whether this radio is selected. */\n checked?: boolean;\n /** Uncontrolled default checked state. */\n defaultChecked?: boolean;\n /** Label text rendered next to the radio circle. */\n label?: string;\n /** Disables the radio input. */\n disabled?: boolean;\n /** Additional className for the outer wrapper label. */\n className?: string;\n}\n\nexport function Radio({\n checked,\n defaultChecked,\n label,\n disabled = false,\n className,\n id: idProp,\n onChange,\n ...props\n}: RadioProps) {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n\n const isControlled = checked !== undefined;\n const isChecked = isControlled ? checked : defaultChecked ?? false;\n\n const circleCls = [\n styles.circle,\n isChecked ? styles.checked : null,\n ]\n .filter(Boolean)\n .join(' ');\n\n const wrapperCls = [\n styles.radio,\n disabled ? styles.disabled : null,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <label className={wrapperCls} htmlFor={id}>\n <input\n id={id}\n type=\"radio\"\n className={styles.input}\n checked={isControlled ? isChecked : undefined}\n defaultChecked={!isControlled ? defaultChecked : undefined}\n disabled={disabled}\n aria-checked={isChecked}\n onChange={onChange}\n {...props}\n />\n <span className={circleCls} aria-hidden=\"true\" />\n {label && <span className={styles.label}>{label}</span>}\n </label>\n );\n}\n"],"names":["Radio","checked","defaultChecked","label","disabled","className","idProp","onChange","props","generatedId","useId","id","isControlled","isChecked","circleCls","styles","wrapperCls","jsxs","jsx"],"mappings":";;;AAiBO,SAASA,EAAM;AAAA,EACpB,SAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,WAAAC;AAAA,EACA,IAAIC;AAAA,EACJ,UAAAC;AAAA,EACA,GAAGC;AACL,GAAe;AACb,QAAMC,IAAcC,EAAA,GACdC,IAAKL,KAAUG,GAEfG,IAAeX,MAAY,QAC3BY,IAAYD,IAAeX,IAAUC,KAAkB,IAEvDY,IAAY;AAAA,IAChBC,EAAO;AAAA,IACPF,IAAYE,EAAO,UAAU;AAAA,EAAA,EAE5B,OAAO,OAAO,EACd,KAAK,GAAG,GAELC,IAAa;AAAA,IACjBD,EAAO;AAAA,IACPX,IAAWW,EAAO,WAAW;AAAA,IAC7BV;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACE,gBAAAY,EAAC,SAAA,EAAM,WAAWD,GAAY,SAASL,GACrC,UAAA;AAAA,IAAA,gBAAAO;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,IAAAP;AAAA,QACA,MAAK;AAAA,QACL,WAAWI,EAAO;AAAA,QAClB,SAASH,IAAeC,IAAY;AAAA,QACpC,gBAAiBD,IAAgC,SAAjBV;AAAA,QAChC,UAAAE;AAAA,QACA,gBAAcS;AAAA,QACd,UAAAN;AAAA,QACC,GAAGC;AAAA,MAAA;AAAA,IAAA;AAAA,IAEN,gBAAAU,EAAC,QAAA,EAAK,WAAWJ,GAAW,eAAY,QAAO;AAAA,IAC9CX,KAAS,gBAAAe,EAAC,QAAA,EAAK,WAAWH,EAAO,OAAQ,UAAAZ,EAAA,CAAM;AAAA,EAAA,GAClD;AAEJ;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._radio_1gd1w_7{display:inline-flex;align-items:center;gap:8px;cursor:pointer;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);-webkit-user-select:none;user-select:none}._radio_1gd1w_7._disabled_1gd1w_20{opacity:.5;cursor:not-allowed;pointer-events:none}._input_1gd1w_27{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}._circle_1gd1w_4{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:24px;height:24px;border-radius:12px;border:2px solid var(--color-stroke-neutral-default);background-color:var(--color-canvas-neutral-white);box-sizing:border-box;transition:border-color .12s ease,box-shadow .12s ease}._circle_1gd1w_4:after{content:"";display:block;width:10px;height:10px;border-radius:50%;background-color:transparent;transition:background-color .12s ease}._radio_1gd1w_7:not(._disabled_1gd1w_20):hover ._circle_1gd1w_4{border-color:var(--color-stroke-interaction-neutral-hover)}._circle_1gd1w_4._checked_1gd1w_96{border-color:var(--color-stroke-brand-default)}._circle_1gd1w_4._checked_1gd1w_96:after{background-color:var(--color-fill-brand-default)}._radio_1gd1w_7:not(._disabled_1gd1w_20):hover ._circle_1gd1w_4._checked_1gd1w_96{border-color:var(--color-stroke-interaction-brand-hover)}._radio_1gd1w_7:not(._disabled_1gd1w_20):hover ._circle_1gd1w_4._checked_1gd1w_96:after{background-color:var(--color-fill-interaction-brand-hover)}._input_1gd1w_27:focus-visible~._circle_1gd1w_4{outline:none;box-shadow:var(--shadow-focus)}._label_1gd1w_4{color:var(--color-text-neutral-mudle);font-size:var(--font-size-14);font-weight:var(--font-weight-regular);line-height:var(--font-line-height-14)}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import './Radio.module.css';const c = "_radio_1gd1w_7", d = "_disabled_1gd1w_20", e = "_input_1gd1w_27", _ = "_circle_1gd1w_4", l = "_checked_1gd1w_96", s = "_label_1gd1w_4", t = {
|
|
2
|
+
radio: c,
|
|
3
|
+
disabled: d,
|
|
4
|
+
input: e,
|
|
5
|
+
circle: _,
|
|
6
|
+
checked: l,
|
|
7
|
+
label: s
|
|
8
|
+
};
|
|
9
|
+
export {
|
|
10
|
+
l as checked,
|
|
11
|
+
_ as circle,
|
|
12
|
+
t as default,
|
|
13
|
+
d as disabled,
|
|
14
|
+
e as input,
|
|
15
|
+
s as label,
|
|
16
|
+
c as radio
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=Radio.module.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Radio.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { jsxs as s, jsx as c } from "react/jsx-runtime";
|
|
2
|
+
import o from "react";
|
|
3
|
+
import { Icon as y } from "../Icon/Icon.js";
|
|
4
|
+
import t from "./SegmentControl.module.css.js";
|
|
5
|
+
function g({
|
|
6
|
+
options: f,
|
|
7
|
+
value: n,
|
|
8
|
+
onChange: u,
|
|
9
|
+
disabled: r = !1,
|
|
10
|
+
className: m,
|
|
11
|
+
"aria-label": d,
|
|
12
|
+
"aria-labelledby": b
|
|
13
|
+
}) {
|
|
14
|
+
const l = o.useRef(null), [a, h] = o.useState(null);
|
|
15
|
+
o.useLayoutEffect(() => {
|
|
16
|
+
if (!l.current) return;
|
|
17
|
+
const e = l.current.querySelector('[aria-checked="true"]');
|
|
18
|
+
e && h({ x: e.offsetLeft, width: e.offsetWidth });
|
|
19
|
+
}, [n]);
|
|
20
|
+
const v = [
|
|
21
|
+
t.segmentControl,
|
|
22
|
+
r ? t.disabled : void 0,
|
|
23
|
+
m
|
|
24
|
+
].filter(Boolean).join(" ");
|
|
25
|
+
return /* @__PURE__ */ s(
|
|
26
|
+
"div",
|
|
27
|
+
{
|
|
28
|
+
role: "group",
|
|
29
|
+
"aria-label": d,
|
|
30
|
+
"aria-labelledby": b,
|
|
31
|
+
className: v,
|
|
32
|
+
ref: l,
|
|
33
|
+
children: [
|
|
34
|
+
a && /* @__PURE__ */ c(
|
|
35
|
+
"div",
|
|
36
|
+
{
|
|
37
|
+
className: t.pill,
|
|
38
|
+
style: { width: a.width, transform: `translateX(${a.x}px)` },
|
|
39
|
+
"aria-hidden": "true"
|
|
40
|
+
}
|
|
41
|
+
),
|
|
42
|
+
f.map((e) => {
|
|
43
|
+
const i = e.value === n, p = [
|
|
44
|
+
t.item,
|
|
45
|
+
i ? t.itemActive : void 0
|
|
46
|
+
].filter(Boolean).join(" ");
|
|
47
|
+
return /* @__PURE__ */ s(
|
|
48
|
+
"button",
|
|
49
|
+
{
|
|
50
|
+
type: "button",
|
|
51
|
+
role: "radio",
|
|
52
|
+
"aria-checked": i,
|
|
53
|
+
disabled: r,
|
|
54
|
+
"aria-disabled": r || void 0,
|
|
55
|
+
className: p,
|
|
56
|
+
onClick: () => {
|
|
57
|
+
!r && !i && u(e.value);
|
|
58
|
+
},
|
|
59
|
+
children: [
|
|
60
|
+
e.icon && /* @__PURE__ */ c(y, { as: e.icon, size: 16 }),
|
|
61
|
+
e.label
|
|
62
|
+
]
|
|
63
|
+
},
|
|
64
|
+
e.value
|
|
65
|
+
);
|
|
66
|
+
})
|
|
67
|
+
]
|
|
68
|
+
}
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
export {
|
|
72
|
+
g as SegmentControl
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=SegmentControl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SegmentControl.js","sources":["../../src/SegmentControl/SegmentControl.tsx"],"sourcesContent":["import React from 'react';\nimport type { Icon as PhosphorIcon } from '@phosphor-icons/react';\nimport { Icon } from '../Icon/index.js';\nimport styles from './SegmentControl.module.css';\n\nexport interface SegmentControlOption {\n /** Unique identifier for the option */\n value: string;\n /** Display label */\n label: string;\n /** Optional leading icon */\n icon?: PhosphorIcon;\n}\n\nexport interface SegmentControlProps {\n /** Array of 2–5 options to display */\n options: SegmentControlOption[];\n /** Currently selected value */\n value: string;\n /** Callback fired when the user selects a different option */\n onChange: (value: string) => void;\n /** Disables all interaction */\n disabled?: boolean;\n /** Additional class names for the wrapper */\n className?: string;\n /** aria-label for the group when no surrounding label is present */\n 'aria-label'?: string;\n /** aria-labelledby pointing to an external label element */\n 'aria-labelledby'?: string;\n}\n\nexport function SegmentControl({\n options,\n value,\n onChange,\n disabled = false,\n className,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n}: SegmentControlProps) {\n const containerRef = React.useRef<HTMLDivElement>(null);\n const [pill, setPill] = React.useState<{ x: number; width: number } | null>(null);\n\n // Mede a posição do botão ativo após cada mudança de value e posiciona o pill.\n // useLayoutEffect roda de forma síncrona antes do browser pintar, então o\n // pill aparece no lugar certo já no primeiro frame — sem flash de posição.\n React.useLayoutEffect(() => {\n if (!containerRef.current) return;\n const btn = containerRef.current.querySelector<HTMLElement>('[aria-checked=\"true\"]');\n if (!btn) return;\n setPill({ x: btn.offsetLeft, width: btn.offsetWidth });\n }, [value]);\n\n const wrapperCls = [\n styles.segmentControl,\n disabled ? styles.disabled : undefined,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n role=\"group\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n className={wrapperCls}\n ref={containerRef}\n >\n {/* Pill deslizante — abaixo dos itens no z-order, pointer-events:none */}\n {pill && (\n <div\n className={styles.pill}\n style={{ width: pill.width, transform: `translateX(${pill.x}px)` }}\n aria-hidden=\"true\"\n />\n )}\n\n {options.map((option) => {\n const isActive = option.value === value;\n\n const itemCls = [\n styles.item,\n isActive ? styles.itemActive : undefined,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button\n key={option.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={isActive}\n disabled={disabled}\n aria-disabled={disabled || undefined}\n className={itemCls}\n onClick={() => {\n if (!disabled && !isActive) {\n onChange(option.value);\n }\n }}\n >\n {option.icon && <Icon as={option.icon} size={16} />}\n {option.label}\n </button>\n );\n })}\n </div>\n );\n}\n"],"names":["SegmentControl","options","value","onChange","disabled","className","ariaLabel","ariaLabelledBy","containerRef","React","pill","setPill","btn","wrapperCls","styles","jsxs","jsx","option","isActive","itemCls","Icon"],"mappings":";;;;AA+BO,SAASA,EAAe;AAAA,EAC7B,SAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,WAAAC;AAAA,EACA,cAAcC;AAAA,EACd,mBAAmBC;AACrB,GAAwB;AACtB,QAAMC,IAAeC,EAAM,OAAuB,IAAI,GAChD,CAACC,GAAMC,CAAO,IAAIF,EAAM,SAA8C,IAAI;AAKhF,EAAAA,EAAM,gBAAgB,MAAM;AAC1B,QAAI,CAACD,EAAa,QAAS;AAC3B,UAAMI,IAAMJ,EAAa,QAAQ,cAA2B,uBAAuB;AACnF,IAAKI,KACLD,EAAQ,EAAE,GAAGC,EAAI,YAAY,OAAOA,EAAI,aAAa;AAAA,EACvD,GAAG,CAACV,CAAK,CAAC;AAEV,QAAMW,IAAa;AAAA,IACjBC,EAAO;AAAA,IACPV,IAAWU,EAAO,WAAW;AAAA,IAC7BT;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,SACE,gBAAAU;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAYT;AAAA,MACZ,mBAAiBC;AAAA,MACjB,WAAWM;AAAA,MACX,KAAKL;AAAA,MAGJ,UAAA;AAAA,QAAAE,KACC,gBAAAM;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWF,EAAO;AAAA,YAClB,OAAO,EAAE,OAAOJ,EAAK,OAAO,WAAW,cAAcA,EAAK,CAAC,MAAA;AAAA,YAC3D,eAAY;AAAA,UAAA;AAAA,QAAA;AAAA,QAIfT,EAAQ,IAAI,CAACgB,MAAW;AACvB,gBAAMC,IAAWD,EAAO,UAAUf,GAE5BiB,IAAU;AAAA,YACdL,EAAO;AAAA,YACPI,IAAWJ,EAAO,aAAa;AAAA,UAAA,EAE9B,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,iBACE,gBAAAC;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,MAAK;AAAA,cACL,MAAK;AAAA,cACL,gBAAcG;AAAA,cACd,UAAAd;AAAA,cACA,iBAAeA,KAAY;AAAA,cAC3B,WAAWe;AAAA,cACX,SAAS,MAAM;AACb,gBAAI,CAACf,KAAY,CAACc,KAChBf,EAASc,EAAO,KAAK;AAAA,cAEzB;AAAA,cAEC,UAAA;AAAA,gBAAAA,EAAO,QAAQ,gBAAAD,EAACI,GAAA,EAAK,IAAIH,EAAO,MAAM,MAAM,IAAI;AAAA,gBAChDA,EAAO;AAAA,cAAA;AAAA,YAAA;AAAA,YAdHA,EAAO;AAAA,UAAA;AAAA,QAiBlB,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGP;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._segmentControl_ik837_2{display:inline-flex;align-items:center;gap:0;padding:4px;border-radius:12px;background-color:var(--color-fill-neutral-muted);font-family:var(--font-family-base, system-ui, sans-serif);position:relative}._segmentControl_ik837_2:focus-visible{outline:none;box-shadow:var(--shadow-focus)}._segmentControl_ik837_2._disabled_ik837_19{opacity:.5;cursor:not-allowed;pointer-events:none}._pill_ik837_26{position:absolute;top:4px;left:0;height:36px;border-radius:8px;background-color:var(--color-canvas-neutral-white);box-shadow:var(--shadow-layer-xs);transition:transform .2s ease,width .2s ease;pointer-events:none;z-index:0}._item_ik837_40{display:inline-flex;align-items:center;justify-content:center;gap:4px;height:36px;padding:4px 8px;border-radius:8px;border:none;background:transparent;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:pointer;white-space:nowrap;flex-shrink:0;position:relative;z-index:1;transition:color .12s ease,font-weight .12s ease,box-shadow .12s ease}._item_ik837_40:focus-visible{outline:none;box-shadow:var(--shadow-focus)}._item_ik837_40:hover:not(._itemActive_ik837_71){background-color:var(--color-fill-interaction-neutral-subtle-hover)}._itemActive_ik837_71{color:var(--color-text-brand-default);font-weight:var(--font-weight-semibold);cursor:default}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import './SegmentControl.module.css';const t = "_segmentControl_ik837_2", e = "_disabled_ik837_19", i = "_pill_ik837_26", s = "_item_ik837_40", _ = "_itemActive_ik837_71", l = {
|
|
2
|
+
segmentControl: t,
|
|
3
|
+
disabled: e,
|
|
4
|
+
pill: i,
|
|
5
|
+
item: s,
|
|
6
|
+
itemActive: _
|
|
7
|
+
};
|
|
8
|
+
export {
|
|
9
|
+
l as default,
|
|
10
|
+
e as disabled,
|
|
11
|
+
s as item,
|
|
12
|
+
_ as itemActive,
|
|
13
|
+
i as pill,
|
|
14
|
+
t as segmentControl
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=SegmentControl.module.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SegmentControl.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
|
package/Select/Select.js
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { jsxs as S, jsx as t } from "react/jsx-runtime";
|
|
2
|
+
import { useId as ee, useState as D, useRef as H, useCallback as le, useEffect as ae } from "react";
|
|
3
|
+
import { CaretDown as ne } from "@phosphor-icons/react";
|
|
4
|
+
import { Icon as V } from "../Icon/Icon.js";
|
|
5
|
+
import { Dropdown as se } from "../Dropdown/Dropdown.js";
|
|
6
|
+
import e from "./Select.module.css.js";
|
|
7
|
+
const re = {
|
|
8
|
+
large: e.sizeLarge,
|
|
9
|
+
medium: e.sizeMedium,
|
|
10
|
+
small: e.sizeSmall,
|
|
11
|
+
xsmall: e.sizeXsmall
|
|
12
|
+
}, te = {
|
|
13
|
+
large: 20,
|
|
14
|
+
medium: 20,
|
|
15
|
+
small: 16,
|
|
16
|
+
xsmall: 16
|
|
17
|
+
}, ie = {
|
|
18
|
+
default: e.hint,
|
|
19
|
+
danger: `${e.hint} ${e.hintDanger}`,
|
|
20
|
+
success: `${e.hint} ${e.hintSuccess}`,
|
|
21
|
+
warning: `${e.hint} ${e.hintWarning}`
|
|
22
|
+
};
|
|
23
|
+
function be({
|
|
24
|
+
value: E,
|
|
25
|
+
defaultValue: _,
|
|
26
|
+
options: n = [],
|
|
27
|
+
label: i,
|
|
28
|
+
placeholder: F = "Select",
|
|
29
|
+
size: N = "medium",
|
|
30
|
+
state: p,
|
|
31
|
+
disabled: R = !1,
|
|
32
|
+
error: T = !1,
|
|
33
|
+
hint: k,
|
|
34
|
+
hintType: W = "default",
|
|
35
|
+
leadingIcon: y,
|
|
36
|
+
onChange: v,
|
|
37
|
+
className: B,
|
|
38
|
+
id: K,
|
|
39
|
+
"aria-label": z,
|
|
40
|
+
style: M
|
|
41
|
+
}) {
|
|
42
|
+
const Z = ee(), o = K ?? Z, g = `${o}-label`, u = `${o}-listbox`, C = E !== void 0, [P, U] = D(_ ?? ""), I = C ? E : P, [s, c] = D(!1), [d, $] = D(-1), x = H(null), w = H(null), f = R || p === "disabled", L = T || p === "error", X = p === "focus", m = le((l) => {
|
|
43
|
+
x.current && !x.current.contains(l.target) && c(!1);
|
|
44
|
+
}, []);
|
|
45
|
+
ae(() => (s ? document.addEventListener("mousedown", m) : document.removeEventListener("mousedown", m), () => document.removeEventListener("mousedown", m)), [s, m]);
|
|
46
|
+
const O = (l) => {
|
|
47
|
+
n.length && $((a) => {
|
|
48
|
+
let r = a;
|
|
49
|
+
for (let A = 0; A < n.length; A++)
|
|
50
|
+
if (r = (r + l + n.length) % n.length, !n[r].disabled) return r;
|
|
51
|
+
return a;
|
|
52
|
+
});
|
|
53
|
+
}, b = () => {
|
|
54
|
+
if (f) return;
|
|
55
|
+
const l = n.findIndex((r) => r.value === I && !r.disabled), a = n.findIndex((r) => !r.disabled);
|
|
56
|
+
$(l >= 0 ? l : a), c(!0);
|
|
57
|
+
}, q = (l) => {
|
|
58
|
+
var a;
|
|
59
|
+
if (!f)
|
|
60
|
+
switch (l.key) {
|
|
61
|
+
case "Enter":
|
|
62
|
+
case " ":
|
|
63
|
+
l.preventDefault(), s ? d >= 0 && n[d] && j(n[d]) : b();
|
|
64
|
+
break;
|
|
65
|
+
case "Escape":
|
|
66
|
+
c(!1), (a = w.current) == null || a.focus();
|
|
67
|
+
break;
|
|
68
|
+
case "ArrowDown":
|
|
69
|
+
l.preventDefault(), s ? O(1) : b();
|
|
70
|
+
break;
|
|
71
|
+
case "ArrowUp":
|
|
72
|
+
l.preventDefault(), s ? O(-1) : b();
|
|
73
|
+
break;
|
|
74
|
+
case "Tab":
|
|
75
|
+
c(!1);
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
}, j = (l) => {
|
|
79
|
+
var a;
|
|
80
|
+
l.disabled || (C || U(l.value), v == null || v(l.value), c(!1), (a = w.current) == null || a.focus());
|
|
81
|
+
}, h = n.find((l) => l.value === I), G = (h == null ? void 0 : h.label) ?? "", J = [
|
|
82
|
+
e.field,
|
|
83
|
+
re[N],
|
|
84
|
+
L ? e.fieldError : null,
|
|
85
|
+
// Mantém o visual de foco enquanto o dropdown está aberto — :focus-visible
|
|
86
|
+
// não dispara quando o menu é aberto por clique do mouse.
|
|
87
|
+
X || s ? e.fieldFocus : null
|
|
88
|
+
].filter(Boolean).join(" "), Q = [e.selectWrapper, B].filter(Boolean).join(" "), Y = te[N];
|
|
89
|
+
return /* @__PURE__ */ S("div", { className: Q, style: M, ref: x, children: [
|
|
90
|
+
i && /* @__PURE__ */ t("span", { id: g, className: e.label, children: i }),
|
|
91
|
+
/* @__PURE__ */ S("div", { className: e.fieldWrapper, children: [
|
|
92
|
+
/* @__PURE__ */ S(
|
|
93
|
+
"button",
|
|
94
|
+
{
|
|
95
|
+
ref: w,
|
|
96
|
+
id: o,
|
|
97
|
+
type: "button",
|
|
98
|
+
role: "combobox",
|
|
99
|
+
"aria-haspopup": "listbox",
|
|
100
|
+
"aria-expanded": s,
|
|
101
|
+
"aria-controls": u,
|
|
102
|
+
"aria-activedescendant": s && d >= 0 ? `${u}-opt-${d}` : void 0,
|
|
103
|
+
"aria-labelledby": i ? `${g} ${o}` : void 0,
|
|
104
|
+
"aria-label": i ? void 0 : z,
|
|
105
|
+
"aria-disabled": f,
|
|
106
|
+
"aria-invalid": L || void 0,
|
|
107
|
+
disabled: f,
|
|
108
|
+
className: J,
|
|
109
|
+
onClick: () => s ? c(!1) : b(),
|
|
110
|
+
onKeyDown: q,
|
|
111
|
+
children: [
|
|
112
|
+
y && /* @__PURE__ */ t("span", { className: e.leadingIcon, children: /* @__PURE__ */ t(V, { as: y, size: Y }) }),
|
|
113
|
+
/* @__PURE__ */ t(
|
|
114
|
+
"span",
|
|
115
|
+
{
|
|
116
|
+
className: `${e.valueText} ${h ? "" : e.placeholder}`,
|
|
117
|
+
"aria-live": "polite",
|
|
118
|
+
children: G || F
|
|
119
|
+
}
|
|
120
|
+
),
|
|
121
|
+
/* @__PURE__ */ t("span", { className: `${e.caretIcon} ${s ? e.caretIconOpen : ""}`, "aria-hidden": "true", children: /* @__PURE__ */ t(V, { as: ne, size: 16, weight: "bold" }) })
|
|
122
|
+
]
|
|
123
|
+
}
|
|
124
|
+
),
|
|
125
|
+
s && /* @__PURE__ */ t(
|
|
126
|
+
se,
|
|
127
|
+
{
|
|
128
|
+
id: u,
|
|
129
|
+
"aria-labelledby": i ? g : void 0,
|
|
130
|
+
"aria-label": i ? void 0 : z,
|
|
131
|
+
className: e.menuPanel,
|
|
132
|
+
fluid: !0,
|
|
133
|
+
options: n,
|
|
134
|
+
selectedValue: I,
|
|
135
|
+
activeIndex: d,
|
|
136
|
+
getOptionId: (l, a) => `${u}-opt-${a}`,
|
|
137
|
+
optionsFocusable: !1,
|
|
138
|
+
selectOnPointerDown: !0,
|
|
139
|
+
onOptionHover: $,
|
|
140
|
+
onSelect: (l) => {
|
|
141
|
+
const a = n.find((r) => r.value === l);
|
|
142
|
+
a && j(a);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
)
|
|
146
|
+
] }),
|
|
147
|
+
k && /* @__PURE__ */ t("span", { className: ie[W], children: k })
|
|
148
|
+
] });
|
|
149
|
+
}
|
|
150
|
+
export {
|
|
151
|
+
be as Select
|
|
152
|
+
};
|
|
153
|
+
//# sourceMappingURL=Select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Select.js","sources":["../../src/Select/Select.tsx"],"sourcesContent":["import React, { useId, useRef, useState, useEffect, useCallback } from 'react';\nimport type { Icon as PhosphorIcon } from '@phosphor-icons/react';\nimport { CaretDown } from '@phosphor-icons/react';\nimport { Icon } from '../Icon/index.js';\nimport { Dropdown } from '../Dropdown/index.js';\nimport styles from './Select.module.css';\n\nexport type SelectSize = 'large' | 'medium' | 'small' | 'xsmall';\nexport type SelectState = 'default' | 'hover' | 'focus' | 'error' | 'disabled';\nexport type SelectHintType = 'default' | 'danger' | 'success' | 'warning';\n\nexport interface SelectOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps {\n /** Current selected value (controlled). */\n value?: string;\n /** Default value for uncontrolled usage. */\n defaultValue?: string;\n /** Available options. */\n options?: SelectOption[];\n /** Field label shown above the trigger. */\n label?: string;\n /** Placeholder shown when no option is selected. */\n placeholder?: string;\n /** Component size. */\n size?: SelectSize;\n /** Explicit state override (useful for design demos). */\n state?: SelectState;\n /** Whether the field is disabled. */\n disabled?: boolean;\n /** Whether the field has an error state. */\n error?: boolean;\n /** Hint text shown below the trigger. */\n hint?: string;\n /** Hint type — controls hint text colour. */\n hintType?: SelectHintType;\n /** Optional leading icon. */\n leadingIcon?: PhosphorIcon;\n /** Callback fired when the selected value changes. */\n onChange?: (value: string) => void;\n /** Additional className for the wrapper. */\n className?: string;\n /** id forwarded to the trigger button. */\n id?: string;\n /** aria-label for the trigger when no label is provided. */\n 'aria-label'?: string;\n /** Inline styles applied to the wrapper (ex.: restringir a largura). */\n style?: React.CSSProperties;\n}\n\nconst SIZE_CLASS: Record<SelectSize, string> = {\n large: styles.sizeLarge,\n medium: styles.sizeMedium,\n small: styles.sizeSmall,\n xsmall: styles.sizeXsmall,\n};\n\nconst ICON_SIZE: Record<SelectSize, number> = {\n large: 20,\n medium: 20,\n small: 16,\n xsmall: 16,\n};\n\nconst HINT_CLASS: Record<SelectHintType, string> = {\n default: styles.hint,\n danger: `${styles.hint} ${styles.hintDanger}`,\n success: `${styles.hint} ${styles.hintSuccess}`,\n warning: `${styles.hint} ${styles.hintWarning}`,\n};\n\nexport function Select({\n value: valueProp,\n defaultValue,\n options = [],\n label,\n placeholder = 'Select',\n size = 'medium',\n state,\n disabled = false,\n error = false,\n hint,\n hintType = 'default',\n leadingIcon,\n onChange,\n className,\n id: idProp,\n 'aria-label': ariaLabel,\n style,\n}: SelectProps) {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const labelId = `${id}-label`;\n const listboxId = `${id}-listbox`;\n\n const isControlled = valueProp !== undefined;\n const [internalValue, setInternalValue] = useState<string>(defaultValue ?? '');\n const currentValue = isControlled ? valueProp : internalValue;\n\n const [open, setOpen] = useState(false);\n const [highlightedIndex, setHighlightedIndex] = useState(-1);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n\n // Resolve states\n const isDisabled = disabled || state === 'disabled';\n const isError = error || state === 'error';\n const isFocused = state === 'focus';\n\n // Close on outside click\n const handleOutsideClick = useCallback((e: MouseEvent) => {\n if (wrapperRef.current && !wrapperRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n }, []);\n\n useEffect(() => {\n if (open) {\n document.addEventListener('mousedown', handleOutsideClick);\n } else {\n document.removeEventListener('mousedown', handleOutsideClick);\n }\n return () => document.removeEventListener('mousedown', handleOutsideClick);\n }, [open, handleOutsideClick]);\n\n // Move the keyboard highlight to the next/previous enabled option\n const moveHighlight = (dir: 1 | -1) => {\n if (!options.length) return;\n setHighlightedIndex((prev) => {\n let i = prev;\n for (let step = 0; step < options.length; step++) {\n i = (i + dir + options.length) % options.length;\n if (!options[i].disabled) return i;\n }\n return prev;\n });\n };\n\n const openMenu = () => {\n if (isDisabled) return;\n const selIdx = options.findIndex((o) => o.value === currentValue && !o.disabled);\n const firstEnabled = options.findIndex((o) => !o.disabled);\n setHighlightedIndex(selIdx >= 0 ? selIdx : firstEnabled);\n setOpen(true);\n };\n\n // Keyboard navigation (focus stays on the trigger; combobox + aria-activedescendant)\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (isDisabled) return;\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (open) {\n if (highlightedIndex >= 0 && options[highlightedIndex]) {\n handleSelect(options[highlightedIndex]);\n }\n } else {\n openMenu();\n }\n break;\n case 'Escape':\n setOpen(false);\n triggerRef.current?.focus();\n break;\n case 'ArrowDown':\n e.preventDefault();\n if (!open) openMenu();\n else moveHighlight(1);\n break;\n case 'ArrowUp':\n e.preventDefault();\n if (!open) openMenu();\n else moveHighlight(-1);\n break;\n case 'Tab':\n setOpen(false);\n break;\n }\n };\n\n const handleSelect = (opt: SelectOption) => {\n if (opt.disabled) return;\n if (!isControlled) setInternalValue(opt.value);\n onChange?.(opt.value);\n setOpen(false);\n triggerRef.current?.focus();\n };\n\n const selectedOption = options.find((o) => o.value === currentValue);\n const displayLabel = selectedOption?.label ?? '';\n\n // CSS classes\n const fieldCls = [\n styles.field,\n SIZE_CLASS[size],\n isError ? styles.fieldError : null,\n // Mantém o visual de foco enquanto o dropdown está aberto — :focus-visible\n // não dispara quando o menu é aberto por clique do mouse.\n (isFocused || open) ? styles.fieldFocus : null,\n ]\n .filter(Boolean)\n .join(' ');\n\n const wrapperCls = [styles.selectWrapper, className]\n .filter(Boolean)\n .join(' ');\n\n const iconSize = ICON_SIZE[size];\n\n return (\n <div className={wrapperCls} style={style} ref={wrapperRef}>\n {label && (\n <span id={labelId} className={styles.label}>\n {label}\n </span>\n )}\n\n {/* Trigger + dropdown panel */}\n <div className={styles.fieldWrapper}>\n <button\n ref={triggerRef}\n id={id}\n type=\"button\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={listboxId}\n aria-activedescendant={\n open && highlightedIndex >= 0 ? `${listboxId}-opt-${highlightedIndex}` : undefined\n }\n aria-labelledby={label ? `${labelId} ${id}` : undefined}\n aria-label={!label ? ariaLabel : undefined}\n aria-disabled={isDisabled}\n aria-invalid={isError || undefined}\n disabled={isDisabled}\n className={fieldCls}\n onClick={() => (open ? setOpen(false) : openMenu())}\n onKeyDown={handleKeyDown}\n >\n {leadingIcon && (\n <span className={styles.leadingIcon}>\n <Icon as={leadingIcon} size={iconSize} />\n </span>\n )}\n\n <span\n className={`${styles.valueText} ${!selectedOption ? styles.placeholder : ''}`}\n aria-live=\"polite\"\n >\n {displayLabel || placeholder}\n </span>\n\n <span className={`${styles.caretIcon} ${open ? styles.caretIconOpen : ''}`} aria-hidden=\"true\">\n <Icon as={CaretDown} size={16} weight=\"bold\" />\n </span>\n </button>\n\n {/* Listbox — reutiliza o componente Dropdown (building block) */}\n {open && (\n <Dropdown\n id={listboxId}\n aria-labelledby={label ? labelId : undefined}\n aria-label={!label ? ariaLabel : undefined}\n className={styles.menuPanel}\n fluid\n options={options}\n selectedValue={currentValue}\n activeIndex={highlightedIndex}\n getOptionId={(_v, i) => `${listboxId}-opt-${i}`}\n optionsFocusable={false}\n selectOnPointerDown\n onOptionHover={setHighlightedIndex}\n onSelect={(v) => {\n const opt = options.find((o) => o.value === v);\n if (opt) handleSelect(opt);\n }}\n />\n )}\n </div>\n\n {/* Hint */}\n {hint && (\n <span className={HINT_CLASS[hintType]}>\n {hint}\n </span>\n )}\n </div>\n );\n}\n"],"names":["SIZE_CLASS","styles","ICON_SIZE","HINT_CLASS","Select","valueProp","defaultValue","options","label","placeholder","size","state","disabled","error","hint","hintType","leadingIcon","onChange","className","idProp","ariaLabel","style","generatedId","useId","id","labelId","listboxId","isControlled","internalValue","setInternalValue","useState","currentValue","open","setOpen","highlightedIndex","setHighlightedIndex","wrapperRef","useRef","triggerRef","isDisabled","isError","isFocused","handleOutsideClick","useCallback","e","useEffect","moveHighlight","dir","prev","i","step","openMenu","selIdx","o","firstEnabled","handleKeyDown","handleSelect","_a","opt","selectedOption","displayLabel","fieldCls","wrapperCls","iconSize","jsxs","jsx","Icon","CaretDown","Dropdown","_v","v"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._selectWrapper_i9fx6_2{display:inline-flex;flex-direction:column;gap:8px;width:100%;position:relative}._label_i9fx6_11{display:flex;align-items:center;gap:4px;height:20px;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);color:var(--color-text-neutral-mudle)}._field_i9fx6_24{display:flex;align-items:center;gap:8px;width:100%;padding:4px 12px;border-radius:8px;border:1px solid transparent;background-color:var(--color-fill-neutral-muted);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:pointer;-moz-appearance:none;appearance:none;-webkit-appearance:none;text-align:left;box-sizing:border-box;transition:background-color .12s ease,border-color .12s ease,box-shadow .12s ease,opacity .12s ease;outline:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._sizeLarge_i9fx6_57{height:48px}._sizeMedium_i9fx6_61{height:42px}._sizeSmall_i9fx6_65{height:36px}._sizeXsmall_i9fx6_69{height:32px;font-size:var(--font-size-12);line-height:var(--font-line-height-12)}._field_i9fx6_24:hover:not(:disabled):not(._fieldError_i9fx6_79):not(._fieldFocus_i9fx6_79):not(:focus-visible){background-color:var(--color-fill-interaction-neutral-muted-hover)}._field_i9fx6_24:focus-visible,._field_i9fx6_24._fieldFocus_i9fx6_79:not(:disabled){outline:none;background-color:var(--color-canvas-neutral-white);border-color:var(--color-stroke-interaction-brand-focus);box-shadow:var(--shadow-focus)}._fieldError_i9fx6_79{background-color:var(--color-fill-feedback-danger-subtle);border-color:var(--color-stroke-feedback-danger-default)}._fieldError_i9fx6_79:hover:not(:disabled){background-color:var(--color-fill-feedback-danger-subtle);border-color:var(--color-stroke-feedback-danger-default)}._fieldError_i9fx6_79:focus-visible,._fieldError_i9fx6_79._fieldFocus_i9fx6_79{background-color:var(--color-fill-feedback-danger-subtle);border-color:var(--color-stroke-feedback-danger-default);box-shadow:var(--shadow-focus)}._field_i9fx6_24:disabled,._field_i9fx6_24[aria-disabled=true]{opacity:.5;cursor:not-allowed;pointer-events:none}._fieldInner_i9fx6_119{display:flex;align-items:center;width:100%;min-width:0;gap:8px;height:100%;padding:4px 12px;box-sizing:border-box;cursor:pointer;pointer-events:none}._trigger_i9fx6_133{display:flex;align-items:center;width:100%;height:100%;min-width:0;gap:8px;padding:0;border:none;background:transparent;cursor:inherit}._valueText_i9fx6_147{flex:1 0 0;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-family-base, system-ui, sans-serif);font-size:inherit;font-weight:var(--font-weight-regular);line-height:var(--font-line-height-14);color:var(--color-text-neutral-mudle)}._placeholder_i9fx6_160{color:var(--color-text-neutral-subtlest);font-weight:var(--font-weight-regular)}._caretIcon_i9fx6_166{flex-shrink:0;display:flex;align-items:center;justify-content:center;color:var(--color-icon-neutral-default);transition:transform .18s ease}._caretIconOpen_i9fx6_175{transform:rotate(180deg)}._leadingIcon_i9fx6_180{flex-shrink:0;display:flex;align-items:center;justify-content:center;color:var(--color-icon-neutral-default)}._hint_i9fx6_189{display:flex;align-items:center;gap:4px;font-family:var(--font-family-base, system-ui, sans-serif);font-size:var(--font-size-12);font-weight:var(--font-weight-regular);line-height:var(--font-line-height-12);color:var(--color-text-neutral-subtle)}._hintDanger_i9fx6_200{color:var(--color-text-feedback-danger-default)}._hintSuccess_i9fx6_204{color:var(--color-text-feedback-success-default)}._hintWarning_i9fx6_208{color:var(--color-text-feedback-warning-default)}._fieldWrapper_i9fx6_213{position:relative;width:100%}._menuPanel_i9fx6_222{position:absolute;top:calc(100% + 4px);left:0;right:0;z-index:100}
|