@cst-ui/nano-buttons 0.2.3 → 0.3.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
@@ -1,244 +1,292 @@
1
- # @cst-ui/nano-buttons
2
-
3
- Nano 项目主题按钮组件库,基于 Vue 3 和 Element Plus 封装。
4
-
5
- 这个包用于统一提供 Nano 系列按钮组件,并通过子入口提供弹窗标签页化的公共能力。模板中统一使用横线法组件名,例如 `<nano-button>`,不再保留旧命名。
6
-
7
- ## 入口说明
8
-
9
- 包内能力按子入口拆分,按钮和弹窗标签页可以分开引入:
10
-
11
- ```ts
12
- // 兼容旧按钮入口
13
- import NanoButtons from '@cst-ui/nano-buttons'
14
-
15
- // 明确的按钮入口
16
- import NanoButtons from '@cst-ui/nano-buttons/buttons'
17
-
1
+ # @cst-ui/nano-buttons
2
+
3
+ Nano 项目公共前端组件库,基于 Vue 3 和 Element Plus 封装。
4
+
5
+ 这个包用于统一提供 Nano 系列按钮、表格、分页组件,并通过子入口提供弹窗标签页化的公共能力。模板中统一使用横线法组件名,例如 `<nano-button>`,不再保留旧命名。
6
+
7
+ ## 入口说明
8
+
9
+ 包内能力按子入口拆分,按钮、表格和弹窗标签页可以分开引入:
10
+
11
+ ```ts
12
+ // 兼容旧按钮入口
13
+ import NanoButtons from '@cst-ui/nano-buttons'
14
+
15
+ // 明确的按钮入口
16
+ import NanoButtons from '@cst-ui/nano-buttons/buttons'
17
+
18
18
  // 弹窗标签页入口
19
19
  import { createNanoDialogTabs } from '@cst-ui/nano-buttons/dialog-tabs'
20
- ```
21
-
22
- ## 在线文档
23
-
24
- 组件效果、安装方式、使用示例和 API 说明见在线文档:
25
-
26
- https://nano-buttons-docs.netlify.app/
27
-
28
- ## 安装
29
-
30
- ```bash
31
- pnpm add @cst-ui/nano-buttons
32
- ```
33
-
34
- ## 全局注册
35
-
36
- 在应用入口文件中注册组件并引入样式:
37
-
38
- ```ts
39
- import { createApp } from 'vue'
40
- import App from './App.vue'
41
- import NanoButtons from '@cst-ui/nano-buttons'
42
- import '@cst-ui/nano-buttons/style.css'
43
-
44
- const app = createApp(App)
45
-
46
- app.use(NanoButtons)
47
- app.mount('#app')
48
- ```
49
20
 
21
+ // 表格与分页入口
22
+ import { CstTable, CstPagination } from '@cst-ui/nano-buttons/table'
23
+ ```
24
+
25
+ ## 在线文档
26
+
27
+ 组件效果、安装方式、使用示例和 API 说明见在线文档:
28
+
29
+ https://nano-buttons-docs.netlify.app/
30
+
31
+ ## 安装
32
+
33
+ ```bash
34
+ pnpm add @cst-ui/nano-buttons
35
+ ```
36
+
37
+ ## 全局注册
38
+
39
+ 在应用入口文件中注册组件并引入样式:
40
+
41
+ ```ts
42
+ import { createApp } from 'vue'
43
+ import App from './App.vue'
44
+ import NanoButtons from '@cst-ui/nano-buttons'
45
+ import '@cst-ui/nano-buttons/style.css'
46
+
47
+ const app = createApp(App)
48
+
49
+ app.use(NanoButtons)
50
+ app.mount('#app')
51
+ ```
52
+
50
53
  按钮插件也提供明确的平级子入口,旧入口继续兼容:
51
-
52
- ```ts
54
+
55
+ ```ts
53
56
  import NanoButtons from '@cst-ui/nano-buttons/buttons'
54
57
  ```
55
58
 
56
- ## 组件列表
59
+ 表格模块使用独立入口,可以按需引入组件或全局安装:
57
60
 
58
- 模板中统一使用横线法:
61
+ ```ts
62
+ import CstTableComponents from '@cst-ui/nano-buttons/table'
59
63
 
60
- ```vue
61
- <nano-button />
62
- <nano-add-button />
63
- <nano-text-add-button />
64
- <nano-move-button />
65
- <nano-import-button />
66
- <nano-export-button />
67
- <nano-edit-button />
68
- <nano-manage-button />
69
- <nano-delete-button />
70
- <nano-submit-button />
71
- <nano-cancel-button />
64
+ app.use(CstTableComponents)
65
+ ```
66
+
67
+ ## 组件列表
68
+
69
+ 模板中统一使用横线法:
70
+
71
+ ```vue
72
+ <nano-button />
73
+ <nano-add-button />
74
+ <nano-text-add-button />
75
+ <nano-move-button />
76
+ <nano-import-button />
77
+ <nano-export-button />
78
+ <nano-edit-button />
79
+ <nano-manage-button />
80
+ <nano-delete-button />
81
+ <nano-submit-button />
82
+ <nano-cancel-button />
72
83
  <nano-back-top-button />
84
+ <cst-table />
85
+ <cst-pagination />
86
+ ```
87
+
88
+ ## 使用示例
89
+
90
+ 固定语义按钮直接使用对应组件:
91
+
92
+ ```vue
93
+ <nano-add-button />
94
+ <nano-import-button />
95
+ <nano-export-button />
96
+ <nano-delete-button />
97
+ <nano-submit-button>保存</nano-submit-button>
98
+ <nano-cancel-button>取消</nano-cancel-button>
99
+ ```
100
+
101
+ 不在固定语义里的普通按钮,统一使用 `<nano-button>`:
102
+
103
+ ```vue
104
+ <nano-button icon="Refresh">刷新</nano-button>
105
+ <nano-import-button>导入</nano-import-button>
106
+ <nano-export-button :loading="exporting">导出</nano-export-button>
73
107
  ```
74
108
 
75
- ## 使用示例
109
+ ## 表格与分页
76
110
 
77
- 固定语义按钮直接使用对应组件:
111
+ `CstPagination` 是独立分页组件,只负责展示分页状态和发送变更事件,不请求接口、不处理业务数据。默认显示总数、每页条数、页码和前往指定页;服务端分页页面可以直接接入现有查询方法:
78
112
 
79
113
  ```vue
80
- <nano-add-button />
81
- <nano-import-button />
82
- <nano-export-button />
83
- <nano-delete-button />
84
- <nano-submit-button>保存</nano-submit-button>
85
- <nano-cancel-button>取消</nano-cancel-button>
114
+ <CstPagination
115
+ :current-page="page.currentPage"
116
+ :page-size="page.pageSize"
117
+ :page-count="page.pageCount"
118
+ :page-sizes="page.pageSizes"
119
+ @update:current-page="onCurrentPageUpdate"
120
+ @update:page-size="onPageSizeUpdate"
121
+ />
86
122
  ```
87
123
 
88
- 不在固定语义里的普通按钮,统一使用 `<nano-button>`:
124
+ `CstTable` 组合了 Element Plus Table 和 `CstPagination`,默认对传入的完整数组做前端分页。列定义和其他表格属性继续按照 Element Plus Table 使用:
89
125
 
90
126
  ```vue
91
- <nano-button icon="Refresh">刷新</nano-button>
92
- <nano-import-button>导入</nano-import-button>
93
- <nano-export-button :loading="exporting">导出</nano-export-button>
127
+ <CstTable
128
+ :data="rows"
129
+ :default-page-size="10"
130
+ >
131
+ <el-table-column prop="name" label="名称" />
132
+ <el-table-column prop="status" label="状态" />
133
+ </CstTable>
94
134
  ```
95
135
 
96
- ## 依赖说明
97
-
98
- `vue`、`element-plus` 和 `vue-router` 是 peer dependencies,需要由使用方项目提供。
99
-
100
- ## 弹窗标签页
101
-
102
- 弹窗标签页能力用于把原本的弹窗按开关切换成系统 tab 页,同时保留原弹窗模式。公共包只负责打开模式、上下文缓存、保存结果通知、关闭回来源页和 `NanoDialogTabPage` 页面壳;业务项目负责注册页面、请求数据和保存业务。
103
-
104
- ### 入口安装
105
-
106
- 在应用入口安装插件:
107
-
108
- ```ts
109
- import { createNanoDialogTabs } from '@cst-ui/nano-buttons/dialog-tabs'
110
-
111
- app.use(createNanoDialogTabs({
112
- router,
113
- parentRouteName: 'layout',
114
- registry: dialogRegistry,
115
- mode: () => DIALOG_OPEN_MODE,
116
- translate: key => i18n.global.t(key),
117
- tabAdapter: {
118
- getTabs: () => tabStore.tabsOption,
119
- getCurrentIndex: () => tabStore.currentIndex,
120
- setCurrentIndex: index => tabStore.SET_TAB(index),
121
- deleteTab: index => tabStore.DELETE_TAB(index),
122
- },
123
- }))
124
- ```
125
-
126
- ### 注册页面
127
-
128
- 在业务项目维护弹窗注册表:
129
-
130
- ```ts
131
- export const dialogRegistry = {
132
- userEdit: {
133
- suffix: '/edit',
134
- title: 'dialog.user.edit',
135
- component: async () => await import('@/views/user/components/edit-page.vue'),
136
- props: {
137
- mode: 'edit',
138
- },
139
- },
140
- }
141
- ```
142
-
143
- ### 打开弹窗或 tab
144
-
145
- 原页面统一使用 `openDialog`。开关为 `dialog` 时走 `openModal`,开关为 `tab` 时打开注册页面:
146
-
147
- ```ts
148
- import { useDialogOpen } from '@cst-ui/nano-buttons/dialog-tabs'
149
-
150
- const { openDialog } = useDialogOpen()
151
-
152
- openDialog({
153
- key: 'userEdit',
154
- routeSuffix: `/edit/${row.id}`,
155
- routePatternSuffix: '/edit/:id',
156
- context: {
157
- id: row.id,
158
- },
159
- openModal: () => {
160
- data.showEdit = true
161
- },
162
- })
163
- ```
164
-
165
- ### tab 页面
166
-
167
- tab 页面用 `NanoDialogTabPage` 统一标题、内容滚动、底部操作区和上下文失效兜底:
136
+ 只需要表格、不需要分页时关闭分页:
168
137
 
169
138
  ```vue
170
- <template>
171
- <NanoDialogTabPage
172
- :title-key="pageTitleKey"
173
- :loading="loading"
174
- :expired="expired"
175
- @close="closeCurrentDialogTab"
176
- >
177
- <UserEditForm
178
- :item="item"
179
- variant="page"
180
- @cancel="closeCurrentDialogTab"
181
- @save-ok="onSaveOk"
182
- />
183
- </NanoDialogTabPage>
184
- </template>
185
-
186
- <script setup lang="ts">
187
- import { NanoDialogTabPage, useDialogPage } from '@cst-ui/nano-buttons/dialog-tabs'
188
-
189
- const {
190
- route,
191
- dialogContext,
192
- closeCurrentDialogTab,
193
- emitSavedAndClose,
194
- } = useDialogPage<{ id?: string }>('dialog.user.edit')
195
-
196
- const id = computed(() => dialogContext.value?.id ?? route.params.id)
197
-
198
- const onSaveOk = () => {
199
- emitSavedAndClose('userEdit', { id: id.value })
200
- }
201
- </script>
202
- ```
203
-
204
- ### 保存后刷新来源页
205
-
206
- 来源页可以监听保存结果并刷新列表:
207
-
208
- ```ts
209
- import { onDialogResult } from '@cst-ui/nano-buttons/dialog-tabs'
210
-
211
- onMounted(() => {
212
- const remove = onDialogResult((result) => {
213
- if (result.key === 'userEdit' && result.type === 'saved')
214
- loadList()
215
- })
216
-
217
- onUnmounted(remove)
218
- })
139
+ <CstTable :data="rows" :pagination="false">
140
+ <el-table-column prop="name" label="名称" />
141
+ </CstTable>
219
142
  ```
220
143
 
221
- ### 使用建议
222
-
223
- 1. 路由上的业务主键只放可被正常访问的 ID,不放敏感数据。
224
- 2. `context` 只作为临时上下文,页面刷新后可能失效,页面应提供兜底提示或根据路由主键重新查数据。
225
- 3. 标题传多语言 key,不在公共模块里写死业务文案。
226
- 4. 保存成功统一用 `emitSavedAndClose` 通知来源页刷新。
227
-
228
- ## 维护与发布
229
-
230
- 包维护、版本发布和权限交接说明见 [MAINTAINING.md](./MAINTAINING.md)。
231
-
232
- 文档站本地开发:
233
-
234
- ```bash
235
- pnpm docs:dev
236
- ```
237
-
238
- 文档站构建:
239
-
240
- ```bash
241
- pnpm docs:build
242
- ```
243
-
244
- 更新线上文档时,重新构建后将 `docs-dist/` 上传到 Netlify。若 Netlify 站点或域名发生变化,请同步修改本文档中的在线文档链接。
144
+ ## 依赖说明
145
+
146
+ `vue`、`element-plus` 和 `vue-router` 是 peer dependencies,需要由使用方项目提供。
147
+
148
+ ## 弹窗标签页
149
+
150
+ 弹窗标签页能力用于把原本的弹窗按开关切换成系统 tab 页,同时保留原弹窗模式。公共包只负责打开模式、上下文缓存、保存结果通知、关闭回来源页和 `NanoDialogTabPage` 页面壳;业务项目负责注册页面、请求数据和保存业务。
151
+
152
+ ### 入口安装
153
+
154
+ 在应用入口安装插件:
155
+
156
+ ```ts
157
+ import { createNanoDialogTabs } from '@cst-ui/nano-buttons/dialog-tabs'
158
+
159
+ app.use(createNanoDialogTabs({
160
+ router,
161
+ parentRouteName: 'layout',
162
+ registry: dialogRegistry,
163
+ mode: () => DIALOG_OPEN_MODE,
164
+ translate: key => i18n.global.t(key),
165
+ tabAdapter: {
166
+ getTabs: () => tabStore.tabsOption,
167
+ getCurrentIndex: () => tabStore.currentIndex,
168
+ setCurrentIndex: index => tabStore.SET_TAB(index),
169
+ deleteTab: index => tabStore.DELETE_TAB(index),
170
+ },
171
+ }))
172
+ ```
173
+
174
+ ### 注册页面
175
+
176
+ 在业务项目维护弹窗注册表:
177
+
178
+ ```ts
179
+ export const dialogRegistry = {
180
+ userEdit: {
181
+ suffix: '/edit',
182
+ title: 'dialog.user.edit',
183
+ component: async () => await import('@/views/user/components/edit-page.vue'),
184
+ props: {
185
+ mode: 'edit',
186
+ },
187
+ },
188
+ }
189
+ ```
190
+
191
+ ### 打开弹窗或 tab
192
+
193
+ 原页面统一使用 `openDialog`。开关为 `dialog` 时走 `openModal`,开关为 `tab` 时打开注册页面:
194
+
195
+ ```ts
196
+ import { useDialogOpen } from '@cst-ui/nano-buttons/dialog-tabs'
197
+
198
+ const { openDialog } = useDialogOpen()
199
+
200
+ openDialog({
201
+ key: 'userEdit',
202
+ routeSuffix: `/edit/${row.id}`,
203
+ routePatternSuffix: '/edit/:id',
204
+ context: {
205
+ id: row.id,
206
+ },
207
+ openModal: () => {
208
+ data.showEdit = true
209
+ },
210
+ })
211
+ ```
212
+
213
+ ### tab 页面
214
+
215
+ tab 页面用 `NanoDialogTabPage` 统一标题、内容滚动、底部操作区和上下文失效兜底:
216
+
217
+ ```vue
218
+ <template>
219
+ <NanoDialogTabPage
220
+ :title-key="pageTitleKey"
221
+ :loading="loading"
222
+ :expired="expired"
223
+ @close="closeCurrentDialogTab"
224
+ >
225
+ <UserEditForm
226
+ :item="item"
227
+ variant="page"
228
+ @cancel="closeCurrentDialogTab"
229
+ @save-ok="onSaveOk"
230
+ />
231
+ </NanoDialogTabPage>
232
+ </template>
233
+
234
+ <script setup lang="ts">
235
+ import { NanoDialogTabPage, useDialogPage } from '@cst-ui/nano-buttons/dialog-tabs'
236
+
237
+ const {
238
+ route,
239
+ dialogContext,
240
+ closeCurrentDialogTab,
241
+ emitSavedAndClose,
242
+ } = useDialogPage<{ id?: string }>('dialog.user.edit')
243
+
244
+ const id = computed(() => dialogContext.value?.id ?? route.params.id)
245
+
246
+ const onSaveOk = () => {
247
+ emitSavedAndClose('userEdit', { id: id.value })
248
+ }
249
+ </script>
250
+ ```
251
+
252
+ ### 保存后刷新来源页
253
+
254
+ 来源页可以监听保存结果并刷新列表:
255
+
256
+ ```ts
257
+ import { onDialogResult } from '@cst-ui/nano-buttons/dialog-tabs'
258
+
259
+ onMounted(() => {
260
+ const remove = onDialogResult((result) => {
261
+ if (result.key === 'userEdit' && result.type === 'saved')
262
+ loadList()
263
+ })
264
+
265
+ onUnmounted(remove)
266
+ })
267
+ ```
268
+
269
+ ### 使用建议
270
+
271
+ 1. 路由上的业务主键只放可被正常访问的 ID,不放敏感数据。
272
+ 2. `context` 只作为临时上下文,页面刷新后可能失效,页面应提供兜底提示或根据路由主键重新查数据。
273
+ 3. 标题传多语言 key,不在公共模块里写死业务文案。
274
+ 4. 保存成功统一用 `emitSavedAndClose` 通知来源页刷新。
275
+
276
+ ## 维护与发布
277
+
278
+ 包维护、版本发布和权限交接说明见 [MAINTAINING.md](./MAINTAINING.md)。
279
+
280
+ 文档站本地开发:
281
+
282
+ ```bash
283
+ pnpm docs:dev
284
+ ```
285
+
286
+ 文档站构建:
287
+
288
+ ```bash
289
+ pnpm docs:build
290
+ ```
291
+
292
+ 更新线上文档时,重新构建后将 `docs-dist/` 上传到 Netlify。若 Netlify 站点或域名发生变化,请同步修改本文档中的在线文档链接。
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- :root{--nano-font-size-sm: var(--font-size-sm, 14px);--nano-font-size-lg: var(--font-size-lg, 18px);--nano-font-weight-medium: var(--font-weight-medium, 500);--nano-radius-md: var(--radius-md, 6px);--nano-shadow-card: var(--shadow-card, 0 2px 12px rgba(0, 0, 0, .12));--nano-color-brand-primary: var(--color-brand-primary, #243c96);--nano-color-brand-primary-hover: var(--color-brand-primary-hover, #3550b3);--nano-color-brand-primary-active: var(--color-brand-primary-active, #1b2f78);--nano-color-brand-primary-light: var(--color-brand-primary-light, #eef2ff);--nano-color-text-regular: var(--color-text-regular, #606266);--nano-color-text-on-brand: var(--color-text-on-brand, #ffffff);--nano-color-border-default: var(--color-border-default, #dcdfe6);--nano-color-success: var(--color-success, #67c23a);--nano-color-success-hover: var(--color-success-hover, #85ce61);--nano-color-success-active: var(--color-success-active, #529b2e);--nano-color-warning: var(--color-warning, #e6a23c);--nano-color-warning-hover: var(--color-warning-hover, #ebb563);--nano-color-warning-active: var(--color-warning-active, #b88230);--nano-color-danger: var(--color-danger, #d35a5a);--nano-color-danger-hover: var(--color-danger-hover, #e07272);--nano-color-danger-active: var(--color-danger-active, #bc4949);--nano-color-info: var(--color-info, #909399);--nano-color-info-hover: var(--color-info-hover, #a6a9ad);--nano-color-info-active: var(--color-info-active, #73767a);--nano-color-focus-outline: var(--color-focus-outline, rgba(36, 60, 150, .32));--nano-button-default-bg: var(--button-default-bg, #ffffff);--nano-button-default-text: var(--button-default-text, var(--nano-color-text-regular));--nano-button-default-border: var(--button-default-border, var(--nano-color-border-default));--nano-button-default-hover-bg: var(--button-default-hover-bg, var(--nano-color-brand-primary-light));--nano-button-default-hover-text: var(--button-default-hover-text, var(--nano-color-brand-primary));--nano-button-default-hover-border: var(--button-default-hover-border, var(--nano-color-brand-primary-hover));--nano-button-default-active-bg: var(--button-default-active-bg, #e0e8ff);--nano-button-default-active-text: var(--button-default-active-text, var(--nano-color-brand-primary-active));--nano-button-default-active-border: var(--button-default-active-border, var(--nano-color-brand-primary-active));--nano-button-secondary-bg: var(--button-secondary-bg, var(--nano-color-brand-primary-light));--nano-button-secondary-text: var(--button-secondary-text, var(--nano-color-brand-primary));--nano-button-secondary-border: var(--button-secondary-border, rgba(36, 60, 150, .32));--nano-button-secondary-hover-bg: var(--button-secondary-hover-bg, #e0e8ff);--nano-button-secondary-hover-text: var(--button-secondary-hover-text, var(--nano-color-brand-primary-hover));--nano-button-secondary-hover-border: var(--button-secondary-hover-border, var(--nano-color-brand-primary-hover));--nano-button-secondary-active-bg: var(--button-secondary-active-bg, #d4defd);--nano-button-secondary-active-text: var(--button-secondary-active-text, var(--nano-color-brand-primary-active));--nano-button-secondary-active-border: var(--button-secondary-active-border, var(--nano-color-brand-primary-active));--nano-button-import-bg: var(--button-import-bg, #edf5f3);--nano-button-import-text: var(--button-import-text, #2f6b57);--nano-button-import-border: var(--button-import-border, rgba(47, 107, 87, .2));--nano-button-import-hover-bg: var(--button-import-hover-bg, #e0f0ec);--nano-button-import-hover-text: var(--button-import-hover-text, #285c4b);--nano-button-import-hover-border: var(--button-import-hover-border, rgba(47, 107, 87, .36));--nano-button-import-active-bg: var(--button-import-active-bg, #d3e8e2);--nano-button-import-active-text: var(--button-import-active-text, #224f40);--nano-button-import-active-border: var(--button-import-active-border, rgba(47, 107, 87, .48));--nano-button-export-bg: var(--button-export-bg, #edf5f3);--nano-button-export-text: var(--button-export-text, #2f6b57);--nano-button-export-border: var(--button-export-border, rgba(47, 107, 87, .2));--nano-button-export-hover-bg: var(--button-export-hover-bg, #e0f0ec);--nano-button-export-hover-text: var(--button-export-hover-text, #285c4b);--nano-button-export-hover-border: var(--button-export-hover-border, rgba(47, 107, 87, .36));--nano-button-export-active-bg: var(--button-export-active-bg, #d3e8e2);--nano-button-export-active-text: var(--button-export-active-text, #224f40);--nano-button-export-active-border: var(--button-export-active-border, rgba(47, 107, 87, .48));--nano-button-text-default: var(--button-text-default, var(--nano-color-text-regular));--nano-button-text-hover-bg: var(--button-text-hover-bg, var(--nano-color-brand-primary-light));--nano-button-text-hover: var(--button-text-hover, var(--nano-color-brand-primary));--nano-button-text-active: var(--button-text-active, var(--nano-color-brand-primary-active));--nano-button-hover-shadow: var(--button-hover-shadow, 0 4px 12px rgba(36, 60, 150, .16));--nano-button-default-hover-shadow: var(--button-default-hover-shadow, 0 2px 10px rgba(36, 60, 150, .12));--nano-button-danger-hover-shadow: var(--button-danger-hover-shadow, 0 4px 12px rgba(211, 90, 90, .18))}html.dark{--nano-button-import-bg: var(--button-import-bg, rgba(80, 160, 120, .16));--nano-button-import-text: var(--button-import-text, #8dd3b1);--nano-button-import-border: var(--button-import-border, rgba(80, 160, 120, .28));--nano-button-import-hover-bg: var(--button-import-hover-bg, rgba(80, 160, 120, .24));--nano-button-import-hover-text: var(--button-import-hover-text, #a6e2c4);--nano-button-import-hover-border: var(--button-import-hover-border, rgba(80, 160, 120, .42));--nano-button-import-active-bg: var(--button-import-active-bg, rgba(80, 160, 120, .32));--nano-button-import-active-text: var(--button-import-active-text, #8dd3b1);--nano-button-import-active-border: var(--button-import-active-border, rgba(80, 160, 120, .56));--nano-button-export-bg: var(--button-export-bg, rgba(80, 160, 120, .16));--nano-button-export-text: var(--button-export-text, #8dd3b1);--nano-button-export-border: var(--button-export-border, rgba(80, 160, 120, .28));--nano-button-export-hover-bg: var(--button-export-hover-bg, rgba(80, 160, 120, .24));--nano-button-export-hover-text: var(--button-export-hover-text, #a6e2c4);--nano-button-export-hover-border: var(--button-export-hover-border, rgba(80, 160, 120, .42));--nano-button-export-active-bg: var(--button-export-active-bg, rgba(80, 160, 120, .32));--nano-button-export-active-text: var(--button-export-active-text, #8dd3b1);--nano-button-export-active-border: var(--button-export-active-border, rgba(80, 160, 120, .56))}.el-button{--button-bg: var(--button-default-bg, var(--nano-button-default-bg));--button-text: var(--button-default-text, var(--nano-button-default-text));--button-border: var(--button-default-border, var(--nano-button-default-border));--button-bg-hover: var(--button-default-hover-bg, var(--nano-button-default-hover-bg));--button-text-hover: var(--button-default-hover-text, var(--nano-button-default-hover-text));--button-border-hover: var(--button-default-hover-border, var(--nano-button-default-hover-border));--button-bg-active: var(--button-default-active-bg, var(--nano-button-default-active-bg));--button-text-active: var(--button-default-active-text, var(--nano-button-default-active-text));--button-border-active: var(--button-default-active-border, var(--nano-button-default-active-border));--button-shadow-hover: var(--button-default-hover-shadow, var(--nano-button-default-hover-shadow));font-size:var(--font-size-sm, var(--nano-font-size-sm));font-weight:var(--font-weight-medium, var(--nano-font-weight-medium));border-radius:var(--radius-md, var(--nano-radius-md));transition:background-color .22s ease,border-color .22s ease,color .22s ease,box-shadow .22s ease,opacity .22s ease}.el-button:focus-visible{outline:2px solid var(--color-focus-outline, var(--nano-color-focus-outline));outline-offset:2px}.el-button.is-disabled,.el-button.is-disabled:hover,.el-button.is-disabled:active{box-shadow:none}.el-button:not(.is-text):not(.is-link){--el-button-text-color: var(--button-text);--el-button-bg-color: var(--button-bg);--el-button-border-color: var(--button-border);--el-button-hover-text-color: var(--button-text-hover);--el-button-hover-bg-color: var(--button-bg-hover);--el-button-hover-border-color: var(--button-border-hover);--el-button-active-text-color: var(--button-text-active);--el-button-active-bg-color: var(--button-bg-active);--el-button-active-border-color: var(--button-border-active);color:var(--button-text);background-color:var(--button-bg);border-color:var(--button-border)}.el-button:not(.is-text):not(.is-link):hover{background-color:var(--button-bg-hover);color:var(--button-text-hover);border-color:var(--button-border-hover);box-shadow:var(--button-shadow-hover)}.el-button:not(.is-text):not(.is-link):active{background-color:var(--button-bg-active);color:var(--button-text-active);border-color:var(--button-border-active);box-shadow:none}.el-button.app-button-secondary{--button-bg: var(--button-secondary-bg, var(--nano-button-secondary-bg));--button-text: var(--button-secondary-text, var(--nano-button-secondary-text));--button-border: var(--button-secondary-border, var(--nano-button-secondary-border));--button-bg-hover: var(--button-secondary-hover-bg, var(--nano-button-secondary-hover-bg));--button-text-hover: var(--button-secondary-hover-text, var(--nano-button-secondary-hover-text));--button-border-hover: var(--button-secondary-hover-border, var(--nano-button-secondary-hover-border));--button-bg-active: var(--button-secondary-active-bg, var(--nano-button-secondary-active-bg));--button-text-active: var(--button-secondary-active-text, var(--nano-button-secondary-active-text));--button-border-active: var(--button-secondary-active-border, var(--nano-button-secondary-active-border))}.el-button.app-button-import{--button-bg: var(--button-import-bg, var(--nano-button-import-bg));--button-text: var(--button-import-text, var(--nano-button-import-text));--button-border: var(--button-import-border, var(--nano-button-import-border));--button-bg-hover: var(--button-import-hover-bg, var(--nano-button-import-hover-bg));--button-text-hover: var(--button-import-hover-text, var(--nano-button-import-hover-text));--button-border-hover: var(--button-import-hover-border, var(--nano-button-import-hover-border));--button-bg-active: var(--button-import-active-bg, var(--nano-button-import-active-bg));--button-text-active: var(--button-import-active-text, var(--nano-button-import-active-text));--button-border-active: var(--button-import-active-border, var(--nano-button-import-active-border))}.el-button.app-button-export{--button-bg: var(--button-export-bg, var(--nano-button-export-bg));--button-text: var(--button-export-text, var(--nano-button-export-text));--button-border: var(--button-export-border, var(--nano-button-export-border));--button-bg-hover: var(--button-export-hover-bg, var(--nano-button-export-hover-bg));--button-text-hover: var(--button-export-hover-text, var(--nano-button-export-hover-text));--button-border-hover: var(--button-export-hover-border, var(--nano-button-export-hover-border));--button-bg-active: var(--button-export-active-bg, var(--nano-button-export-active-bg));--button-text-active: var(--button-export-active-text, var(--nano-button-export-active-text));--button-border-active: var(--button-export-active-border, var(--nano-button-export-active-border))}.el-button.el-button--primary,.el-button.el-button--success,.el-button.el-button--warning,.el-button.el-button--danger,.el-button.el-button--info{--button-text: var(--color-text-on-brand, var(--nano-color-text-on-brand));--button-text-hover: var(--color-text-on-brand, var(--nano-color-text-on-brand));--button-text-active: var(--color-text-on-brand, var(--nano-color-text-on-brand));--button-shadow-hover: var(--button-hover-shadow, var(--nano-button-hover-shadow));box-shadow:none}.el-button.el-button--primary{--button-bg: var(--color-brand-primary, var(--nano-color-brand-primary));--button-border: var(--color-brand-primary, var(--nano-color-brand-primary));--button-bg-hover: var(--color-brand-primary-hover, var(--nano-color-brand-primary-hover));--button-border-hover: var(--color-brand-primary-hover, var(--nano-color-brand-primary-hover));--button-bg-active: var(--color-brand-primary-active, var(--nano-color-brand-primary-active));--button-border-active: var(--color-brand-primary-active, var(--nano-color-brand-primary-active))}.el-button.el-button--success{--button-bg: var(--color-success, var(--nano-color-success));--button-border: var(--color-success, var(--nano-color-success));--button-bg-hover: var(--color-success-hover, var(--nano-color-success-hover));--button-border-hover: var(--color-success-hover, var(--nano-color-success-hover));--button-bg-active: var(--color-success-active, var(--nano-color-success-active));--button-border-active: var(--color-success-active, var(--nano-color-success-active))}.el-button.el-button--warning{--button-bg: var(--color-warning, var(--nano-color-warning));--button-border: var(--color-warning, var(--nano-color-warning));--button-bg-hover: var(--color-warning-hover, var(--nano-color-warning-hover));--button-border-hover: var(--color-warning-hover, var(--nano-color-warning-hover));--button-bg-active: var(--color-warning-active, var(--nano-color-warning-active));--button-border-active: var(--color-warning-active, var(--nano-color-warning-active))}.el-button.el-button--danger{--button-bg: var(--color-danger, var(--nano-color-danger));--button-border: var(--color-danger, var(--nano-color-danger));--button-bg-hover: var(--color-danger-hover, var(--nano-color-danger-hover));--button-border-hover: var(--color-danger-hover, var(--nano-color-danger-hover));--button-bg-active: var(--color-danger-active, var(--nano-color-danger-active));--button-border-active: var(--color-danger-active, var(--nano-color-danger-active));--button-shadow-hover: var(--button-danger-hover-shadow, var(--nano-button-danger-hover-shadow))}.el-button.el-button--info{--button-bg: var(--color-info, var(--nano-color-info));--button-border: var(--color-info, var(--nano-color-info));--button-bg-hover: var(--color-info-hover, var(--nano-color-info-hover));--button-border-hover: var(--color-info-hover, var(--nano-color-info-hover));--button-bg-active: var(--color-info-active, var(--nano-color-info-active));--button-border-active: var(--color-info-active, var(--nano-color-info-active))}.el-button.is-text,.el-button.is-link{background-color:transparent;color:var(--button-text-default, var(--nano-button-text-default));border-color:transparent;box-shadow:none}.el-button.is-text:hover{background-color:var(--button-text-hover-bg, var(--nano-button-text-hover-bg));color:var(--button-text-hover, var(--nano-button-text-hover))}.el-button.is-link:hover,.el-button.is-text:active,.el-button.is-link:active{color:var(--button-text-active, var(--nano-button-text-active))}.app-backtop.el-backtop{width:auto;height:auto;background-color:transparent;box-shadow:none}.app-backtop.el-backtop:hover{background-color:transparent}.app-backtop-button.el-button{--button-bg: var(--color-brand-primary, var(--nano-color-brand-primary));--button-text: var(--color-text-on-brand, var(--nano-color-text-on-brand));--button-border: var(--color-brand-primary, var(--nano-color-brand-primary));--button-bg-hover: var(--color-brand-primary-hover, var(--nano-color-brand-primary-hover));--button-text-hover: var(--color-text-on-brand, var(--nano-color-text-on-brand));--button-border-hover: var(--color-brand-primary-hover, var(--nano-color-brand-primary-hover));--button-bg-active: var(--color-brand-primary-active, var(--nano-color-brand-primary-active));--button-text-active: var(--color-text-on-brand, var(--nano-color-text-on-brand));--button-border-active: var(--color-brand-primary-active, var(--nano-color-brand-primary-active));width:42px;height:42px;padding:0;border-radius:12px;border-width:1px;box-shadow:0 10px 22px #243c9642,inset 0 1px #ffffff2e;transform:translateY(0);transition:transform .18s ease,background-color .22s ease,border-color .22s ease,color .22s ease,box-shadow .22s ease,opacity .22s ease}.app-backtop-button.el-button>span,.app-backtop-icon{display:inline-flex;align-items:center;justify-content:center}.app-backtop-icon{width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round}.app-backtop-button.el-button:not(.is-text):not(.is-link):hover{transform:translateY(-2px);box-shadow:0 14px 26px #243c964d,inset 0 1px #ffffff38}.app-backtop-button.el-button:not(.is-text):not(.is-link):active{transform:translateY(0);box-shadow:0 6px 14px #243c9638,inset 0 1px 2px #1b2f7847}
1
+ :root{--nano-font-size-sm: var(--font-size-sm, 14px);--nano-font-size-lg: var(--font-size-lg, 18px);--nano-font-weight-medium: var(--font-weight-medium, 500);--nano-radius-md: var(--radius-md, 6px);--nano-shadow-card: var(--shadow-card, 0 2px 12px rgba(0, 0, 0, .12));--nano-color-brand-primary: var(--color-brand-primary, #243c96);--nano-color-brand-primary-hover: var(--color-brand-primary-hover, #3550b3);--nano-color-brand-primary-active: var(--color-brand-primary-active, #1b2f78);--nano-color-brand-primary-light: var(--color-brand-primary-light, #eef2ff);--nano-color-text-regular: var(--color-text-regular, #606266);--nano-color-text-on-brand: var(--color-text-on-brand, #ffffff);--nano-color-border-default: var(--color-border-default, #dcdfe6);--nano-color-success: var(--color-success, #67c23a);--nano-color-success-hover: var(--color-success-hover, #85ce61);--nano-color-success-active: var(--color-success-active, #529b2e);--nano-color-warning: var(--color-warning, #e6a23c);--nano-color-warning-hover: var(--color-warning-hover, #ebb563);--nano-color-warning-active: var(--color-warning-active, #b88230);--nano-color-danger: var(--color-danger, #d35a5a);--nano-color-danger-hover: var(--color-danger-hover, #e07272);--nano-color-danger-active: var(--color-danger-active, #bc4949);--nano-color-info: var(--color-info, #909399);--nano-color-info-hover: var(--color-info-hover, #a6a9ad);--nano-color-info-active: var(--color-info-active, #73767a);--nano-color-focus-outline: var(--color-focus-outline, rgba(36, 60, 150, .32));--nano-button-default-bg: var(--button-default-bg, #ffffff);--nano-button-default-text: var(--button-default-text, var(--nano-color-text-regular));--nano-button-default-border: var(--button-default-border, var(--nano-color-border-default));--nano-button-default-hover-bg: var(--button-default-hover-bg, var(--nano-color-brand-primary-light));--nano-button-default-hover-text: var(--button-default-hover-text, var(--nano-color-brand-primary));--nano-button-default-hover-border: var(--button-default-hover-border, var(--nano-color-brand-primary-hover));--nano-button-default-active-bg: var(--button-default-active-bg, #e0e8ff);--nano-button-default-active-text: var(--button-default-active-text, var(--nano-color-brand-primary-active));--nano-button-default-active-border: var(--button-default-active-border, var(--nano-color-brand-primary-active));--nano-button-secondary-bg: var(--button-secondary-bg, var(--nano-color-brand-primary-light));--nano-button-secondary-text: var(--button-secondary-text, var(--nano-color-brand-primary));--nano-button-secondary-border: var(--button-secondary-border, rgba(36, 60, 150, .32));--nano-button-secondary-hover-bg: var(--button-secondary-hover-bg, #e0e8ff);--nano-button-secondary-hover-text: var(--button-secondary-hover-text, var(--nano-color-brand-primary-hover));--nano-button-secondary-hover-border: var(--button-secondary-hover-border, var(--nano-color-brand-primary-hover));--nano-button-secondary-active-bg: var(--button-secondary-active-bg, #d4defd);--nano-button-secondary-active-text: var(--button-secondary-active-text, var(--nano-color-brand-primary-active));--nano-button-secondary-active-border: var(--button-secondary-active-border, var(--nano-color-brand-primary-active));--nano-button-import-bg: var(--button-import-bg, #edf5f3);--nano-button-import-text: var(--button-import-text, #2f6b57);--nano-button-import-border: var(--button-import-border, rgba(47, 107, 87, .2));--nano-button-import-hover-bg: var(--button-import-hover-bg, #e0f0ec);--nano-button-import-hover-text: var(--button-import-hover-text, #285c4b);--nano-button-import-hover-border: var(--button-import-hover-border, rgba(47, 107, 87, .36));--nano-button-import-active-bg: var(--button-import-active-bg, #d3e8e2);--nano-button-import-active-text: var(--button-import-active-text, #224f40);--nano-button-import-active-border: var(--button-import-active-border, rgba(47, 107, 87, .48));--nano-button-export-bg: var(--button-export-bg, #edf5f3);--nano-button-export-text: var(--button-export-text, #2f6b57);--nano-button-export-border: var(--button-export-border, rgba(47, 107, 87, .2));--nano-button-export-hover-bg: var(--button-export-hover-bg, #e0f0ec);--nano-button-export-hover-text: var(--button-export-hover-text, #285c4b);--nano-button-export-hover-border: var(--button-export-hover-border, rgba(47, 107, 87, .36));--nano-button-export-active-bg: var(--button-export-active-bg, #d3e8e2);--nano-button-export-active-text: var(--button-export-active-text, #224f40);--nano-button-export-active-border: var(--button-export-active-border, rgba(47, 107, 87, .48));--nano-button-text-default: var(--button-text-default, var(--nano-color-text-regular));--nano-button-text-hover-bg: var(--button-text-hover-bg, var(--nano-color-brand-primary-light));--nano-button-text-hover: var(--button-text-hover, var(--nano-color-brand-primary));--nano-button-text-active: var(--button-text-active, var(--nano-color-brand-primary-active));--nano-button-hover-shadow: var(--button-hover-shadow, 0 4px 12px rgba(36, 60, 150, .16));--nano-button-default-hover-shadow: var(--button-default-hover-shadow, 0 2px 10px rgba(36, 60, 150, .12));--nano-button-danger-hover-shadow: var(--button-danger-hover-shadow, 0 4px 12px rgba(211, 90, 90, .18))}html.dark{--nano-button-import-bg: var(--button-import-bg, rgba(80, 160, 120, .16));--nano-button-import-text: var(--button-import-text, #8dd3b1);--nano-button-import-border: var(--button-import-border, rgba(80, 160, 120, .28));--nano-button-import-hover-bg: var(--button-import-hover-bg, rgba(80, 160, 120, .24));--nano-button-import-hover-text: var(--button-import-hover-text, #a6e2c4);--nano-button-import-hover-border: var(--button-import-hover-border, rgba(80, 160, 120, .42));--nano-button-import-active-bg: var(--button-import-active-bg, rgba(80, 160, 120, .32));--nano-button-import-active-text: var(--button-import-active-text, #8dd3b1);--nano-button-import-active-border: var(--button-import-active-border, rgba(80, 160, 120, .56));--nano-button-export-bg: var(--button-export-bg, rgba(80, 160, 120, .16));--nano-button-export-text: var(--button-export-text, #8dd3b1);--nano-button-export-border: var(--button-export-border, rgba(80, 160, 120, .28));--nano-button-export-hover-bg: var(--button-export-hover-bg, rgba(80, 160, 120, .24));--nano-button-export-hover-text: var(--button-export-hover-text, #a6e2c4);--nano-button-export-hover-border: var(--button-export-hover-border, rgba(80, 160, 120, .42));--nano-button-export-active-bg: var(--button-export-active-bg, rgba(80, 160, 120, .32));--nano-button-export-active-text: var(--button-export-active-text, #8dd3b1);--nano-button-export-active-border: var(--button-export-active-border, rgba(80, 160, 120, .56))}.el-button{--button-bg: var(--button-default-bg, var(--nano-button-default-bg));--button-text: var(--button-default-text, var(--nano-button-default-text));--button-border: var(--button-default-border, var(--nano-button-default-border));--button-bg-hover: var(--button-default-hover-bg, var(--nano-button-default-hover-bg));--button-text-hover: var(--button-default-hover-text, var(--nano-button-default-hover-text));--button-border-hover: var(--button-default-hover-border, var(--nano-button-default-hover-border));--button-bg-active: var(--button-default-active-bg, var(--nano-button-default-active-bg));--button-text-active: var(--button-default-active-text, var(--nano-button-default-active-text));--button-border-active: var(--button-default-active-border, var(--nano-button-default-active-border));--button-shadow-hover: var(--button-default-hover-shadow, var(--nano-button-default-hover-shadow));font-size:var(--font-size-sm, var(--nano-font-size-sm));font-weight:var(--font-weight-medium, var(--nano-font-weight-medium));border-radius:var(--radius-md, var(--nano-radius-md));transition:background-color .22s ease,border-color .22s ease,color .22s ease,box-shadow .22s ease,opacity .22s ease}.el-button:focus-visible{outline:2px solid var(--color-focus-outline, var(--nano-color-focus-outline));outline-offset:2px}.el-button.is-disabled,.el-button.is-disabled:hover,.el-button.is-disabled:active{box-shadow:none}.el-button:not(.is-text):not(.is-link){--el-button-text-color: var(--button-text);--el-button-bg-color: var(--button-bg);--el-button-border-color: var(--button-border);--el-button-hover-text-color: var(--button-text-hover);--el-button-hover-bg-color: var(--button-bg-hover);--el-button-hover-border-color: var(--button-border-hover);--el-button-active-text-color: var(--button-text-active);--el-button-active-bg-color: var(--button-bg-active);--el-button-active-border-color: var(--button-border-active);color:var(--button-text);background-color:var(--button-bg);border-color:var(--button-border)}.el-button:not(.is-text):not(.is-link):hover{background-color:var(--button-bg-hover);color:var(--button-text-hover);border-color:var(--button-border-hover);box-shadow:var(--button-shadow-hover)}.el-button:not(.is-text):not(.is-link):active{background-color:var(--button-bg-active);color:var(--button-text-active);border-color:var(--button-border-active);box-shadow:none}.el-button.app-button-secondary{--button-bg: var(--button-secondary-bg, var(--nano-button-secondary-bg));--button-text: var(--button-secondary-text, var(--nano-button-secondary-text));--button-border: var(--button-secondary-border, var(--nano-button-secondary-border));--button-bg-hover: var(--button-secondary-hover-bg, var(--nano-button-secondary-hover-bg));--button-text-hover: var(--button-secondary-hover-text, var(--nano-button-secondary-hover-text));--button-border-hover: var(--button-secondary-hover-border, var(--nano-button-secondary-hover-border));--button-bg-active: var(--button-secondary-active-bg, var(--nano-button-secondary-active-bg));--button-text-active: var(--button-secondary-active-text, var(--nano-button-secondary-active-text));--button-border-active: var(--button-secondary-active-border, var(--nano-button-secondary-active-border))}.el-button.app-button-import{--button-bg: var(--button-import-bg, var(--nano-button-import-bg));--button-text: var(--button-import-text, var(--nano-button-import-text));--button-border: var(--button-import-border, var(--nano-button-import-border));--button-bg-hover: var(--button-import-hover-bg, var(--nano-button-import-hover-bg));--button-text-hover: var(--button-import-hover-text, var(--nano-button-import-hover-text));--button-border-hover: var(--button-import-hover-border, var(--nano-button-import-hover-border));--button-bg-active: var(--button-import-active-bg, var(--nano-button-import-active-bg));--button-text-active: var(--button-import-active-text, var(--nano-button-import-active-text));--button-border-active: var(--button-import-active-border, var(--nano-button-import-active-border))}.el-button.app-button-export{--button-bg: var(--button-export-bg, var(--nano-button-export-bg));--button-text: var(--button-export-text, var(--nano-button-export-text));--button-border: var(--button-export-border, var(--nano-button-export-border));--button-bg-hover: var(--button-export-hover-bg, var(--nano-button-export-hover-bg));--button-text-hover: var(--button-export-hover-text, var(--nano-button-export-hover-text));--button-border-hover: var(--button-export-hover-border, var(--nano-button-export-hover-border));--button-bg-active: var(--button-export-active-bg, var(--nano-button-export-active-bg));--button-text-active: var(--button-export-active-text, var(--nano-button-export-active-text));--button-border-active: var(--button-export-active-border, var(--nano-button-export-active-border))}.el-button.el-button--primary,.el-button.el-button--success,.el-button.el-button--warning,.el-button.el-button--danger,.el-button.el-button--info{--button-text: var(--color-text-on-brand, var(--nano-color-text-on-brand));--button-text-hover: var(--color-text-on-brand, var(--nano-color-text-on-brand));--button-text-active: var(--color-text-on-brand, var(--nano-color-text-on-brand));--button-shadow-hover: var(--button-hover-shadow, var(--nano-button-hover-shadow));box-shadow:none}.el-button.el-button--primary{--button-bg: var(--color-brand-primary, var(--nano-color-brand-primary));--button-border: var(--color-brand-primary, var(--nano-color-brand-primary));--button-bg-hover: var(--color-brand-primary-hover, var(--nano-color-brand-primary-hover));--button-border-hover: var(--color-brand-primary-hover, var(--nano-color-brand-primary-hover));--button-bg-active: var(--color-brand-primary-active, var(--nano-color-brand-primary-active));--button-border-active: var(--color-brand-primary-active, var(--nano-color-brand-primary-active))}.el-button.el-button--success{--button-bg: var(--color-success, var(--nano-color-success));--button-border: var(--color-success, var(--nano-color-success));--button-bg-hover: var(--color-success-hover, var(--nano-color-success-hover));--button-border-hover: var(--color-success-hover, var(--nano-color-success-hover));--button-bg-active: var(--color-success-active, var(--nano-color-success-active));--button-border-active: var(--color-success-active, var(--nano-color-success-active))}.el-button.el-button--warning{--button-bg: var(--color-warning, var(--nano-color-warning));--button-border: var(--color-warning, var(--nano-color-warning));--button-bg-hover: var(--color-warning-hover, var(--nano-color-warning-hover));--button-border-hover: var(--color-warning-hover, var(--nano-color-warning-hover));--button-bg-active: var(--color-warning-active, var(--nano-color-warning-active));--button-border-active: var(--color-warning-active, var(--nano-color-warning-active))}.el-button.el-button--danger{--button-bg: var(--color-danger, var(--nano-color-danger));--button-border: var(--color-danger, var(--nano-color-danger));--button-bg-hover: var(--color-danger-hover, var(--nano-color-danger-hover));--button-border-hover: var(--color-danger-hover, var(--nano-color-danger-hover));--button-bg-active: var(--color-danger-active, var(--nano-color-danger-active));--button-border-active: var(--color-danger-active, var(--nano-color-danger-active));--button-shadow-hover: var(--button-danger-hover-shadow, var(--nano-button-danger-hover-shadow))}.el-button.el-button--info{--button-bg: var(--color-info, var(--nano-color-info));--button-border: var(--color-info, var(--nano-color-info));--button-bg-hover: var(--color-info-hover, var(--nano-color-info-hover));--button-border-hover: var(--color-info-hover, var(--nano-color-info-hover));--button-bg-active: var(--color-info-active, var(--nano-color-info-active));--button-border-active: var(--color-info-active, var(--nano-color-info-active))}.el-button.is-text,.el-button.is-link{background-color:transparent;color:var(--button-text-default, var(--nano-button-text-default));border-color:transparent;box-shadow:none}.el-button.is-text:hover{background-color:var(--button-text-hover-bg, var(--nano-button-text-hover-bg));color:var(--button-text-hover, var(--nano-button-text-hover))}.el-button.is-link:hover,.el-button.is-text:active,.el-button.is-link:active{color:var(--button-text-active, var(--nano-button-text-active))}.app-backtop.el-backtop{width:auto;height:auto;background-color:transparent;box-shadow:none}.app-backtop.el-backtop:hover{background-color:transparent}.app-backtop-button.el-button{--button-bg: var(--color-brand-primary, var(--nano-color-brand-primary));--button-text: var(--color-text-on-brand, var(--nano-color-text-on-brand));--button-border: var(--color-brand-primary, var(--nano-color-brand-primary));--button-bg-hover: var(--color-brand-primary-hover, var(--nano-color-brand-primary-hover));--button-text-hover: var(--color-text-on-brand, var(--nano-color-text-on-brand));--button-border-hover: var(--color-brand-primary-hover, var(--nano-color-brand-primary-hover));--button-bg-active: var(--color-brand-primary-active, var(--nano-color-brand-primary-active));--button-text-active: var(--color-text-on-brand, var(--nano-color-text-on-brand));--button-border-active: var(--color-brand-primary-active, var(--nano-color-brand-primary-active));width:42px;height:42px;padding:0;border-radius:12px;border-width:1px;box-shadow:0 10px 22px #243c9642,inset 0 1px #ffffff2e;transform:translateY(0);transition:transform .18s ease,background-color .22s ease,border-color .22s ease,color .22s ease,box-shadow .22s ease,opacity .22s ease}.app-backtop-button.el-button>span,.app-backtop-icon{display:inline-flex;align-items:center;justify-content:center}.app-backtop-icon{width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round}.app-backtop-button.el-button:not(.is-text):not(.is-link):hover{transform:translateY(-2px);box-shadow:0 14px 26px #243c964d,inset 0 1px #ffffff38}.app-backtop-button.el-button:not(.is-text):not(.is-link):active{transform:translateY(0);box-shadow:0 6px 14px #243c9638,inset 0 1px 2px #1b2f7847}.cst-pagination[data-v-cbbb7f80]{display:flex;width:100%}.cst-pagination--start[data-v-cbbb7f80]{justify-content:flex-start}.cst-pagination--center[data-v-cbbb7f80]{justify-content:center}.cst-pagination--end[data-v-cbbb7f80]{justify-content:flex-end}.cst-table-wrapper[data-v-18cdd107]{display:flex;width:100%;min-height:0;flex-direction:column}.cst-table[data-v-18cdd107]{width:100%;overflow:hidden;border-radius:var(--el-border-radius-base);box-shadow:var(--el-box-shadow-light)}.cst-table-pagination[data-v-18cdd107]{margin-top:var(--cst-table-pagination-gap, 16px)}
@@ -0,0 +1,64 @@
1
+ type PaginationAlign = 'start' | 'center' | 'end';
2
+ declare function __VLS_template(): {
3
+ slots: {
4
+ default?(_: {}): any;
5
+ };
6
+ refs: {};
7
+ attrs: Partial<{}>;
8
+ };
9
+ type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
10
+ declare const __VLS_component: import("vue").DefineComponent<{
11
+ currentPage?: number;
12
+ pageSize?: number;
13
+ total?: number;
14
+ pageCount?: number;
15
+ pageSizes?: number[];
16
+ layout?: string;
17
+ background?: boolean;
18
+ disabled?: boolean;
19
+ hideOnSinglePage?: boolean;
20
+ align?: PaginationAlign;
21
+ }, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
22
+ "update:currentPage": (value: number) => any;
23
+ "update:pageSize": (value: number) => any;
24
+ currentChange: (value: number) => any;
25
+ sizeChange: (value: number) => any;
26
+ prevClick: (value: number) => any;
27
+ nextClick: (value: number) => any;
28
+ }, string, import("vue").PublicProps, Readonly<{
29
+ currentPage?: number;
30
+ pageSize?: number;
31
+ total?: number;
32
+ pageCount?: number;
33
+ pageSizes?: number[];
34
+ layout?: string;
35
+ background?: boolean;
36
+ disabled?: boolean;
37
+ hideOnSinglePage?: boolean;
38
+ align?: PaginationAlign;
39
+ }> & Readonly<{
40
+ "onUpdate:currentPage"?: ((value: number) => any) | undefined;
41
+ "onUpdate:pageSize"?: ((value: number) => any) | undefined;
42
+ onCurrentChange?: ((value: number) => any) | undefined;
43
+ onSizeChange?: ((value: number) => any) | undefined;
44
+ onPrevClick?: ((value: number) => any) | undefined;
45
+ onNextClick?: ((value: number) => any) | undefined;
46
+ }>, {
47
+ disabled: boolean;
48
+ currentPage: number;
49
+ pageSize: number;
50
+ total: number;
51
+ pageCount: number;
52
+ pageSizes: number[];
53
+ layout: string;
54
+ background: boolean;
55
+ hideOnSinglePage: boolean;
56
+ align: PaginationAlign;
57
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
58
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
59
+ export default _default;
60
+ type __VLS_WithTemplateSlots<T, S> = T & {
61
+ new (): {
62
+ $slots: S;
63
+ };
64
+ };
@@ -0,0 +1,47 @@
1
+ type PaginationAlign = 'start' | 'center' | 'end';
2
+ declare function __VLS_template(): {
3
+ slots: {
4
+ default?(_: {}): any;
5
+ };
6
+ refs: {};
7
+ attrs: Partial<{}>;
8
+ };
9
+ type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
10
+ declare const __VLS_component: import("vue").DefineComponent<{
11
+ data?: unknown[];
12
+ pagination?: boolean;
13
+ defaultPageSize?: number;
14
+ pageSizes?: number[];
15
+ paginationLayout?: string;
16
+ paginationBackground?: boolean;
17
+ paginationAlign?: PaginationAlign;
18
+ }, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
19
+ currentPageChange: (value: number) => any;
20
+ pageSizeChange: (value: number) => any;
21
+ }, string, import("vue").PublicProps, Readonly<{
22
+ data?: unknown[];
23
+ pagination?: boolean;
24
+ defaultPageSize?: number;
25
+ pageSizes?: number[];
26
+ paginationLayout?: string;
27
+ paginationBackground?: boolean;
28
+ paginationAlign?: PaginationAlign;
29
+ }> & Readonly<{
30
+ onCurrentPageChange?: ((value: number) => any) | undefined;
31
+ onPageSizeChange?: ((value: number) => any) | undefined;
32
+ }>, {
33
+ data: unknown[];
34
+ pageSizes: number[];
35
+ defaultPageSize: number;
36
+ pagination: boolean;
37
+ paginationLayout: string;
38
+ paginationBackground: boolean;
39
+ paginationAlign: PaginationAlign;
40
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
41
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
42
+ export default _default;
43
+ type __VLS_WithTemplateSlots<T, S> = T & {
44
+ new (): {
45
+ $slots: S;
46
+ };
47
+ };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue"),b=e.defineComponent({name:"CstPagination",inheritAttrs:!1,__name:"CstPagination",props:{currentPage:{default:1},pageSize:{default:10},total:{default:void 0},pageCount:{default:void 0},pageSizes:{default:()=>[10,20,50,100]},layout:{default:"total, sizes, prev, pager, next, jumper"},background:{type:Boolean,default:!0},disabled:{type:Boolean,default:!1},hideOnSinglePage:{type:Boolean,default:!1},align:{default:"end"}},emits:["update:currentPage","update:pageSize","currentChange","sizeChange","prevClick","nextClick"],setup(t,{emit:i}){const o=i;return(u,n)=>{const s=e.resolveComponent("el-pagination");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["cst-pagination",`cst-pagination--${t.align}`])},[e.createVNode(s,e.mergeProps(u.$attrs,{"current-page":t.currentPage,"page-size":t.pageSize,"page-sizes":t.pageSizes,layout:t.layout,background:t.background,disabled:t.disabled,"hide-on-single-page":t.hideOnSinglePage,total:t.pageCount===void 0?t.total??0:void 0,"page-count":t.pageCount,"onUpdate:currentPage":n[0]||(n[0]=a=>o("update:currentPage",a)),"onUpdate:pageSize":n[1]||(n[1]=a=>o("update:pageSize",a)),onCurrentChange:n[2]||(n[2]=a=>o("currentChange",a)),onSizeChange:n[3]||(n[3]=a=>o("sizeChange",a)),onPrevClick:n[4]||(n[4]=a=>o("prevClick",a)),onNextClick:n[5]||(n[5]=a=>o("nextClick",a))}),{default:e.withCtx(()=>[e.renderSlot(u.$slots,"default",{},void 0,!0)]),_:3},16,["current-page","page-size","page-sizes","layout","background","disabled","hide-on-single-page","total","page-count"])],2)}}}),c=(t,i)=>{const o=t.__vccOpts||t;for(const[u,n]of i)o[u]=n;return o},g=c(b,[["__scopeId","data-v-cbbb7f80"]]),P={class:"cst-table-wrapper"},S={key:0,class:"cst-table-pagination"},k=e.defineComponent({name:"CstTable",inheritAttrs:!1,__name:"CstTable",props:{data:{default:()=>[]},pagination:{type:Boolean,default:!0},defaultPageSize:{default:20},pageSizes:{default:()=>[10,20,50,100]},paginationLayout:{default:"total, sizes, prev, pager, next, jumper"},paginationBackground:{type:Boolean,default:!0},paginationAlign:{default:"end"}},emits:["currentPageChange","pageSizeChange"],setup(t,{emit:i}){const o=t,u=i,n=e.useAttrs(),s=e.ref(1),a=e.ref(o.defaultPageSize),C=e.computed(()=>{if(!o.pagination)return o.data;const l=(s.value-1)*a.value;return o.data.slice(l,l+a.value)}),m=e.computed(()=>({border:!0,stripe:!0,fit:!0,tableLayout:"auto",...n})),d=l=>{s.value=l,u("currentPageChange",l)},v=l=>{a.value=l,s.value=1,u("pageSizeChange",l),u("currentPageChange",1)};return e.watch(()=>o.data.length,l=>{const r=Math.max(1,Math.ceil(l/a.value));s.value>r&&d(r)}),(l,r)=>{const z=e.resolveComponent("el-table");return e.openBlock(),e.createElementBlock("div",P,[e.createVNode(z,e.mergeProps(m.value,{data:C.value,class:"cst-table"}),{default:e.withCtx(()=>[e.renderSlot(l.$slots,"default",{},void 0,!0)]),_:3},16,["data"]),t.pagination?(e.openBlock(),e.createElementBlock("div",S,[e.createVNode(g,{"current-page":s.value,"page-size":a.value,total:t.data.length,"page-sizes":t.pageSizes,layout:t.paginationLayout,background:t.paginationBackground,align:t.paginationAlign,"onUpdate:currentPage":d,"onUpdate:pageSize":v},null,8,["current-page","page-size","total","page-sizes","layout","background","align"])])):e.createCommentVNode("",!0)])}}}),p=c(k,[["__scopeId","data-v-18cdd107"]]),y=[p,g],f=t=>{y.forEach(i=>{t.component(i.name||"AnonymousComponent",i)})},h={install:f};exports.CstPagination=g;exports.CstTable=p;exports.default=h;exports.install=f;
@@ -0,0 +1,7 @@
1
+ import type { App, Plugin } from 'vue';
2
+ import CstPagination from './CstPagination.vue';
3
+ import CstTable from './CstTable.vue';
4
+ declare const install: (app: App) => void;
5
+ declare const CstTableComponents: Plugin;
6
+ export { CstPagination, CstTable, install, };
7
+ export default CstTableComponents;
@@ -0,0 +1,136 @@
1
+ import { defineComponent as C, resolveComponent as m, openBlock as s, createElementBlock as r, normalizeClass as x, createVNode as d, mergeProps as z, withCtx as v, renderSlot as b, useAttrs as A, ref as p, computed as f, watch as $, createCommentVNode as T } from "vue";
2
+ const U = /* @__PURE__ */ C({
3
+ name: "CstPagination",
4
+ inheritAttrs: !1,
5
+ __name: "CstPagination",
6
+ props: {
7
+ currentPage: { default: 1 },
8
+ pageSize: { default: 10 },
9
+ total: { default: void 0 },
10
+ pageCount: { default: void 0 },
11
+ pageSizes: { default: () => [10, 20, 50, 100] },
12
+ layout: { default: "total, sizes, prev, pager, next, jumper" },
13
+ background: { type: Boolean, default: !0 },
14
+ disabled: { type: Boolean, default: !1 },
15
+ hideOnSinglePage: { type: Boolean, default: !1 },
16
+ align: { default: "end" }
17
+ },
18
+ emits: ["update:currentPage", "update:pageSize", "currentChange", "sizeChange", "prevClick", "nextClick"],
19
+ setup(e, { emit: i }) {
20
+ const n = i;
21
+ return (l, a) => {
22
+ const u = m("el-pagination");
23
+ return s(), r("div", {
24
+ class: x(["cst-pagination", `cst-pagination--${e.align}`])
25
+ }, [
26
+ d(u, z(l.$attrs, {
27
+ "current-page": e.currentPage,
28
+ "page-size": e.pageSize,
29
+ "page-sizes": e.pageSizes,
30
+ layout: e.layout,
31
+ background: e.background,
32
+ disabled: e.disabled,
33
+ "hide-on-single-page": e.hideOnSinglePage,
34
+ total: e.pageCount === void 0 ? e.total ?? 0 : void 0,
35
+ "page-count": e.pageCount,
36
+ "onUpdate:currentPage": a[0] || (a[0] = (t) => n("update:currentPage", t)),
37
+ "onUpdate:pageSize": a[1] || (a[1] = (t) => n("update:pageSize", t)),
38
+ onCurrentChange: a[2] || (a[2] = (t) => n("currentChange", t)),
39
+ onSizeChange: a[3] || (a[3] = (t) => n("sizeChange", t)),
40
+ onPrevClick: a[4] || (a[4] = (t) => n("prevClick", t)),
41
+ onNextClick: a[5] || (a[5] = (t) => n("nextClick", t))
42
+ }), {
43
+ default: v(() => [
44
+ b(l.$slots, "default", {}, void 0, !0)
45
+ ]),
46
+ _: 3
47
+ }, 16, ["current-page", "page-size", "page-sizes", "layout", "background", "disabled", "hide-on-single-page", "total", "page-count"])
48
+ ], 2);
49
+ };
50
+ }
51
+ }), P = (e, i) => {
52
+ const n = e.__vccOpts || e;
53
+ for (const [l, a] of i)
54
+ n[l] = a;
55
+ return n;
56
+ }, S = /* @__PURE__ */ P(U, [["__scopeId", "data-v-cbbb7f80"]]), w = { class: "cst-table-wrapper" }, L = {
57
+ key: 0,
58
+ class: "cst-table-pagination"
59
+ }, N = /* @__PURE__ */ C({
60
+ name: "CstTable",
61
+ inheritAttrs: !1,
62
+ __name: "CstTable",
63
+ props: {
64
+ data: { default: () => [] },
65
+ pagination: { type: Boolean, default: !0 },
66
+ defaultPageSize: { default: 20 },
67
+ pageSizes: { default: () => [10, 20, 50, 100] },
68
+ paginationLayout: { default: "total, sizes, prev, pager, next, jumper" },
69
+ paginationBackground: { type: Boolean, default: !0 },
70
+ paginationAlign: { default: "end" }
71
+ },
72
+ emits: ["currentPageChange", "pageSizeChange"],
73
+ setup(e, { emit: i }) {
74
+ const n = e, l = i, a = A(), u = p(1), t = p(n.defaultPageSize), k = f(() => {
75
+ if (!n.pagination)
76
+ return n.data;
77
+ const o = (u.value - 1) * t.value;
78
+ return n.data.slice(o, o + t.value);
79
+ }), y = f(() => ({
80
+ border: !0,
81
+ stripe: !0,
82
+ fit: !0,
83
+ tableLayout: "auto",
84
+ ...a
85
+ })), c = (o) => {
86
+ u.value = o, l("currentPageChange", o);
87
+ }, h = (o) => {
88
+ t.value = o, u.value = 1, l("pageSizeChange", o), l("currentPageChange", 1);
89
+ };
90
+ return $(
91
+ () => n.data.length,
92
+ (o) => {
93
+ const g = Math.max(1, Math.ceil(o / t.value));
94
+ u.value > g && c(g);
95
+ }
96
+ ), (o, g) => {
97
+ const B = m("el-table");
98
+ return s(), r("div", w, [
99
+ d(B, z(y.value, {
100
+ data: k.value,
101
+ class: "cst-table"
102
+ }), {
103
+ default: v(() => [
104
+ b(o.$slots, "default", {}, void 0, !0)
105
+ ]),
106
+ _: 3
107
+ }, 16, ["data"]),
108
+ e.pagination ? (s(), r("div", L, [
109
+ d(S, {
110
+ "current-page": u.value,
111
+ "page-size": t.value,
112
+ total: e.data.length,
113
+ "page-sizes": e.pageSizes,
114
+ layout: e.paginationLayout,
115
+ background: e.paginationBackground,
116
+ align: e.paginationAlign,
117
+ "onUpdate:currentPage": c,
118
+ "onUpdate:pageSize": h
119
+ }, null, 8, ["current-page", "page-size", "total", "page-sizes", "layout", "background", "align"])
120
+ ])) : T("", !0)
121
+ ]);
122
+ };
123
+ }
124
+ }), O = /* @__PURE__ */ P(N, [["__scopeId", "data-v-18cdd107"]]), j = [O, S], E = (e) => {
125
+ j.forEach((i) => {
126
+ e.component(i.name || "AnonymousComponent", i);
127
+ });
128
+ }, M = {
129
+ install: E
130
+ };
131
+ export {
132
+ S as CstPagination,
133
+ O as CstTable,
134
+ M as default,
135
+ E as install
136
+ };
package/package.json CHANGED
@@ -1,66 +1,74 @@
1
- {
2
- "name": "@cst-ui/nano-buttons",
3
- "version": "0.2.3",
4
- "description": "Nano themed Vue 3 button components and dialog tab helpers based on Element Plus.",
5
- "license": "UNLICENSED",
6
- "type": "module",
7
- "main": "./dist/index.cjs",
8
- "module": "./dist/index.mjs",
9
- "types": "./dist/index.d.ts",
10
- "typesVersions": {
11
- "*": {
12
- "dialog-tabs": [
13
- "dist/dialog-tabs/index.d.ts"
14
- ],
15
- "buttons": [
16
- "dist/buttons/index.d.ts"
17
- ]
18
- }
19
- },
20
- "files": [
21
- "dist",
22
- "README.md"
23
- ],
24
- "sideEffects": [
25
- "*.css"
26
- ],
27
- "exports": {
28
- ".": {
29
- "types": "./dist/index.d.ts",
30
- "import": "./dist/index.mjs",
31
- "require": "./dist/index.cjs"
32
- },
33
- "./buttons": {
34
- "types": "./dist/buttons/index.d.ts",
35
- "import": "./dist/buttons/index.mjs",
36
- "require": "./dist/buttons/index.cjs"
37
- },
38
- "./dialog-tabs": {
39
- "types": "./dist/dialog-tabs/index.d.ts",
40
- "import": "./dist/dialog-tabs/index.mjs",
41
- "require": "./dist/dialog-tabs/index.cjs"
42
- },
43
- "./style.css": "./dist/style.css"
44
- },
45
- "scripts": {
46
- "build": "vite build && vue-tsc -p tsconfig.build.json --declaration --emitDeclarationOnly",
47
- "docs:dev": "vite --config docs/vite.config.ts --host 0.0.0.0",
48
- "docs:build": "vite build --config docs/vite.config.ts",
49
- "docs:preview": "vite preview --config docs/vite.config.ts --host 0.0.0.0",
50
- "typecheck": "vue-tsc -p tsconfig.build.json --noEmit"
51
- },
52
- "peerDependencies": {
53
- "element-plus": "^2.8.5",
54
- "vue": "^3.5.13",
55
- "vue-router": "^4.4.5"
56
- },
57
- "devDependencies": {
58
- "@element-plus/icons-vue": "2.3.2",
59
- "@types/node": "^18.11.3",
60
- "@vitejs/plugin-vue": "^5.1.4",
61
- "typescript": "^5.6.3",
62
- "vite": "^5.4.9",
63
- "vue-router": "^4.4.5",
64
- "vue-tsc": "2.1.6"
65
- }
66
- }
1
+ {
2
+ "name": "@cst-ui/nano-buttons",
3
+ "version": "0.3.1",
4
+ "description": "Nano themed Vue 3 button, table, pagination, and dialog tab components based on Element Plus.",
5
+ "license": "UNLICENSED",
6
+ "type": "module",
7
+ "main": "./dist/index.cjs",
8
+ "module": "./dist/index.mjs",
9
+ "types": "./dist/index.d.ts",
10
+ "typesVersions": {
11
+ "*": {
12
+ "dialog-tabs": [
13
+ "dist/dialog-tabs/index.d.ts"
14
+ ],
15
+ "buttons": [
16
+ "dist/buttons/index.d.ts"
17
+ ],
18
+ "table": [
19
+ "dist/table/index.d.ts"
20
+ ]
21
+ }
22
+ },
23
+ "files": [
24
+ "dist",
25
+ "README.md"
26
+ ],
27
+ "sideEffects": [
28
+ "*.css"
29
+ ],
30
+ "exports": {
31
+ ".": {
32
+ "types": "./dist/index.d.ts",
33
+ "import": "./dist/index.mjs",
34
+ "require": "./dist/index.cjs"
35
+ },
36
+ "./buttons": {
37
+ "types": "./dist/buttons/index.d.ts",
38
+ "import": "./dist/buttons/index.mjs",
39
+ "require": "./dist/buttons/index.cjs"
40
+ },
41
+ "./dialog-tabs": {
42
+ "types": "./dist/dialog-tabs/index.d.ts",
43
+ "import": "./dist/dialog-tabs/index.mjs",
44
+ "require": "./dist/dialog-tabs/index.cjs"
45
+ },
46
+ "./table": {
47
+ "types": "./dist/table/index.d.ts",
48
+ "import": "./dist/table/index.mjs",
49
+ "require": "./dist/table/index.cjs"
50
+ },
51
+ "./style.css": "./dist/style.css"
52
+ },
53
+ "scripts": {
54
+ "build": "vite build && vue-tsc -p tsconfig.build.json --declaration --emitDeclarationOnly",
55
+ "docs:dev": "vite --config docs/vite.config.ts --host 0.0.0.0",
56
+ "docs:build": "vite build --config docs/vite.config.ts",
57
+ "docs:preview": "vite preview --config docs/vite.config.ts --host 0.0.0.0",
58
+ "typecheck": "vue-tsc -p tsconfig.build.json --noEmit"
59
+ },
60
+ "peerDependencies": {
61
+ "element-plus": "^2.8.5",
62
+ "vue": "^3.5.13",
63
+ "vue-router": "^4.4.5"
64
+ },
65
+ "devDependencies": {
66
+ "@element-plus/icons-vue": "2.3.2",
67
+ "@types/node": "^18.11.3",
68
+ "@vitejs/plugin-vue": "^5.1.4",
69
+ "typescript": "^5.6.3",
70
+ "vite": "^5.4.9",
71
+ "vue-router": "^4.4.5",
72
+ "vue-tsc": "2.1.6"
73
+ }
74
+ }