Skip to content

Commit 56ee611

Browse files
committed
🚀 [border] border use core hook
1 parent 043be61 commit 56ee611

File tree

17 files changed

+336
-61
lines changed

17 files changed

+336
-61
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* @description border api
3+
* @author 阿怪
4+
* @date 2024/3/19 11:06
5+
* @version v1.0.0
6+
*
7+
* 江湖的业务千篇一律,复杂的代码好几百行。
8+
*/
9+
import { MCOPO, MPropType } from '../../../../lib/components/types/props';
10+
import { BorderProps } from './props';
11+
12+
export const props: MCOPO<BorderProps> = {
13+
border: { type: [Boolean, Object] as MPropType<boolean | { top?: boolean, right?: boolean, bottom?: boolean, left?: boolean }>, default: true },
14+
top: { type: [Boolean, String], default: undefined },
15+
right: { type: [Boolean, String], default: undefined },
16+
bottom: { type: [Boolean, String], default: undefined },
17+
left: { type: [Boolean, String], default: undefined },
18+
mask: { type: Boolean, default: true },
19+
insteadMain: { type: [Boolean, String], default: false },
20+
};
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
:root{
2+
--m-border-bg: rgba(255, 255, 255, 0.4);
3+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/**
2+
* @description
3+
* @author 阿怪
4+
* @date 2025/1/21 11:31
5+
* @version v1.0.0
6+
*
7+
* 江湖的业务千篇一律,复杂的代码好几百行。
8+
*/
9+
import { props } from './api.ts';
10+
import { baseLineClass, lineType } from './lineType.ts';
11+
import { borderOptions, useBorder } from './useBorder.ts';
12+
13+
14+
export const BorderCore = {
15+
props,
16+
lineType,
17+
baseLineClass,
18+
useBorder,
19+
borderOptions
20+
}
File renamed without changes.

lib/components/template/border/index.d.ts renamed to core/components/template/border/props.d.ts

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,29 +14,42 @@
1414

1515
export declare type BorderProps = {
1616
/**
17-
* @description top line display or not
17+
* @description global setting border or not and support object setting,
18+
* priority lower than direct setting
1819
* @default true
1920
* @type boolean | string
2021
*/
21-
top?: boolean | string;
22+
border?: boolean | { top?: boolean, right?: boolean, bottom?: boolean, left?: boolean };
23+
/**
24+
* @description top line display or not
25+
* @default undefined
26+
* @type boolean | string | undefined
27+
*/
28+
top?: boolean | string | undefined;
2229
/**
2330
* @description right line display or not
24-
* @default true
25-
* @type boolean | string
31+
* @default undefined
32+
* @type boolean | string | undefined
2633
*/
27-
right?: boolean | string;
34+
right?: boolean | string | undefined;
2835
/**
2936
* @description bottom line display or not
30-
* @default true
31-
* @type boolean | string
37+
* @default undefined
38+
* @type boolean | string | undefined
3239
*/
33-
bottom?: boolean | string;
40+
bottom?: boolean | string | undefined;
3441
/**
3542
* @description left line display or not
43+
* @default undefined
44+
* @type boolean | string | undefined
45+
*/
46+
left?: boolean | string | undefined;
47+
/**
48+
* @description need mask or not
3649
* @default true
37-
* @type boolean | string
50+
* @type boolean
3851
*/
39-
left?: boolean | string;
52+
mask?: boolean;
4053
/**
4154
* @description instead main div with slot
4255
* @default false
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
/**
2+
* @description border component core hook
3+
* @author 阿怪
4+
* @date 2025/1/21 11:32
5+
* @version v1.0.0
6+
*
7+
* 江湖的业务千篇一律,复杂的代码好几百行。
8+
*/
9+
import { BorderProps } from './props';
10+
import { lineType } from './lineType.ts';
11+
import { defineHook } from '../../../runtime/defineHook.ts';
12+
import { props } from './api.ts';
13+
14+
const toBoolean = (value: any) => {
15+
if (value === undefined) return undefined;
16+
if (value === 'false') return false;
17+
return Boolean(value);
18+
};
19+
20+
const gettingBorder = (props: BorderProps): Record<lineType, boolean> => {
21+
const {
22+
border,
23+
right, left, top, bottom,
24+
} = props;
25+
// 默认right left top bottom都是undefined,但是优先级高于border
26+
// border可能是布尔值,也可能直接指定top right bottom left
27+
if (typeof border === 'boolean' || border === undefined) {
28+
const defaultBorderBoolean = border ?? true;
29+
return {
30+
top: toBoolean(top) ?? defaultBorderBoolean,
31+
left: toBoolean(left) ?? defaultBorderBoolean,
32+
right: toBoolean(right) ?? defaultBorderBoolean,
33+
bottom: toBoolean(bottom) ?? defaultBorderBoolean,
34+
};
35+
} else {
36+
return {
37+
top: toBoolean(top) ?? border.top ?? true,
38+
left: toBoolean(left) ?? border.left ?? true,
39+
right: toBoolean(right) ?? border.right ?? true,
40+
bottom: toBoolean(bottom) ?? border.bottom ?? true,
41+
};
42+
}
43+
};
44+
45+
export const borderOptions = {
46+
name:'MBorder',
47+
props,
48+
}
49+
50+
export const useBorder = defineHook((_props, ctx) => {
51+
const props = _props as Required<BorderProps>;
52+
53+
54+
const renderInit = () => {
55+
const borderSetting = gettingBorder(props);
56+
57+
const renderTypes = Object.entries(borderSetting).filter(([key, value]) => value).map(([key]) => key);
58+
59+
60+
return {
61+
renderTypes,
62+
};
63+
};
64+
65+
return {
66+
props,
67+
renderInit,
68+
};
69+
70+
});
71+
72+
73+
if (import.meta.vitest) {
74+
const { describe, it, expect } = import.meta.vitest;
75+
76+
describe('gettingBorder', () => {
77+
78+
it('border is undefined', () => {
79+
const props = {} as Required<BorderProps>;
80+
expect(gettingBorder(props)).toEqual({ top: true, right: true, bottom: true, left: true });
81+
});
82+
83+
describe('boolean border', () => {
84+
85+
it('border is true', () => {
86+
const props = { border: true } as Required<BorderProps>;
87+
expect(gettingBorder(props)).toEqual({ top: true, right: true, bottom: true, left: true });
88+
});
89+
90+
it('border is false', () => {
91+
const props = { border: false } as Required<BorderProps>;
92+
expect(gettingBorder(props)).toEqual({ top: false, right: false, bottom: false, left: false });
93+
});
94+
95+
it('border true,left false', () => {
96+
const props = { border: true, left: false } as Required<BorderProps>;
97+
expect(gettingBorder(props)).toEqual({ top: true, right: true, bottom: true, left: false });
98+
});
99+
100+
it('border false,left true', () => {
101+
const props = { border: false, left: true } as Required<BorderProps>;
102+
expect(gettingBorder(props)).toEqual({ top: false, right: false, bottom: false, left: true });
103+
});
104+
});
105+
106+
describe('object border', () => {
107+
108+
it('border is { top: false, right: false, bottom: false, left: true }', () => {
109+
const props = { border: { top: false, right: false, bottom: false, left: true } } as Required<BorderProps>;
110+
expect(gettingBorder(props)).toEqual({ top: false, right: false, bottom: false, left: true });
111+
});
112+
113+
it('border is { top: false, right: false, bottom: false, left: true }, left false', () => {
114+
const props = { border: { top: false, right: false, bottom: false, left: true }, left: false } as Required<BorderProps>;
115+
expect(gettingBorder(props)).toEqual({ top: false, right: false, bottom: false, left: false });
116+
});
117+
118+
});
119+
120+
121+
});
122+
123+
}

core/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,5 @@ export * from './components/base/checkbox';
1616
export * from './components/base/switch';
1717

1818
export * from './components/message/popover';
19+
20+
export * from './components/template/border';
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/**
2+
* @description headless border component
3+
* @author 阿怪
4+
* @date 2025/1/21 16:19
5+
* @version v1.0.0
6+
*
7+
* 江湖的业务千篇一律,复杂的代码好几百行。
8+
*/
9+
import { defineComponent } from 'vue';
10+
import { BorderCore } from '@shuimo-design/ui-core';
11+
import './border.css';
12+
13+
const { borderOptions, useBorder } = BorderCore;
14+
15+
export default defineComponent((props, ctx) => {
16+
17+
18+
const { renderInit } = useBorder(props, ctx);
19+
20+
return () => {
21+
const { renderTypes } = renderInit();
22+
const lines = renderTypes.map(type => `m-border-${type}-line`);
23+
const borderClass = ['m-border', props.mask ?'m-border-with-mask':'', ...lines];
24+
25+
if (props.insteadMain) {
26+
// default mast only one slot
27+
const node = ctx.slots.default?.()[0];
28+
if(node?.props?.class){
29+
// hack way to add class
30+
node.props.class += ` ${borderClass.join(' ')}`;
31+
}else if(node){
32+
node.props = node.props || {};
33+
node.props.class = borderClass.join(' ');
34+
}
35+
return node;
36+
}
37+
38+
return <div class={borderClass}>
39+
{ctx.slots.default?.()}
40+
</div>;
41+
};
42+
43+
}, borderOptions);
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
@import "@shuimo-design/ui-core/components/template/border/border.css";
2+
3+
:root {
4+
--m-border-line-color: var(--m-color-border);
5+
--m-border-line-width: 1px;
6+
--m-border-line-style: solid;
7+
}
8+
9+
.m-border {
10+
display: inline-block;
11+
12+
&.m-border-top-line {
13+
border-top: var(--m-border-line-color) var(--m-border-line-style) var(--m-border-line-width);
14+
}
15+
16+
&.m-border-right-line {
17+
border-right: var(--m-border-line-color) var(--m-border-line-style) var(--m-border-line-width);
18+
}
19+
20+
&.m-border-bottom-line {
21+
border-bottom: var(--m-border-line-color) var(--m-border-line-style) var(--m-border-line-width);
22+
}
23+
24+
&.m-border-left-line {
25+
border-left: var(--m-border-line-color) var(--m-border-line-style) var(--m-border-line-width);
26+
}
27+
28+
&.m-border-with-mask {
29+
background: var(--m-border-bg);
30+
backdrop-filter: blur(6px);
31+
}
32+
33+
}

headless/utils/install/importComponents.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import MSwitch from '../../components/base/switch/MSwitch.tsx';
2020
// [message]
2121
// [template]
2222
import MRicePaper from '../../components/template/ricePaper/MRicePaper.tsx';
23+
import MBorder from '../../components/template/border/MBorder.tsx';
2324
import MPopover from '../../components/message/popover/MPopover';
2425

2526

@@ -29,6 +30,7 @@ export const components: Record<string, Component> = {
2930
MCheckbox,
3031

3132
MRicePaper,
33+
MBorder,
3234
};
3335

3436

@@ -37,4 +39,5 @@ export {
3739
MButton,
3840

3941
MRicePaper,
42+
MBorder,
4043
};

0 commit comments

Comments
 (0)