@jbpark/ui-kit 10.3.0 → 10.4.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/README.ko.md +97 -76
- package/README.md +91 -70
- package/dist/AutoComplete.mjs +1 -1
- package/dist/Breadcrumb.mjs +1 -1
- package/dist/Cascader.mjs +2 -2
- package/dist/Checkbox.d.mts +10 -0
- package/dist/Checkbox.d.mts.map +1 -0
- package/dist/Checkbox.mjs +9 -0
- package/dist/Checkbox.mjs.map +1 -0
- package/dist/CodeEditor.d.mts +8 -2
- package/dist/CodeEditor.d.mts.map +1 -1
- package/dist/CodeEditor.mjs +9 -4
- package/dist/CodeEditor.mjs.map +1 -1
- package/dist/{components/molecules/collapse.d.mts → Collapse.d.mts} +1 -1
- package/dist/Collapse.d.mts.map +1 -0
- package/dist/{components/molecules/collapse.mjs → Collapse.mjs} +3 -3
- package/dist/Collapse.mjs.map +1 -0
- package/dist/{components/atoms/color-picker.d.mts → ColorPicker.d.mts} +1 -1
- package/dist/ColorPicker.d.mts.map +1 -0
- package/dist/{components/atoms/color-picker.mjs → ColorPicker.mjs} +3 -3
- package/dist/ColorPicker.mjs.map +1 -0
- package/dist/{components/templates/container.d.mts → Container.d.mts} +1 -1
- package/dist/Container.d.mts.map +1 -0
- package/dist/{components/templates/container.mjs → Container.mjs} +2 -2
- package/dist/Container.mjs.map +1 -0
- package/dist/{components/atoms/date-picker.d.mts → DatePicker.d.mts} +1 -1
- package/dist/DatePicker.d.mts.map +1 -0
- package/dist/{components/atoms/date-picker.mjs → DatePicker.mjs} +6 -6
- package/dist/DatePicker.mjs.map +1 -0
- package/dist/{components/organisms/drawer.d.mts → Drawer.d.mts} +1 -1
- package/dist/Drawer.d.mts.map +1 -0
- package/dist/{components/organisms/drawer.mjs → Drawer.mjs} +5 -5
- package/dist/Drawer.mjs.map +1 -0
- package/dist/{components/molecules/dropdown.d.mts → Dropdown.d.mts} +2 -2
- package/dist/Dropdown.d.mts.map +1 -0
- package/dist/{components/molecules/dropdown.mjs → Dropdown.mjs} +4 -4
- package/dist/Dropdown.mjs.map +1 -0
- package/dist/{components/templates/empty.d.mts → Empty.d.mts} +2 -2
- package/dist/Empty.d.mts.map +1 -0
- package/dist/{components/templates/empty.mjs → Empty.mjs} +3 -3
- package/dist/Empty.mjs.map +1 -0
- package/dist/FloatButton.d.mts +10 -0
- package/dist/FloatButton.d.mts.map +1 -0
- package/dist/FloatButton.mjs +9 -0
- package/dist/FloatButton.mjs.map +1 -0
- package/dist/Input.d.mts +16 -0
- package/dist/Input.d.mts.map +1 -0
- package/dist/Input.mjs +15 -0
- package/dist/Input.mjs.map +1 -0
- package/dist/{components/organisms/list/index.d.mts → List.d.mts} +3 -3
- package/dist/List.d.mts.map +1 -0
- package/dist/List.mjs +9 -0
- package/dist/List.mjs.map +1 -0
- package/dist/Marquees.d.mts +10 -0
- package/dist/Marquees.d.mts.map +1 -0
- package/dist/Marquees.mjs +9 -0
- package/dist/Marquees.mjs.map +1 -0
- package/dist/Mentions.d.mts.map +1 -1
- package/dist/Mentions.mjs +8 -7
- package/dist/Mentions.mjs.map +1 -1
- package/dist/{components/organisms/modal.d.mts → Modal.d.mts} +1 -1
- package/dist/Modal.d.mts.map +1 -0
- package/dist/{components/organisms/modal.mjs → Modal.mjs} +6 -6
- package/dist/Modal.mjs.map +1 -0
- package/dist/{components/templates/page-header.d.mts → PageHeader.d.mts} +1 -1
- package/dist/PageHeader.d.mts.map +1 -0
- package/dist/{components/templates/page-header.mjs → PageHeader.mjs} +4 -4
- package/dist/PageHeader.mjs.map +1 -0
- package/dist/Pagination.mjs +2 -2
- package/dist/Popconfirm.d.mts +1 -1
- package/dist/Popconfirm.mjs +1 -1
- package/dist/{components/atoms/popover.d.mts → Popover.d.mts} +1 -1
- package/dist/Popover.d.mts.map +1 -0
- package/dist/{components/atoms/popover.mjs → Popover.mjs} +4 -4
- package/dist/Popover.mjs.map +1 -0
- package/dist/{components/atoms/progress.d.mts → Progress.d.mts} +1 -1
- package/dist/Progress.d.mts.map +1 -0
- package/dist/{components/atoms/progress.mjs → Progress.mjs} +3 -3
- package/dist/Progress.mjs.map +1 -0
- package/dist/Radio.d.mts +10 -0
- package/dist/Radio.d.mts.map +1 -0
- package/dist/Radio.mjs +9 -0
- package/dist/Radio.mjs.map +1 -0
- package/dist/{components/templates/result.d.mts → Result.d.mts} +1 -1
- package/dist/Result.d.mts.map +1 -0
- package/dist/{components/templates/result.mjs → Result.mjs} +2 -2
- package/dist/Result.mjs.map +1 -0
- package/dist/RichTextEditor.d.mts +3 -0
- package/dist/RichTextEditor.mjs +1 -0
- package/dist/{components/atoms/select.d.mts → Select.d.mts} +5 -5
- package/dist/Select.d.mts.map +1 -0
- package/dist/{components/atoms/select.mjs → Select.mjs} +5 -5
- package/dist/Select.mjs.map +1 -0
- package/dist/Skeleton.d.mts +12 -0
- package/dist/Skeleton.d.mts.map +1 -0
- package/dist/Skeleton.mjs +11 -0
- package/dist/Skeleton.mjs.map +1 -0
- package/dist/Slider.d.mts +2 -0
- package/dist/{components/atoms/slider/index.mjs → Slider.mjs} +2 -2
- package/dist/Slider.mjs.map +1 -0
- package/dist/Space.d.mts +3 -2
- package/dist/Space.d.mts.map +1 -1
- package/dist/Space.mjs +13 -4
- package/dist/Space.mjs.map +1 -1
- package/dist/{components/atoms/spin.d.mts → Spin.d.mts} +1 -1
- package/dist/Spin.d.mts.map +1 -0
- package/dist/{components/atoms/spin.mjs → Spin.mjs} +3 -3
- package/dist/Spin.mjs.map +1 -0
- package/dist/Splitter.d.mts +10 -0
- package/dist/Splitter.d.mts.map +1 -0
- package/dist/Splitter.mjs +9 -0
- package/dist/Splitter.mjs.map +1 -0
- package/dist/Statistic.mjs +1 -1
- package/dist/Swiper.d.mts +10 -0
- package/dist/Swiper.d.mts.map +1 -0
- package/dist/Swiper.mjs +9 -0
- package/dist/Swiper.mjs.map +1 -0
- package/dist/{components/atoms/switch.d.mts → Switch.d.mts} +2 -2
- package/dist/Switch.d.mts.map +1 -0
- package/dist/{components/atoms/switch.mjs → Switch.mjs} +4 -4
- package/dist/Switch.mjs.map +1 -0
- package/dist/Table.mjs +2 -2
- package/dist/Table.mjs.map +1 -1
- package/dist/{components/molecules/tabs.d.mts → Tabs.d.mts} +3 -3
- package/dist/Tabs.d.mts.map +1 -0
- package/dist/{components/molecules/tabs.mjs → Tabs.mjs} +3 -3
- package/dist/Tabs.mjs.map +1 -0
- package/dist/TimePicker.mjs +1 -1
- package/dist/{components/organisms/toast.d.mts → Toast.d.mts} +12 -2
- package/dist/Toast.d.mts.map +1 -0
- package/dist/Toast.mjs +198 -0
- package/dist/Toast.mjs.map +1 -0
- package/dist/ToggleGroup.d.mts +28 -0
- package/dist/ToggleGroup.d.mts.map +1 -0
- package/dist/ToggleGroup.mjs +58 -0
- package/dist/ToggleGroup.mjs.map +1 -0
- package/dist/{components/atoms/tooltip.d.mts → Tooltip.d.mts} +1 -1
- package/dist/Tooltip.d.mts.map +1 -0
- package/dist/{components/atoms/tooltip.mjs → Tooltip.mjs} +2 -2
- package/dist/Tooltip.mjs.map +1 -0
- package/dist/Tour.d.mts.map +1 -1
- package/dist/Tour.mjs +47 -64
- package/dist/Tour.mjs.map +1 -1
- package/dist/Transfer.mjs +2 -2
- package/dist/Tree.mjs +1 -1
- package/dist/{components/molecules/upload.d.mts → Upload.d.mts} +1 -1
- package/dist/Upload.d.mts.map +1 -0
- package/dist/{components/molecules/upload.mjs → Upload.mjs} +7 -7
- package/dist/Upload.mjs.map +1 -0
- package/dist/components/atoms/index.d.mts +34 -27
- package/dist/components/atoms/input/input.d.mts +2 -1
- package/dist/components/atoms/input/input.d.mts.map +1 -1
- package/dist/components/atoms/input/input.mjs.map +1 -1
- package/dist/components/atoms/rich-text-editor/toolbar-presets.mjs +4 -4
- package/dist/components/atoms/select-multiple.mjs +1 -1
- package/dist/components/atoms/select-searchable.mjs +1 -1
- package/dist/components/molecules/index.d.mts +22 -21
- package/dist/components/organisms/form/control.mjs +1 -1
- package/dist/components/organisms/imperative-stack.mjs +16 -1
- package/dist/components/organisms/imperative-stack.mjs.map +1 -1
- package/dist/components/organisms/index.d.mts +15 -15
- package/dist/components/organisms/list/list.d.mts +1 -1
- package/dist/components/organisms/list/list.mjs +1 -1
- package/dist/components/organisms/swiper/swiper.d.mts +6 -0
- package/dist/components/organisms/swiper/swiper.d.mts.map +1 -1
- package/dist/components/organisms/swiper/swiper.mjs +1 -1
- package/dist/components/templates/index.d.mts +11 -12
- package/dist/components/templates/layout/sider.d.mts.map +1 -1
- package/dist/components/templates/layout/sider.mjs +4 -6
- package/dist/components/templates/layout/sider.mjs.map +1 -1
- package/dist/core/badge.d.mts +1 -1
- package/dist/core/button.d.mts +2 -2
- package/dist/index.d.mts +81 -74
- package/dist/index.mjs +31 -30
- package/dist/style.css +21 -0
- package/package.json +157 -2
- package/dist/components/atoms/checkbox/index.d.mts +0 -10
- package/dist/components/atoms/checkbox/index.d.mts.map +0 -1
- package/dist/components/atoms/checkbox/index.mjs +0 -9
- package/dist/components/atoms/checkbox/index.mjs.map +0 -1
- package/dist/components/atoms/color-picker.d.mts.map +0 -1
- package/dist/components/atoms/color-picker.mjs.map +0 -1
- package/dist/components/atoms/date-picker.d.mts.map +0 -1
- package/dist/components/atoms/date-picker.mjs.map +0 -1
- package/dist/components/atoms/float-button/index.d.mts +0 -10
- package/dist/components/atoms/float-button/index.d.mts.map +0 -1
- package/dist/components/atoms/float-button/index.mjs +0 -9
- package/dist/components/atoms/float-button/index.mjs.map +0 -1
- package/dist/components/atoms/input/index.d.mts +0 -16
- package/dist/components/atoms/input/index.d.mts.map +0 -1
- package/dist/components/atoms/input/index.mjs +0 -15
- package/dist/components/atoms/input/index.mjs.map +0 -1
- package/dist/components/atoms/popover.d.mts.map +0 -1
- package/dist/components/atoms/popover.mjs.map +0 -1
- package/dist/components/atoms/progress.d.mts.map +0 -1
- package/dist/components/atoms/progress.mjs.map +0 -1
- package/dist/components/atoms/radio/index.d.mts +0 -10
- package/dist/components/atoms/radio/index.d.mts.map +0 -1
- package/dist/components/atoms/radio/index.mjs +0 -9
- package/dist/components/atoms/radio/index.mjs.map +0 -1
- package/dist/components/atoms/rich-text-editor/index.d.mts +0 -3
- package/dist/components/atoms/select.d.mts.map +0 -1
- package/dist/components/atoms/select.mjs.map +0 -1
- package/dist/components/atoms/skeleton/index.d.mts +0 -12
- package/dist/components/atoms/skeleton/index.d.mts.map +0 -1
- package/dist/components/atoms/skeleton/index.mjs +0 -11
- package/dist/components/atoms/skeleton/index.mjs.map +0 -1
- package/dist/components/atoms/slider/index.mjs.map +0 -1
- package/dist/components/atoms/spin.d.mts.map +0 -1
- package/dist/components/atoms/spin.mjs.map +0 -1
- package/dist/components/atoms/switch.d.mts.map +0 -1
- package/dist/components/atoms/switch.mjs.map +0 -1
- package/dist/components/atoms/tooltip.d.mts.map +0 -1
- package/dist/components/atoms/tooltip.mjs.map +0 -1
- package/dist/components/molecules/collapse.d.mts.map +0 -1
- package/dist/components/molecules/collapse.mjs.map +0 -1
- package/dist/components/molecules/dropdown.d.mts.map +0 -1
- package/dist/components/molecules/dropdown.mjs.map +0 -1
- package/dist/components/molecules/marquees/index.d.mts +0 -10
- package/dist/components/molecules/marquees/index.d.mts.map +0 -1
- package/dist/components/molecules/marquees/index.mjs +0 -9
- package/dist/components/molecules/marquees/index.mjs.map +0 -1
- package/dist/components/molecules/splitter/index.d.mts +0 -10
- package/dist/components/molecules/splitter/index.d.mts.map +0 -1
- package/dist/components/molecules/splitter/index.mjs +0 -9
- package/dist/components/molecules/splitter/index.mjs.map +0 -1
- package/dist/components/molecules/tabs.d.mts.map +0 -1
- package/dist/components/molecules/tabs.mjs.map +0 -1
- package/dist/components/molecules/upload.d.mts.map +0 -1
- package/dist/components/molecules/upload.mjs.map +0 -1
- package/dist/components/organisms/drawer.d.mts.map +0 -1
- package/dist/components/organisms/drawer.mjs.map +0 -1
- package/dist/components/organisms/list/index.d.mts.map +0 -1
- package/dist/components/organisms/list/index.mjs +0 -9
- package/dist/components/organisms/list/index.mjs.map +0 -1
- package/dist/components/organisms/modal.d.mts.map +0 -1
- package/dist/components/organisms/modal.mjs.map +0 -1
- package/dist/components/organisms/swiper/index.d.mts +0 -10
- package/dist/components/organisms/swiper/index.d.mts.map +0 -1
- package/dist/components/organisms/swiper/index.mjs +0 -9
- package/dist/components/organisms/swiper/index.mjs.map +0 -1
- package/dist/components/organisms/toast.d.mts.map +0 -1
- package/dist/components/organisms/toast.mjs +0 -126
- package/dist/components/organisms/toast.mjs.map +0 -1
- package/dist/components/templates/container.d.mts.map +0 -1
- package/dist/components/templates/container.mjs.map +0 -1
- package/dist/components/templates/empty.d.mts.map +0 -1
- package/dist/components/templates/empty.mjs.map +0 -1
- package/dist/components/templates/page-header.d.mts.map +0 -1
- package/dist/components/templates/page-header.mjs.map +0 -1
- package/dist/components/templates/result.d.mts.map +0 -1
- package/dist/components/templates/result.mjs.map +0 -1
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "./utils.mjs";
|
|
3
|
+
import { useConfig } from "./providers/config/context.mjs";
|
|
4
|
+
import Button from "./Button.mjs";
|
|
5
|
+
import { useControllableState } from "@jbpark/use-hooks";
|
|
6
|
+
import { DirectionProvider } from "@base-ui/react/direction-provider";
|
|
7
|
+
import { jsx } from "react/jsx-runtime";
|
|
8
|
+
import { Toggle } from "@base-ui/react/toggle";
|
|
9
|
+
import { ToggleGroup as ToggleGroup$1 } from "@base-ui/react/toggle-group";
|
|
10
|
+
//#region src/components/atoms/toggle-group.tsx
|
|
11
|
+
const ToggleGroup = ({ options, value, defaultValue = [], onChange, size, disabled, orientation = "horizontal", dir, className, classNames, ...props }) => {
|
|
12
|
+
const { componentSize, direction } = useConfig();
|
|
13
|
+
const [pressed, setPressed] = useControllableState({
|
|
14
|
+
value,
|
|
15
|
+
defaultValue,
|
|
16
|
+
onChange: (values) => onChange?.([...values])
|
|
17
|
+
});
|
|
18
|
+
const resolvedSize = size ?? componentSize ?? "middle";
|
|
19
|
+
const resolvedDirection = dir ?? direction;
|
|
20
|
+
const pressedSet = new Set(pressed);
|
|
21
|
+
const optionValues = new Set(options.map((option) => option.value));
|
|
22
|
+
const handleValueChange = (values) => {
|
|
23
|
+
const next = new Set(values);
|
|
24
|
+
setPressed([...options.filter((option) => next.has(option.value)).map((option) => option.value), ...[...new Set(pressed)].filter((item) => !optionValues.has(item))]);
|
|
25
|
+
};
|
|
26
|
+
return /* @__PURE__ */ jsx(DirectionProvider, {
|
|
27
|
+
direction: resolvedDirection,
|
|
28
|
+
children: /* @__PURE__ */ jsx(ToggleGroup$1, {
|
|
29
|
+
...props,
|
|
30
|
+
"data-slot": "toggle-group",
|
|
31
|
+
dir: resolvedDirection,
|
|
32
|
+
multiple: true,
|
|
33
|
+
disabled,
|
|
34
|
+
orientation,
|
|
35
|
+
value: [...pressedSet],
|
|
36
|
+
onValueChange: handleValueChange,
|
|
37
|
+
className: cn("inline-flex w-fit gap-1 data-[orientation=vertical]:flex-col", className),
|
|
38
|
+
children: options.map((option) => /* @__PURE__ */ jsx(Toggle, {
|
|
39
|
+
value: option.value,
|
|
40
|
+
disabled: option.disabled,
|
|
41
|
+
"aria-label": option.iconOnly ? option.label : void 0,
|
|
42
|
+
render: /* @__PURE__ */ jsx(Button, {
|
|
43
|
+
variant: "text",
|
|
44
|
+
size: resolvedSize,
|
|
45
|
+
shape: option.iconOnly ? "circle" : "default",
|
|
46
|
+
icon: option.icon
|
|
47
|
+
}),
|
|
48
|
+
className: cn(`data-pressed:bg-accent data-pressed:text-accent-foreground
|
|
49
|
+
aria-disabled:cursor-not-allowed`, classNames?.item, pressedSet.has(option.value) && classNames?.pressedItem),
|
|
50
|
+
children: option.iconOnly ? null : option.label
|
|
51
|
+
}, option.value))
|
|
52
|
+
})
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
//#endregion
|
|
56
|
+
export { ToggleGroup as default };
|
|
57
|
+
|
|
58
|
+
//# sourceMappingURL=ToggleGroup.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToggleGroup.mjs","names":["ToggleGroupPrimitive"],"sources":["../src/components/atoms/toggle-group.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\n\nimport { DirectionProvider } from '@base-ui/react/direction-provider';\nimport { Toggle } from '@base-ui/react/toggle';\nimport { ToggleGroup as ToggleGroupPrimitive } from '@base-ui/react/toggle-group';\nimport { useControllableState } from '@jbpark/use-hooks';\n\nimport { type ComponentSize, useConfig } from '@repo/ui/providers';\nimport { cn } from '@repo/ui/utils';\n\nimport Button from './button';\n\nexport interface Option {\n value: string;\n label: string;\n icon?: ReactNode;\n disabled?: boolean;\n // Shows only the icon; the label stays the button's accessible name.\n iconOnly?: boolean;\n}\n\nexport interface Props extends Omit<\n ToggleGroupPrimitive.Props,\n | 'children'\n | 'value'\n | 'defaultValue'\n | 'onValueChange'\n | 'multiple'\n | 'className'\n | 'onChange'\n | 'dir'\n> {\n options: readonly Option[];\n value?: readonly string[];\n defaultValue?: readonly string[];\n // Receives pressed values in option order, followed by supplied values that\n // match no option.\n onChange?: (values: string[]) => void;\n size?: ComponentSize;\n dir?: 'ltr' | 'rtl';\n className?: string;\n classNames?: {\n item?: string;\n pressedItem?: string;\n };\n}\n\nconst ToggleGroup = ({\n options,\n value,\n defaultValue = [],\n onChange,\n size,\n disabled,\n orientation = 'horizontal',\n dir,\n className,\n classNames,\n ...props\n}: Props) => {\n const { componentSize, direction } = useConfig();\n const [pressed, setPressed] = useControllableState<readonly string[]>({\n value,\n defaultValue,\n onChange: values => onChange?.([...values]),\n });\n\n const resolvedSize = size ?? componentSize ?? 'middle';\n const resolvedDirection = dir ?? direction;\n const pressedSet = new Set(pressed);\n const optionValues = new Set(options.map(option => option.value));\n\n const handleValueChange = (values: string[]) => {\n const next = new Set(values);\n\n setPressed([\n ...options\n .filter(option => next.has(option.value))\n .map(option => option.value),\n ...[...new Set(pressed)].filter(item => !optionValues.has(item)),\n ]);\n };\n\n return (\n <DirectionProvider direction={resolvedDirection}>\n <ToggleGroupPrimitive\n {...props}\n data-slot=\"toggle-group\"\n dir={resolvedDirection}\n multiple\n disabled={disabled}\n orientation={orientation}\n value={[...pressedSet]}\n onValueChange={handleValueChange}\n className={cn(\n 'inline-flex w-fit gap-1 data-[orientation=vertical]:flex-col',\n className, //\n )}\n >\n {options.map(option => (\n <Toggle\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n aria-label={option.iconOnly ? option.label : undefined}\n render={\n <Button\n variant=\"text\"\n size={resolvedSize}\n shape={option.iconOnly ? 'circle' : 'default'}\n icon={option.icon}\n />\n }\n className={cn(\n `data-pressed:bg-accent data-pressed:text-accent-foreground\n aria-disabled:cursor-not-allowed`,\n classNames?.item,\n pressedSet.has(option.value) && classNames?.pressedItem,\n //\n )}\n >\n {option.iconOnly ? null : option.label}\n </Toggle>\n ))}\n </ToggleGroupPrimitive>\n </DirectionProvider>\n );\n};\n\nexport default ToggleGroup;\n"],"mappings":";;;;;;;;;;AAiDA,MAAM,eAAe,EACnB,SACA,OACA,eAAe,CAAC,GAChB,UACA,MACA,UACA,cAAc,cACd,KACA,WACA,YACA,GAAG,YACQ;CACX,MAAM,EAAE,eAAe,cAAc,UAAU;CAC/C,MAAM,CAAC,SAAS,cAAc,qBAAwC;EACpE;EACA;EACA,WAAU,WAAU,WAAW,CAAC,GAAG,MAAM,CAAC;CAC5C,CAAC;CAED,MAAM,eAAe,QAAQ,iBAAiB;CAC9C,MAAM,oBAAoB,OAAO;CACjC,MAAM,aAAa,IAAI,IAAI,OAAO;CAClC,MAAM,eAAe,IAAI,IAAI,QAAQ,KAAI,WAAU,OAAO,KAAK,CAAC;CAEhE,MAAM,qBAAqB,WAAqB;EAC9C,MAAM,OAAO,IAAI,IAAI,MAAM;EAE3B,WAAW,CACT,GAAG,QACA,QAAO,WAAU,KAAK,IAAI,OAAO,KAAK,CAAC,CAAC,CACxC,KAAI,WAAU,OAAO,KAAK,GAC7B,GAAG,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,QAAO,SAAQ,CAAC,aAAa,IAAI,IAAI,CAAC,CACjE,CAAC;CACH;CAEA,OACE,oBAAC,mBAAD;EAAmB,WAAW;EAC5B,UAAA,oBAACA,eAAD;GACE,GAAI;GACJ,aAAU;GACV,KAAK;GACL,UAAA;GACU;GACG;GACb,OAAO,CAAC,GAAG,UAAU;GACrB,eAAe;GACf,WAAW,GACT,gEACA,SACF;GAEC,UAAA,QAAQ,KAAI,WACX,oBAAC,QAAD;IAEE,OAAO,OAAO;IACd,UAAU,OAAO;IACjB,cAAY,OAAO,WAAW,OAAO,QAAQ,KAAA;IAC7C,QACE,oBAAC,QAAD;KACE,SAAQ;KACR,MAAM;KACN,OAAO,OAAO,WAAW,WAAW;KACpC,MAAM,OAAO;IACd,CAAA;IAEH,WAAW,GACT;iDAEA,YAAY,MACZ,WAAW,IAAI,OAAO,KAAK,KAAK,YAAY,WAE9C;IAEC,UAAA,OAAO,WAAW,OAAO,OAAO;GAC3B,GArBD,OAAO,KAqBN,CACT;EACmB,CAAA;CACL,CAAA;AAEvB"}
|
|
@@ -18,4 +18,4 @@ export interface Props extends Omit<React.ComponentProps<typeof Core>, 'children
|
|
|
18
18
|
declare const Tooltip: ({ children, content, className, placement, offset, delay, closeDelay, ...props }: Props) => import("react").JSX.Element;
|
|
19
19
|
//#endregion
|
|
20
20
|
export { Tooltip as default };
|
|
21
|
-
//# sourceMappingURL=
|
|
21
|
+
//# sourceMappingURL=Tooltip.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tooltip.d.mts","names":[],"sources":["../src/components/atoms/tooltip.tsx"],"mappings":";;cAMiB,OAAI,SAAA,gCAAA,YAAA,MAAA,aAAA,MAAA,IAAA;KAEhB;iBAgCY,cAAc,KAC7B,MAAM,sBAAsB;EAG5B,UAAU;;EAEV,SAAS;;EAET;EACA,YAAY;;EAEZ;;EAEA;EACA;;cAGI,YAAW,UAAA,SAAA,WAAA,WAAA,QAAA,OAAA,eAAA,SASd,0BAAK,IAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { tooltip_exports } from "
|
|
2
|
+
import { tooltip_exports } from "./core/tooltip.mjs";
|
|
3
3
|
import { Children } from "react";
|
|
4
4
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
5
|
//#region src/components/atoms/tooltip.tsx
|
|
@@ -75,4 +75,4 @@ const Tooltip = ({ children, content, className, placement = "top", offset = 8,
|
|
|
75
75
|
//#endregion
|
|
76
76
|
export { Tooltip as default };
|
|
77
77
|
|
|
78
|
-
//# sourceMappingURL=
|
|
78
|
+
//# sourceMappingURL=Tooltip.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tooltip.mjs","names":["tooltip"],"sources":["../src/components/atoms/tooltip.tsx"],"sourcesContent":["'use client';\n\nimport { Children, type ReactElement, type ReactNode } from 'react';\n\nimport { tooltip } from '../../core';\n\nconst { Tooltip: Core, TooltipContent, TooltipTrigger } = tooltip;\n\ntype Placement =\n | 'top'\n | 'left'\n | 'right'\n | 'bottom'\n | 'topLeft'\n | 'topRight'\n | 'bottomLeft'\n | 'bottomRight'\n | 'leftTop'\n | 'leftBottom'\n | 'rightTop'\n | 'rightBottom';\n\ntype Side = NonNullable<React.ComponentProps<typeof TooltipContent>['side']>;\ntype Align = NonNullable<React.ComponentProps<typeof TooltipContent>['align']>;\n\nconst placementMap: Record<Placement, { side: Side; align: Align }> = {\n top: { side: 'top', align: 'center' },\n left: { side: 'left', align: 'center' },\n right: { side: 'right', align: 'center' },\n bottom: { side: 'bottom', align: 'center' },\n topLeft: { side: 'top', align: 'start' },\n topRight: { side: 'top', align: 'end' },\n bottomLeft: { side: 'bottom', align: 'start' },\n bottomRight: { side: 'bottom', align: 'end' },\n leftTop: { side: 'left', align: 'start' },\n leftBottom: { side: 'left', align: 'end' },\n rightTop: { side: 'right', align: 'start' },\n rightBottom: { side: 'right', align: 'end' },\n};\n\nexport interface Props extends Omit<\n React.ComponentProps<typeof Core>,\n 'children' | 'handle' | 'triggerId' | 'defaultTriggerId'\n> {\n children: ReactElement;\n /** Supplementary visual hint; keep essential information visible elsewhere. */\n content: ReactNode;\n /** Popup class; the child retains its own className. */\n className?: string;\n placement?: Placement;\n /** Distance between the trigger and popup in pixels. */\n offset?: number;\n /** Hover delay in milliseconds. Keyboard focus opens without this delay. */\n delay?: number;\n closeDelay?: number;\n}\n\nconst Tooltip = ({\n children,\n content,\n className,\n placement = 'top',\n offset = 8,\n delay,\n closeDelay,\n ...props\n}: Props) => {\n const trigger = Children.only(children);\n const { side, align } = placementMap[placement];\n\n return (\n <Core {...props}>\n <TooltipTrigger render={trigger} delay={delay} closeDelay={closeDelay} />\n <TooltipContent\n side={side}\n align={align}\n sideOffset={offset}\n className={className}\n >\n {content}\n </TooltipContent>\n </Core>\n );\n};\n\nexport default Tooltip;\n"],"mappings":";;;;;AAMA,MAAM,EAAE,SAAS,MAAM,gBAAgB,mBAAmBA;AAmB1D,MAAM,eAAgE;CACpE,KAAK;EAAE,MAAM;EAAO,OAAO;CAAS;CACpC,MAAM;EAAE,MAAM;EAAQ,OAAO;CAAS;CACtC,OAAO;EAAE,MAAM;EAAS,OAAO;CAAS;CACxC,QAAQ;EAAE,MAAM;EAAU,OAAO;CAAS;CAC1C,SAAS;EAAE,MAAM;EAAO,OAAO;CAAQ;CACvC,UAAU;EAAE,MAAM;EAAO,OAAO;CAAM;CACtC,YAAY;EAAE,MAAM;EAAU,OAAO;CAAQ;CAC7C,aAAa;EAAE,MAAM;EAAU,OAAO;CAAM;CAC5C,SAAS;EAAE,MAAM;EAAQ,OAAO;CAAQ;CACxC,YAAY;EAAE,MAAM;EAAQ,OAAO;CAAM;CACzC,UAAU;EAAE,MAAM;EAAS,OAAO;CAAQ;CAC1C,aAAa;EAAE,MAAM;EAAS,OAAO;CAAM;AAC7C;AAmBA,MAAM,WAAW,EACf,UACA,SACA,WACA,YAAY,OACZ,SAAS,GACT,OACA,YACA,GAAG,YACQ;CACX,MAAM,UAAU,SAAS,KAAK,QAAQ;CACtC,MAAM,EAAE,MAAM,UAAU,aAAa;CAErC,OACE,qBAAC,MAAD;EAAM,GAAI;EAAV,UAAA,CACE,oBAAC,gBAAD;GAAgB,QAAQ;GAAgB;GAAmB;EAAa,CAAA,GACxE,oBAAC,gBAAD;GACQ;GACC;GACP,YAAY;GACD;GAEV,UAAA;EACa,CAAA,CACZ;;AAEV"}
|
package/dist/Tour.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tour.d.mts","names":[],"sources":["../src/components/organisms/tour.tsx"],"mappings":";;iBAmBiB;EACf;EACA,OAAO;EACP,cAAc;;EAEd,eAAe;EACf;;iBAGe,cAAc,KAC7B;EAGA,gBAAgB;EAChB;EACA;EACA,gBAAgB;EAChB;EACA;EACA,YAAY;EACZ;EACA;EACA;EACA;EACA;EACA;EACA;EACA,kBAAkB,iBAAiB;EACnC;IACE;IACA;IACA;IACA;;;
|
|
1
|
+
{"version":3,"file":"Tour.d.mts","names":[],"sources":["../src/components/organisms/tour.tsx"],"mappings":";;iBAmBiB;EACf;EACA,OAAO;EACP,cAAc;;EAEd,eAAe;EACf;;iBAGe,cAAc,KAC7B;EAGA,gBAAgB;EAChB;EACA;EACA,gBAAgB;EAChB;EACA;EACA,YAAY;EACZ;EACA;EACA;EACA;EACA;EACA;EACA;EACA,kBAAkB,iBAAiB;EACnC;IACE;IACA;IACA;IACA;;;cA6DE,SAAQ,OAAA,MAAA,UAAA,aAAA,cAAA,SAAA,aAAA,gBAAA,UAAA,SAAA,UAAA,gBAAA,eAAA,WAAA,aAAA,YAAA,gBAAA,WAAA,eAAA,SAmBX,0BAAK,IAAA"}
|
package/dist/Tour.mjs
CHANGED
|
@@ -5,9 +5,45 @@ import { OVERLAY_LAYER } from "./lib/z-layers.mjs";
|
|
|
5
5
|
import Button from "./Button.mjs";
|
|
6
6
|
import { Popover, PopoverArrow, PopoverBackdrop, PopoverClose, PopoverContent, PopoverDescription, PopoverPortal, PopoverTitle } from "./core/popover.mjs";
|
|
7
7
|
import { useEffect, useMemo, useState } from "react";
|
|
8
|
-
import { useControllableState } from "@jbpark/use-hooks";
|
|
8
|
+
import { useControllableState, useElementPosition } from "@jbpark/use-hooks";
|
|
9
9
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
10
|
//#region src/components/organisms/tour.tsx
|
|
11
|
+
const TARGET_MUTATION = {
|
|
12
|
+
attributes: true,
|
|
13
|
+
attributeFilter: [
|
|
14
|
+
"hidden",
|
|
15
|
+
"style",
|
|
16
|
+
"class"
|
|
17
|
+
]
|
|
18
|
+
};
|
|
19
|
+
const measureVisible = (element) => element.isConnected && element.getClientRects().length > 0 && getComputedStyle(element).visibility !== "hidden" ? element.getBoundingClientRect() : null;
|
|
20
|
+
const StepTarget = ({ index, step, scrollIntoView, onMeasure }) => {
|
|
21
|
+
const { rect, element } = useElementPosition(() => step.target?.() ?? null, {
|
|
22
|
+
withElement: true,
|
|
23
|
+
measure: measureVisible,
|
|
24
|
+
mutation: TARGET_MUTATION
|
|
25
|
+
});
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
if (element && scrollIntoView) element.scrollIntoView({
|
|
28
|
+
block: "center",
|
|
29
|
+
inline: "nearest",
|
|
30
|
+
behavior: "instant"
|
|
31
|
+
});
|
|
32
|
+
}, [element, scrollIntoView]);
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
onMeasure({
|
|
35
|
+
index,
|
|
36
|
+
target: element,
|
|
37
|
+
rect
|
|
38
|
+
});
|
|
39
|
+
}, [
|
|
40
|
+
onMeasure,
|
|
41
|
+
index,
|
|
42
|
+
element,
|
|
43
|
+
rect
|
|
44
|
+
]);
|
|
45
|
+
return null;
|
|
46
|
+
};
|
|
11
47
|
const defaultFormatProgress = (current, total) => `Step ${current} of ${total}`;
|
|
12
48
|
const Tour = ({ steps, open: openProp, defaultOpen = false, onOpenChange, current: currentProp, defaultCurrent = 0, onChange, onClose, onFinish, scrollIntoView = true, previousLabel = "Previous", nextLabel = "Next", finishLabel = "Finish", closeLabel = "Close tour", formatProgress = defaultFormatProgress, className, classNames, ...props }) => {
|
|
13
49
|
const { getContainer, direction } = useConfig();
|
|
@@ -24,76 +60,23 @@ const Tour = ({ steps, open: openProp, defaultOpen = false, onOpenChange, curren
|
|
|
24
60
|
const index = Number.isFinite(current) ? Math.max(0, Math.min(steps.length - 1, Math.floor(current))) : 0;
|
|
25
61
|
const step = steps[index];
|
|
26
62
|
const [measurement, setMeasurement] = useState(null);
|
|
27
|
-
const target = open && measurement && measurement.
|
|
28
|
-
const rect = open && measurement && measurement.
|
|
63
|
+
const target = open && measurement && measurement.index === index ? measurement.target : null;
|
|
64
|
+
const rect = open && measurement && measurement.index === index ? measurement.rect : null;
|
|
29
65
|
const fallback = useMemo(() => ({ getBoundingClientRect: () => new DOMRect(window.innerWidth / 2, window.innerHeight / 2, 0, 0) }), []);
|
|
30
|
-
useEffect(() => {
|
|
31
|
-
if (!open || !step) return;
|
|
32
|
-
let previous = null;
|
|
33
|
-
const update = () => {
|
|
34
|
-
const element = step.target?.() ?? null;
|
|
35
|
-
const resolved = !!element?.isConnected && element.getClientRects().length > 0 && getComputedStyle(element).visibility !== "hidden" ? element : null;
|
|
36
|
-
if (resolved !== previous) {
|
|
37
|
-
if (previous) resizeObserver.unobserve(previous);
|
|
38
|
-
if (resolved) {
|
|
39
|
-
resizeObserver.observe(resolved);
|
|
40
|
-
if (scrollIntoView) resolved.scrollIntoView({
|
|
41
|
-
block: "center",
|
|
42
|
-
inline: "nearest",
|
|
43
|
-
behavior: "instant"
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
previous = resolved;
|
|
48
|
-
const bounds = resolved?.getBoundingClientRect();
|
|
49
|
-
const next = bounds ? {
|
|
50
|
-
top: bounds.top,
|
|
51
|
-
left: bounds.left,
|
|
52
|
-
width: bounds.width,
|
|
53
|
-
height: bounds.height
|
|
54
|
-
} : null;
|
|
55
|
-
setMeasurement((existing) => existing?.step === step && existing.target === resolved && existing.rect?.top === next?.top && existing.rect?.left === next?.left && existing.rect?.width === next?.width && existing.rect?.height === next?.height ? existing : {
|
|
56
|
-
step,
|
|
57
|
-
target: resolved,
|
|
58
|
-
rect: next
|
|
59
|
-
});
|
|
60
|
-
};
|
|
61
|
-
const frame = requestAnimationFrame(update);
|
|
62
|
-
const observer = new MutationObserver(update);
|
|
63
|
-
observer.observe(document.body, {
|
|
64
|
-
childList: true,
|
|
65
|
-
subtree: true,
|
|
66
|
-
attributes: true,
|
|
67
|
-
attributeFilter: [
|
|
68
|
-
"hidden",
|
|
69
|
-
"style",
|
|
70
|
-
"class"
|
|
71
|
-
]
|
|
72
|
-
});
|
|
73
|
-
const resizeObserver = new ResizeObserver(update);
|
|
74
|
-
window.addEventListener("resize", update);
|
|
75
|
-
window.addEventListener("scroll", update, true);
|
|
76
|
-
return () => {
|
|
77
|
-
cancelAnimationFrame(frame);
|
|
78
|
-
observer.disconnect();
|
|
79
|
-
resizeObserver.disconnect();
|
|
80
|
-
window.removeEventListener("resize", update);
|
|
81
|
-
window.removeEventListener("scroll", update, true);
|
|
82
|
-
};
|
|
83
|
-
}, [
|
|
84
|
-
open,
|
|
85
|
-
step,
|
|
86
|
-
scrollIntoView
|
|
87
|
-
]);
|
|
88
66
|
const close = () => {
|
|
89
67
|
onClose?.();
|
|
90
68
|
setOpen(false);
|
|
91
69
|
};
|
|
92
|
-
return /* @__PURE__ */
|
|
70
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
93
71
|
...props,
|
|
94
72
|
"data-slot": "tour",
|
|
95
73
|
className: cn("contents", className),
|
|
96
|
-
children: /* @__PURE__ */
|
|
74
|
+
children: [open && step && /* @__PURE__ */ jsx(StepTarget, {
|
|
75
|
+
index,
|
|
76
|
+
step,
|
|
77
|
+
scrollIntoView,
|
|
78
|
+
onMeasure: setMeasurement
|
|
79
|
+
}, index), /* @__PURE__ */ jsxs(Popover, {
|
|
97
80
|
open: open && !!step,
|
|
98
81
|
modal: true,
|
|
99
82
|
onOpenChange: (next, details) => {
|
|
@@ -183,7 +166,7 @@ const Tour = ({ steps, open: openProp, defaultOpen = false, onOpenChange, curren
|
|
|
183
166
|
target && /* @__PURE__ */ jsx(PopoverArrow, {})
|
|
184
167
|
]
|
|
185
168
|
})]
|
|
186
|
-
})
|
|
169
|
+
})]
|
|
187
170
|
});
|
|
188
171
|
};
|
|
189
172
|
//#endregion
|
package/dist/Tour.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tour.mjs","names":["popover.Popover","popover.PopoverPortal","popover.PopoverBackdrop","popover.PopoverContent","popover.PopoverTitle","popover.PopoverDescription","popover.PopoverClose","popover.PopoverArrow"],"sources":["../src/components/organisms/tour.tsx"],"sourcesContent":["'use client';\n\nimport {\n type ComponentPropsWithRef,\n type ReactNode,\n useEffect,\n useMemo,\n useState,\n} from 'react';\n\nimport { useControllableState } from '@jbpark/use-hooks';\n\nimport { useConfig } from '@repo/ui/providers';\nimport { cn } from '@repo/ui/utils';\n\nimport { popover } from '../../core';\nimport { OVERLAY_LAYER } from '../../lib/z-layers';\nimport Button from '../atoms/button';\n\nexport interface Step {\n key: string;\n title: ReactNode;\n description?: ReactNode;\n /** Resolved after hydration. Missing/hidden targets use a centered popup. */\n target?: () => HTMLElement | null;\n placement?: 'top' | 'bottom' | 'left' | 'right';\n}\n\nexport interface Props extends Omit<\n ComponentPropsWithRef<'div'>,\n 'children' | 'onChange'\n> {\n steps: readonly Step[];\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n current?: number;\n defaultCurrent?: number;\n onChange?: (current: number) => void;\n onClose?: () => void;\n onFinish?: () => void;\n scrollIntoView?: boolean;\n previousLabel?: string;\n nextLabel?: string;\n finishLabel?: string;\n closeLabel?: string;\n formatProgress?: (current: number, total: number) => string;\n classNames?: {\n popup?: string;\n mask?: string;\n highlight?: string;\n actions?: string;\n };\n}\n\nconst defaultFormatProgress = (current: number, total: number) =>\n `Step ${current} of ${total}`;\n\nconst Tour = ({\n steps,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n current: currentProp,\n defaultCurrent = 0,\n onChange,\n onClose,\n onFinish,\n scrollIntoView = true,\n previousLabel = 'Previous',\n nextLabel = 'Next',\n finishLabel = 'Finish',\n closeLabel = 'Close tour',\n formatProgress = defaultFormatProgress,\n className,\n classNames,\n ...props\n}: Props) => {\n const { getContainer, direction } = useConfig();\n const [open, setOpen] = useControllableState({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n const [current, setCurrent] = useControllableState({\n value: currentProp,\n defaultValue: defaultCurrent,\n onChange,\n });\n const index = Number.isFinite(current)\n ? Math.max(0, Math.min(steps.length - 1, Math.floor(current)))\n : 0;\n const step = steps[index];\n const [measurement, setMeasurement] = useState<{\n step: Step;\n target: HTMLElement | null;\n rect: { top: number; left: number; width: number; height: number } | null;\n } | null>(null);\n const target =\n open && measurement && measurement.step === step\n ? measurement.target\n : null;\n const rect =\n open && measurement && measurement.step === step ? measurement.rect : null;\n const fallback = useMemo(\n () => ({\n getBoundingClientRect: () =>\n new DOMRect(window.innerWidth / 2, window.innerHeight / 2, 0, 0),\n }),\n [],\n );\n\n useEffect(() => {\n if (!open || !step) return;\n\n let previous: HTMLElement | null = null;\n const update = () => {\n const element = step.target?.() ?? null;\n const isVisible =\n !!element?.isConnected &&\n element.getClientRects().length > 0 &&\n getComputedStyle(element).visibility !== 'hidden';\n const resolved = isVisible ? element : null;\n\n if (resolved !== previous) {\n if (previous) resizeObserver.unobserve(previous);\n\n if (resolved) {\n resizeObserver.observe(resolved);\n\n if (scrollIntoView) {\n resolved.scrollIntoView({\n block: 'center',\n inline: 'nearest',\n behavior: 'instant',\n });\n }\n }\n }\n\n previous = resolved;\n const bounds = resolved?.getBoundingClientRect();\n const next = bounds\n ? {\n top: bounds.top,\n left: bounds.left,\n width: bounds.width,\n height: bounds.height,\n }\n : null;\n\n setMeasurement(existing =>\n existing?.step === step &&\n existing.target === resolved &&\n existing.rect?.top === next?.top &&\n existing.rect?.left === next?.left &&\n existing.rect?.width === next?.width &&\n existing.rect?.height === next?.height\n ? existing\n : { step, target: resolved, rect: next },\n );\n };\n\n const frame = requestAnimationFrame(update);\n const observer = new MutationObserver(update);\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['hidden', 'style', 'class'],\n });\n const resizeObserver = new ResizeObserver(update);\n\n window.addEventListener('resize', update);\n window.addEventListener('scroll', update, true);\n\n return () => {\n cancelAnimationFrame(frame);\n observer.disconnect();\n resizeObserver.disconnect();\n window.removeEventListener('resize', update);\n window.removeEventListener('scroll', update, true);\n };\n }, [open, step, scrollIntoView]);\n\n const close = () => {\n onClose?.();\n setOpen(false);\n };\n\n return (\n <div\n {...props}\n data-slot=\"tour\"\n className={cn(\n 'contents',\n className, //\n )}\n >\n <popover.Popover\n open={open && !!step}\n modal\n onOpenChange={(next, details) => {\n if (details.reason === 'outside-press') {\n details.cancel();\n\n return;\n }\n\n if (!next) close();\n }}\n >\n <popover.PopoverPortal container={getContainer()}>\n <popover.PopoverBackdrop\n data-slot=\"tour-mask\"\n className={cn(\n 'fixed inset-0 bg-black/40',\n OVERLAY_LAYER,\n classNames?.mask, //\n )}\n />\n {open && rect && (\n <div\n data-slot=\"tour-highlight\"\n aria-hidden=\"true\"\n style={{\n position: 'fixed',\n top: rect.top - 4,\n left: rect.left - 4,\n width: rect.width + 8,\n height: rect.height + 8,\n }}\n className={cn(\n 'border-primary pointer-events-none rounded-md border-2',\n OVERLAY_LAYER,\n classNames?.highlight, //\n )}\n />\n )}\n </popover.PopoverPortal>\n <popover.PopoverContent\n data-slot=\"tour-popup\"\n dir={props.dir ?? direction}\n anchor={target ?? fallback}\n side={step?.placement ?? 'bottom'}\n sideOffset={12}\n positionerStyle={\n target\n ? undefined\n : {\n position: 'fixed',\n left: '50%',\n top: '50%',\n transform: 'translate(-50%, -50%)',\n }\n }\n className={cn(\n `max-h-[calc(100dvh-2rem)] w-80 max-w-[calc(100vw-2rem)]\n overflow-y-auto`,\n classNames?.popup, //\n )}\n >\n <popover.PopoverTitle>{step?.title}</popover.PopoverTitle>\n {step?.description != null && (\n <popover.PopoverDescription className=\"mt-2 text-sm\">\n {step.description}\n </popover.PopoverDescription>\n )}\n <p\n data-slot=\"tour-progress\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"text-muted-foreground mt-3 text-xs\"\n >\n {formatProgress(index + 1, steps.length)}\n </p>\n <div\n className={cn(\n 'mt-4 flex flex-wrap gap-2',\n classNames?.actions, //\n )}\n >\n <popover.PopoverClose\n render={<Button variant=\"text\" size=\"small\" />}\n >\n {closeLabel}\n </popover.PopoverClose>\n <Button\n variant=\"outlined\"\n size=\"small\"\n disabled={index === 0}\n focusableWhenDisabled\n className=\"aria-disabled:pointer-events-none\n aria-disabled:opacity-50\"\n onClick={() => setCurrent(index - 1)}\n >\n {previousLabel}\n </Button>\n <Button\n size=\"small\"\n onClick={() => {\n if (index < steps.length - 1) {\n setCurrent(index + 1);\n } else {\n onFinish?.();\n setOpen(false);\n }\n }}\n >\n {index === steps.length - 1 ? finishLabel : nextLabel}\n </Button>\n </div>\n {target && <popover.PopoverArrow />}\n </popover.PopoverContent>\n </popover.Popover>\n </div>\n );\n};\n\nexport default Tour;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Tour.mjs","names":["popover.Popover","popover.PopoverPortal","popover.PopoverBackdrop","popover.PopoverContent","popover.PopoverTitle","popover.PopoverDescription","popover.PopoverClose","popover.PopoverArrow"],"sources":["../src/components/organisms/tour.tsx"],"sourcesContent":["'use client';\n\nimport {\n type ComponentPropsWithRef,\n type ReactNode,\n useEffect,\n useMemo,\n useState,\n} from 'react';\n\nimport { useControllableState, useElementPosition } from '@jbpark/use-hooks';\n\nimport { useConfig } from '@repo/ui/providers';\nimport { cn } from '@repo/ui/utils';\n\nimport { popover } from '../../core';\nimport { OVERLAY_LAYER } from '../../lib/z-layers';\nimport Button from '../atoms/button';\n\nexport interface Step {\n key: string;\n title: ReactNode;\n description?: ReactNode;\n /** Resolved after hydration. Missing/hidden targets use a centered popup. */\n target?: () => HTMLElement | null;\n placement?: 'top' | 'bottom' | 'left' | 'right';\n}\n\nexport interface Props extends Omit<\n ComponentPropsWithRef<'div'>,\n 'children' | 'onChange'\n> {\n steps: readonly Step[];\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n current?: number;\n defaultCurrent?: number;\n onChange?: (current: number) => void;\n onClose?: () => void;\n onFinish?: () => void;\n scrollIntoView?: boolean;\n previousLabel?: string;\n nextLabel?: string;\n finishLabel?: string;\n closeLabel?: string;\n formatProgress?: (current: number, total: number) => string;\n classNames?: {\n popup?: string;\n mask?: string;\n highlight?: string;\n actions?: string;\n };\n}\n\ninterface Measurement {\n index: number;\n target: HTMLElement | null;\n rect: DOMRect | null;\n}\n\nconst TARGET_MUTATION = {\n attributes: true,\n attributeFilter: ['hidden', 'style', 'class'],\n};\n\nconst measureVisible = (element: HTMLElement) =>\n element.isConnected &&\n element.getClientRects().length > 0 &&\n getComputedStyle(element).visibility !== 'hidden'\n ? element.getBoundingClientRect()\n : null;\n\n// Tracks one open step's target. Tour mounts it only while open and keys it by\n// step, so no listener stays attached while closed and a new step never\n// reports the previous step's element.\nconst StepTarget = ({\n index,\n step,\n scrollIntoView,\n onMeasure,\n}: {\n index: number;\n step: Step;\n scrollIntoView: boolean;\n onMeasure: (measurement: Measurement) => void;\n}) => {\n const { rect, element } = useElementPosition<HTMLElement>(\n () => step.target?.() ?? null,\n { withElement: true, measure: measureVisible, mutation: TARGET_MUTATION },\n );\n\n useEffect(() => {\n if (element && scrollIntoView) {\n element.scrollIntoView({\n block: 'center',\n inline: 'nearest',\n behavior: 'instant',\n });\n }\n }, [element, scrollIntoView]);\n\n useEffect(() => {\n onMeasure({ index, target: element, rect });\n }, [onMeasure, index, element, rect]);\n\n return null;\n};\n\nconst defaultFormatProgress = (current: number, total: number) =>\n `Step ${current} of ${total}`;\n\nconst Tour = ({\n steps,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n current: currentProp,\n defaultCurrent = 0,\n onChange,\n onClose,\n onFinish,\n scrollIntoView = true,\n previousLabel = 'Previous',\n nextLabel = 'Next',\n finishLabel = 'Finish',\n closeLabel = 'Close tour',\n formatProgress = defaultFormatProgress,\n className,\n classNames,\n ...props\n}: Props) => {\n const { getContainer, direction } = useConfig();\n const [open, setOpen] = useControllableState({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n const [current, setCurrent] = useControllableState({\n value: currentProp,\n defaultValue: defaultCurrent,\n onChange,\n });\n const index = Number.isFinite(current)\n ? Math.max(0, Math.min(steps.length - 1, Math.floor(current)))\n : 0;\n const step = steps[index];\n const [measurement, setMeasurement] = useState<Measurement | null>(null);\n const target =\n open && measurement && measurement.index === index\n ? measurement.target\n : null;\n const rect =\n open && measurement && measurement.index === index\n ? measurement.rect\n : null;\n const fallback = useMemo(\n () => ({\n getBoundingClientRect: () =>\n new DOMRect(window.innerWidth / 2, window.innerHeight / 2, 0, 0),\n }),\n [],\n );\n\n const close = () => {\n onClose?.();\n setOpen(false);\n };\n\n return (\n <div\n {...props}\n data-slot=\"tour\"\n className={cn(\n 'contents',\n className, //\n )}\n >\n {open && step && (\n <StepTarget\n key={index}\n index={index}\n step={step}\n scrollIntoView={scrollIntoView}\n onMeasure={setMeasurement}\n />\n )}\n <popover.Popover\n open={open && !!step}\n modal\n onOpenChange={(next, details) => {\n if (details.reason === 'outside-press') {\n details.cancel();\n\n return;\n }\n\n if (!next) close();\n }}\n >\n <popover.PopoverPortal container={getContainer()}>\n <popover.PopoverBackdrop\n data-slot=\"tour-mask\"\n className={cn(\n 'fixed inset-0 bg-black/40',\n OVERLAY_LAYER,\n classNames?.mask, //\n )}\n />\n {open && rect && (\n <div\n data-slot=\"tour-highlight\"\n aria-hidden=\"true\"\n style={{\n position: 'fixed',\n top: rect.top - 4,\n left: rect.left - 4,\n width: rect.width + 8,\n height: rect.height + 8,\n }}\n className={cn(\n 'border-primary pointer-events-none rounded-md border-2',\n OVERLAY_LAYER,\n classNames?.highlight, //\n )}\n />\n )}\n </popover.PopoverPortal>\n <popover.PopoverContent\n data-slot=\"tour-popup\"\n dir={props.dir ?? direction}\n anchor={target ?? fallback}\n side={step?.placement ?? 'bottom'}\n sideOffset={12}\n positionerStyle={\n target\n ? undefined\n : {\n position: 'fixed',\n left: '50%',\n top: '50%',\n transform: 'translate(-50%, -50%)',\n }\n }\n className={cn(\n `max-h-[calc(100dvh-2rem)] w-80 max-w-[calc(100vw-2rem)]\n overflow-y-auto`,\n classNames?.popup, //\n )}\n >\n <popover.PopoverTitle>{step?.title}</popover.PopoverTitle>\n {step?.description != null && (\n <popover.PopoverDescription className=\"mt-2 text-sm\">\n {step.description}\n </popover.PopoverDescription>\n )}\n <p\n data-slot=\"tour-progress\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"text-muted-foreground mt-3 text-xs\"\n >\n {formatProgress(index + 1, steps.length)}\n </p>\n <div\n className={cn(\n 'mt-4 flex flex-wrap gap-2',\n classNames?.actions, //\n )}\n >\n <popover.PopoverClose\n render={<Button variant=\"text\" size=\"small\" />}\n >\n {closeLabel}\n </popover.PopoverClose>\n <Button\n variant=\"outlined\"\n size=\"small\"\n disabled={index === 0}\n focusableWhenDisabled\n className=\"aria-disabled:pointer-events-none\n aria-disabled:opacity-50\"\n onClick={() => setCurrent(index - 1)}\n >\n {previousLabel}\n </Button>\n <Button\n size=\"small\"\n onClick={() => {\n if (index < steps.length - 1) {\n setCurrent(index + 1);\n } else {\n onFinish?.();\n setOpen(false);\n }\n }}\n >\n {index === steps.length - 1 ? finishLabel : nextLabel}\n </Button>\n </div>\n {target && <popover.PopoverArrow />}\n </popover.PopoverContent>\n </popover.Popover>\n </div>\n );\n};\n\nexport default Tour;\n"],"mappings":"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"}
|
package/dist/Transfer.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { cn } from "./utils.mjs";
|
|
3
3
|
import Button from "./Button.mjs";
|
|
4
|
-
import Input from "./
|
|
5
|
-
import Checkbox from "./
|
|
4
|
+
import Input from "./Input.mjs";
|
|
5
|
+
import Checkbox from "./Checkbox.mjs";
|
|
6
6
|
import { useId, useState } from "react";
|
|
7
7
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
8
|
//#region src/components/molecules/transfer.tsx
|
package/dist/Tree.mjs
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { cn } from "./utils.mjs";
|
|
3
3
|
import { DEFAULT_LOCALE, useConfig } from "./providers/config/context.mjs";
|
|
4
4
|
import Button from "./Button.mjs";
|
|
5
|
-
import Checkbox from "./
|
|
5
|
+
import Checkbox from "./Checkbox.mjs";
|
|
6
6
|
import { useCallback, useEffect, useId, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
7
7
|
import { useControllableState, useLatest, useResizeObserver } from "@jbpark/use-hooks";
|
|
8
8
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -30,4 +30,4 @@ export interface Props {
|
|
|
30
30
|
declare const Upload: ({ defaultValue, value: _value, multiple, accept, maxCount, disabled, className, classNames, onChange: _onChange, onReject }: Props) => import("react").JSX.Element;
|
|
31
31
|
//#endregion
|
|
32
32
|
export { Upload as default };
|
|
33
|
-
//# sourceMappingURL=
|
|
33
|
+
//# sourceMappingURL=Upload.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Upload.d.mts","names":[],"sources":["../src/components/molecules/upload.tsx"],"mappings":";iBAuBiB;EACf;EACA;EACA;;iBAGe;EACf,eAAe;EACf,QAAQ;EACR;EACA;EACA;EACA;EACA;EACA;IACE;IACA;IACA;;EAEF,YAAY,OAAO;;;;;EAKnB,YAAY;IAAQ,MAAM;IAAM;;;cAO5B,WAAU,cAAA,OAAA,QAAA,UAAA,QAAA,UAAA,UAAA,WAAA,YAAA,UAAA,WAAA,YAWb,0BAAK,IAAA"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { cn } from "
|
|
3
|
-
import Button from "
|
|
2
|
+
import { cn } from "./utils.mjs";
|
|
3
|
+
import Button from "./Button.mjs";
|
|
4
4
|
import { useId } from "react";
|
|
5
5
|
import { useControllableState, useFileDrop, useFileToDataUrl } from "@jbpark/use-hooks";
|
|
6
6
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
-
import { Upload, X } from "lucide-react";
|
|
7
|
+
import { Upload as Upload$1, X } from "lucide-react";
|
|
8
8
|
//#region src/components/molecules/upload.tsx
|
|
9
9
|
let uidCounter = 0;
|
|
10
10
|
const nextUid = () => uidCounter += 1;
|
|
11
11
|
const isImage = (file) => /^data:image\//.test(file.url) || /\.(png|jpe?g|gif|webp|svg)$/i.test(file.name);
|
|
12
|
-
const Upload
|
|
12
|
+
const Upload = ({ defaultValue = [], value: _value, multiple = true, accept = "image/*", maxCount, disabled, className, classNames, onChange: _onChange = () => {}, onReject }) => {
|
|
13
13
|
const inputId = useId();
|
|
14
14
|
const readAsDataUrl = useFileToDataUrl();
|
|
15
15
|
const [files, setFiles] = useControllableState({
|
|
@@ -60,7 +60,7 @@ const Upload$1 = ({ defaultValue = [], value: _value, multiple = true, accept =
|
|
|
60
60
|
htmlFor: inputId,
|
|
61
61
|
className: cn("flex cursor-pointer flex-col items-center justify-center gap-2", "rounded-md border border-dashed p-6 text-center", "text-muted-foreground text-sm", "transition-colors", isDragging && "border-primary bg-accent", disabled && "pointer-events-none cursor-not-allowed opacity-50", classNames?.dropzone),
|
|
62
62
|
children: [
|
|
63
|
-
/* @__PURE__ */ jsx(Upload, { className: "size-6" }),
|
|
63
|
+
/* @__PURE__ */ jsx(Upload$1, { className: "size-6" }),
|
|
64
64
|
/* @__PURE__ */ jsxs("span", { children: [
|
|
65
65
|
"Click or drag file",
|
|
66
66
|
multiple ? "s" : "",
|
|
@@ -108,6 +108,6 @@ const Upload$1 = ({ defaultValue = [], value: _value, multiple = true, accept =
|
|
|
108
108
|
});
|
|
109
109
|
};
|
|
110
110
|
//#endregion
|
|
111
|
-
export { Upload
|
|
111
|
+
export { Upload as default };
|
|
112
112
|
|
|
113
|
-
//# sourceMappingURL=
|
|
113
|
+
//# sourceMappingURL=Upload.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Upload.mjs","names":["UploadIcon"],"sources":["../src/components/molecules/upload.tsx"],"sourcesContent":["'use client';\n\nimport { useId } from 'react';\n\nimport {\n useControllableState,\n useFileDrop,\n useFileToDataUrl,\n} from '@jbpark/use-hooks';\nimport { Upload as UploadIcon, X } from 'lucide-react';\n\nimport { cn } from '@repo/ui/utils';\n\nimport Button from '../atoms/button';\n\n// Monotonic per-session counter used as a uniqueness tiebreaker for file\n// uids. Guarantees a unique suffix even for the same file (identical\n// name/lastModified/size) added twice, which name+lastModified+size alone\n// can't. These uids are internal React keys, not cryptographic, so a plain\n// counter is enough — and it avoids a runtime `uuid` dependency.\nlet uidCounter = 0;\nconst nextUid = () => (uidCounter += 1);\n\nexport interface UploadFile {\n uid: string;\n name: string;\n url: string;\n}\n\nexport interface Props {\n defaultValue?: UploadFile[];\n value?: UploadFile[];\n multiple?: boolean;\n accept?: string;\n maxCount?: number;\n disabled?: boolean;\n className?: string;\n classNames?: {\n dropzone?: string;\n list?: string;\n item?: string;\n };\n onChange?: (files: UploadFile[]) => void;\n /**\n * Called once per file that didn't make it in — either bumped by\n * `maxCount` or failed to read.\n */\n onReject?: (info: { file: File; reason: 'max-count' | 'read-error' }) => void;\n}\n\nconst isImage = (file: UploadFile) =>\n /^data:image\\//.test(file.url) ||\n /\\.(png|jpe?g|gif|webp|svg)$/i.test(file.name);\n\nconst Upload = ({\n defaultValue = [],\n value: _value,\n multiple = true,\n accept = 'image/*',\n maxCount,\n disabled,\n className,\n classNames,\n onChange: _onChange = () => {},\n onReject,\n}: Props) => {\n const inputId = useId();\n const readAsDataUrl = useFileToDataUrl();\n const [files, setFiles] = useControllableState<UploadFile[]>({\n value: _value,\n defaultValue,\n onChange: _onChange,\n });\n\n const addFiles = async (incoming: File[]) => {\n const remaining =\n typeof maxCount === 'number'\n ? Math.max(0, maxCount - files.length)\n : incoming.length;\n\n const accepted = incoming.slice(0, remaining);\n const rejected = incoming.slice(remaining);\n\n rejected.forEach(file => onReject?.({ file, reason: 'max-count' }));\n\n if (accepted.length === 0) {\n return;\n }\n\n const uploaded = (\n await Promise.all(\n accepted.map(async file => {\n try {\n return {\n // `nextUid()` guarantees uniqueness even for the same file\n // added twice (identical name/lastModified/size), which\n // name+lastModified+size alone can't — a collision there\n // corrupted React's item keys and made removeFile's\n // uid-based filter delete both copies at once.\n uid: `${file.name}-${file.lastModified}-${file.size}-${nextUid()}`,\n name: file.name,\n url: await readAsDataUrl(file),\n };\n } catch {\n onReject?.({ file, reason: 'read-error' });\n return null;\n }\n }),\n )\n ).filter((file): file is UploadFile => file !== null);\n\n if (uploaded.length === 0) {\n return;\n }\n\n setFiles([...files, ...uploaded]);\n };\n\n const removeFile = (uid: string) => {\n setFiles(files.filter(file => file.uid !== uid));\n };\n\n const { dropRef, isDragging } = useFileDrop<HTMLLabelElement>({\n accept,\n multiple,\n disabled,\n onDrop: addFiles,\n });\n\n return (\n <div\n data-slot=\"upload\"\n className={cn(\n 'flex flex-col gap-3',\n className,\n //\n )}\n >\n <label\n ref={dropRef}\n htmlFor={inputId}\n className={cn(\n 'flex cursor-pointer flex-col items-center justify-center gap-2',\n 'rounded-md border border-dashed p-6 text-center',\n 'text-muted-foreground text-sm',\n 'transition-colors',\n isDragging && 'border-primary bg-accent',\n disabled && 'pointer-events-none cursor-not-allowed opacity-50',\n classNames?.dropzone,\n //\n )}\n >\n <UploadIcon className=\"size-6\" />\n <span>Click or drag file{multiple ? 's' : ''} to upload</span>\n <input\n id={inputId}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n className=\"hidden\"\n onChange={e => {\n if (e.target.files?.length) {\n addFiles(Array.from(e.target.files));\n }\n e.target.value = '';\n }}\n />\n </label>\n\n {files.length > 0 && (\n <ul\n className={cn(\n 'm-0 flex list-none flex-col gap-2 p-0',\n classNames?.list,\n //\n )}\n >\n {files.map(file => (\n <li\n key={file.uid}\n className={cn(\n // `m-0` completes the list reset the `ul` above starts — see\n // Radio.Group for the host rule this guards against.\n 'm-0 flex items-center gap-2 rounded-md border p-2',\n classNames?.item,\n //\n )}\n >\n {isImage(file) && (\n <img\n src={file.url}\n alt=\"\"\n className=\"size-10 shrink-0 rounded object-cover\"\n />\n )}\n <span className=\"flex-1 truncate text-sm\">{file.name}</span>\n <Button\n variant=\"text\"\n shape=\"circle\"\n size=\"small\"\n icon={<X className=\"size-4\" />}\n onClick={() => removeFile(file.uid)}\n className=\"text-muted-foreground hover:text-foreground shrink-0\"\n aria-label={`Remove ${file.name}`}\n />\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n};\n\nexport default Upload;\n"],"mappings":"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"}
|
|
@@ -1,31 +1,38 @@
|
|
|
1
1
|
import AutoComplete, { Option, Props } from "../../AutoComplete.mjs";
|
|
2
2
|
import Avatar, { Props as Props$1 } from "../../Avatar.mjs";
|
|
3
3
|
import Badge, { Props as Props$2 } from "../../Badge.mjs";
|
|
4
|
-
import Button from "../../Button.mjs";
|
|
5
|
-
import Cascader, { Option as Option$1, Props as Props$
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import
|
|
4
|
+
import Button, { Props as Props$3 } from "../../Button.mjs";
|
|
5
|
+
import Cascader, { Option as Option$1, Props as Props$4 } from "../../Cascader.mjs";
|
|
6
|
+
import { Props as Props$5 } from "./checkbox/checkbox.mjs";
|
|
7
|
+
import Checkbox from "../../Checkbox.mjs";
|
|
8
|
+
import ColorPicker, { Props as Props$6 } from "../../ColorPicker.mjs";
|
|
9
|
+
import DatePicker, { Props as Props$7 } from "../../DatePicker.mjs";
|
|
10
|
+
import Divider, { Props as Props$8 } from "../../Divider.mjs";
|
|
11
|
+
import { Props as Props$9 } from "./float-button/float-button.mjs";
|
|
12
|
+
import FloatButton from "../../FloatButton.mjs";
|
|
13
|
+
import { Props as Props$10 } from "./input/input.mjs";
|
|
14
|
+
import { Props as Props$11 } from "./input/number.mjs";
|
|
15
|
+
import { Props as Props$12 } from "./input/otp.mjs";
|
|
16
|
+
import Input from "../../Input.mjs";
|
|
17
|
+
import Mentions, { Option as Option$2, Props as Props$13 } from "../../Mentions.mjs";
|
|
18
|
+
import Popover, { Props as Props$14 } from "../../Popover.mjs";
|
|
19
|
+
import Progress, { Props as Props$15 } from "../../Progress.mjs";
|
|
20
|
+
import { Props as Props$16 } from "./radio/radio.mjs";
|
|
21
|
+
import Radio from "../../Radio.mjs";
|
|
22
|
+
import Rate, { Props as Props$17 } from "../../Rate.mjs";
|
|
23
|
+
import RichTextEditor, { Props as Props$18 } from "./rich-text-editor/rich-text-editor.mjs";
|
|
24
|
+
import "../../RichTextEditor.mjs";
|
|
25
|
+
import Segmented, { Props as Props$19 } from "../../Segmented.mjs";
|
|
26
|
+
import Select, { Props as Props$20 } from "../../Select.mjs";
|
|
27
|
+
import { Props as Props$21 } from "./skeleton/skeleton.mjs";
|
|
28
|
+
import Skeleton from "../../Skeleton.mjs";
|
|
29
|
+
import Slider, { Props as Props$22 } from "./slider/slider.mjs";
|
|
30
|
+
import Spin, { Props as Props$23 } from "../../Spin.mjs";
|
|
31
|
+
import Switch, { Props as Props$24 } from "../../Switch.mjs";
|
|
32
|
+
import Tag, { Props as Props$25 } from "../../Tag.mjs";
|
|
33
|
+
import TimePicker, { Props as Props$26 } from "../../TimePicker.mjs";
|
|
34
|
+
import ToggleGroup, { Option as Option$3, Props as Props$27 } from "../../ToggleGroup.mjs";
|
|
35
|
+
import Tooltip, { Props as Props$28 } from "../../Tooltip.mjs";
|
|
36
|
+
import { Props as Props$29 } from "./typography/typography.mjs";
|
|
12
37
|
import Typography from "../../Typography.mjs";
|
|
13
|
-
|
|
14
|
-
import Checkbox from "./checkbox/index.mjs";
|
|
15
|
-
import ColorPicker from "./color-picker.mjs";
|
|
16
|
-
import DatePicker from "./date-picker.mjs";
|
|
17
|
-
import FloatButton from "./float-button/index.mjs";
|
|
18
|
-
import { Props as Props$9 } from "./input/number.mjs";
|
|
19
|
-
import { Props as Props$10 } from "./input/otp.mjs";
|
|
20
|
-
import Input from "./input/index.mjs";
|
|
21
|
-
import Progress from "./progress.mjs";
|
|
22
|
-
import Radio from "./radio/index.mjs";
|
|
23
|
-
import RichTextEditor from "./rich-text-editor/rich-text-editor.mjs";
|
|
24
|
-
import "./rich-text-editor/index.mjs";
|
|
25
|
-
import Select from "./select.mjs";
|
|
26
|
-
import Skeleton from "./skeleton/index.mjs";
|
|
27
|
-
import Slider from "./slider/slider.mjs";
|
|
28
|
-
import Spin from "./spin.mjs";
|
|
29
|
-
import Switch from "./switch.mjs";
|
|
30
|
-
import Tooltip from "./tooltip.mjs";
|
|
31
|
-
export { AutoComplete, type Option as AutoCompleteOption, type Props as AutoCompleteProps, Avatar, type Props$1 as AvatarProps, Badge, type Props$2 as BadgeProps, Button, Cascader, type Option$1 as CascaderOption, type Props$3 as CascaderProps, Checkbox, ColorPicker, DatePicker, Divider, type Props$4 as DividerProps, FloatButton, Input, type Props$9 as InputNumberProps, type Props$10 as InputOTPProps, Mentions, type Option$2 as MentionsOption, type Props$5 as MentionsProps, Popover, Progress, Radio, Rate, type Props$6 as RateProps, RichTextEditor, Segmented, type Props$7 as SegmentedProps, Select, Skeleton, Slider, Spin, Switch, Tag, TimePicker, type Props$8 as TimePickerProps, Tooltip, Typography };
|
|
38
|
+
export { AutoComplete, type Option as AutoCompleteOption, type Props as AutoCompleteProps, Avatar, type Props$1 as AvatarProps, Badge, type Props$2 as BadgeProps, Button, type Props$3 as ButtonProps, Cascader, type Option$1 as CascaderOption, type Props$4 as CascaderProps, Checkbox, type Props$5 as CheckboxProps, ColorPicker, type Props$6 as ColorPickerProps, DatePicker, type Props$7 as DatePickerProps, Divider, type Props$8 as DividerProps, FloatButton, type Props$9 as FloatButtonProps, Input, type Props$11 as InputNumberProps, type Props$12 as InputOTPProps, type Props$10 as InputProps, Mentions, type Option$2 as MentionsOption, type Props$13 as MentionsProps, Popover, type Props$14 as PopoverProps, Progress, type Props$15 as ProgressProps, Radio, type Props$16 as RadioProps, Rate, type Props$17 as RateProps, RichTextEditor, type Props$18 as RichTextEditorProps, Segmented, type Props$19 as SegmentedProps, Select, type Props$20 as SelectProps, Skeleton, type Props$21 as SkeletonProps, Slider, type Props$22 as SliderProps, Spin, type Props$23 as SpinProps, Switch, type Props$24 as SwitchProps, Tag, type Props$25 as TagProps, TimePicker, type Props$26 as TimePickerProps, ToggleGroup, type Option$3 as ToggleGroupOption, type Props$27 as ToggleGroupProps, Tooltip, type Props$28 as TooltipProps, Typography, type Props$29 as TypographyProps };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
//#region src/components/atoms/input/input.d.ts
|
|
2
|
-
|
|
2
|
+
export type Props = React.ComponentPropsWithRef<'input'>;
|
|
3
|
+
declare const Input: ({ ref, ...props }: Props) => import("react").JSX.Element;
|
|
3
4
|
//#endregion
|
|
4
5
|
export { Input as default };
|
|
5
6
|
//# sourceMappingURL=input.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.d.mts","names":[],"sources":["../../../../src/components/atoms/input/input.tsx"],"mappings":";
|
|
1
|
+
{"version":3,"file":"input.d.mts","names":[],"sources":["../../../../src/components/atoms/input/input.tsx"],"mappings":";YAIY,QAAQ,MAAM;cAEpB,UAAS,QAAA,SAAmB,0BAAK,IAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.mjs","names":["input"],"sources":["../../../../src/components/atoms/input/input.tsx"],"sourcesContent":["import { input } from '../../../core';\n\nconst { Input: Core } = input;\n\nconst Input = ({ ref, ...props }:
|
|
1
|
+
{"version":3,"file":"input.mjs","names":["input"],"sources":["../../../../src/components/atoms/input/input.tsx"],"sourcesContent":["import { input } from '../../../core';\n\nconst { Input: Core } = input;\n\nexport type Props = React.ComponentPropsWithRef<'input'>;\n\nconst Input = ({ ref, ...props }: Props) => {\n return <Core ref={ref} {...props} />;\n};\n\nexport default Input;\n"],"mappings":";;;AAEA,MAAM,EAAE,OAAO,SAASA;AAIxB,MAAM,SAAS,EAAE,KAAK,GAAG,YAAmB;CAC1C,OAAO,oBAAC,MAAD;EAAW;EAAK,GAAI;CAAQ,CAAA;AACrC"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import Button from "../../../Button.mjs";
|
|
3
|
-
import Input from "
|
|
4
|
-
import Popover from "
|
|
5
|
-
import ColorPicker from "
|
|
3
|
+
import Input from "../../../Input.mjs";
|
|
4
|
+
import Popover from "../../../Popover.mjs";
|
|
5
|
+
import ColorPicker from "../../../ColorPicker.mjs";
|
|
6
6
|
import ToolbarButton from "./toolbar-button.mjs";
|
|
7
|
-
import Select from "
|
|
7
|
+
import Select from "../../../Select.mjs";
|
|
8
8
|
import { useState } from "react";
|
|
9
9
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
10
|
import { Bold, Code, Code2, Italic, Link, List, ListOrdered, Minus, Quote, Redo2, Strikethrough, Underline, Undo2 } from "lucide-react";
|
|
@@ -4,7 +4,7 @@ import { DEFAULT_LOCALE, useConfig } from "../../providers/config/context.mjs";
|
|
|
4
4
|
import { combobox_exports } from "../../core/combobox.mjs";
|
|
5
5
|
import Button from "../../Button.mjs";
|
|
6
6
|
import { selectTriggerStyles } from "../../core/select.mjs";
|
|
7
|
-
import Input from "
|
|
7
|
+
import Input from "../../Input.mjs";
|
|
8
8
|
import SearchableOptions, { useSelectItems } from "./select-searchable-options.mjs";
|
|
9
9
|
import { useMemo } from "react";
|
|
10
10
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -4,7 +4,7 @@ import { DEFAULT_LOCALE, useConfig } from "../../providers/config/context.mjs";
|
|
|
4
4
|
import { combobox_exports } from "../../core/combobox.mjs";
|
|
5
5
|
import Button from "../../Button.mjs";
|
|
6
6
|
import { selectTriggerStyles } from "../../core/select.mjs";
|
|
7
|
-
import Input from "
|
|
7
|
+
import Input from "../../Input.mjs";
|
|
8
8
|
import SearchableOptions, { useSelectItems } from "./select-searchable-options.mjs";
|
|
9
9
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
10
|
import { ChevronDownIcon, XIcon } from "lucide-react";
|
|
@@ -2,25 +2,26 @@ import Alert, { Props } from "../../Alert.mjs";
|
|
|
2
2
|
import Anchor, { Item, Props as Props$1 } from "../../Anchor.mjs";
|
|
3
3
|
import Breadcrumb, { Props as Props$2 } from "../../Breadcrumb.mjs";
|
|
4
4
|
import Card, { Props as Props$3 } from "../../Card.mjs";
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import { Props as Props$9 } from "
|
|
5
|
+
import Collapse, { Props as Props$4 } from "../../Collapse.mjs";
|
|
6
|
+
import ContextMenu, { Item as Item$1, Props as Props$5 } from "../../ContextMenu.mjs";
|
|
7
|
+
import Descriptions, { Columns, Item as Item$2, Props as Props$6 } from "../../Descriptions.mjs";
|
|
8
|
+
import Menu, { Props as Props$7 } from "./menu/menu.mjs";
|
|
9
|
+
import Dropdown, { Props as Props$8 } from "../../Dropdown.mjs";
|
|
10
|
+
import Empty, { Props as Props$9 } from "../../Empty.mjs";
|
|
11
|
+
import { Props as Props$10 } from "./marquees/marquees.mjs";
|
|
12
|
+
import Marquees from "../../Marquees.mjs";
|
|
13
|
+
import Pagination, { Props as Props$11 } from "../../Pagination.mjs";
|
|
14
|
+
import Popconfirm, { Props as Props$12 } from "../../Popconfirm.mjs";
|
|
15
|
+
import { Props as Props$13 } from "./reveals/reveals.mjs";
|
|
11
16
|
import Reveals from "../../Reveals.mjs";
|
|
12
|
-
import ScrollArea, { Props as Props$
|
|
13
|
-
import Space, { Props as Props$
|
|
14
|
-
import
|
|
15
|
-
import
|
|
16
|
-
import
|
|
17
|
-
import
|
|
18
|
-
import
|
|
19
|
-
import
|
|
20
|
-
import { Props as Props$
|
|
21
|
-
import
|
|
22
|
-
|
|
23
|
-
import Splitter from "./splitter/index.mjs";
|
|
24
|
-
import Tabs, { Props as Props$20 } from "./tabs.mjs";
|
|
25
|
-
import Upload, { Props as Props$21, UploadFile } from "./upload.mjs";
|
|
26
|
-
export { Alert, type Props as AlertProps, Anchor, type Item as AnchorItem, type Props$1 as AnchorProps, Breadcrumb, type Props$2 as BreadcrumbProps, Card, type Props$3 as CardProps, Collapse, type Props$16 as CollapseProps, ContextMenu, type Item$1 as ContextMenuItem, type Props$4 as ContextMenuProps, type Item$2 as DescriptionItem, Descriptions, type Columns as DescriptionsColumns, type Props$5 as DescriptionsProps, Dropdown, type Props$17 as DropdownProps, Marquees, type Props$18 as MarqueesProps, Menu, type Props$6 as MenuProps, Pagination, type Props$7 as PaginationProps, Popconfirm, type Props$8 as PopconfirmProps, Reveals, type Props$9 as RevealsProps, ScrollArea, type Props$10 as ScrollAreaProps, Space, type Props$11 as SpaceProps, Splitter, type Props$19 as SplitterProps, Statistic, type Props$12 as StatisticProps, type Item$3 as StepItem, Steps, type Props$13 as StepsProps, Tabs, type Props$20 as TabsProps, Timeline, type Item$4 as TimelineItem, type Props$14 as TimelineProps, type Timestamp as TimelineTimestamp, Transfer, type Item$5 as TransferItem, type Props$15 as TransferProps, Upload, type UploadFile, type Props$21 as UploadProps };
|
|
17
|
+
import ScrollArea, { Props as Props$14 } from "../../ScrollArea.mjs";
|
|
18
|
+
import Space, { Props as Props$15 } from "../../Space.mjs";
|
|
19
|
+
import { Props as Props$16 } from "./splitter/splitter.mjs";
|
|
20
|
+
import Splitter from "../../Splitter.mjs";
|
|
21
|
+
import Statistic, { Props as Props$17 } from "../../Statistic.mjs";
|
|
22
|
+
import Steps, { Item as Item$3, Props as Props$18 } from "../../Steps.mjs";
|
|
23
|
+
import Tabs, { Props as Props$19 } from "../../Tabs.mjs";
|
|
24
|
+
import Timeline, { Item as Item$4, Props as Props$20, Timestamp } from "../../Timeline.mjs";
|
|
25
|
+
import Transfer, { Item as Item$5, Props as Props$21 } from "../../Transfer.mjs";
|
|
26
|
+
import Upload, { Props as Props$22, UploadFile } from "../../Upload.mjs";
|
|
27
|
+
export { Alert, type Props as AlertProps, Anchor, type Item as AnchorItem, type Props$1 as AnchorProps, Breadcrumb, type Props$2 as BreadcrumbProps, Card, type Props$3 as CardProps, Collapse, type Props$4 as CollapseProps, ContextMenu, type Item$1 as ContextMenuItem, type Props$5 as ContextMenuProps, type Item$2 as DescriptionItem, Descriptions, type Columns as DescriptionsColumns, type Props$6 as DescriptionsProps, Dropdown, type Props$8 as DropdownProps, Empty, type Props$9 as EmptyProps, Marquees, type Props$10 as MarqueesProps, Menu, type Props$7 as MenuProps, Pagination, type Props$11 as PaginationProps, Popconfirm, type Props$12 as PopconfirmProps, Reveals, type Props$13 as RevealsProps, ScrollArea, type Props$14 as ScrollAreaProps, Space, type Props$15 as SpaceProps, Splitter, type Props$16 as SplitterProps, Statistic, type Props$17 as StatisticProps, type Item$3 as StepItem, Steps, type Props$18 as StepsProps, Tabs, type Props$19 as TabsProps, Timeline, type Item$4 as TimelineItem, type Props$20 as TimelineProps, type Timestamp as TimelineTimestamp, Transfer, type Item$5 as TransferItem, type Props$21 as TransferProps, Upload, type UploadFile, type Props$22 as UploadProps };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { Field } from "../../../core/form.mjs";
|
|
3
|
-
import Input from "
|
|
3
|
+
import Input from "../../../Input.mjs";
|
|
4
4
|
import { RequiredContext } from "./context.mjs";
|
|
5
5
|
import { useContext } from "react";
|
|
6
6
|
import { jsx } from "react/jsx-runtime";
|