smart-admin-web 10.15.0 → 10.20.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.
Files changed (432) hide show
  1. package/README.md +1 -1
  2. package/dist/api/index.d.ts +4 -2
  3. package/dist/api/index.js +1 -1
  4. package/dist/api/index.js.map +1 -1
  5. package/dist/api/schema.d.ts +39 -5
  6. package/dist/assets/icons/ph-subset.json.js +5 -5
  7. package/dist/components/AppIcon.vue.js +9 -9
  8. package/dist/components/AppIcon.vue.js.map +1 -1
  9. package/dist/components/AppWatermark.vue.d.ts +14 -0
  10. package/dist/components/AppWatermark.vue.js +38 -0
  11. package/dist/components/AppWatermark.vue.js.map +1 -0
  12. package/dist/components/AppWatermark2.vue.js +5 -0
  13. package/dist/components/AppWatermark2.vue.js.map +1 -0
  14. package/dist/components/Chart/PieChart.vue.d.ts +1 -1
  15. package/dist/components/Chart/echarts.js +15 -20
  16. package/dist/components/Chart/echarts.js.map +1 -1
  17. package/dist/components/CronEditor/index.vue.js +1 -1
  18. package/dist/components/CronEditor/index2.vue.js +2 -1
  19. package/dist/components/CronEditor/index2.vue.js.map +1 -1
  20. package/dist/components/DetailPage/index.vue.js +2 -2
  21. package/dist/components/DetailPage/index2.vue.js.map +1 -1
  22. package/dist/components/DictTag/index.vue.js.map +1 -1
  23. package/dist/components/ErrorBoundary/index.vue.js +2 -2
  24. package/dist/components/ErrorBoundary/index2.vue.js +1 -1
  25. package/dist/components/ErrorBoundary/index2.vue.js.map +1 -1
  26. package/dist/components/FormContainer/index.vue.js +91 -56
  27. package/dist/components/FormContainer/index.vue.js.map +1 -1
  28. package/dist/components/ImportWizard/index.vue.js +1 -1
  29. package/dist/components/ImportWizard/index2.vue.js +44 -41
  30. package/dist/components/ImportWizard/index2.vue.js.map +1 -1
  31. package/dist/components/MenuSearch.vue.js +2 -2
  32. package/dist/components/MenuSearch2.vue.js +19 -18
  33. package/dist/components/MenuSearch2.vue.js.map +1 -1
  34. package/dist/components/PasswordStrength/index.vue.js +2 -2
  35. package/dist/components/PasswordStrength/index2.vue.js +20 -18
  36. package/dist/components/PasswordStrength/index2.vue.js.map +1 -1
  37. package/dist/components/TableTotal/index.vue.d.ts +6 -0
  38. package/dist/components/{SelectTable → TableTotal}/index.vue.js +1 -1
  39. package/dist/components/TableTotal/index2.vue.js +16 -0
  40. package/dist/components/TableTotal/index2.vue.js.map +1 -0
  41. package/dist/components/TableZoomButton/index.vue.js.map +1 -1
  42. package/dist/components/UserPicker/index.vue.js +2 -2
  43. package/dist/components/UserPicker/index2.vue.js +176 -117
  44. package/dist/components/UserPicker/index2.vue.js.map +1 -1
  45. package/dist/composables/useBatchDelete.js.map +1 -1
  46. package/dist/composables/useLayoutMenu.js +17 -16
  47. package/dist/composables/useLayoutMenu.js.map +1 -1
  48. package/dist/composables/useModule.js +39 -29
  49. package/dist/composables/useModule.js.map +1 -1
  50. package/dist/composables/useShellBreakpoint.d.ts +19 -0
  51. package/dist/composables/useShellBreakpoint.js +37 -0
  52. package/dist/composables/useShellBreakpoint.js.map +1 -0
  53. package/dist/composables/useSite.d.ts +15 -0
  54. package/dist/composables/useSite.js +16 -14
  55. package/dist/composables/useSite.js.map +1 -1
  56. package/dist/composables/useTabTitle.js.map +1 -1
  57. package/dist/composables/useTableTitle.d.ts +6 -0
  58. package/dist/composables/useTableTitle.js +11 -0
  59. package/dist/composables/useTableTitle.js.map +1 -0
  60. package/dist/composables/useTableZoom.d.ts +5 -0
  61. package/dist/composables/useTableZoom.js.map +1 -1
  62. package/dist/composables/useTheme.d.ts +2 -2
  63. package/dist/composables/useTheme.js +23 -20
  64. package/dist/composables/useTheme.js.map +1 -1
  65. package/dist/createSmartAdmin.d.ts +12 -2
  66. package/dist/createSmartAdmin.js +72 -60
  67. package/dist/createSmartAdmin.js.map +1 -1
  68. package/dist/index.d.ts +5 -2
  69. package/dist/index.js +219 -205
  70. package/dist/index.js.map +1 -1
  71. package/dist/layouts/AccentPicker.vue.js +8 -0
  72. package/dist/layouts/AccentPicker.vue.js.map +1 -0
  73. package/dist/layouts/AccentPicker2.vue.js +131 -0
  74. package/dist/layouts/AccentPicker2.vue.js.map +1 -0
  75. package/dist/layouts/AppHeader.vue.d.ts +8 -1
  76. package/dist/layouts/AppHeader.vue.js +2 -2
  77. package/dist/layouts/AppHeader2.vue.js +317 -235
  78. package/dist/layouts/AppHeader2.vue.js.map +1 -1
  79. package/dist/layouts/NoticeBell.vue.js +2 -2
  80. package/dist/layouts/NoticeBell2.vue.js +19 -18
  81. package/dist/layouts/NoticeBell2.vue.js.map +1 -1
  82. package/dist/layouts/PersonalLayout.vue.js +2 -2
  83. package/dist/layouts/PersonalLayout2.vue.js +69 -47
  84. package/dist/layouts/PersonalLayout2.vue.js.map +1 -1
  85. package/dist/layouts/SettingsDrawer.vue.js +3 -3
  86. package/dist/layouts/SettingsDrawer2.vue.js +261 -325
  87. package/dist/layouts/SettingsDrawer2.vue.js.map +1 -1
  88. package/dist/layouts/TabsBar.vue.js +2 -2
  89. package/dist/layouts/TabsBar2.vue.js +97 -69
  90. package/dist/layouts/TabsBar2.vue.js.map +1 -1
  91. package/dist/layouts/components/SideNav.vue.d.ts +3 -0
  92. package/dist/layouts/components/SideNav.vue.js +1 -1
  93. package/dist/layouts/components/SideNav2.vue.js +54 -26
  94. package/dist/layouts/components/SideNav2.vue.js.map +1 -1
  95. package/dist/layouts/default.vue.js +1 -1
  96. package/dist/layouts/default2.vue.js +170 -140
  97. package/dist/layouts/default2.vue.js.map +1 -1
  98. package/dist/lib/loginHero.d.ts +2 -2
  99. package/dist/lib/loginHero.js.map +1 -1
  100. package/dist/lib/runtime.js +1 -1
  101. package/dist/lib/watermark.d.ts +110 -0
  102. package/dist/lib/watermark.js +151 -0
  103. package/dist/lib/watermark.js.map +1 -0
  104. package/dist/locales/en-US.d.ts +221 -15
  105. package/dist/locales/en-US.js +230 -21
  106. package/dist/locales/en-US.js.map +1 -1
  107. package/dist/locales/kernelMenuTitles.d.ts +1 -0
  108. package/dist/locales/kernelMenuTitles.js +128 -0
  109. package/dist/locales/kernelMenuTitles.js.map +1 -0
  110. package/dist/locales/menuTitle.d.ts +3 -0
  111. package/dist/locales/menuTitle.js +14 -12
  112. package/dist/locales/menuTitle.js.map +1 -1
  113. package/dist/locales/zh-CN.d.ts +221 -15
  114. package/dist/locales/zh-CN.js +238 -28
  115. package/dist/locales/zh-CN.js.map +1 -1
  116. package/dist/router/index.js +41 -32
  117. package/dist/router/index.js.map +1 -1
  118. package/dist/router/namedPage.d.ts +4 -0
  119. package/dist/router/namedPage.js +7 -7
  120. package/dist/router/namedPage.js.map +1 -1
  121. package/dist/router/viewRegistry.js +8 -8
  122. package/dist/router/viewRegistry.js.map +1 -1
  123. package/dist/stores/app.d.ts +0 -12
  124. package/dist/stores/app.js +11 -12
  125. package/dist/stores/app.js.map +1 -1
  126. package/dist/stores/tabs.js.map +1 -1
  127. package/dist/stores/user.d.ts +10 -0
  128. package/dist/stores/user.js.map +1 -1
  129. package/dist/style.css +1 -1
  130. package/dist/theme/accentTokens.d.ts +27 -0
  131. package/dist/theme/accentTokens.js +54 -0
  132. package/dist/theme/accentTokens.js.map +1 -0
  133. package/dist/theme/accents.d.ts +21 -1
  134. package/dist/theme/accents.js +11 -2
  135. package/dist/theme/accents.js.map +1 -1
  136. package/dist/theme/mix.d.ts +58 -7
  137. package/dist/theme/mix.js +115 -30
  138. package/dist/theme/mix.js.map +1 -1
  139. package/dist/theme/naive-theme.d.ts +5 -2
  140. package/dist/theme/naive-theme.js +407 -75
  141. package/dist/theme/naive-theme.js.map +1 -1
  142. package/dist/utils/jwt.d.ts +8 -0
  143. package/dist/utils/jwt.js +14 -0
  144. package/dist/utils/jwt.js.map +1 -0
  145. package/dist/utils/menuIcon.d.ts +2 -0
  146. package/dist/utils/menuIcon.js +8 -0
  147. package/dist/utils/menuIcon.js.map +1 -0
  148. package/dist/utils/oauthBrand.js.map +1 -1
  149. package/dist/utils/tableFilter.d.ts +88 -0
  150. package/dist/utils/tableFilter.js +116 -0
  151. package/dist/utils/tableFilter.js.map +1 -0
  152. package/dist/utils/tableToolbar.d.ts +18 -0
  153. package/dist/utils/tableToolbar.js +11 -0
  154. package/dist/utils/tableToolbar.js.map +1 -0
  155. package/dist/utils/treeFilter.d.ts +20 -0
  156. package/dist/utils/treeFilter.js +24 -0
  157. package/dist/utils/treeFilter.js.map +1 -0
  158. package/dist/views/dashboard/ShortcutPicker.vue.js +1 -1
  159. package/dist/views/dashboard/ShortcutPicker2.vue.js +73 -48
  160. package/dist/views/dashboard/ShortcutPicker2.vue.js.map +1 -1
  161. package/dist/views/dashboard/biz.vue.js +1 -1
  162. package/dist/views/dashboard/biz2.vue.js +310 -257
  163. package/dist/views/dashboard/biz2.vue.js.map +1 -1
  164. package/dist/views/dashboard/workbench.vue.js +2 -2
  165. package/dist/views/dashboard/workbench2.vue.js +141 -155
  166. package/dist/views/dashboard/workbench2.vue.js.map +1 -1
  167. package/dist/views/embed/iframe.vue.js +2 -2
  168. package/dist/views/embed/iframe2.vue.js +22 -15
  169. package/dist/views/embed/iframe2.vue.js.map +1 -1
  170. package/dist/views/error/404.vue.js +2 -2
  171. package/dist/views/error/4042.vue.js +33 -24
  172. package/dist/views/error/4042.vue.js.map +1 -1
  173. package/dist/views/error/BootError.vue.js +1 -1
  174. package/dist/views/error/BootError2.vue.js +59 -48
  175. package/dist/views/error/BootError2.vue.js.map +1 -1
  176. package/dist/views/error/MissingRoute.vue.js +2 -2
  177. package/dist/views/error/MissingRoute2.vue.js +34 -15
  178. package/dist/views/error/MissingRoute2.vue.js.map +1 -1
  179. package/dist/views/login/LoginForm.vue.d.ts +7 -1
  180. package/dist/views/login/LoginForm.vue.js +2 -2
  181. package/dist/views/login/LoginForm2.vue.js +580 -488
  182. package/dist/views/login/LoginForm2.vue.js.map +1 -1
  183. package/dist/views/login/components/LoginDesk.vue.d.ts +36 -0
  184. package/dist/views/login/components/LoginDesk.vue.js +9 -0
  185. package/dist/views/login/components/LoginDesk.vue.js.map +1 -0
  186. package/dist/views/login/components/LoginDesk2.vue.js +100 -0
  187. package/dist/views/login/components/LoginDesk2.vue.js.map +1 -0
  188. package/dist/views/login/components/LoginHeroPanel.vue.js +3 -3
  189. package/dist/views/login/components/LoginHeroPanel2.vue.js +34 -39
  190. package/dist/views/login/components/LoginHeroPanel2.vue.js.map +1 -1
  191. package/dist/views/login/index.vue.js +1 -1
  192. package/dist/views/login/index2.vue.js +141 -71
  193. package/dist/views/login/index2.vue.js.map +1 -1
  194. package/dist/views/login/layout.d.ts +11 -0
  195. package/dist/views/login/layout.js +27 -0
  196. package/dist/views/login/layout.js.map +1 -0
  197. package/dist/views/mfa/index.vue.js +2 -2
  198. package/dist/views/mfa/index2.vue.js +367 -321
  199. package/dist/views/mfa/index2.vue.js.map +1 -1
  200. package/dist/views/module/index.vue.js +2 -2
  201. package/dist/views/module/index2.vue.js +132 -99
  202. package/dist/views/module/index2.vue.js.map +1 -1
  203. package/dist/views/oauth/callback.vue.js +2 -2
  204. package/dist/views/oauth/callback2.vue.js +65 -51
  205. package/dist/views/oauth/callback2.vue.js.map +1 -1
  206. package/dist/views/personal/bindings.vue.js +2 -2
  207. package/dist/views/personal/bindings2.vue.js +98 -94
  208. package/dist/views/personal/bindings2.vue.js.map +1 -1
  209. package/dist/views/personal/notice2.vue.js +103 -76
  210. package/dist/views/personal/notice2.vue.js.map +1 -1
  211. package/dist/views/personal/password2.vue.js +47 -40
  212. package/dist/views/personal/password2.vue.js.map +1 -1
  213. package/dist/views/personal/profile.vue.js +3 -3
  214. package/dist/views/personal/profile2.vue.js +24 -18
  215. package/dist/views/personal/profile2.vue.js.map +1 -1
  216. package/dist/views/personal/security.vue.js +2 -2
  217. package/dist/views/personal/security2.vue.js +65 -53
  218. package/dist/views/personal/security2.vue.js.map +1 -1
  219. package/dist/views/personal/sessions.vue.js +2 -2
  220. package/dist/views/personal/sessions2.vue.js +67 -62
  221. package/dist/views/personal/sessions2.vue.js.map +1 -1
  222. package/dist/views/system/ai-model/components/ProviderCard.vue.js +2 -2
  223. package/dist/views/system/ai-model/components/ProviderCard2.vue.js +142 -130
  224. package/dist/views/system/ai-model/components/ProviderCard2.vue.js.map +1 -1
  225. package/dist/views/system/ai-model/components/ProviderForm.vue.js +2 -2
  226. package/dist/views/system/ai-model/components/ProviderForm2.vue.js +71 -70
  227. package/dist/views/system/ai-model/components/ProviderForm2.vue.js.map +1 -1
  228. package/dist/views/system/ai-model/index.vue.js +2 -2
  229. package/dist/views/system/ai-model/index2.vue.js +99 -99
  230. package/dist/views/system/ai-model/index2.vue.js.map +1 -1
  231. package/dist/views/system/ai-model/presets.d.ts +1 -1
  232. package/dist/views/system/ai-model/presets.js +18 -18
  233. package/dist/views/system/ai-model/presets.js.map +1 -1
  234. package/dist/views/system/ai-usage/index.vue.js +2 -2
  235. package/dist/views/system/ai-usage/index2.vue.js +356 -258
  236. package/dist/views/system/ai-usage/index2.vue.js.map +1 -1
  237. package/dist/views/system/api-docs/index.vue.js +5 -2
  238. package/dist/views/system/api-docs/index.vue.js.map +1 -1
  239. package/dist/views/system/api-docs/index2.vue.js +92 -42
  240. package/dist/views/system/api-docs/index2.vue.js.map +1 -1
  241. package/dist/views/system/cache/index.vue.js +2 -2
  242. package/dist/views/system/cache/index2.vue.js +74 -80
  243. package/dist/views/system/cache/index2.vue.js.map +1 -1
  244. package/dist/views/system/config/components/AdminMock.vue.js +2 -2
  245. package/dist/views/system/config/components/AdminMock2.vue.js +60 -43
  246. package/dist/views/system/config/components/AdminMock2.vue.js.map +1 -1
  247. package/dist/views/system/config/components/AdvancedSection.vue.js +5 -2
  248. package/dist/views/system/config/components/AdvancedSection.vue.js.map +1 -1
  249. package/dist/views/system/config/components/AdvancedSection2.vue.js +98 -70
  250. package/dist/views/system/config/components/AdvancedSection2.vue.js.map +1 -1
  251. package/dist/views/system/config/components/BrandSection.vue.js +2 -2
  252. package/dist/views/system/config/components/BrandSection2.vue.js +121 -119
  253. package/dist/views/system/config/components/BrandSection2.vue.js.map +1 -1
  254. package/dist/views/system/config/components/CfgGroup.vue.js +3 -3
  255. package/dist/views/system/config/components/CfgGroup2.vue.js.map +1 -1
  256. package/dist/views/system/config/components/CfgRow.vue.js +1 -1
  257. package/dist/views/system/config/components/CfgRow2.vue.js +24 -23
  258. package/dist/views/system/config/components/CfgRow2.vue.js.map +1 -1
  259. package/dist/views/system/config/components/CfgSegment.vue.js +1 -1
  260. package/dist/views/system/config/components/CfgSegment2.vue.js +16 -15
  261. package/dist/views/system/config/components/CfgSegment2.vue.js.map +1 -1
  262. package/dist/views/system/config/components/ConfigFormModal.vue.js +2 -2
  263. package/dist/views/system/config/components/ConfigFormModal2.vue.js +35 -33
  264. package/dist/views/system/config/components/ConfigFormModal2.vue.js.map +1 -1
  265. package/dist/views/system/config/components/JobSection.vue.js +2 -2
  266. package/dist/views/system/config/components/JobSection2.vue.js +46 -44
  267. package/dist/views/system/config/components/JobSection2.vue.js.map +1 -1
  268. package/dist/views/system/config/components/LoginMock.vue.js +3 -3
  269. package/dist/views/system/config/components/LoginMock2.vue.js +83 -72
  270. package/dist/views/system/config/components/LoginMock2.vue.js.map +1 -1
  271. package/dist/views/system/config/components/LogoCropper.vue.js +1 -1
  272. package/dist/views/system/config/components/LogoCropper2.vue.js.map +1 -1
  273. package/dist/views/system/config/components/LogoEditor.vue.js +2 -2
  274. package/dist/views/system/config/components/LogoEditor2.vue.js +11 -13
  275. package/dist/views/system/config/components/LogoEditor2.vue.js.map +1 -1
  276. package/dist/views/system/config/components/ProviderSheet.vue.js +3 -3
  277. package/dist/views/system/config/components/ProviderSheet2.vue.js.map +1 -1
  278. package/dist/views/system/config/components/SectionLayout.vue.d.ts +4 -2
  279. package/dist/views/system/config/components/SectionLayout.vue.js +2 -2
  280. package/dist/views/system/config/components/SectionLayout2.vue.js +51 -27
  281. package/dist/views/system/config/components/SectionLayout2.vue.js.map +1 -1
  282. package/dist/views/system/config/components/SecuritySection.vue.js +2 -2
  283. package/dist/views/system/config/components/SecuritySection2.vue.js +207 -206
  284. package/dist/views/system/config/components/SecuritySection2.vue.js.map +1 -1
  285. package/dist/views/system/config/components/SensitiveSection.vue.js +2 -2
  286. package/dist/views/system/config/components/SensitiveSection2.vue.js +107 -102
  287. package/dist/views/system/config/components/SensitiveSection2.vue.js.map +1 -1
  288. package/dist/views/system/config/components/UploadSection.vue.js +2 -2
  289. package/dist/views/system/config/components/UploadSection2.vue.js +86 -77
  290. package/dist/views/system/config/components/UploadSection2.vue.js.map +1 -1
  291. package/dist/views/system/config/components/WatermarkSection.vue.js +8 -0
  292. package/dist/views/system/config/components/WatermarkSection.vue.js.map +1 -0
  293. package/dist/views/system/config/components/WatermarkSection2.vue.js +284 -0
  294. package/dist/views/system/config/components/WatermarkSection2.vue.js.map +1 -0
  295. package/dist/views/system/config/draft.d.ts +2 -2
  296. package/dist/views/system/config/draft.js.map +1 -1
  297. package/dist/views/system/config/groups.d.ts +4 -1
  298. package/dist/views/system/config/groups.js +54 -49
  299. package/dist/views/system/config/groups.js.map +1 -1
  300. package/dist/views/system/config/index.vue.js +3 -2
  301. package/dist/views/system/config/index.vue.js.map +1 -1
  302. package/dist/views/system/config/index2.vue.js +173 -148
  303. package/dist/views/system/config/index2.vue.js.map +1 -1
  304. package/dist/views/system/config/layoutMode.d.ts +23 -0
  305. package/dist/views/system/config/layoutMode.js +28 -0
  306. package/dist/views/system/config/layoutMode.js.map +1 -0
  307. package/dist/views/system/dict/index.vue.js +2 -2
  308. package/dist/views/system/dict/index2.vue.js +471 -366
  309. package/dist/views/system/dict/index2.vue.js.map +1 -1
  310. package/dist/views/system/file/index2.vue.js +91 -76
  311. package/dist/views/system/file/index2.vue.js.map +1 -1
  312. package/dist/views/system/job/index.vue.js +3 -3
  313. package/dist/views/system/job/index2.vue.js +897 -828
  314. package/dist/views/system/job/index2.vue.js.map +1 -1
  315. package/dist/views/system/job-log/components/AttemptTable.vue.d.ts +8 -0
  316. package/dist/views/system/job-log/components/AttemptTable.vue.js +5 -0
  317. package/dist/views/system/job-log/components/AttemptTable.vue.js.map +1 -0
  318. package/dist/views/system/job-log/components/AttemptTable2.vue.js +54 -0
  319. package/dist/views/system/job-log/components/AttemptTable2.vue.js.map +1 -0
  320. package/dist/views/system/job-log/index.vue.js +2 -2
  321. package/dist/views/system/job-log/index2.vue.js +193 -207
  322. package/dist/views/system/job-log/index2.vue.js.map +1 -1
  323. package/dist/views/system/job-log/runStatus.d.ts +13 -0
  324. package/dist/views/system/job-log/runStatus.js +26 -0
  325. package/dist/views/system/job-log/runStatus.js.map +1 -0
  326. package/dist/views/system/job-monitor/index.vue.js +2 -2
  327. package/dist/views/system/job-monitor/index2.vue.js +172 -180
  328. package/dist/views/system/job-monitor/index2.vue.js.map +1 -1
  329. package/dist/views/system/log/exception/index.vue.js +2 -2
  330. package/dist/views/system/log/exception/index2.vue.js +135 -96
  331. package/dist/views/system/log/exception/index2.vue.js.map +1 -1
  332. package/dist/views/system/log/login/index2.vue.js +62 -41
  333. package/dist/views/system/log/login/index2.vue.js.map +1 -1
  334. package/dist/views/system/log/op/index.vue.js +2 -2
  335. package/dist/views/system/log/op/index2.vue.js +200 -162
  336. package/dist/views/system/log/op/index2.vue.js.map +1 -1
  337. package/dist/views/system/menu/components/ButtonManager.vue.js +2 -2
  338. package/dist/views/system/menu/components/ButtonManager2.vue.js +206 -190
  339. package/dist/views/system/menu/components/ButtonManager2.vue.js.map +1 -1
  340. package/dist/views/system/menu/components/MenuFormModal.vue.js +2 -2
  341. package/dist/views/system/menu/components/MenuFormModal2.vue.js +127 -118
  342. package/dist/views/system/menu/components/MenuFormModal2.vue.js.map +1 -1
  343. package/dist/views/system/menu/index.vue.js +1 -1
  344. package/dist/views/system/menu/index2.vue.js +216 -183
  345. package/dist/views/system/menu/index2.vue.js.map +1 -1
  346. package/dist/views/system/module/index.vue.js +1 -1
  347. package/dist/views/system/module/index2.vue.js +177 -144
  348. package/dist/views/system/module/index2.vue.js.map +1 -1
  349. package/dist/views/system/monitor/index.vue.js +2 -2
  350. package/dist/views/system/monitor/index2.vue.js +134 -149
  351. package/dist/views/system/monitor/index2.vue.js.map +1 -1
  352. package/dist/views/system/notice/index.vue.js +1 -1
  353. package/dist/views/system/notice/index2.vue.js +209 -181
  354. package/dist/views/system/notice/index2.vue.js.map +1 -1
  355. package/dist/views/system/org/index.vue.js +1 -1
  356. package/dist/views/system/org/index2.vue.js +278 -248
  357. package/dist/views/system/org/index2.vue.js.map +1 -1
  358. package/dist/views/system/position/index.vue.js +5 -2
  359. package/dist/views/system/position/index.vue.js.map +1 -1
  360. package/dist/views/system/position/index2.vue.js +128 -92
  361. package/dist/views/system/position/index2.vue.js.map +1 -1
  362. package/dist/views/system/recycle/index.vue.js +2 -2
  363. package/dist/views/system/recycle/index2.vue.js +90 -67
  364. package/dist/views/system/recycle/index2.vue.js.map +1 -1
  365. package/dist/views/system/role/components/GrantMenuSheet.vue.d.ts +20 -0
  366. package/dist/views/system/role/components/GrantMenuSheet.vue.js +8 -0
  367. package/dist/views/system/role/components/GrantMenuSheet.vue.js.map +1 -0
  368. package/dist/views/system/role/components/GrantMenuSheet2.vue.js +117 -0
  369. package/dist/views/system/role/components/GrantMenuSheet2.vue.js.map +1 -0
  370. package/dist/views/system/role/components/GrantMenuTable.vue.d.ts +6 -4
  371. package/dist/views/system/role/components/GrantMenuTable.vue.js +2 -2
  372. package/dist/views/system/role/components/GrantMenuTable2.vue.js +279 -177
  373. package/dist/views/system/role/components/GrantMenuTable2.vue.js.map +1 -1
  374. package/dist/views/system/role/components/MatchText.vue.d.ts +7 -0
  375. package/dist/views/system/role/components/MatchText.vue.js +8 -0
  376. package/dist/views/system/role/components/MatchText.vue.js.map +1 -0
  377. package/dist/views/system/role/components/MatchText2.vue.js +29 -0
  378. package/dist/views/system/role/components/MatchText2.vue.js.map +1 -0
  379. package/dist/views/system/role/components/grantMenuGroups.d.ts +36 -0
  380. package/dist/views/system/role/components/grantMenuGroups.js +110 -48
  381. package/dist/views/system/role/components/grantMenuGroups.js.map +1 -1
  382. package/dist/views/system/role/index.vue.js +5 -2
  383. package/dist/views/system/role/index.vue.js.map +1 -1
  384. package/dist/views/system/role/index2.vue.js +181 -165
  385. package/dist/views/system/role/index2.vue.js.map +1 -1
  386. package/dist/views/system/session/index2.vue.js +75 -49
  387. package/dist/views/system/session/index2.vue.js.map +1 -1
  388. package/dist/views/system/user/components/ResetPasswordModal.vue.js +2 -2
  389. package/dist/views/system/user/components/ResetPasswordModal2.vue.js +2 -0
  390. package/dist/views/system/user/components/ResetPasswordModal2.vue.js.map +1 -1
  391. package/dist/views/system/user/components/UserFormModal.vue.js +2 -2
  392. package/dist/views/system/user/components/UserFormModal2.vue.js +77 -76
  393. package/dist/views/system/user/components/UserFormModal2.vue.js.map +1 -1
  394. package/dist/views/system/user/index.vue.js +2 -2
  395. package/dist/views/system/user/index2.vue.js +362 -275
  396. package/dist/views/system/user/index2.vue.js.map +1 -1
  397. package/package.json +3 -5
  398. package/dist/components/SelectTable/index.vue.d.ts +0 -76
  399. package/dist/components/SelectTable/index2.vue.js +0 -256
  400. package/dist/components/SelectTable/index2.vue.js.map +0 -1
  401. package/dist/composables/useTableRowSort.d.ts +0 -20
  402. package/dist/composables/useTableRowSort.js +0 -59
  403. package/dist/composables/useTableRowSort.js.map +0 -1
  404. package/dist/layouts/LayoutModeCards.vue.js +0 -8
  405. package/dist/layouts/LayoutModeCards.vue.js.map +0 -1
  406. package/dist/layouts/LayoutModeCards2.vue.js +0 -67
  407. package/dist/layouts/LayoutModeCards2.vue.js.map +0 -1
  408. package/dist/layouts/SettingRow.vue.d.ts +0 -16
  409. package/dist/layouts/SettingRow.vue.js +0 -8
  410. package/dist/layouts/SettingRow.vue.js.map +0 -1
  411. package/dist/layouts/SettingRow2.vue.js +0 -23
  412. package/dist/layouts/SettingRow2.vue.js.map +0 -1
  413. package/dist/views/login/skins/AuroraGlass.vue.js +0 -8
  414. package/dist/views/login/skins/AuroraGlass.vue.js.map +0 -1
  415. package/dist/views/login/skins/AuroraGlass2.vue.js +0 -80
  416. package/dist/views/login/skins/AuroraGlass2.vue.js.map +0 -1
  417. package/dist/views/login/skins/SplitPanel.vue.d.ts +0 -3
  418. package/dist/views/login/skins/SplitPanel.vue.js +0 -8
  419. package/dist/views/login/skins/SplitPanel.vue.js.map +0 -1
  420. package/dist/views/login/skins/SplitPanel2.vue.js +0 -65
  421. package/dist/views/login/skins/SplitPanel2.vue.js.map +0 -1
  422. package/dist/views/login/skins/Spotlight.vue.d.ts +0 -3
  423. package/dist/views/login/skins/Spotlight.vue.js +0 -8
  424. package/dist/views/login/skins/Spotlight.vue.js.map +0 -1
  425. package/dist/views/login/skins/Spotlight2.vue.js +0 -36
  426. package/dist/views/login/skins/Spotlight2.vue.js.map +0 -1
  427. package/dist/views/login/skins.d.ts +0 -8
  428. package/dist/views/login/skins.js +0 -13
  429. package/dist/views/login/skins.js.map +0 -1
  430. /package/dist/components/{SelectTable → TableTotal}/index.vue.js.map +0 -0
  431. /package/dist/layouts/{LayoutModeCards.vue.d.ts → AccentPicker.vue.d.ts} +0 -0
  432. /package/dist/views/{login/skins/AuroraGlass.vue.d.ts → system/config/components/WatermarkSection.vue.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accentTokens.js","sources":["../../src/theme/accentTokens.ts"],"sourcesContent":["import { chartPalette, derivePrimary, fieldOf, mix, readable, rgba, shift, FIELD } from './mix'\n\n/**\n * 强调色 → 一整套随强调色变化的令牌。\n *\n * 两个消费者共用这一份结果,不各算一遍:\n * - `useTheme.applyAccentVars` 把 `css` 逐项写到 `<html>` 的 style 上(裸 CSS 与页面 scoped 里的 var(--sel-bg) 等换色);\n * - `naive-theme.ts` 取 `signal` / `acc` / `onAcc` / `hover` / `pressed` / `linkFg` / `activeFg` / `ring` 喂 Naive overrides。\n * 两边各算一份的话,改一处忘另一处就是裸 CSS 与 Naive 组件的强调色不同步,而没有任何东西会报错。\n */\nexport interface AccentDerived {\n /** 原始强调色(信号色 = 强调色:图标、聚焦环、数据线、菜单选中底)。 */\n signal: string\n /** 实心控件底色 = `solid(signal)`,明暗同值。 */\n acc: string\n /** 压在 `acc` 上的字色。 */\n onAcc: string\n hover: string\n pressed: string\n /** 强调色当「选中文字 / 侧栏图标」用的可读版:浅色压暗到对白底 ≥ 4.5:1,深色往白提亮 35%。 */\n activeFg: string\n /** 文字按钮 / 行内操作按钮 / 链接的字色。 */\n linkFg: string\n /** 聚焦环 `0 0 0 3px rgba(signal, α)`。 */\n ring: string\n /** 要写到 `<html>` 的 CSS 变量(名 → 值)。 */\n css: Record<string, string>\n}\n\n/** 应用内环境光四团的不透明度(深色底更吃得住颜色,但噪点和玻璃叠上去会再提一档,所以比浅色略收)。 */\nconst AMBIENT_OP = {\n light: [0.2, 0.15, 0.13, 0.14],\n dark: [0.17, 0.13, 0.11, 0.12],\n} as const\n\n/** 登录页色场四团的不透明度:比应用内浓得多,还会漂。 */\nconst DESK_OP = {\n light: [0.55, 0.45, 0.5, 0.34],\n dark: [0.85, 0.7, 0.6, 0.55],\n} as const\n\nexport function deriveAccentTokens(accent: string, dark: boolean): AccentDerived {\n const signal = accent\n const p = derivePrimary(accent, dark)\n const acc = p.primary\n\n // 深色:往白提亮 35%;浅色:压暗到可读。activeFg(侧栏 / 选中)与 linkFg(文字按钮)当前取值相同,\n // 保留两个出口,以后要分化时不用动调用方。\n const activeFg = dark ? mix(signal, '#FFFFFF', 0.35) : readable(signal)\n const linkFg = dark ? mix(signal, '#FFFFFF', 0.35) : readable(signal)\n const ring = `0 0 0 3px ${rgba(signal, dark ? 0.35 : 0.22)}`\n\n const field = fieldOf(signal)\n const ambientOp = dark ? AMBIENT_OP.dark : AMBIENT_OP.light\n const deskOp = dark ? DESK_OP.dark : DESK_OP.light\n\n const css: Record<string, string> = {\n '--accent': signal,\n '--signal': signal,\n '--signal-glow': rgba(signal, dark ? 0.55 : 0.35),\n '--acc-solid': acc,\n '--on-acc': p.on,\n '--acc-hover': p.hover,\n '--acc-pressed': p.pressed,\n // 选中态令牌:模块卡片 / 表格选中行等「当前项」统一用,颜色跟信号色走\n '--sel-bg': rgba(signal, dark ? 0.14 : 0.06),\n '--sel-ring': rgba(signal, dark ? 0.6 : 0.5),\n '--sel-halo': rgba(signal, dark ? 0.16 : 0.1),\n '--sel-fg': activeFg,\n // 页签 / 列表当前项\n '--tab-active-bg': rgba(signal, dark ? 0.18 : 0.08),\n '--tab-active-fg': activeFg,\n '--tab-active-ring': rgba(signal, dark ? 0.35 : 0.22),\n // 顶部页签激活态。深色三项是固定的蓝(rgba(59,155,255,.2) / #FFF / rgba(130,190,255,.65)),不随强调色走;\n // 浅色三项随强调色。\n '--tab-on-bg': dark ? 'rgba(59, 155, 255, 0.2)' : rgba(signal, 0.1),\n '--tab-on-fg': dark ? '#ffffff' : readable(signal),\n '--tab-on-ring': dark ? 'rgba(130, 190, 255, 0.65)' : rgba(signal, 0.5),\n // 登录页主按钮渐变 / 标语高亮的第二色:走强调色本色位移,石墨时不退回蓝(见 fieldSrc)\n '--login-accent-2': shift(signal, FIELD[1][0], FIELD[1][1], FIELD[1][2]),\n }\n field.forEach((c, i) => {\n css[`--ambient-${i + 1}`] = rgba(c, ambientOp[i]!)\n css[`--desk-${i + 1}`] = rgba(c, deskOp[i]!)\n })\n // 图表数据色(折线 / 柱 / 饼的系列色,工作台统计卡的图标色也用它):强调色的邻近色相,不复用状态语义色\n chartPalette(signal, dark).forEach((c, i) => {\n css[`--chart-${i + 1}`] = c\n })\n\n return {\n signal,\n acc,\n onAcc: p.on,\n hover: p.hover,\n pressed: p.pressed,\n activeFg,\n linkFg,\n ring,\n css,\n }\n}\n"],"names":["AMBIENT_OP","DESK_OP","deriveAccentTokens","accent","dark","signal","p","derivePrimary","acc","activeFg","mix","readable","linkFg","ring","rgba","field","fieldOf","ambientOp","deskOp","css","shift","FIELD","c","i","chartPalette"],"mappings":";AA8BA,MAAMA,IAAa;AAAA,EACjB,OAAO,CAAC,KAAK,MAAM,MAAM,IAAI;AAAA,EAC7B,MAAM,CAAC,MAAM,MAAM,MAAM,IAAI;AAC/B,GAGMC,IAAU;AAAA,EACd,OAAO,CAAC,MAAM,MAAM,KAAK,IAAI;AAAA,EAC7B,MAAM,CAAC,MAAM,KAAK,KAAK,IAAI;AAC7B;AAEO,SAASC,EAAmBC,GAAgBC,GAA8B;AAC/E,QAAMC,IAASF,GACTG,IAAIC,EAAcJ,GAAQC,CAAI,GAC9BI,IAAMF,EAAE,SAIRG,IAAWL,IAAOM,EAAIL,GAAQ,WAAW,IAAI,IAAIM,EAASN,CAAM,GAChEO,IAASR,IAAOM,EAAIL,GAAQ,WAAW,IAAI,IAAIM,EAASN,CAAM,GAC9DQ,IAAO,aAAaC,EAAKT,GAAQD,IAAO,OAAO,IAAI,CAAC,IAEpDW,IAAQC,EAAQX,CAAM,GACtBY,IAAYb,IAAOJ,EAAW,OAAOA,EAAW,OAChDkB,IAASd,IAAOH,EAAQ,OAAOA,EAAQ,OAEvCkB,IAA8B;AAAA,IAClC,YAAYd;AAAA,IACZ,YAAYA;AAAA,IACZ,iBAAiBS,EAAKT,GAAQD,IAAO,OAAO,IAAI;AAAA,IAChD,eAAeI;AAAA,IACf,YAAYF,EAAE;AAAA,IACd,eAAeA,EAAE;AAAA,IACjB,iBAAiBA,EAAE;AAAA;AAAA,IAEnB,YAAYQ,EAAKT,GAAQD,IAAO,OAAO,IAAI;AAAA,IAC3C,cAAcU,EAAKT,GAAQD,IAAO,MAAM,GAAG;AAAA,IAC3C,cAAcU,EAAKT,GAAQD,IAAO,OAAO,GAAG;AAAA,IAC5C,YAAYK;AAAA;AAAA,IAEZ,mBAAmBK,EAAKT,GAAQD,IAAO,OAAO,IAAI;AAAA,IAClD,mBAAmBK;AAAA,IACnB,qBAAqBK,EAAKT,GAAQD,IAAO,OAAO,IAAI;AAAA;AAAA;AAAA,IAGpD,eAAeA,IAAO,4BAA4BU,EAAKT,GAAQ,GAAG;AAAA,IAClE,eAAeD,IAAO,YAAYO,EAASN,CAAM;AAAA,IACjD,iBAAiBD,IAAO,8BAA8BU,EAAKT,GAAQ,GAAG;AAAA;AAAA,IAEtE,oBAAoBe,EAAMf,GAAQgB,EAAM,CAAC,EAAE,CAAC,GAAGA,EAAM,CAAC,EAAE,CAAC,GAAGA,EAAM,CAAC,EAAE,CAAC,CAAC;AAAA,EAAA;AAEzE,SAAAN,EAAM,QAAQ,CAACO,GAAGC,MAAM;AACtB,IAAAJ,EAAI,aAAaI,IAAI,CAAC,EAAE,IAAIT,EAAKQ,GAAGL,EAAUM,CAAC,CAAE,GACjDJ,EAAI,UAAUI,IAAI,CAAC,EAAE,IAAIT,EAAKQ,GAAGJ,EAAOK,CAAC,CAAE;AAAA,EAC7C,CAAC,GAEDC,EAAanB,GAAQD,CAAI,EAAE,QAAQ,CAACkB,GAAGC,MAAM;AAC3C,IAAAJ,EAAI,WAAWI,IAAI,CAAC,EAAE,IAAID;AAAA,EAC5B,CAAC,GAEM;AAAA,IACL,QAAAjB;AAAA,IACA,KAAAG;AAAA,IACA,OAAOF,EAAE;AAAA,IACT,OAAOA,EAAE;AAAA,IACT,SAASA,EAAE;AAAA,IACX,UAAAG;AAAA,IACA,QAAAG;AAAA,IACA,MAAAC;AAAA,IACA,KAAAM;AAAA,EAAA;AAEJ;"}
@@ -1,2 +1,22 @@
1
- export declare const ACCENTS: readonly ["#14B8A6", "#646CFF", "#7C5CFF", "#0EA5E9", "#EC4899", "#F97316"];
1
+ /**
2
+ * 6 个强调色候选,全部取自 macOS 系统色:
3
+ * 蓝 #0A84FF(默认)、靛蓝 #5856D6、紫 #AF52DE、深青 #30B0C7、墨绿 #30D158、石墨 #8E8E93。
4
+ *
5
+ * **取值标准是原值亮度落在 0.14–0.36**,不是看色相好不好看:这一段 `solid()` 之后色相不跑偏,
6
+ * 而且六个色的主按钮一律深底白字。亮度 > 0.5 的色(薄荷 #63E6E2、亮青 #64D2FF、黄 #FFD60A)
7
+ * 会走 `solid()`「保留原色配深字」的分支,换个强调色主按钮的字色就从白翻成黑,所以一个都不收。
8
+ * 加新候选色前先算 `solid()` 的结果,别只看原始色相。
9
+ *
10
+ * 浅色 / 深色共用同一个值。品牌 Logo 的固定靛蓝不在这里(Logo 不随用户换色)。
11
+ */
12
+ export declare const ACCENTS: readonly ["#0A84FF", "#5856D6", "#AF52DE", "#30B0C7", "#30D158", "#8E8E93"];
2
13
  export type Accent = (typeof ACCENTS)[number];
14
+ export interface AccentMeta {
15
+ color: Accent;
16
+ /** 语言包键(settings.accentName.<key>);深青 / 墨绿压暗幅度大,色块里看到的不是 macOS 系统设置里那两个亮色,所以不叫青色 / 绿色。 */
17
+ key: 'blue' | 'indigo' | 'purple' | 'teal' | 'green' | 'graphite';
18
+ /** 色块预览用的颜色 = `solid(color)`:和开关 / 主按钮等实心控件同一套压暗规则,预览才和实际效果对得上。 */
19
+ dot: string;
20
+ }
21
+ /** 外观面板的色块清单(顺序同 ACCENTS)。`dot` 在定义时预计算。 */
22
+ export declare const ACCENT_META: readonly AccentMeta[];
@@ -1,5 +1,14 @@
1
- const C = ["#14B8A6", "#646CFF", "#7C5CFF", "#0EA5E9", "#EC4899", "#F97316"];
1
+ import { solid as t } from "./mix.js";
2
+ const o = ["#0A84FF", "#5856D6", "#AF52DE", "#30B0C7", "#30D158", "#8E8E93"], p = [
3
+ ["#0A84FF", "blue"],
4
+ ["#5856D6", "indigo"],
5
+ ["#AF52DE", "purple"],
6
+ ["#30B0C7", "teal"],
7
+ ["#30D158", "green"],
8
+ ["#8E8E93", "graphite"]
9
+ ].map(([E, e]) => ({ color: E, key: e, dot: t(E) }));
2
10
  export {
3
- C as ACCENTS
11
+ o as ACCENTS,
12
+ p as ACCENT_META
4
13
  };
5
14
  //# sourceMappingURL=accents.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"accents.js","sources":["../../src/theme/accents.ts"],"sourcesContent":["// 6 主色候选(design_handoff §可配置项)。默认 = 第一个青绿 #14B8A6;\n// 靛蓝 #646CFF 保留为可选手项(品牌 Logo 固定品牌色、不随用户换的 accent 变)。\nexport const ACCENTS = ['#14B8A6', '#646CFF', '#7C5CFF', '#0EA5E9', '#EC4899', '#F97316'] as const\n\nexport type Accent = (typeof ACCENTS)[number]\n"],"names":["ACCENTS"],"mappings":"AAEO,MAAMA,IAAU,CAAC,WAAW,WAAW,WAAW,WAAW,WAAW,SAAS;"}
1
+ {"version":3,"file":"accents.js","sources":["../../src/theme/accents.ts"],"sourcesContent":["import { solid } from './mix'\n\n/**\n * 6 个强调色候选,全部取自 macOS 系统色:\n * 蓝 #0A84FF(默认)、靛蓝 #5856D6、紫 #AF52DE、深青 #30B0C7、墨绿 #30D158、石墨 #8E8E93。\n *\n * **取值标准是原值亮度落在 0.14–0.36**,不是看色相好不好看:这一段 `solid()` 之后色相不跑偏,\n * 而且六个色的主按钮一律深底白字。亮度 > 0.5 的色(薄荷 #63E6E2、亮青 #64D2FF、黄 #FFD60A)\n * 会走 `solid()`「保留原色配深字」的分支,换个强调色主按钮的字色就从白翻成黑,所以一个都不收。\n * 加新候选色前先算 `solid()` 的结果,别只看原始色相。\n *\n * 浅色 / 深色共用同一个值。品牌 Logo 的固定靛蓝不在这里(Logo 不随用户换色)。\n */\nexport const ACCENTS = ['#0A84FF', '#5856D6', '#AF52DE', '#30B0C7', '#30D158', '#8E8E93'] as const\n\nexport type Accent = (typeof ACCENTS)[number]\n\nexport interface AccentMeta {\n color: Accent\n /** 语言包键(settings.accentName.<key>);深青 / 墨绿压暗幅度大,色块里看到的不是 macOS 系统设置里那两个亮色,所以不叫青色 / 绿色。 */\n key: 'blue' | 'indigo' | 'purple' | 'teal' | 'green' | 'graphite'\n /** 色块预览用的颜色 = `solid(color)`:和开关 / 主按钮等实心控件同一套压暗规则,预览才和实际效果对得上。 */\n dot: string\n}\n\n/** 外观面板的色块清单(顺序同 ACCENTS)。`dot` 在定义时预计算。 */\nexport const ACCENT_META: readonly AccentMeta[] = (\n [\n ['#0A84FF', 'blue'],\n ['#5856D6', 'indigo'],\n ['#AF52DE', 'purple'],\n ['#30B0C7', 'teal'],\n ['#30D158', 'green'],\n ['#8E8E93', 'graphite'],\n ] as const\n).map(([color, key]) => ({ color, key, dot: solid(color) }))\n"],"names":["ACCENTS","ACCENT_META","color","key","solid"],"mappings":";AAaO,MAAMA,IAAU,CAAC,WAAW,WAAW,WAAW,WAAW,WAAW,SAAS,GAa3EC,IACX;AAAA,EACE,CAAC,WAAW,MAAM;AAAA,EAClB,CAAC,WAAW,QAAQ;AAAA,EACpB,CAAC,WAAW,QAAQ;AAAA,EACpB,CAAC,WAAW,MAAM;AAAA,EAClB,CAAC,WAAW,OAAO;AAAA,EACnB,CAAC,WAAW,UAAU;AACxB,EACA,IAAI,CAAC,CAACC,GAAOC,CAAG,OAAO,EAAE,OAAAD,GAAO,KAAAC,GAAK,KAAKC,EAAMF,CAAK,IAAI;"}
@@ -1,26 +1,77 @@
1
1
  /** 在 a、b 之间按 t∈[0,1] 线性插值(sRGB 分量)。t=0→a,t=1→b。 */
2
2
  export declare function mix(a: string, b: string, t: number): string;
3
+ /** WCAG 相对亮度(0 黑 … 1 白)。 */
4
+ export declare function luminance(hex: string): number;
5
+ /** WCAG 对比度(1…21)。 */
6
+ export declare function contrast(a: string, b: string): number;
7
+ /**
8
+ * 把强调色当文字用时的可读版:在 bg 上逐步混黑,直到对比度 ≥ 4.5:1,色相不变。
9
+ * 浅色下的链接 / 选中文字 / 侧栏图标用它;深色背景上不要用(混黑只会更糟),深色走「往白提亮」。
10
+ */
11
+ export declare function readable(c: string, bg?: string): string;
12
+ /**
13
+ * 实心控件(主按钮、勾选框、开关、进度条)的底色:亮度 > 0.5 的亮色直接用(配深字),
14
+ * 其余压暗到白字 ≥ 4.5:1。**浅色 / 深色用同一个值**,切换外观模式时强调色不变。
15
+ * 6 个候选色的亮度都落在 0.14–0.36,所以实际都走「压暗」这一支、主按钮一律深底白字。
16
+ */
17
+ export declare function solid(c: string): string;
3
18
  export interface PrimaryRamp {
19
+ /** 实心主色(= `solid(accent)`,明暗同值)。 */
4
20
  primary: string;
5
21
  hover: string;
6
22
  pressed: string;
7
- /** 浅底(选中背景 / 标签底)。 */
23
+ /** 浅底(选中背景 / 标签底)的**实色**版;裸 CSS 里的选中底改用半透明的 `--sel-bg`,这里保留给调用方自取。 */
8
24
  light: string;
25
+ /** 压在 `primary` 上的字色:深底白字,极端情况(亮度 > 0.5)配近黑。 */
26
+ on: string;
9
27
  }
10
28
  /**
11
- * accent → 主色四态(DESIGN.md)。暗色先把 accent 提亮一档,再派生 hover/pressed/light。
29
+ * accent → 主色四态 + 字色。规则:
30
+ * primary = solid(accent);hover 往白提 10%(亮色底改往黑压 8%);pressed 往黑压 12%。
31
+ * 浅色 / 深色同一个值,深色下不对 accent 另做提亮。
12
32
  *
13
- * 派生只在这一处:`naive-theme.ts`(取前三态,喂 Naive overrides)与 `useTheme.ts` 的 `applyPrimaryVars`
14
- * (取四态,写 CSS 变量)都调它。两边各算一份的话,改一处忘另一处 = 裸 CSS 与 Naive 组件主色不同步,
15
- * **而没有任何东西会报错**。
33
+ * 派生只在这一处:`naive-theme.ts`(喂 Naive overrides)与 `accentTokens.ts`(写 CSS 变量)都调它。
34
+ * 两边各算一份的话,改一处忘另一处 = 裸 CSS 与 Naive 组件主色不同步,**而没有任何东西会报错**。
16
35
  *
17
36
  * `darkContainer` 只在暗色下参与 `light`(浅底要往容器色靠,否则在暗底上白得刺眼);亮色下忽略。
18
- * 调用方通常传当前的 `--color-bg-container`。只要前三态的调用方(Naive)不关心 `light`,多算一次 mix 而已。
19
37
  */
20
38
  export declare function derivePrimary(accent: string, dark: boolean, darkContainer?: string): PrimaryRamp;
21
- /** accent → rgba(...,alpha),用于发光 / 渐变。 */
39
+ /** accent → rgba(...,alpha),用于发光 / 渐变 / 选中淡底。 */
22
40
  export declare function rgba(hex: string, alpha: number): string;
23
41
  /** 英雄主按钮渐变(仅登录页 / 欢迎横幅 / 头像)。 */
24
42
  export declare function btnGrad(accent: string): string;
25
43
  /** 英雄按钮发光阴影。 */
26
44
  export declare function glowSh(accent: string): string;
45
+ /** hex → [色相 0–360, 饱和度 0–1, 明度 0–1]。 */
46
+ export declare function hexToHsl(hex: string): [number, number, number];
47
+ export declare function hslToHex(h: number, s: number, l: number): string;
48
+ /** 邻近色位移:色相窄幅旋转 + 提亮 + 轻微降饱和。色场四团光和应用内环境光都用它从强调色推导。 */
49
+ export declare function shift(c: string, dh: number, dl: number, ds: number): string;
50
+ /**
51
+ * 色场四团光相对强调色的位移量 [Δ色相, Δ明度, Δ饱和]。这四组数按默认蓝下的目标色反解得到,
52
+ * 所以默认蓝的观感是定稿的(与目标色逐团差 1–2 个 RGB 单位),换成别的强调色才会有区别。
53
+ * 按色相位移、而不是 mix 向写死的颜色(如 #8B5CF6 / #22D3EE),是为了紫色等强调色不会塌成一片同色(混向固定色时四团里三团同色)。
54
+ */
55
+ export declare const FIELD: ReadonlyArray<readonly [number, number, number]>;
56
+ /**
57
+ * 色场的取色源:近中性的强调色(石墨,饱和度 2%)旋转色相没有意义,转出来还是灰,整屏会变成一块死灰,
58
+ * 退回默认蓝——这也正是 macOS 的行为:石墨只把控件去色,桌面壁纸照旧有颜色。
59
+ * 注意只有色场退回,`--login-accent-2`(登录页主按钮渐变、标语高亮)仍走石墨本色,不然会冒出一个蓝按钮。
60
+ */
61
+ export declare function fieldSrc(c: string): string;
62
+ /** accent → 色场四个色(登录页 `--desk-1..4` 与应用内 `--ambient-1..4` 同源,各自再乘自己的不透明度)。 */
63
+ export declare function fieldOf(c: string): string[];
64
+ /**
65
+ * 数据色相对强调色的 [色相偏移(度), 饱和度偏移]。顺序 = 系列顺序:第 1 个就是强调色本色,
66
+ * 第 2、3 个往两侧拉开最大(折线只有两个系列时要一眼分得开),后面依次外扩。
67
+ * 偏移控制在 ±115° 内,落在蓝 → 青 / 靛 → 紫 / 绿这一带,不会出现红 / 橙:
68
+ * 红橙是状态语义色(危险 / 警告),拿来画「权限点」「在线会话」会让人以为出了问题。
69
+ * 实心主色饱和度很高(默认蓝约 0.9),原样转色相会得到荧光品红 / 荧光绿,和柔和的玻璃界面打架,
70
+ * 所以偏得越远降得越多。
71
+ */
72
+ export declare const CHART_STEPS: ReadonlyArray<readonly [number, number]>;
73
+ /**
74
+ * accent → 6 个图表数据色。和色场同源:石墨(近中性)的强调色转色相没有意义,退回默认蓝(见 fieldSrc)。
75
+ * 基准色取实心主色(明暗同值),再逐个压到对卡片底 ≥ 3:1;`darkCard` 是暗色卡片底色(`--bg-card`)。
76
+ */
77
+ export declare function chartPalette(accent: string, dark: boolean, darkCard?: string): string[];
package/dist/theme/mix.js CHANGED
@@ -1,43 +1,128 @@
1
- function s(r) {
2
- return Math.max(0, Math.min(255, Math.round(r)));
1
+ function M(n) {
2
+ return Math.max(0, Math.min(255, Math.round(n)));
3
3
  }
4
- function F(r) {
5
- let t = r.replace("#", "").trim();
6
- t.length === 3 && (t = t.split("").map((n) => n + n).join(""));
7
- const e = Number.parseInt(t, 16);
8
- return [e >> 16 & 255, e >> 8 & 255, e & 255];
4
+ function F(n) {
5
+ let r = n.replace("#", "").trim();
6
+ r.length === 3 && (r = r.split("").map((t) => t + t).join(""));
7
+ const o = Number.parseInt(r, 16);
8
+ return [o >> 16 & 255, o >> 8 & 255, o & 255];
9
9
  }
10
- function b(r, t, e) {
11
- return "#" + [r, t, e].map((n) => s(n).toString(16).padStart(2, "0")).join("");
10
+ function b(n, r, o) {
11
+ return "#" + [n, r, o].map((t) => M(t).toString(16).padStart(2, "0")).join("");
12
12
  }
13
- function o(r, t, e) {
14
- const [n, i, a] = F(r), [u, p, g] = F(t);
15
- return b(n + (u - n) * e, i + (p - i) * e, a + (g - a) * e);
13
+ function u(n, r, o) {
14
+ const [t, e, c] = F(n), [s, a, i] = F(r);
15
+ return b(t + (s - t) * o, e + (a - e) * o, c + (i - c) * o);
16
16
  }
17
- function f(r, t, e = "#1F2229") {
18
- const n = (t ? o(r, "#FFFFFF", 0.18) : r).toLowerCase();
17
+ function m(n) {
18
+ const [r, o, t] = F(n).map((e) => {
19
+ const c = e / 255;
20
+ return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
21
+ });
22
+ return 0.2126 * r + 0.7152 * o + 0.0722 * t;
23
+ }
24
+ function p(n, r) {
25
+ const o = m(n), t = m(r);
26
+ return (Math.max(o, t) + 0.05) / (Math.min(o, t) + 0.05);
27
+ }
28
+ function d(n, r = "#FFFFFF") {
29
+ let o = 0, t = n;
30
+ for (; p(t, r) < 4.5 && o < 1; )
31
+ o += 0.02, t = u(n, "#000000", o);
32
+ return t;
33
+ }
34
+ function C(n) {
35
+ return m(n) > 0.5 ? n : d(n);
36
+ }
37
+ function $(n, r, o = "#1F2229") {
38
+ const t = C(n).toLowerCase(), e = m(t) > 0.5;
19
39
  return {
20
- primary: n,
21
- hover: o(n, "#FFFFFF", 0.16),
22
- pressed: o(n, "#000000", 0.18),
23
- light: t ? o(n, e, 0.82) : o(n, "#FFFFFF", 0.9)
40
+ primary: t,
41
+ hover: e ? u(t, "#000000", 0.08) : u(t, "#FFFFFF", 0.1),
42
+ pressed: u(t, "#000000", 0.12),
43
+ light: r ? u(t, o, 0.82) : u(t, "#FFFFFF", 0.9),
44
+ on: e ? "#0a0a0b" : "#ffffff"
24
45
  };
25
46
  }
26
- function m(r, t) {
27
- const [e, n, i] = F(r);
28
- return `rgba(${e}, ${n}, ${i}, ${t})`;
47
+ function S(n, r) {
48
+ const [o, t, e] = F(n);
49
+ return `rgba(${o}, ${t}, ${e}, ${r})`;
50
+ }
51
+ function _(n) {
52
+ return `linear-gradient(135deg, ${n} 0%, ${u(n, "#8B5CF6", 0.55)} 55%, ${u(n, "#EC4899", 0.62)} 100%)`;
53
+ }
54
+ function w(n) {
55
+ return `0 6px 20px ${S(n, 0.42)}`;
56
+ }
57
+ function h(n) {
58
+ const [r, o, t] = F(n).map((g) => g / 255), e = Math.max(r, o, t), c = Math.min(r, o, t), s = e - c, a = (e + c) / 2;
59
+ let i = 0, f = 0;
60
+ return s && (f = a > 0.5 ? s / (2 - e - c) : s / (e + c), i = (e === r ? (o - t) / s + (o < t ? 6 : 0) : e === o ? (t - r) / s + 2 : (r - o) / s + 4) * 60), [i, f, a];
61
+ }
62
+ function T(n, r, o) {
63
+ const t = (n % 360 + 360) % 360, e = Math.max(0, Math.min(1, r)), c = Math.max(0, Math.min(1, o)), s = (1 - Math.abs(2 * c - 1)) * e, a = s * (1 - Math.abs(t / 60 % 2 - 1)), i = c - s / 2, f = t < 60 ? [s, a, 0] : t < 120 ? [a, s, 0] : t < 180 ? [0, s, a] : t < 240 ? [0, a, s] : t < 300 ? [a, 0, s] : [s, 0, a];
64
+ return b((f[0] + i) * 255, (f[1] + i) * 255, (f[2] + i) * 255);
65
+ }
66
+ function l(n, r, o, t) {
67
+ const [e, c, s] = h(n);
68
+ return T(e + r, c + t, s + o);
69
+ }
70
+ const A = [
71
+ [0, 0, 0],
72
+ [17, 0.12, -0.05],
73
+ [-11, 0.01, -0.07],
74
+ [35, 0.16, -0.08]
75
+ ], H = "#0A84FF";
76
+ function x(n) {
77
+ return h(n)[1] < 0.12 ? H : n;
78
+ }
79
+ function B(n) {
80
+ const r = x(n);
81
+ return A.map(([o, t, e]) => l(r, o, t, e));
82
+ }
83
+ const y = [
84
+ [0, 0],
85
+ [48, -0.16],
86
+ [-38, -0.14],
87
+ [96, -0.46],
88
+ [-76, -0.3],
89
+ [-112, -0.36]
90
+ ];
91
+ function L(n) {
92
+ const r = (n % 360 + 360) % 360;
93
+ return r >= 345 || r <= 45;
29
94
  }
30
- function c(r) {
31
- return `linear-gradient(135deg, ${r} 0%, ${o(r, "#8B5CF6", 0.55)} 55%, ${o(r, "#EC4899", 0.62)} 100%)`;
95
+ const E = 3;
96
+ function I(n, r, o, t) {
97
+ let e = n;
98
+ for (let c = 0; c < 24 && p(e, r) < o; c++)
99
+ e = l(e, 0, t ? 0.02 : -0.02, 0);
100
+ return e;
32
101
  }
33
- function h(r) {
34
- return `0 6px 20px ${m(r, 0.42)}`;
102
+ function N(n, r, o = "#1b2842") {
103
+ const t = $(x(n), r).primary, e = r ? o : "#FFFFFF", c = h(t)[0];
104
+ return y.map(([s, a]) => {
105
+ const i = L(c + s) ? -s : s;
106
+ return I(l(t, i, 0, a), e, E, r);
107
+ });
35
108
  }
36
109
  export {
37
- c as btnGrad,
38
- f as derivePrimary,
39
- h as glowSh,
40
- o as mix,
41
- m as rgba
110
+ y as CHART_STEPS,
111
+ A as FIELD,
112
+ _ as btnGrad,
113
+ N as chartPalette,
114
+ p as contrast,
115
+ $ as derivePrimary,
116
+ B as fieldOf,
117
+ x as fieldSrc,
118
+ w as glowSh,
119
+ h as hexToHsl,
120
+ T as hslToHex,
121
+ m as luminance,
122
+ u as mix,
123
+ d as readable,
124
+ S as rgba,
125
+ l as shift,
126
+ C as solid
42
127
  };
43
128
  //# sourceMappingURL=mix.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mix.js","sources":["../../src/theme/mix.ts"],"sourcesContent":["// 颜色派生规则(DESIGN.md 权威实现)。纯函数,无框架依赖。\n\nfunction clampByte(n: number): number {\n return Math.max(0, Math.min(255, Math.round(n)))\n}\n\nfunction parseHex(hex: string): [number, number, number] {\n let h = hex.replace('#', '').trim()\n if (h.length === 3)\n h = h\n .split('')\n .map(c => c + c)\n .join('')\n const n = Number.parseInt(h, 16)\n return [(n >> 16) & 255, (n >> 8) & 255, n & 255]\n}\n\nfunction toHex(r: number, g: number, b: number): string {\n return '#' + [r, g, b].map(v => clampByte(v).toString(16).padStart(2, '0')).join('')\n}\n\n/** 在 a、b 之间按 t∈[0,1] 线性插值(sRGB 分量)。t=0→a,t=1→b。 */\nexport function mix(a: string, b: string, t: number): string {\n const [ar, ag, ab] = parseHex(a)\n const [br, bg, bb] = parseHex(b)\n return toHex(ar + (br - ar) * t, ag + (bg - ag) * t, ab + (bb - ab) * t)\n}\n\nexport interface PrimaryRamp {\n primary: string\n hover: string\n pressed: string\n /** 浅底(选中背景 / 标签底)。 */\n light: string\n}\n\n/**\n * accent → 主色四态(DESIGN.md)。暗色先把 accent 提亮一档,再派生 hover/pressed/light。\n *\n * 派生只在这一处:`naive-theme.ts`(取前三态,喂 Naive overrides)与 `useTheme.ts` 的 `applyPrimaryVars`\n * (取四态,写 CSS 变量)都调它。两边各算一份的话,改一处忘另一处 = 裸 CSS 与 Naive 组件主色不同步,\n * **而没有任何东西会报错**。\n *\n * `darkContainer` 只在暗色下参与 `light`(浅底要往容器色靠,否则在暗底上白得刺眼);亮色下忽略。\n * 调用方通常传当前的 `--color-bg-container`。只要前三态的调用方(Naive)不关心 `light`,多算一次 mix 而已。\n */\nexport function derivePrimary(\n accent: string,\n dark: boolean,\n darkContainer = '#1F2229',\n): PrimaryRamp {\n // 亮色下 primary 就是 accent 本身(不派生),但**要统一转小写**:其余三个都经 `toHex` 出小写,\n // 而 accent 通常是色板里的大写字面量。不归一的话输出的大小写会随主题变化,任何拿 `===` 直接比的\n // 地方就会得到一个**只在亮色下失败**的不一致。CSS 不区分大小写,归一无副作用\n // (已核实:全仓唯一的 accent `===` 比较在 SettingsDrawer 色板选中态,两边都是原始 accent,不经此函数)。\n const primary = (dark ? mix(accent, '#FFFFFF', 0.18) : accent).toLowerCase()\n return {\n primary,\n hover: mix(primary, '#FFFFFF', 0.16),\n pressed: mix(primary, '#000000', 0.18),\n light: dark ? mix(primary, darkContainer, 0.82) : mix(primary, '#FFFFFF', 0.9),\n }\n}\n\n/** accent → rgba(...,alpha),用于发光 / 渐变。 */\nexport function rgba(hex: string, alpha: number): string {\n const [r, g, b] = parseHex(hex)\n return `rgba(${r}, ${g}, ${b}, ${alpha})`\n}\n\n/** 英雄主按钮渐变(仅登录页 / 欢迎横幅 / 头像)。 */\nexport function btnGrad(accent: string): string {\n return `linear-gradient(135deg, ${accent} 0%, ${mix(accent, '#8B5CF6', 0.55)} 55%, ${mix(accent, '#EC4899', 0.62)} 100%)`\n}\n\n/** 英雄按钮发光阴影。 */\nexport function glowSh(accent: string): string {\n return `0 6px 20px ${rgba(accent, 0.42)}`\n}\n"],"names":["clampByte","n","parseHex","hex","h","c","toHex","g","b","v","mix","a","t","ar","ag","ab","br","bg","bb","derivePrimary","accent","dark","darkContainer","primary","rgba","alpha","r","btnGrad","glowSh"],"mappings":"AAEA,SAASA,EAAUC,GAAmB;AACpC,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAMA,CAAC,CAAC,CAAC;AACjD;AAEA,SAASC,EAASC,GAAuC;AACvD,MAAIC,IAAID,EAAI,QAAQ,KAAK,EAAE,EAAE,KAAA;AAC7B,EAAIC,EAAE,WAAW,MACfA,IAAIA,EACD,MAAM,EAAE,EACR,IAAI,OAAKC,IAAIA,CAAC,EACd,KAAK,EAAE;AACZ,QAAMJ,IAAI,OAAO,SAASG,GAAG,EAAE;AAC/B,SAAO,CAAEH,KAAK,KAAM,KAAMA,KAAK,IAAK,KAAKA,IAAI,GAAG;AAClD;AAEA,SAASK,EAAM,GAAWC,GAAWC,GAAmB;AACtD,SAAO,MAAM,CAAC,GAAGD,GAAGC,CAAC,EAAE,IAAI,OAAKR,EAAUS,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AACrF;AAGO,SAASC,EAAIC,GAAWH,GAAWI,GAAmB;AAC3D,QAAM,CAACC,GAAIC,GAAIC,CAAE,IAAIb,EAASS,CAAC,GACzB,CAACK,GAAIC,GAAIC,CAAE,IAAIhB,EAASM,CAAC;AAC/B,SAAOF,EAAMO,KAAMG,IAAKH,KAAMD,GAAGE,KAAMG,IAAKH,KAAMF,GAAGG,KAAMG,IAAKH,KAAMH,CAAC;AACzE;AAoBO,SAASO,EACdC,GACAC,GACAC,IAAgB,WACH;AAKb,QAAMC,KAAWF,IAAOX,EAAIU,GAAQ,WAAW,IAAI,IAAIA,GAAQ,YAAA;AAC/D,SAAO;AAAA,IACL,SAAAG;AAAA,IACA,OAAOb,EAAIa,GAAS,WAAW,IAAI;AAAA,IACnC,SAASb,EAAIa,GAAS,WAAW,IAAI;AAAA,IACrC,OAAOF,IAAOX,EAAIa,GAASD,GAAe,IAAI,IAAIZ,EAAIa,GAAS,WAAW,GAAG;AAAA,EAAA;AAEjF;AAGO,SAASC,EAAKrB,GAAasB,GAAuB;AACvD,QAAM,CAACC,GAAGnB,GAAGC,CAAC,IAAIN,EAASC,CAAG;AAC9B,SAAO,QAAQuB,CAAC,KAAKnB,CAAC,KAAKC,CAAC,KAAKiB,CAAK;AACxC;AAGO,SAASE,EAAQP,GAAwB;AAC9C,SAAO,2BAA2BA,CAAM,QAAQV,EAAIU,GAAQ,WAAW,IAAI,CAAC,SAASV,EAAIU,GAAQ,WAAW,IAAI,CAAC;AACnH;AAGO,SAASQ,EAAOR,GAAwB;AAC7C,SAAO,cAAcI,EAAKJ,GAAQ,IAAI,CAAC;AACzC;"}
1
+ {"version":3,"file":"mix.js","sources":["../../src/theme/mix.ts"],"sourcesContent":["// 颜色派生规则(DESIGN.md 所述规则的唯一实现)。纯函数,无框架依赖。\n// 改规则时同步改 DESIGN.md,mix.spec.ts 钉着 solid() / fieldOf() 的几组既定输出。\n\nfunction clampByte(n: number): number {\n return Math.max(0, Math.min(255, Math.round(n)))\n}\n\nfunction parseHex(hex: string): [number, number, number] {\n let h = hex.replace('#', '').trim()\n if (h.length === 3)\n h = h\n .split('')\n .map(c => c + c)\n .join('')\n const n = Number.parseInt(h, 16)\n return [(n >> 16) & 255, (n >> 8) & 255, n & 255]\n}\n\nfunction toHex(r: number, g: number, b: number): string {\n return '#' + [r, g, b].map(v => clampByte(v).toString(16).padStart(2, '0')).join('')\n}\n\n/** 在 a、b 之间按 t∈[0,1] 线性插值(sRGB 分量)。t=0→a,t=1→b。 */\nexport function mix(a: string, b: string, t: number): string {\n const [ar, ag, ab] = parseHex(a)\n const [br, bg, bb] = parseHex(b)\n return toHex(ar + (br - ar) * t, ag + (bg - ag) * t, ab + (bb - ab) * t)\n}\n\n/** WCAG 相对亮度(0 黑 … 1 白)。 */\nexport function luminance(hex: string): number {\n const [r, g, b] = parseHex(hex).map(v => {\n const c = v / 255\n return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4\n }) as [number, number, number]\n return 0.2126 * r + 0.7152 * g + 0.0722 * b\n}\n\n/** WCAG 对比度(1…21)。 */\nexport function contrast(a: string, b: string): number {\n const x = luminance(a)\n const y = luminance(b)\n return (Math.max(x, y) + 0.05) / (Math.min(x, y) + 0.05)\n}\n\n/**\n * 把强调色当文字用时的可读版:在 bg 上逐步混黑,直到对比度 ≥ 4.5:1,色相不变。\n * 浅色下的链接 / 选中文字 / 侧栏图标用它;深色背景上不要用(混黑只会更糟),深色走「往白提亮」。\n */\nexport function readable(c: string, bg = '#FFFFFF'): string {\n let t = 0\n let r = c\n while (contrast(r, bg) < 4.5 && t < 1) {\n t += 0.02\n r = mix(c, '#000000', t)\n }\n return r\n}\n\n/**\n * 实心控件(主按钮、勾选框、开关、进度条)的底色:亮度 > 0.5 的亮色直接用(配深字),\n * 其余压暗到白字 ≥ 4.5:1。**浅色 / 深色用同一个值**,切换外观模式时强调色不变。\n * 6 个候选色的亮度都落在 0.14–0.36,所以实际都走「压暗」这一支、主按钮一律深底白字。\n */\nexport function solid(c: string): string {\n return luminance(c) > 0.5 ? c : readable(c)\n}\n\nexport interface PrimaryRamp {\n /** 实心主色(= `solid(accent)`,明暗同值)。 */\n primary: string\n hover: string\n pressed: string\n /** 浅底(选中背景 / 标签底)的**实色**版;裸 CSS 里的选中底改用半透明的 `--sel-bg`,这里保留给调用方自取。 */\n light: string\n /** 压在 `primary` 上的字色:深底白字,极端情况(亮度 > 0.5)配近黑。 */\n on: string\n}\n\n/**\n * accent → 主色四态 + 字色。规则:\n * primary = solid(accent);hover 往白提 10%(亮色底改往黑压 8%);pressed 往黑压 12%。\n * 浅色 / 深色同一个值,深色下不对 accent 另做提亮。\n *\n * 派生只在这一处:`naive-theme.ts`(喂 Naive overrides)与 `accentTokens.ts`(写 CSS 变量)都调它。\n * 两边各算一份的话,改一处忘另一处 = 裸 CSS 与 Naive 组件主色不同步,**而没有任何东西会报错**。\n *\n * `darkContainer` 只在暗色下参与 `light`(浅底要往容器色靠,否则在暗底上白得刺眼);亮色下忽略。\n */\nexport function derivePrimary(\n accent: string,\n dark: boolean,\n darkContainer = '#1F2229',\n): PrimaryRamp {\n // 统一转小写:solid() 在亮色分支里原样返回入参,而色板里的 accent 是大写字面量,\n // 其余三态都经 `toHex` 出小写。不归一的话输出的大小写会随强调色变化,\n // 任何拿 `===` 直接比的地方就会得到一个只在某些强调色下失败的不一致。CSS 不区分大小写,归一无副作用。\n const primary = solid(accent).toLowerCase()\n const bright = luminance(primary) > 0.5\n return {\n primary,\n hover: bright ? mix(primary, '#000000', 0.08) : mix(primary, '#FFFFFF', 0.1),\n pressed: mix(primary, '#000000', 0.12),\n light: dark ? mix(primary, darkContainer, 0.82) : mix(primary, '#FFFFFF', 0.9),\n on: bright ? '#0a0a0b' : '#ffffff',\n }\n}\n\n/** accent → rgba(...,alpha),用于发光 / 渐变 / 选中淡底。 */\nexport function rgba(hex: string, alpha: number): string {\n const [r, g, b] = parseHex(hex)\n return `rgba(${r}, ${g}, ${b}, ${alpha})`\n}\n\n/** 英雄主按钮渐变(仅登录页 / 欢迎横幅 / 头像)。 */\nexport function btnGrad(accent: string): string {\n return `linear-gradient(135deg, ${accent} 0%, ${mix(accent, '#8B5CF6', 0.55)} 55%, ${mix(accent, '#EC4899', 0.62)} 100%)`\n}\n\n/** 英雄按钮发光阴影。 */\nexport function glowSh(accent: string): string {\n return `0 6px 20px ${rgba(accent, 0.42)}`\n}\n\n/* ─── HSL 与色场:色场推导要按色相走,混向一个写死的颜色做不到 ─── */\n\n/** hex → [色相 0–360, 饱和度 0–1, 明度 0–1]。 */\nexport function hexToHsl(hex: string): [number, number, number] {\n const [r, g, b] = parseHex(hex).map(v => v / 255) as [number, number, number]\n const mx = Math.max(r, g, b)\n const mn = Math.min(r, g, b)\n const d = mx - mn\n const l = (mx + mn) / 2\n let h = 0\n let s = 0\n if (d) {\n s = l > 0.5 ? d / (2 - mx - mn) : d / (mx + mn)\n h =\n (mx === r ? (g - b) / d + (g < b ? 6 : 0) : mx === g ? (b - r) / d + 2 : (r - g) / d + 4) * 60\n }\n return [h, s, l]\n}\n\nexport function hslToHex(h: number, s: number, l: number): string {\n const hh = ((h % 360) + 360) % 360\n const ss = Math.max(0, Math.min(1, s))\n const ll = Math.max(0, Math.min(1, l))\n const c = (1 - Math.abs(2 * ll - 1)) * ss\n const x = c * (1 - Math.abs(((hh / 60) % 2) - 1))\n const m = ll - c / 2\n const t =\n hh < 60\n ? [c, x, 0]\n : hh < 120\n ? [x, c, 0]\n : hh < 180\n ? [0, c, x]\n : hh < 240\n ? [0, x, c]\n : hh < 300\n ? [x, 0, c]\n : [c, 0, x]\n return toHex((t[0]! + m) * 255, (t[1]! + m) * 255, (t[2]! + m) * 255)\n}\n\n/** 邻近色位移:色相窄幅旋转 + 提亮 + 轻微降饱和。色场四团光和应用内环境光都用它从强调色推导。 */\nexport function shift(c: string, dh: number, dl: number, ds: number): string {\n const [h, s, l] = hexToHsl(c)\n return hslToHex(h + dh, s + ds, l + dl)\n}\n\n/**\n * 色场四团光相对强调色的位移量 [Δ色相, Δ明度, Δ饱和]。这四组数按默认蓝下的目标色反解得到,\n * 所以默认蓝的观感是定稿的(与目标色逐团差 1–2 个 RGB 单位),换成别的强调色才会有区别。\n * 按色相位移、而不是 mix 向写死的颜色(如 #8B5CF6 / #22D3EE),是为了紫色等强调色不会塌成一片同色(混向固定色时四团里三团同色)。\n */\nexport const FIELD: ReadonlyArray<readonly [number, number, number]> = [\n [0, 0, 0],\n [17, 0.12, -0.05],\n [-11, 0.01, -0.07],\n [35, 0.16, -0.08],\n]\n\n/** 色场的默认取色源(默认强调色蓝)。 */\nconst FIELD_FALLBACK = '#0A84FF'\n\n/**\n * 色场的取色源:近中性的强调色(石墨,饱和度 2%)旋转色相没有意义,转出来还是灰,整屏会变成一块死灰,\n * 退回默认蓝——这也正是 macOS 的行为:石墨只把控件去色,桌面壁纸照旧有颜色。\n * 注意只有色场退回,`--login-accent-2`(登录页主按钮渐变、标语高亮)仍走石墨本色,不然会冒出一个蓝按钮。\n */\nexport function fieldSrc(c: string): string {\n return hexToHsl(c)[1] < 0.12 ? FIELD_FALLBACK : c\n}\n\n/** accent → 色场四个色(登录页 `--desk-1..4` 与应用内 `--ambient-1..4` 同源,各自再乘自己的不透明度)。 */\nexport function fieldOf(c: string): string[] {\n const src = fieldSrc(c)\n return FIELD.map(([dh, dl, ds]) => shift(src, dh, dl, ds))\n}\n\n/* ─── 图表数据色:由强调色推导的一组邻近色相 ─── */\n\n/**\n * 数据色相对强调色的 [色相偏移(度), 饱和度偏移]。顺序 = 系列顺序:第 1 个就是强调色本色,\n * 第 2、3 个往两侧拉开最大(折线只有两个系列时要一眼分得开),后面依次外扩。\n * 偏移控制在 ±115° 内,落在蓝 → 青 / 靛 → 紫 / 绿这一带,不会出现红 / 橙:\n * 红橙是状态语义色(危险 / 警告),拿来画「权限点」「在线会话」会让人以为出了问题。\n * 实心主色饱和度很高(默认蓝约 0.9),原样转色相会得到荧光品红 / 荧光绿,和柔和的玻璃界面打架,\n * 所以偏得越远降得越多。\n */\nexport const CHART_STEPS: ReadonlyArray<readonly [number, number]> = [\n [0, 0],\n [48, -0.16],\n [-38, -0.14],\n [96, -0.46],\n [-76, -0.3],\n [-112, -0.36],\n]\n\n/** 色相落在红 / 橙一带(345°–45°):状态语义色的地盘,数据色要避开。 */\nfunction inWarmZone(h: number): boolean {\n const x = ((h % 360) + 360) % 360\n return x >= 345 || x <= 45\n}\n\n/** 图形对象(折线、色块)与相邻底色的对比度下限,WCAG 1.4.11。 */\nconst CHART_MIN_CONTRAST = 3\n\n/** 把 c 的明度往「离底色更远」的方向推,直到对底色对比度 ≥ min(最多推 24 步,够用且保证终止)。 */\nfunction ensureContrast(c: string, bg: string, min: number, lighten: boolean): string {\n let out = c\n for (let i = 0; i < 24 && contrast(out, bg) < min; i++)\n out = shift(out, 0, lighten ? 0.02 : -0.02, 0)\n return out\n}\n\n/**\n * accent → 6 个图表数据色。和色场同源:石墨(近中性)的强调色转色相没有意义,退回默认蓝(见 fieldSrc)。\n * 基准色取实心主色(明暗同值),再逐个压到对卡片底 ≥ 3:1;`darkCard` 是暗色卡片底色(`--bg-card`)。\n */\nexport function chartPalette(accent: string, dark: boolean, darkCard = '#1b2842'): string[] {\n const base = derivePrimary(fieldSrc(accent), dark).primary\n const bg = dark ? darkCard : '#FFFFFF'\n const h0 = hexToHsl(base)[0]\n return CHART_STEPS.map(([dh, ds]) => {\n // 固定偏移在个别强调色下会转进红橙区(墨绿 −112° → 橙棕,靛蓝 +96° → 粉红):落进去就反向取\n const d = inWarmZone(h0 + dh) ? -dh : dh\n return ensureContrast(shift(base, d, 0, ds), bg, CHART_MIN_CONTRAST, dark)\n })\n}\n"],"names":["clampByte","parseHex","hex","h","c","n","toHex","r","g","b","v","mix","a","t","ar","ag","ab","br","bg","bb","luminance","contrast","x","y","readable","solid","derivePrimary","accent","dark","darkContainer","primary","bright","rgba","alpha","btnGrad","glowSh","hexToHsl","mx","mn","d","l","s","hslToHex","hh","ss","ll","m","shift","dh","dl","ds","FIELD","FIELD_FALLBACK","fieldSrc","fieldOf","src","CHART_STEPS","inWarmZone","CHART_MIN_CONTRAST","ensureContrast","min","lighten","out","i","chartPalette","darkCard","base","h0"],"mappings":"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"}
@@ -1,7 +1,10 @@
1
1
  import { GlobalThemeOverrides } from 'naive-ui';
2
2
  /**
3
- * tokens.css → Naive UI GlobalThemeOverrides(DESIGN.md 映射表)。
4
- * 主色由 accent 按派生规则算;其余颜色/度量从当前 CSS 变量读取。
3
+ * tokens.css → Naive UI GlobalThemeOverrides(映射关系见 DESIGN.md 映射表)。
4
+ * 强调色相关的值由 accent 按 `accentTokens.ts` 算;其余颜色 / 度量从当前 CSS 变量读取。
5
+ *
6
+ * 度量(中文界面 14px 偏小,整体比 Naive 默认大一档):正文 15px、默认控件高 30px(小 24、迷你 20)、Large 42px 只留给登录页与触屏窄档。
7
+ * 按钮默认款(没写 type 的 NButton,如表格库里的「搜索」「更多」)渲染成与 secondary 同色同无描边,整站只剩一种次按钮。
5
8
  */
6
9
  export declare function buildThemeOverrides(opts: {
7
10
  dark: boolean;