@soybeanjs/ui 0.14.0 → 0.15.0-beta.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 (298) hide show
  1. package/README.md +79 -147
  2. package/README.zh-CN.md +79 -147
  3. package/dist/components/accordion/accordion.js +1 -1
  4. package/dist/components/accordion/accordion.vue.d.ts +3 -31
  5. package/dist/components/accordion/index.d.ts +3 -3
  6. package/dist/components/accordion/types.d.ts +6 -25
  7. package/dist/components/affix/affix.js +1 -0
  8. package/dist/components/affix/affix.vue.d.ts +22 -0
  9. package/dist/components/affix/index.d.ts +4 -0
  10. package/dist/components/affix/index.js +1 -0
  11. package/dist/components/affix/types.d.ts +15 -0
  12. package/dist/components/affix/variants.js +1 -0
  13. package/dist/components/alert/alert.js +1 -1
  14. package/dist/components/anchor/anchor-item.js +1 -0
  15. package/dist/components/anchor/anchor.js +1 -0
  16. package/dist/components/anchor/anchor.vue.d.ts +23 -0
  17. package/dist/components/anchor/context.js +1 -0
  18. package/dist/components/anchor/index.d.ts +4 -0
  19. package/dist/components/anchor/index.js +1 -0
  20. package/dist/components/anchor/types.d.ts +34 -0
  21. package/dist/components/anchor/variants.js +1 -0
  22. package/dist/components/autocomplete/autocomplete-group-option.js +1 -0
  23. package/dist/components/autocomplete/autocomplete-option.js +1 -0
  24. package/dist/components/autocomplete/autocomplete-single-option.js +1 -0
  25. package/dist/components/autocomplete/autocomplete.js +1 -0
  26. package/dist/components/autocomplete/autocomplete.vue.d.ts +47 -0
  27. package/dist/components/autocomplete/context.js +1 -0
  28. package/dist/components/autocomplete/index.d.ts +4 -0
  29. package/dist/components/autocomplete/index.js +1 -0
  30. package/dist/components/autocomplete/shared.js +1 -0
  31. package/dist/components/autocomplete/types.d.ts +94 -0
  32. package/dist/components/autocomplete/variants.js +1 -0
  33. package/dist/components/bottom-sheet/bottom-sheet-close.js +1 -0
  34. package/dist/components/bottom-sheet/bottom-sheet-close.vue.d.ts +18 -0
  35. package/dist/components/bottom-sheet/bottom-sheet.js +1 -0
  36. package/dist/components/bottom-sheet/bottom-sheet.vue.d.ts +72 -0
  37. package/dist/components/bottom-sheet/index.d.ts +3 -0
  38. package/dist/components/bottom-sheet/index.js +1 -0
  39. package/dist/components/bottom-sheet/types.d.ts +31 -0
  40. package/dist/components/bottom-sheet/variants.js +1 -0
  41. package/dist/components/button/button-link.vue.d.ts +1 -1
  42. package/dist/components/carousel/carousel-content.js +1 -0
  43. package/dist/components/carousel/carousel-content.vue.d.ts +18 -0
  44. package/dist/components/carousel/carousel-item.js +1 -0
  45. package/dist/components/carousel/carousel-item.vue.d.ts +18 -0
  46. package/dist/components/carousel/carousel-next.js +1 -0
  47. package/dist/components/carousel/carousel-next.vue.d.ts +22 -0
  48. package/dist/components/carousel/carousel-previous.js +1 -0
  49. package/dist/components/carousel/carousel-previous.vue.d.ts +22 -0
  50. package/dist/components/carousel/carousel.js +1 -0
  51. package/dist/components/carousel/carousel.vue.d.ts +15 -0
  52. package/dist/components/carousel/index.d.ts +8 -0
  53. package/dist/components/carousel/index.js +1 -0
  54. package/dist/components/carousel/types.d.ts +10 -0
  55. package/dist/components/carousel/variants.js +1 -0
  56. package/dist/components/color-area/color-area.js +1 -0
  57. package/dist/components/color-area/color-area.vue.d.ts +19 -0
  58. package/dist/components/color-area/index.d.ts +4 -0
  59. package/dist/components/color-area/index.js +1 -0
  60. package/dist/components/color-area/types.d.ts +14 -0
  61. package/dist/components/color-area/variants.js +1 -0
  62. package/dist/components/color-field/color-field.js +1 -0
  63. package/dist/components/color-field/color-field.vue.d.ts +15 -0
  64. package/dist/components/color-field/index.d.ts +4 -0
  65. package/dist/components/color-field/index.js +1 -0
  66. package/dist/components/color-field/types.d.ts +13 -0
  67. package/dist/components/color-field/variants.js +1 -0
  68. package/dist/components/color-picker/color-picker.js +1 -0
  69. package/dist/components/color-picker/color-picker.vue.d.ts +55 -0
  70. package/dist/components/color-picker/index.d.ts +2 -0
  71. package/dist/components/color-picker/index.js +1 -0
  72. package/dist/components/color-picker/shared.js +1 -0
  73. package/dist/components/color-picker/types.d.ts +47 -0
  74. package/dist/components/color-picker/variants.js +1 -0
  75. package/dist/components/color-slider/color-slider.js +1 -0
  76. package/dist/components/color-slider/color-slider.vue.d.ts +23 -0
  77. package/dist/components/color-slider/index.d.ts +4 -0
  78. package/dist/components/color-slider/index.js +1 -0
  79. package/dist/components/color-slider/types.d.ts +16 -0
  80. package/dist/components/color-swatch/color-swatch.js +1 -0
  81. package/dist/components/color-swatch/color-swatch.vue.d.ts +18 -0
  82. package/dist/components/color-swatch/index.d.ts +5 -0
  83. package/dist/components/color-swatch/index.js +1 -0
  84. package/dist/components/color-swatch/types.d.ts +16 -0
  85. package/dist/components/color-swatch/variants.d.ts +108 -0
  86. package/dist/components/color-swatch/variants.js +1 -0
  87. package/dist/components/color-swatch-picker/color-swatch-picker.js +1 -0
  88. package/dist/components/color-swatch-picker/color-swatch-picker.vue.d.ts +39 -0
  89. package/dist/components/color-swatch-picker/index.d.ts +5 -0
  90. package/dist/components/color-swatch-picker/index.js +1 -0
  91. package/dist/components/color-swatch-picker/types.d.ts +20 -0
  92. package/dist/components/color-swatch-picker/variants.d.ts +153 -0
  93. package/dist/components/color-swatch-picker/variants.js +1 -0
  94. package/dist/components/combobox/combobox-group-option.js +1 -0
  95. package/dist/components/combobox/combobox-option.js +1 -0
  96. package/dist/components/combobox/combobox-single-option.js +1 -0
  97. package/dist/components/combobox/combobox.js +1 -0
  98. package/dist/components/combobox/combobox.vue.d.ts +76 -0
  99. package/dist/components/combobox/index.d.ts +4 -0
  100. package/dist/components/combobox/index.js +1 -0
  101. package/dist/components/combobox/shared.js +1 -0
  102. package/dist/components/combobox/types.d.ts +68 -0
  103. package/dist/components/combobox/variants.js +1 -0
  104. package/dist/components/config-provider/config-provider.js +1 -1
  105. package/dist/components/config-provider/context.js +1 -1
  106. package/dist/components/config-provider/types.d.ts +14 -2
  107. package/dist/components/context-menu/context-menu-checkbox.js +1 -1
  108. package/dist/components/context-menu/context-menu-checkbox.vue.d.ts +8 -15
  109. package/dist/components/context-menu/context-menu-radio.js +1 -1
  110. package/dist/components/context-menu/context-menu-radio.vue.d.ts +8 -15
  111. package/dist/components/context-menu/context-menu-wrapper.js +1 -1
  112. package/dist/components/context-menu/context-menu-wrapper.vue.d.ts +5 -5
  113. package/dist/components/context-menu/context-menu.js +1 -1
  114. package/dist/components/context-menu/context-menu.vue.d.ts +7 -15
  115. package/dist/components/context-menu/index.d.ts +5 -7
  116. package/dist/components/context-menu/types.d.ts +14 -42
  117. package/dist/components/dialog/dialog-pure.vue.d.ts +1 -1
  118. package/dist/components/dialog/dialog.vue.d.ts +1 -1
  119. package/dist/components/drawer/drawer.vue.d.ts +1 -1
  120. package/dist/components/dropdown-menu/dropdown-menu-checkbox.js +1 -1
  121. package/dist/components/dropdown-menu/dropdown-menu-checkbox.vue.d.ts +8 -15
  122. package/dist/components/dropdown-menu/dropdown-menu-radio.js +1 -1
  123. package/dist/components/dropdown-menu/dropdown-menu-radio.vue.d.ts +8 -15
  124. package/dist/components/dropdown-menu/dropdown-menu-wrapper.js +1 -1
  125. package/dist/components/dropdown-menu/dropdown-menu-wrapper.vue.d.ts +5 -5
  126. package/dist/components/dropdown-menu/dropdown-menu.js +1 -1
  127. package/dist/components/dropdown-menu/dropdown-menu.vue.d.ts +7 -15
  128. package/dist/components/dropdown-menu/index.d.ts +2 -4
  129. package/dist/components/dropdown-menu/index.js +1 -1
  130. package/dist/components/dropdown-menu/types.d.ts +14 -38
  131. package/dist/components/editable/editable.js +1 -0
  132. package/dist/components/editable/editable.vue.d.ts +85 -0
  133. package/dist/components/editable/index.d.ts +4 -0
  134. package/dist/components/editable/index.js +1 -0
  135. package/dist/components/editable/types.d.ts +20 -0
  136. package/dist/components/editable/variants.js +1 -0
  137. package/dist/components/empty/empty.js +1 -0
  138. package/dist/components/empty/empty.vue.d.ts +21 -0
  139. package/dist/components/empty/index.d.ts +5 -0
  140. package/dist/components/empty/index.js +1 -0
  141. package/dist/components/empty/types.d.ts +20 -0
  142. package/dist/components/empty/variants.d.ts +57 -0
  143. package/dist/components/empty/variants.js +1 -0
  144. package/dist/components/hover-card/hover-card.js +1 -0
  145. package/dist/components/hover-card/hover-card.vue.d.ts +35 -0
  146. package/dist/components/hover-card/index.d.ts +4 -0
  147. package/dist/components/hover-card/index.js +1 -0
  148. package/dist/components/hover-card/types.d.ts +22 -0
  149. package/dist/components/hover-card/variants.js +1 -0
  150. package/dist/components/icon/types.d.ts +3 -4
  151. package/dist/components/link/link.vue.d.ts +1 -1
  152. package/dist/components/menu/context.js +1 -1
  153. package/dist/components/menu/index.d.ts +2 -7
  154. package/dist/components/menu/index.js +1 -1
  155. package/dist/components/menu/types.d.ts +9 -86
  156. package/dist/components/menu/variants.js +1 -1
  157. package/dist/components/menubar/index.d.ts +2 -0
  158. package/dist/components/menubar/index.js +1 -0
  159. package/dist/components/menubar/menubar.js +1 -0
  160. package/dist/components/{menu/menu-option.vue.d.ts → menubar/menubar.vue.d.ts} +8 -24
  161. package/dist/components/menubar/types.d.ts +17 -0
  162. package/dist/components/menubar/variants.js +1 -0
  163. package/dist/components/navigation-menu/navigation-menu.vue.d.ts +2 -2
  164. package/dist/components/page-tabs/page-tabs.vue.d.ts +2 -2
  165. package/dist/components/page-tabs/types.d.ts +1 -1
  166. package/dist/components/popconfirm/popconfirm-cancel.js +1 -1
  167. package/dist/components/popconfirm/popconfirm-confirm.js +1 -1
  168. package/dist/components/popconfirm/popconfirm.vue.d.ts +1 -1
  169. package/dist/components/popover/popover.js +1 -1
  170. package/dist/components/progress/context.d.ts +5 -0
  171. package/dist/components/progress/context.js +1 -0
  172. package/dist/components/progress/index.d.ts +8 -0
  173. package/dist/components/progress/index.js +1 -0
  174. package/dist/components/progress/loading-bar.js +1 -0
  175. package/dist/components/progress/loading-bar.vue.d.ts +25 -0
  176. package/dist/components/progress/progress-circle.js +1 -0
  177. package/dist/components/progress/progress-circle.vue.d.ts +29 -0
  178. package/dist/components/progress/progress.js +1 -0
  179. package/dist/components/progress/progress.vue.d.ts +30 -0
  180. package/dist/components/progress/shared.d.ts +7 -0
  181. package/dist/components/progress/shared.js +1 -0
  182. package/dist/components/progress/types.d.ts +43 -0
  183. package/dist/components/progress/variants.js +1 -0
  184. package/dist/components/scroll-area/index.d.ts +4 -0
  185. package/dist/components/scroll-area/index.js +1 -0
  186. package/dist/components/scroll-area/scroll-area.js +1 -0
  187. package/dist/components/scroll-area/scroll-area.vue.d.ts +18 -0
  188. package/dist/components/scroll-area/types.d.ts +15 -0
  189. package/dist/components/scroll-area/variants.js +1 -0
  190. package/dist/components/select/select.vue.d.ts +2 -2
  191. package/dist/components/skeleton/index.d.ts +3 -0
  192. package/dist/components/skeleton/index.js +1 -0
  193. package/dist/components/skeleton/skeleton.js +1 -0
  194. package/dist/components/skeleton/skeleton.vue.d.ts +20 -0
  195. package/dist/components/skeleton/types.d.ts +16 -0
  196. package/dist/components/skeleton/variants.d.ts +60 -0
  197. package/dist/components/skeleton/variants.js +1 -0
  198. package/dist/components/slider/index.d.ts +4 -0
  199. package/dist/components/slider/index.js +1 -0
  200. package/dist/components/slider/slider.js +1 -0
  201. package/dist/components/slider/slider.vue.d.ts +28 -0
  202. package/dist/components/slider/types.d.ts +16 -0
  203. package/dist/components/slider/variants.js +1 -0
  204. package/dist/components/spinner/index.d.ts +2 -0
  205. package/dist/components/spinner/index.js +1 -0
  206. package/dist/components/spinner/spinner.js +1 -0
  207. package/dist/components/spinner/spinner.vue.d.ts +10 -0
  208. package/dist/components/spinner/types.d.ts +19 -0
  209. package/dist/components/spinner/variants.js +1 -0
  210. package/dist/components/splitter/index.d.ts +5 -0
  211. package/dist/components/splitter/index.js +1 -0
  212. package/dist/components/splitter/splitter-group.js +1 -0
  213. package/dist/components/splitter/splitter-group.vue.d.ts +22 -0
  214. package/dist/components/splitter/splitter-panel.js +1 -0
  215. package/dist/components/splitter/splitter-panel.vue.d.ts +32 -0
  216. package/dist/components/splitter/splitter-resize-handle.js +1 -0
  217. package/dist/components/splitter/splitter-resize-handle.vue.d.ts +415 -0
  218. package/dist/components/splitter/types.d.ts +12 -0
  219. package/dist/components/splitter/variants.js +1 -0
  220. package/dist/components/stepper/index.d.ts +4 -0
  221. package/dist/components/stepper/index.js +1 -0
  222. package/dist/components/stepper/stepper.js +1 -0
  223. package/dist/components/stepper/stepper.vue.d.ts +121 -0
  224. package/dist/components/stepper/types.d.ts +26 -0
  225. package/dist/components/stepper/variants.js +1 -0
  226. package/dist/components/table/hooks.d.ts +5 -5
  227. package/dist/components/table/hooks.js +1 -1
  228. package/dist/components/table/index.d.ts +1 -1
  229. package/dist/components/table/table-filter-popover.js +1 -0
  230. package/dist/components/table/table-radio.js +1 -1
  231. package/dist/components/table/table.js +1 -1
  232. package/dist/components/table/table.vue.d.ts +7 -3
  233. package/dist/components/table/types.d.ts +25 -83
  234. package/dist/components/table/variants.js +1 -1
  235. package/dist/components/tags-input/index.d.ts +5 -0
  236. package/dist/components/tags-input/index.js +1 -0
  237. package/dist/components/tags-input/tags-input-item-delete.js +1 -0
  238. package/dist/components/tags-input/tags-input-item-delete.vue.d.ts +18 -0
  239. package/dist/components/tags-input/tags-input.js +1 -0
  240. package/dist/components/tags-input/tags-input.vue.d.ts +29 -0
  241. package/dist/components/tags-input/types.d.ts +12 -0
  242. package/dist/components/tags-input/variants.js +1 -0
  243. package/dist/components/toast/index.d.ts +4 -5
  244. package/dist/components/toast/index.js +1 -1
  245. package/dist/components/toast/styles.js +274 -0
  246. package/dist/components/toast/toaster.js +1 -0
  247. package/dist/components/toast/toaster.vue.d.ts +22 -0
  248. package/dist/components/toast/types.d.ts +5 -55
  249. package/dist/components/toast/variants.js +1 -1
  250. package/dist/components/toggle/index.d.ts +3 -0
  251. package/dist/components/toggle/index.js +1 -0
  252. package/dist/components/toggle/toggle.js +1 -0
  253. package/dist/components/toggle/toggle.vue.d.ts +30 -0
  254. package/dist/components/toggle/types.d.ts +14 -0
  255. package/dist/components/toggle/variants.d.ts +100 -0
  256. package/dist/components/toggle/variants.js +1 -0
  257. package/dist/components/toggle-group/index.d.ts +6 -0
  258. package/dist/components/toggle-group/index.js +1 -0
  259. package/dist/components/toggle-group/toggle-group-item.js +1 -0
  260. package/dist/components/toggle-group/toggle-group-item.vue.d.ts +22 -0
  261. package/dist/components/toggle-group/toggle-group.js +1 -0
  262. package/dist/components/toggle-group/toggle-group.vue.d.ts +24 -0
  263. package/dist/components/toggle-group/types.d.ts +15 -0
  264. package/dist/components/toggle-group/variants.d.ts +216 -0
  265. package/dist/components/toggle-group/variants.js +1 -0
  266. package/dist/components/toolbar/index.d.ts +4 -0
  267. package/dist/components/toolbar/index.js +1 -0
  268. package/dist/components/toolbar/toolbar.js +1 -0
  269. package/dist/components/toolbar/toolbar.vue.d.ts +18 -0
  270. package/dist/components/toolbar/types.d.ts +9 -0
  271. package/dist/components/toolbar/variants.js +1 -0
  272. package/dist/components/tree-menu/tree-menu-option-slot.js +1 -1
  273. package/dist/components/tree-menu/types.d.ts +1 -1
  274. package/dist/components/tree-menu/variants.js +1 -1
  275. package/dist/constants/components.d.ts +27 -0
  276. package/dist/constants/components.js +1 -1
  277. package/dist/index.d.ts +179 -94
  278. package/dist/index.js +1 -1
  279. package/dist/styles.css +597 -111
  280. package/dist/theme/config.js +1 -1
  281. package/package.json +21 -18
  282. package/dist/components/menu/menu-checkbox-options.js +0 -1
  283. package/dist/components/menu/menu-checkbox-options.vue.d.ts +0 -28
  284. package/dist/components/menu/menu-item-slot.js +0 -1
  285. package/dist/components/menu/menu-option.js +0 -1
  286. package/dist/components/menu/menu-options.js +0 -1
  287. package/dist/components/menu/menu-options.vue.d.ts +0 -48
  288. package/dist/components/menu/menu-radio-options.js +0 -1
  289. package/dist/components/menu/menu-radio-options.vue.d.ts +0 -28
  290. package/dist/components/menu/shared.js +0 -1
  291. package/dist/components/table/shared.js +0 -1
  292. package/dist/components/toast/context.d.ts +0 -5
  293. package/dist/components/toast/context.js +0 -1
  294. package/dist/components/toast/shared.js +0 -1
  295. package/dist/components/toast/toast-provider.js +0 -1
  296. package/dist/components/toast/toast.js +0 -1
  297. package/dist/components/toast/toast.vue.d.ts +0 -21
  298. package/dist/components/toast/variants.d.ts +0 -60
package/README.md CHANGED
@@ -15,10 +15,77 @@ SoybeanUI is an elegant, modern, accessible and high-quality UI component librar
15
15
 
16
16
  ## 📚 Architecture
17
17
 
18
- SoybeanUI consists of two main packages:
18
+ SoybeanUI is built on a strict **two-layer separation** model:
19
19
 
20
- - **@soybeanjs/headless**: The logic layer. It handles state management, accessibility (A11y), keyboard interactions, and focus management. It is completely unstyled, giving you maximum control if you want to build your own design system.
21
- - **@soybeanjs/ui**: The presentation layer. It wraps the headless components with beautiful, customizable styles using UnoCSS (via `tailwind-variants`). It is ready to use out of the box.
20
+ ```
21
+ ┌─────────────────────────────────────────┐
22
+ │ @soybeanjs/ui (src/) │
23
+ │ S-prefixed components (SButton…) │
24
+ │ UnoCSS classes · tailwind-variants │
25
+ │ provideXUi(ui) ──────────────────┐ │
26
+ └────────────────────────────────────┼────┘
27
+ │ style injection
28
+ ┌────────────────────────────────────▼────┐
29
+ │ @soybeanjs/headless (headless/) │
30
+ │ Logic · State · A11y · Keyboard nav │
31
+ │ useUiContext() reads injected classes │
32
+ │ Zero styles — works with any CSS │
33
+ └─────────────────────────────────────────┘
34
+ ```
35
+
36
+ ### Packages
37
+
38
+ | Package | Role | Components |
39
+ | ----------------------- | --------------------------------- | ----------------------------- |
40
+ | **@soybeanjs/headless** | Logic, state, a11y. Zero styles. | 50 primitives, 26 composables |
41
+ | **@soybeanjs/ui** | Styled wrappers. UnoCSS + `tv()`. | 48 `S`-prefixed components |
42
+
43
+ **Data flow is strictly one-way**: `headless` → `src`. The styled layer never imports from headless's internals — it injects style tokens via `provideXUi(computedUi)` which headless components read through `useUiContext()`.
44
+
45
+ Some multi-slot headless components also expose `Compact` aggregators, such as `AccordionCompact` and `TableCompact`. They keep item iteration and default content/icon composition inside headless, while the UI layer stays focused on styling and prop forwarding.
46
+
47
+ ### Style Injection
48
+
49
+ Every multi-slot headless component exposes a `provide{Name}Ui` function. The styled wrapper computes classes using `tailwind-variants` and injects them:
50
+
51
+ ```ts
52
+ // In the styled wrapper (src/)
53
+ const ui = computed(() =>
54
+ mergeSlotVariants(
55
+ accordionVariants({ size: props.size }), // tv() output
56
+ props.ui, // user overrides
57
+ { root: props.class } // class prop
58
+ )
59
+ );
60
+ provideAccordionUi(ui); // headless reads this via useAccordionUi()
61
+ ```
62
+
63
+ ### Theme System
64
+
65
+ - **`ThemeColor`** — 8 semantic colors: `primary` · `destructive` · `success` · `warning` · `info` · `carbon` · `secondary` · `accent`
66
+ - **`ThemeSize`** — 6 sizes: `xs` · `sm` · `md` · `lg` · `xl` · `2xl` (base 16px at `md`)
67
+ - **`ConfigProvider`** — sets global `dir`, `locale`, `nonce`, and default `tooltip` config for the entire component tree
68
+ - **`cn()`** — Tailwind-aware class merge (`clsx` + `tailwind-merge`), used for conflict-free class composition
69
+
70
+ ### Package Exports
71
+
72
+ **@soybeanjs/headless** ships fine-grained sub-paths:
73
+
74
+ ```ts
75
+ import { AccordionRoot } from '@soybeanjs/headless'; // all components
76
+ import { useControllableState } from '@soybeanjs/headless/composables'; // 26 composables
77
+ import { transformPropsToContext } from '@soybeanjs/headless/shared'; // pure TS utils
78
+ import * as Headless from '@soybeanjs/headless/namespaced'; // namespace object
79
+ import type { AccordionUiSlot } from '@soybeanjs/headless/accordion'; // per-component
80
+ ```
81
+
82
+ **@soybeanjs/ui** exports:
83
+
84
+ ```ts
85
+ import { SButton, SAccordion } from '@soybeanjs/ui'; // all components
86
+ import '@soybeanjs/ui/styles.css'; // pre-built UnoCSS stylesheet
87
+ // Also: @soybeanjs/ui/nuxt · @soybeanjs/ui/resolver
88
+ ```
22
89
 
23
90
  ## 📦 Installation
24
91
 
@@ -85,6 +152,8 @@ export default defineNuxtConfig({
85
152
 
86
153
  The headless components provide the functionality without the styles.
87
154
 
155
+ For data-driven multi-slot patterns, prefer the exported `Compact` variant when it exists. It is the headless entry point for opinionated composition, while the regular parts remain available for fully manual assembly.
156
+
88
157
  ```vue
89
158
  <script setup>
90
159
  import { AccordionRoot, AccordionItem, AccordionTrigger, AccordionContent } from '@soybeanjs/headless';
@@ -102,11 +171,13 @@ import { AccordionRoot, AccordionItem, AccordionTrigger, AccordionContent } from
102
171
 
103
172
  ## ✨ Features
104
173
 
105
- - **Accessible**: Follows WAI-ARIA patterns for accessibility.
106
- - **Headless**: Logic and styles are separated.
107
- - **Type Safe**: Written in TypeScript with full type support.
108
- - **Customizable**: Built with UnoCSS and `tailwind-variants` for easy theming.
109
- - **Lightweight**: Tree-shakable components.
174
+ - **Accessible**: Follows WAI-ARIA patterns for roles, focus management, and keyboard navigation.
175
+ - **Headless-first**: Logic and styles are fully separated — use `@soybeanjs/headless` alone to build any design system.
176
+ - **Type Safe**: Written in strict TypeScript. All props, emits, slots, and context values are typed.
177
+ - **Customizable at every level**: Override individual slot classes via the `ui` prop, or swap the entire style layer.
178
+ - **Lightweight & Tree-shakable**: Import only the components you use. Each component is individually tree-shakable.
179
+ - **Nuxt ready**: First-class Nuxt module with auto-registration (`@soybeanjs/ui/nuxt`).
180
+ - **unplugin support**: Auto-import resolver for `unplugin-vue-components` (`@soybeanjs/ui/resolver`).
110
181
 
111
182
  ## 💝 Credits
112
183
 
@@ -116,142 +187,3 @@ import { AccordionRoot, AccordionItem, AccordionTrigger, AccordionContent } from
116
187
  - [shadcn/ui](https://github.com/shadcn/ui)
117
188
  - [nuxt-ui](https://github.com/nuxt/ui)
118
189
  - [unocss](https://github.com/unocss/unocss)
119
-
120
- ## 🗺️ Roadmap
121
-
122
- ### Components
123
-
124
- ✅: Completed ✨: Implemented
125
-
126
- ✅ 49 / total: 108
127
-
128
- | No | Priority | Name | Status | Alias | 📝 Note |
129
- | --- | -------- | --------------- | ------------ | ------------------------ | ------------------------ |
130
- | 1 | 1 | Accordion | ✅ Completed | | |
131
- | 2 | 1 | Alert | ✅ Completed | | |
132
- | 3 | 1 | AlertDialog | ✅ Completed | | |
133
- | 4 | 1 | Arrow | ✅ Completed | | |
134
- | 5 | 1 | AspectRatio | ✅ Completed | | |
135
- | 6 | 1 | Avatar | ✅ Completed | | |
136
- | 7 | 1 | Badge | ✅ Completed | Chip | |
137
- | 8 | 1 | Breadcrumb | ✅ Completed | | |
138
- | 9 | 1 | Button | ✅ Completed | | ✨ support loading |
139
- | 10 | 1 | Card | ✅ Completed | | |
140
- | 11 | 1 | Checkbox | ✅ Completed | | ✨ support checkbox card |
141
- | 12 | 1 | Collapsible | ✅ Completed | | |
142
- | 13 | 1 | Command | ✅ Completed | | |
143
- | 14 | 1 | ConfigProvider | ✅ Completed | | |
144
- | 15 | 1 | ContextMenu | ✅ Completed | | |
145
- | 16 | 1 | Dialog | ✅ Completed | | |
146
- | 17 | 1 | Drawer | ✅ Completed | Sheet | |
147
- | 18 | 1 | DropdownMenu | ✅ Completed | | ✨ support hover trigger |
148
- | 19 | 1 | Form | ✅ Completed | | |
149
- | 20 | 1 | Icon | ✅ Completed | | ✨ based on iconify |
150
- | 21 | 1 | Input | ✅ Completed | | |
151
- | 22 | 1 | InputNumber | ✅ Completed | NumberField, NumberInput | |
152
- | 23 | 1 | Kbd | ✅ Completed | | |
153
- | 24 | 1 | Label | ✅ Completed | | |
154
- | 25 | 1 | Layout | ✅ Completed | | |
155
- | 26 | 1 | Link | ✅ Completed | | |
156
- | 27 | 1 | List | ✅ Completed | | |
157
- | 28 | 1 | Listbox | ✅ Completed | | |
158
- | 29 | 1 | Menu | ✅ Completed | | |
159
- | 30 | 1 | NavigationMenu | ✅ Completed | | |
160
- | 31 | 1 | Pagination | ✅ Completed | | |
161
- | 32 | 1 | Password | ✅ Completed | | |
162
- | 33 | 1 | Popover | ✅ Completed | | |
163
- | 34 | 1 | RadioGroup | ✅ Completed | | ✨ support radio card |
164
- | 35 | 1 | Segment | ✅ Completed | | |
165
- | 36 | 1 | Select | ✅ Completed | | |
166
- | 37 | 1 | Separator | ✅ Completed | Divider | |
167
- | 38 | 1 | Switch | ✅ Completed | | ✨ support switch card |
168
- | 39 | 1 | Tabs | ✅ Completed | | |
169
- | 40 | 1 | Tag | ✅ Completed | Badge(shadcn-ui) | |
170
- | 41 | 1 | Textarea | ✅ Completed | | ✨ support auto size |
171
- | 42 | 1 | Toast | ✅ Completed | Sonner | migrate from vue-sonner |
172
- | 43 | 1 | Tooltip | ✅ Completed | | |
173
- | 44 | 1 | Tree | ✅ Completed | | ✨ support virtualized |
174
- | 45 | 1 | TreeMenu | ✅ Completed | | |
175
- | 46 | 1 | Virtualizer | ✅ Completed | | |
176
- | 47 | 1 | VisuallyHidden | ✅ Completed | | |
177
- | 48 | 2 | PageTabs | ✅ Completed | | |
178
- | 49 | 2 | Popconfirm | ✅ Completed | | |
179
- | 50 | 2 | ColorPicker | | | |
180
- | 51 | 2 | Combobox | | | support virtualized |
181
- | 52 | 2 | DataTable | | | support virtualized |
182
- | 53 | 2 | Menubar | | | |
183
- | 54 | 2 | PinInput | | InputOPT, OPTInput | |
184
- | 55 | 2 | Progress | | | include circle |
185
- | 56 | 2 | ScrollArea | | | |
186
- | 57 | 2 | Skeleton | | | |
187
- | 58 | 2 | Slider | | | |
188
- | 59 | 2 | Table | | | |
189
- | 60 | 2 | Toggle | | | |
190
- | 61 | 2 | ToggleGroup | | | |
191
- | 62 | 3 | BottomSheet | | Drawer(shadcn-ui) | |
192
- | 63 | 3 | Calendar | | | v-calendar |
193
- | 64 | 3 | Carousel | | | |
194
- | 65 | 3 | DateField | | | |
195
- | 66 | 3 | DatePicker | | | |
196
- | 67 | 3 | DateRangeField | | | |
197
- | 68 | 3 | DateRangePicker | | | |
198
- | 69 | 3 | Editable | | | |
199
- | 70 | 3 | HoverCard | | | |
200
- | 71 | 3 | RangeCalendar | | | v-calendar |
201
- | 72 | 3 | Resizable | | | |
202
- | 73 | 3 | Splitter | | | |
203
- | 74 | 3 | Stepper | | | |
204
- | 75 | 3 | TagsInput | | | |
205
- | 76 | 3 | TimeField | | | |
206
- | 77 | 3 | Timeline | | | ui things |
207
- | 78 | 3 | TimePicker | | | element-plus |
208
- | 79 | 3 | Toolbar | | | |
209
- | 80 | 4 | Affix | | | |
210
- | 81 | 4 | Anchor | | | |
211
- | 82 | 4 | AutoComplete | | | support virtualized |
212
- | 83 | 4 | Backtop | | | |
213
- | 84 | 4 | Cascader | | | support virtualized |
214
- | 85 | 4 | Clipboard | | | |
215
- | 86 | 4 | Code | | | |
216
- | 87 | 4 | Comment | | | |
217
- | 88 | 4 | Countdown | | | |
218
- | 89 | 4 | CurrencyInput | | | |
219
- | 90 | 4 | Descriptions | | | |
220
- | 91 | 4 | Ellipsis | | | |
221
- | 92 | 4 | Empty | | | |
222
- | 93 | 4 | Equation | | | based on katex |
223
- | 94 | 4 | InfiniteScroll | | | |
224
- | 95 | 4 | Mention | | | element-plus |
225
- | 96 | 4 | Navbar | | | |
226
- | 97 | 4 | NumberAnimation | | | naive-ui |
227
- | 98 | 4 | QRCode | | | |
228
- | 99 | 4 | Rating | | Rate | element-plus |
229
- | 100 | 4 | Result | | | |
230
- | 101 | 4 | Spinner | | Loader, Spin | github ldrs |
231
- | 102 | 4 | Statistic | | | |
232
- | 103 | 4 | Tour | | | |
233
- | 104 | 4 | Transfer | | | |
234
- | 105 | 4 | TreeSelect | | | |
235
- | 106 | 4 | Typography | | | shadcn-ui |
236
- | 107 | 4 | Upload | | FileUpload, Dropfile | |
237
- | 108 | 4 | Watermark | | | |
238
-
239
- ### Utilities
240
-
241
- ✅ 12 / total: 13
242
-
243
- | No. | Priority | Name | Status | 📝 Note |
244
- | --- | -------- | ------------------- | ------------ | -------------- |
245
- | 1 | 1 | Popper | ✅ Completed | |
246
- | 2 | 1 | Portal | ✅ Completed | alias Teleport |
247
- | 3 | 1 | Primitive | ✅ Completed | |
248
- | 4 | 1 | RovingFocus | ✅ Completed | |
249
- | 5 | 1 | Slot | ✅ Completed | |
250
- | 6 | 1 | useCollection | ✅ Completed | |
251
- | 7 | 1 | useDismissableLayer | ✅ Completed | |
252
- | 8 | 1 | useFocusGuards | ✅ Completed | |
253
- | 9 | 1 | useFocusScope | ✅ Completed | |
254
- | 10 | 1 | usePresence | ✅ Completed | |
255
- | 11 | 1 | useDialog | ✅ Completed | |
256
- | 12 | 1 | useToast | ✅ Completed | |
257
- | 13 | 2 | useLoadingBar | | |
package/README.zh-CN.md CHANGED
@@ -15,10 +15,77 @@ SoybeanUI 是一个优雅、现代、可访问且高质量的 UI 组件库,具
15
15
 
16
16
  ## 📚 架构
17
17
 
18
- SoybeanUI 由两个主要包组成:
18
+ SoybeanUI 采用严格的**双层分离**设计:
19
19
 
20
- - **@soybeanjs/headless**: 逻辑层。它处理状态管理、可访问性 (A11y)、键盘交互和焦点管理。它完全不包含样式,如果您想构建自己的设计系统,它能为您提供最大的控制权。
21
- - **@soybeanjs/ui**: 表现层。它使用 UnoCSS (通过 `tailwind-variants`) 为 Headless 组件包装了美观、可定制的样式。它开箱即用。
20
+ ```
21
+ ┌─────────────────────────────────────────┐
22
+ │ @soybeanjs/ui (src/) │
23
+ │ S 前缀组件 (SButton、SDialog…) │
24
+ │ UnoCSS 类名 · tailwind-variants │
25
+ │ provideXUi(ui) ──────────────────┐ │
26
+ └────────────────────────────────────┼────┘
27
+ │ 样式注入
28
+ ┌────────────────────────────────────▼────┐
29
+ │ @soybeanjs/headless (headless/) │
30
+ │ 逻辑 · 状态 · A11y · 键盘导航 │
31
+ │ useUiContext() 读取注入的样式类名 │
32
+ │ 零样式 — 可配合任意 CSS 方案 │
33
+ └─────────────────────────────────────────┘
34
+ ```
35
+
36
+ ### 包结构
37
+
38
+ | 包 | 职责 | 组件数量 |
39
+ | ----------------------- | --------------------------- | ----------------------------- |
40
+ | **@soybeanjs/headless** | 逻辑、状态、a11y,零样式 | 50 个原语件,26 个 composable |
41
+ | **@soybeanjs/ui** | 样式包装层。UnoCSS + `tv()` | 48 个带 `S` 前缀的组件 |
42
+
43
+ **数据流严格单向**:`headless` → `src`。样式层不会导入 headless 的内部实现,而是通过 `provideXUi(computedUi)` 注入样式 token,headless 组件再通过 `useUiContext()` 读取。
44
+
45
+ 部分多插槽 headless 组件还会暴露 `Compact` 聚合层,例如 `AccordionCompact` 和 `TableCompact`。它们把条目遍历以及默认内容 / 图标组合放在 headless 层完成,而 UI 层只负责样式和 props 转发。
46
+
47
+ ### 样式注入机制
48
+
49
+ 每个多橪位的 headless 组件都有对应的 `provide{Name}Ui` 函数。样式层通过 `tailwind-variants` 计算类名后注入:
50
+
51
+ ```ts
52
+ // 样式包装层 (src/) 中
53
+ const ui = computed(() =>
54
+ mergeSlotVariants(
55
+ accordionVariants({ size: props.size }), // tv() 计算结果
56
+ props.ui, // 用户自定义覆盖
57
+ { root: props.class } // class prop 合并
58
+ )
59
+ );
60
+ provideAccordionUi(ui); // headless 通过 useAccordionUi() 读取
61
+ ```
62
+
63
+ ### 主题系统
64
+
65
+ - **`ThemeColor`** — 8 种语义色:`primary` · `destructive` · `success` · `warning` · `info` · `carbon` · `secondary` · `accent`
66
+ - **`ThemeSize`** — 6 种尺寸:`xs` · `sm` · `md` · `lg` · `xl` · `2xl`(基准尺寸 `md` = 16px)
67
+ - **`ConfigProvider`** — 全局设置 `dir`、`locale`、`nonce` 及默认 `tooltip` 配置,应用于整个组件树
68
+ - **`cn()`** — Tailwind 感知的类名合并工具(`clsx` + `tailwind-merge`),解决类名冲突
69
+
70
+ ### 包导出
71
+
72
+ **@soybeanjs/headless** 提供精细化子路径导出:
73
+
74
+ ```ts
75
+ import { AccordionRoot } from '@soybeanjs/headless'; // 所有组件
76
+ import { useControllableState } from '@soybeanjs/headless/composables'; // 26 个 composable
77
+ import { transformPropsToContext } from '@soybeanjs/headless/shared'; // 纯 TS 工具
78
+ import * as Headless from '@soybeanjs/headless/namespaced'; // 命名空间导入
79
+ import type { AccordionUiSlot } from '@soybeanjs/headless/accordion'; // 单组件类型
80
+ ```
81
+
82
+ **@soybeanjs/ui** 导出:
83
+
84
+ ```ts
85
+ import { SButton, SAccordion } from '@soybeanjs/ui'; // 所有组件
86
+ import '@soybeanjs/ui/styles.css'; // 预构建的 UnoCSS 样式表
87
+ // 同时提供:@soybeanjs/ui/nuxt · @soybeanjs/ui/resolver
88
+ ```
22
89
 
23
90
  ## 📦 安装
24
91
 
@@ -85,6 +152,8 @@ export default defineNuxtConfig({
85
152
 
86
153
  Headless 组件提供功能但不包含样式。
87
154
 
155
+ 对于数据驱动的多插槽场景,如果组件提供了 `Compact` 版本,优先使用它。它是 headless 层的约定式组合入口,而基础分片仍然保留给需要完全手动拼装的场景。
156
+
88
157
  ```vue
89
158
  <script setup>
90
159
  import { AccordionRoot, AccordionItem, AccordionTrigger, AccordionContent } from '@soybeanjs/headless';
@@ -102,11 +171,13 @@ import { AccordionRoot, AccordionItem, AccordionTrigger, AccordionContent } from
102
171
 
103
172
  ## ✨ 特性
104
173
 
105
- - **可访问性**: 遵循 WAI-ARIA 模式以实现可访问性。
106
- - **Headless**: 逻辑与样式分离。
107
- - **类型安全**: 使用 TypeScript 编写,提供完整的类型支持。
108
- - **可定制**: 基于 UnoCSS 和 `tailwind-variants` 构建,易于主题化。
109
- - **轻量级**: 支持 Tree-shaking 的组件。
174
+ - **可访问性**:遵循 WAI-ARIA 模式,内置角色、焦点管理与键盘导航。
175
+ - **Headless 优先**:逻辑与样式完全分离—单独使用 `@soybeanjs/headless` 可构建任意设计系统。
176
+ - **类型安全**:严格 TypeScript 编写,所有 props、emits、slot 及 context 均有完整类型。
177
+ - **多级自定义**:通过 `ui` prop 覆盖单个橪位类名,也可替换整个样式层。
178
+ - **轻量可摇树**:每个组件独立 Tree-shakable,按需引入。
179
+ - **Nuxt 就绪**:提供官方 Nuxt 模块,支持组件自动注册(`@soybeanjs/ui/nuxt`)。
180
+ - **unplugin 支持**:提供 `unplugin-vue-components` 自动导入解析器(`@soybeanjs/ui/resolver`)。
110
181
 
111
182
  ## 💝 致谢
112
183
 
@@ -116,142 +187,3 @@ import { AccordionRoot, AccordionItem, AccordionTrigger, AccordionContent } from
116
187
  - [shadcn/ui](https://github.com/shadcn/ui)
117
188
  - [nuxt-ui](https://github.com/nuxt/ui)
118
189
  - [unocss](https://github.com/unocss/unocss)
119
-
120
- ## 🗺️ 路线图
121
-
122
- ### 组件
123
-
124
- ✅: 已完成 ✨: 已实现
125
-
126
- ✅ 49 / 总计: 108
127
-
128
- | No | Priority | Name | Status | Alias | 📝 Note |
129
- | --- | -------- | --------------- | ------------ | ------------------------ | ------------------------ |
130
- | 1 | 1 | Accordion | ✅ Completed | | |
131
- | 2 | 1 | Alert | ✅ Completed | | |
132
- | 3 | 1 | AlertDialog | ✅ Completed | | |
133
- | 4 | 1 | Arrow | ✅ Completed | | |
134
- | 5 | 1 | AspectRatio | ✅ Completed | | |
135
- | 6 | 1 | Avatar | ✅ Completed | | |
136
- | 7 | 1 | Badge | ✅ Completed | Chip | |
137
- | 8 | 1 | Breadcrumb | ✅ Completed | | |
138
- | 9 | 1 | Button | ✅ Completed | | ✨ support loading |
139
- | 10 | 1 | Card | ✅ Completed | | |
140
- | 11 | 1 | Checkbox | ✅ Completed | | ✨ support checkbox card |
141
- | 12 | 1 | Collapsible | ✅ Completed | | |
142
- | 13 | 1 | Command | ✅ Completed | | |
143
- | 14 | 1 | ConfigProvider | ✅ Completed | | |
144
- | 15 | 1 | ContextMenu | ✅ Completed | | |
145
- | 16 | 1 | Dialog | ✅ Completed | | |
146
- | 17 | 1 | Drawer | ✅ Completed | Sheet | |
147
- | 18 | 1 | DropdownMenu | ✅ Completed | | ✨ support hover trigger |
148
- | 19 | 1 | Form | ✅ Completed | | |
149
- | 20 | 1 | Icon | ✅ Completed | | ✨ based on iconify |
150
- | 21 | 1 | Input | ✅ Completed | | |
151
- | 22 | 1 | InputNumber | ✅ Completed | NumberField, NumberInput | |
152
- | 23 | 1 | Kbd | ✅ Completed | | |
153
- | 24 | 1 | Label | ✅ Completed | | |
154
- | 25 | 1 | Layout | ✅ Completed | | |
155
- | 26 | 1 | Link | ✅ Completed | | |
156
- | 27 | 1 | List | ✅ Completed | | |
157
- | 28 | 1 | Listbox | ✅ Completed | | |
158
- | 29 | 1 | Menu | ✅ Completed | | |
159
- | 30 | 1 | NavigationMenu | ✅ Completed | | |
160
- | 31 | 1 | Pagination | ✅ Completed | | |
161
- | 32 | 1 | Password | ✅ Completed | | |
162
- | 33 | 1 | Popover | ✅ Completed | | |
163
- | 34 | 1 | RadioGroup | ✅ Completed | | ✨ support radio card |
164
- | 35 | 1 | Segment | ✅ Completed | | |
165
- | 36 | 1 | Select | ✅ Completed | | |
166
- | 37 | 1 | Separator | ✅ Completed | Divider | |
167
- | 38 | 1 | Switch | ✅ Completed | | ✨ support switch card |
168
- | 39 | 1 | Tabs | ✅ Completed | | |
169
- | 40 | 1 | Tag | ✅ Completed | Badge(shadcn-ui) | |
170
- | 41 | 1 | Textarea | ✅ Completed | | ✨ support auto size |
171
- | 42 | 1 | Toast | ✅ Completed | Sonner | migrate from vue-sonner |
172
- | 43 | 1 | Tooltip | ✅ Completed | | |
173
- | 44 | 1 | Tree | ✅ Completed | | ✨ support virtualized |
174
- | 45 | 1 | TreeMenu | ✅ Completed | | |
175
- | 46 | 1 | Virtualizer | ✅ Completed | | |
176
- | 47 | 1 | VisuallyHidden | ✅ Completed | | |
177
- | 48 | 2 | PageTabs | ✅ Completed | | |
178
- | 49 | 2 | Popconfirm | ✅ Completed | | |
179
- | 50 | 2 | ColorPicker | | | |
180
- | 51 | 2 | Combobox | | | support virtualized |
181
- | 52 | 2 | DataTable | | | support virtualized |
182
- | 53 | 2 | Menubar | | | |
183
- | 54 | 2 | PinInput | | InputOPT, OPTInput | |
184
- | 55 | 2 | Progress | | | include circle |
185
- | 56 | 2 | ScrollArea | | | |
186
- | 57 | 2 | Skeleton | | | |
187
- | 58 | 2 | Slider | | | |
188
- | 59 | 2 | Table | | | |
189
- | 60 | 2 | Toggle | | | |
190
- | 61 | 2 | ToggleGroup | | | |
191
- | 62 | 3 | BottomSheet | | Drawer(shadcn-ui) | |
192
- | 63 | 3 | Calendar | | | v-calendar |
193
- | 64 | 3 | Carousel | | | |
194
- | 65 | 3 | DateField | | | |
195
- | 66 | 3 | DatePicker | | | |
196
- | 67 | 3 | DateRangeField | | | |
197
- | 68 | 3 | DateRangePicker | | | |
198
- | 69 | 3 | Editable | | | |
199
- | 70 | 3 | HoverCard | | | |
200
- | 71 | 3 | RangeCalendar | | | v-calendar |
201
- | 72 | 3 | Resizable | | | |
202
- | 73 | 3 | Splitter | | | |
203
- | 74 | 3 | Stepper | | | |
204
- | 75 | 3 | TagsInput | | | |
205
- | 76 | 3 | TimeField | | | |
206
- | 77 | 3 | Timeline | | | ui things |
207
- | 78 | 3 | TimePicker | | | element-plus |
208
- | 79 | 3 | Toolbar | | | |
209
- | 80 | 4 | Affix | | | |
210
- | 81 | 4 | Anchor | | | |
211
- | 82 | 4 | AutoComplete | | | support virtualized |
212
- | 83 | 4 | Backtop | | | |
213
- | 84 | 4 | Cascader | | | support virtualized |
214
- | 85 | 4 | Clipboard | | | |
215
- | 86 | 4 | Code | | | |
216
- | 87 | 4 | Comment | | | |
217
- | 88 | 4 | Countdown | | | |
218
- | 89 | 4 | CurrencyInput | | | |
219
- | 90 | 4 | Descriptions | | | |
220
- | 91 | 4 | Ellipsis | | | |
221
- | 92 | 4 | Empty | | | |
222
- | 93 | 4 | Equation | | | based on katex |
223
- | 94 | 4 | InfiniteScroll | | | |
224
- | 95 | 4 | Mention | | | element-plus |
225
- | 96 | 4 | Navbar | | | |
226
- | 97 | 4 | NumberAnimation | | | naive-ui |
227
- | 98 | 4 | QRCode | | | |
228
- | 99 | 4 | Rating | | Rate | element-plus |
229
- | 100 | 4 | Result | | | |
230
- | 101 | 4 | Spinner | | Loader, Spin | github ldrs |
231
- | 102 | 4 | Statistic | | | |
232
- | 103 | 4 | Tour | | | |
233
- | 104 | 4 | Transfer | | | |
234
- | 105 | 4 | TreeSelect | | | |
235
- | 106 | 4 | Typography | | | shadcn-ui |
236
- | 107 | 4 | Upload | | FileUpload, Dropfile | |
237
- | 108 | 4 | Watermark | | | |
238
-
239
- ### Utilities
240
-
241
- ✅ 12 / 总计: 13
242
-
243
- | No. | Priority | Name | Status | 📝 Note |
244
- | --- | -------- | ------------------- | ------------ | -------------- |
245
- | 1 | 1 | Popper | ✅ Completed | |
246
- | 2 | 1 | Portal | ✅ Completed | alias Teleport |
247
- | 3 | 1 | Primitive | ✅ Completed | |
248
- | 4 | 1 | RovingFocus | ✅ Completed | |
249
- | 5 | 1 | Slot | ✅ Completed | |
250
- | 6 | 1 | useCollection | ✅ Completed | |
251
- | 7 | 1 | useDismissableLayer | ✅ Completed | |
252
- | 8 | 1 | useFocusGuards | ✅ Completed | |
253
- | 9 | 1 | useFocusScope | ✅ Completed | |
254
- | 10 | 1 | usePresence | ✅ Completed | |
255
- | 11 | 1 | useDialog | ✅ Completed | |
256
- | 12 | 1 | useToast | ✅ Completed | |
257
- | 13 | 2 | useLoadingBar | | |
@@ -1 +1 @@
1
- import{mergeSlotVariants as e}from"../../theme/shared.js";import"../../theme/index.js";import t from"../icon/icon.js";import{accordionVariants as n}from"./variants.js";import{Fragment as r,computed as i,createBlock as a,createElementBlock as o,createElementVNode as s,createTextVNode as c,createVNode as l,defineComponent as u,mergeProps as d,normalizeClass as f,openBlock as p,renderList as m,renderSlot as h,toDisplayString as g,toHandlers as _,unref as v,withCtx as y}from"vue";import{useForwardListeners as b,useOmitProps as x}from"@soybeanjs/headless/composables";import{AccordionContent as S,AccordionHeader as C,AccordionItem as w,AccordionRoot as T,AccordionTrigger as E,provideAccordionUi as D}from"@soybeanjs/headless";const O=u({name:`SAccordion`,__name:`accordion`,props:{class:{},size:{},ui:{},items:{},itemProps:{},headerProps:{},triggerProps:{},contentProps:{},collapsible:{type:Boolean},dir:{},disabled:{type:Boolean},orientation:{},unmountOnHide:{type:Boolean},modelValue:{},defaultValue:{},multiple:{},singleClearable:{type:Boolean}},emits:[`update:modelValue`],setup(u,{emit:O}){let k=u,A=O,j=x(k,[`class`,`size`,`ui`,`items`,`itemProps`,`headerProps`,`triggerProps`,`contentProps`]),M=b(A),N=i(()=>e(n({size:k.size}),k.ui,{root:k.class}));return D(N),(e,n)=>(p(),a(v(T),d(v(j),_(v(M))),{default:y(()=>[(p(!0),o(r,null,m(u.items,n=>h(e.$slots,`item`,{key:n.value,item:n,modelValue:u.modelValue},()=>[l(v(w),d({ref_for:!0},u.itemProps,{value:n.value,disabled:n.disabled}),{default:y(({open:r})=>[l(v(C),d({ref_for:!0},u.headerProps),{default:y(()=>[l(v(E),d({ref_for:!0},u.triggerProps),{default:y(()=>[h(e.$slots,`leading`,{item:n,modelValue:u.modelValue,open:r},()=>[l(t,{icon:n.icon,class:f(N.value.triggerLeadingIcon)},null,8,[`icon`,`class`])]),h(e.$slots,`title`,{item:n,modelValue:u.modelValue,open:r},()=>[c(g(n.title),1)]),h(e.$slots,`trigger-icon`,{item:n,modelValue:u.modelValue,open:r},()=>[l(t,{icon:`lucide:chevron-down`,class:f(N.value.triggerIcon)},null,8,[`class`])])]),_:2},1040)]),_:2},1040),l(v(S),d({ref_for:!0},u.contentProps),{default:y(()=>[h(e.$slots,`content`,{item:n,modelValue:u.modelValue,open:r},()=>[s(`p`,{class:f(N.value.description)},g(n.description),3)])]),_:2},1040)]),_:2},1040,[`value`,`disabled`])])),128))]),_:3},16))}});export{O as default};
1
+ import{mergeSlotVariants as e}from"../../theme/shared.js";import"../../theme/index.js";import{accordionVariants as t}from"./variants.js";import{computed as n,createBlock as r,createSlots as i,defineComponent as a,guardReactiveProps as o,mergeProps as s,normalizeProps as c,openBlock as l,renderList as u,renderSlot as d,toHandlers as f,unref as p,useSlots as m,withCtx as h}from"vue";import{useForwardListeners as g,useOmitProps as _}from"@soybeanjs/headless/composables";import{AccordionCompact as v,provideAccordionUi as y}from"@soybeanjs/headless";import{keysOf as b}from"@soybeanjs/utils";const x=a({name:`SAccordion`,__name:`accordion`,props:{class:{},size:{},ui:{},items:{},itemProps:{},headerProps:{},triggerProps:{},contentProps:{},descriptionProps:{},collapsible:{type:Boolean},dir:{},disabled:{type:Boolean},orientation:{},unmountOnHide:{type:Boolean},modelValue:{},defaultValue:{},multiple:{},singleClearable:{type:Boolean}},emits:[`update:modelValue`],setup(a,{emit:x}){let S=a,C=x,w=m(),T=_(S,[`class`,`size`,`ui`]),E=g(C),D=n(()=>b(w).filter(e=>e!==`item`));return y(n(()=>e(t({size:S.size}),S.ui,{root:S.class}))),(e,t)=>(l(),r(p(v),s(p(T),f(p(E))),i({item:h(t=>[d(e.$slots,`item`,c(o(t)))]),_:2},[u(D.value,t=>({name:t,fn:h(n=>[d(e.$slots,t,c(o(n)))])}))]),1040))}});export{x as default};
@@ -1,5 +1,6 @@
1
- import { AccordionOptionData, AccordionProps } from "./types.js";
1
+ import { AccordionProps, AccordionSlots } from "./types.js";
2
2
  import * as _$vue from "vue";
3
+ import { AccordionOptionData } from "@soybeanjs/headless";
3
4
 
4
5
  //#region src/components/accordion/accordion.vue.d.ts
5
6
  declare const __VLS_export: <T extends AccordionOptionData = AccordionOptionData, M extends boolean = false>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_exposed?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
@@ -10,36 +11,7 @@ declare const __VLS_export: <T extends AccordionOptionData = AccordionOptionData
10
11
  } ? P : {});
11
12
  expose: (exposed: {}) => void;
12
13
  attrs: any;
13
- slots: {
14
- item?: (props: {
15
- item: T;
16
- modelValue: (M extends true ? string[] : string) | undefined;
17
- }) => any;
18
- } & {
19
- leading?: (props: {
20
- item: T;
21
- modelValue: (M extends true ? string[] : string) | undefined;
22
- open: boolean;
23
- }) => any;
24
- } & {
25
- title?: (props: {
26
- item: T;
27
- modelValue: (M extends true ? string[] : string) | undefined;
28
- open: boolean;
29
- }) => any;
30
- } & {
31
- 'trigger-icon'?: (props: {
32
- item: T;
33
- modelValue: (M extends true ? string[] : string) | undefined;
34
- open: boolean;
35
- }) => any;
36
- } & {
37
- content?: (props: {
38
- item: T;
39
- modelValue: (M extends true ? string[] : string) | undefined;
40
- open: boolean;
41
- }) => any;
42
- };
14
+ slots: AccordionSlots<T, M>;
43
15
  emit: (evt: "update:modelValue", value: M extends true ? string[] : string) => void;
44
16
  }>) => _$vue.VNode & {
45
17
  __ctx?: Awaited<typeof __VLS_setup>;
@@ -1,4 +1,4 @@
1
- import { AccordionEmits, AccordionExtendedUi, AccordionExtraUiSlot, AccordionOptionData, AccordionProps } from "./types.js";
1
+ import { AccordionEmits, AccordionProps, AccordionSlots } from "./types.js";
2
2
  import { _default } from "./accordion.vue.js";
3
- import { AccordionContentProps, AccordionHeaderProps, AccordionItemProps, AccordionRootEmits, AccordionRootProps, AccordionTriggerProps } from "@soybeanjs/headless/accordion";
4
- export { type AccordionContentProps, type AccordionHeaderProps, type AccordionItemProps, type AccordionRootEmits, type AccordionRootProps, type AccordionTriggerProps };
3
+ import { AccordionContentProps, AccordionHeaderProps, AccordionItemProps, AccordionOptionData, AccordionRootEmits, AccordionRootProps, AccordionTriggerProps } from "@soybeanjs/headless/accordion";
4
+ export { type AccordionContentProps, type AccordionHeaderProps, type AccordionItemProps, type AccordionOptionData, type AccordionRootEmits, type AccordionRootProps, type AccordionTriggerProps };
@@ -1,35 +1,16 @@
1
1
  import { ThemeSize } from "../../theme/types.js";
2
- import { IconValue } from "../icon/types.js";
3
- import { AccordionContentProps, AccordionHeaderProps, AccordionItemProps, AccordionRootEmits, AccordionRootProps, AccordionTriggerProps, AccordionUiSlot, ClassValue, UiClass } from "@soybeanjs/headless";
2
+ import { AccordionCompactEmits, AccordionCompactProps, AccordionCompactSlots, AccordionOptionData, AccordionUi, ClassValue } from "@soybeanjs/headless";
4
3
 
5
4
  //#region src/components/accordion/types.d.ts
6
- interface AccordionOptionData extends Pick<AccordionItemProps, 'value' | 'disabled'> {
7
- /** The title of the accordion item. */
8
- title?: string;
9
- /** The description of the accordion content. */
10
- description?: string;
11
- /**
12
- * The icon of the accordion item.
13
- *
14
- * if it is a string, it will be used as the icon name of the iconify.
15
- */
16
- icon?: IconValue;
17
- }
18
- type AccordionExtraUiSlot = 'triggerLeadingIcon' | 'triggerIcon';
19
- type AccordionExtendedUi = UiClass<AccordionUiSlot | AccordionExtraUiSlot>;
20
- interface AccordionProps<T extends AccordionOptionData = AccordionOptionData, M extends boolean = false> extends AccordionRootProps<M> {
5
+ interface AccordionProps<T extends AccordionOptionData = AccordionOptionData, M extends boolean = false> extends AccordionCompactProps<T, M> {
21
6
  /**
22
7
  * root class
23
8
  */
24
9
  class?: ClassValue;
25
10
  size?: ThemeSize;
26
- ui?: Partial<AccordionExtendedUi>;
27
- items: T[];
28
- itemProps?: AccordionItemProps;
29
- headerProps?: AccordionHeaderProps;
30
- triggerProps?: AccordionTriggerProps;
31
- contentProps?: AccordionContentProps;
11
+ ui?: Partial<AccordionUi>;
32
12
  }
33
- type AccordionEmits<M extends boolean = false> = AccordionRootEmits<M>;
13
+ type AccordionEmits<M extends boolean = false> = AccordionCompactEmits<M>;
14
+ type AccordionSlots<T extends AccordionOptionData = AccordionOptionData, M extends boolean = false> = AccordionCompactSlots<T, M>;
34
15
  //#endregion
35
- export { AccordionEmits, AccordionExtendedUi, AccordionExtraUiSlot, AccordionOptionData, AccordionProps };
16
+ export { AccordionEmits, AccordionProps, AccordionSlots };
@@ -0,0 +1 @@
1
+ import{mergeSlotVariants as e}from"../../theme/shared.js";import"../../theme/index.js";import{affixVariants as t}from"./variants.js";import{computed as n,createBlock as r,createVNode as i,defineComponent as a,mergeProps as o,openBlock as s,renderSlot as c,toHandlers as l,unref as u,withCtx as d}from"vue";import{useForwardListeners as f,useOmitProps as p}from"@soybeanjs/headless/composables";import{AffixContent as m,AffixPlaceholder as h,AffixRoot as g,provideAffixUi as _}from"@soybeanjs/headless";const v=a({name:`SAffix`,__name:`affix`,props:{class:{},ui:{},placeholderProps:{},contentProps:{},offsetTop:{},offsetBottom:{},target:{type:[String,Function,null]}},emits:[`change`],setup(a,{emit:v}){let y=a,b=v,x=p(y,[`class`,`ui`,`placeholderProps`,`contentProps`]),S=f(b);return _(n(()=>e(t(),y.ui,{content:y.class}))),(e,t)=>(s(),r(u(g),o(u(x),l(u(S))),{default:d(()=>[i(u(h)),i(u(m),null,{default:d(()=>[c(e.$slots,`default`)]),_:3})]),_:3},16))}});export{v as default};