@soybeanjs/ui 0.14.0 → 0.15.0-beta.2
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.
- package/README.md +79 -147
- package/README.zh-CN.md +79 -147
- package/dist/components/accordion/accordion.js +1 -1
- package/dist/components/accordion/accordion.vue.d.ts +3 -31
- package/dist/components/accordion/index.d.ts +3 -3
- package/dist/components/accordion/types.d.ts +6 -25
- package/dist/components/affix/affix.js +1 -0
- package/dist/components/affix/affix.vue.d.ts +22 -0
- package/dist/components/affix/index.d.ts +4 -0
- package/dist/components/affix/index.js +1 -0
- package/dist/components/affix/types.d.ts +15 -0
- package/dist/components/affix/variants.js +1 -0
- package/dist/components/alert/alert.js +1 -1
- package/dist/components/anchor/anchor-item.js +1 -0
- package/dist/components/anchor/anchor.js +1 -0
- package/dist/components/anchor/anchor.vue.d.ts +23 -0
- package/dist/components/anchor/context.js +1 -0
- package/dist/components/anchor/index.d.ts +4 -0
- package/dist/components/anchor/index.js +1 -0
- package/dist/components/anchor/types.d.ts +34 -0
- package/dist/components/anchor/variants.js +1 -0
- package/dist/components/autocomplete/autocomplete-group-option.js +1 -0
- package/dist/components/autocomplete/autocomplete-option.js +1 -0
- package/dist/components/autocomplete/autocomplete-single-option.js +1 -0
- package/dist/components/autocomplete/autocomplete.js +1 -0
- package/dist/components/autocomplete/autocomplete.vue.d.ts +47 -0
- package/dist/components/autocomplete/context.js +1 -0
- package/dist/components/autocomplete/index.d.ts +4 -0
- package/dist/components/autocomplete/index.js +1 -0
- package/dist/components/autocomplete/shared.js +1 -0
- package/dist/components/autocomplete/types.d.ts +94 -0
- package/dist/components/autocomplete/variants.js +1 -0
- package/dist/components/bottom-sheet/bottom-sheet-close.js +1 -0
- package/dist/components/bottom-sheet/bottom-sheet-close.vue.d.ts +18 -0
- package/dist/components/bottom-sheet/bottom-sheet.js +1 -0
- package/dist/components/bottom-sheet/bottom-sheet.vue.d.ts +72 -0
- package/dist/components/bottom-sheet/index.d.ts +3 -0
- package/dist/components/bottom-sheet/index.js +1 -0
- package/dist/components/bottom-sheet/types.d.ts +31 -0
- package/dist/components/bottom-sheet/variants.js +1 -0
- package/dist/components/carousel/carousel-content.js +1 -0
- package/dist/components/carousel/carousel-content.vue.d.ts +18 -0
- package/dist/components/carousel/carousel-item.js +1 -0
- package/dist/components/carousel/carousel-item.vue.d.ts +18 -0
- package/dist/components/carousel/carousel-next.js +1 -0
- package/dist/components/carousel/carousel-next.vue.d.ts +22 -0
- package/dist/components/carousel/carousel-previous.js +1 -0
- package/dist/components/carousel/carousel-previous.vue.d.ts +22 -0
- package/dist/components/carousel/carousel.js +1 -0
- package/dist/components/carousel/carousel.vue.d.ts +15 -0
- package/dist/components/carousel/index.d.ts +8 -0
- package/dist/components/carousel/index.js +1 -0
- package/dist/components/carousel/types.d.ts +10 -0
- package/dist/components/carousel/variants.js +1 -0
- package/dist/components/color-area/color-area.js +1 -0
- package/dist/components/color-area/color-area.vue.d.ts +19 -0
- package/dist/components/color-area/index.d.ts +4 -0
- package/dist/components/color-area/index.js +1 -0
- package/dist/components/color-area/types.d.ts +14 -0
- package/dist/components/color-area/variants.js +1 -0
- package/dist/components/color-field/color-field.js +1 -0
- package/dist/components/color-field/color-field.vue.d.ts +15 -0
- package/dist/components/color-field/index.d.ts +4 -0
- package/dist/components/color-field/index.js +1 -0
- package/dist/components/color-field/types.d.ts +13 -0
- package/dist/components/color-field/variants.js +1 -0
- package/dist/components/color-picker/color-picker.js +1 -0
- package/dist/components/color-picker/color-picker.vue.d.ts +55 -0
- package/dist/components/color-picker/index.d.ts +2 -0
- package/dist/components/color-picker/index.js +1 -0
- package/dist/components/color-picker/shared.js +1 -0
- package/dist/components/color-picker/types.d.ts +47 -0
- package/dist/components/color-picker/variants.js +1 -0
- package/dist/components/color-slider/color-slider.js +1 -0
- package/dist/components/color-slider/color-slider.vue.d.ts +23 -0
- package/dist/components/color-slider/index.d.ts +4 -0
- package/dist/components/color-slider/index.js +1 -0
- package/dist/components/color-slider/types.d.ts +16 -0
- package/dist/components/color-swatch/color-swatch.js +1 -0
- package/dist/components/color-swatch/color-swatch.vue.d.ts +18 -0
- package/dist/components/color-swatch/index.d.ts +5 -0
- package/dist/components/color-swatch/index.js +1 -0
- package/dist/components/color-swatch/types.d.ts +16 -0
- package/dist/components/color-swatch/variants.d.ts +108 -0
- package/dist/components/color-swatch/variants.js +1 -0
- package/dist/components/color-swatch-picker/color-swatch-picker.js +1 -0
- package/dist/components/color-swatch-picker/color-swatch-picker.vue.d.ts +39 -0
- package/dist/components/color-swatch-picker/index.d.ts +5 -0
- package/dist/components/color-swatch-picker/index.js +1 -0
- package/dist/components/color-swatch-picker/types.d.ts +20 -0
- package/dist/components/color-swatch-picker/variants.d.ts +153 -0
- package/dist/components/color-swatch-picker/variants.js +1 -0
- package/dist/components/combobox/combobox-group-option.js +1 -0
- package/dist/components/combobox/combobox-option.js +1 -0
- package/dist/components/combobox/combobox-single-option.js +1 -0
- package/dist/components/combobox/combobox.js +1 -0
- package/dist/components/combobox/combobox.vue.d.ts +76 -0
- package/dist/components/combobox/index.d.ts +4 -0
- package/dist/components/combobox/index.js +1 -0
- package/dist/components/combobox/shared.js +1 -0
- package/dist/components/combobox/types.d.ts +68 -0
- package/dist/components/combobox/variants.js +1 -0
- package/dist/components/command/command.vue.d.ts +2 -2
- package/dist/components/config-provider/config-provider.js +1 -1
- package/dist/components/config-provider/context.js +1 -1
- package/dist/components/config-provider/types.d.ts +14 -2
- package/dist/components/context-menu/context-menu-checkbox.js +1 -1
- package/dist/components/context-menu/context-menu-checkbox.vue.d.ts +8 -15
- package/dist/components/context-menu/context-menu-radio.js +1 -1
- package/dist/components/context-menu/context-menu-radio.vue.d.ts +8 -15
- package/dist/components/context-menu/context-menu-wrapper.js +1 -1
- package/dist/components/context-menu/context-menu-wrapper.vue.d.ts +5 -5
- package/dist/components/context-menu/context-menu.js +1 -1
- package/dist/components/context-menu/context-menu.vue.d.ts +7 -15
- package/dist/components/context-menu/index.d.ts +5 -7
- package/dist/components/context-menu/types.d.ts +14 -42
- package/dist/components/dialog/dialog-pure.vue.d.ts +1 -1
- package/dist/components/dialog/dialog.vue.d.ts +1 -1
- package/dist/components/drawer/drawer.vue.d.ts +1 -1
- package/dist/components/dropdown-menu/dropdown-menu-checkbox.js +1 -1
- package/dist/components/dropdown-menu/dropdown-menu-checkbox.vue.d.ts +8 -15
- package/dist/components/dropdown-menu/dropdown-menu-radio.js +1 -1
- package/dist/components/dropdown-menu/dropdown-menu-radio.vue.d.ts +8 -15
- package/dist/components/dropdown-menu/dropdown-menu-wrapper.js +1 -1
- package/dist/components/dropdown-menu/dropdown-menu-wrapper.vue.d.ts +5 -5
- package/dist/components/dropdown-menu/dropdown-menu.js +1 -1
- package/dist/components/dropdown-menu/dropdown-menu.vue.d.ts +7 -15
- package/dist/components/dropdown-menu/index.d.ts +2 -4
- package/dist/components/dropdown-menu/index.js +1 -1
- package/dist/components/dropdown-menu/types.d.ts +14 -38
- package/dist/components/editable/editable.js +1 -0
- package/dist/components/editable/editable.vue.d.ts +85 -0
- package/dist/components/editable/index.d.ts +4 -0
- package/dist/components/editable/index.js +1 -0
- package/dist/components/editable/types.d.ts +20 -0
- package/dist/components/editable/variants.js +1 -0
- package/dist/components/empty/empty.js +1 -0
- package/dist/components/empty/empty.vue.d.ts +21 -0
- package/dist/components/empty/index.d.ts +5 -0
- package/dist/components/empty/index.js +1 -0
- package/dist/components/empty/types.d.ts +20 -0
- package/dist/components/empty/variants.d.ts +57 -0
- package/dist/components/empty/variants.js +1 -0
- package/dist/components/hover-card/hover-card.js +1 -0
- package/dist/components/hover-card/hover-card.vue.d.ts +35 -0
- package/dist/components/hover-card/index.d.ts +4 -0
- package/dist/components/hover-card/index.js +1 -0
- package/dist/components/hover-card/types.d.ts +22 -0
- package/dist/components/hover-card/variants.js +1 -0
- package/dist/components/icon/types.d.ts +3 -4
- package/dist/components/menu/context.js +1 -1
- package/dist/components/menu/index.d.ts +2 -7
- package/dist/components/menu/index.js +1 -1
- package/dist/components/menu/types.d.ts +9 -86
- package/dist/components/menu/variants.js +1 -1
- package/dist/components/menubar/index.d.ts +2 -0
- package/dist/components/menubar/index.js +1 -0
- package/dist/components/menubar/menubar.js +1 -0
- package/dist/components/{menu/menu-option.vue.d.ts → menubar/menubar.vue.d.ts} +8 -24
- package/dist/components/menubar/types.d.ts +17 -0
- package/dist/components/menubar/variants.js +1 -0
- package/dist/components/navigation-menu/navigation-menu.vue.d.ts +2 -2
- package/dist/components/page-tabs/page-tabs.vue.d.ts +1 -1
- package/dist/components/page-tabs/types.d.ts +1 -1
- package/dist/components/popconfirm/popconfirm-cancel.js +1 -1
- package/dist/components/popconfirm/popconfirm-confirm.js +1 -1
- package/dist/components/popconfirm/popconfirm.vue.d.ts +1 -1
- package/dist/components/popover/popover.js +1 -1
- package/dist/components/progress/context.d.ts +5 -0
- package/dist/components/progress/context.js +1 -0
- package/dist/components/progress/index.d.ts +8 -0
- package/dist/components/progress/index.js +1 -0
- package/dist/components/progress/loading-bar.js +1 -0
- package/dist/components/progress/loading-bar.vue.d.ts +25 -0
- package/dist/components/progress/progress-circle.js +1 -0
- package/dist/components/progress/progress-circle.vue.d.ts +29 -0
- package/dist/components/progress/progress.js +1 -0
- package/dist/components/progress/progress.vue.d.ts +30 -0
- package/dist/components/progress/shared.d.ts +7 -0
- package/dist/components/progress/shared.js +1 -0
- package/dist/components/progress/types.d.ts +43 -0
- package/dist/components/progress/variants.js +1 -0
- package/dist/components/scroll-area/index.d.ts +4 -0
- package/dist/components/scroll-area/index.js +1 -0
- package/dist/components/scroll-area/scroll-area.js +1 -0
- package/dist/components/scroll-area/scroll-area.vue.d.ts +18 -0
- package/dist/components/scroll-area/types.d.ts +15 -0
- package/dist/components/scroll-area/variants.js +1 -0
- package/dist/components/select/select.vue.d.ts +2 -2
- package/dist/components/skeleton/index.d.ts +3 -0
- package/dist/components/skeleton/index.js +1 -0
- package/dist/components/skeleton/skeleton.js +1 -0
- package/dist/components/skeleton/skeleton.vue.d.ts +20 -0
- package/dist/components/skeleton/types.d.ts +16 -0
- package/dist/components/skeleton/variants.d.ts +60 -0
- package/dist/components/skeleton/variants.js +1 -0
- package/dist/components/slider/index.d.ts +4 -0
- package/dist/components/slider/index.js +1 -0
- package/dist/components/slider/slider.js +1 -0
- package/dist/components/slider/slider.vue.d.ts +28 -0
- package/dist/components/slider/types.d.ts +16 -0
- package/dist/components/slider/variants.js +1 -0
- package/dist/components/spinner/index.d.ts +2 -0
- package/dist/components/spinner/index.js +1 -0
- package/dist/components/spinner/spinner.js +1 -0
- package/dist/components/spinner/spinner.vue.d.ts +10 -0
- package/dist/components/spinner/types.d.ts +19 -0
- package/dist/components/spinner/variants.js +1 -0
- package/dist/components/splitter/index.d.ts +5 -0
- package/dist/components/splitter/index.js +1 -0
- package/dist/components/splitter/splitter-group.js +1 -0
- package/dist/components/splitter/splitter-group.vue.d.ts +22 -0
- package/dist/components/splitter/splitter-panel.js +1 -0
- package/dist/components/splitter/splitter-panel.vue.d.ts +32 -0
- package/dist/components/splitter/splitter-resize-handle.js +1 -0
- package/dist/components/splitter/splitter-resize-handle.vue.d.ts +415 -0
- package/dist/components/splitter/types.d.ts +12 -0
- package/dist/components/splitter/variants.js +1 -0
- package/dist/components/stepper/index.d.ts +4 -0
- package/dist/components/stepper/index.js +1 -0
- package/dist/components/stepper/stepper.js +1 -0
- package/dist/components/stepper/stepper.vue.d.ts +121 -0
- package/dist/components/stepper/types.d.ts +26 -0
- package/dist/components/stepper/variants.js +1 -0
- package/dist/components/table/hooks.d.ts +5 -5
- package/dist/components/table/hooks.js +1 -1
- package/dist/components/table/index.d.ts +1 -1
- package/dist/components/table/table-filter-popover.js +1 -0
- package/dist/components/table/table-radio.js +1 -1
- package/dist/components/table/table.js +1 -1
- package/dist/components/table/table.vue.d.ts +7 -3
- package/dist/components/table/types.d.ts +25 -83
- package/dist/components/table/variants.js +1 -1
- package/dist/components/tags-input/index.d.ts +5 -0
- package/dist/components/tags-input/index.js +1 -0
- package/dist/components/tags-input/tags-input-item-delete.js +1 -0
- package/dist/components/tags-input/tags-input-item-delete.vue.d.ts +18 -0
- package/dist/components/tags-input/tags-input.js +1 -0
- package/dist/components/tags-input/tags-input.vue.d.ts +29 -0
- package/dist/components/tags-input/types.d.ts +12 -0
- package/dist/components/tags-input/variants.js +1 -0
- package/dist/components/toast/index.d.ts +4 -5
- package/dist/components/toast/index.js +1 -1
- package/dist/components/toast/styles.js +274 -0
- package/dist/components/toast/toaster.js +1 -0
- package/dist/components/toast/toaster.vue.d.ts +22 -0
- package/dist/components/toast/types.d.ts +5 -55
- package/dist/components/toast/variants.js +1 -1
- package/dist/components/toggle/index.d.ts +3 -0
- package/dist/components/toggle/index.js +1 -0
- package/dist/components/toggle/toggle.js +1 -0
- package/dist/components/toggle/toggle.vue.d.ts +30 -0
- package/dist/components/toggle/types.d.ts +14 -0
- package/dist/components/toggle/variants.d.ts +100 -0
- package/dist/components/toggle/variants.js +1 -0
- package/dist/components/toggle-group/index.d.ts +6 -0
- package/dist/components/toggle-group/index.js +1 -0
- package/dist/components/toggle-group/toggle-group-item.js +1 -0
- package/dist/components/toggle-group/toggle-group-item.vue.d.ts +22 -0
- package/dist/components/toggle-group/toggle-group.js +1 -0
- package/dist/components/toggle-group/toggle-group.vue.d.ts +24 -0
- package/dist/components/toggle-group/types.d.ts +15 -0
- package/dist/components/toggle-group/variants.d.ts +216 -0
- package/dist/components/toggle-group/variants.js +1 -0
- package/dist/components/toolbar/index.d.ts +4 -0
- package/dist/components/toolbar/index.js +1 -0
- package/dist/components/toolbar/toolbar.js +1 -0
- package/dist/components/toolbar/toolbar.vue.d.ts +18 -0
- package/dist/components/toolbar/types.d.ts +9 -0
- package/dist/components/toolbar/variants.js +1 -0
- package/dist/components/tree-menu/tree-menu-option-slot.js +1 -1
- package/dist/components/tree-menu/types.d.ts +1 -1
- package/dist/components/tree-menu/variants.js +1 -1
- package/dist/constants/components.d.ts +27 -0
- package/dist/constants/components.js +1 -1
- package/dist/index.d.ts +179 -94
- package/dist/index.js +1 -1
- package/dist/styles.css +597 -111
- package/dist/theme/config.js +1 -1
- package/package.json +21 -18
- package/dist/components/menu/menu-checkbox-options.js +0 -1
- package/dist/components/menu/menu-checkbox-options.vue.d.ts +0 -28
- package/dist/components/menu/menu-item-slot.js +0 -1
- package/dist/components/menu/menu-option.js +0 -1
- package/dist/components/menu/menu-options.js +0 -1
- package/dist/components/menu/menu-options.vue.d.ts +0 -48
- package/dist/components/menu/menu-radio-options.js +0 -1
- package/dist/components/menu/menu-radio-options.vue.d.ts +0 -28
- package/dist/components/menu/shared.js +0 -1
- package/dist/components/table/shared.js +0 -1
- package/dist/components/toast/context.d.ts +0 -5
- package/dist/components/toast/context.js +0 -1
- package/dist/components/toast/shared.js +0 -1
- package/dist/components/toast/toast-provider.js +0 -1
- package/dist/components/toast/toast.js +0 -1
- package/dist/components/toast/toast.vue.d.ts +0 -21
- 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
|
|
18
|
+
SoybeanUI is built on a strict **two-layer separation** model:
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
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
|
|
106
|
-
- **Headless**: Logic and styles are separated.
|
|
107
|
-
- **Type Safe**: Written in TypeScript
|
|
108
|
-
- **Customizable**:
|
|
109
|
-
- **Lightweight
|
|
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
|
-
|
|
21
|
-
|
|
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
|
-
-
|
|
106
|
-
- **Headless
|
|
107
|
-
-
|
|
108
|
-
-
|
|
109
|
-
-
|
|
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
|
|
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 {
|
|
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,
|
|
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 {
|
|
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
|
|
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<
|
|
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> =
|
|
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,
|
|
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};
|