sellmate-design-system-react 0.1.11 โ 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/components/SActionModal/SActionModal.cjs +7 -3
- package/dist/components/SActionModal/SActionModal.cjs.map +1 -1
- package/dist/components/SActionModal/SActionModal.js +7 -3
- package/dist/components/SActionModal/SActionModal.js.map +1 -1
- package/dist/components/SBarcodeInput/SBarcodeInput.cjs +7 -3
- package/dist/components/SBarcodeInput/SBarcodeInput.cjs.map +1 -1
- package/dist/components/SBarcodeInput/SBarcodeInput.js +7 -3
- package/dist/components/SBarcodeInput/SBarcodeInput.js.map +1 -1
- package/dist/components/SCalendar/SCalendar.cjs +7 -3
- package/dist/components/SCalendar/SCalendar.cjs.map +1 -1
- package/dist/components/SCalendar/SCalendar.js +7 -3
- package/dist/components/SCalendar/SCalendar.js.map +1 -1
- package/dist/components/SChip/SChip.cjs +7 -3
- package/dist/components/SChip/SChip.cjs.map +1 -1
- package/dist/components/SChip/SChip.js +7 -3
- package/dist/components/SChip/SChip.js.map +1 -1
- package/dist/components/SChipInput/SChipInput.cjs +23 -10
- package/dist/components/SChipInput/SChipInput.cjs.map +1 -1
- package/dist/components/SChipInput/SChipInput.js +23 -10
- package/dist/components/SChipInput/SChipInput.js.map +1 -1
- package/dist/components/SCircleProgress/SCircleProgress.cjs +6 -2
- package/dist/components/SCircleProgress/SCircleProgress.cjs.map +1 -1
- package/dist/components/SCircleProgress/SCircleProgress.js +6 -2
- package/dist/components/SCircleProgress/SCircleProgress.js.map +1 -1
- package/dist/components/SConfirmModal/SConfirmModal.cjs +7 -3
- package/dist/components/SConfirmModal/SConfirmModal.cjs.map +1 -1
- package/dist/components/SConfirmModal/SConfirmModal.js +7 -3
- package/dist/components/SConfirmModal/SConfirmModal.js.map +1 -1
- package/dist/components/SDatePicker/SDatePicker.cjs +7 -3
- package/dist/components/SDatePicker/SDatePicker.cjs.map +1 -1
- package/dist/components/SDatePicker/SDatePicker.js +7 -3
- package/dist/components/SDatePicker/SDatePicker.js.map +1 -1
- package/dist/components/SDateRangePicker/SDateRangePicker.cjs +7 -3
- package/dist/components/SDateRangePicker/SDateRangePicker.cjs.map +1 -1
- package/dist/components/SDateRangePicker/SDateRangePicker.js +7 -3
- package/dist/components/SDateRangePicker/SDateRangePicker.js.map +1 -1
- package/dist/components/SDropdownButton/SDropdownButton.cjs +1 -1
- package/dist/components/SDropdownButton/SDropdownButton.cjs.map +1 -1
- package/dist/components/SDropdownButton/SDropdownButton.js +1 -1
- package/dist/components/SDropdownButton/SDropdownButton.js.map +1 -1
- package/dist/components/SField/SField.cjs +7 -3
- package/dist/components/SField/SField.cjs.map +1 -1
- package/dist/components/SField/SField.js +7 -3
- package/dist/components/SField/SField.js.map +1 -1
- package/dist/components/SFilePicker/SFilePicker.cjs +7 -3
- package/dist/components/SFilePicker/SFilePicker.cjs.map +1 -1
- package/dist/components/SFilePicker/SFilePicker.js +7 -3
- package/dist/components/SFilePicker/SFilePicker.js.map +1 -1
- package/dist/components/SGhostButton/SGhostButton.cjs +7 -3
- package/dist/components/SGhostButton/SGhostButton.cjs.map +1 -1
- package/dist/components/SGhostButton/SGhostButton.d.ts +5 -1
- package/dist/components/SGhostButton/SGhostButton.js +7 -3
- package/dist/components/SGhostButton/SGhostButton.js.map +1 -1
- package/dist/components/SGnb/SGnb.cjs +3297 -0
- package/dist/components/SGnb/SGnb.cjs.map +1 -0
- package/dist/components/SGnb/SGnb.d.ts +35 -0
- package/dist/components/SGnb/SGnb.js +3295 -0
- package/dist/components/SGnb/SGnb.js.map +1 -0
- package/dist/components/SGnb/gnb.config.d.ts +63 -0
- package/dist/components/SGnb/index.d.ts +2 -0
- package/dist/components/SGuide/SGuide.cjs +7 -3
- package/dist/components/SGuide/SGuide.cjs.map +1 -1
- package/dist/components/SGuide/SGuide.js +7 -3
- package/dist/components/SGuide/SGuide.js.map +1 -1
- package/dist/components/SInput/SInput.cjs +7 -3
- package/dist/components/SInput/SInput.cjs.map +1 -1
- package/dist/components/SInput/SInput.js +7 -3
- package/dist/components/SInput/SInput.js.map +1 -1
- package/dist/components/SKeyValueTable/SKeyValueTable.cjs +18 -6
- package/dist/components/SKeyValueTable/SKeyValueTable.cjs.map +1 -1
- package/dist/components/SKeyValueTable/SKeyValueTable.js +18 -6
- package/dist/components/SKeyValueTable/SKeyValueTable.js.map +1 -1
- package/dist/components/SLayout/SLayout.cjs +79 -0
- package/dist/components/SLayout/SLayout.cjs.map +1 -0
- package/dist/components/SLayout/SLayout.d.ts +41 -0
- package/dist/components/SLayout/SLayout.js +75 -0
- package/dist/components/SLayout/SLayout.js.map +1 -0
- package/dist/components/SLayout/index.d.ts +1 -0
- package/dist/components/SLoadingContainer/SLoadingContainer.cjs +6 -2
- package/dist/components/SLoadingContainer/SLoadingContainer.cjs.map +1 -1
- package/dist/components/SLoadingContainer/SLoadingContainer.js +6 -2
- package/dist/components/SLoadingContainer/SLoadingContainer.js.map +1 -1
- package/dist/components/SLoadingContainer/loading.cjs +6 -2
- package/dist/components/SLoadingContainer/loading.cjs.map +1 -1
- package/dist/components/SLoadingContainer/loading.js +6 -2
- package/dist/components/SLoadingContainer/loading.js.map +1 -1
- package/dist/components/SLoadingModal/SLoadingModal.cjs +13 -5
- package/dist/components/SLoadingModal/SLoadingModal.cjs.map +1 -1
- package/dist/components/SLoadingModal/SLoadingModal.js +13 -5
- package/dist/components/SLoadingModal/SLoadingModal.js.map +1 -1
- package/dist/components/SModalContainer/SModalContainer.cjs +7 -3
- package/dist/components/SModalContainer/SModalContainer.cjs.map +1 -1
- package/dist/components/SModalContainer/SModalContainer.d.ts +10 -0
- package/dist/components/SModalContainer/SModalContainer.js +7 -3
- package/dist/components/SModalContainer/SModalContainer.js.map +1 -1
- package/dist/components/SNumberInput/SNumberInput.cjs +7 -3
- package/dist/components/SNumberInput/SNumberInput.cjs.map +1 -1
- package/dist/components/SNumberInput/SNumberInput.js +7 -3
- package/dist/components/SNumberInput/SNumberInput.js.map +1 -1
- package/dist/components/SPage/SPage.cjs +86 -0
- package/dist/components/SPage/SPage.cjs.map +1 -0
- package/dist/components/SPage/SPage.d.ts +13 -0
- package/dist/components/SPage/SPage.js +84 -0
- package/dist/components/SPage/SPage.js.map +1 -0
- package/dist/components/SPage/index.d.ts +1 -0
- package/dist/components/SPopover/SPopover.cjs +7 -3
- package/dist/components/SPopover/SPopover.cjs.map +1 -1
- package/dist/components/SPopover/SPopover.js +7 -3
- package/dist/components/SPopover/SPopover.js.map +1 -1
- package/dist/components/SPortal/SPortal.cjs +1 -1
- package/dist/components/SPortal/SPortal.cjs.map +1 -1
- package/dist/components/SPortal/SPortal.js +1 -1
- package/dist/components/SPortal/SPortal.js.map +1 -1
- package/dist/components/SSelect/SSelect.cjs +18 -6
- package/dist/components/SSelect/SSelect.cjs.map +1 -1
- package/dist/components/SSelect/SSelect.js +18 -6
- package/dist/components/SSelect/SSelect.js.map +1 -1
- package/dist/components/STable/STable.cjs +26 -10
- package/dist/components/STable/STable.cjs.map +1 -1
- package/dist/components/STable/STable.js +26 -10
- package/dist/components/STable/STable.js.map +1 -1
- package/dist/components/STextarea/STextarea.cjs +7 -3
- package/dist/components/STextarea/STextarea.cjs.map +1 -1
- package/dist/components/STextarea/STextarea.js +7 -3
- package/dist/components/STextarea/STextarea.js.map +1 -1
- package/dist/components/SToast/SToast.cjs +7 -3
- package/dist/components/SToast/SToast.cjs.map +1 -1
- package/dist/components/SToast/SToast.js +7 -3
- package/dist/components/SToast/SToast.js.map +1 -1
- package/dist/components/SToast/SToastContainer.cjs +7 -3
- package/dist/components/SToast/SToastContainer.cjs.map +1 -1
- package/dist/components/SToast/SToastContainer.js +7 -3
- package/dist/components/SToast/SToastContainer.js.map +1 -1
- package/dist/components/STooltip/STooltip.cjs +7 -3
- package/dist/components/STooltip/STooltip.cjs.map +1 -1
- package/dist/components/STooltip/STooltip.js +7 -3
- package/dist/components/STooltip/STooltip.js.map +1 -1
- package/dist/index.cjs +430 -17
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.js +422 -19
- package/dist/index.js.map +1 -1
- package/dist/styles.css +192 -26
- package/dist/theme.css +66 -13
- package/package.json +1 -1
|
@@ -120,7 +120,7 @@ function SPortal({
|
|
|
120
120
|
onCloseAutoFocus,
|
|
121
121
|
onClick: autoClose ? () => onClose?.() : void 0,
|
|
122
122
|
className: cn(
|
|
123
|
-
"z-50 overflow-hidden rounded-(--cmp-listBox-radius) bg-(--cmp-listBox-bg)
|
|
123
|
+
"z-50 overflow-hidden rounded-(--cmp-listBox-radius) bg-(--cmp-listBox-bg) shadow-normal-sm",
|
|
124
124
|
maxHeight != null && "overflow-y-auto",
|
|
125
125
|
fit && "min-w-(--radix-popover-trigger-width)",
|
|
126
126
|
FLOATING_SLIDE_ANIM,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/cn.ts","../../../src/lib/floating-anim.ts","../../../src/lib/portal-container.tsx","../../../src/components/SPortal/SPortal.tsx"],"names":["extendTailwindMerge","clsx","createContext","useContext","jsxs","RPopover","jsx"],"mappings":"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","file":"SPortal.cjs","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\n/**\n * theme.css ์ --text-* ๋ ๊ธฐ๋ณธ Tailwind ํฐํธ์ฌ์ด์ฆ ์ค์ผ์ผ(xs/sm/base...)์ด ์๋\n * ์ซ์ ์ค์ผ์ผ(10~32)์ด๋ผ, ํ์ฅ ์์ด๋ tailwind-merge ๊ฐ ์ด๋ฅผ ํ
์คํธ ์ปฌ๋ฌ ๊ทธ๋ฃน์ผ๋ก\n * ์ค์ธํด text-12 ๊ฐ์ ํด๋์ค๋ฅผ text-(--color-var) ๋ค์์ ์ถฉ๋ ์ ๊ฑฐํด๋ฒ๋ฆฐ๋ค.\n */\nconst twMerge = extendTailwindMerge({\n extend: {\n classGroups: {\n 'font-size': [{ text: ['10', '11', '12', '13', '14', '16', '18', '20', '24', '28', '32'] }],\n },\n },\n});\n\n/**\n * className ๋ณํฉ ์ ํธ.\n * clsx๋ก ์กฐ๊ฑด๋ถ ํด๋์ค๋ฅผ ํฉ์น๊ณ , tailwind-merge๋ก Tailwind ํด๋์ค ์ถฉ๋์ ํด์ํ๋ค.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * Radix Floating(SPopover/STooltip/RTooltip) Content ์ placement ๋ฐฉํฅ๋ณ ์ฌ๋ผ์ด๋+ํ์ด๋.\n * Radix ๊ฐ ๋ถ์ด๋ data-side(์ค์ ๋ ๋ ๋ฐฉํฅ)ยทdata-state ์ ๋ง์ถฐ ์ด๋ฆผ/๋ซํ ์ ๋๋ฉ์ด์
์ ์ ์ฉํ๋ค.\n * (sd-floating-portal ์ sd-floating-slide-* ํฌํ
โ ํคํ๋ ์์ theme.css `--animate-floating-*`)\n *\n * ์: side=top ์ด๋ฉด ์๋(4px)์์ ์๋ก ์ฌ๋ผ์ค๋ฉฐ ๋ํ๋๊ณ , ๋ซํ ๋ ๋ค์ ๋ด๋ ค๊ฐ๋ฉฐ ์ฌ๋ผ์ง๋ค.\n *\n * @radix-ui/react-popover ยท react-dropdown-menu ์ data-state ๋ open/closed ์ง๋ง,\n * @radix-ui/react-tooltip ์ open ๋์ delayed-open/instant-open ์ ์ด๋ค โ ๋ ์ผ์ด์ค ๋ชจ๋ ์ปค๋ฒํ๋ค.\n * Tailwind JIT๋ ์์ค์ ๋ฆฌํฐ๋ด๋ก ๋ฑ์ฅํ๋ ํด๋์ค๋ช
๋ง ์ค์บํ๋ฏ๋ก ํ
ํ๋ฆฟ์ผ๋ก ์กฐํฉํ์ง ์๊ณ ์ ๋ถ ๋์ดํ๋ค.\n */\nexport const FLOATING_SLIDE_ANIM = [\n 'data-[state=open]:data-[side=top]:animate-floating-in-top',\n 'data-[state=delayed-open]:data-[side=top]:animate-floating-in-top',\n 'data-[state=instant-open]:data-[side=top]:animate-floating-in-top',\n 'data-[state=closed]:data-[side=top]:animate-floating-out-top',\n 'data-[state=open]:data-[side=bottom]:animate-floating-in-bottom',\n 'data-[state=delayed-open]:data-[side=bottom]:animate-floating-in-bottom',\n 'data-[state=instant-open]:data-[side=bottom]:animate-floating-in-bottom',\n 'data-[state=closed]:data-[side=bottom]:animate-floating-out-bottom',\n 'data-[state=open]:data-[side=left]:animate-floating-in-left',\n 'data-[state=delayed-open]:data-[side=left]:animate-floating-in-left',\n 'data-[state=instant-open]:data-[side=left]:animate-floating-in-left',\n 'data-[state=closed]:data-[side=left]:animate-floating-out-left',\n 'data-[state=open]:data-[side=right]:animate-floating-in-right',\n 'data-[state=delayed-open]:data-[side=right]:animate-floating-in-right',\n 'data-[state=instant-open]:data-[side=right]:animate-floating-in-right',\n 'data-[state=closed]:data-[side=right]:animate-floating-out-right',\n].join(' ');\n","'use client';\n\nimport { createContext, useContext } from 'react';\n\n/**\n * Floating ์ปดํฌ๋ํธ(STooltip/SPopover/SSelect listbox/SDropdownButton/SDatePicker ๋ฑ)๊ฐ\n * ์์ ์ Portal ์ ์ด๋๋ก ๋ ๋ํ ์ง ๊ฒฐ์ ํ๋ ์ปจํ
์คํธ.\n *\n * ๊ธฐ๋ณธ๊ฐ(null)์ด๋ฉด ๊ฐ ์ปดํฌ๋ํธ๋ body ๋ก portal ํ๋ค.\n * SModalContainer ๋ ๋ชจ๋ฌ์ด ์ด๋ ค์๋ ๋์ ์ด ๊ฐ์ \"๋ชจ๋ฌ ์คํํน ๋ฐด๋(z-1001) ์์ ์ ์ฉ ๋
ธ๋\"๋ก\n * ์ฑ์์, ๋ชจ๋ฌ ์์์ ์ด๋ฆฐ floating ์ด ๋ชจ๋ฌ ๋ค(z-1000) ๋ค์ ๊ฐ๋ ค์ง์ง ์๊ณ ์๋ก ๋จ๊ฒ ํ๋ค.\n * ๋ฐ๋๋ก ๋ชจ๋ฌ ๋ฐ(๋ฒ ์ด์ค ํ๋ฉด)์์ ์ด๋ฆฐ floating ์ ์ฌ์ ํ body(z-50)๋ก ๋๊ฐ๋ฏ๋ก,\n * ๋์ค์ ๋ฌ ๋ชจ๋ฌ์ด ์ ์์ ์ผ๋ก ๊ทธ ์๋ฅผ ๋ฎ๋๋ค. (์์์ ๋ฐ๋ผ ์๋์ ์ผ๋ก ๊ฒฐ์ )\n */\nconst PortalContainerContext = createContext<HTMLElement | null>(null);\nconst InsideModalContext = createContext(false);\n\nexport const PortalContainerProvider = PortalContainerContext.Provider;\nexport const InsideModalProvider = InsideModalContext.Provider;\n\n/**\n * ํ์ฌ ์์๋ Portal ์ปจํ
์ด๋๋ฅผ ๋ฐํํ๋ค.\n * Radix `*.Portal` ์ `container`, Ariakit ์ `portalElement` ์ ๊ทธ๋๋ก ๋๊ธฐ๋ฉด ๋๋ฉฐ,\n * ์ปจํ
์ด๋๊ฐ ์์ ๋(๋ชจ๋ฌ ๋ฐ)๋ `undefined` ๋ฅผ ๋ฐํํด ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ๋ณธ๊ฐ(body)์ ์ด๋ค.\n */\nexport function usePortalContainer(): HTMLElement | undefined {\n return useContext(PortalContainerContext) ?? undefined;\n}\n\n/**\n * ํ์ฌ floating ์ด ๋ชจ๋ฌ ๋ด๋ถ ์ปจํ
์คํธ์์ ๋ ๋๋ง๋๋์ง ๋ฐํํ๋ค.\n * portal target ref ๊ฐ ์์ง ์ค๋น๋์ง ์์ ์ฒซ ๋ ๋์์๋ true๋ฅผ ์ ์งํด\n * ๋ชจ๋ฌ ๋ด๋ถ ์ ์ฉ ์ฐํ ๋ก์ง์ด ๊น๋นก์ด์ง ์๋๋ก ํ๋ค.\n */\nexport function useInsideModal(): boolean {\n return useContext(InsideModalContext);\n}\n","'use client';\n\nimport { type CSSProperties, type ReactNode, type RefObject } from 'react';\nimport * as RPopover from '@radix-ui/react-popover';\nimport { cn } from '../../lib/cn';\nimport { FLOATING_SLIDE_ANIM } from '../../lib/floating-anim';\nimport { usePortalContainer } from '../../lib/portal-container';\n\nexport type SPortalPlacement = 'top' | 'bottom' | 'left' | 'right';\nexport type SPortalAlign = 'start' | 'center' | 'end';\n\n/** Radix Anchor ๊ฐ ์์น ๊ณ์ฐ์ ์ฐ๋ ์ต์ ์ธํฐํ์ด์ค (HTMLElement ๊ฐ ์ถฉ์กฑํ๋ค). */\ntype Measurable = { getBoundingClientRect(): DOMRect };\n\nexport interface SPortalProps {\n /** ํ์ ์ฌ๋ถ (์ ์ด). onClose ์ ํจ๊ป ์ฌ์ฉํ๋ค. */\n open: boolean;\n /** ์ธ๋ถ ํด๋ฆญ ยท ESC ๋ฑ์ผ๋ก ๋ซํ์ด ์์ฒญ๋ ๋ (sd-portal `sdClose` ๋์). */\n onClose?: () => void;\n /** ์ด๋ฆผ/๋ซํ ๋ณ๊ฒฝ ์ ์ฒด ์ฝ๋ฐฑ (์ ํ). */\n onOpenChange?: (open: boolean) => void;\n /**\n * ์์น ๊ธฐ์ค์ด ๋๋ ์ต์ปค ์๋ฆฌ๋จผํธ ref (sd-portal `parentRef` ๋์).\n * ํธ๋ฆฌ๊ฑฐ ๋ฒํผ ๋ฑ์ ๊ทธ๋๋ก ๊ฑธ๋ฉด ๊ทธ ์๋ฆฌ๋จผํธ์ ๋ถ์ด์ ๋ฌ๋ค.\n */\n anchorRef: RefObject<HTMLElement | null>;\n /** ํ์ ๋ฐฉํฅ (๊ณต๊ฐ์ด ๋ถ์กฑํ๋ฉด ์๋์ผ๋ก ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ์ ํ). */\n placement?: SPortalPlacement;\n /** ๊ต์ฐจ์ถ ์ ๋ ฌ (startยทcenterยทend). */\n align?: SPortalAlign;\n /** ์ต์ปค๋ก๋ถํฐ์ ๊ฐ๊ฒฉ px (sd-portal offset[1]). */\n offset?: number;\n /** ์ ๋ ฌ์ถ ์คํ์
px (sd-portal offset[0]). */\n alignOffset?: number;\n /** ์ต์ปค ๋๋น์ ๋ง์ถฐ ์ต์ ๋๋น๋ฅผ ์ก๋๋ค. */\n fit?: boolean;\n /** ์ฝํ
์ธ ์ต๋ ๋์ด px. ๋์น๋ฉด ์ธ๋ก ์คํฌ๋กค. */\n maxHeight?: number;\n /** ์ฝํ
์ธ ๋ด๋ถ๋ฅผ ํด๋ฆญํ๋ฉด ์๋์ผ๋ก ๋ซ๋๋ค. */\n autoClose?: boolean;\n /** ์ธ๋ถ ํด๋ฆญ ยท ESC ๋ก ๋ซํ์ง ์๊ฒ ํ๋ค. */\n persistent?: boolean;\n /** ๋ทฐํฌํธ ๊ฒฝ๊ณ ์ฌ๋ฐฑ px (์ถฉ๋ ํํผ ํจ๋ฉ). */\n viewportPadding?: number;\n /** ์ด๋ฆด ๋ ํฌ์ปค์ค ์ด๋ ์ฒ๋ฆฌ (๊ธฐ๋ณธ์ Radix๊ฐ ์ฝํ
์ธ ๋ก ํฌ์ปค์ค๋ฅผ ์ฎ๊น). e.preventDefault()๋ก ๋ง์ ์ ์๋ค. */\n onOpenAutoFocus?: (event: Event) => void;\n /** ๋ซํ ๋ ํฌ์ปค์ค ๋ณต๊ท ์ฒ๋ฆฌ (๊ธฐ๋ณธ์ Radix๊ฐ ์ต์ปค๋ก ํฌ์ปค์ค๋ฅผ ๋๋๋ฆผ). e.preventDefault()๋ก ๋ง์ ์ ์๋ค. */\n onCloseAutoFocus?: (event: Event) => void;\n /** ๋ณธ๋ฌธ ๋ด์ฉ (์ฝํ
์ธ ์์ ). */\n children?: ReactNode;\n className?: string;\n style?: CSSProperties;\n ariaLabel?: string;\n}\n\n/**\n * SPortal โ sd-portal/sd-floating-portal ์ ์ฌ์ฉ์ฑ์ Radix Popover ๋ก ์ฎ๊ธด ๋ฒ์ฉ ์ต์ปค๋ ํ๋กํ
์ปจํ
์ด๋.\n *\n * ํธ๋ฆฌ๊ฑฐ๋ฅผ ๊ฐ์ธ์ง ์๊ณ `anchorRef` ๋ก ์์์ ์๋ฆฌ๋จผํธ์ ๋ถ๋๋ค(=sd-portal `parentRef`).\n * open/onClose ๋ก ์ธ๋ถ์์ ์ ์ดํ๋ฉฐ, flipยทcollisionยท์คํฌ๋กค ์ฌ๋ฐฐ์นยท์ธ๋ถํด๋ฆญยทESCยท๋ชจ๋ฌ ํฌํธ์\n * Radix ๊ฐ ์ฒ๋ฆฌํ๋ค. ์ฝํ
์ธ ๋ children ์ผ๋ก ์์ ํ ์์ ๋กญ๋ค.\n */\nexport function SPortal({\n open,\n onClose,\n onOpenChange,\n anchorRef,\n placement = 'bottom',\n align = 'start',\n offset = 4,\n alignOffset = 0,\n fit = false,\n maxHeight,\n autoClose = false,\n persistent = false,\n viewportPadding = 0,\n onOpenAutoFocus,\n onCloseAutoFocus,\n children,\n className,\n style,\n ariaLabel,\n}: SPortalProps) {\n const portalContainer = usePortalContainer();\n\n return (\n <RPopover.Root\n open={open}\n onOpenChange={next => {\n onOpenChange?.(next);\n if (!next) onClose?.();\n }}\n >\n <RPopover.Anchor virtualRef={anchorRef as RefObject<Measurable>} />\n <RPopover.Portal container={portalContainer}>\n <RPopover.Content\n side={placement}\n align={align}\n sideOffset={offset}\n alignOffset={alignOffset}\n collisionPadding={viewportPadding}\n aria-label={ariaLabel}\n // persistent: ์ธ๋ถ ํด๋ฆญยทESC ๋ก ๋ซํ์ง ์์\n // ์๋๋ฉด: ์ต์ปค(ํธ๋ฆฌ๊ฑฐ) ์ ํด๋ฆญ์ ์๋น์๊ฐ ํ ๊ธํ๋ฏ๋ก ์ฌ๊ธฐ์ ๋ซ์ง ์๋๋ค(์ค๋ณต ํ ๊ธ ๋ฐฉ์ง)\n onPointerDownOutside={e => {\n if (persistent || anchorRef.current?.contains(e.target as Node)) {\n e.preventDefault();\n }\n }}\n // ์ต์ปค(์: input)์ ์ด๋ฏธ ํฌ์ปค์ค๊ฐ ์๋ ์ํ๋ก ์ด๋ฆฌ๋ ๊ฒฝ์ฐ(ํด๋ฆญ ์ฆ์ ์คํ), Radix๋ ํฌ์ปค์ค๊ฐ\n // ๋ ์ด์ด ๋ฐ์ ์๋ค๊ณ ํ๋จํด ์ด๋ฆฌ์๋ง์ ๋ซ์๋ฒ๋ฆฐ๋ค โ ์ต์ปค ๋ด๋ถ ํฌ์ปค์ค๋ outside๋ก ์ทจ๊ธํ์ง ์๋๋ค.\n onFocusOutside={e => {\n if (persistent || anchorRef.current?.contains(e.target as Node)) {\n e.preventDefault();\n }\n }}\n onEscapeKeyDown={persistent ? e => e.preventDefault() : undefined}\n onOpenAutoFocus={onOpenAutoFocus}\n onCloseAutoFocus={onCloseAutoFocus}\n onClick={autoClose ? () => onClose?.() : undefined}\n className={cn(\n 'z-50 overflow-hidden rounded-(--cmp-listBox-radius) bg-(--cmp-listBox-bg) py-4 shadow-normal-sm',\n maxHeight != null && 'overflow-y-auto',\n fit && 'min-w-(--radix-popover-trigger-width)',\n FLOATING_SLIDE_ANIM,\n className,\n )}\n style={{ maxHeight, ...style }}\n >\n {children}\n </RPopover.Content>\n </RPopover.Portal>\n </RPopover.Root>\n );\n}\n\nSPortal.displayName = 'SPortal';\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/cn.ts","../../../src/lib/floating-anim.ts","../../../src/lib/portal-container.tsx","../../../src/components/SPortal/SPortal.tsx"],"names":["extendTailwindMerge","clsx","createContext","useContext","jsxs","RPopover","jsx"],"mappings":"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","file":"SPortal.cjs","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\n/**\n * theme.css ์ --text-* ๋ ๊ธฐ๋ณธ Tailwind ํฐํธ์ฌ์ด์ฆ ์ค์ผ์ผ(xs/sm/base...)์ด ์๋\n * ์ซ์ ์ค์ผ์ผ(10~32)์ด๋ผ, ํ์ฅ ์์ด๋ tailwind-merge ๊ฐ ์ด๋ฅผ ํ
์คํธ ์ปฌ๋ฌ ๊ทธ๋ฃน์ผ๋ก\n * ์ค์ธํด text-12 ๊ฐ์ ํด๋์ค๋ฅผ text-(--color-var) ๋ค์์ ์ถฉ๋ ์ ๊ฑฐํด๋ฒ๋ฆฐ๋ค.\n */\nconst twMerge = extendTailwindMerge({\n extend: {\n classGroups: {\n 'font-size': [{ text: ['10', '11', '12', '13', '14', '16', '18', '20', '24', '28', '32'] }],\n },\n },\n});\n\n/**\n * className ๋ณํฉ ์ ํธ.\n * clsx๋ก ์กฐ๊ฑด๋ถ ํด๋์ค๋ฅผ ํฉ์น๊ณ , tailwind-merge๋ก Tailwind ํด๋์ค ์ถฉ๋์ ํด์ํ๋ค.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * Radix Floating(SPopover/STooltip/RTooltip) Content ์ placement ๋ฐฉํฅ๋ณ ์ฌ๋ผ์ด๋+ํ์ด๋.\n * Radix ๊ฐ ๋ถ์ด๋ data-side(์ค์ ๋ ๋ ๋ฐฉํฅ)ยทdata-state ์ ๋ง์ถฐ ์ด๋ฆผ/๋ซํ ์ ๋๋ฉ์ด์
์ ์ ์ฉํ๋ค.\n * (sd-floating-portal ์ sd-floating-slide-* ํฌํ
โ ํคํ๋ ์์ theme.css `--animate-floating-*`)\n *\n * ์: side=top ์ด๋ฉด ์๋(4px)์์ ์๋ก ์ฌ๋ผ์ค๋ฉฐ ๋ํ๋๊ณ , ๋ซํ ๋ ๋ค์ ๋ด๋ ค๊ฐ๋ฉฐ ์ฌ๋ผ์ง๋ค.\n *\n * @radix-ui/react-popover ยท react-dropdown-menu ์ data-state ๋ open/closed ์ง๋ง,\n * @radix-ui/react-tooltip ์ open ๋์ delayed-open/instant-open ์ ์ด๋ค โ ๋ ์ผ์ด์ค ๋ชจ๋ ์ปค๋ฒํ๋ค.\n * Tailwind JIT๋ ์์ค์ ๋ฆฌํฐ๋ด๋ก ๋ฑ์ฅํ๋ ํด๋์ค๋ช
๋ง ์ค์บํ๋ฏ๋ก ํ
ํ๋ฆฟ์ผ๋ก ์กฐํฉํ์ง ์๊ณ ์ ๋ถ ๋์ดํ๋ค.\n */\nexport const FLOATING_SLIDE_ANIM = [\n 'data-[state=open]:data-[side=top]:animate-floating-in-top',\n 'data-[state=delayed-open]:data-[side=top]:animate-floating-in-top',\n 'data-[state=instant-open]:data-[side=top]:animate-floating-in-top',\n 'data-[state=closed]:data-[side=top]:animate-floating-out-top',\n 'data-[state=open]:data-[side=bottom]:animate-floating-in-bottom',\n 'data-[state=delayed-open]:data-[side=bottom]:animate-floating-in-bottom',\n 'data-[state=instant-open]:data-[side=bottom]:animate-floating-in-bottom',\n 'data-[state=closed]:data-[side=bottom]:animate-floating-out-bottom',\n 'data-[state=open]:data-[side=left]:animate-floating-in-left',\n 'data-[state=delayed-open]:data-[side=left]:animate-floating-in-left',\n 'data-[state=instant-open]:data-[side=left]:animate-floating-in-left',\n 'data-[state=closed]:data-[side=left]:animate-floating-out-left',\n 'data-[state=open]:data-[side=right]:animate-floating-in-right',\n 'data-[state=delayed-open]:data-[side=right]:animate-floating-in-right',\n 'data-[state=instant-open]:data-[side=right]:animate-floating-in-right',\n 'data-[state=closed]:data-[side=right]:animate-floating-out-right',\n].join(' ');\n","'use client';\n\nimport { createContext, useContext } from 'react';\n\n/**\n * Floating ์ปดํฌ๋ํธ(STooltip/SPopover/SSelect listbox/SDropdownButton/SDatePicker ๋ฑ)๊ฐ\n * ์์ ์ Portal ์ ์ด๋๋ก ๋ ๋ํ ์ง ๊ฒฐ์ ํ๋ ์ปจํ
์คํธ.\n *\n * ๊ธฐ๋ณธ๊ฐ(null)์ด๋ฉด ๊ฐ ์ปดํฌ๋ํธ๋ body ๋ก portal ํ๋ค.\n * SModalContainer ๋ ๋ชจ๋ฌ์ด ์ด๋ ค์๋ ๋์ ์ด ๊ฐ์ \"๋ชจ๋ฌ ์คํํน ๋ฐด๋(z-1001) ์์ ์ ์ฉ ๋
ธ๋\"๋ก\n * ์ฑ์์, ๋ชจ๋ฌ ์์์ ์ด๋ฆฐ floating ์ด ๋ชจ๋ฌ ๋ค(z-1000) ๋ค์ ๊ฐ๋ ค์ง์ง ์๊ณ ์๋ก ๋จ๊ฒ ํ๋ค.\n * ๋ฐ๋๋ก ๋ชจ๋ฌ ๋ฐ(๋ฒ ์ด์ค ํ๋ฉด)์์ ์ด๋ฆฐ floating ์ ์ฌ์ ํ body(z-50)๋ก ๋๊ฐ๋ฏ๋ก,\n * ๋์ค์ ๋ฌ ๋ชจ๋ฌ์ด ์ ์์ ์ผ๋ก ๊ทธ ์๋ฅผ ๋ฎ๋๋ค. (์์์ ๋ฐ๋ผ ์๋์ ์ผ๋ก ๊ฒฐ์ )\n */\nconst PortalContainerContext = createContext<HTMLElement | null>(null);\nconst InsideModalContext = createContext(false);\n\nexport const PortalContainerProvider = PortalContainerContext.Provider;\nexport const InsideModalProvider = InsideModalContext.Provider;\n\n/**\n * ํ์ฌ ์์๋ Portal ์ปจํ
์ด๋๋ฅผ ๋ฐํํ๋ค.\n * Radix `*.Portal` ์ `container`, Ariakit ์ `portalElement` ์ ๊ทธ๋๋ก ๋๊ธฐ๋ฉด ๋๋ฉฐ,\n * ์ปจํ
์ด๋๊ฐ ์์ ๋(๋ชจ๋ฌ ๋ฐ)๋ `undefined` ๋ฅผ ๋ฐํํด ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ๋ณธ๊ฐ(body)์ ์ด๋ค.\n */\nexport function usePortalContainer(): HTMLElement | undefined {\n return useContext(PortalContainerContext) ?? undefined;\n}\n\n/**\n * ํ์ฌ floating ์ด ๋ชจ๋ฌ ๋ด๋ถ ์ปจํ
์คํธ์์ ๋ ๋๋ง๋๋์ง ๋ฐํํ๋ค.\n * portal target ref ๊ฐ ์์ง ์ค๋น๋์ง ์์ ์ฒซ ๋ ๋์์๋ true๋ฅผ ์ ์งํด\n * ๋ชจ๋ฌ ๋ด๋ถ ์ ์ฉ ์ฐํ ๋ก์ง์ด ๊น๋นก์ด์ง ์๋๋ก ํ๋ค.\n */\nexport function useInsideModal(): boolean {\n return useContext(InsideModalContext);\n}\n","'use client';\n\nimport { type CSSProperties, type ReactNode, type RefObject } from 'react';\nimport * as RPopover from '@radix-ui/react-popover';\nimport { cn } from '../../lib/cn';\nimport { FLOATING_SLIDE_ANIM } from '../../lib/floating-anim';\nimport { usePortalContainer } from '../../lib/portal-container';\n\nexport type SPortalPlacement = 'top' | 'bottom' | 'left' | 'right';\nexport type SPortalAlign = 'start' | 'center' | 'end';\n\n/** Radix Anchor ๊ฐ ์์น ๊ณ์ฐ์ ์ฐ๋ ์ต์ ์ธํฐํ์ด์ค (HTMLElement ๊ฐ ์ถฉ์กฑํ๋ค). */\ntype Measurable = { getBoundingClientRect(): DOMRect };\n\nexport interface SPortalProps {\n /** ํ์ ์ฌ๋ถ (์ ์ด). onClose ์ ํจ๊ป ์ฌ์ฉํ๋ค. */\n open: boolean;\n /** ์ธ๋ถ ํด๋ฆญ ยท ESC ๋ฑ์ผ๋ก ๋ซํ์ด ์์ฒญ๋ ๋ (sd-portal `sdClose` ๋์). */\n onClose?: () => void;\n /** ์ด๋ฆผ/๋ซํ ๋ณ๊ฒฝ ์ ์ฒด ์ฝ๋ฐฑ (์ ํ). */\n onOpenChange?: (open: boolean) => void;\n /**\n * ์์น ๊ธฐ์ค์ด ๋๋ ์ต์ปค ์๋ฆฌ๋จผํธ ref (sd-portal `parentRef` ๋์).\n * ํธ๋ฆฌ๊ฑฐ ๋ฒํผ ๋ฑ์ ๊ทธ๋๋ก ๊ฑธ๋ฉด ๊ทธ ์๋ฆฌ๋จผํธ์ ๋ถ์ด์ ๋ฌ๋ค.\n */\n anchorRef: RefObject<HTMLElement | null>;\n /** ํ์ ๋ฐฉํฅ (๊ณต๊ฐ์ด ๋ถ์กฑํ๋ฉด ์๋์ผ๋ก ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ์ ํ). */\n placement?: SPortalPlacement;\n /** ๊ต์ฐจ์ถ ์ ๋ ฌ (startยทcenterยทend). */\n align?: SPortalAlign;\n /** ์ต์ปค๋ก๋ถํฐ์ ๊ฐ๊ฒฉ px (sd-portal offset[1]). */\n offset?: number;\n /** ์ ๋ ฌ์ถ ์คํ์
px (sd-portal offset[0]). */\n alignOffset?: number;\n /** ์ต์ปค ๋๋น์ ๋ง์ถฐ ์ต์ ๋๋น๋ฅผ ์ก๋๋ค. */\n fit?: boolean;\n /** ์ฝํ
์ธ ์ต๋ ๋์ด px. ๋์น๋ฉด ์ธ๋ก ์คํฌ๋กค. */\n maxHeight?: number;\n /** ์ฝํ
์ธ ๋ด๋ถ๋ฅผ ํด๋ฆญํ๋ฉด ์๋์ผ๋ก ๋ซ๋๋ค. */\n autoClose?: boolean;\n /** ์ธ๋ถ ํด๋ฆญ ยท ESC ๋ก ๋ซํ์ง ์๊ฒ ํ๋ค. */\n persistent?: boolean;\n /** ๋ทฐํฌํธ ๊ฒฝ๊ณ ์ฌ๋ฐฑ px (์ถฉ๋ ํํผ ํจ๋ฉ). */\n viewportPadding?: number;\n /** ์ด๋ฆด ๋ ํฌ์ปค์ค ์ด๋ ์ฒ๋ฆฌ (๊ธฐ๋ณธ์ Radix๊ฐ ์ฝํ
์ธ ๋ก ํฌ์ปค์ค๋ฅผ ์ฎ๊น). e.preventDefault()๋ก ๋ง์ ์ ์๋ค. */\n onOpenAutoFocus?: (event: Event) => void;\n /** ๋ซํ ๋ ํฌ์ปค์ค ๋ณต๊ท ์ฒ๋ฆฌ (๊ธฐ๋ณธ์ Radix๊ฐ ์ต์ปค๋ก ํฌ์ปค์ค๋ฅผ ๋๋๋ฆผ). e.preventDefault()๋ก ๋ง์ ์ ์๋ค. */\n onCloseAutoFocus?: (event: Event) => void;\n /** ๋ณธ๋ฌธ ๋ด์ฉ (์ฝํ
์ธ ์์ ). */\n children?: ReactNode;\n className?: string;\n style?: CSSProperties;\n ariaLabel?: string;\n}\n\n/**\n * SPortal โ sd-portal/sd-floating-portal ์ ์ฌ์ฉ์ฑ์ Radix Popover ๋ก ์ฎ๊ธด ๋ฒ์ฉ ์ต์ปค๋ ํ๋กํ
์ปจํ
์ด๋.\n *\n * ํธ๋ฆฌ๊ฑฐ๋ฅผ ๊ฐ์ธ์ง ์๊ณ `anchorRef` ๋ก ์์์ ์๋ฆฌ๋จผํธ์ ๋ถ๋๋ค(=sd-portal `parentRef`).\n * open/onClose ๋ก ์ธ๋ถ์์ ์ ์ดํ๋ฉฐ, flipยทcollisionยท์คํฌ๋กค ์ฌ๋ฐฐ์นยท์ธ๋ถํด๋ฆญยทESCยท๋ชจ๋ฌ ํฌํธ์\n * Radix ๊ฐ ์ฒ๋ฆฌํ๋ค. ์ฝํ
์ธ ๋ children ์ผ๋ก ์์ ํ ์์ ๋กญ๋ค.\n */\nexport function SPortal({\n open,\n onClose,\n onOpenChange,\n anchorRef,\n placement = 'bottom',\n align = 'start',\n offset = 4,\n alignOffset = 0,\n fit = false,\n maxHeight,\n autoClose = false,\n persistent = false,\n viewportPadding = 0,\n onOpenAutoFocus,\n onCloseAutoFocus,\n children,\n className,\n style,\n ariaLabel,\n}: SPortalProps) {\n const portalContainer = usePortalContainer();\n\n return (\n <RPopover.Root\n open={open}\n onOpenChange={next => {\n onOpenChange?.(next);\n if (!next) onClose?.();\n }}\n >\n <RPopover.Anchor virtualRef={anchorRef as RefObject<Measurable>} />\n <RPopover.Portal container={portalContainer}>\n <RPopover.Content\n side={placement}\n align={align}\n sideOffset={offset}\n alignOffset={alignOffset}\n collisionPadding={viewportPadding}\n aria-label={ariaLabel}\n // persistent: ์ธ๋ถ ํด๋ฆญยทESC ๋ก ๋ซํ์ง ์์\n // ์๋๋ฉด: ์ต์ปค(ํธ๋ฆฌ๊ฑฐ) ์ ํด๋ฆญ์ ์๋น์๊ฐ ํ ๊ธํ๋ฏ๋ก ์ฌ๊ธฐ์ ๋ซ์ง ์๋๋ค(์ค๋ณต ํ ๊ธ ๋ฐฉ์ง)\n onPointerDownOutside={e => {\n if (persistent || anchorRef.current?.contains(e.target as Node)) {\n e.preventDefault();\n }\n }}\n // ์ต์ปค(์: input)์ ์ด๋ฏธ ํฌ์ปค์ค๊ฐ ์๋ ์ํ๋ก ์ด๋ฆฌ๋ ๊ฒฝ์ฐ(ํด๋ฆญ ์ฆ์ ์คํ), Radix๋ ํฌ์ปค์ค๊ฐ\n // ๋ ์ด์ด ๋ฐ์ ์๋ค๊ณ ํ๋จํด ์ด๋ฆฌ์๋ง์ ๋ซ์๋ฒ๋ฆฐ๋ค โ ์ต์ปค ๋ด๋ถ ํฌ์ปค์ค๋ outside๋ก ์ทจ๊ธํ์ง ์๋๋ค.\n onFocusOutside={e => {\n if (persistent || anchorRef.current?.contains(e.target as Node)) {\n e.preventDefault();\n }\n }}\n onEscapeKeyDown={persistent ? e => e.preventDefault() : undefined}\n onOpenAutoFocus={onOpenAutoFocus}\n onCloseAutoFocus={onCloseAutoFocus}\n onClick={autoClose ? () => onClose?.() : undefined}\n className={cn(\n 'z-50 overflow-hidden rounded-(--cmp-listBox-radius) bg-(--cmp-listBox-bg) shadow-normal-sm',\n maxHeight != null && 'overflow-y-auto',\n fit && 'min-w-(--radix-popover-trigger-width)',\n FLOATING_SLIDE_ANIM,\n className,\n )}\n style={{ maxHeight, ...style }}\n >\n {children}\n </RPopover.Content>\n </RPopover.Portal>\n </RPopover.Root>\n );\n}\n\nSPortal.displayName = 'SPortal';\n"]}
|
|
@@ -98,7 +98,7 @@ function SPortal({
|
|
|
98
98
|
onCloseAutoFocus,
|
|
99
99
|
onClick: autoClose ? () => onClose?.() : void 0,
|
|
100
100
|
className: cn(
|
|
101
|
-
"z-50 overflow-hidden rounded-(--cmp-listBox-radius) bg-(--cmp-listBox-bg)
|
|
101
|
+
"z-50 overflow-hidden rounded-(--cmp-listBox-radius) bg-(--cmp-listBox-bg) shadow-normal-sm",
|
|
102
102
|
maxHeight != null && "overflow-y-auto",
|
|
103
103
|
fit && "min-w-(--radix-popover-trigger-width)",
|
|
104
104
|
FLOATING_SLIDE_ANIM,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/cn.ts","../../../src/lib/floating-anim.ts","../../../src/lib/portal-container.tsx","../../../src/components/SPortal/SPortal.tsx"],"names":[],"mappings":"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","file":"SPortal.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\n/**\n * theme.css ์ --text-* ๋ ๊ธฐ๋ณธ Tailwind ํฐํธ์ฌ์ด์ฆ ์ค์ผ์ผ(xs/sm/base...)์ด ์๋\n * ์ซ์ ์ค์ผ์ผ(10~32)์ด๋ผ, ํ์ฅ ์์ด๋ tailwind-merge ๊ฐ ์ด๋ฅผ ํ
์คํธ ์ปฌ๋ฌ ๊ทธ๋ฃน์ผ๋ก\n * ์ค์ธํด text-12 ๊ฐ์ ํด๋์ค๋ฅผ text-(--color-var) ๋ค์์ ์ถฉ๋ ์ ๊ฑฐํด๋ฒ๋ฆฐ๋ค.\n */\nconst twMerge = extendTailwindMerge({\n extend: {\n classGroups: {\n 'font-size': [{ text: ['10', '11', '12', '13', '14', '16', '18', '20', '24', '28', '32'] }],\n },\n },\n});\n\n/**\n * className ๋ณํฉ ์ ํธ.\n * clsx๋ก ์กฐ๊ฑด๋ถ ํด๋์ค๋ฅผ ํฉ์น๊ณ , tailwind-merge๋ก Tailwind ํด๋์ค ์ถฉ๋์ ํด์ํ๋ค.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * Radix Floating(SPopover/STooltip/RTooltip) Content ์ placement ๋ฐฉํฅ๋ณ ์ฌ๋ผ์ด๋+ํ์ด๋.\n * Radix ๊ฐ ๋ถ์ด๋ data-side(์ค์ ๋ ๋ ๋ฐฉํฅ)ยทdata-state ์ ๋ง์ถฐ ์ด๋ฆผ/๋ซํ ์ ๋๋ฉ์ด์
์ ์ ์ฉํ๋ค.\n * (sd-floating-portal ์ sd-floating-slide-* ํฌํ
โ ํคํ๋ ์์ theme.css `--animate-floating-*`)\n *\n * ์: side=top ์ด๋ฉด ์๋(4px)์์ ์๋ก ์ฌ๋ผ์ค๋ฉฐ ๋ํ๋๊ณ , ๋ซํ ๋ ๋ค์ ๋ด๋ ค๊ฐ๋ฉฐ ์ฌ๋ผ์ง๋ค.\n *\n * @radix-ui/react-popover ยท react-dropdown-menu ์ data-state ๋ open/closed ์ง๋ง,\n * @radix-ui/react-tooltip ์ open ๋์ delayed-open/instant-open ์ ์ด๋ค โ ๋ ์ผ์ด์ค ๋ชจ๋ ์ปค๋ฒํ๋ค.\n * Tailwind JIT๋ ์์ค์ ๋ฆฌํฐ๋ด๋ก ๋ฑ์ฅํ๋ ํด๋์ค๋ช
๋ง ์ค์บํ๋ฏ๋ก ํ
ํ๋ฆฟ์ผ๋ก ์กฐํฉํ์ง ์๊ณ ์ ๋ถ ๋์ดํ๋ค.\n */\nexport const FLOATING_SLIDE_ANIM = [\n 'data-[state=open]:data-[side=top]:animate-floating-in-top',\n 'data-[state=delayed-open]:data-[side=top]:animate-floating-in-top',\n 'data-[state=instant-open]:data-[side=top]:animate-floating-in-top',\n 'data-[state=closed]:data-[side=top]:animate-floating-out-top',\n 'data-[state=open]:data-[side=bottom]:animate-floating-in-bottom',\n 'data-[state=delayed-open]:data-[side=bottom]:animate-floating-in-bottom',\n 'data-[state=instant-open]:data-[side=bottom]:animate-floating-in-bottom',\n 'data-[state=closed]:data-[side=bottom]:animate-floating-out-bottom',\n 'data-[state=open]:data-[side=left]:animate-floating-in-left',\n 'data-[state=delayed-open]:data-[side=left]:animate-floating-in-left',\n 'data-[state=instant-open]:data-[side=left]:animate-floating-in-left',\n 'data-[state=closed]:data-[side=left]:animate-floating-out-left',\n 'data-[state=open]:data-[side=right]:animate-floating-in-right',\n 'data-[state=delayed-open]:data-[side=right]:animate-floating-in-right',\n 'data-[state=instant-open]:data-[side=right]:animate-floating-in-right',\n 'data-[state=closed]:data-[side=right]:animate-floating-out-right',\n].join(' ');\n","'use client';\n\nimport { createContext, useContext } from 'react';\n\n/**\n * Floating ์ปดํฌ๋ํธ(STooltip/SPopover/SSelect listbox/SDropdownButton/SDatePicker ๋ฑ)๊ฐ\n * ์์ ์ Portal ์ ์ด๋๋ก ๋ ๋ํ ์ง ๊ฒฐ์ ํ๋ ์ปจํ
์คํธ.\n *\n * ๊ธฐ๋ณธ๊ฐ(null)์ด๋ฉด ๊ฐ ์ปดํฌ๋ํธ๋ body ๋ก portal ํ๋ค.\n * SModalContainer ๋ ๋ชจ๋ฌ์ด ์ด๋ ค์๋ ๋์ ์ด ๊ฐ์ \"๋ชจ๋ฌ ์คํํน ๋ฐด๋(z-1001) ์์ ์ ์ฉ ๋
ธ๋\"๋ก\n * ์ฑ์์, ๋ชจ๋ฌ ์์์ ์ด๋ฆฐ floating ์ด ๋ชจ๋ฌ ๋ค(z-1000) ๋ค์ ๊ฐ๋ ค์ง์ง ์๊ณ ์๋ก ๋จ๊ฒ ํ๋ค.\n * ๋ฐ๋๋ก ๋ชจ๋ฌ ๋ฐ(๋ฒ ์ด์ค ํ๋ฉด)์์ ์ด๋ฆฐ floating ์ ์ฌ์ ํ body(z-50)๋ก ๋๊ฐ๋ฏ๋ก,\n * ๋์ค์ ๋ฌ ๋ชจ๋ฌ์ด ์ ์์ ์ผ๋ก ๊ทธ ์๋ฅผ ๋ฎ๋๋ค. (์์์ ๋ฐ๋ผ ์๋์ ์ผ๋ก ๊ฒฐ์ )\n */\nconst PortalContainerContext = createContext<HTMLElement | null>(null);\nconst InsideModalContext = createContext(false);\n\nexport const PortalContainerProvider = PortalContainerContext.Provider;\nexport const InsideModalProvider = InsideModalContext.Provider;\n\n/**\n * ํ์ฌ ์์๋ Portal ์ปจํ
์ด๋๋ฅผ ๋ฐํํ๋ค.\n * Radix `*.Portal` ์ `container`, Ariakit ์ `portalElement` ์ ๊ทธ๋๋ก ๋๊ธฐ๋ฉด ๋๋ฉฐ,\n * ์ปจํ
์ด๋๊ฐ ์์ ๋(๋ชจ๋ฌ ๋ฐ)๋ `undefined` ๋ฅผ ๋ฐํํด ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ๋ณธ๊ฐ(body)์ ์ด๋ค.\n */\nexport function usePortalContainer(): HTMLElement | undefined {\n return useContext(PortalContainerContext) ?? undefined;\n}\n\n/**\n * ํ์ฌ floating ์ด ๋ชจ๋ฌ ๋ด๋ถ ์ปจํ
์คํธ์์ ๋ ๋๋ง๋๋์ง ๋ฐํํ๋ค.\n * portal target ref ๊ฐ ์์ง ์ค๋น๋์ง ์์ ์ฒซ ๋ ๋์์๋ true๋ฅผ ์ ์งํด\n * ๋ชจ๋ฌ ๋ด๋ถ ์ ์ฉ ์ฐํ ๋ก์ง์ด ๊น๋นก์ด์ง ์๋๋ก ํ๋ค.\n */\nexport function useInsideModal(): boolean {\n return useContext(InsideModalContext);\n}\n","'use client';\n\nimport { type CSSProperties, type ReactNode, type RefObject } from 'react';\nimport * as RPopover from '@radix-ui/react-popover';\nimport { cn } from '../../lib/cn';\nimport { FLOATING_SLIDE_ANIM } from '../../lib/floating-anim';\nimport { usePortalContainer } from '../../lib/portal-container';\n\nexport type SPortalPlacement = 'top' | 'bottom' | 'left' | 'right';\nexport type SPortalAlign = 'start' | 'center' | 'end';\n\n/** Radix Anchor ๊ฐ ์์น ๊ณ์ฐ์ ์ฐ๋ ์ต์ ์ธํฐํ์ด์ค (HTMLElement ๊ฐ ์ถฉ์กฑํ๋ค). */\ntype Measurable = { getBoundingClientRect(): DOMRect };\n\nexport interface SPortalProps {\n /** ํ์ ์ฌ๋ถ (์ ์ด). onClose ์ ํจ๊ป ์ฌ์ฉํ๋ค. */\n open: boolean;\n /** ์ธ๋ถ ํด๋ฆญ ยท ESC ๋ฑ์ผ๋ก ๋ซํ์ด ์์ฒญ๋ ๋ (sd-portal `sdClose` ๋์). */\n onClose?: () => void;\n /** ์ด๋ฆผ/๋ซํ ๋ณ๊ฒฝ ์ ์ฒด ์ฝ๋ฐฑ (์ ํ). */\n onOpenChange?: (open: boolean) => void;\n /**\n * ์์น ๊ธฐ์ค์ด ๋๋ ์ต์ปค ์๋ฆฌ๋จผํธ ref (sd-portal `parentRef` ๋์).\n * ํธ๋ฆฌ๊ฑฐ ๋ฒํผ ๋ฑ์ ๊ทธ๋๋ก ๊ฑธ๋ฉด ๊ทธ ์๋ฆฌ๋จผํธ์ ๋ถ์ด์ ๋ฌ๋ค.\n */\n anchorRef: RefObject<HTMLElement | null>;\n /** ํ์ ๋ฐฉํฅ (๊ณต๊ฐ์ด ๋ถ์กฑํ๋ฉด ์๋์ผ๋ก ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ์ ํ). */\n placement?: SPortalPlacement;\n /** ๊ต์ฐจ์ถ ์ ๋ ฌ (startยทcenterยทend). */\n align?: SPortalAlign;\n /** ์ต์ปค๋ก๋ถํฐ์ ๊ฐ๊ฒฉ px (sd-portal offset[1]). */\n offset?: number;\n /** ์ ๋ ฌ์ถ ์คํ์
px (sd-portal offset[0]). */\n alignOffset?: number;\n /** ์ต์ปค ๋๋น์ ๋ง์ถฐ ์ต์ ๋๋น๋ฅผ ์ก๋๋ค. */\n fit?: boolean;\n /** ์ฝํ
์ธ ์ต๋ ๋์ด px. ๋์น๋ฉด ์ธ๋ก ์คํฌ๋กค. */\n maxHeight?: number;\n /** ์ฝํ
์ธ ๋ด๋ถ๋ฅผ ํด๋ฆญํ๋ฉด ์๋์ผ๋ก ๋ซ๋๋ค. */\n autoClose?: boolean;\n /** ์ธ๋ถ ํด๋ฆญ ยท ESC ๋ก ๋ซํ์ง ์๊ฒ ํ๋ค. */\n persistent?: boolean;\n /** ๋ทฐํฌํธ ๊ฒฝ๊ณ ์ฌ๋ฐฑ px (์ถฉ๋ ํํผ ํจ๋ฉ). */\n viewportPadding?: number;\n /** ์ด๋ฆด ๋ ํฌ์ปค์ค ์ด๋ ์ฒ๋ฆฌ (๊ธฐ๋ณธ์ Radix๊ฐ ์ฝํ
์ธ ๋ก ํฌ์ปค์ค๋ฅผ ์ฎ๊น). e.preventDefault()๋ก ๋ง์ ์ ์๋ค. */\n onOpenAutoFocus?: (event: Event) => void;\n /** ๋ซํ ๋ ํฌ์ปค์ค ๋ณต๊ท ์ฒ๋ฆฌ (๊ธฐ๋ณธ์ Radix๊ฐ ์ต์ปค๋ก ํฌ์ปค์ค๋ฅผ ๋๋๋ฆผ). e.preventDefault()๋ก ๋ง์ ์ ์๋ค. */\n onCloseAutoFocus?: (event: Event) => void;\n /** ๋ณธ๋ฌธ ๋ด์ฉ (์ฝํ
์ธ ์์ ). */\n children?: ReactNode;\n className?: string;\n style?: CSSProperties;\n ariaLabel?: string;\n}\n\n/**\n * SPortal โ sd-portal/sd-floating-portal ์ ์ฌ์ฉ์ฑ์ Radix Popover ๋ก ์ฎ๊ธด ๋ฒ์ฉ ์ต์ปค๋ ํ๋กํ
์ปจํ
์ด๋.\n *\n * ํธ๋ฆฌ๊ฑฐ๋ฅผ ๊ฐ์ธ์ง ์๊ณ `anchorRef` ๋ก ์์์ ์๋ฆฌ๋จผํธ์ ๋ถ๋๋ค(=sd-portal `parentRef`).\n * open/onClose ๋ก ์ธ๋ถ์์ ์ ์ดํ๋ฉฐ, flipยทcollisionยท์คํฌ๋กค ์ฌ๋ฐฐ์นยท์ธ๋ถํด๋ฆญยทESCยท๋ชจ๋ฌ ํฌํธ์\n * Radix ๊ฐ ์ฒ๋ฆฌํ๋ค. ์ฝํ
์ธ ๋ children ์ผ๋ก ์์ ํ ์์ ๋กญ๋ค.\n */\nexport function SPortal({\n open,\n onClose,\n onOpenChange,\n anchorRef,\n placement = 'bottom',\n align = 'start',\n offset = 4,\n alignOffset = 0,\n fit = false,\n maxHeight,\n autoClose = false,\n persistent = false,\n viewportPadding = 0,\n onOpenAutoFocus,\n onCloseAutoFocus,\n children,\n className,\n style,\n ariaLabel,\n}: SPortalProps) {\n const portalContainer = usePortalContainer();\n\n return (\n <RPopover.Root\n open={open}\n onOpenChange={next => {\n onOpenChange?.(next);\n if (!next) onClose?.();\n }}\n >\n <RPopover.Anchor virtualRef={anchorRef as RefObject<Measurable>} />\n <RPopover.Portal container={portalContainer}>\n <RPopover.Content\n side={placement}\n align={align}\n sideOffset={offset}\n alignOffset={alignOffset}\n collisionPadding={viewportPadding}\n aria-label={ariaLabel}\n // persistent: ์ธ๋ถ ํด๋ฆญยทESC ๋ก ๋ซํ์ง ์์\n // ์๋๋ฉด: ์ต์ปค(ํธ๋ฆฌ๊ฑฐ) ์ ํด๋ฆญ์ ์๋น์๊ฐ ํ ๊ธํ๋ฏ๋ก ์ฌ๊ธฐ์ ๋ซ์ง ์๋๋ค(์ค๋ณต ํ ๊ธ ๋ฐฉ์ง)\n onPointerDownOutside={e => {\n if (persistent || anchorRef.current?.contains(e.target as Node)) {\n e.preventDefault();\n }\n }}\n // ์ต์ปค(์: input)์ ์ด๋ฏธ ํฌ์ปค์ค๊ฐ ์๋ ์ํ๋ก ์ด๋ฆฌ๋ ๊ฒฝ์ฐ(ํด๋ฆญ ์ฆ์ ์คํ), Radix๋ ํฌ์ปค์ค๊ฐ\n // ๋ ์ด์ด ๋ฐ์ ์๋ค๊ณ ํ๋จํด ์ด๋ฆฌ์๋ง์ ๋ซ์๋ฒ๋ฆฐ๋ค โ ์ต์ปค ๋ด๋ถ ํฌ์ปค์ค๋ outside๋ก ์ทจ๊ธํ์ง ์๋๋ค.\n onFocusOutside={e => {\n if (persistent || anchorRef.current?.contains(e.target as Node)) {\n e.preventDefault();\n }\n }}\n onEscapeKeyDown={persistent ? e => e.preventDefault() : undefined}\n onOpenAutoFocus={onOpenAutoFocus}\n onCloseAutoFocus={onCloseAutoFocus}\n onClick={autoClose ? () => onClose?.() : undefined}\n className={cn(\n 'z-50 overflow-hidden rounded-(--cmp-listBox-radius) bg-(--cmp-listBox-bg) py-4 shadow-normal-sm',\n maxHeight != null && 'overflow-y-auto',\n fit && 'min-w-(--radix-popover-trigger-width)',\n FLOATING_SLIDE_ANIM,\n className,\n )}\n style={{ maxHeight, ...style }}\n >\n {children}\n </RPopover.Content>\n </RPopover.Portal>\n </RPopover.Root>\n );\n}\n\nSPortal.displayName = 'SPortal';\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/cn.ts","../../../src/lib/floating-anim.ts","../../../src/lib/portal-container.tsx","../../../src/components/SPortal/SPortal.tsx"],"names":[],"mappings":"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","file":"SPortal.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\n/**\n * theme.css ์ --text-* ๋ ๊ธฐ๋ณธ Tailwind ํฐํธ์ฌ์ด์ฆ ์ค์ผ์ผ(xs/sm/base...)์ด ์๋\n * ์ซ์ ์ค์ผ์ผ(10~32)์ด๋ผ, ํ์ฅ ์์ด๋ tailwind-merge ๊ฐ ์ด๋ฅผ ํ
์คํธ ์ปฌ๋ฌ ๊ทธ๋ฃน์ผ๋ก\n * ์ค์ธํด text-12 ๊ฐ์ ํด๋์ค๋ฅผ text-(--color-var) ๋ค์์ ์ถฉ๋ ์ ๊ฑฐํด๋ฒ๋ฆฐ๋ค.\n */\nconst twMerge = extendTailwindMerge({\n extend: {\n classGroups: {\n 'font-size': [{ text: ['10', '11', '12', '13', '14', '16', '18', '20', '24', '28', '32'] }],\n },\n },\n});\n\n/**\n * className ๋ณํฉ ์ ํธ.\n * clsx๋ก ์กฐ๊ฑด๋ถ ํด๋์ค๋ฅผ ํฉ์น๊ณ , tailwind-merge๋ก Tailwind ํด๋์ค ์ถฉ๋์ ํด์ํ๋ค.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * Radix Floating(SPopover/STooltip/RTooltip) Content ์ placement ๋ฐฉํฅ๋ณ ์ฌ๋ผ์ด๋+ํ์ด๋.\n * Radix ๊ฐ ๋ถ์ด๋ data-side(์ค์ ๋ ๋ ๋ฐฉํฅ)ยทdata-state ์ ๋ง์ถฐ ์ด๋ฆผ/๋ซํ ์ ๋๋ฉ์ด์
์ ์ ์ฉํ๋ค.\n * (sd-floating-portal ์ sd-floating-slide-* ํฌํ
โ ํคํ๋ ์์ theme.css `--animate-floating-*`)\n *\n * ์: side=top ์ด๋ฉด ์๋(4px)์์ ์๋ก ์ฌ๋ผ์ค๋ฉฐ ๋ํ๋๊ณ , ๋ซํ ๋ ๋ค์ ๋ด๋ ค๊ฐ๋ฉฐ ์ฌ๋ผ์ง๋ค.\n *\n * @radix-ui/react-popover ยท react-dropdown-menu ์ data-state ๋ open/closed ์ง๋ง,\n * @radix-ui/react-tooltip ์ open ๋์ delayed-open/instant-open ์ ์ด๋ค โ ๋ ์ผ์ด์ค ๋ชจ๋ ์ปค๋ฒํ๋ค.\n * Tailwind JIT๋ ์์ค์ ๋ฆฌํฐ๋ด๋ก ๋ฑ์ฅํ๋ ํด๋์ค๋ช
๋ง ์ค์บํ๋ฏ๋ก ํ
ํ๋ฆฟ์ผ๋ก ์กฐํฉํ์ง ์๊ณ ์ ๋ถ ๋์ดํ๋ค.\n */\nexport const FLOATING_SLIDE_ANIM = [\n 'data-[state=open]:data-[side=top]:animate-floating-in-top',\n 'data-[state=delayed-open]:data-[side=top]:animate-floating-in-top',\n 'data-[state=instant-open]:data-[side=top]:animate-floating-in-top',\n 'data-[state=closed]:data-[side=top]:animate-floating-out-top',\n 'data-[state=open]:data-[side=bottom]:animate-floating-in-bottom',\n 'data-[state=delayed-open]:data-[side=bottom]:animate-floating-in-bottom',\n 'data-[state=instant-open]:data-[side=bottom]:animate-floating-in-bottom',\n 'data-[state=closed]:data-[side=bottom]:animate-floating-out-bottom',\n 'data-[state=open]:data-[side=left]:animate-floating-in-left',\n 'data-[state=delayed-open]:data-[side=left]:animate-floating-in-left',\n 'data-[state=instant-open]:data-[side=left]:animate-floating-in-left',\n 'data-[state=closed]:data-[side=left]:animate-floating-out-left',\n 'data-[state=open]:data-[side=right]:animate-floating-in-right',\n 'data-[state=delayed-open]:data-[side=right]:animate-floating-in-right',\n 'data-[state=instant-open]:data-[side=right]:animate-floating-in-right',\n 'data-[state=closed]:data-[side=right]:animate-floating-out-right',\n].join(' ');\n","'use client';\n\nimport { createContext, useContext } from 'react';\n\n/**\n * Floating ์ปดํฌ๋ํธ(STooltip/SPopover/SSelect listbox/SDropdownButton/SDatePicker ๋ฑ)๊ฐ\n * ์์ ์ Portal ์ ์ด๋๋ก ๋ ๋ํ ์ง ๊ฒฐ์ ํ๋ ์ปจํ
์คํธ.\n *\n * ๊ธฐ๋ณธ๊ฐ(null)์ด๋ฉด ๊ฐ ์ปดํฌ๋ํธ๋ body ๋ก portal ํ๋ค.\n * SModalContainer ๋ ๋ชจ๋ฌ์ด ์ด๋ ค์๋ ๋์ ์ด ๊ฐ์ \"๋ชจ๋ฌ ์คํํน ๋ฐด๋(z-1001) ์์ ์ ์ฉ ๋
ธ๋\"๋ก\n * ์ฑ์์, ๋ชจ๋ฌ ์์์ ์ด๋ฆฐ floating ์ด ๋ชจ๋ฌ ๋ค(z-1000) ๋ค์ ๊ฐ๋ ค์ง์ง ์๊ณ ์๋ก ๋จ๊ฒ ํ๋ค.\n * ๋ฐ๋๋ก ๋ชจ๋ฌ ๋ฐ(๋ฒ ์ด์ค ํ๋ฉด)์์ ์ด๋ฆฐ floating ์ ์ฌ์ ํ body(z-50)๋ก ๋๊ฐ๋ฏ๋ก,\n * ๋์ค์ ๋ฌ ๋ชจ๋ฌ์ด ์ ์์ ์ผ๋ก ๊ทธ ์๋ฅผ ๋ฎ๋๋ค. (์์์ ๋ฐ๋ผ ์๋์ ์ผ๋ก ๊ฒฐ์ )\n */\nconst PortalContainerContext = createContext<HTMLElement | null>(null);\nconst InsideModalContext = createContext(false);\n\nexport const PortalContainerProvider = PortalContainerContext.Provider;\nexport const InsideModalProvider = InsideModalContext.Provider;\n\n/**\n * ํ์ฌ ์์๋ Portal ์ปจํ
์ด๋๋ฅผ ๋ฐํํ๋ค.\n * Radix `*.Portal` ์ `container`, Ariakit ์ `portalElement` ์ ๊ทธ๋๋ก ๋๊ธฐ๋ฉด ๋๋ฉฐ,\n * ์ปจํ
์ด๋๊ฐ ์์ ๋(๋ชจ๋ฌ ๋ฐ)๋ `undefined` ๋ฅผ ๋ฐํํด ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ๋ณธ๊ฐ(body)์ ์ด๋ค.\n */\nexport function usePortalContainer(): HTMLElement | undefined {\n return useContext(PortalContainerContext) ?? undefined;\n}\n\n/**\n * ํ์ฌ floating ์ด ๋ชจ๋ฌ ๋ด๋ถ ์ปจํ
์คํธ์์ ๋ ๋๋ง๋๋์ง ๋ฐํํ๋ค.\n * portal target ref ๊ฐ ์์ง ์ค๋น๋์ง ์์ ์ฒซ ๋ ๋์์๋ true๋ฅผ ์ ์งํด\n * ๋ชจ๋ฌ ๋ด๋ถ ์ ์ฉ ์ฐํ ๋ก์ง์ด ๊น๋นก์ด์ง ์๋๋ก ํ๋ค.\n */\nexport function useInsideModal(): boolean {\n return useContext(InsideModalContext);\n}\n","'use client';\n\nimport { type CSSProperties, type ReactNode, type RefObject } from 'react';\nimport * as RPopover from '@radix-ui/react-popover';\nimport { cn } from '../../lib/cn';\nimport { FLOATING_SLIDE_ANIM } from '../../lib/floating-anim';\nimport { usePortalContainer } from '../../lib/portal-container';\n\nexport type SPortalPlacement = 'top' | 'bottom' | 'left' | 'right';\nexport type SPortalAlign = 'start' | 'center' | 'end';\n\n/** Radix Anchor ๊ฐ ์์น ๊ณ์ฐ์ ์ฐ๋ ์ต์ ์ธํฐํ์ด์ค (HTMLElement ๊ฐ ์ถฉ์กฑํ๋ค). */\ntype Measurable = { getBoundingClientRect(): DOMRect };\n\nexport interface SPortalProps {\n /** ํ์ ์ฌ๋ถ (์ ์ด). onClose ์ ํจ๊ป ์ฌ์ฉํ๋ค. */\n open: boolean;\n /** ์ธ๋ถ ํด๋ฆญ ยท ESC ๋ฑ์ผ๋ก ๋ซํ์ด ์์ฒญ๋ ๋ (sd-portal `sdClose` ๋์). */\n onClose?: () => void;\n /** ์ด๋ฆผ/๋ซํ ๋ณ๊ฒฝ ์ ์ฒด ์ฝ๋ฐฑ (์ ํ). */\n onOpenChange?: (open: boolean) => void;\n /**\n * ์์น ๊ธฐ์ค์ด ๋๋ ์ต์ปค ์๋ฆฌ๋จผํธ ref (sd-portal `parentRef` ๋์).\n * ํธ๋ฆฌ๊ฑฐ ๋ฒํผ ๋ฑ์ ๊ทธ๋๋ก ๊ฑธ๋ฉด ๊ทธ ์๋ฆฌ๋จผํธ์ ๋ถ์ด์ ๋ฌ๋ค.\n */\n anchorRef: RefObject<HTMLElement | null>;\n /** ํ์ ๋ฐฉํฅ (๊ณต๊ฐ์ด ๋ถ์กฑํ๋ฉด ์๋์ผ๋ก ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ์ ํ). */\n placement?: SPortalPlacement;\n /** ๊ต์ฐจ์ถ ์ ๋ ฌ (startยทcenterยทend). */\n align?: SPortalAlign;\n /** ์ต์ปค๋ก๋ถํฐ์ ๊ฐ๊ฒฉ px (sd-portal offset[1]). */\n offset?: number;\n /** ์ ๋ ฌ์ถ ์คํ์
px (sd-portal offset[0]). */\n alignOffset?: number;\n /** ์ต์ปค ๋๋น์ ๋ง์ถฐ ์ต์ ๋๋น๋ฅผ ์ก๋๋ค. */\n fit?: boolean;\n /** ์ฝํ
์ธ ์ต๋ ๋์ด px. ๋์น๋ฉด ์ธ๋ก ์คํฌ๋กค. */\n maxHeight?: number;\n /** ์ฝํ
์ธ ๋ด๋ถ๋ฅผ ํด๋ฆญํ๋ฉด ์๋์ผ๋ก ๋ซ๋๋ค. */\n autoClose?: boolean;\n /** ์ธ๋ถ ํด๋ฆญ ยท ESC ๋ก ๋ซํ์ง ์๊ฒ ํ๋ค. */\n persistent?: boolean;\n /** ๋ทฐํฌํธ ๊ฒฝ๊ณ ์ฌ๋ฐฑ px (์ถฉ๋ ํํผ ํจ๋ฉ). */\n viewportPadding?: number;\n /** ์ด๋ฆด ๋ ํฌ์ปค์ค ์ด๋ ์ฒ๋ฆฌ (๊ธฐ๋ณธ์ Radix๊ฐ ์ฝํ
์ธ ๋ก ํฌ์ปค์ค๋ฅผ ์ฎ๊น). e.preventDefault()๋ก ๋ง์ ์ ์๋ค. */\n onOpenAutoFocus?: (event: Event) => void;\n /** ๋ซํ ๋ ํฌ์ปค์ค ๋ณต๊ท ์ฒ๋ฆฌ (๊ธฐ๋ณธ์ Radix๊ฐ ์ต์ปค๋ก ํฌ์ปค์ค๋ฅผ ๋๋๋ฆผ). e.preventDefault()๋ก ๋ง์ ์ ์๋ค. */\n onCloseAutoFocus?: (event: Event) => void;\n /** ๋ณธ๋ฌธ ๋ด์ฉ (์ฝํ
์ธ ์์ ). */\n children?: ReactNode;\n className?: string;\n style?: CSSProperties;\n ariaLabel?: string;\n}\n\n/**\n * SPortal โ sd-portal/sd-floating-portal ์ ์ฌ์ฉ์ฑ์ Radix Popover ๋ก ์ฎ๊ธด ๋ฒ์ฉ ์ต์ปค๋ ํ๋กํ
์ปจํ
์ด๋.\n *\n * ํธ๋ฆฌ๊ฑฐ๋ฅผ ๊ฐ์ธ์ง ์๊ณ `anchorRef` ๋ก ์์์ ์๋ฆฌ๋จผํธ์ ๋ถ๋๋ค(=sd-portal `parentRef`).\n * open/onClose ๋ก ์ธ๋ถ์์ ์ ์ดํ๋ฉฐ, flipยทcollisionยท์คํฌ๋กค ์ฌ๋ฐฐ์นยท์ธ๋ถํด๋ฆญยทESCยท๋ชจ๋ฌ ํฌํธ์\n * Radix ๊ฐ ์ฒ๋ฆฌํ๋ค. ์ฝํ
์ธ ๋ children ์ผ๋ก ์์ ํ ์์ ๋กญ๋ค.\n */\nexport function SPortal({\n open,\n onClose,\n onOpenChange,\n anchorRef,\n placement = 'bottom',\n align = 'start',\n offset = 4,\n alignOffset = 0,\n fit = false,\n maxHeight,\n autoClose = false,\n persistent = false,\n viewportPadding = 0,\n onOpenAutoFocus,\n onCloseAutoFocus,\n children,\n className,\n style,\n ariaLabel,\n}: SPortalProps) {\n const portalContainer = usePortalContainer();\n\n return (\n <RPopover.Root\n open={open}\n onOpenChange={next => {\n onOpenChange?.(next);\n if (!next) onClose?.();\n }}\n >\n <RPopover.Anchor virtualRef={anchorRef as RefObject<Measurable>} />\n <RPopover.Portal container={portalContainer}>\n <RPopover.Content\n side={placement}\n align={align}\n sideOffset={offset}\n alignOffset={alignOffset}\n collisionPadding={viewportPadding}\n aria-label={ariaLabel}\n // persistent: ์ธ๋ถ ํด๋ฆญยทESC ๋ก ๋ซํ์ง ์์\n // ์๋๋ฉด: ์ต์ปค(ํธ๋ฆฌ๊ฑฐ) ์ ํด๋ฆญ์ ์๋น์๊ฐ ํ ๊ธํ๋ฏ๋ก ์ฌ๊ธฐ์ ๋ซ์ง ์๋๋ค(์ค๋ณต ํ ๊ธ ๋ฐฉ์ง)\n onPointerDownOutside={e => {\n if (persistent || anchorRef.current?.contains(e.target as Node)) {\n e.preventDefault();\n }\n }}\n // ์ต์ปค(์: input)์ ์ด๋ฏธ ํฌ์ปค์ค๊ฐ ์๋ ์ํ๋ก ์ด๋ฆฌ๋ ๊ฒฝ์ฐ(ํด๋ฆญ ์ฆ์ ์คํ), Radix๋ ํฌ์ปค์ค๊ฐ\n // ๋ ์ด์ด ๋ฐ์ ์๋ค๊ณ ํ๋จํด ์ด๋ฆฌ์๋ง์ ๋ซ์๋ฒ๋ฆฐ๋ค โ ์ต์ปค ๋ด๋ถ ํฌ์ปค์ค๋ outside๋ก ์ทจ๊ธํ์ง ์๋๋ค.\n onFocusOutside={e => {\n if (persistent || anchorRef.current?.contains(e.target as Node)) {\n e.preventDefault();\n }\n }}\n onEscapeKeyDown={persistent ? e => e.preventDefault() : undefined}\n onOpenAutoFocus={onOpenAutoFocus}\n onCloseAutoFocus={onCloseAutoFocus}\n onClick={autoClose ? () => onClose?.() : undefined}\n className={cn(\n 'z-50 overflow-hidden rounded-(--cmp-listBox-radius) bg-(--cmp-listBox-bg) shadow-normal-sm',\n maxHeight != null && 'overflow-y-auto',\n fit && 'min-w-(--radix-popover-trigger-width)',\n FLOATING_SLIDE_ANIM,\n className,\n )}\n style={{ maxHeight, ...style }}\n >\n {children}\n </RPopover.Content>\n </RPopover.Portal>\n </RPopover.Root>\n );\n}\n\nSPortal.displayName = 'SPortal';\n"]}
|
|
@@ -3094,6 +3094,8 @@ function SGhostButton({
|
|
|
3094
3094
|
tooltipText,
|
|
3095
3095
|
disabled = false,
|
|
3096
3096
|
onClick,
|
|
3097
|
+
anchorClassName,
|
|
3098
|
+
anchorStyle,
|
|
3097
3099
|
className,
|
|
3098
3100
|
style
|
|
3099
3101
|
}) {
|
|
@@ -3116,6 +3118,8 @@ function SGhostButton({
|
|
|
3116
3118
|
};
|
|
3117
3119
|
const s = SIZE[size];
|
|
3118
3120
|
const contentColor = disabled ? intent === "inverse" ? "var(--cmp-ghostButton-inverse-disabled)" : "var(--cmp-ghostButton-icon-disabled)" : `var(--cmp-ghostButton-${intent}-content)`;
|
|
3121
|
+
const text = (tooltipText ?? "").trim();
|
|
3122
|
+
const hasTooltip = text !== "";
|
|
3119
3123
|
const btn = /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3120
3124
|
"button",
|
|
3121
3125
|
{
|
|
@@ -3156,13 +3160,13 @@ function SGhostButton({
|
|
|
3156
3160
|
]
|
|
3157
3161
|
}
|
|
3158
3162
|
);
|
|
3159
|
-
|
|
3160
|
-
if (text === "") return btn;
|
|
3163
|
+
if (!hasTooltip) return btn;
|
|
3161
3164
|
return /* @__PURE__ */ jsxRuntime.jsxs(RPopover2__namespace.Root, { open, onOpenChange: setOpen, children: [
|
|
3162
3165
|
/* @__PURE__ */ jsxRuntime.jsx(RPopover2__namespace.Anchor, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
3163
3166
|
"span",
|
|
3164
3167
|
{
|
|
3165
|
-
className: "inline-flex",
|
|
3168
|
+
className: cn("inline-flex", anchorClassName),
|
|
3169
|
+
style: anchorStyle,
|
|
3166
3170
|
onMouseEnter: openNow,
|
|
3167
3171
|
onMouseLeave: startHide,
|
|
3168
3172
|
onFocus: openNow,
|
|
@@ -3535,7 +3539,7 @@ function SPortal({
|
|
|
3535
3539
|
onCloseAutoFocus,
|
|
3536
3540
|
onClick: autoClose ? () => onClose?.() : void 0,
|
|
3537
3541
|
className: cn(
|
|
3538
|
-
"z-50 overflow-hidden rounded-(--cmp-listBox-radius) bg-(--cmp-listBox-bg)
|
|
3542
|
+
"z-50 overflow-hidden rounded-(--cmp-listBox-radius) bg-(--cmp-listBox-bg) shadow-normal-sm",
|
|
3539
3543
|
maxHeight != null && "overflow-y-auto",
|
|
3540
3544
|
fit && "min-w-(--radix-popover-trigger-width)",
|
|
3541
3545
|
FLOATING_SLIDE_ANIM,
|
|
@@ -3885,7 +3889,7 @@ var SSelect = react.forwardRef(function SSelect2({
|
|
|
3885
3889
|
event.preventDefault();
|
|
3886
3890
|
triggerRef.current?.focus();
|
|
3887
3891
|
},
|
|
3888
|
-
className: "rounded-[var(--cmp-listBox-radius)] bg-[var(--cmp-listBox-bg)]
|
|
3892
|
+
className: "rounded-[var(--cmp-listBox-radius)] bg-[var(--cmp-listBox-bg)] shadow-[2px_2px_12px_2px_rgba(0,0,0,0.1)]",
|
|
3889
3893
|
style: {
|
|
3890
3894
|
...dropdownWidth ? { width: dropdownWidth } : {},
|
|
3891
3895
|
maxWidth: maxDropdownWidth
|
|
@@ -3936,6 +3940,10 @@ var SSelect = react.forwardRef(function SSelect2({
|
|
|
3936
3940
|
onSelectAll: handleSelectAll,
|
|
3937
3941
|
onSelect: handleSelect,
|
|
3938
3942
|
onHoverValue: (value2) => {
|
|
3943
|
+
if (value2 == null) {
|
|
3944
|
+
setFocusedIndex(-1);
|
|
3945
|
+
return;
|
|
3946
|
+
}
|
|
3939
3947
|
const index = navigableItems.findIndex(
|
|
3940
3948
|
(item) => item.isSelectAll ? value2 === "__select_all__" : item.value === value2
|
|
3941
3949
|
);
|
|
@@ -3984,6 +3992,7 @@ function ItemList({
|
|
|
3984
3992
|
),
|
|
3985
3993
|
style: { paddingTop: 4, paddingBottom: 4, paddingRight: 12, paddingLeft: 12 },
|
|
3986
3994
|
onMouseEnter: () => onHoverValue("__select_all__"),
|
|
3995
|
+
onMouseLeave: () => onHoverValue(null),
|
|
3987
3996
|
onClick: onSelectAll,
|
|
3988
3997
|
children: [
|
|
3989
3998
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -4042,10 +4051,13 @@ function ItemList({
|
|
|
4042
4051
|
itemBase,
|
|
4043
4052
|
isSelected && !multi && "font-bold text-[color:var(--cmp-listItem-content-selected)]",
|
|
4044
4053
|
focusedValue === o.value && "bg-[var(--cmp-listItem-bg-hover)] text-[color:var(--cmp-listItem-content-hover)]",
|
|
4045
|
-
|
|
4054
|
+
// ๋นํ์ฑ ํญ๋ชฉ์ hover/focus ์คํ์ผ ๋์์์ ์ ์ธํ๋ค.
|
|
4055
|
+
// (:hover ๋ disabled ๋ฒํผ์๋ ๋งค์นญ๋๋ฏ๋ก ํด๋์ค ์์ฒด๋ฅผ ๋ถ์ด์ง ์์์ผ ํ๋ค)
|
|
4056
|
+
!o.disabled && activeClass
|
|
4046
4057
|
),
|
|
4047
4058
|
style: { paddingTop: 4, paddingBottom: 4, paddingRight: 12, paddingLeft: padLeft },
|
|
4048
4059
|
onMouseEnter: () => onHoverValue(o.value),
|
|
4060
|
+
onMouseLeave: () => onHoverValue(null),
|
|
4049
4061
|
onClick: () => onSelect(o.value),
|
|
4050
4062
|
children: [
|
|
4051
4063
|
multi && /* @__PURE__ */ jsxRuntime.jsx(
|