diff --git a/packages/docs/badge.md b/packages/docs/badge.md new file mode 100644 index 0000000000000000000000000000000000000000..b0e72ebf4b04e4396ccb8800f8487c8382c24036 --- /dev/null +++ b/packages/docs/badge.md @@ -0,0 +1,8 @@ +# Badge 徽标 + +| name | type | 默认值 | 说明 | +| :----- | :--------------- | :----- | -------------------------------------------------------------------- | +| value | string \| number | '' | 可选,显示值 | +| max | number | 99 | 可选,最大值,超过最大值显示${max}+(仅当 value 类型为 number 时生效) | +| offset | number [] | [] | 可选,徽标位置偏移量 | +| dot | boolean | fasle | 可选,是否显示为小红点 | diff --git a/packages/docs/rate.md b/packages/docs/rate.md new file mode 100644 index 0000000000000000000000000000000000000000..de58c4814c0e3db8da9c34b30eaf870b9c79c0ac --- /dev/null +++ b/packages/docs/rate.md @@ -0,0 +1,27 @@ +# Rate 评分 + +## props + +| name | type | 默认值 | 说明 | +| :------------------ | :--------------------------------------------- | :------- | -------------------------- | +| count | number | 5 | 可选,评分数量 | +| modelValue(v-model) | number | - | 可选,双向绑定值 | +| defaultValue | number | 0 | 可选,非受控状态时,默认值 | +| size | 'large' \| 'normal' \| 'small' | 'normal' | 标签尺寸 | +| color | 'normal' \| 'primary' \| 'warning' \| 'danger' | 'normal' | 标签颜色 | +| readonly | boolean | false | 可选,是否只读 | +| allowHalf | boolean | false | 可选,是否支持半选 | +| clearable | boolean | false | 可选,是否支持可清 | +| 空 | + +## event + +| name | 参数 | 说明 | +| :----- | :---------- | :------------------- | +| change | val: number | 双向绑定值改变时触发 | + +## slot + +| name | 参数 | 说明 | +| :--- | :--- | :------------- | +| icon | - | 自定义评分图标 | diff --git a/packages/docs/tag.md b/packages/docs/tag.md index 3eddd8bf039ffb68b32b48147048496af74c29f8..53dd9197f642208cabf09b3e3768318aadcfc512 100644 --- a/packages/docs/tag.md +++ b/packages/docs/tag.md @@ -6,8 +6,8 @@ | :--------------- | :--------------------------------------------- | :------- | ------------------------------------------------------- | | status | 'normal' \| 'success' \| 'warning' \| 'danger' | 'normal' | 标签状态 | | bordered | boolean | false | 是否有边框 | -| size | 'large' \| 'normal' \| 'small' | 'normal' | 标签形状 | -| shape | 'normal' \| 'round' | 'normal' | 尺寸 | +| size | 'large' \| 'normal' \| 'small' | 'normal' | 标签尺寸 | +| shape | 'normal' \| 'round' | 'normal' | 标签形状 | | closable | boolean | false | 是否可关闭 | | checkable | boolean | false | 是否可选中 | | checked(v-model) | boolean | false | 是否被选中(仅 checkable 为 true 生效) | diff --git a/packages/opendesign/src/components/badge/OBadge.vue b/packages/opendesign/src/components/badge/OBadge.vue new file mode 100644 index 0000000000000000000000000000000000000000..35b1aff4f72d8d917bfea968dda93a6f1e060d7c --- /dev/null +++ b/packages/opendesign/src/components/badge/OBadge.vue @@ -0,0 +1,37 @@ + + + diff --git a/packages/opendesign/src/components/badge/__demo__/BadgeBasic.vue b/packages/opendesign/src/components/badge/__demo__/BadgeBasic.vue new file mode 100644 index 0000000000000000000000000000000000000000..7d7da99d3399d2b10ab24222e2faa746bc605309 --- /dev/null +++ b/packages/opendesign/src/components/badge/__demo__/BadgeBasic.vue @@ -0,0 +1,20 @@ + + + diff --git a/packages/opendesign/src/components/badge/__demo__/BadgeColor.vue b/packages/opendesign/src/components/badge/__demo__/BadgeColor.vue new file mode 100644 index 0000000000000000000000000000000000000000..f367ad5cf45b8a901a01ab39a1e7bfb7afd92f1f --- /dev/null +++ b/packages/opendesign/src/components/badge/__demo__/BadgeColor.vue @@ -0,0 +1,20 @@ + + + diff --git a/packages/opendesign/src/components/badge/__demo__/BadgeDot.vue b/packages/opendesign/src/components/badge/__demo__/BadgeDot.vue new file mode 100644 index 0000000000000000000000000000000000000000..3cd80fe2400efc62824b1caa199678c70205c597 --- /dev/null +++ b/packages/opendesign/src/components/badge/__demo__/BadgeDot.vue @@ -0,0 +1,21 @@ + + + diff --git a/packages/opendesign/src/components/badge/__demo__/BadgeOffset.vue b/packages/opendesign/src/components/badge/__demo__/BadgeOffset.vue new file mode 100644 index 0000000000000000000000000000000000000000..c65059e83da0fe1e3b5850329866602b665cc92d --- /dev/null +++ b/packages/opendesign/src/components/badge/__demo__/BadgeOffset.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/packages/opendesign/src/components/badge/__demo__/BadgeOnly.vue b/packages/opendesign/src/components/badge/__demo__/BadgeOnly.vue new file mode 100644 index 0000000000000000000000000000000000000000..0340a7bbe0fe95f3e6f9e2e27a5f9725370db17d --- /dev/null +++ b/packages/opendesign/src/components/badge/__demo__/BadgeOnly.vue @@ -0,0 +1,15 @@ + + + diff --git a/packages/opendesign/src/components/badge/__demo__/BadgeSlot.vue b/packages/opendesign/src/components/badge/__demo__/BadgeSlot.vue new file mode 100644 index 0000000000000000000000000000000000000000..9c84d405e011dae64fa443248a96d424df0fba8a --- /dev/null +++ b/packages/opendesign/src/components/badge/__demo__/BadgeSlot.vue @@ -0,0 +1,16 @@ + + + diff --git a/packages/opendesign/src/components/badge/__demo__/IndexBadge.vue b/packages/opendesign/src/components/badge/__demo__/IndexBadge.vue new file mode 100644 index 0000000000000000000000000000000000000000..279380bc3b08b7bebfd2fc5f92372a919199db70 --- /dev/null +++ b/packages/opendesign/src/components/badge/__demo__/IndexBadge.vue @@ -0,0 +1,20 @@ + + + diff --git a/packages/opendesign/src/components/badge/index.ts b/packages/opendesign/src/components/badge/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..8df457451177ca8d7162cd3bb4252c668a7def17 --- /dev/null +++ b/packages/opendesign/src/components/badge/index.ts @@ -0,0 +1,13 @@ +import type { App } from 'vue'; + +import _OBadge from './OBadge.vue'; + +export * from './types'; + +const OBadge = Object.assign(_OBadge, { + install(app: App) { + app.component(_OBadge.name, _OBadge); + }, +}); + +export { OBadge }; diff --git a/packages/opendesign/src/components/badge/style/index.scss b/packages/opendesign/src/components/badge/style/index.scss new file mode 100644 index 0000000000000000000000000000000000000000..871e247f0ceeddcf9c2a5839eb40060a80efe86c --- /dev/null +++ b/packages/opendesign/src/components/badge/style/index.scss @@ -0,0 +1,44 @@ +@use './var.scss'; + +.o-badge { + position: relative; + display: inline-block; +} + +.o-badge-content { + position: absolute; + top: 0; + right: 0; + transform: translate(50%, -50%); + transform-origin: 100% 0; + color: var(--badge-color); + background-color: var(--badge-bg); + min-width: 20px; + font-size: var(--badge-text-size); + line-height: var(--badge-text-height); + text-align: center; + height: var(--badge-text-height); + padding-left: 4px; + padding-right: 4px; + border-radius: var(--badge-border); +} + +.o-badge-dot { + .o-badge-content { + height: 8px; + width: 8px; + padding: 0; + border-radius: 50%; + min-width: unset; + } +} + +.o-badge-only { + .o-badge-content { + position: relative; + top: unset; + right: unset; + transform: none; + display: inline-block; + } +} diff --git a/packages/opendesign/src/components/badge/style/index.ts b/packages/opendesign/src/components/badge/style/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..591b2fbd72dcd5e987362d645b561bd2fac42716 --- /dev/null +++ b/packages/opendesign/src/components/badge/style/index.ts @@ -0,0 +1,2 @@ +import '../../style'; +import './index.scss'; diff --git a/packages/opendesign/src/components/badge/style/var.scss b/packages/opendesign/src/components/badge/style/var.scss new file mode 100644 index 0000000000000000000000000000000000000000..ef9b24328ceba3247b599cc739e7899cd7910945 --- /dev/null +++ b/packages/opendesign/src/components/badge/style/var.scss @@ -0,0 +1,27 @@ +.o-badge { + --badge-text-size: var(--o-font_size-tip1); + --badge-text-height: var(--o-line_height-tip1); + + --badge-border: var(--o-radius-l); + --badge-color: var(--o-color-text1-inverse); + + --badge-bg: var(--o-color-danger1); + + --badge-padding: 20px; +} + +.o-badge-primary { + --badge-bg: var(--o-color-primary1); +} + +.o-badge-success { + --badge-bg: var(--o-color-success1); +} + +.o-badge-warning { + --badge-bg: var(--o-color-warning1); +} + +.o-badge-danger { + --badge-bg: var(--o-color-danger1); +} diff --git a/packages/opendesign/src/components/badge/types.ts b/packages/opendesign/src/components/badge/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..315ef0af84f044a029049d0f17fe31c36081874e --- /dev/null +++ b/packages/opendesign/src/components/badge/types.ts @@ -0,0 +1,43 @@ +import type { ExtractPropTypes, PropType } from 'vue'; +import type { ColorT } from '../_shared/global'; + +export const badgeProps = { + /** + * 显示值 + */ + value: { + type: [String, Number] as PropType, + default: '', + }, + /** + * 最大值,超过最大值显示${max}+(仅当 value 类型为 number 时生效) + */ + max: { + type: Number, + default: 99, + }, + /** + * 颜色类型 + * 'normal' | 'primary' | 'success' | 'warning' | 'danger' + */ + color: { + type: String as PropType, + default: 'normal', + }, + /** + * 是否显示为小红点 + */ + dot: { + type: Boolean, + default: false, + } + /** + * 徽标位置偏移量 + */, + offset: { + type: Array as PropType>, + default: () => [], + }, +}; + +export type BadgePropsT = ExtractPropTypes; diff --git a/packages/opendesign/src/components/checkbox/OCheckbox.vue b/packages/opendesign/src/components/checkbox/OCheckbox.vue index ab1113f568afd4b6c27ba66732fd11b5ca9899f1..5242f95e321ce2a6792ccf60bd4e83072476f280 100644 --- a/packages/opendesign/src/components/checkbox/OCheckbox.vue +++ b/packages/opendesign/src/components/checkbox/OCheckbox.vue @@ -38,9 +38,9 @@ const emits = defineEmits<{ }>(); const checkboxGroupInjection = inject(checkboxGroupInjectKey, null); + // 监听modelValue改变 const isModelValueChanged = ref(false); - watch( () => props.modelValue, () => { diff --git a/packages/opendesign/src/components/dropdown/ODropdown.vue b/packages/opendesign/src/components/dropdown/ODropdown.vue new file mode 100644 index 0000000000000000000000000000000000000000..ee5c145d1d4ed66b4dc26e86aa9dfa358509b8fc --- /dev/null +++ b/packages/opendesign/src/components/dropdown/ODropdown.vue @@ -0,0 +1,17 @@ + + + diff --git a/packages/opendesign/src/components/radio/ORadio.vue b/packages/opendesign/src/components/radio/ORadio.vue index 333a337b0f73d0ace5460591bf7729a1a187e25b..5db632ccd87fc6e60b0da3a363f796c275350b5b 100644 --- a/packages/opendesign/src/components/radio/ORadio.vue +++ b/packages/opendesign/src/components/radio/ORadio.vue @@ -21,6 +21,7 @@ interface RadioPropT { */ disabled?: boolean; } + const props = withDefaults(defineProps(), { modelValue: undefined, defaultChecked: false, @@ -36,7 +37,6 @@ const radioGroupInjection = inject(radioGroupInjectKey, null); // 监听modelValue改变 const isModelValueChanged = ref(false); - watch( () => props.modelValue, () => { diff --git a/packages/opendesign/src/components/rate/ORate.vue b/packages/opendesign/src/components/rate/ORate.vue new file mode 100644 index 0000000000000000000000000000000000000000..69aac911917bc5eb4c97ced3c1dbdd16fece4401 --- /dev/null +++ b/packages/opendesign/src/components/rate/ORate.vue @@ -0,0 +1,95 @@ + + + diff --git a/packages/opendesign/src/components/rate/__demo__/IndexRate.vue b/packages/opendesign/src/components/rate/__demo__/IndexRate.vue new file mode 100644 index 0000000000000000000000000000000000000000..cf400f88c042c731d3f12d169b3fa6f9e400d2b3 --- /dev/null +++ b/packages/opendesign/src/components/rate/__demo__/IndexRate.vue @@ -0,0 +1,23 @@ + + + diff --git a/packages/opendesign/src/components/rate/__demo__/RateAllowHalf.vue b/packages/opendesign/src/components/rate/__demo__/RateAllowHalf.vue new file mode 100644 index 0000000000000000000000000000000000000000..66fd1820919aeafb0fbcb7999e0aecf3405eca08 --- /dev/null +++ b/packages/opendesign/src/components/rate/__demo__/RateAllowHalf.vue @@ -0,0 +1,16 @@ + + + diff --git a/packages/opendesign/src/components/rate/__demo__/RateBasic.vue b/packages/opendesign/src/components/rate/__demo__/RateBasic.vue new file mode 100644 index 0000000000000000000000000000000000000000..9cc0ed61ebff2d4af639dd335d7756f894872d51 --- /dev/null +++ b/packages/opendesign/src/components/rate/__demo__/RateBasic.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/packages/opendesign/src/components/rate/__demo__/RateClearable.vue b/packages/opendesign/src/components/rate/__demo__/RateClearable.vue new file mode 100644 index 0000000000000000000000000000000000000000..afe1d64f7e1d5a099bba060211720ccb8149c1a7 --- /dev/null +++ b/packages/opendesign/src/components/rate/__demo__/RateClearable.vue @@ -0,0 +1,16 @@ + + + diff --git a/packages/opendesign/src/components/rate/__demo__/RateColor.vue b/packages/opendesign/src/components/rate/__demo__/RateColor.vue new file mode 100644 index 0000000000000000000000000000000000000000..a4c4e9560c57ca5c34f4e438b547d5e641178643 --- /dev/null +++ b/packages/opendesign/src/components/rate/__demo__/RateColor.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/packages/opendesign/src/components/rate/__demo__/RateCount.vue b/packages/opendesign/src/components/rate/__demo__/RateCount.vue new file mode 100644 index 0000000000000000000000000000000000000000..cf45b7367b5eefcef7690c61d97a911c4f0fe486 --- /dev/null +++ b/packages/opendesign/src/components/rate/__demo__/RateCount.vue @@ -0,0 +1,14 @@ + + + diff --git a/packages/opendesign/src/components/rate/__demo__/RateIcon.vue b/packages/opendesign/src/components/rate/__demo__/RateIcon.vue new file mode 100644 index 0000000000000000000000000000000000000000..c36d0b2ec88df655651d320eb9f32d3605567060 --- /dev/null +++ b/packages/opendesign/src/components/rate/__demo__/RateIcon.vue @@ -0,0 +1,32 @@ + + + + + diff --git a/packages/opendesign/src/components/rate/__demo__/RateSize.vue b/packages/opendesign/src/components/rate/__demo__/RateSize.vue new file mode 100644 index 0000000000000000000000000000000000000000..a7d0b654b98362bf0db12d27de2ca9938303f14e --- /dev/null +++ b/packages/opendesign/src/components/rate/__demo__/RateSize.vue @@ -0,0 +1,22 @@ + + + + + diff --git a/packages/opendesign/src/components/rate/index.ts b/packages/opendesign/src/components/rate/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..04a152fa22524ae682a5bf4001d5196c584e4951 --- /dev/null +++ b/packages/opendesign/src/components/rate/index.ts @@ -0,0 +1,13 @@ +import type { App } from 'vue'; + +import _ORate from './ORate.vue'; + +export * from './types'; + +const ORate = Object.assign(_ORate, { + install(app: App) { + app.component(_ORate.name, _ORate); + }, +}); + +export { ORate }; diff --git a/packages/opendesign/src/components/rate/style/index.scss b/packages/opendesign/src/components/rate/style/index.scss new file mode 100644 index 0000000000000000000000000000000000000000..6be90c311914a230f292aeb411c12d92aa9b0593 --- /dev/null +++ b/packages/opendesign/src/components/rate/style/index.scss @@ -0,0 +1,44 @@ +@use './var.scss'; + +.o-rate { + display: inline-flex; + align-items: center; + user-select: none; + font-size: var(--rate-height); + cursor: pointer; +} + +.o-rate-item { + position: relative; + + & + .o-rate-item { + margin-left: 8px; + } + + &.is-half-active { + .o-rate-icon-top { + opacity: 1; + } + } + + &.is-full-active { + .o-rate-icon-bottom { + color: var(--rate-color-active); + } + } +} + +.o-rate-icon { + color: var(--rate-color); + transition: all var(--o-duration-m1) var(--o-easing-standard); +} + +.o-rate-icon-top { + position: absolute; + top: 0; + left: 0; + width: 50%; + opacity: 0; + overflow: hidden; + color: var(--rate-color-active); +} diff --git a/packages/opendesign/src/components/rate/style/index.ts b/packages/opendesign/src/components/rate/style/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..591b2fbd72dcd5e987362d645b561bd2fac42716 --- /dev/null +++ b/packages/opendesign/src/components/rate/style/index.ts @@ -0,0 +1,2 @@ +import '../../style'; +import './index.scss'; diff --git a/packages/opendesign/src/components/rate/style/var.scss b/packages/opendesign/src/components/rate/style/var.scss new file mode 100644 index 0000000000000000000000000000000000000000..f8b3c464785ee0a2d26de669a4a3847300c1a4e9 --- /dev/null +++ b/packages/opendesign/src/components/rate/style/var.scss @@ -0,0 +1,30 @@ +.o-rate { + --rate-color: var(--o-color-info1); + --rate-color-active: var(--o-color-major1); + + --rate-height: var(--o-font_size-h1); +} + +.o-rate-size-large { + --rate-height: var(--o-font_size-display3); +} + +.o-rate-size-small { + --rate-height: var(--o-font_size-h4); +} + +.o-rate-primary { + --rate-color-active: var(--o-color-primary1); +} + +.o-rate-success { + --rate-color-active: var(--o-color-success1); +} + +.o-rate-warning { + --rate-color-active: var(--o-color-warning1); +} + +.o-rate-danger { + --rate-color-active: var(--o-color-danger1); +} diff --git a/packages/opendesign/src/components/rate/types.ts b/packages/opendesign/src/components/rate/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..d5e174310d4097519c1930ce0540016aec9f85b3 --- /dev/null +++ b/packages/opendesign/src/components/rate/types.ts @@ -0,0 +1,64 @@ +import type { ExtractPropTypes, PropType } from 'vue'; +import type { ColorT, SizeT } from '../_shared/global'; + +export const rateProps = { + /** + * 评分数量 + */ + count: { + type: Number, + default: 5, + }, + /** + * 双向绑定值 + */ + modelValue: { + type: Number, + }, + /** + * 非受控状态时,默认值 + */ + defaultValue: { + type: Number, + default: 0, + }, + /** + * 尺寸 + * "normal" | "small" | "large" + */ + size: { + type: String as PropType, + default: 'normal', + }, + /** + * 颜色类型 + * 'normal' | 'primary' | 'success' | 'warning' | 'danger' + */ + color: { + type: String as PropType, + default: 'normal', + }, + /** + * 是否只读 + */ + readonly: { + type: Boolean, + default: false, + }, + /** + * 是否支持半选 + */ + allowHalf: { + type: Boolean, + default: false, + }, + /** + * 是否支持可清空 + */ + clearable: { + type: Boolean, + default: false, + }, +}; + +export type RatePropsT = ExtractPropTypes; diff --git a/packages/opendesign/src/icons/svgs/fill/star.svg b/packages/opendesign/src/icons/svgs/fill/star.svg new file mode 100644 index 0000000000000000000000000000000000000000..6deab4a7a827dd1248b3245c35f13c62a33ed9cf --- /dev/null +++ b/packages/opendesign/src/icons/svgs/fill/star.svg @@ -0,0 +1,4 @@ + +star + + diff --git a/packages/portal/src/components/TheAside.vue b/packages/portal/src/components/TheAside.vue index 66203d4ed5426f60dab6fafb895ea2c7910a5d00..eb47250e9a778dd4b73bf071b78de292fff2313c 100644 --- a/packages/portal/src/components/TheAside.vue +++ b/packages/portal/src/components/TheAside.vue @@ -46,6 +46,8 @@ const navClick = (item: typeof navList[0]) => { background-color: var(--o-color-bg3); color: var(--o-color-text1); border-right: 1px solid var(--o-color-border2); + overflow: auto; + height: calc(100vh - 48px); } .aside-title { padding: 8px; diff --git a/packages/portal/src/router.ts b/packages/portal/src/router.ts index 7a7b826164a5dd6f106217233d080557092db3ff..8a6366b4881d2191f831ce7e37df9261abf9ef4b 100644 --- a/packages/portal/src/router.ts +++ b/packages/portal/src/router.ts @@ -129,6 +129,18 @@ export const routes = [ label: '标签', component: () => import('@components/tag/__demo__/IndexTag.vue'), }, + { + path: '/badge', + name: 'Badge', + label: '徽标', + component: () => import('@components/badge/__demo__/IndexBadge.vue'), + }, + { + path: '/rate', + name: 'Rate', + label: '评分', + component: () => import('@components/rate/__demo__/IndexRate.vue'), + }, ]; export const router = createRouter({