w-web-perm 1.1.11 → 1.1.13
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 +158 -117
- package/dist/css/app.f09c7433.css +1 -0
- package/dist/index.tmp +1 -1
- package/dist/js/app-legacy.8af87052.js +1 -0
- package/dist/js/app.8af87052.js +1 -0
- package/dist/js/{chunk-vendors.3e9e3ef1.js → chunk-vendors-legacy.ece5a361.js} +1 -1
- package/dist/js/{chunk-vendors-legacy.3e9e3ef1.js → chunk-vendors.ece5a361.js} +1 -1
- package/dist/w-web-perm.umd.js +2 -2
- package/dist/w-web-perm.umd.js.map +1 -1
- package/docs/WWebPerm.html +84 -4
- package/docs/global.html +24747 -832
- package/docs/index.html +2 -2
- package/docs/server_WWebPerm.mjs.html +245 -32
- package/docs/server_cascadeWrite.mjs.html +225 -0
- package/docs/server_dataChannel.mjs.html +2 -2
- package/docs/server_keyCheck.mjs.html +353 -0
- package/docs/server_lockSave.mjs.html +2 -2
- package/docs/server_maskLog.mjs.html +2 -2
- package/docs/server_procCore.mjs.html +180 -41
- package/docs/server_staLogs_resolveShellWorker.mjs.html +2 -2
- package/docs/server_syncKeep.mjs.html +311 -0
- package/docs/server_tools_authRefsAudit.mjs.html +247 -0
- package/docs/server_tools_authRefsClean.mjs.html +335 -0
- package/docs/server_tools_fromTools.mjs.html +797 -0
- package/docs/server_tools_isMain.mjs.html +103 -0
- package/docs/server_tools_nameDupReport.mjs.html +280 -0
- package/docs/server_validateRows.mjs.html +15 -4
- package/docs/server_wrapInjected.mjs.html +3 -3
- package/docs/src_fetchJson.mjs.html +2 -2
- package/docs/src_js_cvKpToArr.mjs.html +125 -0
- package/docs/src_js_cvKpToObj.mjs.html +210 -0
- package/docs/src_js_draftSync.mjs.html +142 -0
- package/docs/src_js_eachOwn.mjs.html +3 -3
- package/docs/src_js_editorRefRows.mjs.html +356 -0
- package/docs/src_js_externalRows.mjs.html +338 -0
- package/docs/src_js_externalUi.mjs.html +230 -0
- package/docs/src_js_findRefRows.mjs.html +107 -0
- package/docs/src_js_findTouchedDup.mjs.html +150 -0
- package/docs/src_js_fmtLossyMsg.mjs.html +95 -0
- package/docs/src_js_fromAudit.mjs.html +489 -0
- package/docs/src_js_getAddImpact.mjs.html +269 -0
- package/docs/src_js_getAuthWarn.mjs.html +463 -0
- package/docs/src_js_getCascadePreview.mjs.html +258 -0
- package/docs/src_js_getDelRefCount.mjs.html +210 -0
- package/docs/src_js_getEffMode.mjs.html +92 -0
- package/docs/src_js_getKpLossy.mjs.html +155 -0
- package/docs/src_js_getNameErrs.mjs.html +266 -0
- package/docs/src_js_getOwn.mjs.html +3 -3
- package/docs/src_js_getPropKey.mjs.html +109 -0
- package/docs/src_js_getRuleEnable.mjs.html +2 -2
- package/docs/src_js_isAuthMode.mjs.html +92 -0
- package/docs/src_js_joinNames.mjs.html +96 -0
- package/docs/src_js_legendFit.mjs.html +2 -2
- package/docs/src_js_pairRowsToSnapshot.mjs.html +156 -0
- package/docs/src_js_refAudit.mjs.html +359 -0
- package/docs/src_js_refCascade.mjs.html +572 -0
- package/docs/src_js_relDialogSend.mjs.html +199 -0
- package/docs/src_js_rowDigest.mjs.html +265 -0
- package/docs/src_plugins_dataReloadGuard.mjs.html +109 -0
- package/docs/src_plugins_reuseDeletedIds.mjs.html +2 -2
- package/docs/src_plugins_submitGuard.mjs.html +2 -2
- package/g_authRefsClean.mjs +79 -0
- package/g_fixFromType.mjs +92 -0
- package/g_initialData.mjs +3 -3
- package/g_purgeFrom.mjs +127 -0
- package/package.json +1 -1
- package/server/WWebPerm.mjs +243 -30
- package/server/cascadeWrite.mjs +153 -0
- package/server/keyCheck.mjs +281 -0
- package/server/procCore.mjs +178 -39
- package/server/procLang.mjs +271 -0
- package/server/syncKeep.mjs +239 -0
- package/server/tools/authRefsAudit.mjs +175 -0
- package/server/tools/authRefsClean.mjs +263 -0
- package/server/tools/fromTools.mjs +725 -0
- package/server/tools/isMain.mjs +31 -0
- package/server/tools/nameDupReport.mjs +208 -0
- package/server/validateRows.mjs +13 -2
- package/server/wrapInjected.mjs +1 -1
- package/src/components/LayoutContentGrups.vue +399 -77
- package/src/components/LayoutContentPemis.vue +400 -78
- package/src/components/LayoutContentTargets.vue +261 -25
- package/src/components/LayoutContentUsers.vue +336 -98
- package/src/components/VeCgrups.vue +119 -115
- package/src/components/VeCpemis.vue +117 -115
- package/src/components/VeCrules.vue +18 -2
- package/src/components/VeGrupBlngUsers.vue +240 -73
- package/src/components/VePemiBlngGrups.vue +247 -83
- package/src/js/cvKpToArr.mjs +53 -0
- package/src/js/cvKpToObj.mjs +138 -0
- package/src/js/draftSync.mjs +70 -0
- package/src/js/eachOwn.mjs +1 -1
- package/src/js/editorRefRows.mjs +284 -0
- package/src/js/externalRows.mjs +266 -0
- package/src/js/externalUi.mjs +158 -0
- package/src/js/findRefRows.mjs +35 -0
- package/src/js/findTouchedDup.mjs +78 -0
- package/src/js/fmtLossyMsg.mjs +23 -0
- package/src/js/fromAudit.mjs +417 -0
- package/src/js/getAddImpact.mjs +197 -0
- package/src/js/getAuthWarn.mjs +391 -0
- package/src/js/getCascadePreview.mjs +186 -0
- package/src/js/getDelRefCount.mjs +138 -0
- package/src/js/getEffMode.mjs +20 -0
- package/src/js/getKpLossy.mjs +83 -0
- package/src/js/getNameErrs.mjs +194 -0
- package/src/js/getOwn.mjs +1 -1
- package/src/js/getPropKey.mjs +37 -0
- package/src/js/isAuthMode.mjs +20 -0
- package/src/js/joinNames.mjs +24 -0
- package/src/js/pairRowsToSnapshot.mjs +84 -0
- package/src/js/refAudit.mjs +287 -0
- package/src/js/refCascade.mjs +500 -0
- package/src/js/relDialogSend.mjs +127 -0
- package/src/js/rowDigest.mjs +193 -0
- package/src/plugins/dataReloadGuard.mjs +37 -0
- package/src/plugins/mShare.mjs +147 -174
- package/src/plugins/mUI.mjs +3 -8
- package/src/schema/tables/users.mjs +152 -152
- package/dist/css/app.6918ec45.css +0 -1
- package/dist/js/app-legacy.963e800c.js +0 -1
- package/dist/js/app.963e800c.js +0 -1
|
@@ -1,152 +1,152 @@
|
|
|
1
|
-
import map from 'lodash-es/map.js'
|
|
2
|
-
import keys from 'lodash-es/keys.js'
|
|
3
|
-
import genIDSeq from 'wsemi/src/genIDSeq.mjs'
|
|
4
|
-
import dtmapping from 'wsemi/src/dtmapping.mjs'
|
|
5
|
-
import dtpick from 'wsemi/src/dtpick.mjs'
|
|
6
|
-
import nowms2str from 'wsemi/src/nowms2str.mjs'
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
let keyTable = 'users'
|
|
10
|
-
let tableNameCht = '使用者'
|
|
11
|
-
let tableNameEng = 'Users'
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
let settings = {
|
|
15
|
-
id: {
|
|
16
|
-
pk: true,
|
|
17
|
-
name: '主鍵',
|
|
18
|
-
type: 'STRING',
|
|
19
|
-
},
|
|
20
|
-
order: {
|
|
21
|
-
name: '順序',
|
|
22
|
-
type: 'INTEGER',
|
|
23
|
-
},
|
|
24
|
-
name: {
|
|
25
|
-
name: '姓名',
|
|
26
|
-
type: 'STRING',
|
|
27
|
-
},
|
|
28
|
-
email: {
|
|
29
|
-
name: '電子郵件',
|
|
30
|
-
type: 'STRING',
|
|
31
|
-
},
|
|
32
|
-
description: {
|
|
33
|
-
name: '描述',
|
|
34
|
-
type: 'TEXT',
|
|
35
|
-
},
|
|
36
|
-
from: {
|
|
37
|
-
name: '來源', //標注使用者來源, 亦供外部批次變更使用
|
|
38
|
-
type: 'STRING',
|
|
39
|
-
},
|
|
40
|
-
cgrups: {
|
|
41
|
-
name: '權限群組清單', //為json字串
|
|
42
|
-
type: 'TEXT',
|
|
43
|
-
},
|
|
44
|
-
isAdmin: {
|
|
45
|
-
name: '是否為系統管理員',
|
|
46
|
-
type: 'STRING',
|
|
47
|
-
},
|
|
48
|
-
userId: {
|
|
49
|
-
name: '創建使用者主鍵',
|
|
50
|
-
type: 'STRING',
|
|
51
|
-
},
|
|
52
|
-
timeCreate: {
|
|
53
|
-
name: '創建時間',
|
|
54
|
-
type: 'STRING',
|
|
55
|
-
},
|
|
56
|
-
userIdUpdate: {
|
|
57
|
-
name: '最新變更使用者主鍵',
|
|
58
|
-
type: 'STRING',
|
|
59
|
-
},
|
|
60
|
-
timeUpdate: {
|
|
61
|
-
name: '更新時間',
|
|
62
|
-
type: 'STRING',
|
|
63
|
-
},
|
|
64
|
-
isActive: {
|
|
65
|
-
name: '是否有效',
|
|
66
|
-
type: 'STRING',
|
|
67
|
-
},
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
let funNew = (ndata = {}) => {
|
|
71
|
-
let o = dtmapping(ndata, keys(settings))
|
|
72
|
-
o.id = `${genIDSeq()}`
|
|
73
|
-
o.isAdmin = 'n'
|
|
74
|
-
o.userIdUpdate = o.userId
|
|
75
|
-
o.timeCreate = nowms2str()
|
|
76
|
-
o.userIdUpdate = o.userId
|
|
77
|
-
o.timeUpdate = o.timeCreate
|
|
78
|
-
o.isActive = 'y'
|
|
79
|
-
return o
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
let funTest = () => {
|
|
83
|
-
let rs = [
|
|
84
|
-
|
|
85
|
-
['peter', '
|
|
86
|
-
{
|
|
87
|
-
'權限群組M1': {
|
|
88
|
-
'mode': 'OR',
|
|
89
|
-
'isActive': 'y',
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
`, 'n'],
|
|
93
|
-
['mary', '
|
|
94
|
-
{
|
|
95
|
-
'權限群組M2': {
|
|
96
|
-
'mode': 'OR',
|
|
97
|
-
'isActive': 'y',
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
`, 'n'],
|
|
101
|
-
['john', '
|
|
102
|
-
{
|
|
103
|
-
'權限群組M3': {
|
|
104
|
-
'mode': 'OR',
|
|
105
|
-
'isActive': 'y',
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
`, 'n'],
|
|
109
|
-
['admin', '', `
|
|
110
|
-
{
|
|
111
|
-
'權限群組M4': {
|
|
112
|
-
'mode': 'OR',
|
|
113
|
-
'isActive': 'y',
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
`, 'y'],
|
|
117
|
-
|
|
118
|
-
]
|
|
119
|
-
rs = map(rs, ([name, from, cgrups, isAdmin], k) => {
|
|
120
|
-
let v = funNew({
|
|
121
|
-
userId: 'id-for-admin',
|
|
122
|
-
order: k,
|
|
123
|
-
name,
|
|
124
|
-
email: `${name}@example.com`,
|
|
125
|
-
from,
|
|
126
|
-
cgrups,
|
|
127
|
-
isAdmin,
|
|
128
|
-
})
|
|
129
|
-
v.id = `id-for-${name}`
|
|
130
|
-
// if (name === 'john') {
|
|
131
|
-
// v.email = `${v.email};john@test.com`
|
|
132
|
-
// }
|
|
133
|
-
v.isAdmin = isAdmin
|
|
134
|
-
v = dtpick(v, keys(settings))
|
|
135
|
-
return v
|
|
136
|
-
})
|
|
137
|
-
console.log(`已產生: ${keyTable} 測試資料`, rs)
|
|
138
|
-
return rs
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
let tab = {
|
|
142
|
-
keyTable,
|
|
143
|
-
tableNameCht,
|
|
144
|
-
tableNameEng,
|
|
145
|
-
settings,
|
|
146
|
-
funNew,
|
|
147
|
-
funTest,
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
export default tab
|
|
152
|
-
|
|
1
|
+
import map from 'lodash-es/map.js'
|
|
2
|
+
import keys from 'lodash-es/keys.js'
|
|
3
|
+
import genIDSeq from 'wsemi/src/genIDSeq.mjs'
|
|
4
|
+
import dtmapping from 'wsemi/src/dtmapping.mjs'
|
|
5
|
+
import dtpick from 'wsemi/src/dtpick.mjs'
|
|
6
|
+
import nowms2str from 'wsemi/src/nowms2str.mjs'
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
let keyTable = 'users'
|
|
10
|
+
let tableNameCht = '使用者'
|
|
11
|
+
let tableNameEng = 'Users'
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
let settings = {
|
|
15
|
+
id: {
|
|
16
|
+
pk: true,
|
|
17
|
+
name: '主鍵',
|
|
18
|
+
type: 'STRING',
|
|
19
|
+
},
|
|
20
|
+
order: {
|
|
21
|
+
name: '順序',
|
|
22
|
+
type: 'INTEGER',
|
|
23
|
+
},
|
|
24
|
+
name: {
|
|
25
|
+
name: '姓名',
|
|
26
|
+
type: 'STRING',
|
|
27
|
+
},
|
|
28
|
+
email: {
|
|
29
|
+
name: '電子郵件',
|
|
30
|
+
type: 'STRING',
|
|
31
|
+
},
|
|
32
|
+
description: {
|
|
33
|
+
name: '描述',
|
|
34
|
+
type: 'TEXT',
|
|
35
|
+
},
|
|
36
|
+
from: {
|
|
37
|
+
name: '來源', //標注使用者來源, 亦供外部批次變更使用
|
|
38
|
+
type: 'STRING',
|
|
39
|
+
},
|
|
40
|
+
cgrups: {
|
|
41
|
+
name: '權限群組清單', //為json字串
|
|
42
|
+
type: 'TEXT',
|
|
43
|
+
},
|
|
44
|
+
isAdmin: {
|
|
45
|
+
name: '是否為系統管理員',
|
|
46
|
+
type: 'STRING',
|
|
47
|
+
},
|
|
48
|
+
userId: {
|
|
49
|
+
name: '創建使用者主鍵',
|
|
50
|
+
type: 'STRING',
|
|
51
|
+
},
|
|
52
|
+
timeCreate: {
|
|
53
|
+
name: '創建時間',
|
|
54
|
+
type: 'STRING',
|
|
55
|
+
},
|
|
56
|
+
userIdUpdate: {
|
|
57
|
+
name: '最新變更使用者主鍵',
|
|
58
|
+
type: 'STRING',
|
|
59
|
+
},
|
|
60
|
+
timeUpdate: {
|
|
61
|
+
name: '更新時間',
|
|
62
|
+
type: 'STRING',
|
|
63
|
+
},
|
|
64
|
+
isActive: {
|
|
65
|
+
name: '是否有效',
|
|
66
|
+
type: 'STRING',
|
|
67
|
+
},
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
let funNew = (ndata = {}) => {
|
|
71
|
+
let o = dtmapping(ndata, keys(settings))
|
|
72
|
+
o.id = `${genIDSeq()}`
|
|
73
|
+
o.isAdmin = 'n'
|
|
74
|
+
o.userIdUpdate = o.userId
|
|
75
|
+
o.timeCreate = nowms2str()
|
|
76
|
+
o.userIdUpdate = o.userId
|
|
77
|
+
o.timeUpdate = o.timeCreate
|
|
78
|
+
o.isActive = 'y'
|
|
79
|
+
return o
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
let funTest = () => {
|
|
83
|
+
let rs = [
|
|
84
|
+
|
|
85
|
+
['peter', '', `
|
|
86
|
+
{
|
|
87
|
+
'權限群組M1': {
|
|
88
|
+
'mode': 'OR',
|
|
89
|
+
'isActive': 'y',
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
`, 'n'],
|
|
93
|
+
['mary', '', `
|
|
94
|
+
{
|
|
95
|
+
'權限群組M2': {
|
|
96
|
+
'mode': 'OR',
|
|
97
|
+
'isActive': 'y',
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
`, 'n'],
|
|
101
|
+
['john', '', `
|
|
102
|
+
{
|
|
103
|
+
'權限群組M3': {
|
|
104
|
+
'mode': 'OR',
|
|
105
|
+
'isActive': 'y',
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
`, 'n'],
|
|
109
|
+
['admin', '', `
|
|
110
|
+
{
|
|
111
|
+
'權限群組M4': {
|
|
112
|
+
'mode': 'OR',
|
|
113
|
+
'isActive': 'y',
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
`, 'y'],
|
|
117
|
+
|
|
118
|
+
]
|
|
119
|
+
rs = map(rs, ([name, from, cgrups, isAdmin], k) => {
|
|
120
|
+
let v = funNew({
|
|
121
|
+
userId: 'id-for-admin',
|
|
122
|
+
order: k,
|
|
123
|
+
name,
|
|
124
|
+
email: `${name}@example.com`,
|
|
125
|
+
from,
|
|
126
|
+
cgrups,
|
|
127
|
+
isAdmin,
|
|
128
|
+
})
|
|
129
|
+
v.id = `id-for-${name}`
|
|
130
|
+
// if (name === 'john') {
|
|
131
|
+
// v.email = `${v.email};john@test.com`
|
|
132
|
+
// }
|
|
133
|
+
v.isAdmin = isAdmin
|
|
134
|
+
v = dtpick(v, keys(settings))
|
|
135
|
+
return v
|
|
136
|
+
})
|
|
137
|
+
console.log(`已產生: ${keyTable} 測試資料`, rs)
|
|
138
|
+
return rs
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
let tab = {
|
|
142
|
+
keyTable,
|
|
143
|
+
tableNameCht,
|
|
144
|
+
tableNameEng,
|
|
145
|
+
settings,
|
|
146
|
+
funNew,
|
|
147
|
+
funTest,
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
export default tab
|
|
152
|
+
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.bg-gray-100[data-v-f9ffef80]{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.bg-gray-50[data-v-f9ffef80]{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.bg-white[data-v-f9ffef80]{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.border[data-v-f9ffef80]{border-width:1px}.border-collapse[data-v-f9ffef80]{border-collapse:collapse}.border-solid[data-v-f9ffef80]{border-style:solid}.border-gray-200[data-v-f9ffef80]{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.border-gray-300[data-v-f9ffef80]{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.flex[data-v-f9ffef80]{display:-webkit-box;display:-ms-flexbox;display:flex}.focus\:ring-blue-500[data-v-f9ffef80]:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.font-medium[data-v-f9ffef80]{font-weight:500}.font-semibold[data-v-f9ffef80]{font-weight:600}.h-4[data-v-f9ffef80]{height:1rem}.hover\:bg-gray-50[data-v-f9ffef80]:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.items-center[data-v-f9ffef80]{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.justify-end[data-v-f9ffef80]{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.mb-8[data-v-f9ffef80]{margin-bottom:2rem}.ml-2[data-v-f9ffef80]{margin-left:.5rem}.mr-2[data-v-f9ffef80]{margin-right:.5rem}.mt-2[data-v-f9ffef80]{margin-top:.5rem}.overflow-x-auto[data-v-f9ffef80]{overflow-x:auto}.p-5[data-v-f9ffef80]{padding:1.25rem}.pb-2[data-v-f9ffef80]{padding-bottom:.5rem}.px-2[data-v-f9ffef80]{padding-left:.5rem;padding-right:.5rem}.px-6[data-v-f9ffef80]{padding-left:1.5rem;padding-right:1.5rem}.py-1[data-v-f9ffef80]{padding-top:.25rem;padding-bottom:.25rem}.py-3[data-v-f9ffef80]{padding-top:.75rem;padding-bottom:.75rem}.py-4[data-v-f9ffef80]{padding-top:1rem;padding-bottom:1rem}.relative[data-v-f9ffef80]{position:relative}.rounded[data-v-f9ffef80]{border-radius:.25rem}.rounded-lg[data-v-f9ffef80]{border-radius:.5rem}.shadow-md[data-v-f9ffef80]{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);-webkit-box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.space-x-4[data-v-f9ffef80]>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.space-y-8[data-v-f9ffef80]>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.text-blue-600[data-v-f9ffef80]{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.text-gray-500[data-v-f9ffef80]{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-700[data-v-f9ffef80]{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.text-gray-900[data-v-f9ffef80]{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.text-left[data-v-f9ffef80]{text-align:left}.text-lg[data-v-f9ffef80]{font-size:1.125rem;line-height:1.75rem}.text-purple-600[data-v-f9ffef80]{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity,1))}.text-sm[data-v-f9ffef80]{font-size:.875rem;line-height:1.25rem}.text-xs[data-v-f9ffef80]{font-size:.75rem;line-height:1rem}.transition-colors[data-v-f9ffef80]{-webkit-transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.15s;transition-duration:.15s}.w-4[data-v-f9ffef80]{width:1rem}.w-full[data-v-f9ffef80]{width:100%}.staCtrl[data-v-f9ffef80]{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;gap:12px;padding:8px 0}.staCtrlRight[data-v-f9ffef80],.staCtrl[data-v-f9ffef80]{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.staCtrlRight[data-v-f9ffef80]{-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:16px}body,html{font-family:微軟正黑體,Microsoft JhengHei,MicrosoftJhengHeiRegular,Avenir,Helvetica,Arial,sans-serif;overflow-y:hidden}a,button,div,input,p,pre,span,textarea{font-family:inherit}.fade-enter-active{-webkit-animation:go 1s;animation:go 1s}.fade-leave-active{-webkit-animation:back 1s;animation:back 1s}@-webkit-keyframes go{0%{opacity:0}to{opacity:1}}@keyframes go{0%{opacity:0}to{opacity:1}}@-webkit-keyframes back{0%{opacity:1}to{opacity:0}}@keyframes back{0%{opacity:1}to{opacity:0}}
|