@hyunsdev/ui 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 (340) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +89 -0
  3. package/SKILL.md +38 -0
  4. package/dist/WindowContext-DybYtZJa.d.ts +50 -0
  5. package/dist/_styles-BbTx89aX.d.ts +3 -0
  6. package/dist/chunk-23KUNTRD.js +49 -0
  7. package/dist/chunk-23KUNTRD.js.map +1 -0
  8. package/dist/chunk-3RTSANKB.js +51 -0
  9. package/dist/chunk-3RTSANKB.js.map +1 -0
  10. package/dist/chunk-4QIWBOF4.js +129 -0
  11. package/dist/chunk-4QIWBOF4.js.map +1 -0
  12. package/dist/chunk-5JCWC7IU.js +293 -0
  13. package/dist/chunk-5JCWC7IU.js.map +1 -0
  14. package/dist/chunk-6ANDNGHD.js +33 -0
  15. package/dist/chunk-6ANDNGHD.js.map +1 -0
  16. package/dist/chunk-7W7QZHEZ.js +42 -0
  17. package/dist/chunk-7W7QZHEZ.js.map +1 -0
  18. package/dist/chunk-BHO4WT2N.js +51 -0
  19. package/dist/chunk-BHO4WT2N.js.map +1 -0
  20. package/dist/chunk-BI3KKBIC.js +11 -0
  21. package/dist/chunk-BI3KKBIC.js.map +1 -0
  22. package/dist/chunk-D3SP7GL3.js +55 -0
  23. package/dist/chunk-D3SP7GL3.js.map +1 -0
  24. package/dist/chunk-D7W4RSQX.js +115 -0
  25. package/dist/chunk-D7W4RSQX.js.map +1 -0
  26. package/dist/chunk-DN2AEEA2.js +11 -0
  27. package/dist/chunk-DN2AEEA2.js.map +1 -0
  28. package/dist/chunk-ETTKFCO6.js +84 -0
  29. package/dist/chunk-ETTKFCO6.js.map +1 -0
  30. package/dist/chunk-GJT7TDBS.js +66 -0
  31. package/dist/chunk-GJT7TDBS.js.map +1 -0
  32. package/dist/chunk-HZT6RQYZ.js +109 -0
  33. package/dist/chunk-HZT6RQYZ.js.map +1 -0
  34. package/dist/chunk-JB2QZV7K.js +60 -0
  35. package/dist/chunk-JB2QZV7K.js.map +1 -0
  36. package/dist/chunk-KJJB2PVC.js +21 -0
  37. package/dist/chunk-KJJB2PVC.js.map +1 -0
  38. package/dist/chunk-NE3IVPMO.js +31 -0
  39. package/dist/chunk-NE3IVPMO.js.map +1 -0
  40. package/dist/chunk-O2BG2KSY.js +23 -0
  41. package/dist/chunk-O2BG2KSY.js.map +1 -0
  42. package/dist/chunk-OUFGNJ3V.js +1726 -0
  43. package/dist/chunk-OUFGNJ3V.js.map +1 -0
  44. package/dist/chunk-PLZMCJSL.js +351 -0
  45. package/dist/chunk-PLZMCJSL.js.map +1 -0
  46. package/dist/chunk-POG5DZBT.js +104 -0
  47. package/dist/chunk-POG5DZBT.js.map +1 -0
  48. package/dist/chunk-SECZM6JE.js +170 -0
  49. package/dist/chunk-SECZM6JE.js.map +1 -0
  50. package/dist/chunk-T64WPXSC.js +48 -0
  51. package/dist/chunk-T64WPXSC.js.map +1 -0
  52. package/dist/chunk-TU5CYBB4.js +90 -0
  53. package/dist/chunk-TU5CYBB4.js.map +1 -0
  54. package/dist/chunk-UVAI2U6X.js +153 -0
  55. package/dist/chunk-UVAI2U6X.js.map +1 -0
  56. package/dist/chunk-UXCBLYG6.js +142 -0
  57. package/dist/chunk-UXCBLYG6.js.map +1 -0
  58. package/dist/chunk-VUR4MQMH.js +53 -0
  59. package/dist/chunk-VUR4MQMH.js.map +1 -0
  60. package/dist/chunk-WIEKNG4S.js +26 -0
  61. package/dist/chunk-WIEKNG4S.js.map +1 -0
  62. package/dist/chunk-WIZ4OLOB.js +23 -0
  63. package/dist/chunk-WIZ4OLOB.js.map +1 -0
  64. package/dist/chunk-WJRJBMFN.js +21 -0
  65. package/dist/chunk-WJRJBMFN.js.map +1 -0
  66. package/dist/chunk-YUPLJP3F.js +33 -0
  67. package/dist/chunk-YUPLJP3F.js.map +1 -0
  68. package/dist/chunk-Z7ITPSUF.js +184 -0
  69. package/dist/chunk-Z7ITPSUF.js.map +1 -0
  70. package/dist/chunk-ZC76ALSI.js +75 -0
  71. package/dist/chunk-ZC76ALSI.js.map +1 -0
  72. package/dist/code-block-core-xkE94Rk5.d.ts +30 -0
  73. package/dist/components/accordion.d.ts +9 -0
  74. package/dist/components/accordion.js +98 -0
  75. package/dist/components/accordion.js.map +1 -0
  76. package/dist/components/alert-dialog.d.ts +26 -0
  77. package/dist/components/alert-dialog.js +341 -0
  78. package/dist/components/alert-dialog.js.map +1 -0
  79. package/dist/components/alert.d.ts +13 -0
  80. package/dist/components/alert.js +76 -0
  81. package/dist/components/alert.js.map +1 -0
  82. package/dist/components/aspect-ratio.d.ts +6 -0
  83. package/dist/components/aspect-ratio.js +12 -0
  84. package/dist/components/aspect-ratio.js.map +1 -0
  85. package/dist/components/avatar.d.ts +13 -0
  86. package/dist/components/avatar.js +19 -0
  87. package/dist/components/avatar.js.map +1 -0
  88. package/dist/components/badge.d.ts +12 -0
  89. package/dist/components/badge.js +11 -0
  90. package/dist/components/badge.js.map +1 -0
  91. package/dist/components/breadcrumb.d.ts +13 -0
  92. package/dist/components/breadcrumb.js +102 -0
  93. package/dist/components/breadcrumb.js.map +1 -0
  94. package/dist/components/button-group.d.ts +16 -0
  95. package/dist/components/button-group.js +15 -0
  96. package/dist/components/button-group.js.map +1 -0
  97. package/dist/components/button.d.ts +14 -0
  98. package/dist/components/button.js +11 -0
  99. package/dist/components/button.js.map +1 -0
  100. package/dist/components/calendar.d.ts +14 -0
  101. package/dist/components/calendar.js +13 -0
  102. package/dist/components/calendar.js.map +1 -0
  103. package/dist/components/card.d.ts +13 -0
  104. package/dist/components/card.js +21 -0
  105. package/dist/components/card.js.map +1 -0
  106. package/dist/components/carousel.d.ts +32 -0
  107. package/dist/components/carousel.js +196 -0
  108. package/dist/components/carousel.js.map +1 -0
  109. package/dist/components/chart.d.ts +46 -0
  110. package/dist/components/chart.js +254 -0
  111. package/dist/components/chart.js.map +1 -0
  112. package/dist/components/checkbox.d.ts +6 -0
  113. package/dist/components/checkbox.js +41 -0
  114. package/dist/components/checkbox.js.map +1 -0
  115. package/dist/components/code-block-core.d.ts +3 -0
  116. package/dist/components/code-block-core.js +13 -0
  117. package/dist/components/code-block-core.js.map +1 -0
  118. package/dist/components/code-block-custom.d.ts +20 -0
  119. package/dist/components/code-block-custom.js +16 -0
  120. package/dist/components/code-block-custom.js.map +1 -0
  121. package/dist/components/code-block-shiki.d.ts +13 -0
  122. package/dist/components/code-block-shiki.js +15 -0
  123. package/dist/components/code-block-shiki.js.map +1 -0
  124. package/dist/components/code-block.d.ts +5 -0
  125. package/dist/components/code-block.js +14 -0
  126. package/dist/components/code-block.js.map +1 -0
  127. package/dist/components/collapsible.d.ts +8 -0
  128. package/dist/components/collapsible.js +24 -0
  129. package/dist/components/collapsible.js.map +1 -0
  130. package/dist/components/collection.d.ts +63 -0
  131. package/dist/components/collection.js +598 -0
  132. package/dist/components/collection.js.map +1 -0
  133. package/dist/components/color-dot.d.ts +19 -0
  134. package/dist/components/color-dot.js +41 -0
  135. package/dist/components/color-dot.js.map +1 -0
  136. package/dist/components/color-picker.d.ts +12 -0
  137. package/dist/components/color-picker.js +142 -0
  138. package/dist/components/color-picker.js.map +1 -0
  139. package/dist/components/combobox.d.ts +74 -0
  140. package/dist/components/combobox.js +610 -0
  141. package/dist/components/combobox.js.map +1 -0
  142. package/dist/components/command.d.ts +21 -0
  143. package/dist/components/command.js +31 -0
  144. package/dist/components/command.js.map +1 -0
  145. package/dist/components/date-picker.d.ts +43 -0
  146. package/dist/components/date-picker.js +235 -0
  147. package/dist/components/date-picker.js.map +1 -0
  148. package/dist/components/dialog.d.ts +25 -0
  149. package/dist/components/dialog.js +31 -0
  150. package/dist/components/dialog.js.map +1 -0
  151. package/dist/components/drawer.d.ts +15 -0
  152. package/dist/components/drawer.js +124 -0
  153. package/dist/components/drawer.js.map +1 -0
  154. package/dist/components/dropdown-menu.d.ts +34 -0
  155. package/dist/components/dropdown-menu.js +248 -0
  156. package/dist/components/dropdown-menu.js.map +1 -0
  157. package/dist/components/empty.d.ts +15 -0
  158. package/dist/components/empty.js +104 -0
  159. package/dist/components/empty.js.map +1 -0
  160. package/dist/components/field.d.ts +29 -0
  161. package/dist/components/field.js +214 -0
  162. package/dist/components/field.js.map +1 -0
  163. package/dist/components/format-bytes.d.ts +12 -0
  164. package/dist/components/format-bytes.js +30 -0
  165. package/dist/components/format-bytes.js.map +1 -0
  166. package/dist/components/format-number.d.ts +12 -0
  167. package/dist/components/format-number.js +30 -0
  168. package/dist/components/format-number.js.map +1 -0
  169. package/dist/components/gauge.d.ts +11 -0
  170. package/dist/components/gauge.js +82 -0
  171. package/dist/components/gauge.js.map +1 -0
  172. package/dist/components/hover-card.d.ts +8 -0
  173. package/dist/components/hover-card.js +45 -0
  174. package/dist/components/hover-card.js.map +1 -0
  175. package/dist/components/input-group.d.ts +24 -0
  176. package/dist/components/input-group.js +23 -0
  177. package/dist/components/input-group.js.map +1 -0
  178. package/dist/components/input-otp.d.ts +20 -0
  179. package/dist/components/input-otp.js +95 -0
  180. package/dist/components/input-otp.js.map +1 -0
  181. package/dist/components/input.d.ts +9 -0
  182. package/dist/components/input.js +9 -0
  183. package/dist/components/input.js.map +1 -0
  184. package/dist/components/item.d.ts +27 -0
  185. package/dist/components/item.js +182 -0
  186. package/dist/components/item.js.map +1 -0
  187. package/dist/components/kbd.d.ts +6 -0
  188. package/dist/components/kbd.js +34 -0
  189. package/dist/components/kbd.js.map +1 -0
  190. package/dist/components/label.d.ts +6 -0
  191. package/dist/components/label.js +9 -0
  192. package/dist/components/label.js.map +1 -0
  193. package/dist/components/loading-bar.d.ts +8 -0
  194. package/dist/components/loading-bar.js +127 -0
  195. package/dist/components/loading-bar.js.map +1 -0
  196. package/dist/components/loading-dots.d.ts +5 -0
  197. package/dist/components/loading-dots.js +45 -0
  198. package/dist/components/loading-dots.js.map +1 -0
  199. package/dist/components/main-provider.d.ts +7 -0
  200. package/dist/components/main-provider.js +12 -0
  201. package/dist/components/main-provider.js.map +1 -0
  202. package/dist/components/mark.d.ts +11 -0
  203. package/dist/components/mark.js +44 -0
  204. package/dist/components/mark.js.map +1 -0
  205. package/dist/components/pagination.d.ts +21 -0
  206. package/dist/components/pagination.js +114 -0
  207. package/dist/components/pagination.js.map +1 -0
  208. package/dist/components/popover.d.ts +12 -0
  209. package/dist/components/popover.js +22 -0
  210. package/dist/components/popover.js.map +1 -0
  211. package/dist/components/prev-next-navigation.d.ts +15 -0
  212. package/dist/components/prev-next-navigation.js +85 -0
  213. package/dist/components/prev-next-navigation.js.map +1 -0
  214. package/dist/components/progress.d.ts +6 -0
  215. package/dist/components/progress.js +38 -0
  216. package/dist/components/progress.js.map +1 -0
  217. package/dist/components/radio-group.d.ts +7 -0
  218. package/dist/components/radio-group.js +57 -0
  219. package/dist/components/radio-group.js.map +1 -0
  220. package/dist/components/relative-time.d.ts +16 -0
  221. package/dist/components/relative-time.js +75 -0
  222. package/dist/components/relative-time.js.map +1 -0
  223. package/dist/components/resizable.d.ts +10 -0
  224. package/dist/components/resizable.js +45 -0
  225. package/dist/components/resizable.js.map +1 -0
  226. package/dist/components/scroll-area.d.ts +7 -0
  227. package/dist/components/scroll-area.js +11 -0
  228. package/dist/components/scroll-area.js.map +1 -0
  229. package/dist/components/select.d.ts +20 -0
  230. package/dist/components/select.js +189 -0
  231. package/dist/components/select.js.map +1 -0
  232. package/dist/components/separator.d.ts +6 -0
  233. package/dist/components/separator.js +9 -0
  234. package/dist/components/separator.js.map +1 -0
  235. package/dist/components/sheet.d.ts +16 -0
  236. package/dist/components/sheet.js +25 -0
  237. package/dist/components/sheet.js.map +1 -0
  238. package/dist/components/show-more.d.ts +15 -0
  239. package/dist/components/show-more.js +79 -0
  240. package/dist/components/show-more.js.map +1 -0
  241. package/dist/components/skeleton.d.ts +5 -0
  242. package/dist/components/skeleton.js +8 -0
  243. package/dist/components/skeleton.js.map +1 -0
  244. package/dist/components/slider.d.ts +6 -0
  245. package/dist/components/slider.js +65 -0
  246. package/dist/components/slider.js.map +1 -0
  247. package/dist/components/snippet.d.ts +13 -0
  248. package/dist/components/snippet.js +135 -0
  249. package/dist/components/snippet.js.map +1 -0
  250. package/dist/components/sonner.d.ts +6 -0
  251. package/dist/components/sonner.js +10 -0
  252. package/dist/components/sonner.js.map +1 -0
  253. package/dist/components/spinner.d.ts +5 -0
  254. package/dist/components/spinner.js +8 -0
  255. package/dist/components/spinner.js.map +1 -0
  256. package/dist/components/stat.d.ts +17 -0
  257. package/dist/components/stat.js +71 -0
  258. package/dist/components/stat.js.map +1 -0
  259. package/dist/components/steps.d.ts +17 -0
  260. package/dist/components/steps.js +133 -0
  261. package/dist/components/steps.js.map +1 -0
  262. package/dist/components/switch.d.ts +8 -0
  263. package/dist/components/switch.js +44 -0
  264. package/dist/components/switch.js.map +1 -0
  265. package/dist/components/table.d.ts +12 -0
  266. package/dist/components/table.js +101 -0
  267. package/dist/components/table.js.map +1 -0
  268. package/dist/components/tabs.d.ts +14 -0
  269. package/dist/components/tabs.js +88 -0
  270. package/dist/components/tabs.js.map +1 -0
  271. package/dist/components/textarea.d.ts +5 -0
  272. package/dist/components/textarea.js +9 -0
  273. package/dist/components/textarea.js.map +1 -0
  274. package/dist/components/theme-provider.d.ts +10 -0
  275. package/dist/components/theme-provider.js +14 -0
  276. package/dist/components/theme-provider.js.map +1 -0
  277. package/dist/components/time-picker.d.ts +17 -0
  278. package/dist/components/time-picker.js +219 -0
  279. package/dist/components/time-picker.js.map +1 -0
  280. package/dist/components/timeline.d.ts +17 -0
  281. package/dist/components/timeline.js +138 -0
  282. package/dist/components/timeline.js.map +1 -0
  283. package/dist/components/toggle-group.d.ts +14 -0
  284. package/dist/components/toggle-group.js +82 -0
  285. package/dist/components/toggle-group.js.map +1 -0
  286. package/dist/components/toggle.d.ts +12 -0
  287. package/dist/components/toggle.js +11 -0
  288. package/dist/components/toggle.js.map +1 -0
  289. package/dist/components/tooltip.d.ts +9 -0
  290. package/dist/components/tooltip.js +15 -0
  291. package/dist/components/tooltip.js.map +1 -0
  292. package/dist/components/typography.d.ts +17 -0
  293. package/dist/components/typography.js +91 -0
  294. package/dist/components/typography.js.map +1 -0
  295. package/dist/hooks/use-mobile.d.ts +3 -0
  296. package/dist/hooks/use-mobile.js +7 -0
  297. package/dist/hooks/use-mobile.js.map +1 -0
  298. package/dist/hooks/use-theme.d.ts +3 -0
  299. package/dist/hooks/use-theme.js +8 -0
  300. package/dist/hooks/use-theme.js.map +1 -0
  301. package/dist/index.d.ts +7 -0
  302. package/dist/index.js +27 -0
  303. package/dist/index.js.map +1 -0
  304. package/dist/layouts/center/index.d.ts +18 -0
  305. package/dist/layouts/center/index.js +73 -0
  306. package/dist/layouts/center/index.js.map +1 -0
  307. package/dist/layouts/chat/index.d.ts +42 -0
  308. package/dist/layouts/chat/index.js +191 -0
  309. package/dist/layouts/chat/index.js.map +1 -0
  310. package/dist/layouts/command/index.d.ts +2 -0
  311. package/dist/layouts/command/index.js +1 -0
  312. package/dist/layouts/command/index.js.map +1 -0
  313. package/dist/layouts/panel/index.d.ts +55 -0
  314. package/dist/layouts/panel/index.js +513 -0
  315. package/dist/layouts/panel/index.js.map +1 -0
  316. package/dist/layouts/presentation/index.d.ts +14 -0
  317. package/dist/layouts/presentation/index.js +100 -0
  318. package/dist/layouts/presentation/index.js.map +1 -0
  319. package/dist/layouts/site/index.d.ts +17 -0
  320. package/dist/layouts/site/index.js +82 -0
  321. package/dist/layouts/site/index.js.map +1 -0
  322. package/dist/layouts/window/index.d.ts +223 -0
  323. package/dist/layouts/window/index.js +127 -0
  324. package/dist/layouts/window/index.js.map +1 -0
  325. package/dist/layouts/workbench/index.d.ts +281 -0
  326. package/dist/layouts/workbench/index.js +2457 -0
  327. package/dist/layouts/workbench/index.js.map +1 -0
  328. package/dist/lib/format.d.ts +15 -0
  329. package/dist/lib/format.js +9 -0
  330. package/dist/lib/format.js.map +1 -0
  331. package/dist/lib/theme.d.ts +22 -0
  332. package/dist/lib/theme.js +25 -0
  333. package/dist/lib/theme.js.map +1 -0
  334. package/dist/lib/utils.d.ts +5 -0
  335. package/dist/lib/utils.js +7 -0
  336. package/dist/lib/utils.js.map +1 -0
  337. package/dist/styles/fonts.css +1 -0
  338. package/dist/styles/globals.css +717 -0
  339. package/dist/styles/tokens.css +693 -0
  340. package/package.json +137 -0
@@ -0,0 +1,293 @@
1
+ import {
2
+ useTheme
3
+ } from "./chunk-UXCBLYG6.js";
4
+ import {
5
+ Button
6
+ } from "./chunk-TU5CYBB4.js";
7
+ import {
8
+ cn
9
+ } from "./chunk-DN2AEEA2.js";
10
+
11
+ // src/lib/code-block-core.tsx
12
+ import * as React from "react";
13
+ import { CheckIcon, CopyIcon } from "lucide-react";
14
+ import { jsx, jsxs } from "react/jsx-runtime";
15
+ var FALLBACK_LANGUAGE = "text";
16
+ var EMPTY_TRANSFORMERS = [];
17
+ var EMPTY_LINE_NUMBERS = [];
18
+ var CODE_BLOCK_STYLES = `
19
+ [data-slot="code-block"] .shiki,
20
+ [data-slot="code-block"] .shiki span {
21
+ color: var(--shiki-light, currentColor);
22
+ }
23
+
24
+ [data-slot="code-block"][data-theme="dark"] .shiki,
25
+ [data-slot="code-block"][data-theme="dark"] .shiki span {
26
+ color: var(--shiki-dark, var(--shiki-light, currentColor));
27
+ }
28
+
29
+ [data-slot="code-block"] .shiki {
30
+ background-color: transparent !important;
31
+ color: inherit;
32
+ margin: 0;
33
+ min-width: 100%;
34
+ }
35
+
36
+ [data-slot="code-block"] .shiki code {
37
+ display: grid;
38
+ min-width: 100%;
39
+ font-size: 0.8125rem;
40
+ line-height: 1.7;
41
+ }
42
+
43
+ [data-slot="code-block"] .line {
44
+ display: block;
45
+ min-height: 1.7em;
46
+ padding-inline: 1rem;
47
+ }
48
+
49
+ [data-slot="code-block"][data-wrap-lines="true"] .line {
50
+ white-space: pre-wrap;
51
+ overflow-wrap: anywhere;
52
+ }
53
+
54
+ [data-slot="code-block"][data-line-numbers="true"] .shiki code {
55
+ counter-reset: code-block-line;
56
+ }
57
+
58
+ [data-slot="code-block"][data-line-numbers="true"] .line::before {
59
+ counter-increment: code-block-line;
60
+ content: counter(code-block-line);
61
+ color: var(--color-text-muted, rgba(127, 127, 127, 0.9));
62
+ display: inline-block;
63
+ margin-right: 1rem;
64
+ min-width: 2ch;
65
+ text-align: right;
66
+ user-select: none;
67
+ }
68
+
69
+ [data-slot="code-block"] .line.highlighted {
70
+ background: color-mix(in oklab, var(--color-text-accent, #3b82f6) 12%, transparent);
71
+ }
72
+
73
+ [data-slot="code-block"] .line.focused {
74
+ background: color-mix(in oklab, var(--color-text-normal, #111827) 5%, transparent);
75
+ }
76
+
77
+ [data-slot="code-block"] .has-focused .line:not(.focused) {
78
+ opacity: 0.45;
79
+ }
80
+
81
+ [data-slot="code-block"] .line.diff.add {
82
+ background: color-mix(in oklab, #16a34a 15%, transparent);
83
+ }
84
+
85
+ [data-slot="code-block"] .line.diff.remove {
86
+ background: color-mix(in oklab, #dc2626 14%, transparent);
87
+ }
88
+
89
+ [data-slot="code-block"] .highlighted-word {
90
+ border-radius: 0.375rem;
91
+ background: color-mix(in oklab, var(--color-text-accent, #3b82f6) 18%, transparent);
92
+ padding-inline: 0.25rem;
93
+ padding-block: 0.08rem;
94
+ }
95
+ `;
96
+ function escapeHtml(value) {
97
+ return value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
98
+ }
99
+ function normalizeCode(value) {
100
+ return value.replace(/\r\n?/g, "\n");
101
+ }
102
+ function normalizeLineNumbers(lines) {
103
+ if (!lines || lines.length === 0) {
104
+ return EMPTY_LINE_NUMBERS;
105
+ }
106
+ return [...new Set(lines.filter((line) => Number.isInteger(line) && line > 0))].sort(
107
+ (left, right) => left - right
108
+ );
109
+ }
110
+ function createLineNumberSet(lines) {
111
+ return new Set(lines);
112
+ }
113
+ function createCodeBlockLineTransformer(highlightLines, focusLines) {
114
+ if (highlightLines.length === 0 && focusLines.length === 0) {
115
+ return void 0;
116
+ }
117
+ const highlighted = createLineNumberSet(highlightLines);
118
+ const focused = createLineNumberSet(focusLines);
119
+ return {
120
+ name: "@hyunsdev/ui:code-block-lines",
121
+ line(node, line) {
122
+ if (highlighted.has(line)) {
123
+ this.addClassToHast(node, "highlighted");
124
+ }
125
+ if (focused.has(line)) {
126
+ this.addClassToHast(node, "focused");
127
+ this.addClassToHast(this.pre, "has-focused");
128
+ }
129
+ return node;
130
+ }
131
+ };
132
+ }
133
+ function buildPlainCodeHtml(code, highlightLines = EMPTY_LINE_NUMBERS, focusLines = EMPTY_LINE_NUMBERS) {
134
+ const lines = normalizeCode(code).split("\n");
135
+ const highlighted = createLineNumberSet(highlightLines);
136
+ const focused = createLineNumberSet(focusLines);
137
+ const hasFocusedLine = lines.some((_line, index) => focused.has(index + 1));
138
+ const preClassName = hasFocusedLine ? ' class="shiki has-focused"' : ' class="shiki"';
139
+ return `<pre${preClassName} tabindex="0"><code>${lines.map((line, index) => {
140
+ const lineNumber = index + 1;
141
+ const classes = ["line"];
142
+ if (highlighted.has(lineNumber)) {
143
+ classes.push("highlighted");
144
+ }
145
+ if (focused.has(lineNumber)) {
146
+ classes.push("focused");
147
+ }
148
+ return `<span class="${classes.join(" ")}">${escapeHtml(line)}</span>`;
149
+ }).join("\n")}</code></pre>`;
150
+ }
151
+ async function highlightCode(code, lang, transformers, highlighter, themeNames, fallbackLanguage) {
152
+ const transformerList = [...transformers];
153
+ const options = {
154
+ defaultColor: false,
155
+ themes: themeNames,
156
+ transformers: transformerList
157
+ };
158
+ try {
159
+ const { codeToHtml } = await highlighter();
160
+ try {
161
+ return await codeToHtml(code, {
162
+ ...options,
163
+ lang
164
+ });
165
+ } catch {
166
+ try {
167
+ return await codeToHtml(code, {
168
+ ...options,
169
+ lang: fallbackLanguage
170
+ });
171
+ } catch {
172
+ return buildPlainCodeHtml(code);
173
+ }
174
+ }
175
+ } catch {
176
+ return buildPlainCodeHtml(code);
177
+ }
178
+ }
179
+ function CodeBlockCore({
180
+ className,
181
+ code,
182
+ fallbackLanguage = FALLBACK_LANGUAGE,
183
+ focusLines: focusLinesProp,
184
+ highlightLines: highlightLinesProp,
185
+ highlighter,
186
+ lang,
187
+ themeNames,
188
+ title,
189
+ showCopyButton = false,
190
+ showLineNumbers = false,
191
+ wrapLongLines = false,
192
+ transformers: transformersProp,
193
+ ...props
194
+ }) {
195
+ const { resolvedTheme } = useTheme();
196
+ const normalizedCode = React.useMemo(() => normalizeCode(code), [code]);
197
+ const highlightLines = React.useMemo(
198
+ () => normalizeLineNumbers(highlightLinesProp),
199
+ [highlightLinesProp]
200
+ );
201
+ const focusLines = React.useMemo(() => normalizeLineNumbers(focusLinesProp), [focusLinesProp]);
202
+ const fallbackHtml = React.useMemo(
203
+ () => buildPlainCodeHtml(normalizedCode, highlightLines, focusLines),
204
+ [focusLines, highlightLines, normalizedCode]
205
+ );
206
+ const transformers = React.useMemo(() => {
207
+ const lineTransformer = createCodeBlockLineTransformer(highlightLines, focusLines);
208
+ return lineTransformer ? [...transformersProp ?? EMPTY_TRANSFORMERS, lineTransformer] : transformersProp ?? EMPTY_TRANSFORMERS;
209
+ }, [focusLines, highlightLines, transformersProp]);
210
+ const [html, setHtml] = React.useState(fallbackHtml);
211
+ const [copied, setCopied] = React.useState(false);
212
+ const resetTimerRef = React.useRef(null);
213
+ React.useEffect(() => {
214
+ let isCancelled = false;
215
+ setHtml(fallbackHtml);
216
+ void highlightCode(
217
+ normalizedCode,
218
+ lang,
219
+ transformers,
220
+ highlighter,
221
+ themeNames,
222
+ fallbackLanguage
223
+ ).then((nextHtml) => {
224
+ if (!isCancelled) {
225
+ setHtml(nextHtml);
226
+ }
227
+ });
228
+ return () => {
229
+ isCancelled = true;
230
+ };
231
+ }, [fallbackHtml, fallbackLanguage, highlighter, lang, normalizedCode, themeNames, transformers]);
232
+ React.useEffect(() => {
233
+ return () => {
234
+ if (resetTimerRef.current !== null) {
235
+ window.clearTimeout(resetTimerRef.current);
236
+ }
237
+ };
238
+ }, []);
239
+ const handleCopy = React.useCallback(async () => {
240
+ if (!navigator.clipboard?.writeText) {
241
+ return;
242
+ }
243
+ await navigator.clipboard.writeText(normalizedCode);
244
+ if (resetTimerRef.current !== null) {
245
+ window.clearTimeout(resetTimerRef.current);
246
+ }
247
+ setCopied(true);
248
+ resetTimerRef.current = window.setTimeout(() => {
249
+ setCopied(false);
250
+ resetTimerRef.current = null;
251
+ }, 1500);
252
+ }, [normalizedCode]);
253
+ return /* @__PURE__ */ jsxs(
254
+ "div",
255
+ {
256
+ "data-slot": "code-block",
257
+ "data-line-numbers": showLineNumbers || void 0,
258
+ "data-theme": resolvedTheme,
259
+ "data-wrap-lines": wrapLongLines || void 0,
260
+ className: cn(
261
+ "border-border bg-background-primary text-text-normal overflow-hidden rounded-xl border",
262
+ className
263
+ ),
264
+ ...props,
265
+ children: [
266
+ /* @__PURE__ */ jsx("style", { children: CODE_BLOCK_STYLES }),
267
+ (title || showCopyButton) && /* @__PURE__ */ jsxs("div", { className: "border-border bg-background-secondary/80 flex items-center justify-between gap-3 border-b px-3 py-1", children: [
268
+ /* @__PURE__ */ jsx("div", { className: "text-text-muted min-w-0 truncate text-xs font-medium", children: title }),
269
+ showCopyButton ? /* @__PURE__ */ jsx(
270
+ Button,
271
+ {
272
+ type: "button",
273
+ size: "icon-sm",
274
+ variant: "ghost",
275
+ "aria-label": "Copy code",
276
+ className: "shrink-0",
277
+ onClick: () => {
278
+ void handleCopy();
279
+ },
280
+ children: copied ? /* @__PURE__ */ jsx(CheckIcon, { className: "size-3.5" }) : /* @__PURE__ */ jsx(CopyIcon, { className: "size-3.5" })
281
+ }
282
+ ) : null
283
+ ] }),
284
+ /* @__PURE__ */ jsx("div", { className: "overflow-x-auto py-3 font-mono text-[13px]", children: /* @__PURE__ */ jsx("div", { className: "[&_pre]:outline-none", dangerouslySetInnerHTML: { __html: html } }) })
285
+ ]
286
+ }
287
+ );
288
+ }
289
+
290
+ export {
291
+ CodeBlockCore
292
+ };
293
+ //# sourceMappingURL=chunk-5JCWC7IU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/code-block-core.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\n\nimport { CheckIcon, CopyIcon } from \"lucide-react\"\n\nimport { cn } from \"@hyunsdev/ui/lib/utils\"\n\nimport { Button } from \"../components/button\"\nimport { useTheme } from \"../components/theme-provider\"\n\nimport type { CodeToHastOptions, ShikiTransformer } from \"shiki\"\n\nconst FALLBACK_LANGUAGE = \"text\"\nconst EMPTY_TRANSFORMERS: readonly ShikiTransformer[] = []\nconst EMPTY_LINE_NUMBERS: readonly number[] = []\n\ntype CodeBlockThemeMap<ThemeName extends string = string> = {\n dark: ThemeName\n light: ThemeName\n}\n\ntype CodeBlockHighlighter = {\n codeToHtml: (code: string, options: CodeToHastOptions<string, string>) => Promise<string>\n}\n\ntype CodeBlockLineNumbers = readonly number[]\n\nconst CODE_BLOCK_STYLES = `\n[data-slot=\"code-block\"] .shiki,\n[data-slot=\"code-block\"] .shiki span {\n color: var(--shiki-light, currentColor);\n}\n\n[data-slot=\"code-block\"][data-theme=\"dark\"] .shiki,\n[data-slot=\"code-block\"][data-theme=\"dark\"] .shiki span {\n color: var(--shiki-dark, var(--shiki-light, currentColor));\n}\n\n[data-slot=\"code-block\"] .shiki {\n background-color: transparent !important;\n color: inherit;\n margin: 0;\n min-width: 100%;\n}\n\n[data-slot=\"code-block\"] .shiki code {\n display: grid;\n min-width: 100%;\n font-size: 0.8125rem;\n line-height: 1.7;\n}\n\n[data-slot=\"code-block\"] .line {\n display: block;\n min-height: 1.7em;\n padding-inline: 1rem;\n}\n\n[data-slot=\"code-block\"][data-wrap-lines=\"true\"] .line {\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n\n[data-slot=\"code-block\"][data-line-numbers=\"true\"] .shiki code {\n counter-reset: code-block-line;\n}\n\n[data-slot=\"code-block\"][data-line-numbers=\"true\"] .line::before {\n counter-increment: code-block-line;\n content: counter(code-block-line);\n color: var(--color-text-muted, rgba(127, 127, 127, 0.9));\n display: inline-block;\n margin-right: 1rem;\n min-width: 2ch;\n text-align: right;\n user-select: none;\n}\n\n[data-slot=\"code-block\"] .line.highlighted {\n background: color-mix(in oklab, var(--color-text-accent, #3b82f6) 12%, transparent);\n}\n\n[data-slot=\"code-block\"] .line.focused {\n background: color-mix(in oklab, var(--color-text-normal, #111827) 5%, transparent);\n}\n\n[data-slot=\"code-block\"] .has-focused .line:not(.focused) {\n opacity: 0.45;\n}\n\n[data-slot=\"code-block\"] .line.diff.add {\n background: color-mix(in oklab, #16a34a 15%, transparent);\n}\n\n[data-slot=\"code-block\"] .line.diff.remove {\n background: color-mix(in oklab, #dc2626 14%, transparent);\n}\n\n[data-slot=\"code-block\"] .highlighted-word {\n border-radius: 0.375rem;\n background: color-mix(in oklab, var(--color-text-accent, #3b82f6) 18%, transparent);\n padding-inline: 0.25rem;\n padding-block: 0.08rem;\n}\n`\n\ntype CodeBlockCommonProps = Omit<React.ComponentProps<\"div\">, \"children\"> & {\n code: string\n focusLines?: CodeBlockLineNumbers\n highlightLines?: CodeBlockLineNumbers\n lang: string\n title?: React.ReactNode\n showCopyButton?: boolean\n showLineNumbers?: boolean\n wrapLongLines?: boolean\n transformers?: readonly ShikiTransformer[]\n}\n\ntype CodeBlockCoreProps = CodeBlockCommonProps & {\n fallbackLanguage?: string | undefined\n highlighter: () => Promise<CodeBlockHighlighter>\n themeNames: CodeBlockThemeMap\n}\n\nfunction escapeHtml(value: string) {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#39;\")\n}\n\nfunction normalizeCode(value: string) {\n return value.replace(/\\r\\n?/g, \"\\n\")\n}\n\nfunction normalizeLineNumbers(lines: CodeBlockLineNumbers | undefined) {\n if (!lines || lines.length === 0) {\n return EMPTY_LINE_NUMBERS\n }\n\n return [...new Set(lines.filter((line) => Number.isInteger(line) && line > 0))].sort(\n (left, right) => left - right,\n )\n}\n\nfunction createLineNumberSet(lines: CodeBlockLineNumbers) {\n return new Set(lines)\n}\n\nfunction createCodeBlockLineTransformer(\n highlightLines: CodeBlockLineNumbers,\n focusLines: CodeBlockLineNumbers,\n) {\n if (highlightLines.length === 0 && focusLines.length === 0) {\n return undefined\n }\n\n const highlighted = createLineNumberSet(highlightLines)\n const focused = createLineNumberSet(focusLines)\n\n return {\n name: \"@hyunsdev/ui:code-block-lines\",\n line(node, line) {\n if (highlighted.has(line)) {\n this.addClassToHast(node, \"highlighted\")\n }\n\n if (focused.has(line)) {\n this.addClassToHast(node, \"focused\")\n this.addClassToHast(this.pre, \"has-focused\")\n }\n\n return node\n },\n } satisfies ShikiTransformer\n}\n\nfunction buildPlainCodeHtml(\n code: string,\n highlightLines: CodeBlockLineNumbers = EMPTY_LINE_NUMBERS,\n focusLines: CodeBlockLineNumbers = EMPTY_LINE_NUMBERS,\n) {\n const lines = normalizeCode(code).split(\"\\n\")\n const highlighted = createLineNumberSet(highlightLines)\n const focused = createLineNumberSet(focusLines)\n const hasFocusedLine = lines.some((_line, index) => focused.has(index + 1))\n const preClassName = hasFocusedLine ? ' class=\"shiki has-focused\"' : ' class=\"shiki\"'\n\n return `<pre${preClassName} tabindex=\"0\"><code>${lines\n .map((line, index) => {\n const lineNumber = index + 1\n const classes = [\"line\"]\n\n if (highlighted.has(lineNumber)) {\n classes.push(\"highlighted\")\n }\n\n if (focused.has(lineNumber)) {\n classes.push(\"focused\")\n }\n\n return `<span class=\"${classes.join(\" \")}\">${escapeHtml(line)}</span>`\n })\n .join(\"\\n\")}</code></pre>`\n}\n\nasync function highlightCode(\n code: string,\n lang: string,\n transformers: readonly ShikiTransformer[],\n highlighter: () => Promise<CodeBlockHighlighter>,\n themeNames: CodeBlockThemeMap,\n fallbackLanguage: string,\n) {\n const transformerList = [...transformers]\n const options = {\n defaultColor: false,\n themes: themeNames,\n transformers: transformerList,\n } as const\n\n try {\n const { codeToHtml } = await highlighter()\n\n try {\n return await codeToHtml(code, {\n ...options,\n lang,\n })\n } catch {\n try {\n return await codeToHtml(code, {\n ...options,\n lang: fallbackLanguage,\n })\n } catch {\n return buildPlainCodeHtml(code)\n }\n }\n } catch {\n return buildPlainCodeHtml(code)\n }\n}\n\nfunction CodeBlockCore({\n className,\n code,\n fallbackLanguage = FALLBACK_LANGUAGE,\n focusLines: focusLinesProp,\n highlightLines: highlightLinesProp,\n highlighter,\n lang,\n themeNames,\n title,\n showCopyButton = false,\n showLineNumbers = false,\n wrapLongLines = false,\n transformers: transformersProp,\n ...props\n}: CodeBlockCoreProps) {\n const { resolvedTheme } = useTheme()\n const normalizedCode = React.useMemo(() => normalizeCode(code), [code])\n const highlightLines = React.useMemo(\n () => normalizeLineNumbers(highlightLinesProp),\n [highlightLinesProp],\n )\n const focusLines = React.useMemo(() => normalizeLineNumbers(focusLinesProp), [focusLinesProp])\n const fallbackHtml = React.useMemo(\n () => buildPlainCodeHtml(normalizedCode, highlightLines, focusLines),\n [focusLines, highlightLines, normalizedCode],\n )\n const transformers = React.useMemo(() => {\n const lineTransformer = createCodeBlockLineTransformer(highlightLines, focusLines)\n\n return lineTransformer\n ? [...(transformersProp ?? EMPTY_TRANSFORMERS), lineTransformer]\n : (transformersProp ?? EMPTY_TRANSFORMERS)\n }, [focusLines, highlightLines, transformersProp])\n const [html, setHtml] = React.useState(fallbackHtml)\n const [copied, setCopied] = React.useState(false)\n const resetTimerRef = React.useRef<number | null>(null)\n\n React.useEffect(() => {\n let isCancelled = false\n\n setHtml(fallbackHtml)\n\n void highlightCode(\n normalizedCode,\n lang,\n transformers,\n highlighter,\n themeNames,\n fallbackLanguage,\n ).then((nextHtml) => {\n if (!isCancelled) {\n setHtml(nextHtml)\n }\n })\n\n return () => {\n isCancelled = true\n }\n }, [fallbackHtml, fallbackLanguage, highlighter, lang, normalizedCode, themeNames, transformers])\n\n React.useEffect(() => {\n return () => {\n if (resetTimerRef.current !== null) {\n window.clearTimeout(resetTimerRef.current)\n }\n }\n }, [])\n\n const handleCopy = React.useCallback(async () => {\n if (!navigator.clipboard?.writeText) {\n return\n }\n\n await navigator.clipboard.writeText(normalizedCode)\n\n if (resetTimerRef.current !== null) {\n window.clearTimeout(resetTimerRef.current)\n }\n\n setCopied(true)\n\n resetTimerRef.current = window.setTimeout(() => {\n setCopied(false)\n resetTimerRef.current = null\n }, 1500)\n }, [normalizedCode])\n\n return (\n <div\n data-slot=\"code-block\"\n data-line-numbers={showLineNumbers || undefined}\n data-theme={resolvedTheme}\n data-wrap-lines={wrapLongLines || undefined}\n className={cn(\n \"border-border bg-background-primary text-text-normal overflow-hidden rounded-xl border\",\n className,\n )}\n {...props}\n >\n <style>{CODE_BLOCK_STYLES}</style>\n\n {(title || showCopyButton) && (\n <div className=\"border-border bg-background-secondary/80 flex items-center justify-between gap-3 border-b px-3 py-1\">\n <div className=\"text-text-muted min-w-0 truncate text-xs font-medium\">{title}</div>\n\n {showCopyButton ? (\n <Button\n type=\"button\"\n size=\"icon-sm\"\n variant=\"ghost\"\n aria-label=\"Copy code\"\n className=\"shrink-0\"\n onClick={() => {\n void handleCopy()\n }}\n >\n {copied ? <CheckIcon className=\"size-3.5\" /> : <CopyIcon className=\"size-3.5\" />}\n </Button>\n ) : null}\n </div>\n )}\n\n <div className=\"overflow-x-auto py-3 font-mono text-[13px]\">\n <div className=\"[&_pre]:outline-none\" dangerouslySetInnerHTML={{ __html: html }} />\n </div>\n </div>\n )\n}\n\nexport { CodeBlockCore }\nexport type {\n CodeBlockCommonProps,\n CodeBlockCoreProps,\n CodeBlockHighlighter,\n CodeBlockLineNumbers,\n CodeBlockThemeMap,\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,33 @@
1
+ import {
2
+ cn
3
+ } from "./chunk-DN2AEEA2.js";
4
+
5
+ // src/components/separator.tsx
6
+ import "react";
7
+ import * as SeparatorPrimitive from "@radix-ui/react-separator";
8
+ import { jsx } from "react/jsx-runtime";
9
+ function Separator({
10
+ className,
11
+ orientation = "horizontal",
12
+ decorative = true,
13
+ ...props
14
+ }) {
15
+ return /* @__PURE__ */ jsx(
16
+ SeparatorPrimitive.Root,
17
+ {
18
+ "data-slot": "separator",
19
+ decorative,
20
+ orientation,
21
+ className: cn(
22
+ "bg-border shrink-0 data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch",
23
+ className
24
+ ),
25
+ ...props
26
+ }
27
+ );
28
+ }
29
+
30
+ export {
31
+ Separator
32
+ };
33
+ //# sourceMappingURL=chunk-6ANDNGHD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/separator.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\n\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\n\nimport { cn } from \"@hyunsdev/ui/lib/utils\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"bg-border shrink-0 data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch\",\n className,\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\n"],"mappings":";;;;;AAEA,OAAuB;AAEvB,YAAY,wBAAwB;AAWhC;AAPJ,SAAS,UAAU;AAAA,EACjB;AAAA,EACA,cAAc;AAAA,EACd,aAAa;AAAA,EACb,GAAG;AACL,GAAyD;AACvD,SACE;AAAA,IAAoB;AAAA,IAAnB;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]}
@@ -0,0 +1,42 @@
1
+ // src/lib/format.ts
2
+ var byteUnits = {
3
+ binary: ["B", "KiB", "MiB", "GiB", "TiB", "PiB"],
4
+ decimal: ["B", "KB", "MB", "GB", "TB", "PB"]
5
+ };
6
+ function isValidNumberValue(value) {
7
+ return typeof value === "bigint" || typeof value === "number" && Number.isFinite(value);
8
+ }
9
+ function formatNumber(value, { locale, ...options } = {}) {
10
+ if (!isValidNumberValue(value)) {
11
+ return null;
12
+ }
13
+ return new Intl.NumberFormat(locale, options).format(value);
14
+ }
15
+ function formatBytes(value, options = {}) {
16
+ if (!isValidNumberValue(value)) {
17
+ return null;
18
+ }
19
+ const {
20
+ locale,
21
+ maximumFractionDigits = 1,
22
+ minimumFractionDigits = 0,
23
+ unitSystem = "binary"
24
+ } = options;
25
+ const base = unitSystem === "binary" ? 1024 : 1e3;
26
+ const units = byteUnits[unitSystem];
27
+ const absoluteValue = Math.abs(value);
28
+ const unitIndex = absoluteValue === 0 ? 0 : Math.min(Math.floor(Math.log(absoluteValue) / Math.log(base)), units.length - 1);
29
+ const scaledValue = value / base ** unitIndex;
30
+ const label = formatNumber(scaledValue, {
31
+ locale,
32
+ maximumFractionDigits,
33
+ minimumFractionDigits
34
+ });
35
+ return label ? `${label} ${units[unitIndex]}` : null;
36
+ }
37
+
38
+ export {
39
+ formatNumber,
40
+ formatBytes
41
+ };
42
+ //# sourceMappingURL=chunk-7W7QZHEZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/format.ts"],"sourcesContent":["type FormatNumberValue = number | bigint\n\ntype FormatNumberOptions = Intl.NumberFormatOptions & {\n locale?: Intl.LocalesArgument\n}\n\ntype FormatBytesUnitSystem = \"binary\" | \"decimal\"\n\ntype FormatBytesOptions = {\n locale?: Intl.LocalesArgument\n unitSystem?: FormatBytesUnitSystem\n minimumFractionDigits?: number\n maximumFractionDigits?: number\n}\n\nconst byteUnits = {\n binary: [\"B\", \"KiB\", \"MiB\", \"GiB\", \"TiB\", \"PiB\"],\n decimal: [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"],\n} as const satisfies Record<FormatBytesUnitSystem, readonly string[]>\n\nfunction isValidNumberValue(\n value: FormatNumberValue | null | undefined,\n): value is FormatNumberValue {\n return typeof value === \"bigint\" || (typeof value === \"number\" && Number.isFinite(value))\n}\n\nfunction formatNumber(\n value: FormatNumberValue | null | undefined,\n { locale, ...options }: FormatNumberOptions = {},\n) {\n if (!isValidNumberValue(value)) {\n return null\n }\n\n return new Intl.NumberFormat(locale, options).format(value)\n}\n\nfunction formatBytes(value: number | null | undefined, options: FormatBytesOptions = {}) {\n if (!isValidNumberValue(value)) {\n return null\n }\n\n const {\n locale,\n maximumFractionDigits = 1,\n minimumFractionDigits = 0,\n unitSystem = \"binary\",\n } = options\n const base = unitSystem === \"binary\" ? 1024 : 1000\n const units = byteUnits[unitSystem]\n const absoluteValue = Math.abs(value)\n const unitIndex =\n absoluteValue === 0\n ? 0\n : Math.min(Math.floor(Math.log(absoluteValue) / Math.log(base)), units.length - 1)\n const scaledValue = value / base ** unitIndex\n const label = formatNumber(scaledValue, {\n locale,\n maximumFractionDigits,\n minimumFractionDigits,\n })\n\n return label ? `${label} ${units[unitIndex]}` : null\n}\n\nexport {\n formatBytes,\n formatNumber,\n type FormatBytesOptions,\n type FormatBytesUnitSystem,\n type FormatNumberOptions,\n type FormatNumberValue,\n}\n"],"mappings":";AAeA,IAAM,YAAY;AAAA,EAChB,QAAQ,CAAC,KAAK,OAAO,OAAO,OAAO,OAAO,KAAK;AAAA,EAC/C,SAAS,CAAC,KAAK,MAAM,MAAM,MAAM,MAAM,IAAI;AAC7C;AAEA,SAAS,mBACP,OAC4B;AAC5B,SAAO,OAAO,UAAU,YAAa,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK;AACzF;AAEA,SAAS,aACP,OACA,EAAE,QAAQ,GAAG,QAAQ,IAAyB,CAAC,GAC/C;AACA,MAAI,CAAC,mBAAmB,KAAK,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO,IAAI,KAAK,aAAa,QAAQ,OAAO,EAAE,OAAO,KAAK;AAC5D;AAEA,SAAS,YAAY,OAAkC,UAA8B,CAAC,GAAG;AACvF,MAAI,CAAC,mBAAmB,KAAK,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM;AAAA,IACJ;AAAA,IACA,wBAAwB;AAAA,IACxB,wBAAwB;AAAA,IACxB,aAAa;AAAA,EACf,IAAI;AACJ,QAAM,OAAO,eAAe,WAAW,OAAO;AAC9C,QAAM,QAAQ,UAAU,UAAU;AAClC,QAAM,gBAAgB,KAAK,IAAI,KAAK;AACpC,QAAM,YACJ,kBAAkB,IACd,IACA,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,aAAa,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,MAAM,SAAS,CAAC;AACrF,QAAM,cAAc,QAAQ,QAAQ;AACpC,QAAM,QAAQ,aAAa,aAAa;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO,QAAQ,GAAG,KAAK,IAAI,MAAM,SAAS,CAAC,KAAK;AAClD;","names":[]}
@@ -0,0 +1,51 @@
1
+ import {
2
+ cn
3
+ } from "./chunk-DN2AEEA2.js";
4
+
5
+ // src/components/toggle.tsx
6
+ import "react";
7
+ import * as TogglePrimitive from "@radix-ui/react-toggle";
8
+ import { cva } from "class-variance-authority";
9
+ import { jsx } from "react/jsx-runtime";
10
+ var toggleVariants = cva(
11
+ "cursor-pointer group/toggle inline-flex items-center justify-center gap-1 rounded-lg text-sm font-medium whitespace-nowrap text-text-normal transition-all outline-none hover:bg-background-modifier-hover hover:text-text-normal focus-visible:border-focus-ring focus-visible:ring-3 focus-visible:ring-focus-ring disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-field-border-error aria-invalid:ring-3 aria-invalid:ring-field-border-error/20 aria-pressed:border-transparent aria-pressed:bg-interactive-accent aria-pressed:text-text-on-accent aria-pressed:hover:bg-interactive-accent-hover aria-pressed:active:bg-interactive-accent-active-hover data-[state=on]:border-transparent data-[state=on]:bg-interactive-accent data-[state=on]:text-text-on-accent data-[state=on]:hover:bg-interactive-accent-hover data-[state=on]:active:bg-interactive-accent-active-hover [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
12
+ {
13
+ variants: {
14
+ variant: {
15
+ ghost: "bg-transparent",
16
+ normal: "border border-field-border bg-interactive-normal hover:bg-interactive-hover",
17
+ outline: "border border-field-border bg-transparent hover:bg-background-modifier-hover"
18
+ },
19
+ size: {
20
+ default: "h-8 min-w-8 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
21
+ sm: "h-7 min-w-7 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
22
+ lg: "h-9 min-w-9 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2"
23
+ }
24
+ },
25
+ defaultVariants: {
26
+ variant: "normal",
27
+ size: "default"
28
+ }
29
+ }
30
+ );
31
+ function Toggle({
32
+ className,
33
+ variant = "normal",
34
+ size = "default",
35
+ ...props
36
+ }) {
37
+ return /* @__PURE__ */ jsx(
38
+ TogglePrimitive.Root,
39
+ {
40
+ "data-slot": "toggle",
41
+ className: cn(toggleVariants({ variant, size, className })),
42
+ ...props
43
+ }
44
+ );
45
+ }
46
+
47
+ export {
48
+ toggleVariants,
49
+ Toggle
50
+ };
51
+ //# sourceMappingURL=chunk-BHO4WT2N.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/toggle.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\n\nimport * as TogglePrimitive from \"@radix-ui/react-toggle\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@hyunsdev/ui/lib/utils\"\n\nconst toggleVariants = cva(\n \"cursor-pointer group/toggle inline-flex items-center justify-center gap-1 rounded-lg text-sm font-medium whitespace-nowrap text-text-normal transition-all outline-none hover:bg-background-modifier-hover hover:text-text-normal focus-visible:border-focus-ring focus-visible:ring-3 focus-visible:ring-focus-ring disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-field-border-error aria-invalid:ring-3 aria-invalid:ring-field-border-error/20 aria-pressed:border-transparent aria-pressed:bg-interactive-accent aria-pressed:text-text-on-accent aria-pressed:hover:bg-interactive-accent-hover aria-pressed:active:bg-interactive-accent-active-hover data-[state=on]:border-transparent data-[state=on]:bg-interactive-accent data-[state=on]:text-text-on-accent data-[state=on]:hover:bg-interactive-accent-hover data-[state=on]:active:bg-interactive-accent-active-hover [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n ghost: \"bg-transparent\",\n normal: \"border border-field-border bg-interactive-normal hover:bg-interactive-hover\",\n outline: \"border border-field-border bg-transparent hover:bg-background-modifier-hover\",\n },\n size: {\n default:\n \"h-8 min-w-8 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n sm: \"h-7 min-w-7 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-9 min-w-9 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n },\n },\n defaultVariants: {\n variant: \"normal\",\n size: \"default\",\n },\n },\n)\n\nfunction Toggle({\n className,\n variant = \"normal\",\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof TogglePrimitive.Root> & VariantProps<typeof toggleVariants>) {\n return (\n <TogglePrimitive.Root\n data-slot=\"toggle\"\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Toggle, toggleVariants }\n"],"mappings":";;;;;AAEA,OAAuB;AAEvB,YAAY,qBAAqB;AACjC,SAAS,WAA8B;AAkCnC;AA9BJ,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,MACA,MAAM;AAAA,QACJ,SACE;AAAA,QACF,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,OAAO;AAAA,EACd;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP,GAAG;AACL,GAA4F;AAC1F,SACE;AAAA,IAAiB;AAAA,IAAhB;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,eAAe,EAAE,SAAS,MAAM,UAAU,CAAC,CAAC;AAAA,MACzD,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]}
@@ -0,0 +1,11 @@
1
+ // src/layouts/_styles.ts
2
+ var sidedockShellClass = "bg-sidedock-background text-sidedock-text";
3
+ var sidedockFocusClass = "focus-visible:ring-2 focus-visible:ring-focus-ring";
4
+ var sidedockOutlineStrokeClass = "shadow-[inset_0_0_0_1px_var(--color-sidedock-border)]";
5
+
6
+ export {
7
+ sidedockShellClass,
8
+ sidedockFocusClass,
9
+ sidedockOutlineStrokeClass
10
+ };
11
+ //# sourceMappingURL=chunk-BI3KKBIC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/layouts/_styles.ts"],"sourcesContent":["export const sidedockShellClass = \"bg-sidedock-background text-sidedock-text\"\n\nexport const sidedockFocusClass = \"focus-visible:ring-2 focus-visible:ring-focus-ring\"\n\nexport const sidedockOutlineStrokeClass = \"shadow-[inset_0_0_0_1px_var(--color-sidedock-border)]\"\n"],"mappings":";AAAO,IAAM,qBAAqB;AAE3B,IAAM,qBAAqB;AAE3B,IAAM,6BAA6B;","names":[]}
@@ -0,0 +1,55 @@
1
+ import {
2
+ cn
3
+ } from "./chunk-DN2AEEA2.js";
4
+
5
+ // src/components/tooltip.tsx
6
+ import "react";
7
+ import * as TooltipPrimitive from "@radix-ui/react-tooltip";
8
+ import { jsx } from "react/jsx-runtime";
9
+ function TooltipProvider({
10
+ delayDuration = 0,
11
+ ...props
12
+ }) {
13
+ return /* @__PURE__ */ jsx(
14
+ TooltipPrimitive.Provider,
15
+ {
16
+ "data-slot": "tooltip-provider",
17
+ delayDuration,
18
+ ...props
19
+ }
20
+ );
21
+ }
22
+ function Tooltip({ ...props }) {
23
+ return /* @__PURE__ */ jsx(TooltipPrimitive.Root, { "data-slot": "tooltip", ...props });
24
+ }
25
+ function TooltipTrigger({ ...props }) {
26
+ return /* @__PURE__ */ jsx(TooltipPrimitive.Trigger, { "data-slot": "tooltip-trigger", ...props });
27
+ }
28
+ function TooltipContent({
29
+ className,
30
+ sideOffset = 0,
31
+ children,
32
+ ...props
33
+ }) {
34
+ return /* @__PURE__ */ jsx(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsx(
35
+ TooltipPrimitive.Content,
36
+ {
37
+ "data-slot": "tooltip-content",
38
+ sideOffset,
39
+ className: cn(
40
+ "bg-tooltip-background text-tooltip-text data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 z-[var(--layer-tooltip)] inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-(--radius-tooltip) px-2.5 py-1 text-[length:var(--text-tooltip)] has-data-[slot=kbd]:pr-1.5 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-[calc(var(--layer-tooltip)+1)] **:data-[slot=kbd]:rounded-sm",
41
+ className
42
+ ),
43
+ ...props,
44
+ children
45
+ }
46
+ ) });
47
+ }
48
+
49
+ export {
50
+ TooltipProvider,
51
+ Tooltip,
52
+ TooltipTrigger,
53
+ TooltipContent
54
+ };
55
+ //# sourceMappingURL=chunk-D3SP7GL3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/tooltip.tsx"],"sourcesContent":["\"use client\"\n\nimport * as React from \"react\"\n\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\n\nimport { cn } from \"@hyunsdev/ui/lib/utils\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"bg-tooltip-background text-tooltip-text data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 z-[var(--layer-tooltip)] inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-(--radius-tooltip) px-2.5 py-1 text-[length:var(--text-tooltip)] has-data-[slot=kbd]:pr-1.5 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-[calc(var(--layer-tooltip)+1)] **:data-[slot=kbd]:rounded-sm\",\n className,\n )}\n {...props}\n >\n {children}\n {/* <TooltipPrimitive.Arrow className=\"bg-tooltip-background fill-tooltip-background z-[var(--layer-tooltip)] size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" /> */}\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger }\n"],"mappings":";;;;;AAEA,OAAuB;AAEvB,YAAY,sBAAsB;AAS9B;AALJ,SAAS,gBAAgB;AAAA,EACvB,gBAAgB;AAAA,EAChB,GAAG;AACL,GAA2D;AACzD,SACE;AAAA,IAAkB;AAAA,IAAjB;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,SAAS,QAAQ,EAAE,GAAG,MAAM,GAAuD;AACjF,SAAO,oBAAkB,uBAAjB,EAAsB,aAAU,WAAW,GAAG,OAAO;AAC/D;AAEA,SAAS,eAAe,EAAE,GAAG,MAAM,GAA0D;AAC3F,SAAO,oBAAkB,0BAAjB,EAAyB,aAAU,mBAAmB,GAAG,OAAO;AAC1E;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,GAAG;AACL,GAA0D;AACxD,SACE,oBAAkB,yBAAjB,EACC;AAAA,IAAkB;AAAA,IAAjB;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EAEH,GACF;AAEJ;","names":[]}