Commit 00fca0fe6c912141ba8b06576b6c53c5b4c3cd9e
1 parent
34a80542
chore: prettier code
Showing
36 changed files
with
381 additions
and
432 deletions
src/components/ContextMenu/index.ts
src/components/ContextMenu/src/ContextMenu.tsx renamed to src/components/ContextMenu/src/ContextMenu.vue
1 | -import './index.less'; | |
2 | - | |
3 | -import type { ContextMenuItem, ItemContentProps } from './types'; | |
4 | -import type { FunctionalComponent, CSSProperties } from 'vue'; | |
5 | - | |
6 | -import { defineComponent, nextTick, onMounted, computed, ref, unref, onUnmounted } from 'vue'; | |
7 | - | |
8 | -import Icon from '/@/components/Icon'; | |
9 | -import { Menu, Divider } from 'ant-design-vue'; | |
10 | - | |
11 | -import { contextMenuProps } from './props'; | |
12 | - | |
13 | -const prefixCls = 'context-menu'; | |
14 | - | |
15 | -const ItemContent: FunctionalComponent<ItemContentProps> = (props) => { | |
16 | - const { item } = props; | |
17 | - return ( | |
18 | - <span | |
19 | - style="display: inline-block; width: 100%; " | |
20 | - class="px-4" | |
21 | - onClick={props.handler.bind(null, item)} | |
22 | - > | |
23 | - {props.showIcon && item.icon && <Icon class="mr-2" icon={item.icon} />} | |
24 | - <span>{item.label}</span> | |
25 | - </span> | |
26 | - ); | |
27 | -}; | |
28 | - | |
29 | -export default defineComponent({ | |
30 | - name: 'ContextMenu', | |
31 | - props: contextMenuProps, | |
32 | - setup(props) { | |
33 | - const wrapRef = ref<ElRef>(null); | |
34 | - const showRef = ref(false); | |
35 | - | |
36 | - const getStyle = computed((): CSSProperties => { | |
37 | - const { axis, items, styles, width } = props; | |
38 | - const { x, y } = axis || { x: 0, y: 0 }; | |
39 | - const menuHeight = (items || []).length * 40; | |
40 | - const menuWidth = width; | |
41 | - const body = document.body; | |
42 | - | |
43 | - const left = body.clientWidth < x + menuWidth ? x - menuWidth : x; | |
44 | - const top = body.clientHeight < y + menuHeight ? y - menuHeight : y; | |
45 | - return { | |
46 | - ...styles, | |
47 | - width: `${width}px`, | |
48 | - left: `${left + 1}px`, | |
49 | - top: `${top + 1}px`, | |
50 | - }; | |
51 | - }); | |
52 | - | |
53 | - onMounted(() => { | |
54 | - nextTick(() => (showRef.value = true)); | |
55 | - }); | |
56 | - | |
57 | - onUnmounted(() => { | |
58 | - const el = unref(wrapRef); | |
59 | - el && document.body.removeChild(el); | |
60 | - }); | |
1 | +<script lang="tsx"> | |
2 | + import type { ContextMenuItem, ItemContentProps, Axis } from './typing'; | |
3 | + import type { FunctionalComponent, CSSProperties } from 'vue'; | |
4 | + import { defineComponent, nextTick, onMounted, computed, ref, unref, onUnmounted } from 'vue'; | |
5 | + import Icon from '/@/components/Icon'; | |
6 | + import { Menu, Divider } from 'ant-design-vue'; | |
7 | + | |
8 | + const prefixCls = 'context-menu'; | |
9 | + | |
10 | + const props = { | |
11 | + width: { type: Number, default: 156 }, | |
12 | + customEvent: { type: Object as PropType<Event>, default: null }, | |
13 | + styles: { type: Object as PropType<CSSProperties> }, | |
14 | + showIcon: { type: Boolean, default: true }, | |
15 | + axis: { | |
16 | + // The position of the right mouse button click | |
17 | + type: Object as PropType<Axis>, | |
18 | + default() { | |
19 | + return { x: 0, y: 0 }; | |
20 | + }, | |
21 | + }, | |
22 | + items: { | |
23 | + // The most important list, if not, will not be displayed | |
24 | + type: Array as PropType<ContextMenuItem[]>, | |
25 | + default() { | |
26 | + return []; | |
27 | + }, | |
28 | + }, | |
29 | + }; | |
30 | + | |
31 | + const ItemContent: FunctionalComponent<ItemContentProps> = (props) => { | |
32 | + const { item } = props; | |
33 | + return ( | |
34 | + <span | |
35 | + style="display: inline-block; width: 100%; " | |
36 | + class="px-4" | |
37 | + onClick={props.handler.bind(null, item)} | |
38 | + > | |
39 | + {props.showIcon && item.icon && <Icon class="mr-2" icon={item.icon} />} | |
40 | + <span>{item.label}</span> | |
41 | + </span> | |
42 | + ); | |
43 | + }; | |
44 | + | |
45 | + export default defineComponent({ | |
46 | + name: 'ContextMenu', | |
47 | + props, | |
48 | + setup(props) { | |
49 | + const wrapRef = ref<ElRef>(null); | |
50 | + const showRef = ref(false); | |
51 | + | |
52 | + const getStyle = computed((): CSSProperties => { | |
53 | + const { axis, items, styles, width } = props; | |
54 | + const { x, y } = axis || { x: 0, y: 0 }; | |
55 | + const menuHeight = (items || []).length * 40; | |
56 | + const menuWidth = width; | |
57 | + const body = document.body; | |
58 | + | |
59 | + const left = body.clientWidth < x + menuWidth ? x - menuWidth : x; | |
60 | + const top = body.clientHeight < y + menuHeight ? y - menuHeight : y; | |
61 | + return { | |
62 | + ...styles, | |
63 | + width: `${width}px`, | |
64 | + left: `${left + 1}px`, | |
65 | + top: `${top + 1}px`, | |
66 | + }; | |
67 | + }); | |
61 | 68 | |
62 | - function handleAction(item: ContextMenuItem, e: MouseEvent) { | |
63 | - const { handler, disabled } = item; | |
64 | - if (disabled) return; | |
65 | - showRef.value = false; | |
69 | + onMounted(() => { | |
70 | + nextTick(() => (showRef.value = true)); | |
71 | + }); | |
66 | 72 | |
67 | - e?.stopPropagation(); | |
68 | - e?.preventDefault(); | |
69 | - handler?.(); | |
70 | - } | |
73 | + onUnmounted(() => { | |
74 | + unref(wrapRef) && document.body.removeChild(el); | |
75 | + }); | |
71 | 76 | |
72 | - function renderMenuItem(items: ContextMenuItem[]) { | |
73 | - return items.map((item) => { | |
74 | - const { disabled, label, children, divider = false } = item; | |
77 | + function handleAction(item: ContextMenuItem, e: MouseEvent) { | |
78 | + const { handler, disabled } = item; | |
79 | + if (disabled) { | |
80 | + return; | |
81 | + } | |
82 | + showRef.value = false; | |
83 | + e?.stopPropagation(); | |
84 | + e?.preventDefault(); | |
85 | + handler?.(); | |
86 | + } | |
87 | + | |
88 | + function renderMenuItem(items: ContextMenuItem[]) { | |
89 | + return items.map((item) => { | |
90 | + const { disabled, label, children, divider = false } = item; | |
91 | + | |
92 | + const contentProps = { | |
93 | + item, | |
94 | + handler: handleAction, | |
95 | + showIcon: props.showIcon, | |
96 | + }; | |
97 | + | |
98 | + if (!children || children.length === 0) { | |
99 | + return ( | |
100 | + <> | |
101 | + <Menu.Item disabled={disabled} class={`${prefixCls}__item`} key={label}> | |
102 | + <ItemContent {...contentProps} /> | |
103 | + </Menu.Item> | |
104 | + {divider ? <Divider key={`d-${label}`} /> : null} | |
105 | + </> | |
106 | + ); | |
107 | + } | |
108 | + if (!unref(showRef)) return null; | |
75 | 109 | |
76 | - const DividerComp = divider ? <Divider key={`d-${label}`} /> : null; | |
77 | - if (!children || children.length === 0) { | |
78 | 110 | return ( |
79 | - <> | |
80 | - <Menu.Item disabled={disabled} class={`${prefixCls}__item`} key={label}> | |
81 | - <ItemContent showIcon={props.showIcon} item={item} handler={handleAction} /> | |
82 | - </Menu.Item> | |
83 | - {DividerComp} | |
84 | - </> | |
111 | + <Menu.SubMenu key={label} disabled={disabled} popupClassName={`${prefixCls}__popup`}> | |
112 | + {{ | |
113 | + title: () => <ItemContent {...contentProps} />, | |
114 | + default: () => renderMenuItem(children), | |
115 | + }} | |
116 | + </Menu.SubMenu> | |
85 | 117 | ); |
86 | - } | |
118 | + }); | |
119 | + } | |
120 | + return () => { | |
121 | + const { items } = props; | |
87 | 122 | if (!unref(showRef)) return null; |
88 | - | |
89 | 123 | return ( |
90 | - <Menu.SubMenu key={label} disabled={disabled} popupClassName={`${prefixCls}__popup`}> | |
91 | - {{ | |
92 | - title: () => ( | |
93 | - <ItemContent showIcon={props.showIcon} item={item} handler={handleAction} /> | |
94 | - ), | |
95 | - default: () => renderMenuItem(children), | |
96 | - }} | |
97 | - </Menu.SubMenu> | |
124 | + <Menu | |
125 | + inlineIndent={12} | |
126 | + mode="vertical" | |
127 | + class={prefixCls} | |
128 | + ref={wrapRef} | |
129 | + style={unref(getStyle)} | |
130 | + > | |
131 | + {renderMenuItem(items)} | |
132 | + </Menu> | |
98 | 133 | ); |
99 | - }); | |
134 | + }; | |
135 | + }, | |
136 | + }); | |
137 | +</script> | |
138 | +<style lang="less"> | |
139 | + @default-height: 42px !important; | |
140 | + | |
141 | + @small-height: 36px !important; | |
142 | + | |
143 | + @large-height: 36px !important; | |
144 | + | |
145 | + .item-style() { | |
146 | + li { | |
147 | + display: inline-block; | |
148 | + width: 100%; | |
149 | + height: @default-height; | |
150 | + margin: 0 !important; | |
151 | + line-height: @default-height; | |
152 | + | |
153 | + span { | |
154 | + line-height: @default-height; | |
155 | + } | |
156 | + | |
157 | + > div { | |
158 | + margin: 0 !important; | |
159 | + } | |
160 | + | |
161 | + &:not(.ant-menu-item-disabled):hover { | |
162 | + color: @text-color-base; | |
163 | + background-color: @item-hover-bg; | |
164 | + } | |
165 | + } | |
166 | + } | |
167 | + | |
168 | + .context-menu { | |
169 | + position: fixed; | |
170 | + top: 0; | |
171 | + left: 0; | |
172 | + z-index: 200; | |
173 | + display: block; | |
174 | + width: 156px; | |
175 | + margin: 0; | |
176 | + list-style: none; | |
177 | + background-color: @component-background; | |
178 | + border: 1px solid rgba(0, 0, 0, 0.08); | |
179 | + border-radius: 0.25rem; | |
180 | + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.1), | |
181 | + 0 1px 5px 0 rgba(0, 0, 0, 0.06); | |
182 | + background-clip: padding-box; | |
183 | + user-select: none; | |
184 | + | |
185 | + .item-style(); | |
186 | + | |
187 | + .ant-divider { | |
188 | + margin: 0 0; | |
189 | + } | |
190 | + | |
191 | + &__popup { | |
192 | + .ant-divider { | |
193 | + margin: 0 0; | |
194 | + } | |
195 | + | |
196 | + .item-style(); | |
197 | + } | |
198 | + | |
199 | + .ant-menu-submenu-title, | |
200 | + .ant-menu-item { | |
201 | + padding: 0 !important; | |
100 | 202 | } |
101 | - return () => { | |
102 | - const { items } = props; | |
103 | - if (!unref(showRef)) return null; | |
104 | - return ( | |
105 | - <Menu | |
106 | - inlineIndent={12} | |
107 | - mode="vertical" | |
108 | - class={prefixCls} | |
109 | - ref={wrapRef} | |
110 | - style={unref(getStyle)} | |
111 | - > | |
112 | - {renderMenuItem(items)} | |
113 | - </Menu> | |
114 | - ); | |
115 | - }; | |
116 | - }, | |
117 | -}); | |
203 | + } | |
204 | +</style> | ... | ... |
src/components/ContextMenu/src/createContextMenu.ts
1 | -import contextMenuVue from './ContextMenu'; | |
1 | +import contextMenuVue from './ContextMenu.vue'; | |
2 | 2 | import { isClient } from '/@/utils/is'; |
3 | -import { CreateContextOptions, ContextMenuProps } from './types'; | |
3 | +import { CreateContextOptions, ContextMenuProps } from './typing'; | |
4 | 4 | import { createVNode, render } from 'vue'; |
5 | 5 | |
6 | 6 | const menuManager: { |
... | ... | @@ -16,7 +16,9 @@ export const createContextMenu = function (options: CreateContextOptions) { |
16 | 16 | |
17 | 17 | event && event?.preventDefault(); |
18 | 18 | |
19 | - if (!isClient) return; | |
19 | + if (!isClient) { | |
20 | + return; | |
21 | + } | |
20 | 22 | return new Promise((resolve) => { |
21 | 23 | const body = document.body; |
22 | 24 | |
... | ... | @@ -54,9 +56,9 @@ export const createContextMenu = function (options: CreateContextOptions) { |
54 | 56 | body.removeEventListener('scroll', handleClick); |
55 | 57 | }; |
56 | 58 | |
57 | - menuManager.resolve = function (...arg: any) { | |
59 | + menuManager.resolve = function (arg) { | |
58 | 60 | remove(); |
59 | - resolve(arg[0]); | |
61 | + resolve(arg); | |
60 | 62 | }; |
61 | 63 | remove(); |
62 | 64 | body.appendChild(container); | ... | ... |
src/components/ContextMenu/src/index.less deleted
100644 → 0
1 | -@default-height: 42px !important; | |
2 | - | |
3 | -@small-height: 36px !important; | |
4 | - | |
5 | -@large-height: 36px !important; | |
6 | - | |
7 | -.item-style() { | |
8 | - li { | |
9 | - display: inline-block; | |
10 | - width: 100%; | |
11 | - height: @default-height; | |
12 | - margin: 0 !important; | |
13 | - line-height: @default-height; | |
14 | - | |
15 | - span { | |
16 | - line-height: @default-height; | |
17 | - } | |
18 | - | |
19 | - > div { | |
20 | - margin: 0 !important; | |
21 | - } | |
22 | - | |
23 | - &:not(.ant-menu-item-disabled):hover { | |
24 | - color: @text-color-base; | |
25 | - background-color: @item-hover-bg; | |
26 | - } | |
27 | - } | |
28 | -} | |
29 | - | |
30 | -.context-menu { | |
31 | - position: fixed; | |
32 | - top: 0; | |
33 | - left: 0; | |
34 | - z-index: 200; | |
35 | - display: block; | |
36 | - width: 156px; | |
37 | - margin: 0; | |
38 | - list-style: none; | |
39 | - background-color: @component-background; | |
40 | - border: 1px solid rgba(0, 0, 0, 0.08); | |
41 | - border-radius: 0.25rem; | |
42 | - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.1), | |
43 | - 0 1px 5px 0 rgba(0, 0, 0, 0.06); | |
44 | - background-clip: padding-box; | |
45 | - user-select: none; | |
46 | - | |
47 | - .item-style(); | |
48 | - | |
49 | - .ant-divider { | |
50 | - margin: 0 0; | |
51 | - } | |
52 | - | |
53 | - &__popup { | |
54 | - .ant-divider { | |
55 | - margin: 0 0; | |
56 | - } | |
57 | - | |
58 | - .item-style(); | |
59 | - } | |
60 | - | |
61 | - .ant-menu-submenu-title, | |
62 | - .ant-menu-item { | |
63 | - padding: 0 !important; | |
64 | - } | |
65 | -} |
src/components/ContextMenu/src/props.ts deleted
100644 → 0
1 | -import type { PropType } from 'vue'; | |
2 | -import type { Axis, ContextMenuItem } from './types'; | |
3 | -import { propTypes } from '/@/utils/propTypes'; | |
4 | -export const contextMenuProps = { | |
5 | - width: propTypes.number.def(156), | |
6 | - customEvent: { | |
7 | - type: Object as PropType<Event>, | |
8 | - default: null, | |
9 | - }, | |
10 | - styles: propTypes.style, | |
11 | - showIcon: propTypes.bool.def(true), | |
12 | - axis: { | |
13 | - // The position of the right mouse button click | |
14 | - type: Object as PropType<Axis>, | |
15 | - default() { | |
16 | - return { x: 0, y: 0 }; | |
17 | - }, | |
18 | - }, | |
19 | - items: { | |
20 | - // The most important list, if not, will not be displayed | |
21 | - type: Array as PropType<ContextMenuItem[]>, | |
22 | - default() { | |
23 | - return []; | |
24 | - }, | |
25 | - }, | |
26 | -}; |
src/components/ContextMenu/src/types.ts renamed to src/components/ContextMenu/src/typing.ts
src/components/Drawer/src/BasicDrawer.vue
... | ... | @@ -81,46 +81,40 @@ |
81 | 81 | |
82 | 82 | instance && emit('register', drawerInstance, instance.uid); |
83 | 83 | |
84 | - const getMergeProps = computed( | |
85 | - (): DrawerProps => { | |
86 | - return deepMerge(toRaw(props), unref(propsRef)); | |
87 | - } | |
88 | - ); | |
84 | + const getMergeProps = computed((): DrawerProps => { | |
85 | + return deepMerge(toRaw(props), unref(propsRef)); | |
86 | + }); | |
89 | 87 | |
90 | - const getProps = computed( | |
91 | - (): DrawerProps => { | |
92 | - const opt = { | |
93 | - placement: 'right', | |
94 | - ...unref(attrs), | |
95 | - ...unref(getMergeProps), | |
96 | - visible: unref(visibleRef), | |
97 | - }; | |
98 | - opt.title = undefined; | |
99 | - const { isDetail, width, wrapClassName, getContainer } = opt; | |
100 | - if (isDetail) { | |
101 | - if (!width) { | |
102 | - opt.width = '100%'; | |
103 | - } | |
104 | - const detailCls = `${prefixCls}__detail`; | |
105 | - opt.wrapClassName = wrapClassName ? `${wrapClassName} ${detailCls}` : detailCls; | |
106 | - | |
107 | - if (!getContainer) { | |
108 | - // TODO type error? | |
109 | - opt.getContainer = `.${prefixVar}-layout-content` as any; | |
110 | - } | |
88 | + const getProps = computed((): DrawerProps => { | |
89 | + const opt = { | |
90 | + placement: 'right', | |
91 | + ...unref(attrs), | |
92 | + ...unref(getMergeProps), | |
93 | + visible: unref(visibleRef), | |
94 | + }; | |
95 | + opt.title = undefined; | |
96 | + const { isDetail, width, wrapClassName, getContainer } = opt; | |
97 | + if (isDetail) { | |
98 | + if (!width) { | |
99 | + opt.width = '100%'; | |
111 | 100 | } |
112 | - return opt as DrawerProps; | |
113 | - } | |
114 | - ); | |
101 | + const detailCls = `${prefixCls}__detail`; | |
102 | + opt.wrapClassName = wrapClassName ? `${wrapClassName} ${detailCls}` : detailCls; | |
115 | 103 | |
116 | - const getBindValues = computed( | |
117 | - (): DrawerProps => { | |
118 | - return { | |
119 | - ...attrs, | |
120 | - ...unref(getProps), | |
121 | - }; | |
104 | + if (!getContainer) { | |
105 | + // TODO type error? | |
106 | + opt.getContainer = `.${prefixVar}-layout-content` as any; | |
107 | + } | |
122 | 108 | } |
123 | - ); | |
109 | + return opt as DrawerProps; | |
110 | + }); | |
111 | + | |
112 | + const getBindValues = computed((): DrawerProps => { | |
113 | + return { | |
114 | + ...attrs, | |
115 | + ...unref(getProps), | |
116 | + }; | |
117 | + }); | |
124 | 118 | |
125 | 119 | // Custom implementation of the bottom button, |
126 | 120 | const getFooterHeight = computed(() => { |
... | ... | @@ -133,15 +127,13 @@ |
133 | 127 | return `0px`; |
134 | 128 | }); |
135 | 129 | |
136 | - const getScrollContentStyle = computed( | |
137 | - (): CSSProperties => { | |
138 | - const footerHeight = unref(getFooterHeight); | |
139 | - return { | |
140 | - position: 'relative', | |
141 | - height: `calc(100% - ${footerHeight})`, | |
142 | - }; | |
143 | - } | |
144 | - ); | |
130 | + const getScrollContentStyle = computed((): CSSProperties => { | |
131 | + const footerHeight = unref(getFooterHeight); | |
132 | + return { | |
133 | + position: 'relative', | |
134 | + height: `calc(100% - ${footerHeight})`, | |
135 | + }; | |
136 | + }); | |
145 | 137 | |
146 | 138 | const getLoading = computed(() => { |
147 | 139 | return !!unref(getProps)?.loading; | ... | ... |
src/components/Drawer/src/components/DrawerFooter.vue
... | ... | @@ -43,15 +43,13 @@ |
43 | 43 | setup(props, { emit }) { |
44 | 44 | const { prefixCls } = useDesign('basic-drawer-footer'); |
45 | 45 | |
46 | - const getStyle = computed( | |
47 | - (): CSSProperties => { | |
48 | - const heightStr = `${props.height}`; | |
49 | - return { | |
50 | - height: heightStr, | |
51 | - lineHeight: heightStr, | |
52 | - }; | |
53 | - } | |
54 | - ); | |
46 | + const getStyle = computed((): CSSProperties => { | |
47 | + const heightStr = `${props.height}`; | |
48 | + return { | |
49 | + height: heightStr, | |
50 | + lineHeight: heightStr, | |
51 | + }; | |
52 | + }); | |
55 | 53 | |
56 | 54 | function handleOk() { |
57 | 55 | emit('ok'); | ... | ... |
src/components/Form/src/components/FormItem.vue
... | ... | @@ -174,9 +174,7 @@ |
174 | 174 | return Promise.resolve(); |
175 | 175 | } |
176 | 176 | |
177 | - const getRequired = isFunction(required) | |
178 | - ? required(unref(getValues)) | |
179 | - : required; | |
177 | + const getRequired = isFunction(required) ? required(unref(getValues)) : required; | |
180 | 178 | |
181 | 179 | if ((!rules || rules.length === 0) && getRequired) { |
182 | 180 | rules = [{ required: getRequired, validator }]; | ... | ... |
src/components/Icon/src/SvgIcon.vue
... | ... | @@ -36,17 +36,15 @@ |
36 | 36 | const { prefixCls } = useDesign('svg-icon'); |
37 | 37 | const symbolId = computed(() => `#${props.prefix}-${props.name}`); |
38 | 38 | |
39 | - const getStyle = computed( | |
40 | - (): CSSProperties => { | |
41 | - const { size } = props; | |
42 | - let s = `${size}`; | |
43 | - s = `${s.replace('px', '')}px`; | |
44 | - return { | |
45 | - width: s, | |
46 | - height: s, | |
47 | - }; | |
48 | - } | |
49 | - ); | |
39 | + const getStyle = computed((): CSSProperties => { | |
40 | + const { size } = props; | |
41 | + let s = `${size}`; | |
42 | + s = `${s.replace('px', '')}px`; | |
43 | + return { | |
44 | + width: s, | |
45 | + height: s, | |
46 | + }; | |
47 | + }); | |
50 | 48 | return { symbolId, prefixCls, getStyle }; |
51 | 49 | }, |
52 | 50 | }); | ... | ... |
src/components/Modal/src/BasicModal.vue
... | ... | @@ -107,14 +107,12 @@ |
107 | 107 | } |
108 | 108 | |
109 | 109 | // Custom title component: get title |
110 | - const getMergeProps = computed( | |
111 | - (): ModalProps => { | |
112 | - return { | |
113 | - ...props, | |
114 | - ...(unref(propsRef) as any), | |
115 | - }; | |
116 | - } | |
117 | - ); | |
110 | + const getMergeProps = computed((): ModalProps => { | |
111 | + return { | |
112 | + ...props, | |
113 | + ...(unref(propsRef) as any), | |
114 | + }; | |
115 | + }); | |
118 | 116 | |
119 | 117 | const { handleFullScreen, getWrapClassName, fullScreenRef } = useFullScreen({ |
120 | 118 | modalWrapperRef, |
... | ... | @@ -123,31 +121,27 @@ |
123 | 121 | }); |
124 | 122 | |
125 | 123 | // modal component does not need title and origin buttons |
126 | - const getProps = computed( | |
127 | - (): ModalProps => { | |
128 | - const opt = { | |
129 | - ...unref(getMergeProps), | |
130 | - visible: unref(visibleRef), | |
131 | - okButtonProps: undefined, | |
132 | - cancelButtonProps: undefined, | |
133 | - title: undefined, | |
134 | - }; | |
135 | - return { | |
136 | - ...opt, | |
137 | - wrapClassName: unref(getWrapClassName), | |
138 | - }; | |
139 | - } | |
140 | - ); | |
124 | + const getProps = computed((): ModalProps => { | |
125 | + const opt = { | |
126 | + ...unref(getMergeProps), | |
127 | + visible: unref(visibleRef), | |
128 | + okButtonProps: undefined, | |
129 | + cancelButtonProps: undefined, | |
130 | + title: undefined, | |
131 | + }; | |
132 | + return { | |
133 | + ...opt, | |
134 | + wrapClassName: unref(getWrapClassName), | |
135 | + }; | |
136 | + }); | |
141 | 137 | |
142 | - const getBindValue = computed( | |
143 | - (): Recordable => { | |
144 | - const attr = { ...attrs, ...unref(getProps) }; | |
145 | - if (unref(fullScreenRef)) { | |
146 | - return omit(attr, 'height'); | |
147 | - } | |
148 | - return attr; | |
138 | + const getBindValue = computed((): Recordable => { | |
139 | + const attr = { ...attrs, ...unref(getProps) }; | |
140 | + if (unref(fullScreenRef)) { | |
141 | + return omit(attr, 'height'); | |
149 | 142 | } |
150 | - ); | |
143 | + return attr; | |
144 | + }); | |
151 | 145 | |
152 | 146 | const getWrapperHeight = computed(() => { |
153 | 147 | if (unref(fullScreenRef)) return undefined; | ... | ... |
src/components/SimpleMenu/src/components/MenuItem.vue
... | ... | @@ -39,9 +39,8 @@ |
39 | 39 | |
40 | 40 | const active = ref(false); |
41 | 41 | |
42 | - const { getItemStyle, getParentList, getParentMenu, getParentRootMenu } = useMenuItem( | |
43 | - instance | |
44 | - ); | |
42 | + const { getItemStyle, getParentList, getParentMenu, getParentRootMenu } = | |
43 | + useMenuItem(instance); | |
45 | 44 | |
46 | 45 | const { prefixCls } = useDesign('menu'); |
47 | 46 | ... | ... |
src/components/SimpleMenu/src/components/SubMenuItem.vue
... | ... | @@ -109,9 +109,8 @@ |
109 | 109 | isChild: false, |
110 | 110 | }); |
111 | 111 | |
112 | - const { getParentSubMenu, getItemStyle, getParentMenu, getParentList } = useMenuItem( | |
113 | - instance | |
114 | - ); | |
112 | + const { getParentSubMenu, getItemStyle, getParentMenu, getParentList } = | |
113 | + useMenuItem(instance); | |
115 | 114 | |
116 | 115 | const { prefixCls } = useDesign('menu'); |
117 | 116 | |
... | ... | @@ -148,13 +147,11 @@ |
148 | 147 | const getCollapse = computed(() => rootProps.collapse); |
149 | 148 | const getTheme = computed(() => rootProps.theme); |
150 | 149 | |
151 | - const getOverlayStyle = computed( | |
152 | - (): CSSProperties => { | |
153 | - return { | |
154 | - minWidth: '200px', | |
155 | - }; | |
156 | - } | |
157 | - ); | |
150 | + const getOverlayStyle = computed((): CSSProperties => { | |
151 | + return { | |
152 | + minWidth: '200px', | |
153 | + }; | |
154 | + }); | |
158 | 155 | |
159 | 156 | const getIsOpend = computed(() => { |
160 | 157 | const name = props.name; | ... | ... |
src/components/SimpleMenu/src/components/useMenu.ts
... | ... | @@ -14,26 +14,24 @@ export function useMenuItem(instance: ComponentInternalInstance | null) { |
14 | 14 | return findParentMenu(['SubMenu']); |
15 | 15 | }); |
16 | 16 | |
17 | - const getItemStyle = computed( | |
18 | - (): CSSProperties => { | |
19 | - let parent = instance?.parent; | |
20 | - if (!parent) return {}; | |
21 | - const indentSize = (unref(getParentRootMenu)?.props.indentSize as number) ?? 20; | |
22 | - let padding = indentSize; | |
17 | + const getItemStyle = computed((): CSSProperties => { | |
18 | + let parent = instance?.parent; | |
19 | + if (!parent) return {}; | |
20 | + const indentSize = (unref(getParentRootMenu)?.props.indentSize as number) ?? 20; | |
21 | + let padding = indentSize; | |
23 | 22 | |
24 | - if (unref(getParentRootMenu)?.props.collapse) { | |
25 | - padding = indentSize; | |
26 | - } else { | |
27 | - while (parent && parent.type.name !== 'Menu') { | |
28 | - if (parent.type.name === 'SubMenu') { | |
29 | - padding += indentSize; | |
30 | - } | |
31 | - parent = parent.parent; | |
23 | + if (unref(getParentRootMenu)?.props.collapse) { | |
24 | + padding = indentSize; | |
25 | + } else { | |
26 | + while (parent && parent.type.name !== 'Menu') { | |
27 | + if (parent.type.name === 'SubMenu') { | |
28 | + padding += indentSize; | |
32 | 29 | } |
30 | + parent = parent.parent; | |
33 | 31 | } |
34 | - return { paddingLeft: padding + 'px' }; | |
35 | 32 | } |
36 | - ); | |
33 | + return { paddingLeft: padding + 'px' }; | |
34 | + }); | |
37 | 35 | |
38 | 36 | function findParentMenu(name: string[]) { |
39 | 37 | let parent = instance?.parent; | ... | ... |
src/directives/clickOutside.ts
... | ... | @@ -31,12 +31,14 @@ function createDocumentHandler(el: HTMLElement, binding: DirectiveBinding): Docu |
31 | 31 | excludes = binding.arg; |
32 | 32 | } else { |
33 | 33 | // due to current implementation on binding type is wrong the type casting is necessary here |
34 | - excludes.push((binding.arg as unknown) as HTMLElement); | |
34 | + excludes.push(binding.arg as unknown as HTMLElement); | |
35 | 35 | } |
36 | 36 | return function (mouseup, mousedown) { |
37 | - const popperRef = (binding.instance as ComponentPublicInstance<{ | |
38 | - popperRef: Nullable<HTMLElement>; | |
39 | - }>).popperRef; | |
37 | + const popperRef = ( | |
38 | + binding.instance as ComponentPublicInstance<{ | |
39 | + popperRef: Nullable<HTMLElement>; | |
40 | + }> | |
41 | + ).popperRef; | |
40 | 42 | const mouseUpTarget = mouseup.target as Node; |
41 | 43 | const mouseDownTarget = mousedown.target as Node; |
42 | 44 | const isBound = !binding || !binding.instance; | ... | ... |
src/hooks/web/useI18n.ts
... | ... | @@ -21,9 +21,7 @@ function getKey(namespace: string | undefined, key: string) { |
21 | 21 | return `${namespace}.${key}`; |
22 | 22 | } |
23 | 23 | |
24 | -export function useI18n( | |
25 | - namespace?: string | |
26 | -): { | |
24 | +export function useI18n(namespace?: string): { | |
27 | 25 | t: I18nGlobalTranslation; |
28 | 26 | } { |
29 | 27 | const normalFn = { | ... | ... |
src/hooks/web/useMessage.tsx
... | ... | @@ -60,7 +60,7 @@ function createConfirm(options: ModalOptionsEx): ConfirmOptions { |
60 | 60 | icon: getIcon(iconType), |
61 | 61 | ...options, |
62 | 62 | }; |
63 | - return (Modal.confirm(opt) as unknown) as ConfirmOptions; | |
63 | + return Modal.confirm(opt) as unknown as ConfirmOptions; | |
64 | 64 | } |
65 | 65 | |
66 | 66 | const getBaseOptions = () => { | ... | ... |
src/layouts/default/header/components/Breadcrumb.vue
... | ... | @@ -71,10 +71,10 @@ |
71 | 71 | const breadcrumbList = filterItem(matched); |
72 | 72 | |
73 | 73 | if (currentRoute.value.meta?.currentActiveMenu) { |
74 | - breadcrumbList.push(({ | |
74 | + breadcrumbList.push({ | |
75 | 75 | ...currentRoute.value, |
76 | 76 | name: currentRoute.value.meta?.title || currentRoute.value.name, |
77 | - } as unknown) as RouteLocationMatched); | |
77 | + } as unknown as RouteLocationMatched); | |
78 | 78 | } |
79 | 79 | routes.value = breadcrumbList; |
80 | 80 | }); | ... | ... |
src/layouts/default/menu/index.vue
... | ... | @@ -76,13 +76,11 @@ |
76 | 76 | ); |
77 | 77 | }); |
78 | 78 | |
79 | - const getWrapperStyle = computed( | |
80 | - (): CSSProperties => { | |
81 | - return { | |
82 | - height: `calc(100% - ${unref(getIsShowLogo) ? '48px' : '0px'})`, | |
83 | - }; | |
84 | - } | |
85 | - ); | |
79 | + const getWrapperStyle = computed((): CSSProperties => { | |
80 | + return { | |
81 | + height: `calc(100% - ${unref(getIsShowLogo) ? '48px' : '0px'})`, | |
82 | + }; | |
83 | + }); | |
86 | 84 | |
87 | 85 | const getLogoClass = computed(() => { |
88 | 86 | return [ | ... | ... |
src/layouts/default/setting/SettingDrawer.tsx
... | ... | @@ -58,12 +58,8 @@ export default defineComponent({ |
58 | 58 | getThemeColor, |
59 | 59 | } = useRootSetting(); |
60 | 60 | |
61 | - const { | |
62 | - getOpenPageLoading, | |
63 | - getBasicTransition, | |
64 | - getEnableTransition, | |
65 | - getOpenNProgress, | |
66 | - } = useTransitionSetting(); | |
61 | + const { getOpenPageLoading, getBasicTransition, getEnableTransition, getOpenNProgress } = | |
62 | + useTransitionSetting(); | |
67 | 63 | |
68 | 64 | const { |
69 | 65 | getIsHorizontal, | ... | ... |
src/layouts/default/sider/LayoutSider.vue
... | ... | @@ -89,19 +89,17 @@ |
89 | 89 | ]; |
90 | 90 | }); |
91 | 91 | |
92 | - const getHiddenDomStyle = computed( | |
93 | - (): CSSProperties => { | |
94 | - const width = `${unref(getRealWidth)}px`; | |
95 | - return { | |
96 | - width: width, | |
97 | - overflow: 'hidden', | |
98 | - flex: `0 0 ${width}`, | |
99 | - maxWidth: width, | |
100 | - minWidth: width, | |
101 | - transition: 'all 0.2s', | |
102 | - }; | |
103 | - } | |
104 | - ); | |
92 | + const getHiddenDomStyle = computed((): CSSProperties => { | |
93 | + const width = `${unref(getRealWidth)}px`; | |
94 | + return { | |
95 | + width: width, | |
96 | + overflow: 'hidden', | |
97 | + flex: `0 0 ${width}`, | |
98 | + maxWidth: width, | |
99 | + minWidth: width, | |
100 | + transition: 'all 0.2s', | |
101 | + }; | |
102 | + }); | |
105 | 103 | |
106 | 104 | return { |
107 | 105 | prefixCls, | ... | ... |
src/layouts/default/sider/MixSider.vue
... | ... | @@ -147,14 +147,12 @@ |
147 | 147 | |
148 | 148 | useDragLine(sideRef, dragBarRef, true); |
149 | 149 | |
150 | - const getMenuStyle = computed( | |
151 | - (): CSSProperties => { | |
152 | - return { | |
153 | - width: unref(openMenu) ? `${unref(getMenuWidth)}px` : 0, | |
154 | - left: `${unref(getMixSideWidth)}px`, | |
155 | - }; | |
156 | - } | |
157 | - ); | |
150 | + const getMenuStyle = computed((): CSSProperties => { | |
151 | + return { | |
152 | + width: unref(openMenu) ? `${unref(getMenuWidth)}px` : 0, | |
153 | + left: `${unref(getMixSideWidth)}px`, | |
154 | + }; | |
155 | + }); | |
158 | 156 | |
159 | 157 | const getIsFixed = computed(() => { |
160 | 158 | /* eslint-disable-next-line */ |
... | ... | @@ -171,20 +169,16 @@ |
171 | 169 | return unref(getCollapsed) ? SIDE_BAR_MINI_WIDTH : SIDE_BAR_SHOW_TIT_MINI_WIDTH; |
172 | 170 | }); |
173 | 171 | |
174 | - const getDomStyle = computed( | |
175 | - (): CSSProperties => { | |
176 | - const fixedWidth = unref(getIsFixed) ? unref(getRealWidth) : 0; | |
177 | - const width = `${unref(getMixSideWidth) + fixedWidth}px`; | |
178 | - return getWrapCommonStyle(width); | |
179 | - } | |
180 | - ); | |
172 | + const getDomStyle = computed((): CSSProperties => { | |
173 | + const fixedWidth = unref(getIsFixed) ? unref(getRealWidth) : 0; | |
174 | + const width = `${unref(getMixSideWidth) + fixedWidth}px`; | |
175 | + return getWrapCommonStyle(width); | |
176 | + }); | |
181 | 177 | |
182 | - const getWrapStyle = computed( | |
183 | - (): CSSProperties => { | |
184 | - const width = `${unref(getMixSideWidth)}px`; | |
185 | - return getWrapCommonStyle(width); | |
186 | - } | |
187 | - ); | |
178 | + const getWrapStyle = computed((): CSSProperties => { | |
179 | + const width = `${unref(getMixSideWidth)}px`; | |
180 | + return getWrapCommonStyle(width); | |
181 | + }); | |
188 | 182 | |
189 | 183 | const getMenuEvents = computed(() => { |
190 | 184 | return !unref(getMixSideFixed) | ... | ... |
src/layouts/default/tabs/index.vue
... | ... | @@ -106,8 +106,7 @@ |
106 | 106 | .getRoutes() |
107 | 107 | .find((item) => item.path === currentActiveMenu); |
108 | 108 | |
109 | - findParentRoute && | |
110 | - tabStore.addTab((findParentRoute as unknown) as RouteLocationNormalized); | |
109 | + findParentRoute && tabStore.addTab(findParentRoute as unknown as RouteLocationNormalized); | |
111 | 110 | } else { |
112 | 111 | tabStore.addTab(unref(route)); |
113 | 112 | } | ... | ... |
src/layouts/default/tabs/useMultipleTabs.ts
... | ... | @@ -30,14 +30,14 @@ export function initAffixTabs(): string[] { |
30 | 30 | * @description: Set fixed tabs |
31 | 31 | */ |
32 | 32 | function addAffixTabs(): void { |
33 | - const affixTabs = filterAffixTabs((router.getRoutes() as unknown) as RouteLocationNormalized[]); | |
33 | + const affixTabs = filterAffixTabs(router.getRoutes() as unknown as RouteLocationNormalized[]); | |
34 | 34 | affixList.value = affixTabs; |
35 | 35 | for (const tab of affixTabs) { |
36 | - tabStore.addTab(({ | |
36 | + tabStore.addTab({ | |
37 | 37 | meta: tab.meta, |
38 | 38 | name: tab.name, |
39 | 39 | path: tab.path, |
40 | - } as unknown) as RouteLocationNormalized); | |
40 | + } as unknown as RouteLocationNormalized); | |
41 | 41 | } |
42 | 42 | } |
43 | 43 | ... | ... |
src/layouts/default/tabs/useTabDropdown.ts
... | ... | @@ -20,11 +20,9 @@ export function useTabDropdown(tabContentProps: TabContentProps, getIsTabs: Comp |
20 | 20 | const { currentRoute } = useRouter(); |
21 | 21 | const { refreshPage, closeAll, close, closeLeft, closeOther, closeRight } = useTabs(); |
22 | 22 | |
23 | - const getTargetTab = computed( | |
24 | - (): RouteLocationNormalized => { | |
25 | - return unref(getIsTabs) ? tabContentProps.tabItem : unref(currentRoute); | |
26 | - } | |
27 | - ); | |
23 | + const getTargetTab = computed((): RouteLocationNormalized => { | |
24 | + return unref(getIsTabs) ? tabContentProps.tabItem : unref(currentRoute); | |
25 | + }); | |
28 | 26 | |
29 | 27 | /** |
30 | 28 | * @description: drop-down list | ... | ... |
src/layouts/iframe/useFrameKeepAlive.ts
... | ... | @@ -16,8 +16,7 @@ export function useFrameKeepAlive() { |
16 | 16 | const { getShowMultipleTab } = useMultipleTabSetting(); |
17 | 17 | const tabStore = useMultipleTabStore(); |
18 | 18 | const getFramePages = computed(() => { |
19 | - const ret = | |
20 | - getAllFramePages((toRaw(router.getRoutes()) as unknown) as AppRouteRecordRaw[]) || []; | |
19 | + const ret = getAllFramePages(toRaw(router.getRoutes()) as unknown as AppRouteRecordRaw[]) || []; | |
21 | 20 | return ret; |
22 | 21 | }); |
23 | 22 | ... | ... |
src/router/guard/permissionGuard.ts
... | ... | @@ -60,7 +60,7 @@ export function createPermissionGuard(router: Router) { |
60 | 60 | const routes = await permissionStore.buildRoutesAction(); |
61 | 61 | |
62 | 62 | routes.forEach((route) => { |
63 | - router.addRoute((route as unknown) as RouteRecordRaw); | |
63 | + router.addRoute(route as unknown as RouteRecordRaw); | |
64 | 64 | }); |
65 | 65 | |
66 | 66 | const redirectPath = (from.query.redirect || to.path) as string; | ... | ... |
src/utils/cache/memory.ts
... | ... | @@ -80,7 +80,7 @@ export class Memory<T = any, V = any> { |
80 | 80 | |
81 | 81 | resetCache(cache: { [K in keyof T]: Cache }) { |
82 | 82 | Object.keys(cache).forEach((key) => { |
83 | - const k = (key as any) as keyof T; | |
83 | + const k = key as any as keyof T; | |
84 | 84 | const item = cache[k]; |
85 | 85 | if (item && item.time) { |
86 | 86 | const now = new Date().getTime(); | ... | ... |
src/utils/env.ts
... | ... | @@ -17,10 +17,10 @@ export function getStorageShortName() { |
17 | 17 | export function getAppEnvConfig() { |
18 | 18 | const ENV_NAME = getConfigFileName(import.meta.env); |
19 | 19 | |
20 | - const ENV = ((import.meta.env.DEV | |
20 | + const ENV = (import.meta.env.DEV | |
21 | 21 | ? // Get the global configuration (the configuration will be extracted independently when packaging) |
22 | - ((import.meta.env as unknown) as GlobEnvConfig) | |
23 | - : window[ENV_NAME as any]) as unknown) as GlobEnvConfig; | |
22 | + (import.meta.env as unknown as GlobEnvConfig) | |
23 | + : window[ENV_NAME as any]) as unknown as GlobEnvConfig; | |
24 | 24 | |
25 | 25 | const { |
26 | 26 | VITE_GLOB_APP_TITLE, | ... | ... |
src/utils/is.ts
... | ... | @@ -89,6 +89,7 @@ export const isServer = typeof window === 'undefined'; |
89 | 89 | export const isClient = !isServer; |
90 | 90 | |
91 | 91 | export function isUrl(path: string): boolean { |
92 | - const reg = /(((^https?:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(?::\d+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)$/; | |
92 | + const reg = | |
93 | + /(((^https?:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(?::\d+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)$/; | |
93 | 94 | return reg.test(path); |
94 | 95 | } | ... | ... |
src/views/demo/form/DynamicForm.vue
... | ... | @@ -181,16 +181,14 @@ |
181 | 181 | export default defineComponent({ |
182 | 182 | components: { BasicForm, CollapseContainer, PageWrapper }, |
183 | 183 | setup() { |
184 | - const [ | |
185 | - register, | |
186 | - { setProps, updateSchema, appendSchemaByField, removeSchemaByFiled }, | |
187 | - ] = useForm({ | |
188 | - labelWidth: 120, | |
189 | - schemas, | |
190 | - actionColOptions: { | |
191 | - span: 24, | |
192 | - }, | |
193 | - }); | |
184 | + const [register, { setProps, updateSchema, appendSchemaByField, removeSchemaByFiled }] = | |
185 | + useForm({ | |
186 | + labelWidth: 120, | |
187 | + schemas, | |
188 | + actionColOptions: { | |
189 | + span: 24, | |
190 | + }, | |
191 | + }); | |
194 | 192 | const [register1] = useForm({ |
195 | 193 | labelWidth: 120, |
196 | 194 | schemas: schemas1, | ... | ... |
src/views/demo/system/account/DeptTree.vue
... | ... | @@ -26,7 +26,7 @@ |
26 | 26 | const treeData = ref<TreeItem[]>([]); |
27 | 27 | |
28 | 28 | async function fetch() { |
29 | - treeData.value = ((await getDeptList()) as unknown) as TreeItem[]; | |
29 | + treeData.value = (await getDeptList()) as unknown as TreeItem[]; | |
30 | 30 | } |
31 | 31 | |
32 | 32 | function handleSelect(keys: string, e) { | ... | ... |
src/views/demo/system/role/RoleDrawer.vue
... | ... | @@ -54,7 +54,7 @@ |
54 | 54 | ...data.record, |
55 | 55 | }); |
56 | 56 | } |
57 | - treeData.value = ((await getMenuList()) as any) as TreeItem[]; | |
57 | + treeData.value = (await getMenuList()) as any as TreeItem[]; | |
58 | 58 | }); |
59 | 59 | |
60 | 60 | const getTitle = computed(() => (!unref(isUpdate) ? '新增角色' : '编辑角色')); | ... | ... |
src/views/sys/exception/Exception.vue
... | ... | @@ -64,11 +64,9 @@ |
64 | 64 | return Number(routeStatus) || status; |
65 | 65 | }); |
66 | 66 | |
67 | - const getMapValue = computed( | |
68 | - (): MapValue => { | |
69 | - return unref(statusMapRef).get(unref(getStatus)) as MapValue; | |
70 | - } | |
71 | - ); | |
67 | + const getMapValue = computed((): MapValue => { | |
68 | + return unref(statusMapRef).get(unref(getStatus)) as MapValue; | |
69 | + }); | |
72 | 70 | |
73 | 71 | const backLoginI18n = t('sys.exception.backLogin'); |
74 | 72 | const backHomeI18n = t('sys.exception.backHome'); | ... | ... |
src/views/sys/iframe/index.vue
... | ... | @@ -32,13 +32,11 @@ |
32 | 32 | const { prefixCls } = useDesign('iframe-page'); |
33 | 33 | useWindowSizeFn(calcHeight, 150, { immediate: true }); |
34 | 34 | |
35 | - const getWrapStyle = computed( | |
36 | - (): CSSProperties => { | |
37 | - return { | |
38 | - height: `${unref(heightRef)}px`, | |
39 | - }; | |
40 | - } | |
41 | - ); | |
35 | + const getWrapStyle = computed((): CSSProperties => { | |
36 | + return { | |
37 | + height: `${unref(heightRef)}px`, | |
38 | + }; | |
39 | + }); | |
42 | 40 | |
43 | 41 | function calcHeight() { |
44 | 42 | const iframe = unref(frameRef); | ... | ... |
stylelint.config.js
... | ... | @@ -28,7 +28,7 @@ module.exports = { |
28 | 28 | 'font-family-no-missing-generic-family-keyword': null, |
29 | 29 | 'declaration-colon-space-after': 'always-single-line', |
30 | 30 | 'declaration-colon-space-before': 'never', |
31 | - 'declaration-block-trailing-semicolon': 'always', | |
31 | + // 'declaration-block-trailing-semicolon': 'always', | |
32 | 32 | 'rule-empty-line-before': [ |
33 | 33 | 'always', |
34 | 34 | { | ... | ... |