@thewrong/ui 0.1.0 → 0.2.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/dist/_virtual/_rolldown/runtime.cjs.js +1 -0
- package/dist/components/_shared/form-size-tokens.cjs.js +1 -0
- package/dist/components/_shared/form-size-tokens.esm.js +29 -0
- package/dist/components/action-toast/ActionToast.cjs.js +1 -0
- package/dist/components/action-toast/ActionToast.esm.js +228 -0
- package/dist/components/animated-height/AnimatedHeight.cjs.js +1 -0
- package/dist/components/animated-height/AnimatedHeight.esm.js +36 -0
- package/dist/components/badge/Badge.cjs.js +1 -0
- package/dist/components/badge/Badge.esm.js +30 -0
- package/dist/components/badge/utils.cjs.js +1 -0
- package/dist/components/badge/utils.esm.js +38 -0
- package/dist/components/button/Button.cjs.js +1 -0
- package/dist/components/button/Button.esm.js +84 -0
- package/dist/components/button/utils.cjs.js +1 -0
- package/dist/components/button/utils.esm.js +38 -0
- package/dist/components/checkbox/Checkbox.cjs.js +1 -0
- package/dist/components/checkbox/Checkbox.esm.js +68 -0
- package/dist/components/checkbox/utils.cjs.js +1 -0
- package/dist/components/checkbox/utils.esm.js +44 -0
- package/dist/components/collapsible/Collapsible.cjs.js +1 -0
- package/dist/components/collapsible/Collapsible.esm.js +19 -0
- package/dist/components/date-input/DateInput.cjs.js +1 -0
- package/dist/components/date-input/DateInput.esm.js +39 -0
- package/dist/components/date-picker/date-picker.cjs.js +1 -0
- package/dist/components/date-picker/date-picker.esm.js +231 -0
- package/dist/components/date-picker/date-range-picker.cjs.js +1 -0
- package/dist/components/date-picker/date-range-picker.esm.js +287 -0
- package/dist/components/date-picker/month-picker.cjs.js +1 -0
- package/dist/components/date-picker/month-picker.esm.js +147 -0
- package/dist/components/drawer/Drawer.cjs.js +1 -0
- package/dist/components/drawer/Drawer.esm.js +113 -0
- package/dist/components/info-tooltip/InfoTooltip.cjs.js +1 -0
- package/dist/components/info-tooltip/InfoTooltip.esm.js +24 -0
- package/dist/components/input/Input.cjs.js +1 -0
- package/dist/components/input/Input.esm.js +95 -0
- package/dist/components/input/PasswordInput.cjs.js +1 -0
- package/dist/components/input/PasswordInput.esm.js +29 -0
- package/dist/components/input/format.cjs.js +1 -0
- package/dist/components/input/format.esm.js +33 -0
- package/dist/components/input/utils.cjs.js +1 -0
- package/dist/components/input/utils.esm.js +23 -0
- package/dist/components/loading-spinner/LoadingSpinner.cjs.js +1 -0
- package/dist/components/loading-spinner/LoadingSpinner.esm.js +47 -0
- package/dist/components/modal/Modal.cjs.js +1 -0
- package/dist/components/modal/Modal.esm.js +137 -0
- package/dist/components/modal/ModalSubView.cjs.js +1 -0
- package/dist/components/modal/ModalSubView.esm.js +91 -0
- package/dist/components/modal/StandardModal.cjs.js +1 -0
- package/dist/components/modal/StandardModal.esm.js +54 -0
- package/dist/components/page-title/PageTitle.cjs.js +1 -0
- package/dist/components/page-title/PageTitle.esm.js +16 -0
- package/dist/components/popover/Popover.cjs.js +1 -0
- package/dist/components/popover/Popover.esm.js +57 -0
- package/dist/components/search-box/ExactMatchToggle.cjs.js +1 -0
- package/dist/components/search-box/ExactMatchToggle.esm.js +27 -0
- package/dist/components/search-box/SearchBox.cjs.js +1 -0
- package/dist/components/search-box/SearchBox.esm.js +154 -0
- package/dist/components/search-box/SearchBoxChips.cjs.js +1 -0
- package/dist/components/search-box/SearchBoxChips.esm.js +36 -0
- package/dist/components/search-box/SearchBoxDateRange.cjs.js +1 -0
- package/dist/components/search-box/SearchBoxDateRange.esm.js +57 -0
- package/dist/components/search-box/SearchBoxDateSingle.cjs.js +1 -0
- package/dist/components/search-box/SearchBoxDateSingle.esm.js +37 -0
- package/dist/components/search-box/SearchBoxField.cjs.js +1 -0
- package/dist/components/search-box/SearchBoxField.esm.js +48 -0
- package/dist/components/search-box/SearchBoxFloatingInput.cjs.js +1 -0
- package/dist/components/search-box/SearchBoxFloatingInput.esm.js +38 -0
- package/dist/components/search-box/SearchBoxFloatingSelect.cjs.js +1 -0
- package/dist/components/search-box/SearchBoxFloatingSelect.esm.js +74 -0
- package/dist/components/search-box/SearchBoxMonth.cjs.js +1 -0
- package/dist/components/search-box/SearchBoxMonth.esm.js +35 -0
- package/dist/components/search-box/SearchBoxMultiSelect.cjs.js +1 -0
- package/dist/components/search-box/SearchBoxMultiSelect.esm.js +78 -0
- package/dist/components/search-box/SearchBoxSheetContext.cjs.js +1 -0
- package/dist/components/search-box/SearchBoxSheetContext.esm.js +5 -0
- package/dist/components/search-box/dateRangePresets.cjs.js +1 -0
- package/dist/components/search-box/dateRangePresets.esm.js +59 -0
- package/dist/components/search-box/parseDateRange.cjs.js +1 -0
- package/dist/components/search-box/parseDateRange.esm.js +21 -0
- package/dist/components/search-box/parseSearchValues.cjs.js +1 -0
- package/dist/components/search-box/parseSearchValues.esm.js +15 -0
- package/dist/components/search-box/useSearchBoxState.cjs.js +1 -0
- package/dist/components/search-box/useSearchBoxState.esm.js +87 -0
- package/dist/components/select/MultiSelect.cjs.js +1 -0
- package/dist/components/select/MultiSelect.esm.js +277 -0
- package/dist/components/select/Select.cjs.js +1 -0
- package/dist/components/select/Select.esm.js +308 -0
- package/dist/components/select/loading-dots.cjs.js +1 -0
- package/dist/components/select/loading-dots.esm.js +23 -0
- package/dist/components/switch/Switch.cjs.js +1 -0
- package/dist/components/switch/Switch.esm.js +36 -0
- package/dist/components/switch/utils.cjs.js +1 -0
- package/dist/components/switch/utils.esm.js +39 -0
- package/dist/components/table/accordion-table.cjs.js +1 -0
- package/dist/components/table/accordion-table.esm.js +418 -0
- package/dist/components/table/column-group-utils.cjs.js +1 -0
- package/dist/components/table/column-group-utils.esm.js +53 -0
- package/dist/components/table/components/ColumnPresetSelector.cjs.js +1 -0
- package/dist/components/table/components/ColumnPresetSelector.esm.js +165 -0
- package/dist/components/table/components/ColumnSettingsTable.cjs.js +4 -0
- package/dist/components/table/components/ColumnSettingsTable.esm.js +196 -0
- package/dist/components/table/components/KeyboardNavButton.cjs.js +1 -0
- package/dist/components/table/components/KeyboardNavButton.esm.js +24 -0
- package/dist/components/table/components/PageJumpInput.cjs.js +1 -0
- package/dist/components/table/components/PageJumpInput.esm.js +53 -0
- package/dist/components/table/components/Pagination.cjs.js +1 -0
- package/dist/components/table/components/Pagination.esm.js +162 -0
- package/dist/components/table/components/PaginationFooter.cjs.js +1 -0
- package/dist/components/table/components/PaginationFooter.esm.js +80 -0
- package/dist/components/table/components/SortableHeaderCell.cjs.js +1 -0
- package/dist/components/table/components/SortableHeaderCell.esm.js +30 -0
- package/dist/components/table/hooks/useColumnPresets.cjs.js +1 -0
- package/dist/components/table/hooks/useColumnPresets.esm.js +165 -0
- package/dist/components/table/hooks/useColumnResize.cjs.js +1 -0
- package/dist/components/table/hooks/useColumnResize.esm.js +106 -0
- package/dist/components/table/hooks/useFillEmptyRows.cjs.js +1 -0
- package/dist/components/table/hooks/useFillEmptyRows.esm.js +49 -0
- package/dist/components/table/hooks/useInfiniteScroll.cjs.js +1 -0
- package/dist/components/table/hooks/useInfiniteScroll.esm.js +32 -0
- package/dist/components/table/hooks/useTableColumnState.cjs.js +1 -0
- package/dist/components/table/hooks/useTableColumnState.esm.js +46 -0
- package/dist/components/table/hooks/useTableDragSelection.cjs.js +1 -0
- package/dist/components/table/hooks/useTableDragSelection.esm.js +76 -0
- package/dist/components/table/hooks/useTableSort.cjs.js +1 -0
- package/dist/components/table/hooks/useTableSort.esm.js +30 -0
- package/dist/components/table/hooks/useVirtualTable.cjs.js +1 -0
- package/dist/components/table/hooks/useVirtualTable.esm.js +18 -0
- package/dist/components/table/mini-table.cjs.js +1 -0
- package/dist/components/table/mini-table.esm.js +126 -0
- package/dist/components/table/paginated-mini-table.cjs.js +1 -0
- package/dist/components/table/paginated-mini-table.esm.js +31 -0
- package/dist/components/table/paginated-table.cjs.js +1 -0
- package/dist/components/table/paginated-table.esm.js +31 -0
- package/dist/components/table/table.cjs.js +1 -0
- package/dist/components/table/table.esm.js +342 -0
- package/dist/components/table/utils.cjs.js +37 -0
- package/dist/components/table/utils.esm.js +16 -0
- package/dist/components/table-checkbox/TableCheckbox.cjs.js +1 -0
- package/dist/components/table-checkbox/TableCheckbox.esm.js +39 -0
- package/dist/components/table-page-layout/TablePageLayout.cjs.js +1 -0
- package/dist/components/table-page-layout/TablePageLayout.esm.js +37 -0
- package/dist/components/textarea/Textarea.cjs.js +1 -0
- package/dist/components/textarea/Textarea.esm.js +62 -0
- package/dist/components/toast/ToastProvider.cjs.js +1 -0
- package/dist/components/toast/ToastProvider.esm.js +82 -0
- package/dist/components/toast/index.esm.js +3 -0
- package/dist/components/toolbar/Toolbar.cjs.js +1 -0
- package/dist/components/toolbar/Toolbar.esm.js +148 -0
- package/dist/components/tooltip/Tooltip.cjs.js +1 -0
- package/dist/components/tooltip/Tooltip.esm.js +39 -0
- package/dist/hooks/useBottomSheetDrag.cjs.js +1 -0
- package/dist/hooks/useBottomSheetDrag.esm.js +17 -0
- package/dist/hooks/useClickOutside.cjs.js +1 -0
- package/dist/hooks/useClickOutside.esm.js +20 -0
- package/dist/hooks/useMediaQuery.cjs.js +1 -0
- package/dist/hooks/useMediaQuery.esm.js +15 -0
- package/dist/hooks/useScrollLock.cjs.js +1 -0
- package/dist/hooks/useScrollLock.esm.js +16 -0
- package/dist/hooks.cjs.js +1 -0
- package/dist/hooks.esm.js +5 -0
- package/dist/index.cjs.js +1 -40
- package/dist/index.esm.js +58 -0
- package/dist/lib/Portal.cjs.js +1 -0
- package/dist/lib/Portal.esm.js +11 -0
- package/dist/lib/column-preset-storage.cjs.js +1 -0
- package/dist/lib/column-preset-storage.esm.js +123 -0
- package/dist/lib/overlay-stack.cjs.js +1 -0
- package/dist/lib/overlay-stack.esm.js +28 -0
- package/dist/lib/utils.cjs.js +1 -0
- package/dist/lib/utils.esm.js +11 -0
- package/dist/node_modules/clsx/dist/clsx.cjs.js +1 -0
- package/dist/node_modules/clsx/dist/clsx.esm.js +16 -0
- package/dist/node_modules/lucide-react/dist/esm/Icon.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/Icon.esm.js +23 -0
- package/dist/node_modules/lucide-react/dist/esm/context.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/context.esm.js +6 -0
- package/dist/node_modules/lucide-react/dist/esm/createLucideIcon.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/createLucideIcon.esm.js +17 -0
- package/dist/node_modules/lucide-react/dist/esm/defaultAttributes.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/defaultAttributes.esm.js +14 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/arrow-left.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/arrow-left.esm.js +10 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/calendar.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/calendar.esm.js +25 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/check.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/check.esm.js +7 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-down.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-down.esm.js +7 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-left.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-left.esm.js +7 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-right.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-right.esm.js +7 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/chevrons-left.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/chevrons-left.esm.js +10 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/chevrons-right.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/chevrons-right.esm.js +10 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-check.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-check.esm.js +12 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-x.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-x.esm.js +19 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/eye-off.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/eye-off.esm.js +21 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/eye.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/eye.esm.js +12 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/grip-vertical.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/grip-vertical.esm.js +41 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/info.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/info.esm.js +19 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/keyboard.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/keyboard.esm.js +45 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/list-filter.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/list-filter.esm.js +17 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/loader-circle.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/loader-circle.esm.js +7 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/minus.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/minus.esm.js +7 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/rotate-ccw.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/rotate-ccw.esm.js +10 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/save.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/save.esm.js +17 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/search.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/search.esm.js +12 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/settings.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/settings.esm.js +12 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/triangle-alert.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/triangle-alert.esm.js +17 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/wrench.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/wrench.esm.js +7 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/x.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/x.esm.js +10 -0
- package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.esm.js +7 -0
- package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.esm.js +4 -0
- package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.esm.js +4 -0
- package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.esm.js +4 -0
- package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.cjs.js +1 -0
- package/dist/node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.esm.js +8 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.cjs.js +1 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.esm.js +1714 -0
- package/dist/node_modules/use-debounce/dist/index.module.cjs.js +1 -0
- package/dist/node_modules/use-debounce/dist/index.module.esm.js +70 -0
- package/dist/src/components/action-toast/ActionToast.d.ts +6 -1
- package/dist/src/components/button/Button.d.ts +16 -0
- package/dist/src/components/drawer/Drawer.d.ts +6 -1
- package/dist/src/components/info-tooltip/InfoTooltip.d.ts +7 -0
- package/dist/src/components/loading-spinner/LoadingSpinner.d.ts +7 -0
- package/dist/src/components/modal/Modal.d.ts +7 -1
- package/dist/src/components/popover/Popover.d.ts +19 -1
- package/dist/src/components/tooltip/Tooltip.d.ts +10 -0
- package/dist/ui.css +1 -1
- package/llms.txt +91 -0
- package/package.json +10 -4
- package/dist/index.es.js +0 -8066
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Button as e } from "../button/Button.esm.js";
|
|
2
|
+
import { DateInput as t } from "../date-input/DateInput.esm.js";
|
|
3
|
+
import { parseDateRangeValue as n, serializeDateRangeValue as r } from "./parseDateRange.esm.js";
|
|
4
|
+
import { SearchBoxSheetContext as i } from "./SearchBoxSheetContext.esm.js";
|
|
5
|
+
import { useContext as a, useMemo as o } from "react";
|
|
6
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
7
|
+
//#region src/components/search-box/SearchBoxDateRange.tsx
|
|
8
|
+
function l({ value: l, onChange: u, presets: d, size: f }) {
|
|
9
|
+
let { from: p, to: m } = n(l), h = a(i), g = o(() => d?.map((e) => ({
|
|
10
|
+
preset: e,
|
|
11
|
+
range: e.range()
|
|
12
|
+
})) ?? [], [d]), _ = (e) => {
|
|
13
|
+
let t = e.range();
|
|
14
|
+
u(r(t.from, t.to));
|
|
15
|
+
};
|
|
16
|
+
return /* @__PURE__ */ c("div", {
|
|
17
|
+
className: "flex flex-wrap items-center gap-x-3 gap-y-1.5",
|
|
18
|
+
children: [/* @__PURE__ */ c("div", {
|
|
19
|
+
className: "flex items-center gap-1.5",
|
|
20
|
+
children: [
|
|
21
|
+
/* @__PURE__ */ s(t, {
|
|
22
|
+
value: p,
|
|
23
|
+
onChange: (e) => u(r(e, m)),
|
|
24
|
+
size: f,
|
|
25
|
+
ariaLabel: "시작일",
|
|
26
|
+
disableMobileSheet: h
|
|
27
|
+
}),
|
|
28
|
+
/* @__PURE__ */ s("span", {
|
|
29
|
+
className: "text-neutral-400",
|
|
30
|
+
children: "~"
|
|
31
|
+
}),
|
|
32
|
+
/* @__PURE__ */ s(t, {
|
|
33
|
+
value: m,
|
|
34
|
+
onChange: (e) => u(r(p, e)),
|
|
35
|
+
size: f,
|
|
36
|
+
ariaLabel: "종료일",
|
|
37
|
+
disableMobileSheet: h
|
|
38
|
+
})
|
|
39
|
+
]
|
|
40
|
+
}), g.length > 0 && /* @__PURE__ */ s("div", {
|
|
41
|
+
className: "flex items-center gap-1",
|
|
42
|
+
children: g.map(({ preset: t, range: n }) => {
|
|
43
|
+
let r = p === n.from && m === n.to;
|
|
44
|
+
return /* @__PURE__ */ s(e, {
|
|
45
|
+
variant: r ? "primary" : "tertiary",
|
|
46
|
+
appearance: r ? "filled" : "outlined",
|
|
47
|
+
size: f,
|
|
48
|
+
onClick: () => _(t),
|
|
49
|
+
className: `whitespace-nowrap ${f === "small" ? "h-10" : ""} ${r ? "" : "border-border-tertiary! dark:border-border-secondary!"}`,
|
|
50
|
+
children: t.label
|
|
51
|
+
}, t.label);
|
|
52
|
+
})
|
|
53
|
+
})]
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
//#endregion
|
|
57
|
+
export { l as SearchBoxDateRange };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("../button/Button.cjs.js"),t=require("../date-input/DateInput.cjs.js"),n=require("./SearchBoxSheetContext.cjs.js");let r=require("react"),i=require("react/jsx-runtime");function a({value:a,onChange:o,ariaLabel:s,presets:c,size:l}){let u=(0,r.useContext)(n.SearchBoxSheetContext),d=(0,r.useMemo)(()=>c?.map(e=>({preset:e,date:e.date()}))??[],[c]);return(0,i.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-3 gap-y-1.5`,children:[(0,i.jsx)(t.DateInput,{value:a,onChange:o,size:l,ariaLabel:s,disableMobileSheet:u}),d.length>0&&(0,i.jsx)(`div`,{className:`flex items-center gap-1`,children:d.map(({preset:t,date:n})=>{let r=a===n;return(0,i.jsx)(e.Button,{variant:r?`primary`:`tertiary`,appearance:r?`filled`:`outlined`,size:l,onClick:()=>o(n),className:`whitespace-nowrap ${l===`small`?`h-10`:``} ${r?``:`border-border-tertiary! dark:border-border-secondary!`}`,children:t.label},t.label)})})]})}exports.SearchBoxDateSingle=a;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Button as e } from "../button/Button.esm.js";
|
|
2
|
+
import { DateInput as t } from "../date-input/DateInput.esm.js";
|
|
3
|
+
import { SearchBoxSheetContext as n } from "./SearchBoxSheetContext.esm.js";
|
|
4
|
+
import { useContext as r, useMemo as i } from "react";
|
|
5
|
+
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
6
|
+
//#region src/components/search-box/SearchBoxDateSingle.tsx
|
|
7
|
+
function s({ value: s, onChange: c, ariaLabel: l, presets: u, size: d }) {
|
|
8
|
+
let f = r(n), p = i(() => u?.map((e) => ({
|
|
9
|
+
preset: e,
|
|
10
|
+
date: e.date()
|
|
11
|
+
})) ?? [], [u]);
|
|
12
|
+
return /* @__PURE__ */ o("div", {
|
|
13
|
+
className: "flex flex-wrap items-center gap-x-3 gap-y-1.5",
|
|
14
|
+
children: [/* @__PURE__ */ a(t, {
|
|
15
|
+
value: s,
|
|
16
|
+
onChange: c,
|
|
17
|
+
size: d,
|
|
18
|
+
ariaLabel: l,
|
|
19
|
+
disableMobileSheet: f
|
|
20
|
+
}), p.length > 0 && /* @__PURE__ */ a("div", {
|
|
21
|
+
className: "flex items-center gap-1",
|
|
22
|
+
children: p.map(({ preset: t, date: n }) => {
|
|
23
|
+
let r = s === n;
|
|
24
|
+
return /* @__PURE__ */ a(e, {
|
|
25
|
+
variant: r ? "primary" : "tertiary",
|
|
26
|
+
appearance: r ? "filled" : "outlined",
|
|
27
|
+
size: d,
|
|
28
|
+
onClick: () => c(n),
|
|
29
|
+
className: `whitespace-nowrap ${d === "small" ? "h-10" : ""} ${r ? "" : "border-border-tertiary! dark:border-border-secondary!"}`,
|
|
30
|
+
children: t.label
|
|
31
|
+
}, t.label);
|
|
32
|
+
})
|
|
33
|
+
})]
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { s as SearchBoxDateSingle };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./SearchBoxDateRange.cjs.js"),t=require("./SearchBoxDateSingle.cjs.js"),n=require("./SearchBoxFloatingInput.cjs.js"),r=require("./SearchBoxFloatingSelect.cjs.js"),i=require("./SearchBoxMonth.cjs.js"),a=require("./SearchBoxMultiSelect.cjs.js");let o=require("react/jsx-runtime");function s({field:s,value:c,onChange:l,onEnter:u,size:d}){return s.type===`text`?(0,o.jsx)(n.SearchBoxFloatingInput,{label:s.label,value:c,onChange:l,onEnter:u,size:d,inputMode:s.inputMode}):s.type===`multiSelect`?(0,o.jsx)(a.SearchBoxMultiSelect,{label:s.label,options:s.options,value:c,onChange:l,size:d}):s.type===`dateRange`?(0,o.jsx)(e.SearchBoxDateRange,{value:c,onChange:l,presets:s.presets,size:d}):s.type===`dateSingle`?(0,o.jsx)(t.SearchBoxDateSingle,{value:c,onChange:l,ariaLabel:s.label,presets:s.presets,size:d}):s.type===`month`?(0,o.jsx)(i.SearchBoxMonth,{value:c,onChange:l,ariaLabel:s.label,size:d}):(0,o.jsx)(r.SearchBoxFloatingSelect,{label:s.label,options:s.options,value:c,onChange:l,size:d})}exports.SearchBoxField=s;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { SearchBoxDateRange as e } from "./SearchBoxDateRange.esm.js";
|
|
2
|
+
import { SearchBoxDateSingle as t } from "./SearchBoxDateSingle.esm.js";
|
|
3
|
+
import { SearchBoxFloatingInput as n } from "./SearchBoxFloatingInput.esm.js";
|
|
4
|
+
import { SearchBoxFloatingSelect as r } from "./SearchBoxFloatingSelect.esm.js";
|
|
5
|
+
import { SearchBoxMonth as i } from "./SearchBoxMonth.esm.js";
|
|
6
|
+
import { SearchBoxMultiSelect as a } from "./SearchBoxMultiSelect.esm.js";
|
|
7
|
+
import { jsx as o } from "react/jsx-runtime";
|
|
8
|
+
//#region src/components/search-box/SearchBoxField.tsx
|
|
9
|
+
function s({ field: s, value: c, onChange: l, onEnter: u, size: d }) {
|
|
10
|
+
return s.type === "text" ? /* @__PURE__ */ o(n, {
|
|
11
|
+
label: s.label,
|
|
12
|
+
value: c,
|
|
13
|
+
onChange: l,
|
|
14
|
+
onEnter: u,
|
|
15
|
+
size: d,
|
|
16
|
+
inputMode: s.inputMode
|
|
17
|
+
}) : s.type === "multiSelect" ? /* @__PURE__ */ o(a, {
|
|
18
|
+
label: s.label,
|
|
19
|
+
options: s.options,
|
|
20
|
+
value: c,
|
|
21
|
+
onChange: l,
|
|
22
|
+
size: d
|
|
23
|
+
}) : s.type === "dateRange" ? /* @__PURE__ */ o(e, {
|
|
24
|
+
value: c,
|
|
25
|
+
onChange: l,
|
|
26
|
+
presets: s.presets,
|
|
27
|
+
size: d
|
|
28
|
+
}) : s.type === "dateSingle" ? /* @__PURE__ */ o(t, {
|
|
29
|
+
value: c,
|
|
30
|
+
onChange: l,
|
|
31
|
+
ariaLabel: s.label,
|
|
32
|
+
presets: s.presets,
|
|
33
|
+
size: d
|
|
34
|
+
}) : s.type === "month" ? /* @__PURE__ */ o(i, {
|
|
35
|
+
value: c,
|
|
36
|
+
onChange: l,
|
|
37
|
+
ariaLabel: s.label,
|
|
38
|
+
size: d
|
|
39
|
+
}) : /* @__PURE__ */ o(r, {
|
|
40
|
+
label: s.label,
|
|
41
|
+
options: s.options,
|
|
42
|
+
value: c,
|
|
43
|
+
onChange: l,
|
|
44
|
+
size: d
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
//#endregion
|
|
48
|
+
export { s as SearchBoxField };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
let e=require("react"),t=require("react/jsx-runtime");function n({label:n,value:r,onChange:i,onEnter:a,size:o,inputMode:s,trailing:c}){let[l,u]=(0,e.useState)(!1),d=(0,e.useRef)(null),f=r.length>0,p=l||f,m=o===`mini`?`h-8`:`h-10`,h=o===`mini`?`text-xs`:`text-sm`,g=o===`mini`?`px-2.5`:`px-3`;return(0,t.jsxs)(`div`,{className:`relative ${m} w-full cursor-text rounded-lg border bg-bg-white transition-colors ${l?`border-primary-500`:`border-border-tertiary dark:border-border-secondary`}`,onClick:()=>d.current?.focus(),children:[(0,t.jsx)(`input`,{ref:d,type:`text`,value:r,onChange:e=>i(e.target.value),onFocus:()=>u(!0),onBlur:()=>u(!1),onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),a?.())},inputMode:s,"aria-label":n,className:`peer h-full w-full bg-transparent ${g} ${h} text-text-primary placeholder-transparent focus:outline-hidden`,placeholder:n}),(0,t.jsx)(`span`,{"aria-hidden":`true`,className:`pointer-events-none absolute left-2 px-1 transition-all bg-bg-white ${p?`-top-2 ${o===`mini`?`text-[10px]`:`text-xs`} ${l?`text-primary-500`:`text-text-secondary`}`:`top-1/2 -translate-y-1/2 ${h} text-text-tertiary`}`,children:n}),c&&(0,t.jsx)(`div`,{className:`absolute inset-y-0 right-2 flex items-center`,children:c})]})}exports.SearchBoxFloatingInput=n;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { useRef as e, useState as t } from "react";
|
|
2
|
+
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
3
|
+
//#region src/components/search-box/SearchBoxFloatingInput.tsx
|
|
4
|
+
function i({ label: i, value: a, onChange: o, onEnter: s, size: c, inputMode: l, trailing: u }) {
|
|
5
|
+
let [d, f] = t(!1), p = e(null), m = a.length > 0, h = d || m, g = c === "mini" ? "h-8" : "h-10", _ = c === "mini" ? "text-xs" : "text-sm", v = c === "mini" ? "px-2.5" : "px-3";
|
|
6
|
+
return /* @__PURE__ */ r("div", {
|
|
7
|
+
className: `relative ${g} w-full cursor-text rounded-lg border bg-bg-white transition-colors ${d ? "border-primary-500" : "border-border-tertiary dark:border-border-secondary"}`,
|
|
8
|
+
onClick: () => p.current?.focus(),
|
|
9
|
+
children: [
|
|
10
|
+
/* @__PURE__ */ n("input", {
|
|
11
|
+
ref: p,
|
|
12
|
+
type: "text",
|
|
13
|
+
value: a,
|
|
14
|
+
onChange: (e) => o(e.target.value),
|
|
15
|
+
onFocus: () => f(!0),
|
|
16
|
+
onBlur: () => f(!1),
|
|
17
|
+
onKeyDown: (e) => {
|
|
18
|
+
e.key === "Enter" && (e.preventDefault(), s?.());
|
|
19
|
+
},
|
|
20
|
+
inputMode: l,
|
|
21
|
+
"aria-label": i,
|
|
22
|
+
className: `peer h-full w-full bg-transparent ${v} ${_} text-text-primary placeholder-transparent focus:outline-hidden`,
|
|
23
|
+
placeholder: i
|
|
24
|
+
}),
|
|
25
|
+
/* @__PURE__ */ n("span", {
|
|
26
|
+
"aria-hidden": "true",
|
|
27
|
+
className: `pointer-events-none absolute left-2 px-1 transition-all bg-bg-white ${h ? `-top-2 ${c === "mini" ? "text-[10px]" : "text-xs"} ${d ? "text-primary-500" : "text-text-secondary"}` : `top-1/2 -translate-y-1/2 ${_} text-text-tertiary`}`,
|
|
28
|
+
children: i
|
|
29
|
+
}),
|
|
30
|
+
u && /* @__PURE__ */ n("div", {
|
|
31
|
+
className: "absolute inset-y-0 right-2 flex items-center",
|
|
32
|
+
children: u
|
|
33
|
+
})
|
|
34
|
+
]
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
//#endregion
|
|
38
|
+
export { i as SearchBoxFloatingInput };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("../../node_modules/lucide-react/dist/esm/icons/check.cjs.js"),t=require("../../node_modules/lucide-react/dist/esm/icons/chevron-down.cjs.js");let n=require("react"),r=require("react/jsx-runtime"),i=require("@floating-ui/react");function a({label:a,options:o,value:s,onChange:c,size:l}){let[u,d]=(0,n.useState)(!1),{refs:f,floatingStyles:p,context:m}=(0,i.useFloating)({open:u,onOpenChange:d,placement:`bottom-start`,whileElementsMounted:i.autoUpdate,middleware:[(0,i.offset)(4),(0,i.flip)({fallbackAxisSideDirection:`start`}),(0,i.shift)({padding:8}),(0,i.size)({apply({rects:e,elements:t}){Object.assign(t.floating.style,{minWidth:`${e.reference.width}px`})}})]}),{getReferenceProps:h,getFloatingProps:g}=(0,i.useInteractions)([(0,i.useClick)(m),(0,i.useDismiss)(m),(0,i.useRole)(m,{role:`listbox`})]),_=o.find(e=>String(e.value)===s),v=!!_,y=u||v,b=l===`mini`?`h-8`:`h-10`,x=l===`mini`?`text-xs`:`text-sm`,S=l===`mini`?`px-2.5`:`px-3`;return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(`button`,{ref:f.setReference,type:`button`,...h(),"aria-expanded":u,"aria-haspopup":`listbox`,className:`relative ${b} w-full rounded-lg border bg-bg-white ${S} text-left transition-colors focus-visible:border-primary-500 focus-visible:outline-hidden ${u?`border-primary-500`:`border-border-tertiary dark:border-border-secondary`}`,children:[(0,r.jsxs)(`div`,{className:`flex h-full w-full items-center justify-between gap-2`,children:[(0,r.jsx)(`span`,{className:`truncate ${x} ${v?`text-text-primary`:`text-text-tertiary`}`,children:v?_.label:``}),(0,r.jsx)(t.ChevronDown,{className:`h-3.5 w-3.5 shrink-0 text-icon-tertiary transition-transform ${u?`rotate-180`:``}`})]}),(0,r.jsx)(`span`,{"aria-hidden":`true`,className:`pointer-events-none absolute left-2 px-1 transition-all bg-bg-white ${y?`-top-2 ${l===`mini`?`text-[10px]`:`text-xs`} ${u?`text-primary-500`:`text-text-secondary`}`:`top-1/2 -translate-y-1/2 ${x} text-text-tertiary`}`,children:a})]}),u&&(0,r.jsx)(i.FloatingPortal,{children:(0,r.jsxs)(`div`,{ref:f.setFloating,style:p,...g(),className:`z-9999 max-h-60 overflow-y-auto rounded-lg border border-neutral-200 bg-white py-1 shadow-lg dark:border-neutral-700 dark:bg-neutral-800`,children:[o.map(t=>{let n=String(t.value),i=n===s;return(0,r.jsxs)(`button`,{type:`button`,onClick:()=>{c(n),d(!1)},className:`flex w-full items-center gap-2 px-3 py-1.5 text-left transition-colors hover:bg-neutral-50 dark:hover:bg-neutral-700 ${x} ${i?`text-text-primary`:`text-text-secondary`}`,role:`option`,"aria-selected":i,children:[(0,r.jsx)(`span`,{className:`flex-1 truncate`,children:t.label}),i&&(0,r.jsx)(e.Check,{className:`h-3 w-3 text-primary-500`,strokeWidth:3})]},n)}),o.length===0&&(0,r.jsx)(`div`,{className:`px-3 py-2 text-xs text-text-tertiary`,children:`옵션이 없어요`})]})})]})}exports.SearchBoxFloatingSelect=a;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { Check as e } from "../../node_modules/lucide-react/dist/esm/icons/check.esm.js";
|
|
2
|
+
import { ChevronDown as t } from "../../node_modules/lucide-react/dist/esm/icons/chevron-down.esm.js";
|
|
3
|
+
import { useState as n } from "react";
|
|
4
|
+
import { Fragment as r, jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
5
|
+
import { FloatingPortal as o, autoUpdate as s, flip as c, offset as l, shift as u, size as d, useClick as f, useDismiss as p, useFloating as m, useInteractions as h, useRole as g } from "@floating-ui/react";
|
|
6
|
+
//#region src/components/search-box/SearchBoxFloatingSelect.tsx
|
|
7
|
+
function _({ label: _, options: v, value: y, onChange: b, size: x }) {
|
|
8
|
+
let [S, C] = n(!1), { refs: w, floatingStyles: T, context: E } = m({
|
|
9
|
+
open: S,
|
|
10
|
+
onOpenChange: C,
|
|
11
|
+
placement: "bottom-start",
|
|
12
|
+
whileElementsMounted: s,
|
|
13
|
+
middleware: [
|
|
14
|
+
l(4),
|
|
15
|
+
c({ fallbackAxisSideDirection: "start" }),
|
|
16
|
+
u({ padding: 8 }),
|
|
17
|
+
d({ apply({ rects: e, elements: t }) {
|
|
18
|
+
Object.assign(t.floating.style, { minWidth: `${e.reference.width}px` });
|
|
19
|
+
} })
|
|
20
|
+
]
|
|
21
|
+
}), { getReferenceProps: D, getFloatingProps: O } = h([
|
|
22
|
+
f(E),
|
|
23
|
+
p(E),
|
|
24
|
+
g(E, { role: "listbox" })
|
|
25
|
+
]), k = v.find((e) => String(e.value) === y), A = !!k, j = S || A, M = x === "mini" ? "h-8" : "h-10", N = x === "mini" ? "text-xs" : "text-sm", P = x === "mini" ? "px-2.5" : "px-3";
|
|
26
|
+
return /* @__PURE__ */ a(r, { children: [/* @__PURE__ */ a("button", {
|
|
27
|
+
ref: w.setReference,
|
|
28
|
+
type: "button",
|
|
29
|
+
...D(),
|
|
30
|
+
"aria-expanded": S,
|
|
31
|
+
"aria-haspopup": "listbox",
|
|
32
|
+
className: `relative ${M} w-full rounded-lg border bg-bg-white ${P} text-left transition-colors focus-visible:border-primary-500 focus-visible:outline-hidden ${S ? "border-primary-500" : "border-border-tertiary dark:border-border-secondary"}`,
|
|
33
|
+
children: [/* @__PURE__ */ a("div", {
|
|
34
|
+
className: "flex h-full w-full items-center justify-between gap-2",
|
|
35
|
+
children: [/* @__PURE__ */ i("span", {
|
|
36
|
+
className: `truncate ${N} ${A ? "text-text-primary" : "text-text-tertiary"}`,
|
|
37
|
+
children: A ? k.label : ""
|
|
38
|
+
}), /* @__PURE__ */ i(t, { className: `h-3.5 w-3.5 shrink-0 text-icon-tertiary transition-transform ${S ? "rotate-180" : ""}` })]
|
|
39
|
+
}), /* @__PURE__ */ i("span", {
|
|
40
|
+
"aria-hidden": "true",
|
|
41
|
+
className: `pointer-events-none absolute left-2 px-1 transition-all bg-bg-white ${j ? `-top-2 ${x === "mini" ? "text-[10px]" : "text-xs"} ${S ? "text-primary-500" : "text-text-secondary"}` : `top-1/2 -translate-y-1/2 ${N} text-text-tertiary`}`,
|
|
42
|
+
children: _
|
|
43
|
+
})]
|
|
44
|
+
}), S && /* @__PURE__ */ i(o, { children: /* @__PURE__ */ a("div", {
|
|
45
|
+
ref: w.setFloating,
|
|
46
|
+
style: T,
|
|
47
|
+
...O(),
|
|
48
|
+
className: "z-9999 max-h-60 overflow-y-auto rounded-lg border border-neutral-200 bg-white py-1 shadow-lg dark:border-neutral-700 dark:bg-neutral-800",
|
|
49
|
+
children: [v.map((t) => {
|
|
50
|
+
let n = String(t.value), r = n === y;
|
|
51
|
+
return /* @__PURE__ */ a("button", {
|
|
52
|
+
type: "button",
|
|
53
|
+
onClick: () => {
|
|
54
|
+
b(n), C(!1);
|
|
55
|
+
},
|
|
56
|
+
className: `flex w-full items-center gap-2 px-3 py-1.5 text-left transition-colors hover:bg-neutral-50 dark:hover:bg-neutral-700 ${N} ${r ? "text-text-primary" : "text-text-secondary"}`,
|
|
57
|
+
role: "option",
|
|
58
|
+
"aria-selected": r,
|
|
59
|
+
children: [/* @__PURE__ */ i("span", {
|
|
60
|
+
className: "flex-1 truncate",
|
|
61
|
+
children: t.label
|
|
62
|
+
}), r && /* @__PURE__ */ i(e, {
|
|
63
|
+
className: "h-3 w-3 text-primary-500",
|
|
64
|
+
strokeWidth: 3
|
|
65
|
+
})]
|
|
66
|
+
}, n);
|
|
67
|
+
}), v.length === 0 && /* @__PURE__ */ i("div", {
|
|
68
|
+
className: "px-3 py-2 text-xs text-text-tertiary",
|
|
69
|
+
children: "옵션이 없어요"
|
|
70
|
+
})]
|
|
71
|
+
}) })] });
|
|
72
|
+
}
|
|
73
|
+
//#endregion
|
|
74
|
+
export { _ as SearchBoxFloatingSelect };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("../../node_modules/lucide-react/dist/esm/icons/calendar.cjs.js"),t=require("../date-picker/month-picker.cjs.js"),n=require("./SearchBoxSheetContext.cjs.js");let r=require("react"),i=require("react/jsx-runtime");function a(e){let[t,n]=e.split(`-`),r=Number(t),i=Number(n);if(!(!r||!i))return{year:r,month:i}}function o({year:e,month:t}){return`${e}-${String(t).padStart(2,`0`)}`}function s({value:s,onChange:c,ariaLabel:l,size:u}){let d=(0,r.useContext)(n.SearchBoxSheetContext),f=a(s),p=f?`${f.year}년 ${f.month}월`:`년월 선택`;return(0,i.jsx)(t.MonthPicker,{value:f,onChange:e=>c(o(e)),disableMobileSheet:d,children:(0,i.jsxs)(`button`,{type:`button`,"aria-label":l,className:`inline-flex w-full items-center gap-2 rounded-lg border border-border-tertiary bg-bg-card px-3 text-sm text-text-primary transition-colors hover:bg-bg-base-primary dark:border-border-secondary ${u===`small`?`h-10 py-2`:`h-9 py-1.5`}`,children:[(0,i.jsx)(e.Calendar,{className:`h-4 w-4 shrink-0 text-text-secondary`}),(0,i.jsx)(`span`,{className:f?``:`text-text-tertiary`,children:p})]})})}exports.SearchBoxMonth=s;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Calendar as e } from "../../node_modules/lucide-react/dist/esm/icons/calendar.esm.js";
|
|
2
|
+
import { MonthPicker as t } from "../date-picker/month-picker.esm.js";
|
|
3
|
+
import { SearchBoxSheetContext as n } from "./SearchBoxSheetContext.esm.js";
|
|
4
|
+
import { useContext as r } from "react";
|
|
5
|
+
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
6
|
+
//#region src/components/search-box/SearchBoxMonth.tsx
|
|
7
|
+
function o(e) {
|
|
8
|
+
let [t, n] = e.split("-"), r = Number(t), i = Number(n);
|
|
9
|
+
if (!(!r || !i)) return {
|
|
10
|
+
year: r,
|
|
11
|
+
month: i
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function s({ year: e, month: t }) {
|
|
15
|
+
return `${e}-${String(t).padStart(2, "0")}`;
|
|
16
|
+
}
|
|
17
|
+
function c({ value: c, onChange: l, ariaLabel: u, size: d }) {
|
|
18
|
+
let f = r(n), p = o(c), m = p ? `${p.year}년 ${p.month}월` : "년월 선택";
|
|
19
|
+
return /* @__PURE__ */ i(t, {
|
|
20
|
+
value: p,
|
|
21
|
+
onChange: (e) => l(s(e)),
|
|
22
|
+
disableMobileSheet: f,
|
|
23
|
+
children: /* @__PURE__ */ a("button", {
|
|
24
|
+
type: "button",
|
|
25
|
+
"aria-label": u,
|
|
26
|
+
className: `inline-flex w-full items-center gap-2 rounded-lg border border-border-tertiary bg-bg-card px-3 text-sm text-text-primary transition-colors hover:bg-bg-base-primary dark:border-border-secondary ${d === "small" ? "h-10 py-2" : "h-9 py-1.5"}`,
|
|
27
|
+
children: [/* @__PURE__ */ i(e, { className: "h-4 w-4 shrink-0 text-text-secondary" }), /* @__PURE__ */ i("span", {
|
|
28
|
+
className: p ? "" : "text-text-tertiary",
|
|
29
|
+
children: m
|
|
30
|
+
})]
|
|
31
|
+
})
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//#endregion
|
|
35
|
+
export { c as SearchBoxMonth };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("../../node_modules/lucide-react/dist/esm/icons/check.cjs.js"),t=require("../../node_modules/lucide-react/dist/esm/icons/chevron-down.cjs.js");let n=require("react"),r=require("react/jsx-runtime"),i=require("@floating-ui/react");function a({label:a,options:o,value:s,onChange:c,size:l}){let[u,d]=(0,n.useState)(!1),{refs:f,floatingStyles:p,context:m}=(0,i.useFloating)({open:u,onOpenChange:d,placement:`bottom-start`,whileElementsMounted:i.autoUpdate,middleware:[(0,i.offset)(4),(0,i.flip)({fallbackAxisSideDirection:`start`}),(0,i.shift)({padding:8}),(0,i.size)({apply({rects:e,elements:t}){Object.assign(t.floating.style,{minWidth:`${e.reference.width}px`})}})]}),{getReferenceProps:h,getFloatingProps:g}=(0,i.useInteractions)([(0,i.useClick)(m),(0,i.useDismiss)(m),(0,i.useRole)(m,{role:`listbox`})]),_=s?s.split(`,`).filter(Boolean):[],v=new Set(_),y=_.length>0,b=u||y,x=e=>{let t=new Set(v);t.has(e)?t.delete(e):t.add(e),c(o.filter(e=>t.has(String(e.value))).map(e=>String(e.value)).join(`,`))},S=l===`mini`?`h-8`:`h-10`,C=l===`mini`?`text-xs`:`text-sm`,w=l===`mini`?`px-2.5`:`px-3`,T=y?o.filter(e=>v.has(String(e.value))).map(e=>e.label).join(`, `):``;return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(`button`,{ref:f.setReference,type:`button`,...h(),"aria-expanded":u,"aria-haspopup":`listbox`,className:`relative ${S} w-full rounded-lg border bg-bg-white ${w} text-left transition-colors focus-visible:border-primary-500 focus-visible:outline-hidden ${u?`border-primary-500`:`border-border-tertiary dark:border-border-secondary`}`,children:[(0,r.jsxs)(`div`,{className:`flex h-full w-full items-center justify-between gap-2`,children:[(0,r.jsx)(`span`,{className:`truncate ${C} ${y?`text-text-primary`:`text-text-tertiary`}`,children:T}),(0,r.jsx)(t.ChevronDown,{className:`h-3.5 w-3.5 shrink-0 text-icon-tertiary transition-transform ${u?`rotate-180`:``}`})]}),(0,r.jsx)(`span`,{"aria-hidden":`true`,className:`pointer-events-none absolute left-2 px-1 transition-all bg-bg-white ${b?`-top-2 ${l===`mini`?`text-[10px]`:`text-xs`} ${u?`text-primary-500`:`text-text-secondary`}`:`top-1/2 -translate-y-1/2 ${C} text-text-tertiary`}`,children:a})]}),u&&(0,r.jsx)(i.FloatingPortal,{children:(0,r.jsxs)(`div`,{ref:f.setFloating,style:p,...g(),className:`z-9999 max-h-60 overflow-y-auto rounded-lg border border-neutral-200 bg-white py-1 shadow-lg dark:border-neutral-700 dark:bg-neutral-800`,children:[o.map(t=>{let n=String(t.value),i=v.has(n);return(0,r.jsxs)(`button`,{type:`button`,onClick:()=>x(n),className:`flex w-full items-center gap-2 px-3 py-1.5 text-left transition-colors hover:bg-neutral-50 dark:hover:bg-neutral-700 ${C} ${i?`text-text-primary`:`text-text-secondary`}`,role:`option`,"aria-selected":i,children:[(0,r.jsx)(`span`,{className:`flex h-4 w-4 shrink-0 items-center justify-center rounded border ${i?`border-primary-500 bg-primary-500 text-white`:`border-neutral-300 dark:border-neutral-600`}`,children:i&&(0,r.jsx)(e.Check,{className:`h-3 w-3`,strokeWidth:3})}),(0,r.jsx)(`span`,{className:`flex-1 truncate`,children:t.label})]},n)}),o.length===0&&(0,r.jsx)(`div`,{className:`px-3 py-2 text-xs text-text-tertiary`,children:`옵션이 없어요`})]})})]})}exports.SearchBoxMultiSelect=a;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { Check as e } from "../../node_modules/lucide-react/dist/esm/icons/check.esm.js";
|
|
2
|
+
import { ChevronDown as t } from "../../node_modules/lucide-react/dist/esm/icons/chevron-down.esm.js";
|
|
3
|
+
import { useState as n } from "react";
|
|
4
|
+
import { Fragment as r, jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
5
|
+
import { FloatingPortal as o, autoUpdate as s, flip as c, offset as l, shift as u, size as d, useClick as f, useDismiss as p, useFloating as m, useInteractions as h, useRole as g } from "@floating-ui/react";
|
|
6
|
+
//#region src/components/search-box/SearchBoxMultiSelect.tsx
|
|
7
|
+
function _({ label: _, options: v, value: y, onChange: b, size: x }) {
|
|
8
|
+
let [S, C] = n(!1), { refs: w, floatingStyles: T, context: E } = m({
|
|
9
|
+
open: S,
|
|
10
|
+
onOpenChange: C,
|
|
11
|
+
placement: "bottom-start",
|
|
12
|
+
whileElementsMounted: s,
|
|
13
|
+
middleware: [
|
|
14
|
+
l(4),
|
|
15
|
+
c({ fallbackAxisSideDirection: "start" }),
|
|
16
|
+
u({ padding: 8 }),
|
|
17
|
+
d({ apply({ rects: e, elements: t }) {
|
|
18
|
+
Object.assign(t.floating.style, { minWidth: `${e.reference.width}px` });
|
|
19
|
+
} })
|
|
20
|
+
]
|
|
21
|
+
}), { getReferenceProps: D, getFloatingProps: O } = h([
|
|
22
|
+
f(E),
|
|
23
|
+
p(E),
|
|
24
|
+
g(E, { role: "listbox" })
|
|
25
|
+
]), k = y ? y.split(",").filter(Boolean) : [], A = new Set(k), j = k.length > 0, M = S || j, N = (e) => {
|
|
26
|
+
let t = new Set(A);
|
|
27
|
+
t.has(e) ? t.delete(e) : t.add(e), b(v.filter((e) => t.has(String(e.value))).map((e) => String(e.value)).join(","));
|
|
28
|
+
}, P = x === "mini" ? "h-8" : "h-10", F = x === "mini" ? "text-xs" : "text-sm", I = x === "mini" ? "px-2.5" : "px-3", L = j ? v.filter((e) => A.has(String(e.value))).map((e) => e.label).join(", ") : "";
|
|
29
|
+
return /* @__PURE__ */ a(r, { children: [/* @__PURE__ */ a("button", {
|
|
30
|
+
ref: w.setReference,
|
|
31
|
+
type: "button",
|
|
32
|
+
...D(),
|
|
33
|
+
"aria-expanded": S,
|
|
34
|
+
"aria-haspopup": "listbox",
|
|
35
|
+
className: `relative ${P} w-full rounded-lg border bg-bg-white ${I} text-left transition-colors focus-visible:border-primary-500 focus-visible:outline-hidden ${S ? "border-primary-500" : "border-border-tertiary dark:border-border-secondary"}`,
|
|
36
|
+
children: [/* @__PURE__ */ a("div", {
|
|
37
|
+
className: "flex h-full w-full items-center justify-between gap-2",
|
|
38
|
+
children: [/* @__PURE__ */ i("span", {
|
|
39
|
+
className: `truncate ${F} ${j ? "text-text-primary" : "text-text-tertiary"}`,
|
|
40
|
+
children: L
|
|
41
|
+
}), /* @__PURE__ */ i(t, { className: `h-3.5 w-3.5 shrink-0 text-icon-tertiary transition-transform ${S ? "rotate-180" : ""}` })]
|
|
42
|
+
}), /* @__PURE__ */ i("span", {
|
|
43
|
+
"aria-hidden": "true",
|
|
44
|
+
className: `pointer-events-none absolute left-2 px-1 transition-all bg-bg-white ${M ? `-top-2 ${x === "mini" ? "text-[10px]" : "text-xs"} ${S ? "text-primary-500" : "text-text-secondary"}` : `top-1/2 -translate-y-1/2 ${F} text-text-tertiary`}`,
|
|
45
|
+
children: _
|
|
46
|
+
})]
|
|
47
|
+
}), S && /* @__PURE__ */ i(o, { children: /* @__PURE__ */ a("div", {
|
|
48
|
+
ref: w.setFloating,
|
|
49
|
+
style: T,
|
|
50
|
+
...O(),
|
|
51
|
+
className: "z-9999 max-h-60 overflow-y-auto rounded-lg border border-neutral-200 bg-white py-1 shadow-lg dark:border-neutral-700 dark:bg-neutral-800",
|
|
52
|
+
children: [v.map((t) => {
|
|
53
|
+
let n = String(t.value), r = A.has(n);
|
|
54
|
+
return /* @__PURE__ */ a("button", {
|
|
55
|
+
type: "button",
|
|
56
|
+
onClick: () => N(n),
|
|
57
|
+
className: `flex w-full items-center gap-2 px-3 py-1.5 text-left transition-colors hover:bg-neutral-50 dark:hover:bg-neutral-700 ${F} ${r ? "text-text-primary" : "text-text-secondary"}`,
|
|
58
|
+
role: "option",
|
|
59
|
+
"aria-selected": r,
|
|
60
|
+
children: [/* @__PURE__ */ i("span", {
|
|
61
|
+
className: `flex h-4 w-4 shrink-0 items-center justify-center rounded border ${r ? "border-primary-500 bg-primary-500 text-white" : "border-neutral-300 dark:border-neutral-600"}`,
|
|
62
|
+
children: r && /* @__PURE__ */ i(e, {
|
|
63
|
+
className: "h-3 w-3",
|
|
64
|
+
strokeWidth: 3
|
|
65
|
+
})
|
|
66
|
+
}), /* @__PURE__ */ i("span", {
|
|
67
|
+
className: "flex-1 truncate",
|
|
68
|
+
children: t.label
|
|
69
|
+
})]
|
|
70
|
+
}, n);
|
|
71
|
+
}), v.length === 0 && /* @__PURE__ */ i("div", {
|
|
72
|
+
className: "px-3 py-2 text-xs text-text-tertiary",
|
|
73
|
+
children: "옵션이 없어요"
|
|
74
|
+
})]
|
|
75
|
+
}) })] });
|
|
76
|
+
}
|
|
77
|
+
//#endregion
|
|
78
|
+
export { _ as SearchBoxMultiSelect };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=(0,require("react").createContext)(!1);exports.SearchBoxSheetContext=e;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./parseDateRange.cjs.js");let t=require("date-fns");var n=`yyyy-MM-dd`;function r(){let e=(0,t.format)(new Date,n);return{from:e,to:e}}function i(){let{from:t,to:n}=r();return e.serializeDateRangeValue(t,n)}var a=[{label:`전일`,range:()=>{let e=(0,t.format)((0,t.subDays)(new Date,1),n);return{from:e,to:e}}},{label:`당일`,range:()=>{let e=(0,t.format)(new Date,n);return{from:e,to:e}}},{label:`당월`,range:()=>{let e=new Date;return{from:(0,t.format)((0,t.startOfMonth)(e),n),to:(0,t.format)((0,t.endOfMonth)(e),n)}}},{label:`전월`,range:()=>{let e=(0,t.subMonths)(new Date,1);return{from:(0,t.format)((0,t.startOfMonth)(e),n),to:(0,t.format)((0,t.endOfMonth)(e),n)}}}];exports.DEFAULT_DATE_RANGE_PRESETS=a,exports.getTodayDateRange=r,exports.getTodayDateRangeValue=i;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { serializeDateRangeValue as e } from "./parseDateRange.esm.js";
|
|
2
|
+
import { endOfMonth as t, format as n, startOfMonth as r, subDays as i, subMonths as a } from "date-fns";
|
|
3
|
+
//#region src/components/search-box/dateRangePresets.ts
|
|
4
|
+
var o = "yyyy-MM-dd";
|
|
5
|
+
function s() {
|
|
6
|
+
let e = n(/* @__PURE__ */ new Date(), o);
|
|
7
|
+
return {
|
|
8
|
+
from: e,
|
|
9
|
+
to: e
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function c() {
|
|
13
|
+
let { from: t, to: n } = s();
|
|
14
|
+
return e(t, n);
|
|
15
|
+
}
|
|
16
|
+
var l = [
|
|
17
|
+
{
|
|
18
|
+
label: "전일",
|
|
19
|
+
range: () => {
|
|
20
|
+
let e = n(i(/* @__PURE__ */ new Date(), 1), o);
|
|
21
|
+
return {
|
|
22
|
+
from: e,
|
|
23
|
+
to: e
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
label: "당일",
|
|
29
|
+
range: () => {
|
|
30
|
+
let e = n(/* @__PURE__ */ new Date(), o);
|
|
31
|
+
return {
|
|
32
|
+
from: e,
|
|
33
|
+
to: e
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
label: "당월",
|
|
39
|
+
range: () => {
|
|
40
|
+
let e = /* @__PURE__ */ new Date();
|
|
41
|
+
return {
|
|
42
|
+
from: n(r(e), o),
|
|
43
|
+
to: n(t(e), o)
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
label: "전월",
|
|
49
|
+
range: () => {
|
|
50
|
+
let e = a(/* @__PURE__ */ new Date(), 1);
|
|
51
|
+
return {
|
|
52
|
+
from: n(r(e), o),
|
|
53
|
+
to: n(t(e), o)
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
];
|
|
58
|
+
//#endregion
|
|
59
|
+
export { l as DEFAULT_DATE_RANGE_PRESETS, s as getTodayDateRange, c as getTodayDateRangeValue };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=`~`;function t(t){if(!t)return{from:``,to:``};let n=t.indexOf(e);return n===-1?{from:t,to:``}:{from:t.slice(0,n),to:t.slice(n+1)}}function n(t,n){return!t&&!n?``:`${t}${e}${n}`}exports.parseDateRangeValue=t,exports.serializeDateRangeValue=n;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
//#region src/components/search-box/parseDateRange.ts
|
|
2
|
+
var e = "~";
|
|
3
|
+
function t(t) {
|
|
4
|
+
if (!t) return {
|
|
5
|
+
from: "",
|
|
6
|
+
to: ""
|
|
7
|
+
};
|
|
8
|
+
let n = t.indexOf(e);
|
|
9
|
+
return n === -1 ? {
|
|
10
|
+
from: t,
|
|
11
|
+
to: ""
|
|
12
|
+
} : {
|
|
13
|
+
from: t.slice(0, n),
|
|
14
|
+
to: t.slice(n + 1)
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function n(t, n) {
|
|
18
|
+
return !t && !n ? "" : `${t}${e}${n}`;
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
21
|
+
export { t as parseDateRangeValue, n as serializeDateRangeValue };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./parseDateRange.cjs.js");function t(e){return e?e.split(`,`).filter(Boolean):[]}function n(n,r){let i={};for(let a of n){let n=a.hidden?``:r[a.key]??``;a.type===`multiSelect`?i[a.key]=t(n):a.type===`dateRange`?i[a.key]=e.parseDateRangeValue(n):i[a.key]=n}return i}exports.parseMultiSelectValue=t,exports.parseSearchValues=n;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { parseDateRangeValue as e } from "./parseDateRange.esm.js";
|
|
2
|
+
//#region src/components/search-box/parseSearchValues.ts
|
|
3
|
+
function t(e) {
|
|
4
|
+
return e ? e.split(",").filter(Boolean) : [];
|
|
5
|
+
}
|
|
6
|
+
function n(n, r) {
|
|
7
|
+
let i = {};
|
|
8
|
+
for (let a of n) {
|
|
9
|
+
let n = a.hidden ? "" : r[a.key] ?? "";
|
|
10
|
+
a.type === "multiSelect" ? i[a.key] = t(n) : a.type === "dateRange" ? i[a.key] = e(n) : i[a.key] = n;
|
|
11
|
+
}
|
|
12
|
+
return i;
|
|
13
|
+
}
|
|
14
|
+
//#endregion
|
|
15
|
+
export { t as parseMultiSelectValue, n as parseSearchValues };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("../../_virtual/_rolldown/runtime.cjs.js"),t=require("./parseDateRange.cjs.js");let n=require("react"),r=require("react-hot-toast");r=e.__toESM(r,1);function i({fields:e,values:i,onSearch:l,onClear:u}){let[d,f]=(0,n.useState)(()=>a(e,i)),p=(0,n.useRef)(i);return(0,n.useEffect)(()=>{let t=p.current;c(i,t,e)||(f(n=>{let r={...n};for(let a of e)(n[a.key]??``)===(t[a.key]??``)&&(r[a.key]=i[a.key]??``);return r}),p.current=i)},[i]),{draft:d,setFieldValue:(e,t)=>{f(n=>({...n,[e]:t}))},submit:()=>{for(let n of e){if(n.hidden||n.type!==`dateRange`)continue;let{from:e,to:i}=t.parseDateRangeValue(d[n.key]??``);if(e&&i&&e>i)return r.default.error(`${n.label} 종료일이 시작일보다 빠를 수 없어요`),!1}return l(s(e,d)),!0},clear:()=>{let t=o(e);f(t),u?u():l(t)},chips:e.map(e=>{if(e.hidden)return null;let t=i[e.key]??``;if(t===``)return null;if(e.type===`select`){let n=e.options.find(e=>String(e.value)===t);return{key:e.key,label:e.label,valueLabel:n?.label??t}}if(e.type===`multiSelect`){let n=t.split(`,`).filter(Boolean);if(n.length===0)return null;let r=new Map(e.options.map(e=>[String(e.value),e.label])),i=n.map(e=>r.get(e)??e);return{key:e.key,label:e.label,valueLabel:i.join(`, `)}}return null}).filter(e=>e!==null),removeChip:e=>{let t={...i,[e]:``};f(t),l(t)}}}function a(e,t){let n={};for(let r of e)n[r.key]=t[r.key]??``;return n}function o(e){let t={};for(let n of e)t[n.key]=``;return t}function s(e,t){let n={...t};for(let t of e)t.hidden&&(n[t.key]=``);return n}function c(e,t,n){for(let r of n)if((e[r.key]??``)!==(t[r.key]??``))return!1;return!0}exports.useSearchBoxState=i;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { parseDateRangeValue as e } from "./parseDateRange.esm.js";
|
|
2
|
+
import { useEffect as t, useRef as n, useState as r } from "react";
|
|
3
|
+
import i from "react-hot-toast";
|
|
4
|
+
//#region src/components/search-box/useSearchBoxState.ts
|
|
5
|
+
function a({ fields: a, values: u, onSearch: d, onClear: f }) {
|
|
6
|
+
let [p, m] = r(() => o(a, u)), h = n(u);
|
|
7
|
+
return t(() => {
|
|
8
|
+
let e = h.current;
|
|
9
|
+
l(u, e, a) || (m((t) => {
|
|
10
|
+
let n = { ...t };
|
|
11
|
+
for (let r of a) (t[r.key] ?? "") === (e[r.key] ?? "") && (n[r.key] = u[r.key] ?? "");
|
|
12
|
+
return n;
|
|
13
|
+
}), h.current = u);
|
|
14
|
+
}, [u]), {
|
|
15
|
+
draft: p,
|
|
16
|
+
setFieldValue: (e, t) => {
|
|
17
|
+
m((n) => ({
|
|
18
|
+
...n,
|
|
19
|
+
[e]: t
|
|
20
|
+
}));
|
|
21
|
+
},
|
|
22
|
+
submit: () => {
|
|
23
|
+
for (let t of a) {
|
|
24
|
+
if (t.hidden || t.type !== "dateRange") continue;
|
|
25
|
+
let { from: n, to: r } = e(p[t.key] ?? "");
|
|
26
|
+
if (n && r && n > r) return i.error(`${t.label} 종료일이 시작일보다 빠를 수 없어요`), !1;
|
|
27
|
+
}
|
|
28
|
+
return d(c(a, p)), !0;
|
|
29
|
+
},
|
|
30
|
+
clear: () => {
|
|
31
|
+
let e = s(a);
|
|
32
|
+
m(e), f ? f() : d(e);
|
|
33
|
+
},
|
|
34
|
+
chips: a.map((e) => {
|
|
35
|
+
if (e.hidden) return null;
|
|
36
|
+
let t = u[e.key] ?? "";
|
|
37
|
+
if (t === "") return null;
|
|
38
|
+
if (e.type === "select") {
|
|
39
|
+
let n = e.options.find((e) => String(e.value) === t);
|
|
40
|
+
return {
|
|
41
|
+
key: e.key,
|
|
42
|
+
label: e.label,
|
|
43
|
+
valueLabel: n?.label ?? t
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
if (e.type === "multiSelect") {
|
|
47
|
+
let n = t.split(",").filter(Boolean);
|
|
48
|
+
if (n.length === 0) return null;
|
|
49
|
+
let r = new Map(e.options.map((e) => [String(e.value), e.label])), i = n.map((e) => r.get(e) ?? e);
|
|
50
|
+
return {
|
|
51
|
+
key: e.key,
|
|
52
|
+
label: e.label,
|
|
53
|
+
valueLabel: i.join(", ")
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}).filter((e) => e !== null),
|
|
58
|
+
removeChip: (e) => {
|
|
59
|
+
let t = {
|
|
60
|
+
...u,
|
|
61
|
+
[e]: ""
|
|
62
|
+
};
|
|
63
|
+
m(t), d(t);
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function o(e, t) {
|
|
68
|
+
let n = {};
|
|
69
|
+
for (let r of e) n[r.key] = t[r.key] ?? "";
|
|
70
|
+
return n;
|
|
71
|
+
}
|
|
72
|
+
function s(e) {
|
|
73
|
+
let t = {};
|
|
74
|
+
for (let n of e) t[n.key] = "";
|
|
75
|
+
return t;
|
|
76
|
+
}
|
|
77
|
+
function c(e, t) {
|
|
78
|
+
let n = { ...t };
|
|
79
|
+
for (let t of e) t.hidden && (n[t.key] = "");
|
|
80
|
+
return n;
|
|
81
|
+
}
|
|
82
|
+
function l(e, t, n) {
|
|
83
|
+
for (let r of n) if ((e[r.key] ?? "") !== (t[r.key] ?? "")) return !1;
|
|
84
|
+
return !0;
|
|
85
|
+
}
|
|
86
|
+
//#endregion
|
|
87
|
+
export { a as useSearchBoxState };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("../../node_modules/lucide-react/dist/esm/icons/check.cjs.js"),t=require("../../node_modules/lucide-react/dist/esm/icons/chevron-down.cjs.js"),n=require("../../node_modules/lucide-react/dist/esm/icons/circle-x.cjs.js"),r=require("../../node_modules/lucide-react/dist/esm/icons/search.cjs.js"),i=require("../_shared/form-size-tokens.cjs.js"),a=require("../input/utils.cjs.js"),ee=require("./loading-dots.cjs.js");let o=require("react"),s=require("react/jsx-runtime"),c=require("@floating-ui/react");var te=e=>e.length===0?``:e.map(e=>e.label).join(`, `),ne=e=>e.length===0?``:`${e.length}개 선택`,l=(0,o.forwardRef)(function({options:l,value:u,onChange:d,variant:f,selectSize:p=`medium`,label:m,labelOption:h=`appear`,help:g,placeholder:re=`선택해주세요`,hasError:_=!1,disabled:v=!1,suffix:y,trailingIcon:b,clearable:x=!1,badge:S,searchable:C=!1,searchPlaceholder:ie=`검색...`,onSearchChange:w,isSearchLoading:T=!1,containerProps:ae,containerRef:oe,className:se=``,panelClassName:ce=``,formatTrigger:le=te,formatCollapsed:ue=ne,disableAutoCollapse:E=!1,showSelectAll:de=!1,id:D,name:O,"data-testid":fe},k){let[A,pe]=(0,o.useState)(!1),[j,M]=(0,o.useState)(null),[N,P]=(0,o.useState)(``),[me,F]=(0,o.useState)(!1),I=(0,o.useRef)([]),L=(0,o.useRef)(null),R=(0,o.useRef)(null),z=(0,o.useRef)(null),B=(0,o.useId)(),V=e=>`${B}-opt-${e}`,he=j===null?void 0:V(j),H=typeof w==`function`,U=(0,o.useMemo)(()=>{if(!C||H||N.length===0)return l;let e=N.toLowerCase();return l.filter(t=>t.label.toLowerCase().includes(e))},[l,C,H,N]),W=(0,o.useMemo)(()=>new Set(u),[u]),G=(0,o.useMemo)(()=>l.filter(e=>W.has(String(e.value))),[l,W]),{refs:K,floatingStyles:ge,context:q}=(0,c.useFloating)({open:A,onOpenChange:pe,placement:`bottom-start`,whileElementsMounted:c.autoUpdate,middleware:[(0,c.offset)(4),(0,c.flip)({padding:8}),(0,c.shift)({padding:8}),(0,c.size)({apply({rects:e,elements:t,availableHeight:n}){Object.assign(t.floating.style,{minWidth:`${e.reference.width}px`,maxHeight:`${Math.min(n,320)}px`})},padding:8})]}),{getReferenceProps:_e,getFloatingProps:ve,getItemProps:ye}=(0,c.useInteractions)([(0,c.useClick)(q,{enabled:!v}),(0,c.useDismiss)(q),(0,c.useRole)(q,{role:`listbox`}),(0,c.useListNavigation)(q,{listRef:I,activeIndex:j,onNavigate:M,virtual:C,loop:!0})]);(0,o.useEffect)(()=>{A||(P(``),M(null),H&&w(``))},[A,H,w]),(0,o.useEffect)(()=>{A&&C&&L.current&&L.current.focus()},[A,C]),(0,o.useLayoutEffect)(()=>{if(E){F(!1);return}let e=R.current,t=z.current;if(!e||!t)return;let n=()=>{let n=t.scrollWidth,r=e.clientWidth;F(n>r-1)};n();let r=new ResizeObserver(()=>{requestAnimationFrame(n)});return r.observe(e),()=>r.disconnect()},[E,u.join(`,`)]);let J=e=>{let t=new Set(W);t.has(e)?t.delete(e):t.add(e),d(l.filter(e=>t.has(String(e.value))).map(e=>String(e.value)))},be=e=>{e.stopPropagation(),d([])},Y=U.filter(e=>!e.disabled).map(e=>String(e.value)),xe=Y.length>0&&Y.every(e=>W.has(e)),Se=()=>{if(xe){let e=new Set(Y);d(u.filter(t=>!e.has(t)))}else{let e=new Set([...u,...Y]);d(l.filter(t=>e.has(String(t.value))).map(e=>String(e.value)))}},Ce=e=>{!x||v||u.length===0||A||(e.key===`Backspace`||e.key===`Delete`)&&(e.preventDefault(),d([]))},we=e=>{let t=e.target.value;P(t),H&&w(t)},Te=e=>{if(!e.nativeEvent.isComposing&&e.key===`Enter`&&j!==null){e.preventDefault();let t=U[j];t&&!t.disabled&&J(String(t.value))}},X=G.length>0,Ee=h===`sustain`||h===`appear`&&X,De=X?le(G):``,Oe=X?ue(G):``,ke=X?me?Oe:De:re,Ae=i.SLOT_GAP_CLASS[p],Z=i.SLOT_CHILD_ICON_CLASS[p],je=i.SLOT_BADGE_TEXT_CLASS[p],Me=i.SLOT_ICON_SIZE_CLASS[p],Ne=i.CHEVRON_SIZE_CLASS[p],Pe=a.getInputVariantClasses(f,_,v,p),Q=a.getInputTrailingIconColor(_,v,X||A),$=p===`mini`?`text-xs`:p===`large`?`text-base`:`text-sm`,Fe=v?`text-text-disabled`:_?`text-text-danger`:X?`text-text-primary`:`text-text-tertiary`;return(0,s.jsxs)(`div`,{ref:oe,className:a.getInputContainerClasses(),...ae,children:[!E&&X&&(0,s.jsx)(`span`,{ref:z,"aria-hidden":!0,className:`pointer-events-none fixed left-0 -top-[9999px] whitespace-nowrap ${$}`,children:De}),Ee&&m&&(0,s.jsx)(`label`,{className:a.getInputLabelClasses(f,_),htmlFor:D,children:m}),(0,s.jsxs)(`button`,{ref:e=>{K.setReference(e),typeof k==`function`?k(e):k&&(k.current=e)},id:D,type:`button`,disabled:v,"aria-haspopup":`listbox`,"aria-expanded":A,"aria-controls":A?B:void 0,"aria-activedescendant":he,"data-testid":fe,..._e({onKeyDown:Ce}),className:`${Pe} flex w-full items-center ${Ae} ${v?`cursor-not-allowed`:`cursor-pointer`} ${se}`.trim().replace(/\s+/g,` `),children:[(0,s.jsx)(`span`,{ref:R,className:`flex-1 truncate text-left ${$} ${Fe}`,children:ke}),y&&(0,s.jsx)(`span`,{className:`shrink-0 whitespace-nowrap ${$} ${Q}`,children:y}),b&&(0,s.jsx)(`span`,{className:`flex shrink-0 items-center ${Q} ${Z}`,children:b}),x&&!v&&X&&(0,s.jsx)(`span`,{role:`button`,tabIndex:-1,onClick:be,"aria-label":`선택 모두 지우기`,className:`flex shrink-0 cursor-pointer items-center ${Q} hover:text-text-primary`,children:(0,s.jsx)(n.CircleX,{className:Me,strokeWidth:1.5,"aria-hidden":!0})}),S&&(0,s.jsx)(`span`,{className:`flex shrink-0 items-center ${Z} ${je}`,children:S}),(0,s.jsx)(t.ChevronDown,{className:`shrink-0 transition-transform ${Ne} ${Q} ${A?`rotate-180`:``}`,strokeWidth:1.5,"aria-hidden":!0})]}),O&&(0,s.jsx)(`input`,{type:`hidden`,name:O,value:u.join(`,`)}),A&&(0,s.jsx)(c.FloatingPortal,{children:(0,s.jsx)(c.FloatingFocusManager,{context:q,modal:!1,initialFocus:C?-1:0,children:(0,s.jsxs)(`div`,{ref:K.setFloating,id:B,style:ge,...ve(),className:`z-9999 overflow-hidden rounded-lg border border-border-tertiary bg-bg-white shadow-lg dark:border-border-secondary dark:bg-neutral-800 ${ce}`,children:[C&&(0,s.jsxs)(`div`,{className:`flex items-center gap-2 border-b border-border-tertiary px-3 py-2 dark:border-border-secondary`,children:[(0,s.jsx)(r.Search,{className:`h-4 w-4 shrink-0 text-icon-tertiary`,"aria-hidden":!0}),(0,s.jsx)(`input`,{ref:L,type:`text`,value:N,onChange:we,onKeyDown:Te,placeholder:ie,className:`flex-1 bg-transparent text-sm outline-hidden placeholder:text-text-tertiary`}),T&&(0,s.jsx)(ee.LoadingDots,{className:`h-4 w-4 shrink-0 text-icon-tertiary`})]}),de&&U.length>0&&(0,s.jsxs)(`button`,{type:`button`,onClick:Se,className:`flex w-full items-center justify-between border-b border-border-tertiary px-3 py-2 text-xs text-text-secondary transition-colors hover:bg-neutral-50 dark:border-border-secondary dark:hover:bg-neutral-700`,children:[(0,s.jsx)(`span`,{children:xe?`전체 해제`:`전체 선택`}),(0,s.jsxs)(`span`,{className:`text-text-tertiary`,children:[Y.length,`개`]})]}),(0,s.jsx)(`div`,{className:`max-h-72 overflow-y-auto py-1`,children:U.length===0?(0,s.jsx)(`div`,{className:`px-3 py-4 text-center text-sm text-text-tertiary`,children:T?`검색 중...`:`옵션이 없어요`}):U.map((t,n)=>{let r=String(t.value),i=W.has(r),a=j===n;return(0,s.jsxs)(`div`,{id:V(n),ref:e=>{I.current[n]=e},role:`option`,"aria-selected":i,"aria-disabled":t.disabled||void 0,tabIndex:a?0:-1,...ye({onClick:()=>{t.disabled||J(r)},onKeyDown:e=>{t.disabled||(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),J(r))}}),className:`flex cursor-pointer items-start gap-3 px-3 py-2 text-sm transition-colors ${t.disabled?`cursor-not-allowed text-text-disabled`:a?`bg-neutral-100 text-text-primary dark:bg-neutral-700`:`text-text-primary hover:bg-neutral-50 dark:hover:bg-neutral-700`}`,children:[(0,s.jsx)(`span`,{className:`mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded border ${i?`border-primary-500 bg-primary-500 text-white`:`border-border-tertiary dark:border-border-secondary`}`,"aria-hidden":!0,children:i&&(0,s.jsx)(e.Check,{className:`h-3 w-3`,strokeWidth:3})}),(0,s.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,s.jsx)(`div`,{className:`truncate ${i?`font-medium`:``}`,children:t.label}),t.description&&(0,s.jsx)(`div`,{className:`mt-0.5 truncate text-xs text-text-tertiary`,children:t.description})]}),t.trailing&&(0,s.jsx)(`span`,{className:`shrink-0 text-xs text-text-tertiary`,children:t.trailing})]},r)})})]})})}),g&&(0,s.jsx)(`div`,{className:a.getInputHelpClasses(_),children:g})]})});exports.MultiSelect=l;
|