sellmate-design-system-react 0.1.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 (311) hide show
  1. package/README.md +65 -0
  2. package/dist/components/ActionModal/ActionModal.cjs +3085 -0
  3. package/dist/components/ActionModal/ActionModal.cjs.map +1 -0
  4. package/dist/components/ActionModal/ActionModal.d.ts +24 -0
  5. package/dist/components/ActionModal/ActionModal.js +3062 -0
  6. package/dist/components/ActionModal/ActionModal.js.map +1 -0
  7. package/dist/components/ActionModal/index.d.ts +1 -0
  8. package/dist/components/Badge/Badge.cjs +39 -0
  9. package/dist/components/Badge/Badge.cjs.map +1 -0
  10. package/dist/components/Badge/Badge.d.ts +12 -0
  11. package/dist/components/Badge/Badge.js +36 -0
  12. package/dist/components/Badge/Badge.js.map +1 -0
  13. package/dist/components/Badge/index.d.ts +1 -0
  14. package/dist/components/BarcodeInput/BarcodeInput.cjs +3183 -0
  15. package/dist/components/BarcodeInput/BarcodeInput.cjs.map +1 -0
  16. package/dist/components/BarcodeInput/BarcodeInput.d.ts +45 -0
  17. package/dist/components/BarcodeInput/BarcodeInput.js +3160 -0
  18. package/dist/components/BarcodeInput/BarcodeInput.js.map +1 -0
  19. package/dist/components/BarcodeInput/index.d.ts +1 -0
  20. package/dist/components/Button/Button.cjs +2796 -0
  21. package/dist/components/Button/Button.cjs.map +1 -0
  22. package/dist/components/Button/Button.d.ts +21 -0
  23. package/dist/components/Button/Button.js +2794 -0
  24. package/dist/components/Button/Button.js.map +1 -0
  25. package/dist/components/Button/button.config.d.ts +33 -0
  26. package/dist/components/Button/index.d.ts +2 -0
  27. package/dist/components/Calendar/Calendar.cjs +3055 -0
  28. package/dist/components/Calendar/Calendar.cjs.map +1 -0
  29. package/dist/components/Calendar/Calendar.d.ts +27 -0
  30. package/dist/components/Calendar/Calendar.js +3033 -0
  31. package/dist/components/Calendar/Calendar.js.map +1 -0
  32. package/dist/components/Calendar/index.d.ts +1 -0
  33. package/dist/components/Callout/Callout.cjs +2701 -0
  34. package/dist/components/Callout/Callout.cjs.map +1 -0
  35. package/dist/components/Callout/Callout.d.ts +20 -0
  36. package/dist/components/Callout/Callout.js +2699 -0
  37. package/dist/components/Callout/Callout.js.map +1 -0
  38. package/dist/components/Callout/index.d.ts +1 -0
  39. package/dist/components/Card/Card.cjs +26 -0
  40. package/dist/components/Card/Card.cjs.map +1 -0
  41. package/dist/components/Card/Card.d.ts +7 -0
  42. package/dist/components/Card/Card.js +24 -0
  43. package/dist/components/Card/Card.js.map +1 -0
  44. package/dist/components/Card/index.d.ts +1 -0
  45. package/dist/components/Checkbox/Checkbox.cjs +2729 -0
  46. package/dist/components/Checkbox/Checkbox.cjs.map +1 -0
  47. package/dist/components/Checkbox/Checkbox.d.ts +23 -0
  48. package/dist/components/Checkbox/Checkbox.js +2707 -0
  49. package/dist/components/Checkbox/Checkbox.js.map +1 -0
  50. package/dist/components/Checkbox/index.d.ts +1 -0
  51. package/dist/components/Chip/Chip.cjs +2958 -0
  52. package/dist/components/Chip/Chip.cjs.map +1 -0
  53. package/dist/components/Chip/Chip.d.ts +39 -0
  54. package/dist/components/Chip/Chip.js +2936 -0
  55. package/dist/components/Chip/Chip.js.map +1 -0
  56. package/dist/components/Chip/index.d.ts +1 -0
  57. package/dist/components/ChipInput/ChipInput.cjs +3558 -0
  58. package/dist/components/ChipInput/ChipInput.cjs.map +1 -0
  59. package/dist/components/ChipInput/ChipInput.d.ts +51 -0
  60. package/dist/components/ChipInput/ChipInput.js +3535 -0
  61. package/dist/components/ChipInput/ChipInput.js.map +1 -0
  62. package/dist/components/ChipInput/index.d.ts +1 -0
  63. package/dist/components/CircleProgress/CircleProgress.cjs +102 -0
  64. package/dist/components/CircleProgress/CircleProgress.cjs.map +1 -0
  65. package/dist/components/CircleProgress/CircleProgress.d.ts +16 -0
  66. package/dist/components/CircleProgress/CircleProgress.js +100 -0
  67. package/dist/components/CircleProgress/CircleProgress.js.map +1 -0
  68. package/dist/components/CircleProgress/index.d.ts +1 -0
  69. package/dist/components/ConfirmModal/ConfirmModal.cjs +3145 -0
  70. package/dist/components/ConfirmModal/ConfirmModal.cjs.map +1 -0
  71. package/dist/components/ConfirmModal/ConfirmModal.d.ts +41 -0
  72. package/dist/components/ConfirmModal/ConfirmModal.js +3122 -0
  73. package/dist/components/ConfirmModal/ConfirmModal.js.map +1 -0
  74. package/dist/components/ConfirmModal/index.d.ts +1 -0
  75. package/dist/components/DatePicker/DatePicker.cjs +3409 -0
  76. package/dist/components/DatePicker/DatePicker.cjs.map +1 -0
  77. package/dist/components/DatePicker/DatePicker.d.ts +40 -0
  78. package/dist/components/DatePicker/DatePicker.js +3386 -0
  79. package/dist/components/DatePicker/DatePicker.js.map +1 -0
  80. package/dist/components/DatePicker/index.d.ts +1 -0
  81. package/dist/components/DateRangePicker/DateRangePicker.cjs +3367 -0
  82. package/dist/components/DateRangePicker/DateRangePicker.cjs.map +1 -0
  83. package/dist/components/DateRangePicker/DateRangePicker.d.ts +41 -0
  84. package/dist/components/DateRangePicker/DateRangePicker.js +3344 -0
  85. package/dist/components/DateRangePicker/DateRangePicker.js.map +1 -0
  86. package/dist/components/DateRangePicker/index.d.ts +1 -0
  87. package/dist/components/Divider/Divider.cjs +31 -0
  88. package/dist/components/Divider/Divider.cjs.map +1 -0
  89. package/dist/components/Divider/Divider.d.ts +7 -0
  90. package/dist/components/Divider/Divider.js +29 -0
  91. package/dist/components/Divider/Divider.js.map +1 -0
  92. package/dist/components/Divider/index.d.ts +1 -0
  93. package/dist/components/DropdownButton/DropdownButton.cjs +2884 -0
  94. package/dist/components/DropdownButton/DropdownButton.cjs.map +1 -0
  95. package/dist/components/DropdownButton/DropdownButton.d.ts +43 -0
  96. package/dist/components/DropdownButton/DropdownButton.js +2862 -0
  97. package/dist/components/DropdownButton/DropdownButton.js.map +1 -0
  98. package/dist/components/DropdownButton/index.d.ts +1 -0
  99. package/dist/components/Field/Field.cjs +2895 -0
  100. package/dist/components/Field/Field.cjs.map +1 -0
  101. package/dist/components/Field/Field.d.ts +64 -0
  102. package/dist/components/Field/Field.js +2872 -0
  103. package/dist/components/Field/Field.js.map +1 -0
  104. package/dist/components/Field/index.d.ts +1 -0
  105. package/dist/components/FilePicker/FilePicker.cjs +3385 -0
  106. package/dist/components/FilePicker/FilePicker.cjs.map +1 -0
  107. package/dist/components/FilePicker/FilePicker.d.ts +49 -0
  108. package/dist/components/FilePicker/FilePicker.js +3362 -0
  109. package/dist/components/FilePicker/FilePicker.js.map +1 -0
  110. package/dist/components/FilePicker/index.d.ts +1 -0
  111. package/dist/components/GhostButton/GhostButton.cjs +2804 -0
  112. package/dist/components/GhostButton/GhostButton.cjs.map +1 -0
  113. package/dist/components/GhostButton/GhostButton.d.ts +27 -0
  114. package/dist/components/GhostButton/GhostButton.js +2782 -0
  115. package/dist/components/GhostButton/GhostButton.js.map +1 -0
  116. package/dist/components/GhostButton/index.d.ts +1 -0
  117. package/dist/components/Guide/Guide.cjs +2884 -0
  118. package/dist/components/Guide/Guide.cjs.map +1 -0
  119. package/dist/components/Guide/Guide.d.ts +20 -0
  120. package/dist/components/Guide/Guide.js +2861 -0
  121. package/dist/components/Guide/Guide.js.map +1 -0
  122. package/dist/components/Guide/index.d.ts +1 -0
  123. package/dist/components/Icon/Icon.cjs +2638 -0
  124. package/dist/components/Icon/Icon.cjs.map +1 -0
  125. package/dist/components/Icon/Icon.d.ts +21 -0
  126. package/dist/components/Icon/Icon.js +2636 -0
  127. package/dist/components/Icon/Icon.js.map +1 -0
  128. package/dist/components/Icon/icons.gen.cjs +2615 -0
  129. package/dist/components/Icon/icons.gen.cjs.map +1 -0
  130. package/dist/components/Icon/icons.gen.d.ts +96 -0
  131. package/dist/components/Icon/icons.gen.js +2613 -0
  132. package/dist/components/Icon/icons.gen.js.map +1 -0
  133. package/dist/components/Icon/index.d.ts +2 -0
  134. package/dist/components/Input/Input.cjs +3044 -0
  135. package/dist/components/Input/Input.cjs.map +1 -0
  136. package/dist/components/Input/Input.d.ts +52 -0
  137. package/dist/components/Input/Input.js +3021 -0
  138. package/dist/components/Input/Input.js.map +1 -0
  139. package/dist/components/Input/index.d.ts +1 -0
  140. package/dist/components/KeyValueTable/KeyValueTable.cjs +5339 -0
  141. package/dist/components/KeyValueTable/KeyValueTable.cjs.map +1 -0
  142. package/dist/components/KeyValueTable/KeyValueTable.d.ts +40 -0
  143. package/dist/components/KeyValueTable/KeyValueTable.js +5314 -0
  144. package/dist/components/KeyValueTable/KeyValueTable.js.map +1 -0
  145. package/dist/components/KeyValueTable/index.d.ts +1 -0
  146. package/dist/components/LinearProgress/LinearProgress.cjs +70 -0
  147. package/dist/components/LinearProgress/LinearProgress.cjs.map +1 -0
  148. package/dist/components/LinearProgress/LinearProgress.d.ts +16 -0
  149. package/dist/components/LinearProgress/LinearProgress.js +68 -0
  150. package/dist/components/LinearProgress/LinearProgress.js.map +1 -0
  151. package/dist/components/LinearProgress/index.d.ts +1 -0
  152. package/dist/components/LoadingContainer/LoadingContainer.cjs +126 -0
  153. package/dist/components/LoadingContainer/LoadingContainer.cjs.map +1 -0
  154. package/dist/components/LoadingContainer/LoadingContainer.d.ts +16 -0
  155. package/dist/components/LoadingContainer/LoadingContainer.js +124 -0
  156. package/dist/components/LoadingContainer/LoadingContainer.js.map +1 -0
  157. package/dist/components/LoadingContainer/index.d.ts +2 -0
  158. package/dist/components/LoadingContainer/loading.cjs +164 -0
  159. package/dist/components/LoadingContainer/loading.cjs.map +1 -0
  160. package/dist/components/LoadingContainer/loading.d.ts +10 -0
  161. package/dist/components/LoadingContainer/loading.js +161 -0
  162. package/dist/components/LoadingContainer/loading.js.map +1 -0
  163. package/dist/components/LoadingModal/LoadingModal.cjs +3178 -0
  164. package/dist/components/LoadingModal/LoadingModal.cjs.map +1 -0
  165. package/dist/components/LoadingModal/LoadingModal.d.ts +23 -0
  166. package/dist/components/LoadingModal/LoadingModal.js +3155 -0
  167. package/dist/components/LoadingModal/LoadingModal.js.map +1 -0
  168. package/dist/components/LoadingModal/index.d.ts +1 -0
  169. package/dist/components/ModalContainer/ModalContainer.cjs +2875 -0
  170. package/dist/components/ModalContainer/ModalContainer.cjs.map +1 -0
  171. package/dist/components/ModalContainer/ModalContainer.d.ts +27 -0
  172. package/dist/components/ModalContainer/ModalContainer.js +2852 -0
  173. package/dist/components/ModalContainer/ModalContainer.js.map +1 -0
  174. package/dist/components/ModalContainer/index.d.ts +1 -0
  175. package/dist/components/NumberInput/NumberInput.cjs +3136 -0
  176. package/dist/components/NumberInput/NumberInput.cjs.map +1 -0
  177. package/dist/components/NumberInput/NumberInput.d.ts +63 -0
  178. package/dist/components/NumberInput/NumberInput.js +3113 -0
  179. package/dist/components/NumberInput/NumberInput.js.map +1 -0
  180. package/dist/components/NumberInput/index.d.ts +1 -0
  181. package/dist/components/Pagination/Pagination.cjs +2721 -0
  182. package/dist/components/Pagination/Pagination.cjs.map +1 -0
  183. package/dist/components/Pagination/Pagination.d.ts +15 -0
  184. package/dist/components/Pagination/Pagination.js +2719 -0
  185. package/dist/components/Pagination/Pagination.js.map +1 -0
  186. package/dist/components/Pagination/index.d.ts +1 -0
  187. package/dist/components/Popover/Popover.cjs +2973 -0
  188. package/dist/components/Popover/Popover.cjs.map +1 -0
  189. package/dist/components/Popover/Popover.d.ts +48 -0
  190. package/dist/components/Popover/Popover.js +2951 -0
  191. package/dist/components/Popover/Popover.js.map +1 -0
  192. package/dist/components/Popover/index.d.ts +1 -0
  193. package/dist/components/Popup/Popup.cjs +2859 -0
  194. package/dist/components/Popup/Popup.cjs.map +1 -0
  195. package/dist/components/Popup/Popup.d.ts +31 -0
  196. package/dist/components/Popup/Popup.js +2857 -0
  197. package/dist/components/Popup/Popup.js.map +1 -0
  198. package/dist/components/Popup/index.d.ts +1 -0
  199. package/dist/components/Radio/Radio.cjs +104 -0
  200. package/dist/components/Radio/Radio.cjs.map +1 -0
  201. package/dist/components/Radio/Radio.d.ts +21 -0
  202. package/dist/components/Radio/Radio.js +102 -0
  203. package/dist/components/Radio/Radio.js.map +1 -0
  204. package/dist/components/Radio/RadioGroup.cjs +139 -0
  205. package/dist/components/Radio/RadioGroup.cjs.map +1 -0
  206. package/dist/components/Radio/RadioGroup.d.ts +26 -0
  207. package/dist/components/Radio/RadioGroup.js +137 -0
  208. package/dist/components/Radio/RadioGroup.js.map +1 -0
  209. package/dist/components/Radio/index.d.ts +2 -0
  210. package/dist/components/RadioButton/RadioButton.cjs +67 -0
  211. package/dist/components/RadioButton/RadioButton.cjs.map +1 -0
  212. package/dist/components/RadioButton/RadioButton.d.ts +28 -0
  213. package/dist/components/RadioButton/RadioButton.js +65 -0
  214. package/dist/components/RadioButton/RadioButton.js.map +1 -0
  215. package/dist/components/RadioButton/index.d.ts +1 -0
  216. package/dist/components/Select/Select.cjs +3274 -0
  217. package/dist/components/Select/Select.cjs.map +1 -0
  218. package/dist/components/Select/Select.d.ts +71 -0
  219. package/dist/components/Select/Select.js +3250 -0
  220. package/dist/components/Select/Select.js.map +1 -0
  221. package/dist/components/Select/index.d.ts +1 -0
  222. package/dist/components/Select/select.config.d.ts +24 -0
  223. package/dist/components/Switch/Switch.cjs +91 -0
  224. package/dist/components/Switch/Switch.cjs.map +1 -0
  225. package/dist/components/Switch/Switch.d.ts +15 -0
  226. package/dist/components/Switch/Switch.js +69 -0
  227. package/dist/components/Switch/Switch.js.map +1 -0
  228. package/dist/components/Switch/index.d.ts +1 -0
  229. package/dist/components/Table/Table.cjs +4021 -0
  230. package/dist/components/Table/Table.cjs.map +1 -0
  231. package/dist/components/Table/Table.d.ts +117 -0
  232. package/dist/components/Table/Table.js +3996 -0
  233. package/dist/components/Table/Table.js.map +1 -0
  234. package/dist/components/Table/index.d.ts +1 -0
  235. package/dist/components/Tabs/Tabs.cjs +2849 -0
  236. package/dist/components/Tabs/Tabs.cjs.map +1 -0
  237. package/dist/components/Tabs/Tabs.d.ts +24 -0
  238. package/dist/components/Tabs/Tabs.js +2847 -0
  239. package/dist/components/Tabs/Tabs.js.map +1 -0
  240. package/dist/components/Tabs/index.d.ts +2 -0
  241. package/dist/components/Tabs/tabs.config.d.ts +37 -0
  242. package/dist/components/Tag/Tag.cjs +2716 -0
  243. package/dist/components/Tag/Tag.cjs.map +1 -0
  244. package/dist/components/Tag/Tag.d.ts +23 -0
  245. package/dist/components/Tag/Tag.js +2714 -0
  246. package/dist/components/Tag/Tag.js.map +1 -0
  247. package/dist/components/Tag/index.d.ts +2 -0
  248. package/dist/components/Tag/tag.config.d.ts +17 -0
  249. package/dist/components/TextLink/TextLink.cjs +2717 -0
  250. package/dist/components/TextLink/TextLink.cjs.map +1 -0
  251. package/dist/components/TextLink/TextLink.d.ts +27 -0
  252. package/dist/components/TextLink/TextLink.js +2715 -0
  253. package/dist/components/TextLink/TextLink.js.map +1 -0
  254. package/dist/components/TextLink/index.d.ts +1 -0
  255. package/dist/components/Textarea/Textarea.cjs +2999 -0
  256. package/dist/components/Textarea/Textarea.cjs.map +1 -0
  257. package/dist/components/Textarea/Textarea.d.ts +49 -0
  258. package/dist/components/Textarea/Textarea.js +2976 -0
  259. package/dist/components/Textarea/Textarea.js.map +1 -0
  260. package/dist/components/Textarea/index.d.ts +1 -0
  261. package/dist/components/Toast/Toast.cjs +3050 -0
  262. package/dist/components/Toast/Toast.cjs.map +1 -0
  263. package/dist/components/Toast/Toast.d.ts +27 -0
  264. package/dist/components/Toast/Toast.js +3028 -0
  265. package/dist/components/Toast/Toast.js.map +1 -0
  266. package/dist/components/Toast/ToastContainer.cjs +3285 -0
  267. package/dist/components/Toast/ToastContainer.cjs.map +1 -0
  268. package/dist/components/Toast/ToastContainer.d.ts +28 -0
  269. package/dist/components/Toast/ToastContainer.js +3263 -0
  270. package/dist/components/Toast/ToastContainer.js.map +1 -0
  271. package/dist/components/Toast/index.d.ts +2 -0
  272. package/dist/components/Toggle/Toggle.cjs +45 -0
  273. package/dist/components/Toggle/Toggle.cjs.map +1 -0
  274. package/dist/components/Toggle/Toggle.d.ts +18 -0
  275. package/dist/components/Toggle/Toggle.js +43 -0
  276. package/dist/components/Toggle/Toggle.js.map +1 -0
  277. package/dist/components/Toggle/index.d.ts +1 -0
  278. package/dist/components/Tooltip/Tooltip.cjs +2753 -0
  279. package/dist/components/Tooltip/Tooltip.cjs.map +1 -0
  280. package/dist/components/Tooltip/Tooltip.d.ts +44 -0
  281. package/dist/components/Tooltip/Tooltip.js +2730 -0
  282. package/dist/components/Tooltip/Tooltip.js.map +1 -0
  283. package/dist/components/Tooltip/index.d.ts +1 -0
  284. package/dist/index.cjs +8101 -0
  285. package/dist/index.cjs.map +1 -0
  286. package/dist/index.d.ts +44 -0
  287. package/dist/index.js +8019 -0
  288. package/dist/index.js.map +1 -0
  289. package/dist/lib/cn.cjs +13 -0
  290. package/dist/lib/cn.cjs.map +1 -0
  291. package/dist/lib/cn.d.ts +6 -0
  292. package/dist/lib/cn.js +11 -0
  293. package/dist/lib/cn.js.map +1 -0
  294. package/dist/lib/date.cjs +44 -0
  295. package/dist/lib/date.cjs.map +1 -0
  296. package/dist/lib/date.d.ts +15 -0
  297. package/dist/lib/date.js +38 -0
  298. package/dist/lib/date.js.map +1 -0
  299. package/dist/lib/form.cjs +15 -0
  300. package/dist/lib/form.cjs.map +1 -0
  301. package/dist/lib/form.d.ts +4 -0
  302. package/dist/lib/form.js +13 -0
  303. package/dist/lib/form.js.map +1 -0
  304. package/dist/lib/sanitize-inline-html.cjs +66 -0
  305. package/dist/lib/sanitize-inline-html.cjs.map +1 -0
  306. package/dist/lib/sanitize-inline-html.d.ts +1 -0
  307. package/dist/lib/sanitize-inline-html.js +64 -0
  308. package/dist/lib/sanitize-inline-html.js.map +1 -0
  309. package/dist/styles.css +3384 -0
  310. package/dist/theme.css +1483 -0
  311. package/package.json +78 -0
@@ -0,0 +1,164 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var react = require('react');
5
+ var client = require('react-dom/client');
6
+ var clsx = require('clsx');
7
+ var tailwindMerge = require('tailwind-merge');
8
+ var jsxRuntime = require('react/jsx-runtime');
9
+
10
+ function cn(...inputs) {
11
+ return tailwindMerge.twMerge(clsx.clsx(inputs));
12
+ }
13
+ var VIEWBOX = 80;
14
+ var RADIUS = 34;
15
+ var STROKE = 12;
16
+ var CIRCUMFERENCE = 2 * Math.PI * RADIUS;
17
+ var COLOR_MAP = {
18
+ primary: { arc: "var(--cmp-spinner-color-arc)", track: "var(--cmp-spinner-color-track)" },
19
+ inverse: { arc: "var(--color-white)", track: "transparent" },
20
+ error: { arc: "var(--color-red-75)", track: "var(--cmp-spinner-color-track)" },
21
+ complete: { arc: "#01BB4B", track: "var(--cmp-spinner-color-track)" }
22
+ };
23
+ var clamp = (v) => Number.isFinite(v) ? Math.max(0, Math.min(100, v)) : 0;
24
+ var CircleProgress = react.forwardRef(
25
+ function CircleProgress2({ value = 0, type = "primary", indeterminate = false, label, className, style }, ref) {
26
+ const v = clamp(value);
27
+ const colors = COLOR_MAP[type];
28
+ const c = VIEWBOX / 2;
29
+ const percentColor = v === 0 ? "var(--sys-color-fg-tertiary, #888888)" : colors.arc;
30
+ const filled = v / 100 * CIRCUMFERENCE;
31
+ return /* @__PURE__ */ jsxRuntime.jsxs(
32
+ "div",
33
+ {
34
+ ref,
35
+ className: cn("inline-flex flex-col items-center gap-[8px]", className),
36
+ style,
37
+ children: [
38
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative h-[80px] w-[80px]", children: [
39
+ /* @__PURE__ */ jsxRuntime.jsxs(
40
+ "svg",
41
+ {
42
+ viewBox: `0 0 ${VIEWBOX} ${VIEWBOX}`,
43
+ xmlns: "http://www.w3.org/2000/svg",
44
+ className: cn(
45
+ "h-[80px] w-[80px]",
46
+ indeterminate && "origin-center animate-circle-spin"
47
+ ),
48
+ children: [
49
+ /* @__PURE__ */ jsxRuntime.jsx(
50
+ "circle",
51
+ {
52
+ cx: c,
53
+ cy: c,
54
+ r: RADIUS,
55
+ fill: "none",
56
+ strokeWidth: STROKE,
57
+ style: { stroke: colors.track }
58
+ }
59
+ ),
60
+ /* @__PURE__ */ jsxRuntime.jsx(
61
+ "circle",
62
+ {
63
+ cx: c,
64
+ cy: c,
65
+ r: RADIUS,
66
+ fill: "none",
67
+ strokeWidth: STROKE,
68
+ strokeLinecap: "round",
69
+ className: cn(
70
+ "origin-center",
71
+ indeterminate ? "animate-circle-arc" : "-rotate-90 transition-[stroke-dasharray] duration-[400ms] ease-linear"
72
+ ),
73
+ style: {
74
+ stroke: colors.arc,
75
+ ...indeterminate ? {} : { strokeDasharray: `${filled} ${CIRCUMFERENCE}`, strokeDashoffset: 0 }
76
+ }
77
+ }
78
+ )
79
+ ]
80
+ }
81
+ ),
82
+ !indeterminate && /* @__PURE__ */ jsxRuntime.jsxs(
83
+ "span",
84
+ {
85
+ className: "absolute inset-0 flex items-center justify-center text-[16px] font-bold leading-[26px]",
86
+ style: { color: percentColor },
87
+ children: [
88
+ Math.round(v),
89
+ "%"
90
+ ]
91
+ }
92
+ )
93
+ ] }),
94
+ label && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-center text-[12px] font-normal leading-[20px] text-[color:var(--cmp-progress-color-label)]", children: label })
95
+ ]
96
+ }
97
+ );
98
+ }
99
+ );
100
+ var LoadingContainer = react.forwardRef(
101
+ function LoadingContainer2({ open = false, message, zIndex = 999, className, style }, ref) {
102
+ return /* @__PURE__ */ jsxRuntime.jsxs(
103
+ "div",
104
+ {
105
+ ref,
106
+ "aria-hidden": !open,
107
+ className: cn(
108
+ "fixed inset-0 flex items-center justify-center transition-opacity duration-200",
109
+ open ? "pointer-events-auto visible opacity-100" : "pointer-events-none invisible opacity-0",
110
+ className
111
+ ),
112
+ style: { zIndex, ...style },
113
+ children: [
114
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-black/40" }),
115
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex flex-col items-center gap-[16px]", children: [
116
+ /* @__PURE__ */ jsxRuntime.jsx(CircleProgress, { indeterminate: true, type: "inverse" }),
117
+ message && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "m-0 max-w-[400px] break-keep text-center text-[14px] font-medium leading-[22px] text-[color:var(--color-white)]", children: message })
118
+ ] })
119
+ ]
120
+ }
121
+ );
122
+ }
123
+ );
124
+ var state = { open: false, message: void 0 };
125
+ var listeners = /* @__PURE__ */ new Set();
126
+ var emit = () => listeners.forEach((l) => l());
127
+ var setState = (patch) => {
128
+ state = { ...state, ...patch };
129
+ emit();
130
+ };
131
+ var subscribe = (cb) => {
132
+ listeners.add(cb);
133
+ return () => listeners.delete(cb);
134
+ };
135
+ var getSnapshot = () => state;
136
+ function LoadingViewport() {
137
+ const s = react.useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
138
+ return /* @__PURE__ */ jsxRuntime.jsx(LoadingContainer, { open: s.open, message: s.message });
139
+ }
140
+ var mounted = false;
141
+ function ensureMounted() {
142
+ if (mounted || typeof document === "undefined") return;
143
+ mounted = true;
144
+ const host = document.createElement("div");
145
+ host.setAttribute("data-sd-loading-root", "");
146
+ document.body.appendChild(host);
147
+ client.createRoot(host).render(/* @__PURE__ */ jsxRuntime.jsx(LoadingViewport, {}));
148
+ }
149
+ var loading = {
150
+ /** 로딩 오버레이 표시 (메시지 갱신도 동일 호출) */
151
+ show(options = {}) {
152
+ ensureMounted();
153
+ setState({ open: true, message: options.message });
154
+ },
155
+ /** 로딩 오버레이 숨김 */
156
+ hide() {
157
+ setState({ open: false });
158
+ }
159
+ };
160
+
161
+ exports.LoadingViewport = LoadingViewport;
162
+ exports.loading = loading;
163
+ //# sourceMappingURL=loading.cjs.map
164
+ //# sourceMappingURL=loading.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/cn.ts","../../../src/components/CircleProgress/CircleProgress.tsx","../../../src/components/LoadingContainer/LoadingContainer.tsx","../../../src/components/LoadingContainer/loading.tsx"],"names":["twMerge","clsx","forwardRef","CircleProgress","jsxs","jsx","LoadingContainer","useSyncExternalStore","createRoot"],"mappings":"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","file":"loading.cjs","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * className 병합 유틸.\n * clsx로 조건부 클래스를 합치고, tailwind-merge로 Tailwind 클래스 충돌을 해소한다.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","import { forwardRef, type CSSProperties } from 'react';\nimport { cn } from '../../lib/cn';\n\nexport type CircleProgressType = 'primary' | 'inverse' | 'error' | 'complete';\n\nconst VIEWBOX = 80;\nconst RADIUS = 34;\nconst STROKE = 12;\nconst CIRCUMFERENCE = 2 * Math.PI * RADIUS;\n\nconst COLOR_MAP: Record<CircleProgressType, { arc: string; track: string }> = {\n primary: { arc: 'var(--cmp-spinner-color-arc)', track: 'var(--cmp-spinner-color-track)' },\n inverse: { arc: 'var(--color-white)', track: 'transparent' },\n error: { arc: 'var(--color-red-75)', track: 'var(--cmp-spinner-color-track)' },\n complete: { arc: '#01BB4B', track: 'var(--cmp-spinner-color-track)' },\n};\n\nexport interface CircleProgressProps {\n /** 진행률 (0–100) */\n value?: number;\n /** 색상 테마 */\n type?: CircleProgressType;\n /** 불확정(스피너) 모드 — value 무시 */\n indeterminate?: boolean;\n /** 하단 레이블 */\n label?: string;\n className?: string;\n style?: CSSProperties;\n}\n\nconst clamp = (v: number) => (Number.isFinite(v) ? Math.max(0, Math.min(100, v)) : 0);\n\n/** CircleProgress — sd-circle-progress 포팅. determinate=진행률 arc, indeterminate=스피너. */\nexport const CircleProgress = forwardRef<HTMLDivElement, CircleProgressProps>(\n function CircleProgress(\n { value = 0, type = 'primary', indeterminate = false, label, className, style },\n ref,\n ) {\n const v = clamp(value);\n const colors = COLOR_MAP[type];\n const c = VIEWBOX / 2;\n const percentColor = v === 0 ? 'var(--sys-color-fg-tertiary, #888888)' : colors.arc;\n const filled = (v / 100) * CIRCUMFERENCE;\n\n return (\n <div\n ref={ref}\n className={cn('inline-flex flex-col items-center gap-[8px]', className)}\n style={style}\n >\n <div className=\"relative h-[80px] w-[80px]\">\n <svg\n viewBox={`0 0 ${VIEWBOX} ${VIEWBOX}`}\n xmlns=\"http://www.w3.org/2000/svg\"\n className={cn(\n 'h-[80px] w-[80px]',\n indeterminate && 'origin-center animate-circle-spin',\n )}\n >\n <circle\n cx={c}\n cy={c}\n r={RADIUS}\n fill=\"none\"\n strokeWidth={STROKE}\n style={{ stroke: colors.track }}\n />\n <circle\n cx={c}\n cy={c}\n r={RADIUS}\n fill=\"none\"\n strokeWidth={STROKE}\n strokeLinecap=\"round\"\n className={cn(\n 'origin-center',\n indeterminate\n ? 'animate-circle-arc'\n : '-rotate-90 transition-[stroke-dasharray] duration-[400ms] ease-linear',\n )}\n style={{\n stroke: colors.arc,\n ...(indeterminate\n ? {}\n : { strokeDasharray: `${filled} ${CIRCUMFERENCE}`, strokeDashoffset: 0 }),\n }}\n />\n </svg>\n {!indeterminate && (\n <span\n className=\"absolute inset-0 flex items-center justify-center text-[16px] font-bold leading-[26px]\"\n style={{ color: percentColor }}\n >\n {Math.round(v)}%\n </span>\n )}\n </div>\n {label && (\n <span className=\"text-center text-[12px] font-normal leading-[20px] text-[color:var(--cmp-progress-color-label)]\">\n {label}\n </span>\n )}\n </div>\n );\n },\n);\n","import { forwardRef, type CSSProperties } from 'react';\nimport { cn } from '../../lib/cn';\nimport { CircleProgress } from '../CircleProgress';\n\nexport interface LoadingContainerProps {\n /** 오버레이 표시 여부 (Stencil의 show()/hide() 명령형 API → 제어 prop으로 대체) */\n open?: boolean;\n /** 스피너 하단 메시지 */\n message?: string;\n /** z-index (기본 999) */\n zIndex?: number;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * LoadingContainer — sd-loading-container 포팅.\n * 전체 화면 딤 오버레이 + inverse 스피너. React에서는 `open` 제어 prop 사용.\n */\nexport const LoadingContainer = forwardRef<HTMLDivElement, LoadingContainerProps>(\n function LoadingContainer({ open = false, message, zIndex = 999, className, style }, ref) {\n return (\n <div\n ref={ref}\n aria-hidden={!open}\n className={cn(\n 'fixed inset-0 flex items-center justify-center transition-opacity duration-200',\n open\n ? 'pointer-events-auto visible opacity-100'\n : 'pointer-events-none invisible opacity-0',\n className,\n )}\n style={{ zIndex, ...style }}\n >\n <div className=\"absolute inset-0 bg-black/40\" />\n <div className=\"relative flex flex-col items-center gap-[16px]\">\n <CircleProgress indeterminate type=\"inverse\" />\n {message && (\n <p className=\"m-0 max-w-[400px] break-keep text-center text-[14px] font-medium leading-[22px] text-[color:var(--color-white)]\">\n {message}\n </p>\n )}\n </div>\n </div>\n );\n },\n);\n","'use client';\n\nimport { useSyncExternalStore } from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { LoadingContainer } from './LoadingContainer';\n\n/**\n * 전역 로딩 오버레이 싱글톤 — sd-loading-container 의 `sdLoading.show()/hide()` 포팅.\n * 앱 어디서든 `loading.show({ message })` / `loading.hide()` 로 호출한다.\n * 최초 show 시 document.body 에 오버레이 루트를 자동 마운트한다.\n */\ninterface LoadingState {\n open: boolean;\n message?: string;\n}\n\nlet state: LoadingState = { open: false, message: undefined };\nconst listeners = new Set<() => void>();\n\nconst emit = () => listeners.forEach(l => l());\nconst setState = (patch: Partial<LoadingState>) => {\n state = { ...state, ...patch };\n emit();\n};\nconst subscribe = (cb: () => void) => {\n listeners.add(cb);\n return () => listeners.delete(cb);\n};\nconst getSnapshot = () => state;\n\n/** 오버레이 뷰포트 — 스토어를 구독해 LoadingContainer 를 렌더한다. 직접 배치도 가능. */\nexport function LoadingViewport() {\n const s = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n return <LoadingContainer open={s.open} message={s.message} />;\n}\n\nlet mounted = false;\nfunction ensureMounted() {\n if (mounted || typeof document === 'undefined') return;\n mounted = true;\n const host = document.createElement('div');\n host.setAttribute('data-sd-loading-root', '');\n document.body.appendChild(host);\n createRoot(host).render(<LoadingViewport />);\n}\n\nexport const loading = {\n /** 로딩 오버레이 표시 (메시지 갱신도 동일 호출) */\n show(options: { message?: string } = {}) {\n ensureMounted();\n setState({ open: true, message: options.message });\n },\n /** 로딩 오버레이 숨김 */\n hide() {\n setState({ open: false });\n },\n};\n"]}
@@ -0,0 +1,10 @@
1
+ /** 오버레이 뷰포트 — 스토어를 구독해 LoadingContainer 를 렌더한다. 직접 배치도 가능. */
2
+ export declare function LoadingViewport(): import("react").JSX.Element;
3
+ export declare const loading: {
4
+ /** 로딩 오버레이 표시 (메시지 갱신도 동일 호출) */
5
+ show(options?: {
6
+ message?: string;
7
+ }): void;
8
+ /** 로딩 오버레이 숨김 */
9
+ hide(): void;
10
+ };
@@ -0,0 +1,161 @@
1
+ "use client";
2
+ import { forwardRef, useSyncExternalStore } from 'react';
3
+ import { createRoot } from 'react-dom/client';
4
+ import { clsx } from 'clsx';
5
+ import { twMerge } from 'tailwind-merge';
6
+ import { jsxs, jsx } from 'react/jsx-runtime';
7
+
8
+ function cn(...inputs) {
9
+ return twMerge(clsx(inputs));
10
+ }
11
+ var VIEWBOX = 80;
12
+ var RADIUS = 34;
13
+ var STROKE = 12;
14
+ var CIRCUMFERENCE = 2 * Math.PI * RADIUS;
15
+ var COLOR_MAP = {
16
+ primary: { arc: "var(--cmp-spinner-color-arc)", track: "var(--cmp-spinner-color-track)" },
17
+ inverse: { arc: "var(--color-white)", track: "transparent" },
18
+ error: { arc: "var(--color-red-75)", track: "var(--cmp-spinner-color-track)" },
19
+ complete: { arc: "#01BB4B", track: "var(--cmp-spinner-color-track)" }
20
+ };
21
+ var clamp = (v) => Number.isFinite(v) ? Math.max(0, Math.min(100, v)) : 0;
22
+ var CircleProgress = forwardRef(
23
+ function CircleProgress2({ value = 0, type = "primary", indeterminate = false, label, className, style }, ref) {
24
+ const v = clamp(value);
25
+ const colors = COLOR_MAP[type];
26
+ const c = VIEWBOX / 2;
27
+ const percentColor = v === 0 ? "var(--sys-color-fg-tertiary, #888888)" : colors.arc;
28
+ const filled = v / 100 * CIRCUMFERENCE;
29
+ return /* @__PURE__ */ jsxs(
30
+ "div",
31
+ {
32
+ ref,
33
+ className: cn("inline-flex flex-col items-center gap-[8px]", className),
34
+ style,
35
+ children: [
36
+ /* @__PURE__ */ jsxs("div", { className: "relative h-[80px] w-[80px]", children: [
37
+ /* @__PURE__ */ jsxs(
38
+ "svg",
39
+ {
40
+ viewBox: `0 0 ${VIEWBOX} ${VIEWBOX}`,
41
+ xmlns: "http://www.w3.org/2000/svg",
42
+ className: cn(
43
+ "h-[80px] w-[80px]",
44
+ indeterminate && "origin-center animate-circle-spin"
45
+ ),
46
+ children: [
47
+ /* @__PURE__ */ jsx(
48
+ "circle",
49
+ {
50
+ cx: c,
51
+ cy: c,
52
+ r: RADIUS,
53
+ fill: "none",
54
+ strokeWidth: STROKE,
55
+ style: { stroke: colors.track }
56
+ }
57
+ ),
58
+ /* @__PURE__ */ jsx(
59
+ "circle",
60
+ {
61
+ cx: c,
62
+ cy: c,
63
+ r: RADIUS,
64
+ fill: "none",
65
+ strokeWidth: STROKE,
66
+ strokeLinecap: "round",
67
+ className: cn(
68
+ "origin-center",
69
+ indeterminate ? "animate-circle-arc" : "-rotate-90 transition-[stroke-dasharray] duration-[400ms] ease-linear"
70
+ ),
71
+ style: {
72
+ stroke: colors.arc,
73
+ ...indeterminate ? {} : { strokeDasharray: `${filled} ${CIRCUMFERENCE}`, strokeDashoffset: 0 }
74
+ }
75
+ }
76
+ )
77
+ ]
78
+ }
79
+ ),
80
+ !indeterminate && /* @__PURE__ */ jsxs(
81
+ "span",
82
+ {
83
+ className: "absolute inset-0 flex items-center justify-center text-[16px] font-bold leading-[26px]",
84
+ style: { color: percentColor },
85
+ children: [
86
+ Math.round(v),
87
+ "%"
88
+ ]
89
+ }
90
+ )
91
+ ] }),
92
+ label && /* @__PURE__ */ jsx("span", { className: "text-center text-[12px] font-normal leading-[20px] text-[color:var(--cmp-progress-color-label)]", children: label })
93
+ ]
94
+ }
95
+ );
96
+ }
97
+ );
98
+ var LoadingContainer = forwardRef(
99
+ function LoadingContainer2({ open = false, message, zIndex = 999, className, style }, ref) {
100
+ return /* @__PURE__ */ jsxs(
101
+ "div",
102
+ {
103
+ ref,
104
+ "aria-hidden": !open,
105
+ className: cn(
106
+ "fixed inset-0 flex items-center justify-center transition-opacity duration-200",
107
+ open ? "pointer-events-auto visible opacity-100" : "pointer-events-none invisible opacity-0",
108
+ className
109
+ ),
110
+ style: { zIndex, ...style },
111
+ children: [
112
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-black/40" }),
113
+ /* @__PURE__ */ jsxs("div", { className: "relative flex flex-col items-center gap-[16px]", children: [
114
+ /* @__PURE__ */ jsx(CircleProgress, { indeterminate: true, type: "inverse" }),
115
+ message && /* @__PURE__ */ jsx("p", { className: "m-0 max-w-[400px] break-keep text-center text-[14px] font-medium leading-[22px] text-[color:var(--color-white)]", children: message })
116
+ ] })
117
+ ]
118
+ }
119
+ );
120
+ }
121
+ );
122
+ var state = { open: false, message: void 0 };
123
+ var listeners = /* @__PURE__ */ new Set();
124
+ var emit = () => listeners.forEach((l) => l());
125
+ var setState = (patch) => {
126
+ state = { ...state, ...patch };
127
+ emit();
128
+ };
129
+ var subscribe = (cb) => {
130
+ listeners.add(cb);
131
+ return () => listeners.delete(cb);
132
+ };
133
+ var getSnapshot = () => state;
134
+ function LoadingViewport() {
135
+ const s = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
136
+ return /* @__PURE__ */ jsx(LoadingContainer, { open: s.open, message: s.message });
137
+ }
138
+ var mounted = false;
139
+ function ensureMounted() {
140
+ if (mounted || typeof document === "undefined") return;
141
+ mounted = true;
142
+ const host = document.createElement("div");
143
+ host.setAttribute("data-sd-loading-root", "");
144
+ document.body.appendChild(host);
145
+ createRoot(host).render(/* @__PURE__ */ jsx(LoadingViewport, {}));
146
+ }
147
+ var loading = {
148
+ /** 로딩 오버레이 표시 (메시지 갱신도 동일 호출) */
149
+ show(options = {}) {
150
+ ensureMounted();
151
+ setState({ open: true, message: options.message });
152
+ },
153
+ /** 로딩 오버레이 숨김 */
154
+ hide() {
155
+ setState({ open: false });
156
+ }
157
+ };
158
+
159
+ export { LoadingViewport, loading };
160
+ //# sourceMappingURL=loading.js.map
161
+ //# sourceMappingURL=loading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/cn.ts","../../../src/components/CircleProgress/CircleProgress.tsx","../../../src/components/LoadingContainer/LoadingContainer.tsx","../../../src/components/LoadingContainer/loading.tsx"],"names":["CircleProgress","forwardRef","LoadingContainer","jsxs","jsx"],"mappings":"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","file":"loading.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * className 병합 유틸.\n * clsx로 조건부 클래스를 합치고, tailwind-merge로 Tailwind 클래스 충돌을 해소한다.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","import { forwardRef, type CSSProperties } from 'react';\nimport { cn } from '../../lib/cn';\n\nexport type CircleProgressType = 'primary' | 'inverse' | 'error' | 'complete';\n\nconst VIEWBOX = 80;\nconst RADIUS = 34;\nconst STROKE = 12;\nconst CIRCUMFERENCE = 2 * Math.PI * RADIUS;\n\nconst COLOR_MAP: Record<CircleProgressType, { arc: string; track: string }> = {\n primary: { arc: 'var(--cmp-spinner-color-arc)', track: 'var(--cmp-spinner-color-track)' },\n inverse: { arc: 'var(--color-white)', track: 'transparent' },\n error: { arc: 'var(--color-red-75)', track: 'var(--cmp-spinner-color-track)' },\n complete: { arc: '#01BB4B', track: 'var(--cmp-spinner-color-track)' },\n};\n\nexport interface CircleProgressProps {\n /** 진행률 (0–100) */\n value?: number;\n /** 색상 테마 */\n type?: CircleProgressType;\n /** 불확정(스피너) 모드 — value 무시 */\n indeterminate?: boolean;\n /** 하단 레이블 */\n label?: string;\n className?: string;\n style?: CSSProperties;\n}\n\nconst clamp = (v: number) => (Number.isFinite(v) ? Math.max(0, Math.min(100, v)) : 0);\n\n/** CircleProgress — sd-circle-progress 포팅. determinate=진행률 arc, indeterminate=스피너. */\nexport const CircleProgress = forwardRef<HTMLDivElement, CircleProgressProps>(\n function CircleProgress(\n { value = 0, type = 'primary', indeterminate = false, label, className, style },\n ref,\n ) {\n const v = clamp(value);\n const colors = COLOR_MAP[type];\n const c = VIEWBOX / 2;\n const percentColor = v === 0 ? 'var(--sys-color-fg-tertiary, #888888)' : colors.arc;\n const filled = (v / 100) * CIRCUMFERENCE;\n\n return (\n <div\n ref={ref}\n className={cn('inline-flex flex-col items-center gap-[8px]', className)}\n style={style}\n >\n <div className=\"relative h-[80px] w-[80px]\">\n <svg\n viewBox={`0 0 ${VIEWBOX} ${VIEWBOX}`}\n xmlns=\"http://www.w3.org/2000/svg\"\n className={cn(\n 'h-[80px] w-[80px]',\n indeterminate && 'origin-center animate-circle-spin',\n )}\n >\n <circle\n cx={c}\n cy={c}\n r={RADIUS}\n fill=\"none\"\n strokeWidth={STROKE}\n style={{ stroke: colors.track }}\n />\n <circle\n cx={c}\n cy={c}\n r={RADIUS}\n fill=\"none\"\n strokeWidth={STROKE}\n strokeLinecap=\"round\"\n className={cn(\n 'origin-center',\n indeterminate\n ? 'animate-circle-arc'\n : '-rotate-90 transition-[stroke-dasharray] duration-[400ms] ease-linear',\n )}\n style={{\n stroke: colors.arc,\n ...(indeterminate\n ? {}\n : { strokeDasharray: `${filled} ${CIRCUMFERENCE}`, strokeDashoffset: 0 }),\n }}\n />\n </svg>\n {!indeterminate && (\n <span\n className=\"absolute inset-0 flex items-center justify-center text-[16px] font-bold leading-[26px]\"\n style={{ color: percentColor }}\n >\n {Math.round(v)}%\n </span>\n )}\n </div>\n {label && (\n <span className=\"text-center text-[12px] font-normal leading-[20px] text-[color:var(--cmp-progress-color-label)]\">\n {label}\n </span>\n )}\n </div>\n );\n },\n);\n","import { forwardRef, type CSSProperties } from 'react';\nimport { cn } from '../../lib/cn';\nimport { CircleProgress } from '../CircleProgress';\n\nexport interface LoadingContainerProps {\n /** 오버레이 표시 여부 (Stencil의 show()/hide() 명령형 API → 제어 prop으로 대체) */\n open?: boolean;\n /** 스피너 하단 메시지 */\n message?: string;\n /** z-index (기본 999) */\n zIndex?: number;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * LoadingContainer — sd-loading-container 포팅.\n * 전체 화면 딤 오버레이 + inverse 스피너. React에서는 `open` 제어 prop 사용.\n */\nexport const LoadingContainer = forwardRef<HTMLDivElement, LoadingContainerProps>(\n function LoadingContainer({ open = false, message, zIndex = 999, className, style }, ref) {\n return (\n <div\n ref={ref}\n aria-hidden={!open}\n className={cn(\n 'fixed inset-0 flex items-center justify-center transition-opacity duration-200',\n open\n ? 'pointer-events-auto visible opacity-100'\n : 'pointer-events-none invisible opacity-0',\n className,\n )}\n style={{ zIndex, ...style }}\n >\n <div className=\"absolute inset-0 bg-black/40\" />\n <div className=\"relative flex flex-col items-center gap-[16px]\">\n <CircleProgress indeterminate type=\"inverse\" />\n {message && (\n <p className=\"m-0 max-w-[400px] break-keep text-center text-[14px] font-medium leading-[22px] text-[color:var(--color-white)]\">\n {message}\n </p>\n )}\n </div>\n </div>\n );\n },\n);\n","'use client';\n\nimport { useSyncExternalStore } from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { LoadingContainer } from './LoadingContainer';\n\n/**\n * 전역 로딩 오버레이 싱글톤 — sd-loading-container 의 `sdLoading.show()/hide()` 포팅.\n * 앱 어디서든 `loading.show({ message })` / `loading.hide()` 로 호출한다.\n * 최초 show 시 document.body 에 오버레이 루트를 자동 마운트한다.\n */\ninterface LoadingState {\n open: boolean;\n message?: string;\n}\n\nlet state: LoadingState = { open: false, message: undefined };\nconst listeners = new Set<() => void>();\n\nconst emit = () => listeners.forEach(l => l());\nconst setState = (patch: Partial<LoadingState>) => {\n state = { ...state, ...patch };\n emit();\n};\nconst subscribe = (cb: () => void) => {\n listeners.add(cb);\n return () => listeners.delete(cb);\n};\nconst getSnapshot = () => state;\n\n/** 오버레이 뷰포트 — 스토어를 구독해 LoadingContainer 를 렌더한다. 직접 배치도 가능. */\nexport function LoadingViewport() {\n const s = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n return <LoadingContainer open={s.open} message={s.message} />;\n}\n\nlet mounted = false;\nfunction ensureMounted() {\n if (mounted || typeof document === 'undefined') return;\n mounted = true;\n const host = document.createElement('div');\n host.setAttribute('data-sd-loading-root', '');\n document.body.appendChild(host);\n createRoot(host).render(<LoadingViewport />);\n}\n\nexport const loading = {\n /** 로딩 오버레이 표시 (메시지 갱신도 동일 호출) */\n show(options: { message?: string } = {}) {\n ensureMounted();\n setState({ open: true, message: options.message });\n },\n /** 로딩 오버레이 숨김 */\n hide() {\n setState({ open: false });\n },\n};\n"]}