w-web-sso 1.0.55 → 1.0.57

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.
Files changed (36) hide show
  1. package/README.md +15 -0
  2. package/dist/css/{app.17d51900.css → app.41f2501d.css} +1 -1
  3. package/dist/css/chunk-vendors.f3388810.css +1 -0
  4. package/dist/index.tmp +1 -1
  5. package/dist/js/app-legacy.5f1e8618.js +1 -0
  6. package/dist/js/app.5f1e8618.js +1 -0
  7. package/dist/js/chunk-vendors-legacy.5f8d2de0.js +35 -0
  8. package/dist/js/chunk-vendors.5f8d2de0.js +35 -0
  9. package/dist/w-web-sso.umd.js +5 -5
  10. package/dist/w-web-sso.umd.js.map +1 -1
  11. package/docs/{normalizeAllowUserRegistration.html → WWebSso.html} +7 -7
  12. package/docs/index.html +2 -2
  13. package/docs/server_WWebSso.mjs.html +96 -34
  14. package/docs/src_components_Common_CheckYesNo.vue.html +2 -2
  15. package/logs/2026-08-20T11.log +0 -0
  16. package/logs/2026-08-20T12.log +8 -0
  17. package/package.json +14 -14
  18. package/server/WWebSso.mjs +94 -32
  19. package/server/defaultPasswordPolicy.mjs +44 -0
  20. package/server/procCore.mjs +72 -27
  21. package/server/procLang.mjs +13 -1
  22. package/settings.json +30 -0
  23. package/src/components/LayoutContentStaInfor.vue +8 -8
  24. package/zMem.mjs +14 -0
  25. package/z/344/277/256/346/255/243/350/246/217/345/212/203/346/233/270.md +31 -0
  26. package/dist/css/chunk-vendors.3ba258b7.css +0 -1
  27. package/dist/js/app-legacy.126b3bf5.js +0 -1
  28. package/dist/js/app.126b3bf5.js +0 -1
  29. package/dist/js/chunk-vendors-legacy.a34b3a56.js +0 -20
  30. package/dist/js/chunk-vendors.a34b3a56.js +0 -20
  31. package/server/template/changePasswordEmail-cht.html +0 -1
  32. package/server/template/changePasswordEmail-eng.html +0 -1
  33. package/server/template/regVerifyEmail-cht.html +0 -1
  34. package/server/template/regVerifyEmail-eng.html +0 -1
  35. package/server/template/resetPasswordEmail-cht.html +0 -1
  36. package/server/template/resetPasswordEmail-eng.html +0 -1
package/README.md CHANGED
@@ -11,6 +11,21 @@ A web service for SSO.
11
11
  ## Documentation
12
12
  To view documentation or get support, visit [docs](https://yuda-lyu.github.io/w-web-sso/WWebSso.html).
13
13
 
14
+ ## Upgrade Notes
15
+
16
+ ### Upgrading from 1.0.3x / 1.0.5x
17
+
18
+ **Settings (啟動契約)**: 舊版 settings 原封不動即可啟動——新增之設定鍵皆有內建預設:
19
+
20
+ - `allowUserRegistration` 預設 `false`(自助註冊為 opt-in 新功能,明確設 `true` 才啟用;啟用時須另給 `siteUrl`,正式機另須給 `verifyBaseUrl` 使驗證信連結可自外部連通)。
21
+ - `passwordPolicy` 未給採程式內建預設密碼政策(同套件自帶 settings.json 之預設組);有給則 13 個子欄位逐欄驗證。
22
+ - 信件文字鍵**全數繼續生效**(各欄位逐語系物件,語意同舊版):`chpwEmTitle` / `chpwEmContent`(變更密碼通知信,`{sender}`/`{name}` 置換符)、`regVerifyEmTitle` / `regVerifyEmContent`(註冊驗證信,`{sender}`/`{name}`/`{verifyUrl}` 置換符);另新增 `resetPwEmTitle` / `resetPwEmContent`(重設密碼通知信,`{sender}`/`{name}`/`{account}`/`{newPassword}` 置換符)與 `verifyEmailResultContent`(驗證結果頁,`{title}`/`{message}` 置換符)。各值可直接給文字,**亦可給檔案路徑**(絕對或基於啟動路徑之相對,檔案存在即讀檔作為內容,不存在則原樣視為文字)。既有客製不需任何搬移;未給時採內建語系文字(結果頁採內建模板,另可用 `pathTemplate` 指定自訂結果頁模板資料夾)。套件自帶 `settings.json` 已含全部鍵與預設文字可直接參考。
23
+ - 生產環境須以環境變數 `SALT` 注入真實 pepper(settings 內 `salt` 為 `'{salt}'` 佔位符或空值時啟動拒啟;測試/開發可設 `ALLOW_PLACEHOLDER_SALT=1` 放行)。
24
+
25
+ **API (授權收緊, 1.0.5x 起)**: `/api/getSsoUserInfor` 與 `/api/getSsoUsersList` 由「任何有效 token」收緊為須 **admin token 或 app token(`isApp='y'`)**。以 app token 做系統介接者不受影響;若既有整合以一般使用者 token 呼叫這兩支,請改用 app token。錯誤訊息字串已改為 i18n key(呼叫端請以 `state==='success'` 判斷成敗,勿比對錯誤字串)。
26
+
27
+ **Database (資料契約, 1.0.5x 起之破壞性變更)**: 密碼雜湊改為 `scrypt:{saltHex}:{hashHex}` 自描述格式且**不相容舊格式**,並新增 `timeVerified` 必填欄位(為空視為未完成信箱驗證、拒絕登入)。舊 DB 之使用者(含 admin)升級後將全數無法登入——請重建 DB 並重匯入使用者資料(以新版 `hashPassword` 產生密碼並補 `timeVerified`),或自行撰寫一次性遷移(重設密碼+補 `timeVerified`+可標 `isForceChangePw='y'` 要求使用者改密)。
28
+
14
29
  ## Installation
15
30
 
16
31
  ### Using npm(ES6 module):
@@ -1 +1 @@
1
- .bg-blue-100[data-v-d7c50a1e]{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.bg-gray-100[data-v-d7c50a1e]{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.bg-gray-50[data-v-d7c50a1e]{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.bg-green-100[data-v-d7c50a1e]{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.bg-red-100[data-v-d7c50a1e]{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))}.bg-white[data-v-d7c50a1e]{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-yellow-100[data-v-d7c50a1e]{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity,1))}.border[data-v-d7c50a1e]{border-width:1px}.border-collapse[data-v-d7c50a1e]{border-collapse:collapse}.border-gray-200[data-v-d7c50a1e]{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.border-gray-300[data-v-d7c50a1e]{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.border-solid[data-v-d7c50a1e]{border-style:solid}.cursor-pointer[data-v-d7c50a1e]{cursor:pointer}.flex[data-v-d7c50a1e]{display:-webkit-box;display:-ms-flexbox;display:flex}.focus\:ring-blue-500[data-v-d7c50a1e]:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.font-bold[data-v-d7c50a1e]{font-weight:700}.font-medium[data-v-d7c50a1e]{font-weight:500}.font-semibold[data-v-d7c50a1e]{font-weight:600}.gap-5[data-v-d7c50a1e]{gap:1.25rem}.gap-6[data-v-d7c50a1e]{gap:1.5rem}.h-4[data-v-d7c50a1e]{height:1rem}.hover\:bg-gray-50[data-v-d7c50a1e]:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.hover\:underline[data-v-d7c50a1e]:hover{text-decoration-line:underline}.items-center[data-v-d7c50a1e]{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.justify-between[data-v-d7c50a1e]{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.mb-2[data-v-d7c50a1e]{margin-bottom:.5rem}.mb-4[data-v-d7c50a1e]{margin-bottom:1rem}.mb-8[data-v-d7c50a1e]{margin-bottom:2rem}.ml-2[data-v-d7c50a1e]{margin-left:.5rem}.ml-4[data-v-d7c50a1e]{margin-left:1rem}.mr-2[data-v-d7c50a1e]{margin-right:.5rem}.mt-2[data-v-d7c50a1e]{margin-top:.5rem}.mt-4[data-v-d7c50a1e]{margin-top:1rem}.overflow-x-auto[data-v-d7c50a1e]{overflow-x:auto}.p-3[data-v-d7c50a1e]{padding:.75rem}.p-5[data-v-d7c50a1e]{padding:1.25rem}.pb-1[data-v-d7c50a1e]{padding-bottom:.25rem}.pb-2[data-v-d7c50a1e]{padding-bottom:.5rem}.pb-3[data-v-d7c50a1e]{padding-bottom:.75rem}.px-2[data-v-d7c50a1e]{padding-left:.5rem;padding-right:.5rem}.px-6[data-v-d7c50a1e]{padding-left:1.5rem;padding-right:1.5rem}.py-1[data-v-d7c50a1e]{padding-top:.25rem;padding-bottom:.25rem}.py-3[data-v-d7c50a1e]{padding-top:.75rem;padding-bottom:.75rem}.py-4[data-v-d7c50a1e]{padding-top:1rem;padding-bottom:1rem}.relative[data-v-d7c50a1e]{position:relative}.rounded[data-v-d7c50a1e]{border-radius:.25rem}.rounded-full[data-v-d7c50a1e]{border-radius:9999px}.rounded-lg[data-v-d7c50a1e]{border-radius:.5rem}.shadow-md[data-v-d7c50a1e]{--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)}.shadow-md[data-v-d7c50a1e],.shadow-sm[data-v-d7c50a1e]{-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)}.shadow-sm[data-v-d7c50a1e]{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.space-x-4[data-v-d7c50a1e]>: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-2[data-v-d7c50a1e]>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-8[data-v-d7c50a1e]>: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))}.sticky[data-v-d7c50a1e]{position:sticky}.text-2xl[data-v-d7c50a1e]{font-size:1.5rem;line-height:2rem}.text-blue-600[data-v-d7c50a1e]{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.text-gray-500[data-v-d7c50a1e]{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-700[data-v-d7c50a1e]{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.text-gray-900[data-v-d7c50a1e]{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.text-green-600[data-v-d7c50a1e]{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.text-indigo-600[data-v-d7c50a1e]{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.text-left[data-v-d7c50a1e]{text-align:left}.text-lg[data-v-d7c50a1e]{font-size:1.125rem;line-height:1.75rem}.text-purple-600[data-v-d7c50a1e]{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity,1))}.text-red-600[data-v-d7c50a1e]{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.text-right[data-v-d7c50a1e]{text-align:right}.text-sm[data-v-d7c50a1e]{font-size:.875rem;line-height:1.25rem}.text-teal-600[data-v-d7c50a1e]{--tw-text-opacity:1;color:rgb(13 148 136/var(--tw-text-opacity,1))}.text-xs[data-v-d7c50a1e]{font-size:.75rem;line-height:1rem}.text-yellow-600[data-v-d7c50a1e]{--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity,1))}.top-0[data-v-d7c50a1e]{top:0}.transition-colors[data-v-d7c50a1e]{-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-d7c50a1e]{width:1rem}.w-7[data-v-d7c50a1e]{width:1.75rem}.w-full[data-v-d7c50a1e]{width:100%}.z-10[data-v-d7c50a1e]{z-index:10}.grid[data-v-d7c50a1e]{display:grid}.grid-cols-1[data-v-d7c50a1e]{grid-template-columns:repeat(1,minmax(0,1fr))}@media (min-width:640px){.sm\:grid-cols-2[data-v-d7c50a1e]{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1024px){.lg\:grid-cols-1[data-v-d7c50a1e]{grid-template-columns:repeat(1,minmax(0,1fr))}.lg\:grid-cols-3[data-v-d7c50a1e]{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4[data-v-d7c50a1e]{grid-template-columns:repeat(4,minmax(0,1fr))}}.bg-blue-100[data-v-3796caa5]{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.bg-gray-100[data-v-3796caa5]{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.border-gray-200[data-v-3796caa5]{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.border-t[data-v-3796caa5]{border-top-width:1px}.break-all[data-v-3796caa5]{word-break:break-all}.flex[data-v-3796caa5]{display:-webkit-box;display:-ms-flexbox;display:flex}.flex-shrink-0[data-v-3796caa5]{-ms-flex-negative:0;flex-shrink:0}.font-medium[data-v-3796caa5]{font-weight:500}.font-semibold[data-v-3796caa5]{font-weight:600}.gap-3[data-v-3796caa5]{gap:.75rem}.gap-4[data-v-3796caa5]{gap:1rem}.gap-x-8[data-v-3796caa5]{-webkit-column-gap:2rem;-moz-column-gap:2rem;column-gap:2rem}.gap-y-6[data-v-3796caa5]{row-gap:1.5rem}.inline-block[data-v-3796caa5]{display:inline-block}.items-center[data-v-3796caa5]{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.items-start[data-v-3796caa5]{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.mb-2[data-v-3796caa5]{margin-bottom:.5rem}.mr-3[data-v-3796caa5]{margin-right:.75rem}.mt-1[data-v-3796caa5]{margin-top:.25rem}.p-3[data-v-3796caa5]{padding:.75rem}.pt-6[data-v-3796caa5]{padding-top:1.5rem}.px-2[data-v-3796caa5]{padding-left:.5rem;padding-right:.5rem}.py-1[data-v-3796caa5]{padding-top:.25rem;padding-bottom:.25rem}.rounded-lg[data-v-3796caa5]{border-radius:.5rem}.rounded-md[data-v-3796caa5]{border-radius:.375rem}.space-y-8[data-v-3796caa5]>: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-base[data-v-3796caa5]{font-size:1rem;line-height:1.5rem}.text-blue-700[data-v-3796caa5]{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.text-gray-400[data-v-3796caa5]{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500[data-v-3796caa5]{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-700[data-v-3796caa5]{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.text-gray-900[data-v-3796caa5]{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.text-sm[data-v-3796caa5]{font-size:.875rem;line-height:1.25rem}.text-xs[data-v-3796caa5]{font-size:.75rem;line-height:1rem}.text-red-800\/80[data-v-3796caa5]{color:rgba(153,27,27,.8)}.text-green-800\/80[data-v-3796caa5]{color:rgba(22,101,52,.8)}.grid[data-v-3796caa5]{display:grid}.grid-cols-1[data-v-3796caa5]{grid-template-columns:repeat(1,minmax(0,1fr))}@media (min-width:640px){.sm\:grid-cols-2[data-v-3796caa5]{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:768px){.md\:grid-cols-2[data-v-3796caa5]{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:col-span-2[data-v-3796caa5]{grid-column:span 2/span 2}}@media (min-width:1024px){.lg\:grid-cols-4[data-v-3796caa5]{grid-template-columns:repeat(4,minmax(0,1fr))}}.status-danger[data-v-3796caa5]{background-color:#fef2f2;color:#b91c1c;border:1px solid #fecaca}.status-warning[data-v-3796caa5]{background-color:#fffbeb;color:#b45309;border:1px solid #fde68a}.status-success[data-v-3796caa5]{background-color:#f0fdf4;color:#15803d;border:1px solid #bbf7d0}.status-info[data-v-3796caa5]{background-color:#f8fafc;color:#475569;border:1px solid #e2e8f0}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}.sb{-webkit-transition:opacity .3s;transition:opacity .3s;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.3) transparent}.sb::-webkit-scrollbar{width:8px;height:8px}.sb::-webkit-scrollbar-track{background:transparent}.sb::-webkit-scrollbar-thumb{background:rgba(0,0,0,.3);border-radius:20px;border:3px solid transparent}
1
+ .bg-blue-100[data-v-242de662]{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.bg-gray-100[data-v-242de662]{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.bg-gray-50[data-v-242de662]{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.bg-green-100[data-v-242de662]{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity,1))}.bg-red-100[data-v-242de662]{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity,1))}.bg-white[data-v-242de662]{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-yellow-100[data-v-242de662]{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity,1))}.border[data-v-242de662]{border-width:1px}.border-collapse[data-v-242de662]{border-collapse:collapse}.border-gray-200[data-v-242de662]{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.border-gray-300[data-v-242de662]{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.border-solid[data-v-242de662]{border-style:solid}.cursor-pointer[data-v-242de662]{cursor:pointer}.flex[data-v-242de662]{display:-webkit-box;display:-ms-flexbox;display:flex}.focus\:ring-blue-500[data-v-242de662]:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.font-bold[data-v-242de662]{font-weight:700}.font-medium[data-v-242de662]{font-weight:500}.font-semibold[data-v-242de662]{font-weight:600}.gap-5[data-v-242de662]{gap:1.25rem}.gap-6[data-v-242de662]{gap:1.5rem}.h-4[data-v-242de662]{height:1rem}.hover\:bg-gray-50[data-v-242de662]:hover{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.hover\:underline[data-v-242de662]:hover{text-decoration-line:underline}.items-center[data-v-242de662]{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.justify-between[data-v-242de662]{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.mb-2[data-v-242de662]{margin-bottom:.5rem}.mb-4[data-v-242de662]{margin-bottom:1rem}.mb-8[data-v-242de662]{margin-bottom:2rem}.ml-2[data-v-242de662]{margin-left:.5rem}.ml-4[data-v-242de662]{margin-left:1rem}.mr-2[data-v-242de662]{margin-right:.5rem}.mt-2[data-v-242de662]{margin-top:.5rem}.mt-4[data-v-242de662]{margin-top:1rem}.overflow-x-auto[data-v-242de662]{overflow-x:auto}.p-3[data-v-242de662]{padding:.75rem}.p-5[data-v-242de662]{padding:1.25rem}.pb-1[data-v-242de662]{padding-bottom:.25rem}.pb-2[data-v-242de662]{padding-bottom:.5rem}.pb-3[data-v-242de662]{padding-bottom:.75rem}.px-2[data-v-242de662]{padding-left:.5rem;padding-right:.5rem}.px-6[data-v-242de662]{padding-left:1.5rem;padding-right:1.5rem}.py-1[data-v-242de662]{padding-top:.25rem;padding-bottom:.25rem}.py-3[data-v-242de662]{padding-top:.75rem;padding-bottom:.75rem}.py-4[data-v-242de662]{padding-top:1rem;padding-bottom:1rem}.relative[data-v-242de662]{position:relative}.rounded[data-v-242de662]{border-radius:.25rem}.rounded-full[data-v-242de662]{border-radius:9999px}.rounded-lg[data-v-242de662]{border-radius:.5rem}.shadow-md[data-v-242de662]{--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)}.shadow-md[data-v-242de662],.shadow-sm[data-v-242de662]{-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)}.shadow-sm[data-v-242de662]{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.space-x-4[data-v-242de662]>: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-2[data-v-242de662]>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-8[data-v-242de662]>: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))}.sticky[data-v-242de662]{position:sticky}.text-2xl[data-v-242de662]{font-size:1.5rem;line-height:2rem}.text-blue-600[data-v-242de662]{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity,1))}.text-gray-500[data-v-242de662]{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-700[data-v-242de662]{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.text-gray-900[data-v-242de662]{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.text-green-600[data-v-242de662]{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.text-indigo-600[data-v-242de662]{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity,1))}.text-left[data-v-242de662]{text-align:left}.text-lg[data-v-242de662]{font-size:1.125rem;line-height:1.75rem}.text-purple-600[data-v-242de662]{--tw-text-opacity:1;color:rgb(147 51 234/var(--tw-text-opacity,1))}.text-red-600[data-v-242de662]{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.text-right[data-v-242de662]{text-align:right}.text-sm[data-v-242de662]{font-size:.875rem;line-height:1.25rem}.text-teal-600[data-v-242de662]{--tw-text-opacity:1;color:rgb(13 148 136/var(--tw-text-opacity,1))}.text-xs[data-v-242de662]{font-size:.75rem;line-height:1rem}.text-yellow-600[data-v-242de662]{--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity,1))}.top-0[data-v-242de662]{top:0}.transition-colors[data-v-242de662]{-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-242de662]{width:1rem}.w-7[data-v-242de662]{width:1.75rem}.w-full[data-v-242de662]{width:100%}.z-10[data-v-242de662]{z-index:10}.grid[data-v-242de662]{display:grid}.grid-cols-1[data-v-242de662]{grid-template-columns:repeat(1,minmax(0,1fr))}@media (min-width:640px){.sm\:grid-cols-2[data-v-242de662]{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1024px){.lg\:grid-cols-1[data-v-242de662]{grid-template-columns:repeat(1,minmax(0,1fr))}.lg\:grid-cols-3[data-v-242de662]{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4[data-v-242de662]{grid-template-columns:repeat(4,minmax(0,1fr))}}.bg-blue-100[data-v-3796caa5]{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity,1))}.bg-gray-100[data-v-3796caa5]{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.border-gray-200[data-v-3796caa5]{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity,1))}.border-t[data-v-3796caa5]{border-top-width:1px}.break-all[data-v-3796caa5]{word-break:break-all}.flex[data-v-3796caa5]{display:-webkit-box;display:-ms-flexbox;display:flex}.flex-shrink-0[data-v-3796caa5]{-ms-flex-negative:0;flex-shrink:0}.font-medium[data-v-3796caa5]{font-weight:500}.font-semibold[data-v-3796caa5]{font-weight:600}.gap-3[data-v-3796caa5]{gap:.75rem}.gap-4[data-v-3796caa5]{gap:1rem}.gap-x-8[data-v-3796caa5]{-webkit-column-gap:2rem;-moz-column-gap:2rem;column-gap:2rem}.gap-y-6[data-v-3796caa5]{row-gap:1.5rem}.inline-block[data-v-3796caa5]{display:inline-block}.items-center[data-v-3796caa5]{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.items-start[data-v-3796caa5]{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.mb-2[data-v-3796caa5]{margin-bottom:.5rem}.mr-3[data-v-3796caa5]{margin-right:.75rem}.mt-1[data-v-3796caa5]{margin-top:.25rem}.p-3[data-v-3796caa5]{padding:.75rem}.pt-6[data-v-3796caa5]{padding-top:1.5rem}.px-2[data-v-3796caa5]{padding-left:.5rem;padding-right:.5rem}.py-1[data-v-3796caa5]{padding-top:.25rem;padding-bottom:.25rem}.rounded-lg[data-v-3796caa5]{border-radius:.5rem}.rounded-md[data-v-3796caa5]{border-radius:.375rem}.space-y-8[data-v-3796caa5]>: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-base[data-v-3796caa5]{font-size:1rem;line-height:1.5rem}.text-blue-700[data-v-3796caa5]{--tw-text-opacity:1;color:rgb(29 78 216/var(--tw-text-opacity,1))}.text-gray-400[data-v-3796caa5]{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500[data-v-3796caa5]{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-700[data-v-3796caa5]{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.text-gray-900[data-v-3796caa5]{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.text-sm[data-v-3796caa5]{font-size:.875rem;line-height:1.25rem}.text-xs[data-v-3796caa5]{font-size:.75rem;line-height:1rem}.text-red-800\/80[data-v-3796caa5]{color:rgba(153,27,27,.8)}.text-green-800\/80[data-v-3796caa5]{color:rgba(22,101,52,.8)}.grid[data-v-3796caa5]{display:grid}.grid-cols-1[data-v-3796caa5]{grid-template-columns:repeat(1,minmax(0,1fr))}@media (min-width:640px){.sm\:grid-cols-2[data-v-3796caa5]{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:768px){.md\:grid-cols-2[data-v-3796caa5]{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:col-span-2[data-v-3796caa5]{grid-column:span 2/span 2}}@media (min-width:1024px){.lg\:grid-cols-4[data-v-3796caa5]{grid-template-columns:repeat(4,minmax(0,1fr))}}.status-danger[data-v-3796caa5]{background-color:#fef2f2;color:#b91c1c;border:1px solid #fecaca}.status-warning[data-v-3796caa5]{background-color:#fffbeb;color:#b45309;border:1px solid #fde68a}.status-success[data-v-3796caa5]{background-color:#f0fdf4;color:#15803d;border:1px solid #bbf7d0}.status-info[data-v-3796caa5]{background-color:#f8fafc;color:#475569;border:1px solid #e2e8f0}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}.sb{-webkit-transition:opacity .3s;transition:opacity .3s;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.3) transparent}.sb::-webkit-scrollbar{width:8px;height:8px}.sb::-webkit-scrollbar-track{background:transparent}.sb::-webkit-scrollbar-thumb{background:rgba(0,0,0,.3);border-radius:20px;border:3px solid transparent}