diff --git a/examples/uni/src/pages-navigation/accordion/accordion.vue b/examples/uni/src/pages-navigation/accordion/accordion.vue new file mode 100644 index 0000000..8fd74c5 --- /dev/null +++ b/examples/uni/src/pages-navigation/accordion/accordion.vue @@ -0,0 +1,22 @@ + + + diff --git a/examples/uni/src/pages-navigation/accordion/base.vue b/examples/uni/src/pages-navigation/accordion/base.vue new file mode 100644 index 0000000..0fbb509 --- /dev/null +++ b/examples/uni/src/pages-navigation/accordion/base.vue @@ -0,0 +1,19 @@ + + + diff --git a/examples/uni/src/pages-navigation/accordion/bordered.vue b/examples/uni/src/pages-navigation/accordion/bordered.vue new file mode 100644 index 0000000..2a6190b --- /dev/null +++ b/examples/uni/src/pages-navigation/accordion/bordered.vue @@ -0,0 +1,38 @@ + + + diff --git a/examples/uni/src/pages-navigation/accordion/controlled.vue b/examples/uni/src/pages-navigation/accordion/controlled.vue new file mode 100644 index 0000000..686d5f5 --- /dev/null +++ b/examples/uni/src/pages-navigation/accordion/controlled.vue @@ -0,0 +1,56 @@ + + + diff --git a/examples/uni/src/pages-navigation/accordion/custom.vue b/examples/uni/src/pages-navigation/accordion/custom.vue new file mode 100644 index 0000000..b742eb0 --- /dev/null +++ b/examples/uni/src/pages-navigation/accordion/custom.vue @@ -0,0 +1,68 @@ + + + diff --git a/examples/uni/src/pages-navigation/accordion/disabled.vue b/examples/uni/src/pages-navigation/accordion/disabled.vue new file mode 100644 index 0000000..c2888cd --- /dev/null +++ b/examples/uni/src/pages-navigation/accordion/disabled.vue @@ -0,0 +1,22 @@ + + + diff --git a/examples/uni/src/pages-navigation/accordion/icon.vue b/examples/uni/src/pages-navigation/accordion/icon.vue new file mode 100644 index 0000000..697c849 --- /dev/null +++ b/examples/uni/src/pages-navigation/accordion/icon.vue @@ -0,0 +1,39 @@ + + + diff --git a/examples/uni/src/pages-navigation/accordion/multiple.vue b/examples/uni/src/pages-navigation/accordion/multiple.vue new file mode 100644 index 0000000..792385e --- /dev/null +++ b/examples/uni/src/pages-navigation/accordion/multiple.vue @@ -0,0 +1,22 @@ + + + diff --git a/packages/skiyee-uni-ui/src/components/sk-accordion-item.vue b/packages/skiyee-uni-ui/src/components/sk-accordion-item.vue new file mode 100644 index 0000000..eb1ebb4 --- /dev/null +++ b/packages/skiyee-uni-ui/src/components/sk-accordion-item.vue @@ -0,0 +1,141 @@ + + + + + diff --git a/packages/skiyee-uni-ui/src/components/sk-accordion.vue b/packages/skiyee-uni-ui/src/components/sk-accordion.vue new file mode 100644 index 0000000..9e11354 --- /dev/null +++ b/packages/skiyee-uni-ui/src/components/sk-accordion.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/packages/skiyee-uni-ui/src/constants/accordion.ts b/packages/skiyee-uni-ui/src/constants/accordion.ts new file mode 100644 index 0000000..e3862b0 --- /dev/null +++ b/packages/skiyee-uni-ui/src/constants/accordion.ts @@ -0,0 +1,34 @@ +/** + * Accordion 手风琴常量 + * + * @author sKy(skiyee) + * @qq 319619193 + * @github https://github.com/skiyee + */ + +import type { InjectionKey } from 'vue' + +import type { SkAccordionItemUcvProps, SkAccordionUcvProps } from '../styles' + +/** + * Accordion 父组件注入键 + */ +export const SK_ACCORDION_KEY: InjectionKey<{ + props: { + modelValue?: string | number | (string | number)[]; + accordion?: boolean; + border?: boolean; + iconPosition?: SkAccordionUcvProps['iconPosition']; + expandIcon?: string; + collapseIcon?: string; + disabled?: boolean; + }; + /** + * 判断某个面板是否处于展开状态 + */ + isActive: (name: string | number) => boolean; + /** + * 切换面板的展开状态 + */ + toggle: (name: string | number) => void; +}> = Symbol('sk-accordion') diff --git a/packages/skiyee-uni-ui/src/constants/index.ts b/packages/skiyee-uni-ui/src/constants/index.ts index b747770..1f97ff4 100644 --- a/packages/skiyee-uni-ui/src/constants/index.ts +++ b/packages/skiyee-uni-ui/src/constants/index.ts @@ -5,6 +5,7 @@ * @qq 319619193 * @github https://github.com/skiyee */ +export * from './accordion' export * from './checkbox' export * from './field' diff --git a/packages/skiyee-uni-ui/src/styles/index.ts b/packages/skiyee-uni-ui/src/styles/index.ts index cd3dee8..4b4ebf4 100644 --- a/packages/skiyee-uni-ui/src/styles/index.ts +++ b/packages/skiyee-uni-ui/src/styles/index.ts @@ -5,6 +5,11 @@ * @qq 319619193 * @github https://github.com/skiyee */ +export type { SkAccordionUcvProps } from './sk-accordion' +export { SkAccordionUcv } from './sk-accordion' + +export type { SkAccordionItemUcvProps } from './sk-accordion-item' +export { SkAccordionItemUcv } from './sk-accordion-item' export type { SkBadgeUcvProps } from './sk-badge' export { SkBadgeUcv } from './sk-badge' diff --git a/packages/skiyee-uni-ui/src/styles/sk-accordion-item.ts b/packages/skiyee-uni-ui/src/styles/sk-accordion-item.ts new file mode 100644 index 0000000..d1495a2 --- /dev/null +++ b/packages/skiyee-uni-ui/src/styles/sk-accordion-item.ts @@ -0,0 +1,72 @@ +// @unocss-include +/** + * sk-accordion-item 由 @skiyee/ucv 生成的样式组件 + * + * @author sKy(skiyee) + * @qq 319619193 + * @github https://github.com/skiyee + * + * @example + * ```ts + * const classes = SkAccordionItemUcv(props) + * ``` + * + * @see 更多示例请参考文档: https://skiyee-ui.netlify.app/docs/components/navigation/accordion + */ +import type { InferProps } from '@skiyee/ucv' + +import { ucv } from '@skiyee/ucv' + +export const SkAccordionItemUcv = ucv({ + element: { + root: 'w-full', + header: 'flex items-center justify-between sk-unit:(px-16 py-12) cursor-pointer select-none bg-subtle transition-colors duration-200', + title: 'flex-1 text-primary text-body-medium font-medium', + icon: 'sk-unit:size-20 text-secondary transition-transform duration-200', + content: 'overflow-hidden transition-all duration-300 ease-in-out', + contentInner: 'sk-unit:(px-16 py-12) text-secondary text-body-medium', + }, + variants: { + active: { + true: { + header: 'sk-variant:bg-muted', + icon: 'sk-variant:rotate-180', + }, + false: { + content: 'sk-variant:max-h-0', + }, + }, + disabled: { + true: { + header: 'sk-variant:(opacity-60 cursor-not-allowed pointer-events-none)', + }, + false: {}, + }, + border: { + true: { + root: 'sk-variant:border-b-(~ solid base) last:border-b-0', + }, + false: { + root: 'sk-variant:sk-unit:mb-8 last:mb-0', + header: 'sk-variant:rounded-medium', + }, + }, + iconPosition: { + left: { + header: 'sk-variant:flex-row-reverse', + title: 'sk-variant:sk-unit:ml-12', + }, + right: { + title: 'sk-variant:sk-unit:mr-12', + }, + }, + }, + defaults: { + active: false, + disabled: false, + border: true, + iconPosition: 'right', + }, +}) + +export type SkAccordionItemUcvProps = InferProps diff --git a/packages/skiyee-uni-ui/src/styles/sk-accordion.ts b/packages/skiyee-uni-ui/src/styles/sk-accordion.ts new file mode 100644 index 0000000..cd47ac7 --- /dev/null +++ b/packages/skiyee-uni-ui/src/styles/sk-accordion.ts @@ -0,0 +1,38 @@ +// @unocss-include +/** + * sk-accordion 由 @skiyee/ucv 生成的样式组件 + * + * @author sKy(skiyee) + * @qq 319619193 + * @github https://github.com/skiyee + * + * @example + * ```ts + * const classes = SkAccordionUcv(props) + * ``` + * + * @see 更多示例请参考文档: https://skiyee-ui.netlify.app/docs/components/navigation/accordion + */ +import type { InferProps } from '@skiyee/ucv' + +import { ucv } from '@skiyee/ucv' + +export const SkAccordionUcv = ucv({ + element: 'w-full', + variants: { + border: { + true: 'border-(~ solid base) rounded-medium overflow-hidden', + false: '', + }, + iconPosition: { + left: '', + right: '', + }, + }, + defaults: { + border: true, + iconPosition: 'right', + }, +}) + +export type SkAccordionUcvProps = InferProps diff --git a/packages/skiyee-uni-ui/src/types/accordion.ts b/packages/skiyee-uni-ui/src/types/accordion.ts new file mode 100644 index 0000000..97bbb8d --- /dev/null +++ b/packages/skiyee-uni-ui/src/types/accordion.ts @@ -0,0 +1,131 @@ +/** + * Accordion 手风琴类型定义 + * + * @author sKy(skiyee) + * @qq 319619193 + * @github https://github.com/skiyee + */ + +import type { SkAccordionItemUcvProps, SkAccordionUcvProps } from '../styles' + +/** + * Accordion 父组件属性 + */ +export interface SkAccordionProps { + /** + * 当前展开的面板 + * - 手风琴模式:string | number + * - 多选模式:(string | number)[] + */ + modelValue?: string | number | (string | number)[]; + /** + * 是否开启手风琴模式(每次只能展开一个) + * @default false + */ + accordion?: boolean; + /** + * 是否显示边框 + * @default true + */ + border?: boolean; + /** + * 图标位置 + * @default 'right' + */ + iconPosition?: SkAccordionUcvProps['iconPosition']; + /** + * 展开时的图标 + * @default 'i-lucide:chevron-up' + */ + expandIcon?: string; + /** + * 收起时的图标 + * @default 'i-lucide:chevron-down' + */ + collapseIcon?: string; + /** + * 用于拓展当前基础样式 + */ + clax?: SkAccordionUcvProps['clax']; +} + +/** + * Accordion 父组件事件 + */ +export interface SkAccordionEmits { + /** + * 当展开的面板改变时触发 + * @param value 当前展开的面板 + */ + (name: 'update:modelValue', value: string | number | (string | number)[]): void; + /** + * 当展开的面板改变时触发 + * @param value 当前展开的面板 + */ + (name: 'change', value: string | number | (string | number)[]): void; +} + +/** + * Accordion 父组件插槽 + */ +export interface SkAccordionSlots { + /** + * AccordionItem 列表 + */ + default?: () => any; +} + +/** + * AccordionItem 子组件属性 + */ +export interface SkAccordionItemProps { + /** + * 唯一标识符 + */ + name?: string | number; + /** + * 标题 + */ + title?: string; + /** + * 是否禁用 + * @default false + */ + disabled?: boolean; + /** + * 自定义图标 + */ + icon?: string; + /** + * 用于拓展当前基础样式 + */ + clax?: SkAccordionItemUcvProps['clax']; +} + +/** + * AccordionItem 子组件事件 + */ +export interface SkAccordionItemEmits { + /** + * 点击标题时触发 + */ + (name: 'click'): void; +} + +/** + * AccordionItem 子组件插槽 + */ +export interface SkAccordionItemSlots { + /** + * 内容区域 + */ + default?: () => any; + /** + * 标题区域 + */ + title?: () => any; + /** + * 图标区域 + */ + icon?: () => any; +}