@badnpm/ui 0.0.0-stage → 0.0.1

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 (310) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +193 -2
  3. package/dist/cjs/components/accordion.cjs +24 -0
  4. package/dist/cjs/components/alert-dialog.cjs +56 -0
  5. package/dist/cjs/components/alert.cjs +34 -0
  6. package/dist/cjs/components/aspect-ratio.cjs +12 -0
  7. package/dist/cjs/components/attachment.cjs +80 -0
  8. package/dist/cjs/components/avatar.cjs +31 -0
  9. package/dist/cjs/components/badge.cjs +38 -0
  10. package/dist/cjs/components/breadcrumb.cjs +46 -0
  11. package/dist/cjs/components/bubble.cjs +66 -0
  12. package/dist/cjs/components/button-group.cjs +43 -0
  13. package/dist/cjs/components/button.cjs +41 -0
  14. package/dist/cjs/components/calendar.cjs +100 -0
  15. package/dist/cjs/components/card.cjs +34 -0
  16. package/dist/cjs/components/carousel.cjs +113 -0
  17. package/dist/cjs/components/chart.cjs +160 -0
  18. package/dist/cjs/components/checkbox.cjs +13 -0
  19. package/dist/cjs/components/code-block.cjs +110 -0
  20. package/dist/cjs/components/collapsible.cjs +18 -0
  21. package/dist/cjs/components/combobox.cjs +96 -0
  22. package/dist/cjs/components/command.cjs +46 -0
  23. package/dist/cjs/components/context-menu.cjs +69 -0
  24. package/dist/cjs/components/dialog.cjs +50 -0
  25. package/dist/cjs/components/drawer.cjs +108 -0
  26. package/dist/cjs/components/dropdown-menu.cjs +68 -0
  27. package/dist/cjs/components/empty.cjs +42 -0
  28. package/dist/cjs/components/field.cjs +80 -0
  29. package/dist/cjs/components/hover-card.cjs +20 -0
  30. package/dist/cjs/components/input-group.cjs +66 -0
  31. package/dist/cjs/components/input-otp.cjs +46 -0
  32. package/dist/cjs/components/input.cjs +11 -0
  33. package/dist/cjs/components/item.cjs +91 -0
  34. package/dist/cjs/components/kbd.cjs +14 -0
  35. package/dist/cjs/components/label.cjs +11 -0
  36. package/dist/cjs/components/marker.cjs +41 -0
  37. package/dist/cjs/components/menubar.cjs +75 -0
  38. package/dist/cjs/components/message-scroller.cjs +45 -0
  39. package/dist/cjs/components/message.cjs +30 -0
  40. package/dist/cjs/components/native-select.cjs +19 -0
  41. package/dist/cjs/components/navigation-menu.cjs +43 -0
  42. package/dist/cjs/components/pagination.cjs +36 -0
  43. package/dist/cjs/components/popover.cjs +31 -0
  44. package/dist/cjs/components/progress.cjs +28 -0
  45. package/dist/cjs/components/questionnaire.cjs +70 -0
  46. package/dist/cjs/components/radio-group.cjs +16 -0
  47. package/dist/cjs/components/resizable.cjs +39 -0
  48. package/dist/cjs/components/scroll-area.cjs +15 -0
  49. package/dist/cjs/components/select.cjs +47 -0
  50. package/dist/cjs/components/separator.cjs +11 -0
  51. package/dist/cjs/components/sheet.cjs +47 -0
  52. package/dist/cjs/components/sidebar.cjs +301 -0
  53. package/dist/cjs/components/skeleton.cjs +10 -0
  54. package/dist/cjs/components/slider.cjs +16 -0
  55. package/dist/cjs/components/spinner.cjs +11 -0
  56. package/dist/cjs/components/switch.cjs +12 -0
  57. package/dist/cjs/components/table.cjs +38 -0
  58. package/dist/cjs/components/tabs.cjs +37 -0
  59. package/dist/cjs/components/textarea.cjs +10 -0
  60. package/dist/cjs/components/theme-toggle.cjs +19 -0
  61. package/dist/cjs/components/toast.cjs +82 -0
  62. package/dist/cjs/components/toggle-group.cjs +47 -0
  63. package/dist/cjs/components/toggle.cjs +30 -0
  64. package/dist/cjs/components/tooltip.cjs +24 -0
  65. package/dist/cjs/components/trace.cjs +40 -0
  66. package/dist/cjs/hooks/use-highlighted-code.cjs +73 -0
  67. package/dist/cjs/hooks/use-hydrated.cjs +15 -0
  68. package/dist/cjs/hooks/use-mobile.cjs +36 -0
  69. package/dist/cjs/index.cjs +497 -0
  70. package/dist/cjs/lib/highlighter.cjs +96 -0
  71. package/dist/cjs/lib/preference.cjs +40 -0
  72. package/dist/cjs/providers/preference-provider.cjs +127 -0
  73. package/dist/cjs/providers/theme-provider.cjs +181 -0
  74. package/dist/cjs/types/components/accordion.d.ts +9 -0
  75. package/dist/cjs/types/components/alert-dialog.d.ts +20 -0
  76. package/dist/cjs/types/components/alert.d.ts +13 -0
  77. package/dist/cjs/types/components/aspect-ratio.d.ts +7 -0
  78. package/dist/cjs/types/components/attachment.d.ts +26 -0
  79. package/dist/cjs/types/components/avatar.d.ts +13 -0
  80. package/dist/cjs/types/components/badge.d.ts +11 -0
  81. package/dist/cjs/types/components/breadcrumb.d.ts +12 -0
  82. package/dist/cjs/types/components/bubble.d.ts +19 -0
  83. package/dist/cjs/types/components/button-group.d.ts +14 -0
  84. package/dist/cjs/types/components/button.d.ts +12 -0
  85. package/dist/cjs/types/components/calendar.d.ts +12 -0
  86. package/dist/cjs/types/components/card.d.ts +13 -0
  87. package/dist/cjs/types/components/carousel.d.ts +31 -0
  88. package/dist/cjs/types/components/chart.d.ts +47 -0
  89. package/dist/cjs/types/components/checkbox.d.ts +6 -0
  90. package/dist/cjs/types/components/code-block.d.ts +29 -0
  91. package/dist/cjs/types/components/collapsible.d.ts +8 -0
  92. package/dist/cjs/types/components/combobox.d.ts +26 -0
  93. package/dist/cjs/types/components/command.d.ts +21 -0
  94. package/dist/cjs/types/components/context-menu.d.ts +31 -0
  95. package/dist/cjs/types/components/dialog.d.ts +19 -0
  96. package/dist/cjs/types/components/direction.d.ts +1 -0
  97. package/dist/cjs/types/components/drawer.d.ts +18 -0
  98. package/dist/cjs/types/components/dropdown-menu.d.ts +31 -0
  99. package/dist/cjs/types/components/empty.d.ts +15 -0
  100. package/dist/cjs/types/components/field.d.ts +28 -0
  101. package/dist/cjs/types/components/hover-card.d.ts +8 -0
  102. package/dist/cjs/types/components/index.d.ts +65 -0
  103. package/dist/cjs/types/components/input-group.d.ts +21 -0
  104. package/dist/cjs/types/components/input-otp.d.ts +13 -0
  105. package/dist/cjs/types/components/input.d.ts +5 -0
  106. package/dist/cjs/types/components/item.d.ts +25 -0
  107. package/dist/cjs/types/components/kbd.d.ts +6 -0
  108. package/dist/cjs/types/components/label.d.ts +5 -0
  109. package/dist/cjs/types/components/marker.d.ts +13 -0
  110. package/dist/cjs/types/components/menubar.d.ts +31 -0
  111. package/dist/cjs/types/components/message-scroller.d.ts +13 -0
  112. package/dist/cjs/types/components/message.d.ts +12 -0
  113. package/dist/cjs/types/components/native-select.d.ts +10 -0
  114. package/dist/cjs/types/components/navigation-menu.d.ts +15 -0
  115. package/dist/cjs/types/components/pagination.d.ts +19 -0
  116. package/dist/cjs/types/components/popover.d.ts +11 -0
  117. package/dist/cjs/types/components/progress.d.ts +10 -0
  118. package/dist/cjs/types/components/questionnaire.d.ts +21 -0
  119. package/dist/cjs/types/components/radio-group.d.ts +8 -0
  120. package/dist/cjs/types/components/resizable.d.ts +10 -0
  121. package/dist/cjs/types/components/scroll-area.d.ts +7 -0
  122. package/dist/cjs/types/components/select.d.ts +17 -0
  123. package/dist/cjs/types/components/separator.d.ts +6 -0
  124. package/dist/cjs/types/components/sheet.d.ts +16 -0
  125. package/dist/cjs/types/components/sidebar.d.ts +66 -0
  126. package/dist/cjs/types/components/skeleton.d.ts +5 -0
  127. package/dist/cjs/types/components/slider.d.ts +6 -0
  128. package/dist/cjs/types/components/spinner.d.ts +5 -0
  129. package/dist/cjs/types/components/switch.d.ts +8 -0
  130. package/dist/cjs/types/components/table.d.ts +12 -0
  131. package/dist/cjs/types/components/tabs.d.ts +14 -0
  132. package/dist/cjs/types/components/textarea.d.ts +5 -0
  133. package/dist/cjs/types/components/theme-toggle.d.ts +14 -0
  134. package/dist/cjs/types/components/toast.d.ts +19 -0
  135. package/dist/cjs/types/components/toggle-group.d.ts +13 -0
  136. package/dist/cjs/types/components/toggle.d.ts +12 -0
  137. package/dist/cjs/types/components/tooltip.d.ts +9 -0
  138. package/dist/cjs/types/components/trace.d.ts +20 -0
  139. package/dist/cjs/types/hooks/index.d.ts +3 -0
  140. package/dist/cjs/types/hooks/use-highlighted-code.d.ts +3 -0
  141. package/dist/cjs/types/hooks/use-hydrated.d.ts +4 -0
  142. package/dist/cjs/types/hooks/use-mobile.d.ts +3 -0
  143. package/dist/cjs/types/index.d.ts +73 -0
  144. package/dist/cjs/types/lib/highlighter.d.ts +11 -0
  145. package/dist/cjs/types/lib/index.d.ts +3 -0
  146. package/dist/cjs/types/lib/preference.d.ts +85 -0
  147. package/dist/cjs/types/lib/utils.d.ts +1 -0
  148. package/dist/cjs/types/package.json +1 -0
  149. package/dist/cjs/types/providers/index.d.ts +2 -0
  150. package/dist/cjs/types/providers/preference-provider.d.ts +20 -0
  151. package/dist/cjs/types/providers/theme-provider.d.ts +25 -0
  152. package/dist/esm/components/accordion.js +19 -0
  153. package/dist/esm/components/alert-dialog.js +43 -0
  154. package/dist/esm/components/alert.js +29 -0
  155. package/dist/esm/components/aspect-ratio.js +10 -0
  156. package/dist/esm/components/attachment.js +70 -0
  157. package/dist/esm/components/avatar.js +24 -0
  158. package/dist/esm/components/badge.js +35 -0
  159. package/dist/esm/components/breadcrumb.js +38 -0
  160. package/dist/esm/components/bubble.js +61 -0
  161. package/dist/esm/components/button-group.js +38 -0
  162. package/dist/esm/components/button.js +38 -0
  163. package/dist/esm/components/calendar.js +78 -0
  164. package/dist/esm/components/card.js +26 -0
  165. package/dist/esm/components/carousel.js +87 -0
  166. package/dist/esm/components/chart.js +133 -0
  167. package/dist/esm/components/checkbox.js +11 -0
  168. package/dist/esm/components/code-block.js +82 -0
  169. package/dist/esm/components/collapsible.js +14 -0
  170. package/dist/esm/components/combobox.js +60 -0
  171. package/dist/esm/components/command.js +36 -0
  172. package/dist/esm/components/context-menu.js +53 -0
  173. package/dist/esm/components/dialog.js +39 -0
  174. package/dist/esm/components/drawer.js +77 -0
  175. package/dist/esm/components/dropdown-menu.js +52 -0
  176. package/dist/esm/components/empty.js +35 -0
  177. package/dist/esm/components/field.js +69 -0
  178. package/dist/esm/components/hover-card.js +16 -0
  179. package/dist/esm/components/input-group.js +59 -0
  180. package/dist/esm/components/input-otp.js +22 -0
  181. package/dist/esm/components/input.js +9 -0
  182. package/dist/esm/components/item.js +80 -0
  183. package/dist/esm/components/kbd.js +11 -0
  184. package/dist/esm/components/label.js +9 -0
  185. package/dist/esm/components/marker.js +36 -0
  186. package/dist/esm/components/menubar.js +58 -0
  187. package/dist/esm/components/message-scroller.js +27 -0
  188. package/dist/esm/components/message.js +23 -0
  189. package/dist/esm/components/native-select.js +15 -0
  190. package/dist/esm/components/navigation-menu.js +33 -0
  191. package/dist/esm/components/pagination.js +28 -0
  192. package/dist/esm/components/popover.js +24 -0
  193. package/dist/esm/components/progress.js +22 -0
  194. package/dist/esm/components/questionnaire.js +54 -0
  195. package/dist/esm/components/radio-group.js +13 -0
  196. package/dist/esm/components/resizable.js +16 -0
  197. package/dist/esm/components/scroll-area.js +12 -0
  198. package/dist/esm/components/select.js +36 -0
  199. package/dist/esm/components/separator.js +9 -0
  200. package/dist/esm/components/sheet.js +38 -0
  201. package/dist/esm/components/sidebar.js +257 -0
  202. package/dist/esm/components/skeleton.js +8 -0
  203. package/dist/esm/components/slider.js +14 -0
  204. package/dist/esm/components/spinner.js +9 -0
  205. package/dist/esm/components/switch.js +10 -0
  206. package/dist/esm/components/table.js +29 -0
  207. package/dist/esm/components/tabs.js +31 -0
  208. package/dist/esm/components/textarea.js +8 -0
  209. package/dist/esm/components/theme-toggle.js +17 -0
  210. package/dist/esm/components/toast.js +68 -0
  211. package/dist/esm/components/toggle-group.js +25 -0
  212. package/dist/esm/components/toggle.js +27 -0
  213. package/dist/esm/components/tooltip.js +19 -0
  214. package/dist/esm/components/trace.js +31 -0
  215. package/dist/esm/hooks/use-highlighted-code.js +52 -0
  216. package/dist/esm/hooks/use-hydrated.js +13 -0
  217. package/dist/esm/hooks/use-mobile.js +15 -0
  218. package/dist/esm/index.js +73 -0
  219. package/dist/esm/lib/highlighter.js +93 -0
  220. package/dist/esm/lib/preference.js +35 -0
  221. package/dist/esm/providers/preference-provider.js +124 -0
  222. package/dist/esm/providers/theme-provider.js +178 -0
  223. package/dist/styles/custom.css +2 -0
  224. package/dist/styles/font/LICENSE +93 -0
  225. package/dist/styles/font/files/11944884.woff2 +0 -0
  226. package/dist/styles/font/files/3f081d19.woff2 +0 -0
  227. package/dist/styles/font/files/aa4aa22f.woff2 +0 -0
  228. package/dist/styles/font/files/ba1a9b92.woff2 +0 -0
  229. package/dist/styles/font/files/eadd8e6c.woff2 +0 -0
  230. package/dist/styles/font/geist.css +2 -0
  231. package/dist/styles/index.css +2 -0
  232. package/dist/types/components/accordion.d.ts +9 -0
  233. package/dist/types/components/alert-dialog.d.ts +20 -0
  234. package/dist/types/components/alert.d.ts +13 -0
  235. package/dist/types/components/aspect-ratio.d.ts +7 -0
  236. package/dist/types/components/attachment.d.ts +26 -0
  237. package/dist/types/components/avatar.d.ts +13 -0
  238. package/dist/types/components/badge.d.ts +11 -0
  239. package/dist/types/components/breadcrumb.d.ts +12 -0
  240. package/dist/types/components/bubble.d.ts +19 -0
  241. package/dist/types/components/button-group.d.ts +14 -0
  242. package/dist/types/components/button.d.ts +12 -0
  243. package/dist/types/components/calendar.d.ts +12 -0
  244. package/dist/types/components/card.d.ts +13 -0
  245. package/dist/types/components/carousel.d.ts +31 -0
  246. package/dist/types/components/chart.d.ts +47 -0
  247. package/dist/types/components/checkbox.d.ts +6 -0
  248. package/dist/types/components/code-block.d.ts +29 -0
  249. package/dist/types/components/collapsible.d.ts +8 -0
  250. package/dist/types/components/combobox.d.ts +26 -0
  251. package/dist/types/components/command.d.ts +21 -0
  252. package/dist/types/components/context-menu.d.ts +31 -0
  253. package/dist/types/components/dialog.d.ts +19 -0
  254. package/dist/types/components/direction.d.ts +1 -0
  255. package/dist/types/components/drawer.d.ts +18 -0
  256. package/dist/types/components/dropdown-menu.d.ts +31 -0
  257. package/dist/types/components/empty.d.ts +15 -0
  258. package/dist/types/components/field.d.ts +28 -0
  259. package/dist/types/components/hover-card.d.ts +8 -0
  260. package/dist/types/components/index.d.ts +65 -0
  261. package/dist/types/components/input-group.d.ts +21 -0
  262. package/dist/types/components/input-otp.d.ts +13 -0
  263. package/dist/types/components/input.d.ts +5 -0
  264. package/dist/types/components/item.d.ts +25 -0
  265. package/dist/types/components/kbd.d.ts +6 -0
  266. package/dist/types/components/label.d.ts +5 -0
  267. package/dist/types/components/marker.d.ts +13 -0
  268. package/dist/types/components/menubar.d.ts +31 -0
  269. package/dist/types/components/message-scroller.d.ts +13 -0
  270. package/dist/types/components/message.d.ts +12 -0
  271. package/dist/types/components/native-select.d.ts +10 -0
  272. package/dist/types/components/navigation-menu.d.ts +15 -0
  273. package/dist/types/components/pagination.d.ts +19 -0
  274. package/dist/types/components/popover.d.ts +11 -0
  275. package/dist/types/components/progress.d.ts +10 -0
  276. package/dist/types/components/questionnaire.d.ts +21 -0
  277. package/dist/types/components/radio-group.d.ts +8 -0
  278. package/dist/types/components/resizable.d.ts +10 -0
  279. package/dist/types/components/scroll-area.d.ts +7 -0
  280. package/dist/types/components/select.d.ts +17 -0
  281. package/dist/types/components/separator.d.ts +6 -0
  282. package/dist/types/components/sheet.d.ts +16 -0
  283. package/dist/types/components/sidebar.d.ts +66 -0
  284. package/dist/types/components/skeleton.d.ts +5 -0
  285. package/dist/types/components/slider.d.ts +6 -0
  286. package/dist/types/components/spinner.d.ts +5 -0
  287. package/dist/types/components/switch.d.ts +8 -0
  288. package/dist/types/components/table.d.ts +12 -0
  289. package/dist/types/components/tabs.d.ts +14 -0
  290. package/dist/types/components/textarea.d.ts +5 -0
  291. package/dist/types/components/theme-toggle.d.ts +14 -0
  292. package/dist/types/components/toast.d.ts +19 -0
  293. package/dist/types/components/toggle-group.d.ts +13 -0
  294. package/dist/types/components/toggle.d.ts +12 -0
  295. package/dist/types/components/tooltip.d.ts +9 -0
  296. package/dist/types/components/trace.d.ts +20 -0
  297. package/dist/types/hooks/index.d.ts +3 -0
  298. package/dist/types/hooks/use-highlighted-code.d.ts +3 -0
  299. package/dist/types/hooks/use-hydrated.d.ts +4 -0
  300. package/dist/types/hooks/use-mobile.d.ts +3 -0
  301. package/dist/types/index.d.ts +73 -0
  302. package/dist/types/lib/highlighter.d.ts +11 -0
  303. package/dist/types/lib/index.d.ts +3 -0
  304. package/dist/types/lib/preference.d.ts +85 -0
  305. package/dist/types/lib/utils.d.ts +1 -0
  306. package/dist/types/providers/index.d.ts +2 -0
  307. package/dist/types/providers/preference-provider.d.ts +20 -0
  308. package/dist/types/providers/theme-provider.d.ts +25 -0
  309. package/dist/umd/index.js +86818 -0
  310. package/package.json +116 -4
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 badnpm
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,194 @@
1
- # Temporary Holding Version
1
+ # UI components
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ React 19 组件库,提供 ESM、CommonJS、UMD 三种产物,以及独立的预编译 CSS。
4
+
5
+ ## 安装
6
+
7
+ 包发布后,在应用中安装组件库及 React 依赖:
8
+
9
+ ```sh
10
+ npm install @badnpm/ui react@^19 react-dom@^19
11
+ ```
12
+
13
+ 组件包公开发布到 npm;发布前可使用本地 tarball 验证。下文统一使用当前包名 `@badnpm/ui`。
14
+
15
+ ## 样式入口
16
+
17
+ 三种 JS 格式共用 `dist/styles`,JS 入口不会自动加载 CSS。
18
+
19
+ | 样式入口 | 用途 | 引入方式 |
20
+ | ---------------------------------- | ------------------------------------------- | ---------------------------- |
21
+ | `@badnpm/ui/styles/index.css` | Tailwind 重置、组件工具类、主题和基础色变量 | 使用内置组件样式时引入 |
22
+ | `@badnpm/ui/styles/custom.css` | 页面主题配色和滚动条样式 | 按需引入,与默认样式配合使用 |
23
+ | `@badnpm/ui/styles/font/geist.css` | 加载 Geist 字体,并设置默认无衬线字体 | 按需引入 |
24
+
25
+ 仅引入默认样式即可使用组件。页面配色与滚动条作为一组可选样式,字体可以单独选择,字体文件随包提供。
26
+ 主题和基础色已包含在默认样式中。`@badnpm/ui/globals.css` 是默认样式的兼容入口,使用示例统一采用 `styles/index.css`。
27
+
28
+ 使用方无需安装 Tailwind、shadcn、tw-animate-css 或 Geist 字体包。
29
+ 应用自行编写的额外 Tailwind 类需要由应用自己的 Tailwind 配置生成。
30
+
31
+ ## ESM
32
+
33
+ 适用于支持 TSX 和 CSS 导入的应用构建工具。`import` 自动选择 `dist/esm/index.js`。
34
+ 以下示例作为浏览器入口使用,HTML 中需提供 `<div id="root"></div>`。
35
+
36
+ ```tsx
37
+ import { createRoot } from 'react-dom/client';
38
+ import { Button, ThemeProvider, ThemeToggle } from '@badnpm/ui';
39
+
40
+ // 默认组件样式。
41
+ import '@badnpm/ui/styles/index.css';
42
+ // 可选,应用页面主题配色和滚动条样式。
43
+ import '@badnpm/ui/styles/custom.css';
44
+ // 可选,使用 Geist 字体。
45
+ import '@badnpm/ui/styles/font/geist.css';
46
+
47
+ function App() {
48
+ return (
49
+ <ThemeProvider>
50
+ <Button>保存</Button>
51
+ <ThemeToggle />
52
+ </ThemeProvider>
53
+ );
54
+ }
55
+
56
+ createRoot(document.getElementById('root')!).render(<App />);
57
+ ```
58
+
59
+ 按需引入 custom.css 和字体入口,分别控制页面配色、滚动条和字体。
60
+ `ThemeToggle` 通过 `ThemeProvider` 读取并切换深浅模式,单独使用 `Button`、`Input` 时可直接渲染。
61
+
62
+ ## CommonJS
63
+
64
+ `require` 自动选择 `dist/cjs/index.cjs`。以下示例用于支持 CommonJS 且配置了 CSS 处理的浏览器打包入口,HTML 中需提供 `<div id="root"></div>`。
65
+
66
+ ```js
67
+ const React = require('react');
68
+ const { createRoot } = require('react-dom/client');
69
+ const { Button, ThemeProvider, ThemeToggle } = require('@badnpm/ui');
70
+
71
+ // 这些 CSS require 由应用的打包器处理。
72
+ require('@badnpm/ui/styles/index.css');
73
+ // 可选页面配色和滚动条样式。
74
+ require('@badnpm/ui/styles/custom.css');
75
+ // 可选字体。
76
+ require('@badnpm/ui/styles/font/geist.css');
77
+
78
+ const app = React.createElement(
79
+ ThemeProvider,
80
+ null,
81
+ React.createElement(Button, null, '保存'),
82
+ React.createElement(ThemeToggle)
83
+ );
84
+
85
+ createRoot(document.getElementById('root')).render(app);
86
+ ```
87
+
88
+ 在 Node.js 中进行服务端渲染时,可以直接加载 CJS 组件。CSS 通过浏览器端入口或 HTML 的 `link` 标签加载。
89
+
90
+ ```js
91
+ const React = require('react');
92
+ const { renderToString } = require('react-dom/server');
93
+ const { Button } = require('@badnpm/ui');
94
+
95
+ const html = renderToString(React.createElement(Button, null, '保存'));
96
+ console.log(html);
97
+ ```
98
+
99
+ ## UMD
100
+
101
+ 将安装包中的 `dist` 目录放到网站静态目录,例如 `public/vendor/ui`。浏览器可以通过 `/vendor/ui/umd/index.js` 加载组件库,通过 `/vendor/ui/styles` 加载样式和字体。部署时保留整个 `styles` 目录结构,使 CSS 中的字体相对路径保持有效。
102
+
103
+ UMD 导出挂载到 `window.BadUI`。页面先准备 React、ReactDOM 全局对象,再加载组件库。
104
+ React 19 的浏览器加载示例采用 ESM CDN,并将 React 显式共享给 ReactDOM,下面使用 import map 配置依赖地址。 [React 官方说明](https://react.dev/blog/2024/04/25/react-19-upgrade-guide#umd-builds-removed)
105
+
106
+ ```html
107
+ <!doctype html>
108
+ <html lang="zh-CN">
109
+ <head>
110
+ <meta charset="UTF-8" />
111
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
112
+ <title>UI 组件示例</title>
113
+
114
+ <!-- 默认组件样式。 -->
115
+ <link rel="stylesheet" href="/vendor/ui/styles/index.css" />
116
+ <!-- 可选,应用页面主题配色和滚动条样式。 -->
117
+ <link rel="stylesheet" href="/vendor/ui/styles/custom.css" />
118
+ <!-- 可选,删除此行后使用应用自己的字体。 -->
119
+ <link rel="stylesheet" href="/vendor/ui/styles/font/geist.css" />
120
+
121
+ <script type="importmap">
122
+ {
123
+ "imports": {
124
+ "react": "https://esm.sh/react@19",
125
+ "react-dom": "https://esm.sh/react-dom@19?external=react",
126
+ "react-dom/client": "https://esm.sh/react-dom@19/client?external=react,react-dom"
127
+ }
128
+ }
129
+ </script>
130
+ </head>
131
+ <body>
132
+ <div id="root"></div>
133
+ <script type="module">
134
+ import React from 'react';
135
+ import * as ReactDOM from 'react-dom';
136
+ import { createRoot } from 'react-dom/client';
137
+
138
+ window.React = React;
139
+ window.ReactDOM = ReactDOM;
140
+
141
+ // 等待全局对象设置完成后再加载 UMD 文件。
142
+ await import('/vendor/ui/umd/index.js');
143
+ const { Button, ThemeProvider, ThemeToggle } = window.BadUI;
144
+
145
+ createRoot(document.getElementById('root')).render(
146
+ React.createElement(
147
+ ThemeProvider,
148
+ null,
149
+ React.createElement(Button, null, '保存'),
150
+ React.createElement(ThemeToggle)
151
+ )
152
+ );
153
+ </script>
154
+ </body>
155
+ </html>
156
+ ```
157
+
158
+ 通过 HTTP 静态服务访问上述页面。示例中的 CDN 地址可替换为应用自行托管的 React 依赖地址。
159
+ UMD 已合并普通运行依赖,React 与 ReactDOM 由页面提供,CSS 通过 `link` 独立加载。
160
+
161
+ ## TypeScript
162
+
163
+ ESM 使用 `dist/types/index.d.ts`,CommonJS 使用 `dist/cjs/types/index.d.ts`,包的 `exports` 会根据导入方式选择对应声明。两份声明均按源码目录逐文件生成。
164
+
165
+ TypeScript 项目可以加载构建工具提供的 CSS 类型声明,例如 Vite 的 `vite/client`。
166
+ 也可在应用纳入编译范围的声明文件(例如 `src/styles.d.ts`)中统一添加:
167
+
168
+ ```ts
169
+ declare module '*.css' {}
170
+ ```
171
+
172
+ ## 构建与打包
173
+
174
+ 在仓库根目录执行:
175
+
176
+ ```sh
177
+ pnpm --filter @badnpm/ui build
178
+ npm pack ./packages/ui --pack-destination /tmp
179
+ ```
180
+
181
+ 构建命令直接运行 `rollup -c`,产物目录如下:
182
+
183
+ ```text
184
+ dist/
185
+ ├── esm/ # ESM 模块
186
+ ├── types/ # 按源码结构生成的 ESM 类型声明
187
+ ├── cjs/ # CommonJS 模块,types 子目录提供逐文件类型声明
188
+ ├── umd/index.js # 浏览器单文件,导出 window.BadUI
189
+ └── styles/ # 默认样式、可选页面配色、滚动条和字体资源
190
+ ```
191
+
192
+ TypeScript 插件编译 JS,rollup-plugin-dts 配合 preserveModules 按源码目录逐文件生成类型声明。PostCSS 编译独立 CSS 并处理字体资源,样式规则集中在 `postcss.config.mjs`。
193
+ 声明生成阶段会将目录导入和源码路径别名转换为完整相对路径,兼容使用方的 NodeNext 类型解析。
194
+ 入口和依赖统一在包根目录的 `package.json` 中维护。工作区 demo 的 Vite 别名指向源码,保留本地热更新。
@@ -0,0 +1,24 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var accordion = require('@base-ui/react/accordion');
5
+ var cn = require('cn');
6
+ var lucideReact = require('lucide-react');
7
+
8
+ function Accordion({ className, ...props }) {
9
+ return (jsxRuntime.jsx(accordion.Accordion.Root, { "data-slot": "accordion", className: cn.cn("flex w-full flex-col", className), ...props }));
10
+ }
11
+ function AccordionItem({ className, ...props }) {
12
+ return (jsxRuntime.jsx(accordion.Accordion.Item, { "data-slot": "accordion-item", className: cn.cn("not-last:border-b", className), ...props }));
13
+ }
14
+ function AccordionTrigger({ className, children, ...props }) {
15
+ return (jsxRuntime.jsx(accordion.Accordion.Header, { className: "flex", children: jsxRuntime.jsxs(accordion.Accordion.Trigger, { "data-slot": "accordion-trigger", className: cn.cn("group/accordion-trigger relative flex flex-1 items-start justify-between rounded-lg border border-transparent py-2.5 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:after:border-ring aria-disabled:pointer-events-none aria-disabled:opacity-50 **:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground", className), ...props, children: [children, jsxRuntime.jsx(lucideReact.ChevronDownIcon, { "data-slot": "accordion-trigger-icon", className: "pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden" }), jsxRuntime.jsx(lucideReact.ChevronUpIcon, { "data-slot": "accordion-trigger-icon", className: "pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline" })] }) }));
16
+ }
17
+ function AccordionContent({ className, children, ...props }) {
18
+ return (jsxRuntime.jsx(accordion.Accordion.Panel, { "data-slot": "accordion-content", className: "overflow-hidden text-sm data-open:animate-accordion-down data-closed:animate-accordion-up", ...props, children: jsxRuntime.jsx("div", { className: cn.cn("h-(--accordion-panel-height) pt-0 pb-2.5 data-ending-style:h-0 data-starting-style:h-0 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4", className), children: children }) }));
19
+ }
20
+
21
+ exports.Accordion = Accordion;
22
+ exports.AccordionContent = AccordionContent;
23
+ exports.AccordionItem = AccordionItem;
24
+ exports.AccordionTrigger = AccordionTrigger;
@@ -0,0 +1,56 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var alertDialog = require('@base-ui/react/alert-dialog');
5
+ var cn = require('cn');
6
+ var button = require('./button.cjs');
7
+
8
+ function AlertDialog({ ...props }) {
9
+ return jsxRuntime.jsx(alertDialog.AlertDialog.Root, { "data-slot": "alert-dialog", ...props });
10
+ }
11
+ function AlertDialogTrigger({ ...props }) {
12
+ return (jsxRuntime.jsx(alertDialog.AlertDialog.Trigger, { "data-slot": "alert-dialog-trigger", ...props }));
13
+ }
14
+ function AlertDialogPortal({ ...props }) {
15
+ return (jsxRuntime.jsx(alertDialog.AlertDialog.Portal, { "data-slot": "alert-dialog-portal", ...props }));
16
+ }
17
+ function AlertDialogOverlay({ className, ...props }) {
18
+ return (jsxRuntime.jsx(alertDialog.AlertDialog.Backdrop, { "data-slot": "alert-dialog-overlay", className: cn.cn("fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0", className), ...props }));
19
+ }
20
+ function AlertDialogContent({ className, size = "default", ...props }) {
21
+ return (jsxRuntime.jsxs(AlertDialogPortal, { children: [jsxRuntime.jsx(AlertDialogOverlay, {}), jsxRuntime.jsx(alertDialog.AlertDialog.Popup, { "data-slot": "alert-dialog-content", "data-size": size, className: cn.cn("group/alert-dialog-content fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none data-[size=default]:max-w-xs data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-sm 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", className), ...props })] }));
22
+ }
23
+ function AlertDialogHeader({ className, ...props }) {
24
+ return (jsxRuntime.jsx("div", { "data-slot": "alert-dialog-header", className: cn.cn("grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-4 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]", className), ...props }));
25
+ }
26
+ function AlertDialogFooter({ className, ...props }) {
27
+ return (jsxRuntime.jsx("div", { "data-slot": "alert-dialog-footer", className: cn.cn("-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end", className), ...props }));
28
+ }
29
+ function AlertDialogMedia({ className, ...props }) {
30
+ return (jsxRuntime.jsx("div", { "data-slot": "alert-dialog-media", className: cn.cn("mb-2 inline-flex size-10 items-center justify-center rounded-md bg-muted sm:group-data-[size=default]/alert-dialog-content:row-span-2 *:[svg:not([class*='size-'])]:size-6", className), ...props }));
31
+ }
32
+ function AlertDialogTitle({ className, ...props }) {
33
+ return (jsxRuntime.jsx(alertDialog.AlertDialog.Title, { "data-slot": "alert-dialog-title", className: cn.cn("font-heading text-base font-medium sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2", className), ...props }));
34
+ }
35
+ function AlertDialogDescription({ className, ...props }) {
36
+ return (jsxRuntime.jsx(alertDialog.AlertDialog.Description, { "data-slot": "alert-dialog-description", className: cn.cn("text-sm text-balance text-muted-foreground md:text-pretty *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground", className), ...props }));
37
+ }
38
+ function AlertDialogAction({ className, ...props }) {
39
+ return (jsxRuntime.jsx(button.Button, { "data-slot": "alert-dialog-action", className: cn.cn(className), ...props }));
40
+ }
41
+ function AlertDialogCancel({ className, variant = "outline", size = "default", ...props }) {
42
+ return (jsxRuntime.jsx(alertDialog.AlertDialog.Close, { "data-slot": "alert-dialog-cancel", className: cn.cn(className), render: jsxRuntime.jsx(button.Button, { variant: variant, size: size }), ...props }));
43
+ }
44
+
45
+ exports.AlertDialog = AlertDialog;
46
+ exports.AlertDialogAction = AlertDialogAction;
47
+ exports.AlertDialogCancel = AlertDialogCancel;
48
+ exports.AlertDialogContent = AlertDialogContent;
49
+ exports.AlertDialogDescription = AlertDialogDescription;
50
+ exports.AlertDialogFooter = AlertDialogFooter;
51
+ exports.AlertDialogHeader = AlertDialogHeader;
52
+ exports.AlertDialogMedia = AlertDialogMedia;
53
+ exports.AlertDialogOverlay = AlertDialogOverlay;
54
+ exports.AlertDialogPortal = AlertDialogPortal;
55
+ exports.AlertDialogTitle = AlertDialogTitle;
56
+ exports.AlertDialogTrigger = AlertDialogTrigger;
@@ -0,0 +1,34 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var classVarianceAuthority = require('class-variance-authority');
5
+ var cn = require('cn');
6
+
7
+ const alertVariants = classVarianceAuthority.cva("group/alert relative grid w-full gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4", {
8
+ variants: {
9
+ variant: {
10
+ default: "bg-card text-card-foreground",
11
+ destructive: "bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current",
12
+ },
13
+ },
14
+ defaultVariants: {
15
+ variant: "default",
16
+ },
17
+ });
18
+ function Alert({ className, variant, ...props }) {
19
+ return (jsxRuntime.jsx("div", { "data-slot": "alert", role: "alert", className: cn.cn(alertVariants({ variant }), className), ...props }));
20
+ }
21
+ function AlertTitle({ className, ...props }) {
22
+ return (jsxRuntime.jsx("div", { "data-slot": "alert-title", className: cn.cn("font-medium group-has-[>svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground", className), ...props }));
23
+ }
24
+ function AlertDescription({ className, ...props }) {
25
+ return (jsxRuntime.jsx("div", { "data-slot": "alert-description", className: cn.cn("text-sm text-balance text-muted-foreground md:text-pretty [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4", className), ...props }));
26
+ }
27
+ function AlertAction({ className, ...props }) {
28
+ return (jsxRuntime.jsx("div", { "data-slot": "alert-action", className: cn.cn("absolute top-2 right-2", className), ...props }));
29
+ }
30
+
31
+ exports.Alert = Alert;
32
+ exports.AlertAction = AlertAction;
33
+ exports.AlertDescription = AlertDescription;
34
+ exports.AlertTitle = AlertTitle;
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var cn = require('cn');
5
+
6
+ function AspectRatio({ ratio, className, ...props }) {
7
+ return (jsxRuntime.jsx("div", { "data-slot": "aspect-ratio", style: {
8
+ "--ratio": ratio,
9
+ }, className: cn.cn("relative aspect-(--ratio)", className), ...props }));
10
+ }
11
+
12
+ exports.AspectRatio = AspectRatio;
@@ -0,0 +1,80 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var mergeProps = require('@base-ui/react/merge-props');
5
+ var useRender = require('@base-ui/react/use-render');
6
+ var classVarianceAuthority = require('class-variance-authority');
7
+ var cn = require('cn');
8
+ var button = require('./button.cjs');
9
+
10
+ const attachmentVariants = classVarianceAuthority.cva("group/attachment relative flex w-fit max-w-full min-w-0 shrink-0 flex-wrap rounded-xl border bg-card text-card-foreground transition-colors focus-within:ring-1 focus-within:ring-ring/50 has-[>a,>button]:hover:bg-muted/50 data-[state=error]:border-destructive/30 data-[state=idle]:border-dashed", {
11
+ variants: {
12
+ size: {
13
+ default: "gap-2 text-sm has-data-[slot=attachment-content]:px-2.5 has-data-[slot=attachment-content]:py-2 has-data-[slot=attachment-media]:p-2",
14
+ sm: "gap-2.5 text-xs has-data-[slot=attachment-content]:px-2 has-data-[slot=attachment-content]:py-1.5 has-data-[slot=attachment-media]:p-1.5",
15
+ xs: "gap-1.5 rounded-lg text-xs has-data-[slot=attachment-content]:px-1.5 has-data-[slot=attachment-content]:py-1 has-data-[slot=attachment-media]:p-1",
16
+ },
17
+ orientation: {
18
+ horizontal: "min-w-40 items-center",
19
+ vertical: "w-24 flex-col has-data-[slot=attachment-content]:w-30",
20
+ },
21
+ },
22
+ });
23
+ function Attachment({ className, state = "done", size = "default", orientation = "horizontal", ...props }) {
24
+ return (jsxRuntime.jsx("div", { "data-slot": "attachment", "data-state": state, "data-size": size, "data-orientation": orientation, className: cn.cn(attachmentVariants({ size, orientation }), className), ...props }));
25
+ }
26
+ const attachmentMediaVariants = classVarianceAuthority.cva("relative flex aspect-square w-10 shrink-0 items-center justify-center overflow-hidden rounded-lg bg-muted text-foreground group-data-[orientation=vertical]/attachment:w-full group-data-[size=sm]/attachment:w-8 group-data-[size=xs]/attachment:w-7 group-data-[size=xs]/attachment:rounded-md group-data-[state=error]/attachment:bg-destructive/10 group-data-[state=error]/attachment:text-destructive group-data-[orientation=vertical]/attachment:*:data-[slot=spinner]:size-6! [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 group-data-[orientation=vertical]/attachment:[&_svg:not([class*='size-'])]:size-6 group-data-[size=xs]/attachment:[&_svg:not([class*='size-'])]:size-3.5", {
27
+ variants: {
28
+ variant: {
29
+ icon: "",
30
+ image: "opacity-60 group-data-[state=done]/attachment:opacity-100 group-data-[state=idle]/attachment:opacity-100 *:[img]:aspect-square *:[img]:w-full *:[img]:object-cover",
31
+ },
32
+ },
33
+ defaultVariants: {
34
+ variant: "icon",
35
+ },
36
+ });
37
+ function AttachmentMedia({ className, variant = "icon", ...props }) {
38
+ return (jsxRuntime.jsx("div", { "data-slot": "attachment-media", "data-variant": variant, className: cn.cn(attachmentMediaVariants({ variant }), className), ...props }));
39
+ }
40
+ function AttachmentContent({ className, ...props }) {
41
+ return (jsxRuntime.jsx("div", { "data-slot": "attachment-content", className: cn.cn("max-w-full min-w-0 flex-1 leading-tight group-data-[orientation=vertical]/attachment:px-1", className), ...props }));
42
+ }
43
+ function AttachmentTitle({ className, ...props }) {
44
+ return (jsxRuntime.jsx("span", { "data-slot": "attachment-title", className: cn.cn("block max-w-full min-w-0 truncate font-medium group-data-[state=processing]/attachment:shimmer group-data-[state=uploading]/attachment:shimmer", className), ...props }));
45
+ }
46
+ function AttachmentDescription({ className, ...props }) {
47
+ return (jsxRuntime.jsx("span", { "data-slot": "attachment-description", className: cn.cn("mt-0.5 block min-w-0 truncate text-xs text-muted-foreground group-data-[state=error]/attachment:text-destructive", "max-w-full", className), ...props }));
48
+ }
49
+ function AttachmentActions({ className, ...props }) {
50
+ return (jsxRuntime.jsx("div", { "data-slot": "attachment-actions", className: cn.cn("relative z-20 flex shrink-0 items-center group-data-[orientation=vertical]/attachment:absolute group-data-[orientation=vertical]/attachment:top-3 group-data-[orientation=vertical]/attachment:right-3 group-data-[orientation=vertical]/attachment:gap-1", className), ...props }));
51
+ }
52
+ function AttachmentAction({ className, variant, size = "icon-xs", ...props }) {
53
+ return (jsxRuntime.jsx(button.Button, { "data-slot": "attachment-action", variant: variant ?? "ghost", size: size, className: cn.cn(className), ...props }));
54
+ }
55
+ function AttachmentTrigger({ className, render, type, ...props }) {
56
+ return useRender.useRender({
57
+ defaultTagName: "button",
58
+ props: mergeProps.mergeProps({
59
+ type: render ? type : (type ?? "button"),
60
+ className: cn.cn("absolute inset-0 z-10 outline-none", className),
61
+ }, props),
62
+ render,
63
+ state: {
64
+ slot: "attachment-trigger",
65
+ },
66
+ });
67
+ }
68
+ function AttachmentGroup({ className, ...props }) {
69
+ return (jsxRuntime.jsx("div", { "data-slot": "attachment-group", className: cn.cn("flex min-w-0 scroll-fade-x snap-x snap-mandatory scroll-px-1 scrollbar-none gap-3 overflow-x-auto overscroll-x-contain py-1 *:data-[slot=attachment]:flex-none *:data-[slot=attachment]:snap-start", className), ...props }));
70
+ }
71
+
72
+ exports.Attachment = Attachment;
73
+ exports.AttachmentAction = AttachmentAction;
74
+ exports.AttachmentActions = AttachmentActions;
75
+ exports.AttachmentContent = AttachmentContent;
76
+ exports.AttachmentDescription = AttachmentDescription;
77
+ exports.AttachmentGroup = AttachmentGroup;
78
+ exports.AttachmentMedia = AttachmentMedia;
79
+ exports.AttachmentTitle = AttachmentTitle;
80
+ exports.AttachmentTrigger = AttachmentTrigger;
@@ -0,0 +1,31 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var avatar = require('@base-ui/react/avatar');
5
+ var cn = require('cn');
6
+
7
+ function Avatar({ className, size = "default", ...props }) {
8
+ return (jsxRuntime.jsx(avatar.Avatar.Root, { "data-slot": "avatar", "data-size": size, className: cn.cn("group/avatar relative flex size-8 shrink-0 rounded-full select-none after:absolute after:inset-0 after:rounded-full after:border after:border-border after:mix-blend-darken data-[size=lg]:size-10 data-[size=sm]:size-6 dark:after:mix-blend-lighten", className), ...props }));
9
+ }
10
+ function AvatarImage({ className, ...props }) {
11
+ return (jsxRuntime.jsx(avatar.Avatar.Image, { "data-slot": "avatar-image", className: cn.cn("aspect-square size-full rounded-full object-cover", className), ...props }));
12
+ }
13
+ function AvatarFallback({ className, ...props }) {
14
+ return (jsxRuntime.jsx(avatar.Avatar.Fallback, { "data-slot": "avatar-fallback", className: cn.cn("flex size-full items-center justify-center rounded-full bg-muted text-sm text-muted-foreground group-data-[size=sm]/avatar:text-xs", className), ...props }));
15
+ }
16
+ function AvatarBadge({ className, ...props }) {
17
+ return (jsxRuntime.jsx("span", { "data-slot": "avatar-badge", className: cn.cn("absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground bg-blend-color ring-2 ring-background select-none", "group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden", "group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2", "group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2", className), ...props }));
18
+ }
19
+ function AvatarGroup({ className, ...props }) {
20
+ return (jsxRuntime.jsx("div", { "data-slot": "avatar-group", className: cn.cn("group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-background", className), ...props }));
21
+ }
22
+ function AvatarGroupCount({ className, ...props }) {
23
+ return (jsxRuntime.jsx("div", { "data-slot": "avatar-group-count", className: cn.cn("relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm text-muted-foreground ring-2 ring-background group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3", className), ...props }));
24
+ }
25
+
26
+ exports.Avatar = Avatar;
27
+ exports.AvatarBadge = AvatarBadge;
28
+ exports.AvatarFallback = AvatarFallback;
29
+ exports.AvatarGroup = AvatarGroup;
30
+ exports.AvatarGroupCount = AvatarGroupCount;
31
+ exports.AvatarImage = AvatarImage;
@@ -0,0 +1,38 @@
1
+ 'use strict';
2
+
3
+ var mergeProps = require('@base-ui/react/merge-props');
4
+ var useRender = require('@base-ui/react/use-render');
5
+ var classVarianceAuthority = require('class-variance-authority');
6
+ var cn = require('cn');
7
+
8
+ const badgeVariants = classVarianceAuthority.cva("group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!", {
9
+ variants: {
10
+ variant: {
11
+ default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80",
12
+ secondary: "bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80",
13
+ destructive: "bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20",
14
+ outline: "border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground",
15
+ ghost: "hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50",
16
+ link: "text-primary underline-offset-4 hover:underline",
17
+ },
18
+ },
19
+ defaultVariants: {
20
+ variant: "default",
21
+ },
22
+ });
23
+ function Badge({ className, variant = "default", render, ...props }) {
24
+ return useRender.useRender({
25
+ defaultTagName: "span",
26
+ props: mergeProps.mergeProps({
27
+ className: cn.cn(badgeVariants({ variant }), className),
28
+ }, props),
29
+ render,
30
+ state: {
31
+ slot: "badge",
32
+ variant,
33
+ },
34
+ });
35
+ }
36
+
37
+ exports.Badge = Badge;
38
+ exports.badgeVariants = badgeVariants;
@@ -0,0 +1,46 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var mergeProps = require('@base-ui/react/merge-props');
5
+ var useRender = require('@base-ui/react/use-render');
6
+ var cn = require('cn');
7
+ var lucideReact = require('lucide-react');
8
+
9
+ function Breadcrumb({ className, ...props }) {
10
+ return (jsxRuntime.jsx("nav", { "aria-label": "breadcrumb", "data-slot": "breadcrumb", className: cn.cn(className), ...props }));
11
+ }
12
+ function BreadcrumbList({ className, ...props }) {
13
+ return (jsxRuntime.jsx("ol", { "data-slot": "breadcrumb-list", className: cn.cn("flex flex-wrap items-center gap-1.5 text-sm wrap-break-word text-muted-foreground", className), ...props }));
14
+ }
15
+ function BreadcrumbItem({ className, ...props }) {
16
+ return (jsxRuntime.jsx("li", { "data-slot": "breadcrumb-item", className: cn.cn("inline-flex items-center gap-1", className), ...props }));
17
+ }
18
+ function BreadcrumbLink({ className, render, ...props }) {
19
+ return useRender.useRender({
20
+ defaultTagName: "a",
21
+ props: mergeProps.mergeProps({
22
+ className: cn.cn("transition-colors hover:text-foreground", className),
23
+ }, props),
24
+ render,
25
+ state: {
26
+ slot: "breadcrumb-link",
27
+ },
28
+ });
29
+ }
30
+ function BreadcrumbPage({ className, ...props }) {
31
+ return (jsxRuntime.jsx("span", { "data-slot": "breadcrumb-page", role: "link", "aria-disabled": "true", "aria-current": "page", className: cn.cn("font-normal text-foreground", className), ...props }));
32
+ }
33
+ function BreadcrumbSeparator({ children, className, ...props }) {
34
+ return (jsxRuntime.jsx("li", { "data-slot": "breadcrumb-separator", role: "presentation", "aria-hidden": "true", className: cn.cn("[&>svg]:size-3.5", className), ...props, children: children ?? (jsxRuntime.jsx(lucideReact.ChevronRightIcon, {})) }));
35
+ }
36
+ function BreadcrumbEllipsis({ className, ...props }) {
37
+ return (jsxRuntime.jsxs("span", { "data-slot": "breadcrumb-ellipsis", role: "presentation", "aria-hidden": "true", className: cn.cn("flex size-5 items-center justify-center [&>svg]:size-4", className), ...props, children: [jsxRuntime.jsx(lucideReact.MoreHorizontalIcon, {}), jsxRuntime.jsx("span", { className: "sr-only", children: "More" })] }));
38
+ }
39
+
40
+ exports.Breadcrumb = Breadcrumb;
41
+ exports.BreadcrumbEllipsis = BreadcrumbEllipsis;
42
+ exports.BreadcrumbItem = BreadcrumbItem;
43
+ exports.BreadcrumbLink = BreadcrumbLink;
44
+ exports.BreadcrumbList = BreadcrumbList;
45
+ exports.BreadcrumbPage = BreadcrumbPage;
46
+ exports.BreadcrumbSeparator = BreadcrumbSeparator;
@@ -0,0 +1,66 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var mergeProps = require('@base-ui/react/merge-props');
5
+ var useRender = require('@base-ui/react/use-render');
6
+ var classVarianceAuthority = require('class-variance-authority');
7
+ var cn = require('cn');
8
+
9
+ function BubbleGroup({ className, ...props }) {
10
+ return (jsxRuntime.jsx("div", { "data-slot": "bubble-group", className: cn.cn("flex min-w-0 flex-col gap-2", className), ...props }));
11
+ }
12
+ const bubbleVariants = classVarianceAuthority.cva("group/bubble relative flex w-fit max-w-[80%] min-w-0 flex-col gap-1 group-data-[align=end]/message:self-end data-[align=end]:self-end data-[variant=ghost]:max-w-full", {
13
+ variants: {
14
+ variant: {
15
+ default: "*:data-[slot=bubble-content]:bg-primary *:data-[slot=bubble-content]:text-primary-foreground [&>[data-slot=bubble-content]:is(button,a):hover]:bg-primary/80",
16
+ secondary: "*:data-[slot=bubble-content]:bg-secondary *:data-[slot=bubble-content]:text-secondary-foreground [&>[data-slot=bubble-content]:is(button,a):hover]:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)]",
17
+ muted: "*:data-[slot=bubble-content]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:bg-[color-mix(in_oklch,var(--muted),var(--foreground)_5%)]",
18
+ tinted: "*:data-[slot=bubble-content]:bg-[oklch(from_var(--primary)_0.93_calc(c*0.4)_h)] *:data-[slot=bubble-content]:text-foreground dark:*:data-[slot=bubble-content]:bg-[oklch(from_var(--primary)_0.3_calc(c*0.4)_h)] [&>[data-slot=bubble-content]:is(button,a):hover]:bg-[oklch(from_var(--primary)_0.88_calc(c*0.5)_h)] dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-[oklch(from_var(--primary)_0.35_calc(c*0.5)_h)]",
19
+ outline: "*:data-[slot=bubble-content]:border-border *:data-[slot=bubble-content]:bg-background [&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:text-foreground dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-input/30",
20
+ ghost: "border-none *:data-[slot=bubble-content]:rounded-none *:data-[slot=bubble-content]:bg-transparent *:data-[slot=bubble-content]:p-0 [&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted [&>[data-slot=bubble-content]:is(button,a):hover]:text-foreground dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-muted/50",
21
+ destructive: "*:data-[slot=bubble-content]:bg-destructive/10 *:data-[slot=bubble-content]:text-destructive dark:*:data-[slot=bubble-content]:bg-destructive/20 [&>[data-slot=bubble-content]:is(button,a):hover]:bg-destructive/20 dark:[&>[data-slot=bubble-content]:is(button,a):hover]:bg-destructive/30",
22
+ },
23
+ },
24
+ defaultVariants: {
25
+ variant: "default",
26
+ },
27
+ });
28
+ function Bubble({ variant = "default", align = "start", className, ...props }) {
29
+ return (jsxRuntime.jsx("div", { "data-slot": "bubble", "data-variant": variant, "data-align": align, className: cn.cn(bubbleVariants({ variant }), className), ...props }));
30
+ }
31
+ function BubbleContent({ className, render, ...props }) {
32
+ return useRender.useRender({
33
+ defaultTagName: "div",
34
+ props: mergeProps.mergeProps({
35
+ className: cn.cn("w-fit max-w-full min-w-0 overflow-hidden rounded-xl border border-transparent px-3 py-2 text-sm leading-relaxed wrap-break-word group-data-[align=end]/bubble:self-end [button]:text-left [button,a]:transition-colors [button,a]:outline-none [button,a]:focus-visible:border-ring [button,a]:focus-visible:ring-3 [button,a]:focus-visible:ring-ring/50", className),
36
+ }, props),
37
+ render,
38
+ state: {
39
+ slot: "bubble-content",
40
+ },
41
+ });
42
+ }
43
+ const bubbleReactionsVariants = classVarianceAuthority.cva("absolute z-10 flex w-fit shrink-0 items-center justify-center gap-1 rounded-full bg-muted px-1.5 py-0.5 text-sm ring-3 ring-card has-[button]:p-0", {
44
+ variants: {
45
+ side: {
46
+ top: "top-0 -translate-y-3/4",
47
+ bottom: "bottom-0 translate-y-3/4",
48
+ },
49
+ align: {
50
+ start: "left-3",
51
+ end: "right-3",
52
+ },
53
+ },
54
+ defaultVariants: {
55
+ side: "bottom",
56
+ align: "end",
57
+ },
58
+ });
59
+ function BubbleReactions({ side = "bottom", align = "end", className, ...props }) {
60
+ return (jsxRuntime.jsx("div", { "data-slot": "bubble-reactions", "data-align": align, "data-side": side, className: cn.cn(bubbleReactionsVariants({ side, align }), className), ...props }));
61
+ }
62
+
63
+ exports.Bubble = Bubble;
64
+ exports.BubbleContent = BubbleContent;
65
+ exports.BubbleGroup = BubbleGroup;
66
+ exports.BubbleReactions = BubbleReactions;