@soybeanjs/ui 0.21.0 → 0.22.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.
package/README.md CHANGED
@@ -53,7 +53,7 @@ Every multi-slot headless component exposes a `provide{Name}Ui` function. The st
53
53
  ```ts
54
54
  // In the styled wrapper (src/)
55
55
  const ui = computed(() =>
56
- mergeSlotVariants(
56
+ mergeVariants(
57
57
  accordionVariants({ size: props.size }), // tv() output
58
58
  props.ui, // user overrides
59
59
  { root: props.class } // class prop
@@ -142,13 +142,13 @@ import '@soybeanjs/ui/styles.css'; // pre-built UnoCSS stylesheet
142
142
  If you contribute new public components, exports, or API descriptions, keep generated surfaces in sync through the official scripts instead of editing generated files by hand.
143
143
 
144
144
  ```bash
145
- pnpm gen:headless # sync headless component names and namespaced exports
146
- pnpm gen:ui # sync ui component names
147
- pnpm gen:api # regenerate docs api json and locale baseline data
148
- pnpm gen:api:i18n # refresh api locale template data only
149
- pnpm gen:changelog # regenerate docs changelog json and locale baseline data
150
- pnpm translate:api:i18n -- --locale zh-CN
151
- pnpm translate:changelog:i18n -- --locale zh-CN
145
+ pnpm sui headless # sync headless component names and namespaced exports
146
+ pnpm sui ui # sync ui component names
147
+ pnpm sui api # regenerate docs api json and locale baseline data
148
+ pnpm sui api-locales # refresh api locale template data only
149
+ pnpm sui changelog # regenerate docs changelog json and locale baseline data
150
+ pnpm sui api-translate -- --locale zh-CN
151
+ pnpm sui changelog-translate -- --locale zh-CN
152
152
  ```
153
153
 
154
154
  The docs site now renders component docs through `UsageCode`, `PlaygroundGallery`, and `ComponentApi`. Component detail pages and `/releases` also read generated changelog data from `docs/src/generated/changelog/` and `docs/src/generated/changelog-locales/`.
package/README.zh-CN.md CHANGED
@@ -53,7 +53,7 @@ SoybeanUI 采用严格的**双层分离**设计:
53
53
  ```ts
54
54
  // 样式包装层 (src/) 中
55
55
  const ui = computed(() =>
56
- mergeSlotVariants(
56
+ mergeVariants(
57
57
  accordionVariants({ size: props.size }), // tv() 计算结果
58
58
  props.ui, // 用户自定义覆盖
59
59
  { root: props.class } // class prop 合并
@@ -142,13 +142,13 @@ import '@soybeanjs/ui/styles.css'; // 预构建的 UnoCSS 样式表
142
142
  如果您在仓库内新增公共组件、调整导出入口或修改 API 描述,请通过官方脚本同步生成产物,而不是手动编辑生成文件。
143
143
 
144
144
  ```bash
145
- pnpm gen:headless # 同步 headless 组件名称与命名空间导出
146
- pnpm gen:ui # 同步 ui 组件名称
147
- pnpm gen:api # 重新生成 docs api json 与 locale 英文基线数据
148
- pnpm gen:api:i18n # 仅刷新 api locale 模板数据
149
- pnpm gen:changelog # 重新生成 docs changelog json 与 locale 英文基线数据
150
- pnpm translate:api:i18n -- --locale zh-CN
151
- pnpm translate:changelog:i18n -- --locale zh-CN
145
+ pnpm sui headless # 同步 headless 组件名称与命名空间导出
146
+ pnpm sui ui # 同步 ui 组件名称
147
+ pnpm sui api # 重新生成 docs api json 与 locale 英文基线数据
148
+ pnpm sui api-locales # 仅刷新 api locale 模板数据
149
+ pnpm sui changelog # 重新生成 docs changelog json 与 locale 英文基线数据
150
+ pnpm sui api-translate -- --locale zh-CN
151
+ pnpm sui changelog-translate -- --locale zh-CN
152
152
  ```
153
153
 
154
154
  当前文档站默认通过 `UsageCode`、`PlaygroundGallery` 与 `ComponentApi` 渲染组件文档;组件详情页与 `/releases` 还会消费 `docs/src/generated/changelog/` 和 `docs/src/generated/changelog-locales/` 下的版本日志生成数据。
@@ -1 +1 @@
1
- import{mergeVariants 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{AccordionCompact as g,provideAccordionUi as _}from"@soybeanjs/headless/accordion";import{useForwardListeners as v,useOmitProps as y}from"@soybeanjs/headless/composables";import{keysOf as b}from"@soybeanjs/utils";const x=a({name:`SAccordion`,__name:`accordion`,props:{class:{type:[Boolean,null,String,Object,Array]},size:{},ui:{},items:{},itemProps:{},headerProps:{},triggerProps:{},contentProps:{},descriptionProps:{},collapsible:{type:Boolean},dir:{},disabled:{type:Boolean},orientation:{},unmountOnHide:{type:Boolean},modelValue:{},defaultValue:{},multiple:{},clearable:{type:Boolean},selectionBehavior:{}},emits:[`update:modelValue`],setup(a,{emit:x}){let S=a,C=x,w=m(),T=y(S,[`class`,`size`,`ui`]),E=v(C),D=n(()=>b(w).filter(e=>e!==`item`));return _(n(()=>e(t({size:S.size}),S.ui,{root:S.class}))),(e,t)=>(l(),r(p(g),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
+ import{mergeVariants 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{AccordionCompact as g,provideAccordionUi as _}from"@soybeanjs/headless/accordion";import{useForwardListeners as v,useOmitProps as y}from"@soybeanjs/headless/composables";import{keysOf as b}from"@soybeanjs/utils";const x=a({name:`SAccordion`,__name:`accordion`,props:{class:{type:[Boolean,null,String,Object,Array]},size:{},ui:{},items:{},itemProps:{},headerProps:{},triggerProps:{},contentProps:{},descriptionProps:{},collapsible:{type:Boolean,default:!0},dir:{},disabled:{type:Boolean},orientation:{},unmountOnHide:{type:Boolean,default:!0},modelValue:{},defaultValue:{},multiple:{},selectionBehavior:{}},emits:[`update:modelValue`],setup(a,{emit:x}){let S=a,C=x,w=m(),T=y(S,[`class`,`size`,`ui`]),E=v(C),D=n(()=>b(w).filter(e=>e!==`item`));return _(n(()=>e(t({size:S.size}),S.ui,{root:S.class}))),(e,t)=>(l(),r(p(g),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 +1 @@
1
- import{mergeVariants as e}from"../../theme/shared.js";import{miniSizeMap as t}from"../../theme/config.js";import"../../theme/index.js";import{buttonIconVariants as n}from"../button/variants.js";import r from"../icon/icon.js";import i from"../select/select.js";import{calendarVariants as a}from"./variants.js";import{computed as o,createBlock as s,createSlots as c,createTextVNode as l,createVNode as u,defineComponent as d,guardReactiveProps as f,mergeProps as p,normalizeProps as m,openBlock as h,renderSlot as g,toDisplayString as _,toHandlers as v,unref as y,withCtx as b}from"vue";import{useForwardListeners as x,useOmitProps as S}from"@soybeanjs/headless/composables";import{useLocaleMessages as C}from"@soybeanjs/headless";import{CalendarCompact as w,provideCalendarUi as T}from"@soybeanjs/headless/calendar";const E=d({name:`SCalendar`,__name:`calendar`,props:{class:{type:[Boolean,null,String,Object,Array]},size:{},ui:{},headerProps:{},headingProps:{},prevProps:{},nextProps:{},gridProps:{},gridHeadProps:{},gridBodyProps:{},gridRowProps:{},headCellProps:{},cellProps:{},cellTriggerProps:{},dir:{},locale:{},modelValue:{},defaultValue:{},multiple:{},placeholder:{},defaultPlaceholder:{},disabled:{type:Boolean},readonly:{type:Boolean},pagedNavigation:{type:Boolean},preventDeselect:{type:Boolean},weekStartsOn:{},weekdayFormat:{},calendarLabel:{},fixedWeeks:{type:Boolean},maxValue:{},minValue:{},numberOfMonths:{},initialFocus:{type:Boolean},isDateDisabled:{type:Function},isDateUnavailable:{type:Function},nextPage:{type:Function},prevPage:{type:Function},disableDaysOutsideCurrentView:{type:Boolean},asChild:{type:Boolean},as:{}},emits:[`update:modelValue`,`update:placeholder`],setup(d,{emit:E}){let D=d,O=E,k=S(D,[`class`,`size`,`ui`]),A=x(O),j=C(),M=o(()=>({"aria-label":j.value.calendar.selectMonth})),N=o(()=>({"aria-label":j.value.calendar.selectYear})),P=o(()=>{let r=t[D.size||`md`];return e(Object.assign(a({size:D.size}),{$base:{prev:n({size:r,variant:`pure`}),next:n({size:r,variant:`pure`})}}),D.ui,{root:D.class})}),F=o(()=>t[D.size||`md`]);return T(P),(e,t)=>(h(),s(y(w),p(y(k),v(y(A))),c({prev:b(t=>[g(e.$slots,`prev`,m(f(t)),()=>[u(r,{icon:`lucide:chevron-left`})])]),next:b(t=>[g(e.$slots,`next`,m(f(t)),()=>[u(r,{icon:`lucide:chevron-right`})])]),"head-cell":b(t=>[g(e.$slots,`head-cell`,m(f(t)),()=>[l(_(t.label),1)])]),day:b(t=>[g(e.$slots,`day`,m(f(t)),()=>[l(_(t.dayValue),1)])]),default:b(t=>[g(e.$slots,`default`,m(f(t)))]),_:2},[e.$slots.heading?{name:`heading`,fn:b(t=>[g(e.$slots,`heading`,m(f(t)))]),key:`0`}:{name:`heading`,fn:b(({monthOptions:e,yearOptions:t,selectedMonth:n,selectedYear:r,onMonthChange:a,onYearChange:o})=>[u(i,{size:F.value,disabled:d.disabled,clearable:!1,items:e,"model-value":n,"trigger-props":M.value,ui:{trigger:`w-fit`},"onUpdate:modelValue":a},null,8,[`size`,`disabled`,`items`,`model-value`,`trigger-props`,`onUpdate:modelValue`]),u(i,{size:F.value,disabled:d.disabled,clearable:!1,items:t,"model-value":r,"trigger-props":N.value,ui:{popup:`max-h-72`,trigger:`w-fit`},"onUpdate:modelValue":o},null,8,[`size`,`disabled`,`items`,`model-value`,`trigger-props`,`onUpdate:modelValue`])]),key:`1`}]),1040))}});export{E as default};
1
+ import{mergeVariants as e}from"../../theme/shared.js";import{miniSizeMap as t}from"../../theme/config.js";import"../../theme/index.js";import{buttonIconVariants as n}from"../button/variants.js";import r from"../icon/icon.js";import i from"../select/select.js";import{calendarVariants as a}from"./variants.js";import{computed as o,createBlock as s,createSlots as c,createTextVNode as l,createVNode as u,defineComponent as d,guardReactiveProps as f,mergeProps as p,normalizeProps as m,openBlock as h,renderSlot as g,toDisplayString as _,toHandlers as v,unref as y,withCtx as b}from"vue";import{useForwardListeners as x,useOmitProps as S}from"@soybeanjs/headless/composables";import{useLocaleMessages as C}from"@soybeanjs/headless";import{CalendarCompact as w,provideCalendarUi as T}from"@soybeanjs/headless/calendar";const E=d({name:`SCalendar`,__name:`calendar`,props:{class:{type:[Boolean,null,String,Object,Array]},size:{},ui:{},headerProps:{},headingProps:{},prevProps:{},nextProps:{},gridProps:{},gridHeadProps:{},gridBodyProps:{},gridRowProps:{},headCellProps:{},cellProps:{},cellTriggerProps:{},dir:{},locale:{},modelValue:{},defaultValue:{},multiple:{type:Boolean},placeholder:{},defaultPlaceholder:{},disabled:{type:Boolean},readonly:{type:Boolean},pagedNavigation:{type:Boolean},preventDeselect:{type:Boolean},weekStartsOn:{},weekdayFormat:{},calendarLabel:{},fixedWeeks:{type:Boolean},maxValue:{},minValue:{},numberOfMonths:{},initialFocus:{type:Boolean},isDateDisabled:{type:Function},isDateUnavailable:{type:Function},nextPage:{type:Function},prevPage:{type:Function},disableDaysOutsideCurrentView:{type:Boolean},asChild:{type:Boolean},as:{}},emits:[`update:modelValue`,`update:placeholder`],setup(d,{emit:E}){let D=d,O=E,k=S(D,[`class`,`size`,`ui`]),A=x(O),j=C(),M=o(()=>({"aria-label":j.value.calendar.selectMonth})),N=o(()=>({"aria-label":j.value.calendar.selectYear})),P=o(()=>{let r=t[D.size||`md`];return e(Object.assign(a({size:D.size}),{$base:{prev:n({size:r,variant:`pure`}),next:n({size:r,variant:`pure`})}}),D.ui,{root:D.class})}),F=o(()=>t[D.size||`md`]);return T(P),(e,t)=>(h(),s(y(w),p(y(k),v(y(A))),c({prev:b(t=>[g(e.$slots,`prev`,m(f(t)),()=>[u(r,{icon:`lucide:chevron-left`})])]),next:b(t=>[g(e.$slots,`next`,m(f(t)),()=>[u(r,{icon:`lucide:chevron-right`})])]),"head-cell":b(t=>[g(e.$slots,`head-cell`,m(f(t)),()=>[l(_(t.label),1)])]),day:b(t=>[g(e.$slots,`day`,m(f(t)),()=>[l(_(t.dayValue),1)])]),default:b(t=>[g(e.$slots,`default`,m(f(t)))]),_:2},[e.$slots.heading?{name:`heading`,fn:b(t=>[g(e.$slots,`heading`,m(f(t)))]),key:`0`}:{name:`heading`,fn:b(({monthOptions:e,yearOptions:t,selectedMonth:n,selectedYear:r,onMonthChange:a,onYearChange:o})=>[u(i,{size:F.value,disabled:d.disabled,clearable:!1,items:e,"model-value":n,"trigger-props":M.value,ui:{trigger:`w-fit`},"onUpdate:modelValue":a},null,8,[`size`,`disabled`,`items`,`model-value`,`trigger-props`,`onUpdate:modelValue`]),u(i,{size:F.value,disabled:d.disabled,clearable:!1,items:t,"model-value":r,"trigger-props":N.value,ui:{popup:`max-h-72`,trigger:`w-fit`},"onUpdate:modelValue":o},null,8,[`size`,`disabled`,`items`,`model-value`,`trigger-props`,`onUpdate:modelValue`])]),key:`1`}]),1040))}});export{E as default};
@@ -1 +1 @@
1
- import{mergeVariants as e}from"../../theme/shared.js";import"../../theme/index.js";import t from"../calendar/calendar.js";import{dateFieldVariants as n}from"../date-field/variants.js";import{datePickerVariants as r}from"./variants.js";import{computed as i,createBlock as a,createVNode as o,defineComponent as s,mergeProps as c,openBlock as l,toHandlers as u,unref as d,withCtx as f}from"vue";import{useForwardListeners as p,useOmitProps as m}from"@soybeanjs/headless/composables";import{DatePickerCompact as h,provideDatePickerUi as g}from"@soybeanjs/headless/date-picker";const _=s({name:`SDatePicker`,__name:`date-picker`,props:{class:{type:[Boolean,null,String,Object,Array]},size:{},ui:{},calendarUi:{},dateFieldProps:{},placement:{},showArrow:{type:Boolean},triggerProps:{},portalProps:{},positionerProps:{},popupProps:{},arrowProps:{},closeProps:{},disabled:{type:Boolean},open:{type:Boolean,default:void 0},defaultOpen:{type:Boolean},modal:{type:Boolean},headerProps:{},headingProps:{},prevProps:{},nextProps:{},gridProps:{},gridHeadProps:{},gridBodyProps:{},gridRowProps:{},headCellProps:{},cellProps:{},cellTriggerProps:{},dir:{},locale:{},modelValue:{},defaultValue:{},multiple:{type:Boolean},placeholder:{},defaultPlaceholder:{},readonly:{type:Boolean},pagedNavigation:{type:Boolean},preventDeselect:{type:Boolean},weekStartsOn:{},weekdayFormat:{},calendarLabel:{},fixedWeeks:{type:Boolean},maxValue:{},minValue:{},numberOfMonths:{},initialFocus:{type:Boolean},isDateDisabled:{},isDateUnavailable:{},nextPage:{},prevPage:{},disableDaysOutsideCurrentView:{type:Boolean},asChild:{type:Boolean},as:{}},emits:[`update:open`,`escapeKeyDown`,`pointerDownOutside`,`focusOutside`,`interactOutside`,`openAutoFocus`,`closeAutoFocus`,`update:modelValue`,`update:placeholder`],setup(s,{emit:_}){let v=s,y=_,b=m(v,[`class`,`size`,`ui`]),x=p(y);return g(i(()=>{let t=r({size:v.size}),i=n({size:v.size});return e(Object.assign(t,i),v.ui,{root:v.class})})),(e,n)=>(l(),a(d(h),c(d(b),u(d(x))),{default:f(({calendarProps:e,close:n,onUpdateModelValue:r,onUpdatePlaceholder:i})=>[o(t,c(e,{size:s.size,ui:s.calendarUi,"onUpdate:modelValue":e=>{r(e),n()},"onUpdate:placeholder":i}),null,16,[`size`,`ui`,`onUpdate:modelValue`,`onUpdate:placeholder`])]),_:1},16))}});export{_ as default};
1
+ import{mergeVariants as e}from"../../theme/shared.js";import"../../theme/index.js";import t from"../calendar/calendar.js";import{dateFieldVariants as n}from"../date-field/variants.js";import{datePickerVariants as r}from"./variants.js";import{computed as i,createBlock as a,createVNode as o,defineComponent as s,mergeProps as c,openBlock as l,toHandlers as u,unref as d,withCtx as f}from"vue";import{useForwardListeners as p,useOmitProps as m}from"@soybeanjs/headless/composables";import{DatePickerCompact as h,provideDatePickerUi as g}from"@soybeanjs/headless/date-picker";const _=s({name:`SDatePicker`,__name:`date-picker`,props:{class:{type:[Boolean,null,String,Object,Array]},size:{},ui:{},calendarUi:{},dateFieldProps:{},placement:{},showArrow:{type:Boolean},triggerProps:{},portalProps:{},positionerProps:{},popupProps:{},arrowProps:{},closeProps:{},disabled:{type:Boolean},open:{type:Boolean,default:void 0},defaultOpen:{type:Boolean},modal:{type:Boolean},headerProps:{},headingProps:{},prevProps:{},nextProps:{},gridProps:{},gridHeadProps:{},gridBodyProps:{},gridRowProps:{},headCellProps:{},cellProps:{},cellTriggerProps:{},dir:{},locale:{},modelValue:{},defaultValue:{},multiple:{},placeholder:{},defaultPlaceholder:{},readonly:{type:Boolean},pagedNavigation:{type:Boolean},preventDeselect:{type:Boolean},weekStartsOn:{},weekdayFormat:{},calendarLabel:{},fixedWeeks:{type:Boolean},maxValue:{},minValue:{},numberOfMonths:{},initialFocus:{type:Boolean},isDateDisabled:{},isDateUnavailable:{},nextPage:{},prevPage:{},disableDaysOutsideCurrentView:{type:Boolean},asChild:{type:Boolean},as:{}},emits:[`update:open`,`escapeKeyDown`,`pointerDownOutside`,`focusOutside`,`interactOutside`,`openAutoFocus`,`closeAutoFocus`,`update:modelValue`,`update:placeholder`],setup(s,{emit:_}){let v=s,y=_,b=m(v,[`class`,`size`,`ui`]),x=p(y);return g(i(()=>{let t=r({size:v.size}),i=n({size:v.size});return e(Object.assign(t,i),v.ui,{root:v.class})})),(e,n)=>(l(),a(d(h),c(d(b),u(d(x))),{default:f(({calendarProps:e,close:n,onUpdateModelValue:r,onUpdatePlaceholder:i})=>[o(t,c(e,{size:s.size,ui:s.calendarUi,"onUpdate:modelValue":e=>{r(e),n()},"onUpdate:placeholder":i}),null,16,[`size`,`ui`,`onUpdate:modelValue`,`onUpdate:placeholder`])]),_:1},16))}});export{_ as default};
@@ -1 +1 @@
1
- import{mergeVariants as e}from"../../theme/shared.js";import{miniSizeMap as t}from"../../theme/config.js";import"../../theme/index.js";import{buttonIconVariants as n}from"../button/variants.js";import{inputVariants as r}from"./variants.js";import{computed as i,createBlock as a,createSlots as o,defineComponent as s,guardReactiveProps as c,mergeProps as l,normalizeProps as u,openBlock as d,renderList as f,renderSlot as p,unref as m,useSlots as h,withCtx as g}from"vue";import{useOmitProps as _}from"@soybeanjs/headless/composables";import{keysOf as v}from"@soybeanjs/utils";import{InputCompact as y,provideInputUi as b}from"@soybeanjs/headless/input";const x=s({name:`SInput`,__name:`input`,props:{class:{type:[Boolean,null,String,Object,Array]},size:{},ui:{},inputRef:{type:Function},clearable:{type:Boolean},controlProps:{},clearProps:{},defaultValue:{},modelValue:{},id:{},autofocus:{type:Boolean},disabled:{type:Boolean},maxlength:{},minlength:{},pattern:{},placeholder:{},readonly:{type:Boolean},name:{},required:{type:Boolean}},emits:[`update:modelValue`],setup(s,{emit:x}){let S=s,C=x,w=_(S,[`class`,`size`,`ui`]),T=h(),E=i(()=>v(T));return b(i(()=>{let i=t[S.size??`md`];return e(Object.assign(r({size:S.size}),{$base:{clear:n({size:i,shape:`circle`})}}),S.ui,{root:S.class})})),(e,t)=>(d(),a(m(y),l(m(w),{"onUpdate:modelValue":t[0]||=e=>C(`update:modelValue`,e)}),o({_:2},[f(E.value,t=>({name:t,fn:g(n=>[p(e.$slots,t,u(c(n)))])}))]),1040))}});export{x as default};
1
+ import{mergeVariants as e}from"../../theme/shared.js";import{miniSizeMap as t}from"../../theme/config.js";import"../../theme/index.js";import{buttonIconVariants as n}from"../button/variants.js";import{inputVariants as r}from"./variants.js";import{computed as i,createBlock as a,createSlots as o,defineComponent as s,guardReactiveProps as c,mergeProps as l,normalizeProps as u,openBlock as d,renderList as f,renderSlot as p,unref as m,useSlots as h,withCtx as g}from"vue";import{useOmitProps as _}from"@soybeanjs/headless/composables";import{keysOf as v}from"@soybeanjs/utils";import{InputCompact as y,provideInputUi as b}from"@soybeanjs/headless/input";const x=s({name:`SInput`,__name:`input`,props:{class:{type:[Boolean,null,String,Object,Array]},size:{},ui:{},inputRef:{type:Function},clearable:{type:Boolean},controlProps:{},clearProps:{},defaultValue:{},modelValue:{},disabled:{type:Boolean},readonly:{type:Boolean},rootProps:{},name:{},required:{type:Boolean},id:{},autofocus:{type:Boolean},autocomplete:{},maxlength:{},minlength:{},pattern:{},placeholder:{},type:{}},emits:[`update:modelValue`],setup(s,{emit:x}){let S=s,C=x,w=_(S,[`class`,`size`,`ui`]),T=h(),E=i(()=>v(T));return b(i(()=>{let i=t[S.size??`md`];return e(Object.assign(r({size:S.size}),{$base:{clear:n({size:i,shape:`circle`})}}),S.ui,{root:S.class})})),(e,t)=>(d(),a(m(y),l(m(w),{"onUpdate:modelValue":t[0]||=e=>C(`update:modelValue`,e)}),o({_:2},[f(E.value,t=>({name:t,fn:g(n=>[p(e.$slots,t,u(c(n)))])}))]),1040))}});export{x as default};
@@ -1 +1 @@
1
- import{mergeVariants as e}from"../../theme/shared.js";import{miniSizeMap as t}from"../../theme/config.js";import"../../theme/index.js";import{buttonIconVariants as n}from"../button/variants.js";import{inputNumberVariants as r}from"./variants.js";import{computed as i,createBlock as a,createSlots as o,defineComponent as s,guardReactiveProps as c,mergeProps as l,normalizeProps as u,openBlock as d,renderList as f,renderSlot as p,unref as m,useSlots as h,withCtx as g}from"vue";import{useOmitProps as _}from"@soybeanjs/headless/composables";import{keysOf as v}from"@soybeanjs/utils";import{InputNumberCompact as y,provideInputNumberUi as b}from"@soybeanjs/headless/input-number";const x=s({name:`SInputNumber`,__name:`input-number`,props:{class:{type:[Boolean,null,String,Object,Array]},size:{},ui:{},center:{type:Boolean},clearable:{type:Boolean},inputRef:{type:Function},controlProps:{},incrementProps:{},decrementProps:{},clearProps:{},defaultValue:{},modelValue:{},min:{},max:{},step:{},stepSnapping:{type:Boolean},focusOnChange:{type:Boolean},formatOptions:{},locale:{},disableWheelChange:{type:Boolean},invertWheelChange:{type:Boolean},id:{},autofocus:{type:Boolean},disabled:{type:Boolean},maxlength:{},minlength:{},pattern:{},placeholder:{},readonly:{type:Boolean},name:{},required:{type:Boolean}},emits:[`update:modelValue`,`clear`],setup(s,{emit:x}){let S=s,C=x,w=_(S,[`class`,`size`,`ui`,`center`]),T=h(),E=i(()=>v(T));return b(i(()=>{let i=t[S.size??`md`];return e(Object.assign(r({size:S.size,center:S.center}),{$base:{decrement:n({size:i}),increment:n({size:i}),clear:n({size:i,shape:`circle`})}}),S.ui,{root:S.class})})),(e,t)=>(d(),a(m(y),l(m(w),{"onUpdate:modelValue":t[0]||=e=>C(`update:modelValue`,e)}),o({_:2},[f(E.value,t=>({name:t,fn:g(n=>[p(e.$slots,t,u(c(n)))])}))]),1040))}});export{x as default};
1
+ import{mergeVariants as e}from"../../theme/shared.js";import{miniSizeMap as t}from"../../theme/config.js";import"../../theme/index.js";import{buttonIconVariants as n}from"../button/variants.js";import{inputNumberVariants as r}from"./variants.js";import{computed as i,createBlock as a,createSlots as o,defineComponent as s,guardReactiveProps as c,mergeProps as l,normalizeProps as u,openBlock as d,renderList as f,renderSlot as p,unref as m,useSlots as h,withCtx as g}from"vue";import{useOmitProps as _}from"@soybeanjs/headless/composables";import{keysOf as v}from"@soybeanjs/utils";import{InputNumberCompact as y,provideInputNumberUi as b}from"@soybeanjs/headless/input-number";const x=s({name:`SInputNumber`,__name:`input-number`,props:{class:{type:[Boolean,null,String,Object,Array]},size:{},ui:{},center:{type:Boolean},clearable:{type:Boolean},inputRef:{type:Function},controlProps:{},incrementProps:{},decrementProps:{},clearProps:{},defaultValue:{},modelValue:{},min:{},max:{},step:{},stepSnapping:{type:Boolean},focusOnChange:{type:Boolean},formatOptions:{},locale:{},disableWheelChange:{type:Boolean},invertWheelChange:{type:Boolean},rootProps:{},name:{},required:{type:Boolean},id:{},autofocus:{type:Boolean},autocomplete:{},disabled:{type:Boolean},maxlength:{},minlength:{},pattern:{},placeholder:{},readonly:{type:Boolean},type:{}},emits:[`update:modelValue`,`clear`],setup(s,{emit:x}){let S=s,C=x,w=_(S,[`class`,`size`,`ui`,`center`]),T=h(),E=i(()=>v(T));return b(i(()=>{let i=t[S.size??`md`];return e(Object.assign(r({size:S.size,center:S.center}),{$base:{decrement:n({size:i}),increment:n({size:i}),clear:n({size:i,shape:`circle`})}}),S.ui,{root:S.class})})),(e,t)=>(d(),a(m(y),l(m(w),{"onUpdate:modelValue":t[0]||=e=>C(`update:modelValue`,e)}),o({_:2},[f(E.value,t=>({name:t,fn:g(n=>[p(e.$slots,t,u(c(n)))])}))]),1040))}});export{x as default};
@@ -1 +1 @@
1
- import{mergeVariants as e}from"../../theme/shared.js";import{miniSizeMap as t}from"../../theme/config.js";import"../../theme/index.js";import{buttonIconVariants as n}from"../button/variants.js";import{inputVariants as r}from"../input/variants.js";import{computed as i,createBlock as a,createSlots as o,defineComponent as s,guardReactiveProps as c,mergeProps as l,normalizeProps as u,openBlock as d,renderList as f,renderSlot as p,unref as m,useSlots as h,withCtx as g}from"vue";import{useOmitProps as _}from"@soybeanjs/headless/composables";import{keysOf as v}from"@soybeanjs/utils";import{PasswordCompact as y,providePasswordUi as b}from"@soybeanjs/headless/password";const x=s({name:`SPassword`,__name:`password`,props:{class:{type:[Boolean,null,String,Object,Array]},size:{},ui:{},clearable:{type:Boolean},visible:{type:Boolean,default:void 0},inputRef:{},controlProps:{},clearProps:{},visibleProps:{},defaultValue:{},modelValue:{},id:{},autofocus:{type:Boolean},disabled:{type:Boolean},maxlength:{},minlength:{},pattern:{},placeholder:{},readonly:{type:Boolean},name:{},required:{type:Boolean}},emits:[`update:modelValue`,`update:visible`],setup(s,{emit:x}){let S=s,C=x,w=_(S,[`class`,`size`,`ui`]),T=h(),E=i(()=>v(T));return b(i(()=>{let i=t[S.size??`md`];return e(Object.assign(r({size:S.size}),{$base:{clear:n({size:i,shape:`circle`}),visible:n({size:i})}}),S.ui,{root:S.class})})),(e,t)=>(d(),a(m(y),l(m(w),{"onUpdate:modelValue":t[0]||=e=>C(`update:modelValue`,e),"onUpdate:visible":t[1]||=e=>C(`update:visible`,e)}),o({_:2},[f(E.value,t=>({name:t,fn:g(n=>[p(e.$slots,t,u(c(n)))])}))]),1040))}});export{x as default};
1
+ import{mergeVariants as e}from"../../theme/shared.js";import{miniSizeMap as t}from"../../theme/config.js";import"../../theme/index.js";import{buttonIconVariants as n}from"../button/variants.js";import{inputVariants as r}from"../input/variants.js";import{computed as i,createBlock as a,createSlots as o,defineComponent as s,guardReactiveProps as c,mergeProps as l,normalizeProps as u,openBlock as d,renderList as f,renderSlot as p,unref as m,useSlots as h,withCtx as g}from"vue";import{useOmitProps as _}from"@soybeanjs/headless/composables";import{keysOf as v}from"@soybeanjs/utils";import{PasswordCompact as y,providePasswordUi as b}from"@soybeanjs/headless/password";const x=s({name:`SPassword`,__name:`password`,props:{class:{type:[Boolean,null,String,Object,Array]},size:{},ui:{},visible:{type:Boolean,default:void 0},visibleProps:{},inputRef:{},clearable:{type:Boolean},controlProps:{},clearProps:{},defaultValue:{},modelValue:{},disabled:{type:Boolean},readonly:{type:Boolean},rootProps:{},name:{},required:{type:Boolean},id:{},autofocus:{type:Boolean},autocomplete:{},maxlength:{},minlength:{},pattern:{},placeholder:{},type:{}},emits:[`update:modelValue`,`clear`,`update:visible`],setup(s,{emit:x}){let S=s,C=x,w=_(S,[`class`,`size`,`ui`]),T=h(),E=i(()=>v(T));return b(i(()=>{let i=t[S.size??`md`];return e(Object.assign(r({size:S.size}),{$base:{clear:n({size:i,shape:`circle`}),visible:n({size:i})}}),S.ui,{root:S.class})})),(e,t)=>(d(),a(m(y),l(m(w),{"onUpdate:modelValue":t[0]||=e=>C(`update:modelValue`,e),"onUpdate:visible":t[1]||=e=>C(`update:visible`,e)}),o({_:2},[f(E.value,t=>({name:t,fn:g(n=>[p(e.$slots,t,u(c(n)))])}))]),1040))}});export{x as default};
@@ -4,9 +4,11 @@ import * as _$vue from "vue";
4
4
  //#region src/components/password/password.vue.d.ts
5
5
  type __VLS_Slots = PasswordSlots;
6
6
  declare const __VLS_base: _$vue.DefineComponent<PasswordProps, {}, {}, {}, {}, _$vue.ComponentOptionsMixin, _$vue.ComponentOptionsMixin, {
7
+ clear: (event: PointerEvent) => any;
7
8
  "update:modelValue": (value: string) => any;
8
9
  "update:visible": (visible: boolean) => any;
9
10
  }, string, _$vue.PublicProps, Readonly<PasswordProps> & Readonly<{
11
+ onClear?: ((event: PointerEvent) => any) | undefined;
10
12
  "onUpdate:modelValue"?: ((value: string) => any) | undefined;
11
13
  "onUpdate:visible"?: ((visible: boolean) => any) | undefined;
12
14
  }>, {
@@ -13,13 +13,13 @@ type __VLS_Slots = {} & {
13
13
  default?: (props: typeof __VLS_8) => any;
14
14
  };
15
15
  declare const __VLS_base: _$vue.DefineComponent<SplitterPanelProps, {}, {}, {}, {}, _$vue.ComponentOptionsMixin, _$vue.ComponentOptionsMixin, {
16
+ resize: (size: number, prevSize: number | undefined) => any;
16
17
  collapse: () => any;
17
18
  expand: () => any;
18
- resize: (size: number, prevSize: number | undefined) => any;
19
19
  }, string, _$vue.PublicProps, Readonly<SplitterPanelProps> & Readonly<{
20
+ onResize?: ((size: number, prevSize: number | undefined) => any) | undefined;
20
21
  onCollapse?: (() => any) | undefined;
21
22
  onExpand?: (() => any) | undefined;
22
- onResize?: ((size: number, prevSize: number | undefined) => any) | undefined;
23
23
  }>, {}, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
24
24
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
25
25
  declare const _default: typeof __VLS_export;
@@ -1 +1 @@
1
- import{mergeVariants as e}from"../../theme/shared.js";import{miniSizeMap as t}from"../../theme/config.js";import"../../theme/index.js";import{buttonIconVariants as n}from"../button/variants.js";import{tagsInputVariants as r}from"./variants.js";import{computed as i,createBlock as a,createSlots as o,defineComponent as s,guardReactiveProps as c,mergeProps as l,normalizeProps as u,openBlock as d,renderSlot as f,toHandlers as p,unref as m,useSlots as h,withCtx as g}from"vue";import{useForwardListeners as _,useOmitProps as v}from"@soybeanjs/headless/composables";import{TagsInputCompact as y,provideTagsInputUi as b}from"@soybeanjs/headless/tags-input";const x=s({name:`STagsInput`,__name:`tags-input`,props:{class:{type:[Boolean,null,String,Object,Array]},size:{},ui:{},clearable:{type:Boolean},controlProps:{},clearProps:{},itemProps:{},itemTextProps:{},itemDeleteProps:{},dir:{},modelValue:{},defaultValue:{},addOnPaste:{type:Boolean},addOnTab:{type:Boolean},addOnBlur:{type:Boolean},duplicate:{type:Boolean},delimiter:{},max:{},displayValue:{type:Function},id:{},autofocus:{type:Boolean},disabled:{type:Boolean},maxlength:{},minlength:{},pattern:{},placeholder:{},readonly:{type:Boolean},name:{},required:{type:Boolean}},emits:[`update:modelValue`,`invalid`,`addTag`,`removeTag`],setup(s,{emit:x}){let S=s,C=x,w=h(),T=v(S,[`class`,`size`,`ui`]),E=_(C);return b(i(()=>{let i=t[S.size||`md`];return e(Object.assign(r({size:S.size}),{$base:{itemDelete:n({size:i,shape:`circle`}),clear:n({size:S.size})}}),S.ui,{root:S.class})})),(e,t)=>(d(),a(m(y),l(m(T),p(m(E))),o({_:2},[w.item?{name:`item`,fn:g(t=>[f(e.$slots,`item`,u(c(t)))]),key:`0`}:void 0]),1040))}});export{x as default};
1
+ import{mergeVariants as e}from"../../theme/shared.js";import{miniSizeMap as t}from"../../theme/config.js";import"../../theme/index.js";import{buttonIconVariants as n}from"../button/variants.js";import{tagsInputVariants as r}from"./variants.js";import{computed as i,createBlock as a,createSlots as o,defineComponent as s,guardReactiveProps as c,mergeProps as l,normalizeProps as u,openBlock as d,renderSlot as f,toHandlers as p,unref as m,useSlots as h,withCtx as g}from"vue";import{useForwardListeners as _,useOmitProps as v}from"@soybeanjs/headless/composables";import{TagsInputCompact as y,provideTagsInputUi as b}from"@soybeanjs/headless/tags-input";const x=s({name:`STagsInput`,__name:`tags-input`,props:{class:{type:[Boolean,null,String,Object,Array]},size:{},ui:{},clearable:{type:Boolean},controlProps:{},clearProps:{},itemProps:{},itemTextProps:{},itemDeleteProps:{},dir:{},modelValue:{},defaultValue:{},addOnPaste:{type:Boolean},addOnTab:{type:Boolean},addOnBlur:{type:Boolean},duplicate:{type:Boolean},delimiter:{},max:{},displayValue:{type:Function},id:{},autofocus:{type:Boolean},autocomplete:{},disabled:{type:Boolean},maxlength:{},minlength:{},pattern:{},placeholder:{},readonly:{type:Boolean},type:{},name:{},required:{type:Boolean}},emits:[`update:modelValue`,`invalid`,`addTag`,`removeTag`],setup(s,{emit:x}){let S=s,C=x,w=h(),T=v(S,[`class`,`size`,`ui`]),E=_(C);return b(i(()=>{let i=t[S.size||`md`];return e(Object.assign(r({size:S.size}),{$base:{itemDelete:n({size:i,shape:`circle`}),clear:n({size:S.size})}}),S.ui,{root:S.class})})),(e,t)=>(d(),a(m(y),l(m(T),p(m(E))),o({_:2},[w.item?{name:`item`,fn:g(t=>[f(e.$slots,`item`,u(c(t)))]),key:`0`}:void 0]),1040))}});export{x as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@soybeanjs/ui",
3
- "version": "0.21.0",
3
+ "version": "0.22.1",
4
4
  "description": "SoybeanUI is built on top of SoybeanHeadless, providing a collection of styled components for Vue 3.",
5
5
  "homepage": "https://github.com/soybeanjs/soybean-ui",
6
6
  "bugs": {
@@ -44,20 +44,17 @@
44
44
  "registry": "https://registry.npmjs.org/"
45
45
  },
46
46
  "dependencies": {
47
- "@formkit/auto-animate": "^0.9.0",
48
47
  "@iconify/vue": "^5.0.1",
49
- "@soybeanjs/colord": "^0.5.0",
50
- "@soybeanjs/hooks": "^0.2.0",
48
+ "@soybeanjs/hooks": "^0.3.0",
51
49
  "@soybeanjs/shadcn-theme": "^0.3.1",
52
50
  "@soybeanjs/utils": "^0.1.1",
53
- "@vueuse/core": "^14.3.0",
54
51
  "clsx": "^2.1.1",
55
52
  "fuse.js": "^7.3.0",
56
53
  "tailwind-merge": "^3.6.0",
57
54
  "tailwind-variants": "^3.2.2",
58
55
  "valibot": "^1.4.0",
59
56
  "zod": "^4.4.3",
60
- "@soybeanjs/headless": "^0.21.0"
57
+ "@soybeanjs/headless": "^0.22.1"
61
58
  },
62
59
  "devDependencies": {
63
60
  "@soybeanjs/cli": "^1.7.2",
@@ -71,6 +68,7 @@
71
68
  "@vitest/coverage-v8": "^4.1.6",
72
69
  "@vue/test-utils": "^2.4.10",
73
70
  "axe-core": "^4.11.4",
71
+ "cac": "^7.0.0",
74
72
  "eslint": "^10.3.0",
75
73
  "happy-dom": "^20.9.0",
76
74
  "lint-staged": "^17.0.4",
@@ -92,8 +90,8 @@
92
90
  "vite-plugin-vue-meta-layouts": "^0.6.1",
93
91
  "vitest": "^4.1.6",
94
92
  "vue": "^3.5.34",
95
- "vue-router": "^5.0.6",
96
- "vue-tsc": "^3.2.8"
93
+ "vue-router": "^5.0.7",
94
+ "vue-tsc": "^3.2.9"
97
95
  },
98
96
  "simple-git-hooks": {
99
97
  "commit-msg": "pnpm soy git-commit-verify",
@@ -103,7 +101,7 @@
103
101
  "*": "oxlint . --fix && oxfmt"
104
102
  },
105
103
  "scripts": {
106
- "build": "pnpm build:headless && pnpm build:ui && pnpm build:css",
104
+ "build": "pnpm build:headless && pnpm build:ui && pnpm build:css && pnpm sui skills",
107
105
  "build:css": "unocss build",
108
106
  "build:docs": "pnpm --filter @soybeanjs/ui-docs build",
109
107
  "build:headless": "pnpm --filter @soybeanjs/headless build",
@@ -115,24 +113,16 @@
115
113
  "dev:docs": "pnpm --filter @soybeanjs/ui-docs dev",
116
114
  "lint": "oxlint --fix && eslint --fix headless/ src/",
117
115
  "fmt": "oxfmt",
118
- "gen:api": "tsx scripts/api.ts && tsx scripts/api-i18n.ts && oxfmt docs/src/generated/api/",
119
- "gen:api:i18n": "tsx scripts/api-i18n.ts",
120
- "gen:changelog": "tsx scripts/changelog.ts && tsx scripts/changelog-i18n.ts && oxfmt docs/src/generated/changelog/ docs/src/generated/changelog-locales/",
121
- "translate:api:i18n": "tsx scripts/api-i18n-translate.ts",
122
- "translate:changelog:i18n": "tsx scripts/changelog-i18n-translate.ts",
123
- "translate:locale": "tsx scripts/locale-translate.ts",
124
- "gen:headless": "tsx scripts/headless.ts && oxfmt headless/src/constants/components.ts headless/src/namespaced/index.ts",
125
- "gen:ui": "tsx scripts/ui.ts && oxfmt src/constants/components.ts",
126
116
  "preview": "vite preview",
127
117
  "preview:docs": "pnpm --filter @soybeanjs/ui-docs preview",
128
118
  "publish-pkg": "pnpm publish -r --access public",
129
119
  "release": "soy release",
120
+ "sui": "tsx scripts/cli.ts",
130
121
  "test": "vitest run",
131
122
  "test:coverage": "vitest run --coverage",
132
123
  "test:ui": "vitest --ui",
133
124
  "test:watch": "vitest watch",
134
125
  "typecheck": "vue-tsc --noEmit --skipLibCheck",
135
- "unstub": "tsx scripts/stub.ts --reset",
136
126
  "upkg": "soy ncu"
137
127
  }
138
128
  }