@soroush.tech/design-system 0.1.0
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/LICENSE +21 -0
- package/README.md +278 -0
- package/dist/AppBar.cjs +71 -0
- package/dist/AppBar.d.cts +23 -0
- package/dist/AppBar.d.mts +23 -0
- package/dist/AppBar.mjs +69 -0
- package/dist/Avatar.cjs +106 -0
- package/dist/Avatar.d.cts +28 -0
- package/dist/Avatar.d.mts +28 -0
- package/dist/Avatar.mjs +103 -0
- package/dist/Backdrop.cjs +26 -0
- package/dist/Backdrop.d.cts +10 -0
- package/dist/Backdrop.d.mts +10 -0
- package/dist/Backdrop.mjs +25 -0
- package/dist/Button.cjs +178 -0
- package/dist/Button.d.cts +2 -0
- package/dist/Button.d.mts +2 -0
- package/dist/Button.mjs +175 -0
- package/dist/ButtonGroup.cjs +110 -0
- package/dist/ButtonGroup.d.cts +2 -0
- package/dist/ButtonGroup.d.mts +2 -0
- package/dist/ButtonGroup.mjs +107 -0
- package/dist/ButtonGroupContext-DS-kl9lG.mjs +5 -0
- package/dist/ButtonGroupContext-NtkVeDVE.cjs +9 -0
- package/dist/Card.cjs +95 -0
- package/dist/Card.d.cts +18 -0
- package/dist/Card.d.mts +18 -0
- package/dist/Card.mjs +93 -0
- package/dist/Checkbox.cjs +192 -0
- package/dist/Checkbox.d.cts +2 -0
- package/dist/Checkbox.d.mts +2 -0
- package/dist/Checkbox.mjs +190 -0
- package/dist/CircularProgress.cjs +136 -0
- package/dist/CircularProgress.d.cts +34 -0
- package/dist/CircularProgress.d.mts +34 -0
- package/dist/CircularProgress.mjs +133 -0
- package/dist/CodeBlock.cjs +101 -0
- package/dist/CodeBlock.d.cts +2 -0
- package/dist/CodeBlock.d.mts +2 -0
- package/dist/CodeBlock.mjs +100 -0
- package/dist/Drawer.cjs +69 -0
- package/dist/Drawer.d.cts +22 -0
- package/dist/Drawer.d.mts +22 -0
- package/dist/Drawer.mjs +66 -0
- package/dist/Field.cjs +59 -0
- package/dist/Field.d.cts +36 -0
- package/dist/Field.d.mts +36 -0
- package/dist/Field.mjs +58 -0
- package/dist/Flex.cjs +21 -0
- package/dist/Flex.d.cts +2 -0
- package/dist/Flex.d.mts +2 -0
- package/dist/Flex.mjs +19 -0
- package/dist/FocusTrap.cjs +82 -0
- package/dist/FocusTrap.d.cts +24 -0
- package/dist/FocusTrap.d.mts +24 -0
- package/dist/FocusTrap.mjs +81 -0
- package/dist/Form.cjs +44 -0
- package/dist/Form.d.cts +41 -0
- package/dist/Form.d.mts +41 -0
- package/dist/Form.mjs +42 -0
- package/dist/FormContext-CRmRgDgu.cjs +10 -0
- package/dist/FormContext-_G3sxJyQ.mjs +6 -0
- package/dist/FormControl.cjs +84 -0
- package/dist/FormControl.d.cts +78 -0
- package/dist/FormControl.d.mts +78 -0
- package/dist/FormControl.mjs +81 -0
- package/dist/FormControlContext-CyxdOxdN.mjs +6 -0
- package/dist/FormControlContext-aeKTjRKY.cjs +10 -0
- package/dist/FormHelperText.cjs +40 -0
- package/dist/FormHelperText.d.cts +16 -0
- package/dist/FormHelperText.d.mts +16 -0
- package/dist/FormHelperText.mjs +39 -0
- package/dist/FormLabel.cjs +34 -0
- package/dist/FormLabel.d.cts +2 -0
- package/dist/FormLabel.d.mts +2 -0
- package/dist/FormLabel.mjs +33 -0
- package/dist/Grid.cjs +37 -0
- package/dist/Grid.d.cts +21 -0
- package/dist/Grid.d.mts +21 -0
- package/dist/Grid.mjs +32 -0
- package/dist/Icon-1YtNCUKo.cjs +755 -0
- package/dist/Icon-CAKRmFz3.mjs +742 -0
- package/dist/Icon.cjs +4 -0
- package/dist/Icon.d.cts +2 -0
- package/dist/Icon.d.mts +2 -0
- package/dist/Icon.mjs +2 -0
- package/dist/Image.cjs +82 -0
- package/dist/Image.d.cts +2 -0
- package/dist/Image.d.mts +2 -0
- package/dist/Image.mjs +80 -0
- package/dist/LinearProgress.cjs +217 -0
- package/dist/LinearProgress.d.cts +36 -0
- package/dist/LinearProgress.d.mts +36 -0
- package/dist/LinearProgress.mjs +214 -0
- package/dist/Link.cjs +64 -0
- package/dist/Link.d.cts +2 -0
- package/dist/Link.d.mts +2 -0
- package/dist/Link.mjs +62 -0
- package/dist/Markdown/Control.cjs +61 -0
- package/dist/Markdown/Control.d.cts +18 -0
- package/dist/Markdown/Control.d.mts +18 -0
- package/dist/Markdown/Control.mjs +60 -0
- package/dist/Markdown/Editor.cjs +130 -0
- package/dist/Markdown/Editor.d.cts +40 -0
- package/dist/Markdown/Editor.d.mts +40 -0
- package/dist/Markdown/Editor.mjs +128 -0
- package/dist/Markdown/Preview.cjs +241 -0
- package/dist/Markdown/Preview.d.cts +55 -0
- package/dist/Markdown/Preview.d.mts +55 -0
- package/dist/Markdown/Preview.mjs +236 -0
- package/dist/Markdown/Toolbar.cjs +4 -0
- package/dist/Markdown/Toolbar.d.cts +13 -0
- package/dist/Markdown/Toolbar.d.mts +13 -0
- package/dist/Markdown/Toolbar.mjs +2 -0
- package/dist/Markdown.cjs +13 -0
- package/dist/Markdown.d.cts +80 -0
- package/dist/Markdown.d.mts +80 -0
- package/dist/Markdown.mjs +6 -0
- package/dist/MarkdownContext-BN8A3W-J.mjs +11 -0
- package/dist/MarkdownContext-DSwjzpH8.cjs +22 -0
- package/dist/MenuItem.cjs +150 -0
- package/dist/MenuItem.d.cts +51 -0
- package/dist/MenuItem.d.mts +51 -0
- package/dist/MenuItem.mjs +147 -0
- package/dist/Modal-BDMPTSXv.cjs +351 -0
- package/dist/Modal-DR60peRg.mjs +327 -0
- package/dist/Modal.cjs +6 -0
- package/dist/Modal.d.cts +2 -0
- package/dist/Modal.d.mts +2 -0
- package/dist/Modal.mjs +2 -0
- package/dist/NativeSelect.cjs +189 -0
- package/dist/NativeSelect.d.cts +62 -0
- package/dist/NativeSelect.d.mts +62 -0
- package/dist/NativeSelect.mjs +186 -0
- package/dist/Pagination/PaginationItem.cjs +116 -0
- package/dist/Pagination/PaginationItem.d.cts +2 -0
- package/dist/Pagination/PaginationItem.d.mts +2 -0
- package/dist/Pagination/PaginationItem.mjs +114 -0
- package/dist/Pagination.cjs +134 -0
- package/dist/Pagination.d.cts +23 -0
- package/dist/Pagination.d.mts +23 -0
- package/dist/Pagination.mjs +130 -0
- package/dist/Paper.cjs +51 -0
- package/dist/Paper.d.cts +2 -0
- package/dist/Paper.d.mts +2 -0
- package/dist/Paper.mjs +48 -0
- package/dist/Popover-B61J7C79.mjs +252 -0
- package/dist/Popover-CRDLmywF.cjs +259 -0
- package/dist/Popover.cjs +3 -0
- package/dist/Popover.d.cts +84 -0
- package/dist/Popover.d.mts +84 -0
- package/dist/Popover.mjs +2 -0
- package/dist/Portal.cjs +20 -0
- package/dist/Portal.d.cts +18 -0
- package/dist/Portal.d.mts +18 -0
- package/dist/Portal.mjs +19 -0
- package/dist/Quote.cjs +11 -0
- package/dist/Quote.d.cts +2 -0
- package/dist/Quote.d.mts +2 -0
- package/dist/Quote.mjs +10 -0
- package/dist/Radio.cjs +143 -0
- package/dist/Radio.d.cts +38 -0
- package/dist/Radio.d.mts +38 -0
- package/dist/Radio.mjs +141 -0
- package/dist/Select.cjs +528 -0
- package/dist/Select.d.cts +68 -0
- package/dist/Select.d.mts +68 -0
- package/dist/Select.mjs +525 -0
- package/dist/Skeleton.cjs +82 -0
- package/dist/Skeleton.d.cts +21 -0
- package/dist/Skeleton.d.mts +21 -0
- package/dist/Skeleton.mjs +79 -0
- package/dist/Switch.cjs +332 -0
- package/dist/Switch.d.cts +40 -0
- package/dist/Switch.d.mts +40 -0
- package/dist/Switch.mjs +329 -0
- package/dist/Table/Table.cjs +65 -0
- package/dist/Table/Table.d.cts +2 -0
- package/dist/Table/Table.d.mts +2 -0
- package/dist/Table/Table.mjs +63 -0
- package/dist/Table/TableBody.cjs +42 -0
- package/dist/Table/TableBody.d.cts +2 -0
- package/dist/Table/TableBody.d.mts +2 -0
- package/dist/Table/TableBody.mjs +40 -0
- package/dist/Table/TableCell.cjs +93 -0
- package/dist/Table/TableCell.d.cts +2 -0
- package/dist/Table/TableCell.d.mts +2 -0
- package/dist/Table/TableCell.mjs +91 -0
- package/dist/Table/TableContainer.cjs +15 -0
- package/dist/Table/TableContainer.d.cts +2 -0
- package/dist/Table/TableContainer.d.mts +2 -0
- package/dist/Table/TableContainer.mjs +14 -0
- package/dist/Table/TableControl.cjs +42 -0
- package/dist/Table/TableControl.d.cts +2 -0
- package/dist/Table/TableControl.d.mts +2 -0
- package/dist/Table/TableControl.mjs +41 -0
- package/dist/Table/TableFooter.cjs +42 -0
- package/dist/Table/TableFooter.d.cts +2 -0
- package/dist/Table/TableFooter.d.mts +2 -0
- package/dist/Table/TableFooter.mjs +40 -0
- package/dist/Table/TableHead.cjs +42 -0
- package/dist/Table/TableHead.d.cts +2 -0
- package/dist/Table/TableHead.d.mts +2 -0
- package/dist/Table/TableHead.mjs +40 -0
- package/dist/Table/TablePagination.cjs +89 -0
- package/dist/Table/TablePagination.d.cts +2 -0
- package/dist/Table/TablePagination.d.mts +2 -0
- package/dist/Table/TablePagination.mjs +88 -0
- package/dist/Table/TablePaginationActions.cjs +65 -0
- package/dist/Table/TablePaginationActions.d.cts +2 -0
- package/dist/Table/TablePaginationActions.d.mts +2 -0
- package/dist/Table/TablePaginationActions.mjs +63 -0
- package/dist/Table/TableRow.cjs +56 -0
- package/dist/Table/TableRow.d.cts +2 -0
- package/dist/Table/TableRow.d.mts +2 -0
- package/dist/Table/TableRow.mjs +54 -0
- package/dist/Table/TableSortLabel.cjs +62 -0
- package/dist/Table/TableSortLabel.d.cts +2 -0
- package/dist/Table/TableSortLabel.d.mts +2 -0
- package/dist/Table/TableSortLabel.mjs +60 -0
- package/dist/Table/hooks.cjs +112 -0
- package/dist/Table/hooks.d.cts +3 -0
- package/dist/Table/hooks.d.mts +3 -0
- package/dist/Table/hooks.mjs +109 -0
- package/dist/Table.cjs +31 -0
- package/dist/Table.d.cts +16 -0
- package/dist/Table.d.mts +16 -0
- package/dist/Table.mjs +15 -0
- package/dist/TableContext-2qH7XYJB.d.cts +19 -0
- package/dist/TableContext-2qH7XYJB.d.mts +19 -0
- package/dist/TableContext-BRWPghAI.mjs +6 -0
- package/dist/TableContext-qqp35o8z.cjs +10 -0
- package/dist/TableSectionContext-meIG4lFZ.mjs +5 -0
- package/dist/TableSectionContext-pYlJ-duI.cjs +9 -0
- package/dist/TextInput-6o37Zddp.cjs +231 -0
- package/dist/TextInput-D_lHYJlL.mjs +224 -0
- package/dist/TextInput.cjs +3 -0
- package/dist/TextInput.d.cts +2 -0
- package/dist/TextInput.d.mts +2 -0
- package/dist/TextInput.mjs +2 -0
- package/dist/ThemeProvider.cjs +15 -0
- package/dist/ThemeProvider.d.cts +20 -0
- package/dist/ThemeProvider.d.mts +20 -0
- package/dist/ThemeProvider.mjs +14 -0
- package/dist/ToggleButton/ToggleButton.cjs +58 -0
- package/dist/ToggleButton/ToggleButton.d.cts +14 -0
- package/dist/ToggleButton/ToggleButton.d.mts +14 -0
- package/dist/ToggleButton/ToggleButton.mjs +56 -0
- package/dist/ToggleButton/ToggleButtonGroup.cjs +54 -0
- package/dist/ToggleButton/ToggleButtonGroup.d.cts +23 -0
- package/dist/ToggleButton/ToggleButtonGroup.d.mts +23 -0
- package/dist/ToggleButton/ToggleButtonGroup.mjs +52 -0
- package/dist/ToggleButton.cjs +7 -0
- package/dist/ToggleButton.d.cts +4 -0
- package/dist/ToggleButton.d.mts +4 -0
- package/dist/ToggleButton.mjs +4 -0
- package/dist/ToggleButtonGroupContext-CqD-Afho.d.cts +15 -0
- package/dist/ToggleButtonGroupContext-CqD-Afho.d.mts +15 -0
- package/dist/ToggleButtonGroupContext-DxIyy8ze.mjs +5 -0
- package/dist/ToggleButtonGroupContext-Ewc5Ixas.cjs +9 -0
- package/dist/Toolbar-B-W22Sk4.cjs +459 -0
- package/dist/Toolbar-KbR97iJS.mjs +448 -0
- package/dist/Typography.cjs +64 -0
- package/dist/Typography.d.cts +3 -0
- package/dist/Typography.d.mts +3 -0
- package/dist/Typography.mjs +61 -0
- package/dist/View.cjs +40 -0
- package/dist/View.d.cts +2 -0
- package/dist/View.d.mts +2 -0
- package/dist/View.mjs +38 -0
- package/dist/applyAction-B2B-hnP3.mjs +98 -0
- package/dist/applyAction-B2uVHxOE.cjs +103 -0
- package/dist/createTheme-Dts2F4R_.d.cts +21 -0
- package/dist/createTheme-Dts2F4R_.d.mts +21 -0
- package/dist/hooks/useCopyToClipboard.cjs +33 -0
- package/dist/hooks/useCopyToClipboard.d.cts +16 -0
- package/dist/hooks/useCopyToClipboard.d.mts +16 -0
- package/dist/hooks/useCopyToClipboard.mjs +31 -0
- package/dist/hooks.cjs +52 -0
- package/dist/hooks.d.cts +40 -0
- package/dist/hooks.d.mts +40 -0
- package/dist/hooks.mjs +41 -0
- package/dist/index-4rC2j7fR.d.cts +46 -0
- package/dist/index-8dzWTpFp.d.cts +24 -0
- package/dist/index-B1rCD6Oo.d.cts +17 -0
- package/dist/index-BH8jQOdF.d.mts +46 -0
- package/dist/index-BLRMuO_x.d.mts +24 -0
- package/dist/index-BLfFycfJ.d.mts +72 -0
- package/dist/index-BPrjvi7B.d.cts +13 -0
- package/dist/index-BX5-NfbX.d.cts +94 -0
- package/dist/index-Bihpwn75.d.cts +64 -0
- package/dist/index-BlfIbAMs.d.cts +45 -0
- package/dist/index-BnzUumAC2.d.mts +30 -0
- package/dist/index-BoqlPb3Z.d.mts +13 -0
- package/dist/index-BqVgv2B_.d.mts +42 -0
- package/dist/index-Bwi4kRpf.d.mts +79 -0
- package/dist/index-Bx24ZnOV.d.mts +43 -0
- package/dist/index-C-P_hipv.d.mts +21 -0
- package/dist/index-C0xMvDjL.d.mts +49 -0
- package/dist/index-C5_ciaeo.d.cts +79 -0
- package/dist/index-CDVnvjIE.d.cts +27 -0
- package/dist/index-CDcGTGR4.d.cts +21 -0
- package/dist/index-CEOZI-6L.d.mts +48 -0
- package/dist/index-CLU39rUS2.d.mts +30 -0
- package/dist/index-CM_KCTee.d.cts +48 -0
- package/dist/index-CT9uGKrs.d.cts +30 -0
- package/dist/index-CcYSvIJi.d.cts +21 -0
- package/dist/index-CdF_4ckE.d.mts +11 -0
- package/dist/index-CeYkEXU2.d.cts +68 -0
- package/dist/index-Cl_yBpzW2.d.mts +13 -0
- package/dist/index-Cv_UOfYx.d.mts +18 -0
- package/dist/index-CxSNNzBT2.d.mts +68 -0
- package/dist/index-CyZYXDn0.d.cts +42 -0
- package/dist/index-DASvoACZ.d.cts +49 -0
- package/dist/index-DBGE6yKw.d.mts +16 -0
- package/dist/index-DCQ2fsDu.d.mts +40 -0
- package/dist/index-DD2AVtiR.d.cts +16 -0
- package/dist/index-DE5PtzPn.d.mts +27 -0
- package/dist/index-DOPXpr2J.d.cts +43 -0
- package/dist/index-DSCMXFTn.d.cts +30 -0
- package/dist/index-DTkQSXQD.d.cts +11 -0
- package/dist/index-DeJWkpf9.d.cts +16 -0
- package/dist/index-DeiZHSwA.d.cts +12 -0
- package/dist/index-Des8BisQ.d.mts +12 -0
- package/dist/index-Dg8-CPOO.d.cts +18 -0
- package/dist/index-DgRS5Aqv.d.mts +16 -0
- package/dist/index-Dm9HfgV6.d.mts +63 -0
- package/dist/index-DmJIuQJj.d.mts +24 -0
- package/dist/index-Dp81rWM1.d.cts +72 -0
- package/dist/index-Dtzj8X58.d.cts +40 -0
- package/dist/index-DvW2eETV.d.mts +21 -0
- package/dist/index-Dy03o__A.d.mts +94 -0
- package/dist/index-FwTocqhP.d.cts +34 -0
- package/dist/index-GVsFY00r.d.cts +21 -0
- package/dist/index-Nqco3fsM.d.cts +13 -0
- package/dist/index-g-9DZ_KQ.d.cts +28 -0
- package/dist/index-g9EThkSg.d.mts +21 -0
- package/dist/index-kpk9e3xM2.d.mts +45 -0
- package/dist/index-pX7tBQdJ.d.mts +34 -0
- package/dist/index-u57CbuAU2.d.mts +28 -0
- package/dist/index-x80UG39F.d.cts +24 -0
- package/dist/index-z35LEYG8.d.mts +17 -0
- package/dist/index.cjs +68 -0
- package/dist/index.d.cts +4 -0
- package/dist/index.d.mts +4 -0
- package/dist/index.mjs +3 -0
- package/dist/inputVariantStyles-BBkkYQtE.cjs +32 -0
- package/dist/inputVariantStyles-CcqpGfuP.mjs +28 -0
- package/dist/rolldown-runtime-BBjsoOtd.mjs +27 -0
- package/dist/rolldown-runtime-DDXJien1.cjs +50 -0
- package/dist/src-BiocWFSR.cjs +60 -0
- package/dist/src-DcNT2aIK.mjs +49 -0
- package/dist/themeDefault-B-QjpGEO.cjs +16 -0
- package/dist/themeDefault-CjXaY3ok.mjs +11 -0
- package/dist/themes-D1SAp3SL.d.mts +500 -0
- package/dist/themes-D81JYbqm.d.cts +500 -0
- package/dist/themes.cjs +318 -0
- package/dist/themes.d.cts +3 -0
- package/dist/themes.d.mts +3 -0
- package/dist/themes.mjs +303 -0
- package/dist/useDefaultProps-Cb-5FNok.cjs +19 -0
- package/dist/useDefaultProps-CoApb4KT.mjs +14 -0
- package/dist/useTableSort--XMWjujs.d.cts +51 -0
- package/dist/useTableSort-CpDs4cGq.d.mts +51 -0
- package/dist/utils/styleCache.cjs +7 -0
- package/dist/utils/styleCache.d.cts +3 -0
- package/dist/utils/styleCache.d.mts +4 -0
- package/dist/utils/styleCache.mjs +5 -0
- package/dist/utils.cjs +65 -0
- package/dist/utils.d.cts +39 -0
- package/dist/utils.d.mts +39 -0
- package/dist/utils.mjs +58 -0
- package/package.json +125 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { d as styled } from "./src-DcNT2aIK.mjs";
|
|
2
|
+
import { useEffect, useRef } from "react";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
//#region src/FocusTrap/FocusTrap.tsx
|
|
5
|
+
const FocusTrapRoot = styled("div", {
|
|
6
|
+
name: "FocusTrap",
|
|
7
|
+
label: "FocusTrap"
|
|
8
|
+
})({ outline: "none" });
|
|
9
|
+
const FOCUSABLE_SELECTOR = [
|
|
10
|
+
"a[href]",
|
|
11
|
+
"button:not([disabled])",
|
|
12
|
+
"textarea:not([disabled])",
|
|
13
|
+
"input:not([disabled])",
|
|
14
|
+
"select:not([disabled])",
|
|
15
|
+
"[tabindex]:not([tabindex=\"-1\"])"
|
|
16
|
+
].join(",");
|
|
17
|
+
function getFocusable(node) {
|
|
18
|
+
return Array.from(node.querySelectorAll(FOCUSABLE_SELECTOR)).filter((element) => element.tabIndex >= 0);
|
|
19
|
+
}
|
|
20
|
+
/** Move focus to the first focusable descendant, or the node itself when there is none. */
|
|
21
|
+
function focusFirst(node) {
|
|
22
|
+
const [first] = getFocusable(node);
|
|
23
|
+
(first ?? node).focus();
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* @description Keeps keyboard focus within its children while active. Moves focus
|
|
27
|
+
* in on activation, cycles Tab / Shift+Tab at the boundaries, pulls focus back when
|
|
28
|
+
* it escapes, and restores focus to the previously focused element on deactivation.
|
|
29
|
+
*/
|
|
30
|
+
function FocusTrap({ children, isEnabled = true, shouldAutoFocus = true, shouldTrapFocus = true, shouldEnforceFocus = true, shouldRestoreFocus = true }) {
|
|
31
|
+
const rootRef = useRef(null);
|
|
32
|
+
const previouslyFocused = useRef(null);
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
if (!isEnabled) return;
|
|
35
|
+
const node = rootRef.current;
|
|
36
|
+
const doc = node.ownerDocument;
|
|
37
|
+
previouslyFocused.current = doc.activeElement;
|
|
38
|
+
if (shouldAutoFocus) focusFirst(node);
|
|
39
|
+
const handleFocusIn = (event) => {
|
|
40
|
+
if (!node.contains(event.target)) focusFirst(node);
|
|
41
|
+
};
|
|
42
|
+
if (shouldEnforceFocus) doc.addEventListener("focusin", handleFocusIn);
|
|
43
|
+
const handleKeyDown = (event) => {
|
|
44
|
+
if (!shouldTrapFocus || event.key !== "Tab") return;
|
|
45
|
+
const focusable = getFocusable(node);
|
|
46
|
+
if (focusable.length === 0) {
|
|
47
|
+
event.preventDefault();
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const first = focusable[0];
|
|
51
|
+
const last = focusable.at(-1);
|
|
52
|
+
const active = doc.activeElement;
|
|
53
|
+
if (event.shiftKey && active === first) {
|
|
54
|
+
event.preventDefault();
|
|
55
|
+
last.focus();
|
|
56
|
+
} else if (!event.shiftKey && active === last) {
|
|
57
|
+
event.preventDefault();
|
|
58
|
+
first.focus();
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
node.addEventListener("keydown", handleKeyDown);
|
|
62
|
+
return () => {
|
|
63
|
+
doc.removeEventListener("focusin", handleFocusIn);
|
|
64
|
+
node.removeEventListener("keydown", handleKeyDown);
|
|
65
|
+
if (shouldRestoreFocus) previouslyFocused.current.focus();
|
|
66
|
+
};
|
|
67
|
+
}, [
|
|
68
|
+
isEnabled,
|
|
69
|
+
shouldAutoFocus,
|
|
70
|
+
shouldEnforceFocus,
|
|
71
|
+
shouldRestoreFocus,
|
|
72
|
+
shouldTrapFocus
|
|
73
|
+
]);
|
|
74
|
+
return /* @__PURE__ */ jsx(FocusTrapRoot, {
|
|
75
|
+
ref: rootRef,
|
|
76
|
+
tabIndex: -1,
|
|
77
|
+
children
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
//#endregion
|
|
81
|
+
export { FocusTrap };
|
package/dist/Form.cjs
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_src = require("./src-BiocWFSR.cjs");
|
|
3
|
+
const require_FormContext = require("./FormContext-CRmRgDgu.cjs");
|
|
4
|
+
require("@emotion/react");
|
|
5
|
+
let react = require("react");
|
|
6
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
7
|
+
//#region src/Form/Form.tsx
|
|
8
|
+
const FormRoot = require_src.styled("form", {
|
|
9
|
+
name: "Form",
|
|
10
|
+
label: "Form"
|
|
11
|
+
})();
|
|
12
|
+
/**
|
|
13
|
+
* Renders a `<form>` and provides form-wide defaults via FormContext — the lowest
|
|
14
|
+
* priority in the override chain (FormControl and explicit control props win).
|
|
15
|
+
*/
|
|
16
|
+
function Form({ children, onSubmit, size, color, textColor, disabled, fullWidth, id, className, noValidate, "data-testid": dataTestid }) {
|
|
17
|
+
const value = (0, react.useMemo)(() => ({
|
|
18
|
+
size,
|
|
19
|
+
color,
|
|
20
|
+
textColor,
|
|
21
|
+
disabled,
|
|
22
|
+
fullWidth
|
|
23
|
+
}), [
|
|
24
|
+
size,
|
|
25
|
+
color,
|
|
26
|
+
textColor,
|
|
27
|
+
disabled,
|
|
28
|
+
fullWidth
|
|
29
|
+
]);
|
|
30
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_FormContext.FormContext.Provider, {
|
|
31
|
+
value,
|
|
32
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FormRoot, {
|
|
33
|
+
id,
|
|
34
|
+
className,
|
|
35
|
+
noValidate,
|
|
36
|
+
onSubmit,
|
|
37
|
+
"data-testid": dataTestid,
|
|
38
|
+
children
|
|
39
|
+
})
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
//#endregion
|
|
43
|
+
exports.Form = Form;
|
|
44
|
+
exports.FormContext = require_FormContext.FormContext;
|
package/dist/Form.d.cts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Theme } from "@emotion/react";
|
|
2
|
+
import { ReactNode, SyntheticEvent } from "react";
|
|
3
|
+
//#region src/Form/Form.d.ts
|
|
4
|
+
interface FormProps {
|
|
5
|
+
children: ReactNode;
|
|
6
|
+
onSubmit?: (event: SyntheticEvent<HTMLFormElement>) => void;
|
|
7
|
+
/** Default control size for every field — overridable per FormControl/control. */
|
|
8
|
+
size?: keyof Theme['sizes'];
|
|
9
|
+
/** Default accent color for every field. */
|
|
10
|
+
color?: keyof Theme['palette'];
|
|
11
|
+
/** Default text color for every field's label/helper/input — resolves against `theme.text`. */
|
|
12
|
+
textColor?: keyof Theme['text'];
|
|
13
|
+
/** Disables every field. */
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
/** Stretches every field to fill its container. */
|
|
16
|
+
fullWidth?: boolean;
|
|
17
|
+
id?: string;
|
|
18
|
+
className?: string;
|
|
19
|
+
/** Skips native browser validation so field-level validation owns the UX. */
|
|
20
|
+
noValidate?: boolean;
|
|
21
|
+
'data-testid'?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Renders a `<form>` and provides form-wide defaults via FormContext — the lowest
|
|
25
|
+
* priority in the override chain (FormControl and explicit control props win).
|
|
26
|
+
*/
|
|
27
|
+
declare function Form({ children, onSubmit, size, color, textColor, disabled, fullWidth, id, className, noValidate, 'data-testid': dataTestid }: Readonly<FormProps>): import("react").JSX.Element;
|
|
28
|
+
//#endregion
|
|
29
|
+
//#region src/Form/FormContext.d.ts
|
|
30
|
+
/** Form-wide defaults, lowest priority in the override chain (overridden by FormControl, then explicit props). */
|
|
31
|
+
interface FormContextValue {
|
|
32
|
+
size?: keyof Theme['sizes'];
|
|
33
|
+
color?: keyof Theme['palette'];
|
|
34
|
+
/** Text color for label/helper/input content — resolves against `theme.text`. */
|
|
35
|
+
textColor?: keyof Theme['text'];
|
|
36
|
+
disabled?: boolean;
|
|
37
|
+
fullWidth?: boolean;
|
|
38
|
+
}
|
|
39
|
+
declare const FormContext: import("react").Context<FormContextValue>;
|
|
40
|
+
//#endregion
|
|
41
|
+
export { Form, FormContext, FormContextValue, FormProps };
|
package/dist/Form.d.mts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Theme } from "@emotion/react";
|
|
2
|
+
import { ReactNode, SyntheticEvent } from "react";
|
|
3
|
+
//#region src/Form/Form.d.ts
|
|
4
|
+
interface FormProps {
|
|
5
|
+
children: ReactNode;
|
|
6
|
+
onSubmit?: (event: SyntheticEvent<HTMLFormElement>) => void;
|
|
7
|
+
/** Default control size for every field — overridable per FormControl/control. */
|
|
8
|
+
size?: keyof Theme['sizes'];
|
|
9
|
+
/** Default accent color for every field. */
|
|
10
|
+
color?: keyof Theme['palette'];
|
|
11
|
+
/** Default text color for every field's label/helper/input — resolves against `theme.text`. */
|
|
12
|
+
textColor?: keyof Theme['text'];
|
|
13
|
+
/** Disables every field. */
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
/** Stretches every field to fill its container. */
|
|
16
|
+
fullWidth?: boolean;
|
|
17
|
+
id?: string;
|
|
18
|
+
className?: string;
|
|
19
|
+
/** Skips native browser validation so field-level validation owns the UX. */
|
|
20
|
+
noValidate?: boolean;
|
|
21
|
+
'data-testid'?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Renders a `<form>` and provides form-wide defaults via FormContext — the lowest
|
|
25
|
+
* priority in the override chain (FormControl and explicit control props win).
|
|
26
|
+
*/
|
|
27
|
+
declare function Form({ children, onSubmit, size, color, textColor, disabled, fullWidth, id, className, noValidate, 'data-testid': dataTestid }: Readonly<FormProps>): import("react").JSX.Element;
|
|
28
|
+
//#endregion
|
|
29
|
+
//#region src/Form/FormContext.d.ts
|
|
30
|
+
/** Form-wide defaults, lowest priority in the override chain (overridden by FormControl, then explicit props). */
|
|
31
|
+
interface FormContextValue {
|
|
32
|
+
size?: keyof Theme['sizes'];
|
|
33
|
+
color?: keyof Theme['palette'];
|
|
34
|
+
/** Text color for label/helper/input content — resolves against `theme.text`. */
|
|
35
|
+
textColor?: keyof Theme['text'];
|
|
36
|
+
disabled?: boolean;
|
|
37
|
+
fullWidth?: boolean;
|
|
38
|
+
}
|
|
39
|
+
declare const FormContext: import("react").Context<FormContextValue>;
|
|
40
|
+
//#endregion
|
|
41
|
+
export { Form, FormContext, FormContextValue, FormProps };
|
package/dist/Form.mjs
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { d as styled } from "./src-DcNT2aIK.mjs";
|
|
2
|
+
import { t as FormContext } from "./FormContext-_G3sxJyQ.mjs";
|
|
3
|
+
import "@emotion/react";
|
|
4
|
+
import { useMemo } from "react";
|
|
5
|
+
import { jsx } from "react/jsx-runtime";
|
|
6
|
+
//#region src/Form/Form.tsx
|
|
7
|
+
const FormRoot = styled("form", {
|
|
8
|
+
name: "Form",
|
|
9
|
+
label: "Form"
|
|
10
|
+
})();
|
|
11
|
+
/**
|
|
12
|
+
* Renders a `<form>` and provides form-wide defaults via FormContext — the lowest
|
|
13
|
+
* priority in the override chain (FormControl and explicit control props win).
|
|
14
|
+
*/
|
|
15
|
+
function Form({ children, onSubmit, size, color, textColor, disabled, fullWidth, id, className, noValidate, "data-testid": dataTestid }) {
|
|
16
|
+
const value = useMemo(() => ({
|
|
17
|
+
size,
|
|
18
|
+
color,
|
|
19
|
+
textColor,
|
|
20
|
+
disabled,
|
|
21
|
+
fullWidth
|
|
22
|
+
}), [
|
|
23
|
+
size,
|
|
24
|
+
color,
|
|
25
|
+
textColor,
|
|
26
|
+
disabled,
|
|
27
|
+
fullWidth
|
|
28
|
+
]);
|
|
29
|
+
return /* @__PURE__ */ jsx(FormContext.Provider, {
|
|
30
|
+
value,
|
|
31
|
+
children: /* @__PURE__ */ jsx(FormRoot, {
|
|
32
|
+
id,
|
|
33
|
+
className,
|
|
34
|
+
noValidate,
|
|
35
|
+
onSubmit,
|
|
36
|
+
"data-testid": dataTestid,
|
|
37
|
+
children
|
|
38
|
+
})
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//#endregion
|
|
42
|
+
export { Form, FormContext };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
require("@emotion/react");
|
|
2
|
+
//#region src/Form/FormContext.ts
|
|
3
|
+
const FormContext = (0, require("react").createContext)({});
|
|
4
|
+
//#endregion
|
|
5
|
+
Object.defineProperty(exports, "FormContext", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return FormContext;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_src = require("./src-BiocWFSR.cjs");
|
|
3
|
+
const require_themeDefault = require("./themeDefault-B-QjpGEO.cjs");
|
|
4
|
+
const require_View = require("./View.cjs");
|
|
5
|
+
const require_FormControlContext = require("./FormControlContext-aeKTjRKY.cjs");
|
|
6
|
+
const require_FormContext = require("./FormContext-CRmRgDgu.cjs");
|
|
7
|
+
let _emotion_react = require("@emotion/react");
|
|
8
|
+
let react = require("react");
|
|
9
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
10
|
+
//#region src/FormControl/FormControl.tsx
|
|
11
|
+
const FormControlRoot = require_src.styled(require_View.View, {
|
|
12
|
+
name: "FormControl",
|
|
13
|
+
label: "FormControl"
|
|
14
|
+
})();
|
|
15
|
+
/**
|
|
16
|
+
* Groups a label, control, and helper text and shares their state via context.
|
|
17
|
+
* Works standalone (no parent Form) and auto-generates the id wiring so
|
|
18
|
+
* `htmlFor` / `aria-describedby` link without manual coordination.
|
|
19
|
+
*/
|
|
20
|
+
function FormControl({ children, id, error, disabled, required, size, fullWidth, color, textColor, ...viewProps }) {
|
|
21
|
+
const generatedId = (0, react.useId)();
|
|
22
|
+
const resolvedId = id ?? generatedId;
|
|
23
|
+
const helperId = `${resolvedId}-helper`;
|
|
24
|
+
const [hasHelperText, setHasHelperText] = (0, react.useState)(false);
|
|
25
|
+
const value = (0, react.useMemo)(() => ({
|
|
26
|
+
id: resolvedId,
|
|
27
|
+
helperId,
|
|
28
|
+
error,
|
|
29
|
+
disabled,
|
|
30
|
+
required,
|
|
31
|
+
size,
|
|
32
|
+
fullWidth,
|
|
33
|
+
color,
|
|
34
|
+
textColor,
|
|
35
|
+
hasHelperText,
|
|
36
|
+
setHasHelperText
|
|
37
|
+
}), [
|
|
38
|
+
resolvedId,
|
|
39
|
+
helperId,
|
|
40
|
+
error,
|
|
41
|
+
disabled,
|
|
42
|
+
required,
|
|
43
|
+
size,
|
|
44
|
+
fullWidth,
|
|
45
|
+
color,
|
|
46
|
+
textColor,
|
|
47
|
+
hasHelperText
|
|
48
|
+
]);
|
|
49
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_FormControlContext.FormControlContext.Provider, {
|
|
50
|
+
value,
|
|
51
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FormControlRoot, {
|
|
52
|
+
width: fullWidth ? "100%" : void 0,
|
|
53
|
+
...viewProps,
|
|
54
|
+
children
|
|
55
|
+
})
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//#endregion
|
|
59
|
+
//#region src/FormControl/useFormControl.ts
|
|
60
|
+
/**
|
|
61
|
+
* Merges a control's explicit props with FormControl and Form context.
|
|
62
|
+
* Priority: explicit prop → FormControl → Form → default.
|
|
63
|
+
* `error` and `required` are field-only and never read from Form.
|
|
64
|
+
*/
|
|
65
|
+
function useFormControl(overrides = {}) {
|
|
66
|
+
const form = (0, react.useContext)(require_FormContext.FormContext);
|
|
67
|
+
const control = (0, react.useContext)(require_FormControlContext.FormControlContext);
|
|
68
|
+
const theme = (0, _emotion_react.useTheme)();
|
|
69
|
+
return {
|
|
70
|
+
id: overrides.id ?? control?.id,
|
|
71
|
+
error: overrides.error ?? control?.error ?? false,
|
|
72
|
+
disabled: overrides.disabled ?? control?.disabled ?? form.disabled ?? false,
|
|
73
|
+
required: overrides.required ?? control?.required ?? false,
|
|
74
|
+
size: overrides.size ?? control?.size ?? form.size ?? require_themeDefault.themeDefault(theme, "size", "md"),
|
|
75
|
+
fullWidth: overrides.fullWidth ?? control?.fullWidth ?? form.fullWidth ?? false,
|
|
76
|
+
color: overrides.color ?? control?.color ?? form.color,
|
|
77
|
+
textColor: overrides.textColor ?? control?.textColor ?? form.textColor,
|
|
78
|
+
"aria-describedby": control?.hasHelperText ? control.helperId : void 0
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//#endregion
|
|
82
|
+
exports.FormControl = FormControl;
|
|
83
|
+
exports.FormControlContext = require_FormControlContext.FormControlContext;
|
|
84
|
+
exports.useFormControl = useFormControl;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { s as ViewProps } from "./index-FwTocqhP.cjs";
|
|
2
|
+
import { Theme } from "@emotion/react";
|
|
3
|
+
import { ReactNode } from "react";
|
|
4
|
+
//#region src/FormControl/FormControl.d.ts
|
|
5
|
+
interface FormControlProps extends Omit<ViewProps, 'color'> {
|
|
6
|
+
children: ReactNode;
|
|
7
|
+
/** Field id — auto-generated via `useId()` when omitted. Links FormLabel, control, and helper text. */
|
|
8
|
+
id?: string;
|
|
9
|
+
error?: boolean;
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
required?: boolean;
|
|
12
|
+
size?: keyof Theme['sizes'];
|
|
13
|
+
fullWidth?: boolean;
|
|
14
|
+
color?: keyof Theme['palette'];
|
|
15
|
+
textColor?: keyof Theme['text'];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Groups a label, control, and helper text and shares their state via context.
|
|
19
|
+
* Works standalone (no parent Form) and auto-generates the id wiring so
|
|
20
|
+
* `htmlFor` / `aria-describedby` link without manual coordination.
|
|
21
|
+
*/
|
|
22
|
+
declare function FormControl({ children, id, error, disabled, required, size, fullWidth, color, textColor, ...viewProps }: Readonly<FormControlProps>): import("react").JSX.Element;
|
|
23
|
+
//#endregion
|
|
24
|
+
//#region src/FormControl/FormControlContext.d.ts
|
|
25
|
+
/** Per-field state, middle priority in the override chain (overrides Form, overridden by explicit props). */
|
|
26
|
+
interface FormControlContextValue {
|
|
27
|
+
/** Field id — links FormLabel `htmlFor` and the control. Auto-generated by FormControl when not provided. */
|
|
28
|
+
id: string;
|
|
29
|
+
/** Id of the helper/error text node, used for `aria-describedby`. */
|
|
30
|
+
helperId: string;
|
|
31
|
+
error?: boolean;
|
|
32
|
+
disabled?: boolean;
|
|
33
|
+
required?: boolean;
|
|
34
|
+
size?: keyof Theme['sizes'];
|
|
35
|
+
fullWidth?: boolean;
|
|
36
|
+
color?: keyof Theme['palette'];
|
|
37
|
+
/** Text color for label/helper/input content — resolves against `theme.text`. */
|
|
38
|
+
textColor?: keyof Theme['text'];
|
|
39
|
+
/** Whether a FormHelperText is currently rendered — drives `aria-describedby` on the control. */
|
|
40
|
+
hasHelperText: boolean;
|
|
41
|
+
/** Stable setter FormHelperText calls to register/unregister its presence. */
|
|
42
|
+
setHasHelperText: (present: boolean) => void;
|
|
43
|
+
}
|
|
44
|
+
declare const FormControlContext: import("react").Context<FormControlContextValue | null>;
|
|
45
|
+
//#endregion
|
|
46
|
+
//#region src/FormControl/useFormControl.d.ts
|
|
47
|
+
/** Explicit props a control passes in — always win over context when defined. */
|
|
48
|
+
interface FormControlOverrides {
|
|
49
|
+
id?: string;
|
|
50
|
+
error?: boolean;
|
|
51
|
+
disabled?: boolean;
|
|
52
|
+
required?: boolean;
|
|
53
|
+
size?: keyof Theme['sizes'];
|
|
54
|
+
fullWidth?: boolean;
|
|
55
|
+
color?: keyof Theme['palette'];
|
|
56
|
+
textColor?: keyof Theme['text'];
|
|
57
|
+
}
|
|
58
|
+
/** Resolved field state. Uniform defaults (`size`, the booleans) are applied here; `color`/`textColor` are left for each control to default since their domains differ. */
|
|
59
|
+
interface ResolvedFormControl {
|
|
60
|
+
id?: string;
|
|
61
|
+
error: boolean;
|
|
62
|
+
disabled: boolean;
|
|
63
|
+
required: boolean;
|
|
64
|
+
size: keyof Theme['sizes'];
|
|
65
|
+
fullWidth: boolean;
|
|
66
|
+
color?: keyof Theme['palette'];
|
|
67
|
+
textColor?: keyof Theme['text'];
|
|
68
|
+
/** Points at the helper text id only while one is rendered — avoids a dangling reference. */
|
|
69
|
+
'aria-describedby'?: string;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Merges a control's explicit props with FormControl and Form context.
|
|
73
|
+
* Priority: explicit prop → FormControl → Form → default.
|
|
74
|
+
* `error` and `required` are field-only and never read from Form.
|
|
75
|
+
*/
|
|
76
|
+
declare function useFormControl(overrides?: FormControlOverrides): ResolvedFormControl;
|
|
77
|
+
//#endregion
|
|
78
|
+
export { FormControl, FormControlContext, FormControlContextValue, FormControlOverrides, FormControlProps, ResolvedFormControl, useFormControl };
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { s as ViewProps } from "./index-pX7tBQdJ.mjs";
|
|
2
|
+
import { Theme } from "@emotion/react";
|
|
3
|
+
import { ReactNode } from "react";
|
|
4
|
+
//#region src/FormControl/FormControl.d.ts
|
|
5
|
+
interface FormControlProps extends Omit<ViewProps, 'color'> {
|
|
6
|
+
children: ReactNode;
|
|
7
|
+
/** Field id — auto-generated via `useId()` when omitted. Links FormLabel, control, and helper text. */
|
|
8
|
+
id?: string;
|
|
9
|
+
error?: boolean;
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
required?: boolean;
|
|
12
|
+
size?: keyof Theme['sizes'];
|
|
13
|
+
fullWidth?: boolean;
|
|
14
|
+
color?: keyof Theme['palette'];
|
|
15
|
+
textColor?: keyof Theme['text'];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Groups a label, control, and helper text and shares their state via context.
|
|
19
|
+
* Works standalone (no parent Form) and auto-generates the id wiring so
|
|
20
|
+
* `htmlFor` / `aria-describedby` link without manual coordination.
|
|
21
|
+
*/
|
|
22
|
+
declare function FormControl({ children, id, error, disabled, required, size, fullWidth, color, textColor, ...viewProps }: Readonly<FormControlProps>): import("react").JSX.Element;
|
|
23
|
+
//#endregion
|
|
24
|
+
//#region src/FormControl/FormControlContext.d.ts
|
|
25
|
+
/** Per-field state, middle priority in the override chain (overrides Form, overridden by explicit props). */
|
|
26
|
+
interface FormControlContextValue {
|
|
27
|
+
/** Field id — links FormLabel `htmlFor` and the control. Auto-generated by FormControl when not provided. */
|
|
28
|
+
id: string;
|
|
29
|
+
/** Id of the helper/error text node, used for `aria-describedby`. */
|
|
30
|
+
helperId: string;
|
|
31
|
+
error?: boolean;
|
|
32
|
+
disabled?: boolean;
|
|
33
|
+
required?: boolean;
|
|
34
|
+
size?: keyof Theme['sizes'];
|
|
35
|
+
fullWidth?: boolean;
|
|
36
|
+
color?: keyof Theme['palette'];
|
|
37
|
+
/** Text color for label/helper/input content — resolves against `theme.text`. */
|
|
38
|
+
textColor?: keyof Theme['text'];
|
|
39
|
+
/** Whether a FormHelperText is currently rendered — drives `aria-describedby` on the control. */
|
|
40
|
+
hasHelperText: boolean;
|
|
41
|
+
/** Stable setter FormHelperText calls to register/unregister its presence. */
|
|
42
|
+
setHasHelperText: (present: boolean) => void;
|
|
43
|
+
}
|
|
44
|
+
declare const FormControlContext: import("react").Context<FormControlContextValue | null>;
|
|
45
|
+
//#endregion
|
|
46
|
+
//#region src/FormControl/useFormControl.d.ts
|
|
47
|
+
/** Explicit props a control passes in — always win over context when defined. */
|
|
48
|
+
interface FormControlOverrides {
|
|
49
|
+
id?: string;
|
|
50
|
+
error?: boolean;
|
|
51
|
+
disabled?: boolean;
|
|
52
|
+
required?: boolean;
|
|
53
|
+
size?: keyof Theme['sizes'];
|
|
54
|
+
fullWidth?: boolean;
|
|
55
|
+
color?: keyof Theme['palette'];
|
|
56
|
+
textColor?: keyof Theme['text'];
|
|
57
|
+
}
|
|
58
|
+
/** Resolved field state. Uniform defaults (`size`, the booleans) are applied here; `color`/`textColor` are left for each control to default since their domains differ. */
|
|
59
|
+
interface ResolvedFormControl {
|
|
60
|
+
id?: string;
|
|
61
|
+
error: boolean;
|
|
62
|
+
disabled: boolean;
|
|
63
|
+
required: boolean;
|
|
64
|
+
size: keyof Theme['sizes'];
|
|
65
|
+
fullWidth: boolean;
|
|
66
|
+
color?: keyof Theme['palette'];
|
|
67
|
+
textColor?: keyof Theme['text'];
|
|
68
|
+
/** Points at the helper text id only while one is rendered — avoids a dangling reference. */
|
|
69
|
+
'aria-describedby'?: string;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Merges a control's explicit props with FormControl and Form context.
|
|
73
|
+
* Priority: explicit prop → FormControl → Form → default.
|
|
74
|
+
* `error` and `required` are field-only and never read from Form.
|
|
75
|
+
*/
|
|
76
|
+
declare function useFormControl(overrides?: FormControlOverrides): ResolvedFormControl;
|
|
77
|
+
//#endregion
|
|
78
|
+
export { FormControl, FormControlContext, FormControlContextValue, FormControlOverrides, FormControlProps, ResolvedFormControl, useFormControl };
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { d as styled, u as useTheme } from "./src-DcNT2aIK.mjs";
|
|
2
|
+
import { t as themeDefault } from "./themeDefault-CjXaY3ok.mjs";
|
|
3
|
+
import { View } from "./View.mjs";
|
|
4
|
+
import { t as FormControlContext } from "./FormControlContext-CyxdOxdN.mjs";
|
|
5
|
+
import { t as FormContext } from "./FormContext-_G3sxJyQ.mjs";
|
|
6
|
+
import "@emotion/react";
|
|
7
|
+
import { useContext, useId, useMemo, useState } from "react";
|
|
8
|
+
import { jsx } from "react/jsx-runtime";
|
|
9
|
+
//#region src/FormControl/FormControl.tsx
|
|
10
|
+
const FormControlRoot = styled(View, {
|
|
11
|
+
name: "FormControl",
|
|
12
|
+
label: "FormControl"
|
|
13
|
+
})();
|
|
14
|
+
/**
|
|
15
|
+
* Groups a label, control, and helper text and shares their state via context.
|
|
16
|
+
* Works standalone (no parent Form) and auto-generates the id wiring so
|
|
17
|
+
* `htmlFor` / `aria-describedby` link without manual coordination.
|
|
18
|
+
*/
|
|
19
|
+
function FormControl({ children, id, error, disabled, required, size, fullWidth, color, textColor, ...viewProps }) {
|
|
20
|
+
const generatedId = useId();
|
|
21
|
+
const resolvedId = id ?? generatedId;
|
|
22
|
+
const helperId = `${resolvedId}-helper`;
|
|
23
|
+
const [hasHelperText, setHasHelperText] = useState(false);
|
|
24
|
+
const value = useMemo(() => ({
|
|
25
|
+
id: resolvedId,
|
|
26
|
+
helperId,
|
|
27
|
+
error,
|
|
28
|
+
disabled,
|
|
29
|
+
required,
|
|
30
|
+
size,
|
|
31
|
+
fullWidth,
|
|
32
|
+
color,
|
|
33
|
+
textColor,
|
|
34
|
+
hasHelperText,
|
|
35
|
+
setHasHelperText
|
|
36
|
+
}), [
|
|
37
|
+
resolvedId,
|
|
38
|
+
helperId,
|
|
39
|
+
error,
|
|
40
|
+
disabled,
|
|
41
|
+
required,
|
|
42
|
+
size,
|
|
43
|
+
fullWidth,
|
|
44
|
+
color,
|
|
45
|
+
textColor,
|
|
46
|
+
hasHelperText
|
|
47
|
+
]);
|
|
48
|
+
return /* @__PURE__ */ jsx(FormControlContext.Provider, {
|
|
49
|
+
value,
|
|
50
|
+
children: /* @__PURE__ */ jsx(FormControlRoot, {
|
|
51
|
+
width: fullWidth ? "100%" : void 0,
|
|
52
|
+
...viewProps,
|
|
53
|
+
children
|
|
54
|
+
})
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//#endregion
|
|
58
|
+
//#region src/FormControl/useFormControl.ts
|
|
59
|
+
/**
|
|
60
|
+
* Merges a control's explicit props with FormControl and Form context.
|
|
61
|
+
* Priority: explicit prop → FormControl → Form → default.
|
|
62
|
+
* `error` and `required` are field-only and never read from Form.
|
|
63
|
+
*/
|
|
64
|
+
function useFormControl(overrides = {}) {
|
|
65
|
+
const form = useContext(FormContext);
|
|
66
|
+
const control = useContext(FormControlContext);
|
|
67
|
+
const theme = useTheme();
|
|
68
|
+
return {
|
|
69
|
+
id: overrides.id ?? control?.id,
|
|
70
|
+
error: overrides.error ?? control?.error ?? false,
|
|
71
|
+
disabled: overrides.disabled ?? control?.disabled ?? form.disabled ?? false,
|
|
72
|
+
required: overrides.required ?? control?.required ?? false,
|
|
73
|
+
size: overrides.size ?? control?.size ?? form.size ?? themeDefault(theme, "size", "md"),
|
|
74
|
+
fullWidth: overrides.fullWidth ?? control?.fullWidth ?? form.fullWidth ?? false,
|
|
75
|
+
color: overrides.color ?? control?.color ?? form.color,
|
|
76
|
+
textColor: overrides.textColor ?? control?.textColor ?? form.textColor,
|
|
77
|
+
"aria-describedby": control?.hasHelperText ? control.helperId : void 0
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
//#endregion
|
|
81
|
+
export { FormControl, FormControlContext, useFormControl };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
require("@emotion/react");
|
|
2
|
+
//#region src/FormControl/FormControlContext.ts
|
|
3
|
+
const FormControlContext = (0, require("react").createContext)(null);
|
|
4
|
+
//#endregion
|
|
5
|
+
Object.defineProperty(exports, "FormControlContext", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return FormControlContext;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_src = require("./src-BiocWFSR.cjs");
|
|
3
|
+
const require_Typography = require("./Typography.cjs");
|
|
4
|
+
const require_FormControlContext = require("./FormControlContext-aeKTjRKY.cjs");
|
|
5
|
+
const require_FormContext = require("./FormContext-CRmRgDgu.cjs");
|
|
6
|
+
let react = require("react");
|
|
7
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
8
|
+
//#region src/FormHelperText/FormHelperText.tsx
|
|
9
|
+
const FormHelperTextRoot = require_src.styled(require_Typography.Typography, {
|
|
10
|
+
name: "FormHelperText",
|
|
11
|
+
label: "FormHelperText"
|
|
12
|
+
})();
|
|
13
|
+
/**
|
|
14
|
+
* Helper or error text for a field. Reads its id and error state from
|
|
15
|
+
* FormControl context and registers its presence so the control can point
|
|
16
|
+
* `aria-describedby` at it only while it is rendered.
|
|
17
|
+
*/
|
|
18
|
+
function FormHelperText({ children, error, id, role, color, ...rest }) {
|
|
19
|
+
const control = (0, react.useContext)(require_FormControlContext.FormControlContext);
|
|
20
|
+
const form = (0, react.useContext)(require_FormContext.FormContext);
|
|
21
|
+
const isError = error ?? control?.error ?? false;
|
|
22
|
+
const resolvedId = id ?? control?.helperId;
|
|
23
|
+
const resolvedColor = isError ? "error" : color ?? control?.textColor ?? form.textColor ?? "secondary";
|
|
24
|
+
const setHasHelperText = control?.setHasHelperText;
|
|
25
|
+
(0, react.useEffect)(() => {
|
|
26
|
+
setHasHelperText?.(true);
|
|
27
|
+
return () => setHasHelperText?.(false);
|
|
28
|
+
}, [setHasHelperText]);
|
|
29
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FormHelperTextRoot, {
|
|
30
|
+
as: "p",
|
|
31
|
+
id: resolvedId,
|
|
32
|
+
variant: "caption",
|
|
33
|
+
role: isError ? "alert" : role,
|
|
34
|
+
...rest,
|
|
35
|
+
color: resolvedColor,
|
|
36
|
+
children
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
//#endregion
|
|
40
|
+
exports.FormHelperText = FormHelperText;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { a as TypographyProps } from "./index-CDVnvjIE.cjs";
|
|
2
|
+
import { ReactNode } from "react";
|
|
3
|
+
//#region src/FormHelperText/FormHelperText.d.ts
|
|
4
|
+
interface FormHelperTextProps extends TypographyProps {
|
|
5
|
+
children: ReactNode;
|
|
6
|
+
/** Renders in the error color and announces via `role="alert"`. Falls back to the FormControl `error` value. */
|
|
7
|
+
error?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Helper or error text for a field. Reads its id and error state from
|
|
11
|
+
* FormControl context and registers its presence so the control can point
|
|
12
|
+
* `aria-describedby` at it only while it is rendered.
|
|
13
|
+
*/
|
|
14
|
+
declare function FormHelperText({ children, error, id, role, color, ...rest }: Readonly<FormHelperTextProps>): import("react").JSX.Element;
|
|
15
|
+
//#endregion
|
|
16
|
+
export { FormHelperText, FormHelperTextProps };
|