sellmate-design-system-react 0.1.10 โ†’ 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.
Files changed (163) hide show
  1. package/dist/components/SActionModal/SActionModal.cjs +10 -4
  2. package/dist/components/SActionModal/SActionModal.cjs.map +1 -1
  3. package/dist/components/SActionModal/SActionModal.js +10 -4
  4. package/dist/components/SActionModal/SActionModal.js.map +1 -1
  5. package/dist/components/SBarcodeInput/SBarcodeInput.cjs +22 -5
  6. package/dist/components/SBarcodeInput/SBarcodeInput.cjs.map +1 -1
  7. package/dist/components/SBarcodeInput/SBarcodeInput.d.ts +3 -1
  8. package/dist/components/SBarcodeInput/SBarcodeInput.js +22 -5
  9. package/dist/components/SBarcodeInput/SBarcodeInput.js.map +1 -1
  10. package/dist/components/SCalendar/SCalendar.cjs +9 -3
  11. package/dist/components/SCalendar/SCalendar.cjs.map +1 -1
  12. package/dist/components/SCalendar/SCalendar.js +9 -3
  13. package/dist/components/SCalendar/SCalendar.js.map +1 -1
  14. package/dist/components/SChip/SChip.cjs +9 -3
  15. package/dist/components/SChip/SChip.cjs.map +1 -1
  16. package/dist/components/SChip/SChip.js +9 -3
  17. package/dist/components/SChip/SChip.js.map +1 -1
  18. package/dist/components/SChipInput/SChipInput.cjs +44 -13
  19. package/dist/components/SChipInput/SChipInput.cjs.map +1 -1
  20. package/dist/components/SChipInput/SChipInput.d.ts +5 -0
  21. package/dist/components/SChipInput/SChipInput.js +44 -13
  22. package/dist/components/SChipInput/SChipInput.js.map +1 -1
  23. package/dist/components/SChipInput/index.d.ts +1 -1
  24. package/dist/components/SCircleProgress/SCircleProgress.cjs +6 -2
  25. package/dist/components/SCircleProgress/SCircleProgress.cjs.map +1 -1
  26. package/dist/components/SCircleProgress/SCircleProgress.js +6 -2
  27. package/dist/components/SCircleProgress/SCircleProgress.js.map +1 -1
  28. package/dist/components/SConfirmModal/SConfirmModal.cjs +20 -13
  29. package/dist/components/SConfirmModal/SConfirmModal.cjs.map +1 -1
  30. package/dist/components/SConfirmModal/SConfirmModal.d.ts +7 -4
  31. package/dist/components/SConfirmModal/SConfirmModal.js +20 -13
  32. package/dist/components/SConfirmModal/SConfirmModal.js.map +1 -1
  33. package/dist/components/SDatePicker/SDatePicker.cjs +22 -5
  34. package/dist/components/SDatePicker/SDatePicker.cjs.map +1 -1
  35. package/dist/components/SDatePicker/SDatePicker.d.ts +3 -1
  36. package/dist/components/SDatePicker/SDatePicker.js +22 -5
  37. package/dist/components/SDatePicker/SDatePicker.js.map +1 -1
  38. package/dist/components/SDateRangePicker/SDateRangePicker.cjs +22 -5
  39. package/dist/components/SDateRangePicker/SDateRangePicker.cjs.map +1 -1
  40. package/dist/components/SDateRangePicker/SDateRangePicker.d.ts +3 -1
  41. package/dist/components/SDateRangePicker/SDateRangePicker.js +22 -5
  42. package/dist/components/SDateRangePicker/SDateRangePicker.js.map +1 -1
  43. package/dist/components/SDropdownButton/SDropdownButton.cjs +3 -1
  44. package/dist/components/SDropdownButton/SDropdownButton.cjs.map +1 -1
  45. package/dist/components/SDropdownButton/SDropdownButton.js +3 -1
  46. package/dist/components/SDropdownButton/SDropdownButton.js.map +1 -1
  47. package/dist/components/SField/SField.cjs +20 -5
  48. package/dist/components/SField/SField.cjs.map +1 -1
  49. package/dist/components/SField/SField.d.ts +4 -1
  50. package/dist/components/SField/SField.js +20 -5
  51. package/dist/components/SField/SField.js.map +1 -1
  52. package/dist/components/SFilePicker/SFilePicker.cjs +23 -6
  53. package/dist/components/SFilePicker/SFilePicker.cjs.map +1 -1
  54. package/dist/components/SFilePicker/SFilePicker.d.ts +3 -1
  55. package/dist/components/SFilePicker/SFilePicker.js +23 -6
  56. package/dist/components/SFilePicker/SFilePicker.js.map +1 -1
  57. package/dist/components/SGhostButton/SGhostButton.cjs +9 -3
  58. package/dist/components/SGhostButton/SGhostButton.cjs.map +1 -1
  59. package/dist/components/SGhostButton/SGhostButton.d.ts +5 -1
  60. package/dist/components/SGhostButton/SGhostButton.js +9 -3
  61. package/dist/components/SGhostButton/SGhostButton.js.map +1 -1
  62. package/dist/components/SGnb/SGnb.cjs +3297 -0
  63. package/dist/components/SGnb/SGnb.cjs.map +1 -0
  64. package/dist/components/SGnb/SGnb.d.ts +35 -0
  65. package/dist/components/SGnb/SGnb.js +3295 -0
  66. package/dist/components/SGnb/SGnb.js.map +1 -0
  67. package/dist/components/SGnb/gnb.config.d.ts +63 -0
  68. package/dist/components/SGnb/index.d.ts +2 -0
  69. package/dist/components/SGuide/SGuide.cjs +9 -3
  70. package/dist/components/SGuide/SGuide.cjs.map +1 -1
  71. package/dist/components/SGuide/SGuide.js +9 -3
  72. package/dist/components/SGuide/SGuide.js.map +1 -1
  73. package/dist/components/SInput/SInput.cjs +22 -5
  74. package/dist/components/SInput/SInput.cjs.map +1 -1
  75. package/dist/components/SInput/SInput.d.ts +4 -1
  76. package/dist/components/SInput/SInput.js +22 -5
  77. package/dist/components/SInput/SInput.js.map +1 -1
  78. package/dist/components/SKeyValueTable/SKeyValueTable.cjs +511 -209
  79. package/dist/components/SKeyValueTable/SKeyValueTable.cjs.map +1 -1
  80. package/dist/components/SKeyValueTable/SKeyValueTable.d.ts +27 -6
  81. package/dist/components/SKeyValueTable/SKeyValueTable.js +510 -208
  82. package/dist/components/SKeyValueTable/SKeyValueTable.js.map +1 -1
  83. package/dist/components/SLayout/SLayout.cjs +79 -0
  84. package/dist/components/SLayout/SLayout.cjs.map +1 -0
  85. package/dist/components/SLayout/SLayout.d.ts +41 -0
  86. package/dist/components/SLayout/SLayout.js +75 -0
  87. package/dist/components/SLayout/SLayout.js.map +1 -0
  88. package/dist/components/SLayout/index.d.ts +1 -0
  89. package/dist/components/SLoadingContainer/SLoadingContainer.cjs +6 -2
  90. package/dist/components/SLoadingContainer/SLoadingContainer.cjs.map +1 -1
  91. package/dist/components/SLoadingContainer/SLoadingContainer.js +6 -2
  92. package/dist/components/SLoadingContainer/SLoadingContainer.js.map +1 -1
  93. package/dist/components/SLoadingContainer/loading.cjs +6 -2
  94. package/dist/components/SLoadingContainer/loading.cjs.map +1 -1
  95. package/dist/components/SLoadingContainer/loading.js +6 -2
  96. package/dist/components/SLoadingContainer/loading.js.map +1 -1
  97. package/dist/components/SLoadingModal/SLoadingModal.cjs +16 -6
  98. package/dist/components/SLoadingModal/SLoadingModal.cjs.map +1 -1
  99. package/dist/components/SLoadingModal/SLoadingModal.js +16 -6
  100. package/dist/components/SLoadingModal/SLoadingModal.js.map +1 -1
  101. package/dist/components/SModalContainer/SModalContainer.cjs +10 -4
  102. package/dist/components/SModalContainer/SModalContainer.cjs.map +1 -1
  103. package/dist/components/SModalContainer/SModalContainer.d.ts +10 -0
  104. package/dist/components/SModalContainer/SModalContainer.js +10 -4
  105. package/dist/components/SModalContainer/SModalContainer.js.map +1 -1
  106. package/dist/components/SNumberInput/SNumberInput.cjs +22 -5
  107. package/dist/components/SNumberInput/SNumberInput.cjs.map +1 -1
  108. package/dist/components/SNumberInput/SNumberInput.d.ts +2 -0
  109. package/dist/components/SNumberInput/SNumberInput.js +22 -5
  110. package/dist/components/SNumberInput/SNumberInput.js.map +1 -1
  111. package/dist/components/SPage/SPage.cjs +86 -0
  112. package/dist/components/SPage/SPage.cjs.map +1 -0
  113. package/dist/components/SPage/SPage.d.ts +13 -0
  114. package/dist/components/SPage/SPage.js +84 -0
  115. package/dist/components/SPage/SPage.js.map +1 -0
  116. package/dist/components/SPage/index.d.ts +1 -0
  117. package/dist/components/SPopover/SPopover.cjs +9 -3
  118. package/dist/components/SPopover/SPopover.cjs.map +1 -1
  119. package/dist/components/SPopover/SPopover.js +9 -3
  120. package/dist/components/SPopover/SPopover.js.map +1 -1
  121. package/dist/components/SPortal/SPortal.cjs +3 -1
  122. package/dist/components/SPortal/SPortal.cjs.map +1 -1
  123. package/dist/components/SPortal/SPortal.js +3 -1
  124. package/dist/components/SPortal/SPortal.js.map +1 -1
  125. package/dist/components/SSelect/SSelect.cjs +545 -265
  126. package/dist/components/SSelect/SSelect.cjs.map +1 -1
  127. package/dist/components/SSelect/SSelect.d.ts +4 -2
  128. package/dist/components/SSelect/SSelect.js +546 -265
  129. package/dist/components/SSelect/SSelect.js.map +1 -1
  130. package/dist/components/STable/STable.cjs +552 -268
  131. package/dist/components/STable/STable.cjs.map +1 -1
  132. package/dist/components/STable/STable.js +553 -268
  133. package/dist/components/STable/STable.js.map +1 -1
  134. package/dist/components/STextLink/STextLink.cjs +2 -0
  135. package/dist/components/STextLink/STextLink.cjs.map +1 -1
  136. package/dist/components/STextLink/STextLink.js +2 -0
  137. package/dist/components/STextLink/STextLink.js.map +1 -1
  138. package/dist/components/STextarea/STextarea.cjs +22 -5
  139. package/dist/components/STextarea/STextarea.cjs.map +1 -1
  140. package/dist/components/STextarea/STextarea.d.ts +2 -0
  141. package/dist/components/STextarea/STextarea.js +22 -5
  142. package/dist/components/STextarea/STextarea.js.map +1 -1
  143. package/dist/components/SToast/SToast.cjs +9 -3
  144. package/dist/components/SToast/SToast.cjs.map +1 -1
  145. package/dist/components/SToast/SToast.js +9 -3
  146. package/dist/components/SToast/SToast.js.map +1 -1
  147. package/dist/components/SToast/SToastContainer.cjs +9 -3
  148. package/dist/components/SToast/SToastContainer.cjs.map +1 -1
  149. package/dist/components/SToast/SToastContainer.js +9 -3
  150. package/dist/components/SToast/SToastContainer.js.map +1 -1
  151. package/dist/components/STooltip/STooltip.cjs +9 -3
  152. package/dist/components/STooltip/STooltip.cjs.map +1 -1
  153. package/dist/components/STooltip/STooltip.js +9 -3
  154. package/dist/components/STooltip/STooltip.js.map +1 -1
  155. package/dist/index.cjs +840 -199
  156. package/dist/index.cjs.map +1 -1
  157. package/dist/index.d.ts +3 -1
  158. package/dist/index.js +832 -200
  159. package/dist/index.js.map +1 -1
  160. package/dist/lib/portal-container.d.ts +7 -0
  161. package/dist/styles.css +253 -63
  162. package/dist/theme.css +66 -13
  163. package/package.json +1 -1
@@ -58,7 +58,9 @@ var FLOATING_SLIDE_ANIM = [
58
58
  "data-[state=closed]:data-[side=right]:animate-floating-out-right"
59
59
  ].join(" ");
60
60
  var PortalContainerContext = react.createContext(null);
61
+ var InsideModalContext = react.createContext(false);
61
62
  PortalContainerContext.Provider;
63
+ InsideModalContext.Provider;
62
64
  function usePortalContainer() {
63
65
  return react.useContext(PortalContainerContext) ?? void 0;
64
66
  }
@@ -118,7 +120,7 @@ function SPortal({
118
120
  onCloseAutoFocus,
119
121
  onClick: autoClose ? () => onClose?.() : void 0,
120
122
  className: cn(
121
- "z-50 overflow-hidden rounded-(--cmp-listBox-radius) bg-(--cmp-listBox-bg) py-4 shadow-normal-sm",
123
+ "z-50 overflow-hidden rounded-(--cmp-listBox-radius) bg-(--cmp-listBox-bg) shadow-normal-sm",
122
124
  maxHeight != null && "overflow-y-auto",
123
125
  fit && "min-w-(--radix-popover-trigger-width)",
124
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);\n\nexport const PortalContainerProvider = PortalContainerContext.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","'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"]}
@@ -36,7 +36,9 @@ var FLOATING_SLIDE_ANIM = [
36
36
  "data-[state=closed]:data-[side=right]:animate-floating-out-right"
37
37
  ].join(" ");
38
38
  var PortalContainerContext = createContext(null);
39
+ var InsideModalContext = createContext(false);
39
40
  PortalContainerContext.Provider;
41
+ InsideModalContext.Provider;
40
42
  function usePortalContainer() {
41
43
  return useContext(PortalContainerContext) ?? void 0;
42
44
  }
@@ -96,7 +98,7 @@ function SPortal({
96
98
  onCloseAutoFocus,
97
99
  onClick: autoClose ? () => onClose?.() : void 0,
98
100
  className: cn(
99
- "z-50 overflow-hidden rounded-(--cmp-listBox-radius) bg-(--cmp-listBox-bg) py-4 shadow-normal-sm",
101
+ "z-50 overflow-hidden rounded-(--cmp-listBox-radius) bg-(--cmp-listBox-bg) shadow-normal-sm",
100
102
  maxHeight != null && "overflow-y-auto",
101
103
  fit && "min-w-(--radix-popover-trigger-width)",
102
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":";;;;;;AAQA,IAAM,UAAU,mBAAA,CAAoB;AAAA,EAClC,MAAA,EAAQ;AAAA,IACN,WAAA,EAAa;AAAA,MACX,aAAa,CAAC,EAAE,IAAA,EAAM,CAAC,MAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAM,IAAI,GAAG;AAAA;AAC5F;AAEJ,CAAC,CAAA;AAMM,SAAS,MAAM,MAAA,EAA8B;AAClD,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;;;ACXO,IAAM,mBAAA,GAAsB;AAAA,EACjC,2DAAA;AAAA,EACA,mEAAA;AAAA,EACA,mEAAA;AAAA,EACA,8DAAA;AAAA,EACA,iEAAA;AAAA,EACA,yEAAA;AAAA,EACA,yEAAA;AAAA,EACA,oEAAA;AAAA,EACA,6DAAA;AAAA,EACA,qEAAA;AAAA,EACA,qEAAA;AAAA,EACA,gEAAA;AAAA,EACA,+DAAA;AAAA,EACA,uEAAA;AAAA,EACA,uEAAA;AAAA,EACA;AACF,CAAA,CAAE,KAAK,GAAG,CAAA;ACdV,IAAM,sBAAA,GAAyB,cAAkC,IAAI,CAAA;AAE9B,sBAAA,CAAuB;AAOvD,SAAS,kBAAA,GAA8C;AAC5D,EAAA,OAAO,UAAA,CAAW,sBAAsB,CAAA,IAAK,MAAA;AAC/C;ACqCO,SAAS,OAAA,CAAQ;AAAA,EACtB,IAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA,GAAY,QAAA;AAAA,EACZ,KAAA,GAAQ,OAAA;AAAA,EACR,MAAA,GAAS,CAAA;AAAA,EACT,WAAA,GAAc,CAAA;AAAA,EACd,GAAA,GAAM,KAAA;AAAA,EACN,SAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,UAAA,GAAa,KAAA;AAAA,EACb,eAAA,GAAkB,CAAA;AAAA,EAClB,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAAiB;AACf,EAAA,MAAM,kBAAkB,kBAAA,EAAmB;AAE3C,EAAA,uBACE,IAAA;AAAA,IAAU,QAAA,CAAA,IAAA;AAAA,IAAT;AAAA,MACC,IAAA;AAAA,MACA,cAAc,CAAA,IAAA,KAAQ;AACpB,QAAA,YAAA,GAAe,IAAI,CAAA;AACnB,QAAA,IAAI,CAAC,MAAM,OAAA,IAAU;AAAA,MACvB,CAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAU,QAAA,CAAA,MAAA,EAAT,EAAgB,UAAA,EAAY,SAAA,EAAoC,CAAA;AAAA,wBACjE,GAAA,CAAU,QAAA,CAAA,MAAA,EAAT,EAAgB,SAAA,EAAW,eAAA,EAC1B,QAAA,kBAAA,GAAA;AAAA,UAAU,QAAA,CAAA,OAAA;AAAA,UAAT;AAAA,YACC,IAAA,EAAM,SAAA;AAAA,YACN,KAAA;AAAA,YACA,UAAA,EAAY,MAAA;AAAA,YACZ,WAAA;AAAA,YACA,gBAAA,EAAkB,eAAA;AAAA,YAClB,YAAA,EAAY,SAAA;AAAA,YAGZ,sBAAsB,CAAA,CAAA,KAAK;AACzB,cAAA,IAAI,cAAc,SAAA,CAAU,OAAA,EAAS,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,EAAG;AAC/D,gBAAA,CAAA,CAAE,cAAA,EAAe;AAAA,cACnB;AAAA,YACF,CAAA;AAAA,YAGA,gBAAgB,CAAA,CAAA,KAAK;AACnB,cAAA,IAAI,cAAc,SAAA,CAAU,OAAA,EAAS,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,EAAG;AAC/D,gBAAA,CAAA,CAAE,cAAA,EAAe;AAAA,cACnB;AAAA,YACF,CAAA;AAAA,YACA,eAAA,EAAiB,UAAA,GAAa,CAAA,CAAA,KAAK,CAAA,CAAE,gBAAe,GAAI,MAAA;AAAA,YACxD,eAAA;AAAA,YACA,gBAAA;AAAA,YACA,OAAA,EAAS,SAAA,GAAY,MAAM,OAAA,IAAU,GAAI,MAAA;AAAA,YACzC,SAAA,EAAW,EAAA;AAAA,cACT,iGAAA;AAAA,cACA,aAAa,IAAA,IAAQ,iBAAA;AAAA,cACrB,GAAA,IAAO,uCAAA;AAAA,cACP,mBAAA;AAAA,cACA;AAAA,aACF;AAAA,YACA,KAAA,EAAO,EAAE,SAAA,EAAW,GAAG,KAAA,EAAM;AAAA,YAE5B;AAAA;AAAA,SACH,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AAEA,OAAA,CAAQ,WAAA,GAAc,SAAA","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);\n\nexport const PortalContainerProvider = PortalContainerContext.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","'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"]}