@bigbinary/neeto-atoms 1.0.7 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ColorPicker-BPvxDGDM.js +276 -0
- package/dist/ColorPicker-BPvxDGDM.js.map +1 -0
- package/dist/{DataTable-Y4POx0WN.js → DataTable-BKe9K5XP.js} +136 -136
- package/dist/DataTable-BKe9K5XP.js.map +1 -0
- package/dist/cjs/ColorPicker-DN8aynGh.js +282 -0
- package/dist/cjs/ColorPicker-DN8aynGh.js.map +1 -0
- package/dist/cjs/{DataTable-DJw2SZ7b.js → DataTable-BQt_mXDX.js} +136 -136
- package/dist/cjs/DataTable-BQt_mXDX.js.map +1 -0
- package/dist/cjs/components/Accordion.js +49 -0
- package/dist/cjs/components/Accordion.js.map +1 -0
- package/dist/cjs/components/Alert.js +101 -0
- package/dist/cjs/components/Alert.js.map +1 -0
- package/dist/cjs/components/Badge.js +71 -0
- package/dist/cjs/components/Badge.js.map +1 -0
- package/dist/cjs/components/Button.js +121 -0
- package/dist/cjs/components/Button.js.map +1 -0
- package/dist/cjs/components/Checkbox.js +44 -0
- package/dist/cjs/components/Checkbox.js.map +1 -0
- package/dist/cjs/components/ColorPicker.js +34 -0
- package/dist/cjs/components/ColorPicker.js.map +1 -0
- package/dist/cjs/components/DataTable.js +3 -3
- package/dist/cjs/components/Dialog.js +88 -0
- package/dist/cjs/components/Dialog.js.map +1 -0
- package/dist/cjs/components/DropdownMenu.js +180 -0
- package/dist/cjs/components/DropdownMenu.js.map +1 -0
- package/dist/cjs/components/Input.js +167 -0
- package/dist/cjs/components/Input.js.map +1 -0
- package/dist/cjs/components/MultiSelect.js +13 -0
- package/dist/cjs/components/MultiSelect.js.map +1 -0
- package/dist/cjs/components/MultiSelectCombobox.js +3 -0
- package/dist/cjs/components/MultiSelectCombobox.js.map +1 -0
- package/dist/cjs/components/MultiSelectDropdown.js +37 -0
- package/dist/cjs/components/MultiSelectDropdown.js.map +1 -0
- package/dist/cjs/components/OptionItem.js +34 -0
- package/dist/cjs/components/OptionItem.js.map +1 -0
- package/dist/cjs/components/Popover.js +123 -0
- package/dist/cjs/components/Popover.js.map +1 -0
- package/dist/cjs/components/RadioGroup.js +63 -0
- package/dist/cjs/components/RadioGroup.js.map +1 -0
- package/dist/cjs/components/Select.js +3 -0
- package/dist/cjs/components/Select.js.map +1 -0
- package/dist/cjs/components/SelectFieldWrapper.js +33 -0
- package/dist/cjs/components/SelectFieldWrapper.js.map +1 -0
- package/dist/cjs/components/SelectOptions.js +43 -0
- package/dist/cjs/components/SelectOptions.js.map +1 -0
- package/dist/cjs/components/SelectTriggerContent.js +43 -0
- package/dist/cjs/components/SelectTriggerContent.js.map +1 -0
- package/dist/cjs/components/Sheet.js +90 -0
- package/dist/cjs/components/Sheet.js.map +1 -0
- package/dist/cjs/components/Switch.js +35 -0
- package/dist/cjs/components/Switch.js.map +1 -0
- package/dist/cjs/components/Tabs.js +74 -0
- package/dist/cjs/components/Tabs.js.map +1 -0
- package/dist/cjs/components/Textarea.js +89 -0
- package/dist/cjs/components/Textarea.js.map +1 -0
- package/dist/cjs/components/Toastr.js +133 -0
- package/dist/cjs/components/Toastr.js.map +1 -0
- package/dist/cjs/components/Tooltip.js +109 -0
- package/dist/cjs/components/Tooltip.js.map +1 -0
- package/dist/cjs/{primitives → components}/Typography.js +6 -6
- package/dist/cjs/components/Typography.js.map +1 -0
- package/dist/cjs/components/shared.js +8 -0
- package/dist/cjs/components/shared.js.map +1 -0
- package/dist/cjs/{dialog-DzNWLbJ6.js → dialog-CF2GBHOG.js} +2 -2
- package/dist/cjs/{dialog-DzNWLbJ6.js.map → dialog-CF2GBHOG.js.map} +1 -1
- package/dist/cjs/{index-DAds6mf_.js → index-BLGrl3PF.js} +31 -31
- package/dist/cjs/{index-DAds6mf_.js.map → index-BLGrl3PF.js.map} +1 -1
- package/dist/cjs/{index-BqCr1H3u.js → index-BiGm7NEA.js} +11 -11
- package/dist/cjs/{index-BqCr1H3u.js.map → index-BiGm7NEA.js.map} +1 -1
- package/dist/cjs/{index-CGet1HH4.js → index-PdtYHwPi.js} +66 -66
- package/dist/cjs/{index-CGet1HH4.js.map → index-PdtYHwPi.js.map} +1 -1
- package/dist/cjs/index-Vlwnyfvs.js +1145 -0
- package/dist/cjs/index-Vlwnyfvs.js.map +1 -0
- package/dist/cjs/{index-DR7GJU4J.js → index-hQmfI1O7.js} +17 -17
- package/dist/cjs/{index-DR7GJU4J.js.map → index-hQmfI1O7.js.map} +1 -1
- package/dist/cjs/index.js +463 -26
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/primitives/Accordion.js +16 -16
- package/dist/cjs/primitives/Accordion.js.map +1 -1
- package/dist/cjs/primitives/AlertDialog.js +1 -1
- package/dist/cjs/primitives/Badge.js +58 -6
- package/dist/cjs/primitives/Badge.js.map +1 -1
- package/dist/cjs/primitives/Chart.js +137 -137
- package/dist/cjs/primitives/Chart.js.map +1 -1
- package/dist/cjs/primitives/Collapsible.js +1 -1
- package/dist/cjs/primitives/Combobox.js +4 -4
- package/dist/cjs/primitives/Combobox.js.map +1 -1
- package/dist/cjs/primitives/Command.js +2 -2
- package/dist/cjs/primitives/ContextMenu.js +2 -2
- package/dist/cjs/primitives/Dialog.js +10 -6
- package/dist/cjs/primitives/Dialog.js.map +1 -1
- package/dist/cjs/primitives/Drawer.js +1 -1
- package/dist/cjs/primitives/DropdownMenu.js +38 -38
- package/dist/cjs/primitives/DropdownMenu.js.map +1 -1
- package/dist/cjs/primitives/HoverCard.js +16 -16
- package/dist/cjs/primitives/Menubar.js +2 -2
- package/dist/cjs/primitives/Popover.js +13 -13
- package/dist/cjs/primitives/RadioGroup.js +27 -26
- package/dist/cjs/primitives/RadioGroup.js.map +1 -1
- package/dist/cjs/primitives/Select.js +77 -77
- package/dist/cjs/primitives/Sheet.js +10 -6
- package/dist/cjs/primitives/Sheet.js.map +1 -1
- package/dist/cjs/primitives/Sidebar.js +3 -3
- package/dist/cjs/primitives/Sonner.js +12 -1138
- package/dist/cjs/primitives/Sonner.js.map +1 -1
- package/dist/cjs/primitives/Switch.js +4 -8
- package/dist/cjs/primitives/Switch.js.map +1 -1
- package/dist/cjs/primitives/Tabs.js +11 -11
- package/dist/cjs/primitives/ToggleGroup.js +1 -1
- package/dist/cjs/primitives/Tooltip.js +1 -1
- package/dist/cjs/primitives/index.js +9 -11
- package/dist/cjs/primitives/index.js.map +1 -1
- package/dist/cjs/renderIcon-fLF3odqg.js +26 -0
- package/dist/cjs/renderIcon-fLF3odqg.js.map +1 -0
- package/dist/cjs/{sheet-nHSYZxAA.js → sheet-CkCrHmVA.js} +2 -2
- package/dist/cjs/{sheet-nHSYZxAA.js.map → sheet-CkCrHmVA.js.map} +1 -1
- package/dist/cjs/{tooltip-CRkOMh1b.js → tooltip-C-568jEL.js} +17 -17
- package/dist/cjs/{tooltip-CRkOMh1b.js.map → tooltip-C-568jEL.js.map} +1 -1
- package/dist/cjs/useCreatableItems-BTHtd7uo.js +100 -0
- package/dist/cjs/useCreatableItems-BTHtd7uo.js.map +1 -0
- package/dist/cjs/{reselect-CeyIIDM-.js → with-selector-u4xTSzCv.js} +111 -111
- package/dist/cjs/with-selector-u4xTSzCv.js.map +1 -0
- package/dist/components/Accordion.d.ts +18 -0
- package/dist/components/Accordion.js +43 -0
- package/dist/components/Accordion.js.map +1 -0
- package/dist/components/Alert.d.ts +51 -0
- package/dist/components/Alert.js +99 -0
- package/dist/components/Alert.js.map +1 -0
- package/dist/components/Badge.d.ts +29 -0
- package/dist/components/Badge.js +69 -0
- package/dist/components/Badge.js.map +1 -0
- package/dist/components/Button.d.ts +47 -0
- package/dist/components/Button.js +119 -0
- package/dist/components/Button.js.map +1 -0
- package/dist/components/Checkbox.d.ts +16 -0
- package/dist/components/Checkbox.js +42 -0
- package/dist/components/Checkbox.js.map +1 -0
- package/dist/components/ColorPicker/ColorPicker.d.ts +4 -0
- package/dist/components/ColorPicker/Palette.d.ts +12 -0
- package/dist/components/ColorPicker/Target.d.ts +15 -0
- package/dist/components/ColorPicker/constants.d.ts +10 -0
- package/dist/components/ColorPicker/hooks/useEyeDropper.d.ts +15 -0
- package/dist/components/ColorPicker/hooks/useRecentlyUsedColors.d.ts +11 -0
- package/dist/components/ColorPicker/index.d.ts +2 -0
- package/dist/components/ColorPicker/types.d.ts +42 -0
- package/dist/components/ColorPicker/utils.d.ts +31 -0
- package/dist/components/ColorPicker.js +28 -0
- package/dist/components/ColorPicker.js.map +1 -0
- package/dist/components/DataTable.js +2 -2
- package/dist/components/Dialog.d.ts +56 -0
- package/dist/components/Dialog.js +86 -0
- package/dist/components/Dialog.js.map +1 -0
- package/dist/components/DropdownMenu/Divider.d.ts +3 -0
- package/dist/components/DropdownMenu/DropdownBase.d.ts +3 -0
- package/dist/components/DropdownMenu/Label.d.ts +7 -0
- package/dist/components/DropdownMenu/Menu.d.ts +7 -0
- package/dist/components/DropdownMenu/MenuItem.d.ts +10 -0
- package/dist/components/DropdownMenu/MenuItemButton.d.ts +4 -0
- package/dist/components/DropdownMenu/SplitTrigger.d.ts +13 -0
- package/dist/components/DropdownMenu/SubMenu.d.ts +10 -0
- package/dist/components/DropdownMenu/TriggerButton.d.ts +10 -0
- package/dist/components/DropdownMenu/constants.d.ts +7 -0
- package/dist/components/DropdownMenu/index.d.ts +16 -0
- package/dist/components/DropdownMenu/types.d.ts +88 -0
- package/dist/components/DropdownMenu.js +178 -0
- package/dist/components/DropdownMenu.js.map +1 -0
- package/dist/components/Input.d.ts +39 -0
- package/dist/components/Input.js +165 -0
- package/dist/components/Input.js.map +1 -0
- package/dist/components/MultiSelect.constants.d.ts +5 -0
- package/dist/components/MultiSelect.d.ts +4 -0
- package/dist/components/MultiSelect.js +4 -0
- package/dist/components/MultiSelect.js.map +1 -0
- package/dist/components/MultiSelect.types.d.ts +121 -0
- package/dist/components/MultiSelect.utils.d.ts +18 -0
- package/dist/components/MultiSelectCombobox.d.ts +3 -0
- package/dist/components/MultiSelectCombobox.js +2 -0
- package/dist/components/MultiSelectCombobox.js.map +1 -0
- package/dist/components/MultiSelectCombobox.types.d.ts +52 -0
- package/dist/components/MultiSelectDropdown.d.ts +9 -0
- package/dist/components/MultiSelectDropdown.js +35 -0
- package/dist/components/MultiSelectDropdown.js.map +1 -0
- package/dist/components/OptionItem.d.ts +9 -0
- package/dist/components/OptionItem.js +32 -0
- package/dist/components/OptionItem.js.map +1 -0
- package/dist/components/Popover.d.ts +47 -0
- package/dist/components/Popover.js +117 -0
- package/dist/components/Popover.js.map +1 -0
- package/dist/components/RadioGroup.d.ts +32 -0
- package/dist/components/RadioGroup.js +61 -0
- package/dist/components/RadioGroup.js.map +1 -0
- package/dist/components/Select.constants.d.ts +5 -0
- package/dist/components/Select.d.ts +4 -0
- package/dist/components/Select.js +2 -0
- package/dist/components/Select.js.map +1 -0
- package/dist/components/Select.types.d.ts +58 -0
- package/dist/components/SelectFieldWrapper.d.ts +18 -0
- package/dist/components/SelectFieldWrapper.js +31 -0
- package/dist/components/SelectFieldWrapper.js.map +1 -0
- package/dist/components/SelectOptions.d.ts +2 -0
- package/dist/components/SelectOptions.js +41 -0
- package/dist/components/SelectOptions.js.map +1 -0
- package/dist/components/SelectTriggerContent.d.ts +18 -0
- package/dist/components/SelectTriggerContent.js +41 -0
- package/dist/components/SelectTriggerContent.js.map +1 -0
- package/dist/components/Sheet.d.ts +54 -0
- package/dist/components/Sheet.js +88 -0
- package/dist/components/Sheet.js.map +1 -0
- package/dist/components/Switch.d.ts +18 -0
- package/dist/components/Switch.js +33 -0
- package/dist/components/Switch.js.map +1 -0
- package/dist/components/Tabs.d.ts +20 -0
- package/dist/components/Tabs.js +72 -0
- package/dist/components/Tabs.js.map +1 -0
- package/dist/components/Textarea.d.ts +36 -0
- package/dist/components/Textarea.js +87 -0
- package/dist/components/Textarea.js.map +1 -0
- package/dist/components/Toastr.d.ts +30 -0
- package/dist/components/Toastr.js +131 -0
- package/dist/components/Toastr.js.map +1 -0
- package/dist/components/Tooltip.d.ts +29 -0
- package/dist/components/Tooltip.js +103 -0
- package/dist/components/Tooltip.js.map +1 -0
- package/dist/{primitives → components}/Typography.d.ts +2 -2
- package/dist/{primitives → components}/Typography.js +6 -6
- package/dist/components/Typography.js.map +1 -0
- package/dist/components/shared.js +6 -0
- package/dist/components/shared.js.map +1 -0
- package/dist/components/shared.types.d.ts +16 -0
- package/dist/{dialog-C97DOTvO.js → dialog-Civ9r6wD.js} +3 -3
- package/dist/{dialog-C97DOTvO.js.map → dialog-Civ9r6wD.js.map} +1 -1
- package/dist/hooks/useAsyncOptions.d.ts +13 -0
- package/dist/hooks/useCreatableItems.d.ts +30 -0
- package/dist/hooks/useLazyLoadSentinel.d.ts +6 -0
- package/dist/hooks/useMultiSelectOptions.d.ts +15 -0
- package/dist/hooks/useMultiSelectState.d.ts +37 -0
- package/dist/hooks/useSelectState.d.ts +27 -0
- package/dist/{index-PF0ms7Xn.js → index-9HvIbmnI.js} +3 -3
- package/dist/{index-PF0ms7Xn.js.map → index-9HvIbmnI.js.map} +1 -1
- package/dist/index-D_roZz8G.js +1137 -0
- package/dist/index-D_roZz8G.js.map +1 -0
- package/dist/{index-BwxI_qgh.js → index-KzJfsx-e.js} +3 -3
- package/dist/{index-BwxI_qgh.js.map → index-KzJfsx-e.js.map} +1 -1
- package/dist/index.css +25 -1
- package/dist/index.d.ts +40 -0
- package/dist/index.js +440 -24
- package/dist/index.js.map +1 -1
- package/dist/{input-group-CDBpz6Pb.js → input-group-ytECR3Hw.js} +2 -2
- package/dist/{input-group-CDBpz6Pb.js.map → input-group-ytECR3Hw.js.map} +1 -1
- package/dist/lib/renderIcon.d.ts +5 -0
- package/dist/primitives/Accordion.js +1 -1
- package/dist/primitives/AlertDialog.js +1 -1
- package/dist/primitives/Badge.d.ts +13 -3
- package/dist/primitives/Badge.js +54 -2
- package/dist/primitives/Badge.js.map +1 -1
- package/dist/primitives/Chart.js +1 -1
- package/dist/primitives/Combobox.js +3 -3
- package/dist/primitives/Command.js +3 -3
- package/dist/primitives/ContextMenu.js +1 -1
- package/dist/primitives/Dialog.d.ts +11 -3
- package/dist/primitives/Dialog.js +11 -7
- package/dist/primitives/Dialog.js.map +1 -1
- package/dist/primitives/Drawer.js +1 -1
- package/dist/primitives/DropdownMenu.js +2 -2
- package/dist/primitives/InputGroup.js +1 -1
- package/dist/primitives/Menubar.js +1 -1
- package/dist/primitives/RadioGroup.d.ts +8 -3
- package/dist/primitives/RadioGroup.js +9 -8
- package/dist/primitives/RadioGroup.js.map +1 -1
- package/dist/primitives/Select.js +3 -3
- package/dist/primitives/Sheet.d.ts +12 -3
- package/dist/primitives/Sheet.js +11 -7
- package/dist/primitives/Sheet.js.map +1 -1
- package/dist/primitives/Sidebar.js +3 -3
- package/dist/primitives/Sonner.js +11 -1135
- package/dist/primitives/Sonner.js.map +1 -1
- package/dist/primitives/Switch.d.ts +6 -3
- package/dist/primitives/Switch.js +4 -8
- package/dist/primitives/Switch.js.map +1 -1
- package/dist/primitives/Tooltip.js +1 -1
- package/dist/primitives/index.d.ts +0 -1
- package/dist/primitives/index.js +8 -8
- package/dist/renderIcon-tlvMyboj.js +20 -0
- package/dist/renderIcon-tlvMyboj.js.map +1 -0
- package/dist/shadcn/components/typography.d.ts +4 -4
- package/dist/{sheet-D1ngftfX.js → sheet-COcn22fC.js} +3 -3
- package/dist/{sheet-D1ngftfX.js.map → sheet-COcn22fC.js.map} +1 -1
- package/dist/{tooltip-D5soNrAP.js → tooltip-DzjIJacP.js} +3 -3
- package/dist/{tooltip-D5soNrAP.js.map → tooltip-DzjIJacP.js.map} +1 -1
- package/dist/useCreatableItems-B0seQA1_.js +89 -0
- package/dist/useCreatableItems-B0seQA1_.js.map +1 -0
- package/dist/utils/fieldIds.d.ts +2 -0
- package/dist/utils/hyphenize.d.ts +1 -0
- package/dist/{reselect-CABQm5hA.js → with-selector--fY1NrB9.js} +111 -111
- package/dist/with-selector--fY1NrB9.js.map +1 -0
- package/package.json +2 -1
- package/dist/DataTable-Y4POx0WN.js.map +0 -1
- package/dist/cjs/DataTable-DJw2SZ7b.js.map +0 -1
- package/dist/cjs/primitives/Typography.js.map +0 -1
- package/dist/cjs/reselect-CeyIIDM-.js.map +0 -1
- package/dist/primitives/Typography.js.map +0 -1
- package/dist/reselect-CABQm5hA.js.map +0 -1
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { forwardRef } from 'react';
|
|
3
|
+
import { c as cn } from '../utils-DdHUxIdC.js';
|
|
4
|
+
import { SheetHeader as SheetHeader$1, SheetFooter as SheetFooter$1, SheetTitle as SheetTitle$1, SheetDescription as SheetDescription$1, Sheet as Sheet$1, SheetContent } from '../primitives/Sheet.js';
|
|
5
|
+
import '../button-COIbN8dg.js';
|
|
6
|
+
import '../index-D7Zy7P05.js';
|
|
7
|
+
import '../index-CfriMyrd.js';
|
|
8
|
+
import '../index-BtkPdosV.js';
|
|
9
|
+
import '../sheet-COcn22fC.js';
|
|
10
|
+
import '../x-_o2T3n6D.js';
|
|
11
|
+
import '../createLucideIcon-C8ycilSN.js';
|
|
12
|
+
import '../index-9HvIbmnI.js';
|
|
13
|
+
import '../index-DNzunGHb.js';
|
|
14
|
+
import '../index-CiyxEyB0.js';
|
|
15
|
+
import '../index-zW4GjM5L.js';
|
|
16
|
+
import '../index-DOzu5J1s.js';
|
|
17
|
+
import '../index-Cor698lu.js';
|
|
18
|
+
import '../index-BNPynZWM.js';
|
|
19
|
+
import '../index-DhnfW8wQ.js';
|
|
20
|
+
import 'react-dom';
|
|
21
|
+
import '../index-CSUSJzOJ.js';
|
|
22
|
+
import '../index-B4_fVWDx.js';
|
|
23
|
+
import '../index-fV_U4ZJM.js';
|
|
24
|
+
import '../index-yFgkK_AM.js';
|
|
25
|
+
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// Size mapping
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
// Uses data-[side] selector to match primitive specificity so tailwind-merge
|
|
30
|
+
// can override the default sm:max-w-sm from the primitive.
|
|
31
|
+
const SIZE_CLASS_MAP = {
|
|
32
|
+
small: "data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm",
|
|
33
|
+
large: "data-[side=left]:sm:max-w-lg data-[side=right]:sm:max-w-lg",
|
|
34
|
+
extraLarge: "data-[side=left]:sm:max-w-2xl data-[side=right]:sm:max-w-2xl",
|
|
35
|
+
};
|
|
36
|
+
const SheetHeader = forwardRef(({ children, className, ...otherProps }, ref) => (jsx(SheetHeader$1, { ref: ref, className: cn(className), "data-testid": "sheet-header", ...otherProps, children: children })));
|
|
37
|
+
SheetHeader.displayName = "Sheet.Header";
|
|
38
|
+
const SheetBody = forwardRef(({ children, className, hasFooter = true, ...otherProps }, ref) => (jsx("div", { ref: ref, "data-slot": "sheet-body", "data-testid": "sheet-body", className: cn("flex flex-1 flex-col items-start justify-start overflow-y-auto px-4", hasFooter && "pb-0", className), ...otherProps, children: children })));
|
|
39
|
+
SheetBody.displayName = "Sheet.Body";
|
|
40
|
+
const SheetFooter = forwardRef(({ children, className, ...otherProps }, ref) => (jsx(SheetFooter$1, { ref: ref, className: cn("flex flex-row items-center justify-start gap-2 border-t", className), "data-testid": "sheet-footer", ...otherProps, children: children })));
|
|
41
|
+
SheetFooter.displayName = "Sheet.Footer";
|
|
42
|
+
const SheetTitle = forwardRef(({ children, className, ...otherProps }, ref) => (jsx(SheetTitle$1, { ref: ref, className: cn("text-xl", className), ...otherProps, children: children })));
|
|
43
|
+
SheetTitle.displayName = "Sheet.Title";
|
|
44
|
+
const SheetDescription = forwardRef(({ children, className, ...otherProps }, ref) => (jsx(SheetDescription$1, { ref: ref, className: cn(className), ...otherProps, children: children })));
|
|
45
|
+
SheetDescription.displayName = "Sheet.Description";
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
// Component
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
const Sheet = forwardRef(({ size = "small", isOpen = false, onClose = () => { }, children, className, closeOnEsc = true, closeButton = true, backdropClassName, closeOnOutsideClick = true, initialFocusRef, finalFocusRef, side = "right", modal, defaultOpen,
|
|
50
|
+
// Radix content handlers — intercept and merge
|
|
51
|
+
onOpenAutoFocus: onOpenAutoFocusProp, onCloseAutoFocus: onCloseAutoFocusProp, ...otherProps }, ref) => {
|
|
52
|
+
const handleOpenChange = (open) => {
|
|
53
|
+
if (!open)
|
|
54
|
+
onClose();
|
|
55
|
+
};
|
|
56
|
+
const handleInteractOutside = (e) => {
|
|
57
|
+
if (!closeOnOutsideClick)
|
|
58
|
+
e.preventDefault();
|
|
59
|
+
};
|
|
60
|
+
const handleEscapeKeyDown = (e) => {
|
|
61
|
+
if (!closeOnEsc)
|
|
62
|
+
e.preventDefault();
|
|
63
|
+
};
|
|
64
|
+
const handleOpenAutoFocus = (e) => {
|
|
65
|
+
if (initialFocusRef?.current) {
|
|
66
|
+
e.preventDefault();
|
|
67
|
+
initialFocusRef.current.focus();
|
|
68
|
+
}
|
|
69
|
+
onOpenAutoFocusProp?.(e);
|
|
70
|
+
};
|
|
71
|
+
const handleCloseAutoFocus = (e) => {
|
|
72
|
+
if (finalFocusRef?.current) {
|
|
73
|
+
e.preventDefault();
|
|
74
|
+
finalFocusRef.current.focus();
|
|
75
|
+
}
|
|
76
|
+
onCloseAutoFocusProp?.(e);
|
|
77
|
+
};
|
|
78
|
+
return (jsx(Sheet$1, { open: isOpen, onOpenChange: handleOpenChange, modal: modal, defaultOpen: defaultOpen, children: jsx(SheetContent, { ref: ref, side: side, showCloseButton: closeButton, overlayClassName: backdropClassName, onInteractOutside: handleInteractOutside, onEscapeKeyDown: handleEscapeKeyDown, onOpenAutoFocus: handleOpenAutoFocus, onCloseAutoFocus: handleCloseAutoFocus, className: cn(SIZE_CLASS_MAP[size], className), "data-testid": "sheet-wrapper", ...otherProps, children: children }) }));
|
|
79
|
+
});
|
|
80
|
+
Sheet.displayName = "Sheet";
|
|
81
|
+
Sheet.Header = SheetHeader;
|
|
82
|
+
Sheet.Body = SheetBody;
|
|
83
|
+
Sheet.Footer = SheetFooter;
|
|
84
|
+
Sheet.Title = SheetTitle;
|
|
85
|
+
Sheet.Description = SheetDescription;
|
|
86
|
+
|
|
87
|
+
export { Sheet };
|
|
88
|
+
//# sourceMappingURL=Sheet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Sheet.js","sources":["../../src/components/Sheet.tsx"],"sourcesContent":["import React, { forwardRef, type ReactNode, type RefObject } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n Sheet as PrimitiveSheet,\n SheetContent as PrimitiveSheetContent,\n SheetDescription as PrimitiveSheetDescription,\n SheetFooter as PrimitiveSheetFooter,\n SheetHeader as PrimitiveSheetHeader,\n SheetTitle as PrimitiveSheetTitle,\n} from \"src/primitives/Sheet\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype SheetSize = \"small\" | \"large\" | \"extraLarge\";\n\n/** Radix Sheet.Content props we forward via ...otherProps. */\ntype SheetContentProps = React.ComponentProps<typeof PrimitiveSheetContent>;\n\nexport interface SheetProps extends Omit<\n SheetContentProps,\n | \"children\"\n | \"className\"\n | \"side\"\n | \"showCloseButton\"\n | \"onEscapeKeyDown\"\n | \"onInteractOutside\"\n> {\n /** Size of the sheet. */\n size?: SheetSize;\n /** Whether the sheet is open. */\n isOpen?: boolean;\n /** Callback invoked when the sheet is closed. */\n onClose?: () => void;\n /** Content rendered inside the sheet. */\n children?: ReactNode;\n /** Additional CSS class names applied to the sheet content. */\n className?: string;\n /** Close on pressing the Esc key. */\n closeOnEsc?: boolean;\n /** Show the close button. */\n closeButton?: boolean;\n /** Additional CSS class names applied to the backdrop/overlay. */\n backdropClassName?: string;\n /** Close on clicking outside the sheet. */\n closeOnOutsideClick?: boolean;\n /** Ref of the element to receive focus when the sheet opens. */\n initialFocusRef?: RefObject<HTMLElement | null>;\n /** Ref of the element to receive focus when the sheet closes. */\n finalFocusRef?: RefObject<HTMLElement | null>;\n /** Which side the sheet slides in from. */\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n /** Radix Dialog `modal` prop — controls modal vs non-modal behaviour. */\n modal?: boolean;\n /** Radix Dialog `defaultOpen` prop. */\n defaultOpen?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Size mapping\n// ---------------------------------------------------------------------------\n\n// Uses data-[side] selector to match primitive specificity so tailwind-merge\n// can override the default sm:max-w-sm from the primitive.\nconst SIZE_CLASS_MAP: Record<SheetSize, string> = {\n small: \"data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm\",\n large: \"data-[side=left]:sm:max-w-lg data-[side=right]:sm:max-w-lg\",\n extraLarge: \"data-[side=left]:sm:max-w-2xl data-[side=right]:sm:max-w-2xl\",\n};\n\n// ---------------------------------------------------------------------------\n// Subcomponents\n// ---------------------------------------------------------------------------\n\ninterface SheetSubcomponentProps extends React.ComponentProps<\"div\"> {\n children?: ReactNode;\n className?: string;\n}\n\nconst SheetHeader = forwardRef<HTMLDivElement, SheetSubcomponentProps>(\n ({ children, className, ...otherProps }, ref) => (\n <PrimitiveSheetHeader\n ref={ref}\n className={cn(className)}\n data-testid=\"sheet-header\"\n {...otherProps}\n >\n {children}\n </PrimitiveSheetHeader>\n )\n);\nSheetHeader.displayName = \"Sheet.Header\";\n\nconst SheetBody = forwardRef<\n HTMLDivElement,\n SheetSubcomponentProps & { hasFooter?: boolean }\n>(({ children, className, hasFooter = true, ...otherProps }, ref) => (\n <div\n ref={ref}\n data-slot=\"sheet-body\"\n data-testid=\"sheet-body\"\n className={cn(\n \"flex flex-1 flex-col items-start justify-start overflow-y-auto px-4\",\n hasFooter && \"pb-0\",\n className\n )}\n {...otherProps}\n >\n {children}\n </div>\n));\nSheetBody.displayName = \"Sheet.Body\";\n\nconst SheetFooter = forwardRef<HTMLDivElement, SheetSubcomponentProps>(\n ({ children, className, ...otherProps }, ref) => (\n <PrimitiveSheetFooter\n ref={ref}\n className={cn(\n \"flex flex-row items-center justify-start gap-2 border-t\",\n className\n )}\n data-testid=\"sheet-footer\"\n {...otherProps}\n >\n {children}\n </PrimitiveSheetFooter>\n )\n);\nSheetFooter.displayName = \"Sheet.Footer\";\n\nconst SheetTitle = forwardRef<\n HTMLHeadingElement,\n React.ComponentProps<typeof PrimitiveSheetTitle>\n>(({ children, className, ...otherProps }, ref) => (\n <PrimitiveSheetTitle\n ref={ref}\n className={cn(\"text-xl\", className)}\n {...otherProps}\n >\n {children}\n </PrimitiveSheetTitle>\n));\nSheetTitle.displayName = \"Sheet.Title\";\n\nconst SheetDescription = forwardRef<\n HTMLParagraphElement,\n React.ComponentProps<typeof PrimitiveSheetDescription>\n>(({ children, className, ...otherProps }, ref) => (\n <PrimitiveSheetDescription\n ref={ref}\n className={cn(className)}\n {...otherProps}\n >\n {children}\n </PrimitiveSheetDescription>\n));\nSheetDescription.displayName = \"Sheet.Description\";\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nconst Sheet = forwardRef<HTMLDivElement, SheetProps>(\n (\n {\n size = \"small\",\n isOpen = false,\n onClose = () => {},\n children,\n className,\n closeOnEsc = true,\n closeButton = true,\n backdropClassName,\n closeOnOutsideClick = true,\n initialFocusRef,\n finalFocusRef,\n side = \"right\",\n modal,\n defaultOpen,\n // Radix content handlers — intercept and merge\n onOpenAutoFocus: onOpenAutoFocusProp,\n onCloseAutoFocus: onCloseAutoFocusProp,\n ...otherProps\n },\n ref\n ) => {\n const handleOpenChange = (open: boolean) => {\n if (!open) onClose();\n };\n\n const handleInteractOutside = (e: Event) => {\n if (!closeOnOutsideClick) e.preventDefault();\n };\n\n const handleEscapeKeyDown = (e: KeyboardEvent) => {\n if (!closeOnEsc) e.preventDefault();\n };\n\n const handleOpenAutoFocus = (e: Event) => {\n if (initialFocusRef?.current) {\n e.preventDefault();\n initialFocusRef.current.focus();\n }\n onOpenAutoFocusProp?.(e);\n };\n\n const handleCloseAutoFocus = (e: Event) => {\n if (finalFocusRef?.current) {\n e.preventDefault();\n finalFocusRef.current.focus();\n }\n onCloseAutoFocusProp?.(e);\n };\n\n return (\n <PrimitiveSheet\n open={isOpen}\n onOpenChange={handleOpenChange}\n modal={modal}\n defaultOpen={defaultOpen}\n >\n <PrimitiveSheetContent\n ref={ref}\n side={side}\n showCloseButton={closeButton}\n overlayClassName={backdropClassName}\n onInteractOutside={handleInteractOutside}\n onEscapeKeyDown={handleEscapeKeyDown}\n onOpenAutoFocus={handleOpenAutoFocus}\n onCloseAutoFocus={handleCloseAutoFocus}\n className={cn(SIZE_CLASS_MAP[size], className)}\n data-testid=\"sheet-wrapper\"\n {...otherProps}\n >\n {children}\n </PrimitiveSheetContent>\n </PrimitiveSheet>\n );\n }\n) as React.ForwardRefExoticComponent<\n SheetProps & React.RefAttributes<HTMLDivElement>\n> & {\n Header: typeof SheetHeader;\n Body: typeof SheetBody;\n Footer: typeof SheetFooter;\n Title: typeof SheetTitle;\n Description: typeof SheetDescription;\n};\n\nSheet.displayName = \"Sheet\";\nSheet.Header = SheetHeader;\nSheet.Body = SheetBody;\nSheet.Footer = SheetFooter;\nSheet.Title = SheetTitle;\nSheet.Description = SheetDescription;\n\nexport { Sheet };\n"],"names":["_jsx","PrimitiveSheetHeader","PrimitiveSheetFooter","PrimitiveSheetTitle","PrimitiveSheetDescription","PrimitiveSheet","PrimitiveSheetContent"],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Switch as PrimitiveSwitch } from "src/primitives/Switch";
|
|
3
|
+
export interface SwitchProps extends Omit<React.ComponentProps<typeof PrimitiveSwitch>, "children"> {
|
|
4
|
+
/** Text label displayed next to the switch. */
|
|
5
|
+
label?: string;
|
|
6
|
+
/** Error message displayed below the switch. */
|
|
7
|
+
error?: string;
|
|
8
|
+
/** Helper text displayed below the label. Accepts string or ReactNode. */
|
|
9
|
+
helpText?: React.ReactNode;
|
|
10
|
+
/** Shows a required indicator next to the label. */
|
|
11
|
+
required?: boolean;
|
|
12
|
+
/** Additional class name for the outermost wrapper. */
|
|
13
|
+
className?: string;
|
|
14
|
+
/** Size of the switch. */
|
|
15
|
+
size?: "sm" | "default" | "lg";
|
|
16
|
+
}
|
|
17
|
+
declare const Switch: React.ForwardRefExoticComponent<Omit<SwitchProps, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
18
|
+
export { Switch };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { forwardRef, useId } from 'react';
|
|
3
|
+
import { Switch as Switch$1 } from '../primitives/Switch.js';
|
|
4
|
+
import { Label } from '../primitives/Label.js';
|
|
5
|
+
import { c as cn } from '../utils-DdHUxIdC.js';
|
|
6
|
+
import '../index-DNzunGHb.js';
|
|
7
|
+
import '../index-BtkPdosV.js';
|
|
8
|
+
import '../index-CiyxEyB0.js';
|
|
9
|
+
import '../index-Cor698lu.js';
|
|
10
|
+
import '../index-DOzu5J1s.js';
|
|
11
|
+
import '../index-30QpKM0j.js';
|
|
12
|
+
import '../index-BYZaLNq1.js';
|
|
13
|
+
import '../index-DhnfW8wQ.js';
|
|
14
|
+
import 'react-dom';
|
|
15
|
+
import '../label-B4qDF3W1.js';
|
|
16
|
+
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Component
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
const Switch = forwardRef(({ label, error, helpText, required = false, className, size = "default", disabled, id: idProp, ...otherProps }, ref) => {
|
|
21
|
+
const generatedId = useId();
|
|
22
|
+
const id = idProp ?? generatedId;
|
|
23
|
+
const errorId = `error_${id}`;
|
|
24
|
+
const helpTextId = `helpText_${id}`;
|
|
25
|
+
const ariaDescribedBy = [error ? errorId : null, helpText ? helpTextId : null]
|
|
26
|
+
.filter(Boolean)
|
|
27
|
+
.join(" ") || undefined;
|
|
28
|
+
return (jsxs("div", { className: cn("inline-flex flex-col gap-1.5", className), "data-disabled": disabled || undefined, "data-invalid": !!error || undefined, children: [jsxs("div", { className: cn("inline-flex gap-2", helpText ? "items-start" : "items-center"), children: [jsx(Switch$1, { ref: ref, id: id, size: size, disabled: disabled, "aria-invalid": !!error || undefined, "aria-describedby": ariaDescribedBy, "aria-required": required || undefined, className: helpText ? "mt-0.5" : undefined, ...otherProps }), (label || helpText) && (jsxs("div", { className: "flex flex-col gap-0.5", children: [label && (jsxs(Label, { htmlFor: id, className: cn("cursor-pointer", disabled && "cursor-not-allowed opacity-50"), children: [label, required && (jsx("span", { "aria-hidden": "true", className: "text-destructive", children: "*" }))] })), helpText && (jsx("p", { id: helpTextId, className: "text-sm text-muted-foreground", children: helpText }))] }))] }), error && (jsx("p", { id: errorId, role: "alert", className: "text-xs text-destructive", children: error }))] }));
|
|
29
|
+
});
|
|
30
|
+
Switch.displayName = "Switch";
|
|
31
|
+
|
|
32
|
+
export { Switch };
|
|
33
|
+
//# sourceMappingURL=Switch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Switch.js","sources":["../../src/components/Switch.tsx"],"sourcesContent":["import React, { forwardRef, useId } from \"react\";\n\nimport { Switch as PrimitiveSwitch } from \"src/primitives/Switch\";\nimport { Label } from \"src/primitives/Label\";\nimport { cn } from \"src/shadcn/lib/utils\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface SwitchProps extends Omit<\n React.ComponentProps<typeof PrimitiveSwitch>,\n \"children\"\n> {\n /** Text label displayed next to the switch. */\n label?: string;\n /** Error message displayed below the switch. */\n error?: string;\n /** Helper text displayed below the label. Accepts string or ReactNode. */\n helpText?: React.ReactNode;\n /** Shows a required indicator next to the label. */\n required?: boolean;\n /** Additional class name for the outermost wrapper. */\n className?: string;\n /** Size of the switch. */\n size?: \"sm\" | \"default\" | \"lg\";\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nconst Switch = forwardRef<\n React.ComponentRef<typeof PrimitiveSwitch>,\n SwitchProps\n>(\n (\n {\n label,\n error,\n helpText,\n required = false,\n className,\n size = \"default\",\n disabled,\n id: idProp,\n ...otherProps\n },\n ref\n ) => {\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const errorId = `error_${id}`;\n const helpTextId = `helpText_${id}`;\n\n const ariaDescribedBy =\n [error ? errorId : null, helpText ? helpTextId : null]\n .filter(Boolean)\n .join(\" \") || undefined;\n\n return (\n <div\n className={cn(\"inline-flex flex-col gap-1.5\", className)}\n data-disabled={disabled || undefined}\n data-invalid={!!error || undefined}\n >\n <div\n className={cn(\n \"inline-flex gap-2\",\n helpText ? \"items-start\" : \"items-center\"\n )}\n >\n <PrimitiveSwitch\n ref={ref}\n id={id}\n size={size}\n disabled={disabled}\n aria-invalid={!!error || undefined}\n aria-describedby={ariaDescribedBy}\n aria-required={required || undefined}\n className={helpText ? \"mt-0.5\" : undefined}\n {...otherProps}\n />\n {(label || helpText) && (\n <div className=\"flex flex-col gap-0.5\">\n {label && (\n <Label\n htmlFor={id}\n className={cn(\n \"cursor-pointer\",\n disabled && \"cursor-not-allowed opacity-50\"\n )}\n >\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n *\n </span>\n )}\n </Label>\n )}\n {helpText && (\n <p id={helpTextId} className=\"text-sm text-muted-foreground\">\n {helpText}\n </p>\n )}\n </div>\n )}\n </div>\n {error && (\n <p id={errorId} role=\"alert\" className=\"text-xs text-destructive\">\n {error}\n </p>\n )}\n </div>\n );\n }\n);\n\nSwitch.displayName = \"Switch\";\n\nexport { Switch };\n"],"names":["_jsxs","_jsx","PrimitiveSwitch"],"mappings":";;;;;;;;;;;;;;;;AA4BA;AACA;AACA;AAEA,MAAM,MAAM,GAAG,UAAU,CAIvB,CACE,EACE,KAAK,EACL,KAAK,EACL,QAAQ,EACR,QAAQ,GAAG,KAAK,EAChB,SAAS,EACT,IAAI,GAAG,SAAS,EAChB,QAAQ,EACR,EAAE,EAAE,MAAM,EACV,GAAG,UAAU,EACd,EACD,GAAG,KACD;AACF,IAAA,MAAM,WAAW,GAAG,KAAK,EAAE;AAC3B,IAAA,MAAM,EAAE,GAAG,MAAM,IAAI,WAAW;AAChC,IAAA,MAAM,OAAO,GAAG,CAAA,MAAA,EAAS,EAAE,EAAE;AAC7B,IAAA,MAAM,UAAU,GAAG,CAAA,SAAA,EAAY,EAAE,EAAE;IAEnC,MAAM,eAAe,GACnB,CAAC,KAAK,GAAG,OAAO,GAAG,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,IAAI;SAClD,MAAM,CAAC,OAAO;AACd,SAAA,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS;AAE3B,IAAA,QACEA,IAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAE,EAAE,CAAC,8BAA8B,EAAE,SAAS,CAAC,EAAA,eAAA,EACzC,QAAQ,IAAI,SAAS,kBACtB,CAAC,CAAC,KAAK,IAAI,SAAS,EAAA,QAAA,EAAA,CAElCA,IAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAE,EAAE,CACX,mBAAmB,EACnB,QAAQ,GAAG,aAAa,GAAG,cAAc,CAC1C,EAAA,QAAA,EAAA,CAEDC,IAACC,QAAe,EAAA,EACd,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,EAAE,EACN,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,QAAQ,EAAA,cAAA,EACJ,CAAC,CAAC,KAAK,IAAI,SAAS,EAAA,kBAAA,EAChB,eAAe,EAAA,eAAA,EAClB,QAAQ,IAAI,SAAS,EACpC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,KACtC,UAAU,EAAA,CACd,EACD,CAAC,KAAK,IAAI,QAAQ,MACjBF,cAAK,SAAS,EAAC,uBAAuB,EAAA,QAAA,EAAA,CACnC,KAAK,KACJA,KAAC,KAAK,EAAA,EACJ,OAAO,EAAE,EAAE,EACX,SAAS,EAAE,EAAE,CACX,gBAAgB,EAChB,QAAQ,IAAI,+BAA+B,CAC5C,aAEA,KAAK,EACL,QAAQ,KACPC,GAAA,CAAA,MAAA,EAAA,EAAA,aAAA,EAAkB,MAAM,EAAC,SAAS,EAAC,kBAAkB,EAAA,QAAA,EAAA,GAAA,EAAA,CAE9C,CACR,CAAA,EAAA,CACK,CACT,EACA,QAAQ,KACPA,GAAA,CAAA,GAAA,EAAA,EAAG,EAAE,EAAE,UAAU,EAAE,SAAS,EAAC,+BAA+B,EAAA,QAAA,EACzD,QAAQ,GACP,CACL,CAAA,EAAA,CACG,CACP,CAAA,EAAA,CACG,EACL,KAAK,KACJA,GAAA,CAAA,GAAA,EAAA,EAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,0BAA0B,EAAA,QAAA,EAC9D,KAAK,GACJ,CACL,CAAA,EAAA,CACG;AAEV,CAAC;AAGH,MAAM,CAAC,WAAW,GAAG,QAAQ;;;;"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { type IconProp } from "src/lib/renderIcon";
|
|
3
|
+
import { Tabs as PrimitiveTabs, TabsTrigger as PrimitiveTabsTrigger } from "src/primitives/Tabs";
|
|
4
|
+
type TabsSize = "default" | "lg";
|
|
5
|
+
export interface TabsProps extends React.ComponentProps<typeof PrimitiveTabs> {
|
|
6
|
+
/** Size of tab triggers. Applied to all Tabs.Item children. */
|
|
7
|
+
size?: TabsSize;
|
|
8
|
+
}
|
|
9
|
+
interface TabsItemProps extends React.ComponentProps<typeof PrimitiveTabsTrigger> {
|
|
10
|
+
/** Icon component, element, or class-name string rendered before the label. */
|
|
11
|
+
icon?: IconProp;
|
|
12
|
+
}
|
|
13
|
+
declare const Tabs: React.ForwardRefExoticComponent<Omit<TabsProps, "ref"> & React.RefAttributes<HTMLDivElement>> & {
|
|
14
|
+
List: React.ForwardRefExoticComponent<Omit<import("@radix-ui/react-tabs").TabsListProps & React.RefAttributes<HTMLDivElement> & import("class-variance-authority").VariantProps<(props?: ({
|
|
15
|
+
variant?: "line" | "default" | null | undefined;
|
|
16
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
17
|
+
Item: React.ForwardRefExoticComponent<Omit<TabsItemProps, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
18
|
+
Content: React.ForwardRefExoticComponent<Omit<import("@radix-ui/react-tabs").TabsContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
19
|
+
};
|
|
20
|
+
export { Tabs };
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { createContext, forwardRef, useContext } from 'react';
|
|
3
|
+
import { c as cn } from '../utils-DdHUxIdC.js';
|
|
4
|
+
import { r as renderIcon } from '../renderIcon-tlvMyboj.js';
|
|
5
|
+
import { Tabs as Tabs$1, TabsList, TabsTrigger, TabsContent } from '../primitives/Tabs.js';
|
|
6
|
+
import '../index-D7Zy7P05.js';
|
|
7
|
+
import '../index-DNzunGHb.js';
|
|
8
|
+
import '../index-CiyxEyB0.js';
|
|
9
|
+
import '../index-j_qxDBFl.js';
|
|
10
|
+
import '../index-Dd1i1d2M.js';
|
|
11
|
+
import '../index-BtkPdosV.js';
|
|
12
|
+
import '../index-zW4GjM5L.js';
|
|
13
|
+
import '../index-DOzu5J1s.js';
|
|
14
|
+
import '../index-DhnfW8wQ.js';
|
|
15
|
+
import 'react-dom';
|
|
16
|
+
import '../index-CSUSJzOJ.js';
|
|
17
|
+
import '../index-Cor698lu.js';
|
|
18
|
+
import '../index-BA158WEj.js';
|
|
19
|
+
import '../index-yFgkK_AM.js';
|
|
20
|
+
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// Size config
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
const SIZE_CLASSES = {
|
|
25
|
+
default: "",
|
|
26
|
+
lg: "text-[15px] px-3 py-1.5",
|
|
27
|
+
};
|
|
28
|
+
const LIST_HEIGHT = {
|
|
29
|
+
default: "",
|
|
30
|
+
lg: "group-data-horizontal/tabs:h-10",
|
|
31
|
+
};
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
// Context
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
const TabsSizeContext = createContext("default");
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// Tabs (root)
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
const TabsRoot = forwardRef(({ size = "default", children, ...props }, ref) => (jsx(TabsSizeContext.Provider, { value: size, children: jsx(Tabs$1, { ref: ref, ...props, children: children }) })));
|
|
40
|
+
TabsRoot.displayName = "Tabs";
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// Tabs.List
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
const TabsListComponent = forwardRef(({ className, ...props }, ref) => {
|
|
45
|
+
const size = useContext(TabsSizeContext);
|
|
46
|
+
return (jsx(TabsList, { ref: ref, className: cn(LIST_HEIGHT[size], className), ...props }));
|
|
47
|
+
});
|
|
48
|
+
TabsListComponent.displayName = "Tabs.List";
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
// Tabs.Item
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
const TabsItemComponent = forwardRef(({ icon, className, children, ...otherProps }, ref) => {
|
|
53
|
+
const size = useContext(TabsSizeContext);
|
|
54
|
+
return (jsxs(TabsTrigger, { ref: ref, className: cn(SIZE_CLASSES[size], icon && "gap-1.5", className), ...otherProps, children: [icon && renderIcon(icon, size === "lg" ? "size-5" : "size-4"), children] }));
|
|
55
|
+
});
|
|
56
|
+
TabsItemComponent.displayName = "Tabs.Item";
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
// Tabs.Content
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
const TabsContentComponent = forwardRef((props, ref) => jsx(TabsContent, { ref: ref, ...props }));
|
|
61
|
+
TabsContentComponent.displayName = "Tabs.Content";
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
// Compound component
|
|
64
|
+
// ---------------------------------------------------------------------------
|
|
65
|
+
const Tabs = Object.assign(TabsRoot, {
|
|
66
|
+
List: TabsListComponent,
|
|
67
|
+
Item: TabsItemComponent,
|
|
68
|
+
Content: TabsContentComponent,
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
export { Tabs };
|
|
72
|
+
//# sourceMappingURL=Tabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tabs.js","sources":["../../src/components/Tabs.tsx"],"sourcesContent":["import React, { forwardRef, createContext, useContext } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport { renderIcon, type IconProp } from \"src/lib/renderIcon\";\nimport {\n Tabs as PrimitiveTabs,\n TabsList as PrimitiveTabsList,\n TabsTrigger as PrimitiveTabsTrigger,\n TabsContent as PrimitiveTabsContent,\n} from \"src/primitives/Tabs\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype TabsSize = \"default\" | \"lg\";\n\nexport interface TabsProps extends React.ComponentProps<typeof PrimitiveTabs> {\n /** Size of tab triggers. Applied to all Tabs.Item children. */\n size?: TabsSize;\n}\n\ntype TabsListProps = React.ComponentProps<typeof PrimitiveTabsList>;\n\ninterface TabsItemProps extends React.ComponentProps<\n typeof PrimitiveTabsTrigger\n> {\n /** Icon component, element, or class-name string rendered before the label. */\n icon?: IconProp;\n}\n\ntype TabsContentProps = React.ComponentProps<typeof PrimitiveTabsContent>;\n\n// ---------------------------------------------------------------------------\n// Size config\n// ---------------------------------------------------------------------------\n\nconst SIZE_CLASSES: Record<TabsSize, string> = {\n default: \"\",\n lg: \"text-[15px] px-3 py-1.5\",\n};\n\nconst LIST_HEIGHT: Record<TabsSize, string> = {\n default: \"\",\n lg: \"group-data-horizontal/tabs:h-10\",\n};\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\nconst TabsSizeContext = createContext<TabsSize>(\"default\");\n\n// ---------------------------------------------------------------------------\n// Tabs (root)\n// ---------------------------------------------------------------------------\n\nconst TabsRoot = forwardRef<HTMLDivElement, TabsProps>(\n ({ size = \"default\", children, ...props }, ref) => (\n <TabsSizeContext.Provider value={size}>\n <PrimitiveTabs ref={ref} {...props}>\n {children}\n </PrimitiveTabs>\n </TabsSizeContext.Provider>\n )\n);\nTabsRoot.displayName = \"Tabs\";\n\n// ---------------------------------------------------------------------------\n// Tabs.List\n// ---------------------------------------------------------------------------\n\nconst TabsListComponent = forwardRef<HTMLDivElement, TabsListProps>(\n ({ className, ...props }, ref) => {\n const size = useContext(TabsSizeContext);\n\n return (\n <PrimitiveTabsList\n ref={ref}\n className={cn(LIST_HEIGHT[size], className)}\n {...props}\n />\n );\n }\n);\nTabsListComponent.displayName = \"Tabs.List\";\n\n// ---------------------------------------------------------------------------\n// Tabs.Item\n// ---------------------------------------------------------------------------\n\nconst TabsItemComponent = forwardRef<HTMLButtonElement, TabsItemProps>(\n ({ icon, className, children, ...otherProps }, ref) => {\n const size = useContext(TabsSizeContext);\n\n return (\n <PrimitiveTabsTrigger\n ref={ref}\n className={cn(SIZE_CLASSES[size], icon && \"gap-1.5\", className)}\n {...otherProps}\n >\n {icon && renderIcon(icon, size === \"lg\" ? \"size-5\" : \"size-4\")}\n {children}\n </PrimitiveTabsTrigger>\n );\n }\n);\nTabsItemComponent.displayName = \"Tabs.Item\";\n\n// ---------------------------------------------------------------------------\n// Tabs.Content\n// ---------------------------------------------------------------------------\n\nconst TabsContentComponent = forwardRef<HTMLDivElement, TabsContentProps>(\n (props, ref) => <PrimitiveTabsContent ref={ref} {...props} />\n);\nTabsContentComponent.displayName = \"Tabs.Content\";\n\n// ---------------------------------------------------------------------------\n// Compound component\n// ---------------------------------------------------------------------------\n\nconst Tabs = Object.assign(TabsRoot, {\n List: TabsListComponent,\n Item: TabsItemComponent,\n Content: TabsContentComponent,\n});\n\nexport { Tabs };\n"],"names":["_jsx","PrimitiveTabs","PrimitiveTabsList","_jsxs","PrimitiveTabsTrigger","PrimitiveTabsContent"],"mappings":";;;;;;;;;;;;;;;;;;;;AAiCA;AACA;AACA;AAEA,MAAM,YAAY,GAA6B;AAC7C,IAAA,OAAO,EAAE,EAAE;AACX,IAAA,EAAE,EAAE,yBAAyB;CAC9B;AAED,MAAM,WAAW,GAA6B;AAC5C,IAAA,OAAO,EAAE,EAAE;AACX,IAAA,EAAE,EAAE,iCAAiC;CACtC;AAED;AACA;AACA;AAEA,MAAM,eAAe,GAAG,aAAa,CAAW,SAAS,CAAC;AAE1D;AACA;AACA;AAEA,MAAM,QAAQ,GAAG,UAAU,CACzB,CAAC,EAAE,IAAI,GAAG,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,MAC5CA,GAAA,CAAC,eAAe,CAAC,QAAQ,IAAC,KAAK,EAAE,IAAI,EAAA,QAAA,EACnCA,GAAA,CAACC,MAAa,EAAA,EAAC,GAAG,EAAE,GAAG,EAAA,GAAM,KAAK,EAAA,QAAA,EAC/B,QAAQ,GACK,EAAA,CACS,CAC5B,CACF;AACD,QAAQ,CAAC,WAAW,GAAG,MAAM;AAE7B;AACA;AACA;AAEA,MAAM,iBAAiB,GAAG,UAAU,CAClC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,KAAI;AAC/B,IAAA,MAAM,IAAI,GAAG,UAAU,CAAC,eAAe,CAAC;IAExC,QACED,IAACE,QAAiB,EAAA,EAChB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,EAAA,GACvC,KAAK,EAAA,CACT;AAEN,CAAC,CACF;AACD,iBAAiB,CAAC,WAAW,GAAG,WAAW;AAE3C;AACA;AACA;AAEA,MAAM,iBAAiB,GAAG,UAAU,CAClC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,UAAU,EAAE,EAAE,GAAG,KAAI;AACpD,IAAA,MAAM,IAAI,GAAG,UAAU,CAAC,eAAe,CAAC;IAExC,QACEC,KAACC,WAAoB,EAAA,EACnB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,SAAS,EAAE,SAAS,CAAC,EAAA,GAC3D,UAAU,EAAA,QAAA,EAAA,CAEb,IAAI,IAAI,UAAU,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,QAAQ,GAAG,QAAQ,CAAC,EAC7D,QAAQ,CAAA,EAAA,CACY;AAE3B,CAAC,CACF;AACD,iBAAiB,CAAC,WAAW,GAAG,WAAW;AAE3C;AACA;AACA;AAEA,MAAM,oBAAoB,GAAG,UAAU,CACrC,CAAC,KAAK,EAAE,GAAG,KAAKJ,GAAA,CAACK,WAAoB,IAAC,GAAG,EAAE,GAAG,EAAA,GAAM,KAAK,EAAA,CAAI,CAC9D;AACD,oBAAoB,CAAC,WAAW,GAAG,cAAc;AAEjD;AACA;AACA;AAEA,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;AACnC,IAAA,IAAI,EAAE,iBAAiB;AACvB,IAAA,IAAI,EAAE,iBAAiB;AACvB,IAAA,OAAO,EAAE,oBAAoB;AAC9B,CAAA;;;;"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { FieldLabel } from "src/primitives/Field";
|
|
3
|
+
import { Textarea as PrimitiveTextarea } from "src/primitives/Textarea";
|
|
4
|
+
type TextareaSize = "small" | "medium" | "large";
|
|
5
|
+
type TextareaResize = "vertical" | "none";
|
|
6
|
+
type PrimitiveTextareaProps = React.ComponentProps<typeof PrimitiveTextarea>;
|
|
7
|
+
export interface TextareaProps extends Omit<PrimitiveTextareaProps, "size" | "children"> {
|
|
8
|
+
/** Size of the textarea. Controls default rows: small=1, medium=3, large=4. */
|
|
9
|
+
size?: TextareaSize;
|
|
10
|
+
/** Resize behavior. */
|
|
11
|
+
resize?: TextareaResize;
|
|
12
|
+
/** Label displayed above the textarea. */
|
|
13
|
+
label?: string;
|
|
14
|
+
/** Error message displayed below the textarea. */
|
|
15
|
+
error?: string;
|
|
16
|
+
/** Help text displayed below the textarea. Accepts string or ReactNode. */
|
|
17
|
+
helpText?: React.ReactNode;
|
|
18
|
+
/** Maximum character limit. Counter visible at 85% capacity. */
|
|
19
|
+
maxLength?: number;
|
|
20
|
+
/** Allow typing past maxLength, show error styling on count. */
|
|
21
|
+
unlimitedChars?: boolean;
|
|
22
|
+
/** Prevent trimming whitespace on blur. */
|
|
23
|
+
disableTrimOnBlur?: boolean;
|
|
24
|
+
/** Content to display before the textarea. */
|
|
25
|
+
prefix?: React.ReactNode;
|
|
26
|
+
/** Content to display after the textarea. */
|
|
27
|
+
suffix?: React.ReactNode;
|
|
28
|
+
/** Render the textarea without borders. */
|
|
29
|
+
nakedTextarea?: boolean;
|
|
30
|
+
/** Props forwarded to the Label element. */
|
|
31
|
+
labelProps?: React.ComponentProps<typeof FieldLabel>;
|
|
32
|
+
/** Additional class name for the outermost wrapper. */
|
|
33
|
+
className?: string;
|
|
34
|
+
}
|
|
35
|
+
declare const Textarea: React.ForwardRefExoticComponent<Omit<TextareaProps, "ref"> & React.RefAttributes<HTMLTextAreaElement>>;
|
|
36
|
+
export { Textarea };
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { forwardRef, useId, useState } from 'react';
|
|
3
|
+
import { c as cn } from '../utils-DdHUxIdC.js';
|
|
4
|
+
import { Field, FieldLabel, FieldContent, FieldError, FieldDescription } from '../primitives/Field.js';
|
|
5
|
+
import { Textarea as Textarea$1 } from '../primitives/Textarea.js';
|
|
6
|
+
import '../index-D7Zy7P05.js';
|
|
7
|
+
import '../label-B4qDF3W1.js';
|
|
8
|
+
import '../index-DhnfW8wQ.js';
|
|
9
|
+
import 'react-dom';
|
|
10
|
+
import '../index-BtkPdosV.js';
|
|
11
|
+
import '../separator-BbhgePmX.js';
|
|
12
|
+
import '../textarea-BSZwxzjQ.js';
|
|
13
|
+
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Size config
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
const SIZE_ROWS = {
|
|
18
|
+
small: 1,
|
|
19
|
+
medium: 3,
|
|
20
|
+
large: 4,
|
|
21
|
+
};
|
|
22
|
+
const SIZE_MIN_HEIGHT = {
|
|
23
|
+
small: "min-h-8",
|
|
24
|
+
medium: "min-h-20",
|
|
25
|
+
large: "min-h-28",
|
|
26
|
+
};
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Utilities
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
function getTrimmedValue(value, disableTrimOnBlur) {
|
|
31
|
+
if (disableTrimOnBlur || typeof value !== "string")
|
|
32
|
+
return value;
|
|
33
|
+
return value.trim();
|
|
34
|
+
}
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
// Component
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
const Textarea = forwardRef(({ size = "medium", resize = "vertical", label = "", error = "", helpText = "", disabled = false, required = false, maxLength, unlimitedChars = false, disableTrimOnBlur = false, prefix, suffix, nakedTextarea = false, labelProps, className = "", rows: rowsProp, onBlur, onChange, value: controlledValue, ...otherProps }, ref) => {
|
|
39
|
+
const generatedId = useId();
|
|
40
|
+
const id = otherProps.id ?? generatedId;
|
|
41
|
+
const errorId = `error_${id}`;
|
|
42
|
+
const helpTextId = `helpText_${id}`;
|
|
43
|
+
// Controlled / uncontrolled value tracking
|
|
44
|
+
const [valueInternal, setValueInternal] = useState(controlledValue ?? "");
|
|
45
|
+
const isControlled = controlledValue !== undefined;
|
|
46
|
+
const value = isControlled ? controlledValue : valueInternal;
|
|
47
|
+
const valueLength = value?.toString().length || 0;
|
|
48
|
+
const isMaxLengthPresent = !!maxLength || maxLength === 0;
|
|
49
|
+
const isCharacterLimitVisible = isMaxLengthPresent && valueLength >= maxLength * 0.85;
|
|
50
|
+
const maxLengthError = unlimitedChars && valueLength > maxLength;
|
|
51
|
+
const rows = rowsProp ?? SIZE_ROWS[size];
|
|
52
|
+
// --- Handlers ---
|
|
53
|
+
const handleChange = (e) => {
|
|
54
|
+
if (!isControlled) {
|
|
55
|
+
setValueInternal(e.target.value);
|
|
56
|
+
}
|
|
57
|
+
onChange?.(e);
|
|
58
|
+
};
|
|
59
|
+
const handleBlur = (e) => {
|
|
60
|
+
const trimmedValue = getTrimmedValue(value ?? "", disableTrimOnBlur);
|
|
61
|
+
if (trimmedValue !== value) {
|
|
62
|
+
e.target.value = trimmedValue.toString();
|
|
63
|
+
handleChange(e);
|
|
64
|
+
}
|
|
65
|
+
onBlur?.(e);
|
|
66
|
+
};
|
|
67
|
+
// --- aria-describedby ---
|
|
68
|
+
const ariaDescribedBy = [error ? errorId : null, helpText ? helpTextId : null]
|
|
69
|
+
.filter(Boolean)
|
|
70
|
+
.join(" ") || undefined;
|
|
71
|
+
// --- Textarea element ---
|
|
72
|
+
const hasField = !!(label || error || helpText);
|
|
73
|
+
const textareaElement = (jsx(Textarea$1, { ref: ref, id: id, rows: rows, disabled: disabled, required: required, "aria-invalid": !!error || undefined, "aria-describedby": ariaDescribedBy, className: cn(
|
|
74
|
+
// Override shadcn's field-sizing-content and min-h-16 so rows works
|
|
75
|
+
"!field-sizing-normal", SIZE_MIN_HEIGHT[size], resize === "none" && "resize-none", resize === "vertical" && "resize-y", nakedTextarea &&
|
|
76
|
+
"border-transparent shadow-none px-0 py-0 focus-visible:border-transparent focus-visible:ring-0", !!error && "border-destructive ring-destructive/20 ring-3"), value: value, onBlur: handleBlur, onChange: handleChange, ...(isMaxLengthPresent && !unlimitedChars ? { maxLength } : {}), ...otherProps }));
|
|
77
|
+
const hasPrefixSuffix = !!(prefix || suffix);
|
|
78
|
+
const textareaWithAffixes = hasPrefixSuffix ? (jsxs("div", { className: cn("flex items-start gap-2 rounded-lg border border-input px-2.5 py-2 focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/50", !!error && "border-destructive ring-destructive/20 ring-3", nakedTextarea && "border-transparent shadow-none"), children: [prefix && (jsx("div", { className: "shrink-0 pt-0.5 text-muted-foreground", children: prefix })), jsx(Textarea$1, { ref: ref, id: id, rows: rows, disabled: disabled, required: required, "aria-invalid": !!error || undefined, "aria-describedby": ariaDescribedBy, className: cn("!field-sizing-normal border-0 p-0 shadow-none focus-visible:border-0 focus-visible:ring-0", SIZE_MIN_HEIGHT[size], resize === "none" && "resize-none", resize === "vertical" && "resize-y"), value: value, onBlur: handleBlur, onChange: handleChange, ...(isMaxLengthPresent && !unlimitedChars ? { maxLength } : {}), ...otherProps }), suffix && (jsx("div", { className: "shrink-0 pt-0.5 text-muted-foreground", children: suffix }))] })) : (textareaElement);
|
|
79
|
+
if (!hasField) {
|
|
80
|
+
return jsx("div", { className: cn(className), children: textareaWithAffixes });
|
|
81
|
+
}
|
|
82
|
+
return (jsxs(Field, { "data-disabled": disabled || undefined, "data-invalid": !!error || undefined, className: className, children: [(label || isCharacterLimitVisible) && (jsxs("div", { className: "flex items-center justify-between", children: [label && (jsxs(FieldLabel, { htmlFor: id, ...labelProps, children: [label, required && (jsx("span", { "aria-hidden": "true", className: "text-destructive", children: "*" }))] })), isCharacterLimitVisible && (jsxs("span", { className: cn("text-xs tabular-nums", maxLengthError ? "text-destructive" : "text-muted-foreground"), children: [valueLength, "/", maxLength] }))] })), jsxs(FieldContent, { children: [textareaWithAffixes, !!error && jsx(FieldError, { id: errorId, children: error }), helpText && (jsx(FieldDescription, { id: helpTextId, children: helpText }))] })] }));
|
|
83
|
+
});
|
|
84
|
+
Textarea.displayName = "Textarea";
|
|
85
|
+
|
|
86
|
+
export { Textarea };
|
|
87
|
+
//# sourceMappingURL=Textarea.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Textarea.js","sources":["../../src/components/Textarea.tsx"],"sourcesContent":["import React, { forwardRef, useId, useState } from \"react\";\n\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n Field,\n FieldLabel,\n FieldContent,\n FieldDescription,\n FieldError,\n} from \"src/primitives/Field\";\nimport { Textarea as PrimitiveTextarea } from \"src/primitives/Textarea\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype TextareaSize = \"small\" | \"medium\" | \"large\";\ntype TextareaResize = \"vertical\" | \"none\";\n\ntype PrimitiveTextareaProps = React.ComponentProps<typeof PrimitiveTextarea>;\n\nexport interface TextareaProps extends Omit<\n PrimitiveTextareaProps,\n \"size\" | \"children\"\n> {\n /** Size of the textarea. Controls default rows: small=1, medium=3, large=4. */\n size?: TextareaSize;\n /** Resize behavior. */\n resize?: TextareaResize;\n /** Label displayed above the textarea. */\n label?: string;\n /** Error message displayed below the textarea. */\n error?: string;\n /** Help text displayed below the textarea. Accepts string or ReactNode. */\n helpText?: React.ReactNode;\n /** Maximum character limit. Counter visible at 85% capacity. */\n maxLength?: number;\n /** Allow typing past maxLength, show error styling on count. */\n unlimitedChars?: boolean;\n /** Prevent trimming whitespace on blur. */\n disableTrimOnBlur?: boolean;\n /** Content to display before the textarea. */\n prefix?: React.ReactNode;\n /** Content to display after the textarea. */\n suffix?: React.ReactNode;\n /** Render the textarea without borders. */\n nakedTextarea?: boolean;\n /** Props forwarded to the Label element. */\n labelProps?: React.ComponentProps<typeof FieldLabel>;\n /** Additional class name for the outermost wrapper. */\n className?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Size config\n// ---------------------------------------------------------------------------\n\nconst SIZE_ROWS: Record<TextareaSize, number> = {\n small: 1,\n medium: 3,\n large: 4,\n};\n\nconst SIZE_MIN_HEIGHT: Record<TextareaSize, string> = {\n small: \"min-h-8\",\n medium: \"min-h-20\",\n large: \"min-h-28\",\n};\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction getTrimmedValue(\n value: string | number,\n disableTrimOnBlur: boolean\n): string | number {\n if (disableTrimOnBlur || typeof value !== \"string\") return value;\n return value.trim();\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nconst Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n size = \"medium\",\n resize = \"vertical\",\n label = \"\",\n error = \"\",\n helpText = \"\",\n disabled = false,\n required = false,\n maxLength,\n unlimitedChars = false,\n disableTrimOnBlur = false,\n prefix,\n suffix,\n nakedTextarea = false,\n labelProps,\n className = \"\",\n rows: rowsProp,\n onBlur,\n onChange,\n value: controlledValue,\n ...otherProps\n },\n ref\n ) => {\n const generatedId = useId();\n const id = otherProps.id ?? generatedId;\n const errorId = `error_${id}`;\n const helpTextId = `helpText_${id}`;\n\n // Controlled / uncontrolled value tracking\n const [valueInternal, setValueInternal] = useState(controlledValue ?? \"\");\n const isControlled = controlledValue !== undefined;\n\n const value = isControlled ? controlledValue : valueInternal;\n const valueLength = value?.toString().length || 0;\n\n const isMaxLengthPresent = !!maxLength || maxLength === 0;\n const isCharacterLimitVisible =\n isMaxLengthPresent && valueLength >= maxLength! * 0.85;\n const maxLengthError = unlimitedChars && valueLength > maxLength!;\n\n const rows = rowsProp ?? SIZE_ROWS[size];\n\n // --- Handlers ---\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) {\n setValueInternal(e.target.value);\n }\n onChange?.(e);\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLTextAreaElement>) => {\n const trimmedValue = getTrimmedValue(value ?? \"\", disableTrimOnBlur);\n\n if (trimmedValue !== value) {\n e.target.value = trimmedValue.toString();\n handleChange(e as unknown as React.ChangeEvent<HTMLTextAreaElement>);\n }\n\n onBlur?.(e);\n };\n\n // --- aria-describedby ---\n\n const ariaDescribedBy =\n [error ? errorId : null, helpText ? helpTextId : null]\n .filter(Boolean)\n .join(\" \") || undefined;\n\n // --- Textarea element ---\n\n const hasField = !!(label || error || helpText);\n\n const textareaElement = (\n <PrimitiveTextarea\n ref={ref}\n id={id}\n rows={rows}\n disabled={disabled}\n required={required}\n aria-invalid={!!error || undefined}\n aria-describedby={ariaDescribedBy}\n className={cn(\n // Override shadcn's field-sizing-content and min-h-16 so rows works\n \"!field-sizing-normal\",\n SIZE_MIN_HEIGHT[size],\n resize === \"none\" && \"resize-none\",\n resize === \"vertical\" && \"resize-y\",\n nakedTextarea &&\n \"border-transparent shadow-none px-0 py-0 focus-visible:border-transparent focus-visible:ring-0\",\n !!error && \"border-destructive ring-destructive/20 ring-3\"\n )}\n value={value}\n onBlur={handleBlur}\n onChange={handleChange}\n {...(isMaxLengthPresent && !unlimitedChars ? { maxLength } : {})}\n {...otherProps}\n />\n );\n\n const hasPrefixSuffix = !!(prefix || suffix);\n\n const textareaWithAffixes = hasPrefixSuffix ? (\n <div\n className={cn(\n \"flex items-start gap-2 rounded-lg border border-input px-2.5 py-2 focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/50\",\n !!error && \"border-destructive ring-destructive/20 ring-3\",\n nakedTextarea && \"border-transparent shadow-none\"\n )}\n >\n {prefix && (\n <div className=\"shrink-0 pt-0.5 text-muted-foreground\">{prefix}</div>\n )}\n <PrimitiveTextarea\n ref={ref}\n id={id}\n rows={rows}\n disabled={disabled}\n required={required}\n aria-invalid={!!error || undefined}\n aria-describedby={ariaDescribedBy}\n className={cn(\n \"!field-sizing-normal border-0 p-0 shadow-none focus-visible:border-0 focus-visible:ring-0\",\n SIZE_MIN_HEIGHT[size],\n resize === \"none\" && \"resize-none\",\n resize === \"vertical\" && \"resize-y\"\n )}\n value={value}\n onBlur={handleBlur}\n onChange={handleChange}\n {...(isMaxLengthPresent && !unlimitedChars ? { maxLength } : {})}\n {...otherProps}\n />\n {suffix && (\n <div className=\"shrink-0 pt-0.5 text-muted-foreground\">{suffix}</div>\n )}\n </div>\n ) : (\n textareaElement\n );\n\n if (!hasField) {\n return <div className={cn(className)}>{textareaWithAffixes}</div>;\n }\n\n return (\n <Field\n data-disabled={disabled || undefined}\n data-invalid={!!error || undefined}\n className={className}\n >\n {(label || isCharacterLimitVisible) && (\n <div className=\"flex items-center justify-between\">\n {label && (\n <FieldLabel htmlFor={id} {...labelProps}>\n {label}\n {required && (\n <span aria-hidden=\"true\" className=\"text-destructive\">\n *\n </span>\n )}\n </FieldLabel>\n )}\n {isCharacterLimitVisible && (\n <span\n className={cn(\n \"text-xs tabular-nums\",\n maxLengthError ? \"text-destructive\" : \"text-muted-foreground\"\n )}\n >\n {valueLength}/{maxLength}\n </span>\n )}\n </div>\n )}\n <FieldContent>\n {textareaWithAffixes}\n {!!error && <FieldError id={errorId}>{error}</FieldError>}\n {helpText && (\n <FieldDescription id={helpTextId}>{helpText}</FieldDescription>\n )}\n </FieldContent>\n </Field>\n );\n }\n);\n\nTextarea.displayName = \"Textarea\";\n\nexport { Textarea };\n"],"names":["_jsx","PrimitiveTextarea","_jsxs"],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface ToastrConfig {
|
|
2
|
+
/** Label for an action button inside the toast. */
|
|
3
|
+
buttonLabel?: string;
|
|
4
|
+
/** Callback when the action button is clicked. */
|
|
5
|
+
onClick?: () => void;
|
|
6
|
+
/** Whether to show the type icon in the toast. */
|
|
7
|
+
showIcon?: boolean;
|
|
8
|
+
/** Additional sonner toast options (duration, position, dismissible, etc.). */
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
}
|
|
11
|
+
type ToastrMessage = string | {
|
|
12
|
+
noticeCode?: string;
|
|
13
|
+
customMessage?: string;
|
|
14
|
+
notice?: string;
|
|
15
|
+
};
|
|
16
|
+
type ToastrErrorInput = string | Error | {
|
|
17
|
+
response?: {
|
|
18
|
+
data?: Record<string, unknown>;
|
|
19
|
+
};
|
|
20
|
+
message?: string;
|
|
21
|
+
isAxiosError?: boolean;
|
|
22
|
+
} | ToastrMessage;
|
|
23
|
+
declare const Toastr: {
|
|
24
|
+
success(message: ToastrMessage, ...args: unknown[]): string | number | undefined;
|
|
25
|
+
info(message: ToastrMessage, ...args: unknown[]): string | number | undefined;
|
|
26
|
+
show(message: ToastrMessage, ...args: unknown[]): string | number | undefined;
|
|
27
|
+
warning(message: ToastrMessage, ...args: unknown[]): string | number | undefined;
|
|
28
|
+
error(errorObject: ToastrErrorInput, ...args: unknown[]): string | number | undefined;
|
|
29
|
+
};
|
|
30
|
+
export { Toastr };
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { t as toast } from '../index-D_roZz8G.js';
|
|
2
|
+
import 'react';
|
|
3
|
+
import 'react-dom';
|
|
4
|
+
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Dedup set — prevents showing the same toast twice simultaneously
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
const activeToasts = new Set();
|
|
9
|
+
function toastKey(type, message, buttonLabel) {
|
|
10
|
+
return `${type}::${message}::${buttonLabel ?? ""}`;
|
|
11
|
+
}
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// RTL detection
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
function getContentDir() {
|
|
16
|
+
if (typeof document === "undefined")
|
|
17
|
+
return "ltr";
|
|
18
|
+
return (document.documentElement.getAttribute("dir") ??
|
|
19
|
+
document.body.getAttribute("dir") ??
|
|
20
|
+
"ltr");
|
|
21
|
+
}
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// Message parsing
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
function resolveMessage(message) {
|
|
26
|
+
if (typeof message === "string")
|
|
27
|
+
return message;
|
|
28
|
+
if (message && typeof message === "object") {
|
|
29
|
+
if (message.customMessage)
|
|
30
|
+
return message.customMessage;
|
|
31
|
+
if (message.notice)
|
|
32
|
+
return message.notice;
|
|
33
|
+
if (message.noticeCode)
|
|
34
|
+
return message.noticeCode;
|
|
35
|
+
}
|
|
36
|
+
return String(message);
|
|
37
|
+
}
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// Error parsing (mirrors neeto-ui behavior)
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
function resolveErrorMessage(errorObject) {
|
|
42
|
+
if (typeof errorObject === "string")
|
|
43
|
+
return errorObject;
|
|
44
|
+
if (errorObject && typeof errorObject === "object") {
|
|
45
|
+
// Axios-style error
|
|
46
|
+
const axiosLike = errorObject;
|
|
47
|
+
if (axiosLike.response?.data) {
|
|
48
|
+
const data = axiosLike.response.data;
|
|
49
|
+
if (data.customMessage)
|
|
50
|
+
return String(data.customMessage);
|
|
51
|
+
if (data.error)
|
|
52
|
+
return String(data.error);
|
|
53
|
+
if (Array.isArray(data.errors))
|
|
54
|
+
return data.errors.join("\n");
|
|
55
|
+
if (data.noticeCode)
|
|
56
|
+
return String(data.noticeCode);
|
|
57
|
+
}
|
|
58
|
+
if (axiosLike.isAxiosError && axiosLike.message)
|
|
59
|
+
return axiosLike.message;
|
|
60
|
+
// Native Error
|
|
61
|
+
if (errorObject instanceof Error)
|
|
62
|
+
return errorObject.message;
|
|
63
|
+
// ToastrMessage object
|
|
64
|
+
return resolveMessage(errorObject);
|
|
65
|
+
}
|
|
66
|
+
return "Something went wrong.";
|
|
67
|
+
}
|
|
68
|
+
function showToast(type, message, config) {
|
|
69
|
+
const { buttonLabel, onClick, showIcon, ...restConfig } = config ?? {};
|
|
70
|
+
const key = toastKey(type, message, buttonLabel);
|
|
71
|
+
if (activeToasts.has(key))
|
|
72
|
+
return undefined;
|
|
73
|
+
activeToasts.add(key);
|
|
74
|
+
const options = {
|
|
75
|
+
onDismiss: () => activeToasts.delete(key),
|
|
76
|
+
onAutoClose: () => activeToasts.delete(key),
|
|
77
|
+
position: getContentDir() === "rtl" ? "bottom-right" : "bottom-left",
|
|
78
|
+
...restConfig,
|
|
79
|
+
};
|
|
80
|
+
if (buttonLabel) {
|
|
81
|
+
options.action = {
|
|
82
|
+
label: buttonLabel,
|
|
83
|
+
onClick: onClick ?? (() => { }),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// When showIcon is explicitly false, hide the type icon
|
|
87
|
+
if (showIcon === false) {
|
|
88
|
+
options.icon = null;
|
|
89
|
+
}
|
|
90
|
+
return toast[type](message, options);
|
|
91
|
+
}
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
// Public API (matches neeto-ui Toastr interface)
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
function parseConfig(args) {
|
|
96
|
+
if (args.length === 0)
|
|
97
|
+
return {};
|
|
98
|
+
const first = args[0];
|
|
99
|
+
if (typeof first === "object" && first !== null && !Array.isArray(first)) {
|
|
100
|
+
return first;
|
|
101
|
+
}
|
|
102
|
+
// Legacy positional args: buttonLabel, onClick, customConfig, showIcon
|
|
103
|
+
const [buttonLabel, onClick, customConfig, showIcon] = args;
|
|
104
|
+
return {
|
|
105
|
+
...(buttonLabel ? { buttonLabel } : {}),
|
|
106
|
+
...(onClick ? { onClick } : {}),
|
|
107
|
+
...(showIcon !== undefined ? { showIcon } : {}),
|
|
108
|
+
...(customConfig ?? {}),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
const Toastr = {
|
|
112
|
+
success(message, ...args) {
|
|
113
|
+
return showToast("success", resolveMessage(message), parseConfig(args));
|
|
114
|
+
},
|
|
115
|
+
info(message, ...args) {
|
|
116
|
+
return showToast("info", resolveMessage(message), parseConfig(args));
|
|
117
|
+
},
|
|
118
|
+
show(message, ...args) {
|
|
119
|
+
return showToast("info", resolveMessage(message), parseConfig(args));
|
|
120
|
+
},
|
|
121
|
+
warning(message, ...args) {
|
|
122
|
+
return showToast("warning", resolveMessage(message), parseConfig(args));
|
|
123
|
+
},
|
|
124
|
+
error(errorObject, ...args) {
|
|
125
|
+
const msg = resolveErrorMessage(errorObject);
|
|
126
|
+
return showToast("error", msg, parseConfig(args));
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
export { Toastr };
|
|
131
|
+
//# sourceMappingURL=Toastr.js.map
|