@robot-admin/naive-ui-components 0.11.6 → 0.11.8

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 (125) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +5 -1
  3. package/README_EN.md +5 -1
  4. package/dist/C_ActionBar.css +59 -0
  5. package/dist/C_AudioPlayer.css +59 -0
  6. package/dist/C_Breadcrumb.css +59 -0
  7. package/dist/C_Captcha.css +24 -24
  8. package/dist/C_Captcha2.cjs +1 -1
  9. package/dist/C_Captcha2.js +1 -1
  10. package/dist/C_Chat.css +59 -0
  11. package/dist/C_Code.css +59 -0
  12. package/dist/C_CollapsePanel.css +59 -0
  13. package/dist/C_ContextMenu.css +59 -0
  14. package/dist/C_Guide.css +59 -0
  15. package/dist/C_Guide2.cjs +1 -1
  16. package/dist/C_Guide2.js +1 -1
  17. package/dist/C_Language.css +58 -1
  18. package/dist/C_Login.css +244 -0
  19. package/dist/C_Map.css +3 -3
  20. package/dist/C_Map2.cjs +1 -1
  21. package/dist/C_Map2.js +1 -1
  22. package/dist/C_Menu2.cjs +1 -1
  23. package/dist/C_Menu2.js +1 -1
  24. package/dist/C_Table.base.css +59 -0
  25. package/dist/C_Table.css +59 -0
  26. package/dist/C_TagsView.css +59 -0
  27. package/dist/C_Theme.css +58 -1
  28. package/dist/C_Timeline.css +59 -0
  29. package/dist/C_Transfer.css +59 -0
  30. package/dist/C_VtableGantt.css +19 -19
  31. package/dist/C_VtableGantt2.cjs +1 -1
  32. package/dist/C_VtableGantt2.js +1 -1
  33. package/dist/C_WorkFlow.css +59 -0
  34. package/dist/constants.d.cts +1 -1
  35. package/dist/constants.d.ts +1 -1
  36. package/dist/constants2.d.cts +3 -3
  37. package/dist/constants2.d.ts +3 -3
  38. package/dist/constants3.d.cts +1 -1
  39. package/dist/constants3.d.ts +1 -1
  40. package/dist/constants4.d.cts +6 -6
  41. package/dist/constants4.d.ts +6 -6
  42. package/dist/constants5.d.cts +2 -2
  43. package/dist/constants5.d.ts +2 -2
  44. package/dist/index10.vue.d.cts +2 -2
  45. package/dist/index10.vue.d.ts +2 -2
  46. package/dist/index11.vue.d.cts +2 -2
  47. package/dist/index11.vue.d.ts +1 -1
  48. package/dist/index12.vue.d.cts +1 -1
  49. package/dist/index12.vue.d.ts +4 -4
  50. package/dist/index13.vue.d.cts +4 -4
  51. package/dist/index13.vue.d.ts +3 -3
  52. package/dist/index14.vue.d.cts +3 -3
  53. package/dist/index14.vue.d.ts +7 -7
  54. package/dist/index15.vue.d.cts +7 -7
  55. package/dist/index15.vue.d.ts +1 -1
  56. package/dist/index16.vue.d.cts +1 -1
  57. package/dist/index16.vue.d.ts +1 -1
  58. package/dist/index17.vue.d.cts +1 -1
  59. package/dist/index17.vue.d.ts +3 -3
  60. package/dist/index18.vue.d.cts +3 -3
  61. package/dist/index18.vue.d.ts +4 -0
  62. package/dist/index19.vue.d.cts +1 -1
  63. package/dist/index19.vue.d.ts +1 -1
  64. package/dist/index2.vue.d.cts +4 -4
  65. package/dist/index2.vue.d.ts +4 -4
  66. package/dist/index20.vue.d.cts +1 -1
  67. package/dist/index20.vue.d.ts +1 -1
  68. package/dist/index21.vue.d.cts +2 -2
  69. package/dist/index21.vue.d.ts +2 -2
  70. package/dist/index22.vue.d.cts +2 -2
  71. package/dist/index22.vue.d.ts +2 -2
  72. package/dist/index24.vue.d.cts +5 -5
  73. package/dist/index24.vue.d.ts +5 -5
  74. package/dist/index25.vue.d.cts +1 -1
  75. package/dist/index25.vue.d.ts +1 -1
  76. package/dist/index26.vue.d.cts +2 -2
  77. package/dist/index26.vue.d.ts +2 -2
  78. package/dist/index27.vue.d.cts +2 -2
  79. package/dist/index27.vue.d.ts +2 -2
  80. package/dist/index3.vue.d.cts +3 -3
  81. package/dist/index3.vue.d.ts +3 -3
  82. package/dist/index4.vue.d.cts +4 -4
  83. package/dist/index4.vue.d.ts +4 -4
  84. package/dist/index5.vue.d.cts +4 -0
  85. package/dist/index7.vue.d.ts +4 -4
  86. package/dist/index8.vue.d.cts +4 -4
  87. package/dist/index9.vue.d.ts +2 -2
  88. package/dist/mapUtils.d.cts +2 -2
  89. package/dist/mapUtils.d.ts +2 -2
  90. package/dist/style.css +46 -46
  91. package/dist/useCalendarEvents.d.cts +2 -2
  92. package/dist/useCalendarEvents.d.ts +2 -2
  93. package/dist/useCollapsePanel.d.cts +1 -1
  94. package/dist/useCollapsePanel.d.ts +1 -1
  95. package/dist/useCropperCore.d.cts +8 -8
  96. package/dist/useCropperCore.d.ts +8 -8
  97. package/dist/useDraggableLayout.d.cts +4 -4
  98. package/dist/useDraggableLayout.d.ts +4 -4
  99. package/dist/useDynamicFormState.d.cts +3 -3
  100. package/dist/useDynamicFormState.d.ts +3 -3
  101. package/dist/useEdgeInteraction.d.cts +2 -2
  102. package/dist/useEdgeInteraction.d.ts +2 -2
  103. package/dist/useFullscreen.d.cts +2 -2
  104. package/dist/useFullscreen.d.ts +2 -2
  105. package/dist/useInfiniteScroll.d.cts +1 -1
  106. package/dist/useInfiniteScroll.d.ts +1 -1
  107. package/dist/useQRCode.d.cts +5 -5
  108. package/dist/useQRCode.d.ts +5 -5
  109. package/dist/useSearchState.d.cts +24 -24
  110. package/dist/useSearchState.d.ts +24 -24
  111. package/dist/useSignatureHistory.d.cts +2 -2
  112. package/dist/useSignatureHistory.d.ts +2 -2
  113. package/dist/useSplitResize.d.cts +7 -7
  114. package/dist/useSplitResize.d.ts +7 -7
  115. package/dist/useTableQuery.d.cts +1 -1
  116. package/dist/useTableQuery.d.ts +1 -1
  117. package/dist/useTimeSelection.d.cts +3 -3
  118. package/dist/useTimeSelection.d.ts +3 -3
  119. package/dist/useTreeOperations.d.cts +6 -6
  120. package/dist/useTreeOperations.d.ts +6 -6
  121. package/dist/useWorkflowValidation.d.cts +4 -4
  122. package/dist/useWorkflowValidation.d.ts +4 -4
  123. package/dist/verification.d.cts +2 -2
  124. package/dist/verification.d.ts +2 -2
  125. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @robot-admin/naive-ui-components
2
2
 
3
+ ## 0.11.8
4
+
5
+ ### Patch Changes
6
+
7
+ - 修复 `C_Map` 在 Vite 深层按需加载、未整体预构建组件库时的 Leaflet CommonJS/ESM 互操作错误;组件同时兼容命名空间和 `default` 导出,并在 API 形态异常时返回明确错误。同步关闭 `C_VtableGantt` 在组件快速卸载或配置连续变化时的异步初始化竞态,避免向已经失效的容器创建实例。
8
+
9
+ ## 0.11.7
10
+
11
+ ### Patch Changes
12
+
13
+ - 修复按需消费场景中的登录验证码与功能引导回归:恢复验证码拼图标识和空文本的图标模式,避免未配置引导遮罩透明度时覆盖 driver.js 默认值,并让组件独立样式入口自动包含内部公共组件样式。`C_Menu` 同时新增非破坏性的 `intent` 事件,便于宿主在用户点击前按需预取目标路由。
14
+
3
15
  ## 0.11.6
4
16
 
5
17
  ### Patch Changes
package/README.md CHANGED
@@ -93,6 +93,10 @@ Components({
93
93
 
94
94
  `importStyle: true`(等价于 `'full'`)保持原有完整样式行为。只使用 C_Form/C_Table 基础字段、不使用内置富文本编辑器时,可设置 `importStyle: 'base'`,避免带入编辑器样式;其他组件会安全回退到标准样式入口。如需兼容旧项目的主入口导入,可显式设置 `importOnDemand: false`。
95
95
 
96
+ 每个 `C_*/style.css` 都是可独立消费的完整组件样式入口:如果组件内部组合了 `C_Icon`、`C_Captcha` 等其他公共组件,对应依赖样式会自动包含,无需使用侧重复导入,也不会依赖全量 `style.css` 兜底。
97
+
98
+ `C_Menu` 会在鼠标进入或键盘聚焦叶子菜单时触发 `intent` 事件;宿主可将其绑定到路由预取函数,点击与 `select` 行为保持不变。
99
+
96
100
  也可以手动选择样式层级:
97
101
 
98
102
  ```typescript
@@ -244,7 +248,7 @@ import '@robot-admin/naive-ui-components/C_Table/base.css'
244
248
  </template>
245
249
  ```
246
250
 
247
- 组件实例提供 `getMap()`、`refresh()` 和 `fitToMarkers()`,适合标签页显示、容器尺寸变化和业务图层扩展。使用 `map-type="amap"` 时必须提供 `amap-key`;2021-12-02 之后申请的 Key 还必须按[高德官方安全密钥说明](https://lbs.amap.com/api/javascript-api-v2/guide/abc/jscode)配置 `:amap-security-config="{ serviceHost: '/_AMapService' }"`(生产推荐,由服务端代理保管安全密钥),或仅在开发环境传 `{ securityJsCode: '...' }`。安全配置会在 SDK 脚本加载前写入,并拒绝同页混用不同 Key。宿主应用还需在 CSP 的 `script-src` 中允许 `https://webapi.amap.com`,同时在高德控制台配置域名白名单和配额限制。
251
+ 组件实例提供 `getMap()`、`refresh()` 和 `fitToMarkers()`,适合标签页显示、容器尺寸变化和业务图层扩展。OpenStreetMap 模式会在组件内部兼容 Leaflet 的 ESM 命名空间和 CommonJS `default` 形态,宿主无需为正确性配置整包预构建。使用 `map-type="amap"` 时必须提供 `amap-key`;2021-12-02 之后申请的 Key 还必须按[高德官方安全密钥说明](https://lbs.amap.com/api/javascript-api-v2/guide/abc/jscode)配置 `:amap-security-config="{ serviceHost: '/_AMapService' }"`(生产推荐,由服务端代理保管安全密钥),或仅在开发环境传 `{ securityJsCode: '...' }`。安全配置会在 SDK 脚本加载前写入,并拒绝同页混用不同 Key。宿主应用还需在 CSP 的 `script-src` 中允许 `https://webapi.amap.com`,同时在高德控制台配置域名白名单和配额限制。
248
252
 
249
253
  `C_Date`、`C_Time`、`C_Menu`、`C_FormSearch` 均支持标准 `v-model`。组件可直接放在没有 `NMessageProvider` / `NDialogProvider` 的页面;如需统一提示、确认和文案,可在安装时传入 `feedback`、`locale`、`form` 与 `table.defaults`。
250
254
 
package/README_EN.md CHANGED
@@ -93,6 +93,10 @@ Components({
93
93
 
94
94
  `importStyle: true` (an alias of `'full'`) preserves the existing complete style behavior. When C_Form/C_Table only use base fields and no built-in rich-text editor, set `importStyle: 'base'` to avoid editor CSS; other components safely fall back to their standard style entry. Set `importOnDemand: false` only when a legacy project still requires the package root.
95
95
 
96
+ Every `C_*/style.css` file is a self-contained component style entry. When a component composes public components such as `C_Icon` or `C_Captcha`, their required styles are included automatically, so consumers do not need duplicate imports or the global `style.css` fallback.
97
+
98
+ `C_Menu` emits a non-mutating `intent` event when a leaf item is hovered or keyboard-focused. Hosts may connect it to route prefetching without changing the existing `select` behavior.
99
+
96
100
  The style tiers can also be imported explicitly:
97
101
 
98
102
  ```typescript
@@ -185,7 +189,7 @@ const { bindings } = useTableQuery<UserRow, { keyword: string }>({
185
189
  </template>
186
190
  ```
187
191
 
188
- The exposed instance provides `getMap()`, `refresh()`, and `fitToMarkers()` for tab visibility changes, container resizes, and custom business layers. `map-type="amap"` requires `amap-key`; keys created after 2021-12-02 also require `:amap-security-config="{ serviceHost: '/_AMapService' }"` (recommended in production so the server proxy retains the security secret), or `{ securityJsCode: '...' }` for development only, as described by the [official AMap security guidance](https://lbs.amap.com/api/javascript-api-v2/guide/abc/jscode). The config is installed before the SDK script and conflicting keys on one page are rejected. The host CSP must also allow `https://webapi.amap.com` in `script-src`, with domain allowlists and quotas enforced in the AMap console.
192
+ The exposed instance provides `getMap()`, `refresh()`, and `fitToMarkers()` for tab visibility changes, container resizes, and custom business layers. OpenStreetMap mode normalizes both the Leaflet ESM namespace and CommonJS `default` shape internally, so hosts do not need whole-package prebundling for correctness. `map-type="amap"` requires `amap-key`; keys created after 2021-12-02 also require `:amap-security-config="{ serviceHost: '/_AMapService' }"` (recommended in production so the server proxy retains the security secret), or `{ securityJsCode: '...' }` for development only, as described by the [official AMap security guidance](https://lbs.amap.com/api/javascript-api-v2/guide/abc/jscode). The config is installed before the SDK script and conflicting keys on one page are rejected. The host CSP must also allow `https://webapi.amap.com` in `script-src`, with domain allowlists and quotas enforced in the AMap console.
189
193
 
190
194
  `C_Date`, `C_Time`, `C_Menu`, and `C_FormSearch` support standard `v-model`. Message/dialog providers are optional; application-wide feedback, locale, form defaults, and `table.defaults` can be supplied through plugin options.
191
195
 
@@ -1,3 +1,62 @@
1
+ /* unplugin-vue-components disabled */.c-icon[data-v-d0d8dba0] {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ user-select: none;
6
+ transition: all 0.2s ease-in-out;
7
+ }
8
+ .c-icon--clickable[data-v-d0d8dba0] {
9
+ cursor: pointer;
10
+ }
11
+ .c-icon--clickable[data-v-d0d8dba0]:hover {
12
+ opacity: 0.8;
13
+ transform: scale(1.05);
14
+ }
15
+ .c-icon--clickable[data-v-d0d8dba0]:active {
16
+ transform: scale(0.95);
17
+ }
18
+ .c-icon--clickable[data-v-d0d8dba0]:focus-visible {
19
+ outline: 2px solid currentColor;
20
+ outline-offset: 2px;
21
+ border-radius: 4px;
22
+ }
23
+ .c-icon--loading[data-v-d0d8dba0] {
24
+ opacity: 0.6;
25
+ cursor: wait;
26
+ }
27
+ .c-icon--error[data-v-d0d8dba0] {
28
+ opacity: 0.5;
29
+ }
30
+ .c-icon__loading[data-v-d0d8dba0] {
31
+ position: relative;
32
+ }
33
+ .c-icon__spinner[data-v-d0d8dba0] {
34
+ width: 100%;
35
+ height: 100%;
36
+ border: 2px solid currentColor;
37
+ border-radius: 50%;
38
+ border-top-color: transparent;
39
+ animation: spin-d0d8dba0 1s linear infinite;
40
+ }
41
+ .c-icon__error[data-v-d0d8dba0] {
42
+ font-size: 0.8em;
43
+ opacity: 0.5;
44
+ }
45
+ .c-icon__rotatable[data-v-d0d8dba0] {
46
+ transition: transform 0.3s ease-in-out;
47
+ }
48
+ .c-icon__flippable[data-v-d0d8dba0] {
49
+ transition: transform 0.3s ease-in-out;
50
+ }
51
+ @keyframes spin-d0d8dba0 {
52
+ 0% {
53
+ transform: rotate(0deg);
54
+ }
55
+ 100% {
56
+ transform: rotate(360deg);
57
+ }
58
+ }
59
+
1
60
  /* unplugin-vue-components disabled *//* 通用操作按钮组件样式 */
2
61
  /* ================= 主容器 ================= */
3
62
  .c-action-bar[data-v-9dc5812b] {
@@ -1,3 +1,62 @@
1
+ /* unplugin-vue-components disabled */.c-icon[data-v-d0d8dba0] {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ user-select: none;
6
+ transition: all 0.2s ease-in-out;
7
+ }
8
+ .c-icon--clickable[data-v-d0d8dba0] {
9
+ cursor: pointer;
10
+ }
11
+ .c-icon--clickable[data-v-d0d8dba0]:hover {
12
+ opacity: 0.8;
13
+ transform: scale(1.05);
14
+ }
15
+ .c-icon--clickable[data-v-d0d8dba0]:active {
16
+ transform: scale(0.95);
17
+ }
18
+ .c-icon--clickable[data-v-d0d8dba0]:focus-visible {
19
+ outline: 2px solid currentColor;
20
+ outline-offset: 2px;
21
+ border-radius: 4px;
22
+ }
23
+ .c-icon--loading[data-v-d0d8dba0] {
24
+ opacity: 0.6;
25
+ cursor: wait;
26
+ }
27
+ .c-icon--error[data-v-d0d8dba0] {
28
+ opacity: 0.5;
29
+ }
30
+ .c-icon__loading[data-v-d0d8dba0] {
31
+ position: relative;
32
+ }
33
+ .c-icon__spinner[data-v-d0d8dba0] {
34
+ width: 100%;
35
+ height: 100%;
36
+ border: 2px solid currentColor;
37
+ border-radius: 50%;
38
+ border-top-color: transparent;
39
+ animation: spin-d0d8dba0 1s linear infinite;
40
+ }
41
+ .c-icon__error[data-v-d0d8dba0] {
42
+ font-size: 0.8em;
43
+ opacity: 0.5;
44
+ }
45
+ .c-icon__rotatable[data-v-d0d8dba0] {
46
+ transition: transform 0.3s ease-in-out;
47
+ }
48
+ .c-icon__flippable[data-v-d0d8dba0] {
49
+ transition: transform 0.3s ease-in-out;
50
+ }
51
+ @keyframes spin-d0d8dba0 {
52
+ 0% {
53
+ transform: rotate(0deg);
54
+ }
55
+ 100% {
56
+ transform: rotate(360deg);
57
+ }
58
+ }
59
+
1
60
  /* unplugin-vue-components disabled *//**
2
61
  * C_AudioPlayer — 音频播放器样式
3
62
  */
@@ -1,3 +1,62 @@
1
+ /* unplugin-vue-components disabled */.c-icon[data-v-d0d8dba0] {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ user-select: none;
6
+ transition: all 0.2s ease-in-out;
7
+ }
8
+ .c-icon--clickable[data-v-d0d8dba0] {
9
+ cursor: pointer;
10
+ }
11
+ .c-icon--clickable[data-v-d0d8dba0]:hover {
12
+ opacity: 0.8;
13
+ transform: scale(1.05);
14
+ }
15
+ .c-icon--clickable[data-v-d0d8dba0]:active {
16
+ transform: scale(0.95);
17
+ }
18
+ .c-icon--clickable[data-v-d0d8dba0]:focus-visible {
19
+ outline: 2px solid currentColor;
20
+ outline-offset: 2px;
21
+ border-radius: 4px;
22
+ }
23
+ .c-icon--loading[data-v-d0d8dba0] {
24
+ opacity: 0.6;
25
+ cursor: wait;
26
+ }
27
+ .c-icon--error[data-v-d0d8dba0] {
28
+ opacity: 0.5;
29
+ }
30
+ .c-icon__loading[data-v-d0d8dba0] {
31
+ position: relative;
32
+ }
33
+ .c-icon__spinner[data-v-d0d8dba0] {
34
+ width: 100%;
35
+ height: 100%;
36
+ border: 2px solid currentColor;
37
+ border-radius: 50%;
38
+ border-top-color: transparent;
39
+ animation: spin-d0d8dba0 1s linear infinite;
40
+ }
41
+ .c-icon__error[data-v-d0d8dba0] {
42
+ font-size: 0.8em;
43
+ opacity: 0.5;
44
+ }
45
+ .c-icon__rotatable[data-v-d0d8dba0] {
46
+ transition: transform 0.3s ease-in-out;
47
+ }
48
+ .c-icon__flippable[data-v-d0d8dba0] {
49
+ transition: transform 0.3s ease-in-out;
50
+ }
51
+ @keyframes spin-d0d8dba0 {
52
+ 0% {
53
+ transform: rotate(0deg);
54
+ }
55
+ 100% {
56
+ transform: rotate(360deg);
57
+ }
58
+ }
59
+
1
60
  /* unplugin-vue-components disabled */.c-breadcrumb {
2
61
  --c-breadcrumb-icon-size: 16px;
3
62
  --c-breadcrumb-gap: 4px;
@@ -1,16 +1,16 @@
1
1
  .vue-puzzle-vcode{position:fixed;top:0;left:0;bottom:0;right:0;background-color:#0000004d;z-index:999;opacity:0;pointer-events:none;transition:opacity .2s}.vue-puzzle-vcode.inside_{position:relative;background-color:transparent;width:100%;height:100%}.vue-puzzle-vcode.inside_ .vue-auth-box_{position:relative;top:0;left:0;transform:translate(0);padding:0;background:transparent;box-shadow:none}.vue-puzzle-vcode.show_{opacity:1;pointer-events:auto}.vue-auth-box_{position:absolute;top:40%;left:50%;transform:translate(-50%,-50%);padding:20px;background:#fff;user-select:none;border-radius:3px;box-shadow:0 1px 3px #0000004d}.vue-auth-box_ .auth-body_{position:relative;overflow:hidden;border-radius:3px}.vue-auth-box_ .auth-body_ .loading-box_{position:absolute;top:0;left:0;bottom:0;right:0;background-color:#000c;z-index:20;opacity:1;transition:opacity .1s;display:flex;align-items:center;justify-content:center}.vue-auth-box_ .auth-body_ .loading-box_.hide_{opacity:0;pointer-events:none}.vue-auth-box_ .auth-body_ .loading-box_.hide_ .loading-gif_ span{animation-play-state:paused}.vue-auth-box_ .auth-body_ .loading-box_ .loading-gif_{flex:none;height:5px;line-height:0}@keyframes load{0%{opacity:1;transform:scale(1.3)}to{opacity:.2;transform:scale(.3)}}.vue-auth-box_ .auth-body_ .loading-box_ .loading-gif_ span{display:inline-block;width:5px;height:100%;margin-left:2px;border-radius:50%;background-color:#888;animation:load 1.04s ease infinite}.vue-auth-box_ .auth-body_ .loading-box_ .loading-gif_ span:nth-child(1){margin-left:0}.vue-auth-box_ .auth-body_ .loading-box_ .loading-gif_ span:nth-child(2){animation-delay:.13s}.vue-auth-box_ .auth-body_ .loading-box_ .loading-gif_ span:nth-child(3){animation-delay:.26s}.vue-auth-box_ .auth-body_ .loading-box_ .loading-gif_ span:nth-child(4){animation-delay:.39s}.vue-auth-box_ .auth-body_ .loading-box_ .loading-gif_ span:nth-child(5){animation-delay:.52s}.vue-auth-box_ .auth-body_ .info-box_{position:absolute;bottom:0;left:0;width:100%;height:24px;line-height:24px;text-align:center;overflow:hidden;font-size:13px;background-color:#83ce3f;opacity:0;transform:translateY(24px);transition:all .2s;color:#fff;z-index:10}.vue-auth-box_ .auth-body_ .info-box_.show{opacity:.95;transform:translateY(0)}.vue-auth-box_ .auth-body_ .info-box_.fail{background-color:#ce594b}.vue-auth-box_ .auth-body_ .auth-canvas1_{width:100%;height:100%}.vue-auth-box_ .auth-body_ .auth-canvas2_{position:absolute;top:0;left:0;width:60px;height:100%;z-index:2}.vue-auth-box_ .auth-body_ .auth-canvas3_{position:absolute;width:100%;height:100%;top:0;left:0;opacity:0;transition:opacity .6s;z-index:3}.vue-auth-box_ .auth-body_ .auth-canvas3_.show{opacity:1}.vue-auth-box_ .auth-body_ .flash_{position:absolute;top:0;left:0;width:30px;height:100%;background-color:#ffffff1a;z-index:3}.vue-auth-box_ .auth-body_ .flash_.show{transition:transform .6s}.vue-auth-box_ .auth-body_ .reset_{position:absolute;top:2px;right:2px;width:35px;height:auto;z-index:12;cursor:pointer;transition:transform .2s;transform:rotate(0)}.vue-auth-box_ .auth-body_ .reset_:hover{transform:rotate(-90deg)}.vue-auth-box_ .auth-control_ .range-box{position:relative;width:100%;background-color:#eef1f8;margin-top:20px;border-radius:3px;box-shadow:0 0 8px #f0f0f099 inset}.vue-auth-box_ .auth-control_ .range-box .range-text{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:14px;color:#b7bcd1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:center;width:100%}.vue-auth-box_ .auth-control_ .range-box .range-slider{position:absolute;height:100%;width:50px;background-color:#6aa0ffcc;border-radius:3px}.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn{position:absolute;display:flex;align-items:center;justify-content:center;right:0;width:50px;height:100%;background-color:#fff;border-radius:3px;box-shadow:0 0 4px #ccc;cursor:pointer}.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn>div{width:0;height:40%;transition:all .2s;border:solid 1px #6aa0ff}.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn>div:nth-child(2){margin:0 4px}.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn:hover>div:first-child,.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn.isDown>div:first-child{border:solid 4px transparent;height:0;border-right-color:#6aa0ff}.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn:hover>div:nth-child(2),.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn.isDown>div:nth-child(2){border-width:3px;height:0;border-radius:3px;margin:0 6px;border-right-color:#6aa0ff}.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn:hover>div:nth-child(3),.vue-auth-box_ .auth-control_ .range-box .range-slider .range-btn.isDown>div:nth-child(3){border:solid 4px transparent;height:0;border-left-color:#6aa0ff}.vue-puzzle-overflow{overflow:hidden!important}
2
2
 
3
- /* unplugin-vue-components disabled */.c-captcha-modern[data-v-3b02fca0] {
3
+ /* unplugin-vue-components disabled */.c-captcha-modern[data-v-29edd4c3] {
4
4
  width: 100%;
5
5
  font-family: inherit;
6
6
  }
7
- .captcha-shell[data-v-3b02fca0] {
7
+ .captcha-shell[data-v-29edd4c3] {
8
8
  position: relative;
9
9
  width: 100%;
10
10
  max-width: 280px;
11
11
  margin: 0 auto;
12
12
  }
13
- .captcha-trigger[data-v-3b02fca0] {
13
+ .captcha-trigger[data-v-29edd4c3] {
14
14
  appearance: none;
15
15
  border: 0;
16
16
  background: transparent;
@@ -26,26 +26,26 @@
26
26
  position: relative;
27
27
  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
28
28
  }
29
- .captcha-trigger[data-v-3b02fca0]:hover:not(.disabled) {
29
+ .captcha-trigger[data-v-29edd4c3]:hover:not(.disabled) {
30
30
  transform: translateY(-1px);
31
31
  }
32
- .captcha-trigger.disabled[data-v-3b02fca0] {
32
+ .captcha-trigger.disabled[data-v-29edd4c3] {
33
33
  opacity: 0.5;
34
34
  cursor: not-allowed;
35
35
  }
36
- .captcha-trigger[data-v-3b02fca0]:focus-visible,
37
- .refresh-button[data-v-3b02fca0]:focus-visible {
36
+ .captcha-trigger[data-v-29edd4c3]:focus-visible,
37
+ .refresh-button[data-v-29edd4c3]:focus-visible {
38
38
  outline: 2px solid var(--n-color-target, #18a058);
39
39
  outline-offset: 2px;
40
40
  }
41
- .captcha-content[data-v-3b02fca0] {
41
+ .captcha-content[data-v-29edd4c3] {
42
42
  display: flex;
43
43
  align-items: center;
44
44
  justify-content: center;
45
45
  gap: 8px;
46
46
  flex: 1;
47
47
  }
48
- .captcha-icon[data-v-3b02fca0] {
48
+ .captcha-icon[data-v-29edd4c3] {
49
49
  font-size: 18px;
50
50
  width: 20px;
51
51
  height: 20px;
@@ -54,7 +54,7 @@
54
54
  justify-content: center;
55
55
  flex-shrink: 0;
56
56
  }
57
- .captcha-text[data-v-3b02fca0] {
57
+ .captcha-text[data-v-29edd4c3] {
58
58
  color: rgba(255, 255, 255, 0.8);
59
59
  font-size: 14px;
60
60
  font-weight: 500;
@@ -62,7 +62,7 @@
62
62
  text-align: center;
63
63
  white-space: nowrap;
64
64
  }
65
- .refresh-button[data-v-3b02fca0] {
65
+ .refresh-button[data-v-29edd4c3] {
66
66
  appearance: none;
67
67
  border: 0;
68
68
  background: transparent;
@@ -81,25 +81,25 @@
81
81
  font-size: 14px;
82
82
  flex-shrink: 0;
83
83
  }
84
- .c-captcha-modern[data-theme=light] .captcha-text[data-v-3b02fca0] {
84
+ .c-captcha-modern[data-theme=light] .captcha-text[data-v-29edd4c3] {
85
85
  color: rgba(0, 0, 0, 0.72);
86
86
  }
87
- .c-captcha-modern[data-theme=light] .refresh-button[data-v-3b02fca0] {
87
+ .c-captcha-modern[data-theme=light] .refresh-button[data-v-29edd4c3] {
88
88
  color: rgba(0, 0, 0, 0.52);
89
89
  }
90
- .refresh-button[data-v-3b02fca0]:hover {
90
+ .refresh-button[data-v-29edd4c3]:hover {
91
91
  color: rgba(255, 255, 255, 0.9);
92
92
  transform: translateY(-50%) rotate(180deg);
93
93
  }
94
- .success-icon[data-v-3b02fca0],
95
- .success-text[data-v-3b02fca0] {
94
+ .success-icon[data-v-29edd4c3],
95
+ .success-text[data-v-29edd4c3] {
96
96
  color: #43c23a;
97
97
  }
98
- .error-icon[data-v-3b02fca0],
99
- .error-text[data-v-3b02fca0] {
98
+ .error-icon[data-v-29edd4c3],
99
+ .error-text[data-v-29edd4c3] {
100
100
  color: #f56c6c;
101
101
  }
102
- @keyframes shake-3b02fca0 {
102
+ @keyframes shake-29edd4c3 {
103
103
  0%, 100% {
104
104
  transform: translateX(0);
105
105
  }
@@ -111,21 +111,21 @@
111
111
  }
112
112
  }
113
113
  @media (max-width: 768px) {
114
- .captcha-trigger[data-v-3b02fca0] {
114
+ .captcha-trigger[data-v-29edd4c3] {
115
115
  padding: 10px 14px;
116
116
  }
117
- .captcha-shell[data-v-3b02fca0] {
117
+ .captcha-shell[data-v-29edd4c3] {
118
118
  max-width: 240px;
119
119
  }
120
- .captcha-icon[data-v-3b02fca0] {
120
+ .captcha-icon[data-v-29edd4c3] {
121
121
  font-size: 16px;
122
122
  width: 18px;
123
123
  height: 18px;
124
124
  }
125
- .captcha-text[data-v-3b02fca0] {
125
+ .captcha-text[data-v-29edd4c3] {
126
126
  font-size: 13px;
127
127
  }
128
- .refresh-button[data-v-3b02fca0] {
128
+ .refresh-button[data-v-29edd4c3] {
129
129
  width: 24px;
130
130
  height: 24px;
131
131
  font-size: 12px;
@@ -1 +1 @@
1
- require(`./chunk.cjs`);const e=require(`./config.cjs`),t=require(`./export-helper.cjs`);let n=require(`vue`);var r=class extends Error{constructor(e,t,n){super(t),this.code=e,this.cause=n,this.name=`CaptchaVerificationError`}};let i=0;function a(){let e=Date.now();return{token:`puzzle_${e}_${globalThis.crypto?.randomUUID?.()??`${++i}`}`,timestamp:e,type:`puzzle-captcha`}}async function o(e,t={}){let{verifier:n,requireServerVerification:i=!1,signal:a}=t,o=t.timeout??1e4,s=Number.isFinite(o)&&o>0?o:1e4;if(a?.aborted)throw new r(`aborted`,`Verification was cancelled.`);if(!n){if(i)throw new r(`missing-verifier`,`Server verification is required but no verifier was configured.`);return{...e,verifiedBy:`local`}}let c=new AbortController,l=()=>c.abort(a?.reason);a?.addEventListener(`abort`,l,{once:!0});let u,d=new Promise((e,t)=>{u=setTimeout(()=>{c.abort(`timeout`),t(new r(`timeout`,`Verification timed out after ${s}ms.`))},s)}),f=new Promise((e,t)=>{c.signal.addEventListener(`abort`,()=>{c.signal.reason!==`timeout`&&t(new r(`aborted`,`Verification was cancelled.`))},{once:!0})});try{let t=await Promise.race([Promise.resolve(n({...e,signal:c.signal})),d,f]),a=typeof t==`boolean`?{valid:t}:t;if(!a.valid)throw new r(`rejected`,a.message||`Server verification rejected the challenge.`);let o=a.token?.trim();if(i&&!o)throw new r(`missing-token`,`Server verification did not return a trusted token.`);return{...e,token:o||e.token,verifiedBy:`server`}}catch(e){throw e instanceof r?e:new r(`rejected`,`Server verification failed.`,e)}finally{u&&clearTimeout(u),a?.removeEventListener(`abort`,l)}}const s=[`data-theme`],c={class:`captcha-shell`},l=[`disabled`,`aria-busy`,`aria-label`],u={class:`captcha-content`},d={class:`captcha-icon`,"aria-hidden":`true`},f={key:0},p={key:1,class:`success-icon`},m={key:2,class:`error-icon`},h={key:3},g={class:`captcha-text`,"aria-live":`polite`},_={key:0},v={key:1,class:`success-text`},y={key:2,class:`error-text`},b={key:3},x=[`title`,`aria-label`],S=(0,n.defineComponent)({name:`C_Captcha`,__name:`index`,props:{triggerText:{},images:{default:()=>[]},disabled:{type:Boolean,default:!1},theme:{default:`dark`},verifier:{},verificationTimeout:{default:1e4},requireServerVerification:{type:Boolean,default:!1},feedback:{},locale:{}},emits:[`success`,`fail`,`verify-error`,`load-error`,`change`,`reset`],setup(t,{expose:i,emit:S}){let C=t,w=S,T=e.r(()=>C.feedback),{t:E}=e.i(()=>C.locale),D=typeof window>`u`?()=>null:(0,n.defineAsyncComponent)({loader:()=>import(`vue3-puzzle-vcode`).then(e=>e.default),onError(e,t,n){T.error(E(`captcha.loadFailed`),e),w(`load-error`,e),n()}}),O=(0,n.ref)(!1),k=(0,n.ref)(!1),A=(0,n.ref)(!1),j=(0,n.ref)(!1),M=(0,n.ref)(null),N=null,P=null,F=(0,n.computed)(()=>C.images.length>0?C.images:void 0),I=(0,n.computed)(()=>j.value?E(`captcha.verifying`):k.value?E(`captcha.success`):A.value?E(`captcha.failed`):C.triggerText||E(`captcha.trigger`)),L=()=>{N&&=(clearTimeout(N),null)},R=(e,t)=>{k.value=!1,A.value=!0,M.value=null,L(),N=setTimeout(()=>{A.value=!1,N=null},3e3),w(`fail`,e),w(`change`,!1),t&&w(`verify-error`,t)},z=()=>{C.disabled||j.value||k.value||(A.value=!1,O.value=!0)},B=async()=>{O.value=!1,A.value=!1,P?.abort();let e=new AbortController;P=e,j.value=!0;try{let t=await o(a(),{verifier:C.verifier,timeout:C.verificationTimeout,requireServerVerification:C.requireServerVerification,signal:e.signal});if(P!==e)return;M.value=t,k.value=!0,w(`success`,t),w(`change`,!0)}catch(t){if(P!==e||t instanceof r&&t.code===`aborted`)return;let n=t instanceof Error?t.message:E(`captcha.failed`);T.error(E(`captcha.verifyFailed`),t),R(n,t)}finally{P===e&&(P=null,j.value=!1)}},V=()=>{O.value=!1,R(E(`captcha.puzzleFailed`))},H=()=>{O.value=!1},U=()=>{P?.abort(),P=null,j.value=!1,k.value=!1,A.value=!1,O.value=!1,M.value=null,L(),w(`reset`),w(`change`,!1)};return i({validate:()=>k.value,getToken:()=>M.value?.token??``,getVerificationData:()=>M.value,reset:U,show:z}),(0,n.onBeforeUnmount)(()=>{P?.abort(),L()}),(e,r)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{class:`c-captcha-modern`,"data-theme":t.theme},[(0,n.createElementVNode)(`div`,c,[(0,n.createElementVNode)(`button`,{type:`button`,class:(0,n.normalizeClass)([`captcha-trigger`,{verified:k.value,error:A.value,disabled:t.disabled||j.value}]),disabled:t.disabled||j.value||k.value,"aria-busy":j.value,"aria-label":I.value,onClick:z},[(0,n.createElementVNode)(`span`,u,[(0,n.createElementVNode)(`span`,d,[j.value?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,f,`…`)):k.value?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,p,`✓`)):A.value?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,m,`!`)):((0,n.openBlock)(),(0,n.createElementBlock)(`span`,h,`↔`))]),(0,n.createElementVNode)(`span`,g,[j.value?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,_,(0,n.toDisplayString)((0,n.unref)(E)(`captcha.verifying`)),1)):k.value?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,v,(0,n.toDisplayString)((0,n.unref)(E)(`captcha.success`)),1)):A.value?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,y,(0,n.toDisplayString)((0,n.unref)(E)(`captcha.failed`)),1)):((0,n.openBlock)(),(0,n.createElementBlock)(`span`,b,(0,n.toDisplayString)(t.triggerText||(0,n.unref)(E)(`captcha.trigger`)),1))])])],10,l),k.value||A.value?((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:0,type:`button`,class:`refresh-button`,title:(0,n.unref)(E)(`captcha.reset`),"aria-label":(0,n.unref)(E)(`captcha.reset`),onClick:U},` ↻ `,8,x)):(0,n.createCommentVNode)(`v-if`,!0)]),(0,n.createVNode)((0,n.unref)(D),{show:O.value,imgs:F.value,onSuccess:B,onClose:H,onFail:V},null,8,[`show`,`imgs`])],8,s))}});var C=t.t(S,[[`__scopeId`,`data-v-3b02fca0`]]);Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return C}});
1
+ require(`./chunk.cjs`);const e=require(`./config.cjs`),t=require(`./export-helper.cjs`);let n=require(`vue`);var r=class extends Error{constructor(e,t,n){super(t),this.code=e,this.cause=n,this.name=`CaptchaVerificationError`}};let i=0;function a(){let e=Date.now();return{token:`puzzle_${e}_${globalThis.crypto?.randomUUID?.()??`${++i}`}`,timestamp:e,type:`puzzle-captcha`}}async function o(e,t={}){let{verifier:n,requireServerVerification:i=!1,signal:a}=t,o=t.timeout??1e4,s=Number.isFinite(o)&&o>0?o:1e4;if(a?.aborted)throw new r(`aborted`,`Verification was cancelled.`);if(!n){if(i)throw new r(`missing-verifier`,`Server verification is required but no verifier was configured.`);return{...e,verifiedBy:`local`}}let c=new AbortController,l=()=>c.abort(a?.reason);a?.addEventListener(`abort`,l,{once:!0});let u,d=new Promise((e,t)=>{u=setTimeout(()=>{c.abort(`timeout`),t(new r(`timeout`,`Verification timed out after ${s}ms.`))},s)}),f=new Promise((e,t)=>{c.signal.addEventListener(`abort`,()=>{c.signal.reason!==`timeout`&&t(new r(`aborted`,`Verification was cancelled.`))},{once:!0})});try{let t=await Promise.race([Promise.resolve(n({...e,signal:c.signal})),d,f]),a=typeof t==`boolean`?{valid:t}:t;if(!a.valid)throw new r(`rejected`,a.message||`Server verification rejected the challenge.`);let o=a.token?.trim();if(i&&!o)throw new r(`missing-token`,`Server verification did not return a trusted token.`);return{...e,token:o||e.token,verifiedBy:`server`}}catch(e){throw e instanceof r?e:new r(`rejected`,`Server verification failed.`,e)}finally{u&&clearTimeout(u),a?.removeEventListener(`abort`,l)}}const s=[`data-theme`],c={class:`captcha-shell`},l=[`disabled`,`aria-busy`,`aria-label`],u={class:`captcha-content`},d={class:`captcha-icon`,"aria-hidden":`true`},f={key:0},p={key:1,class:`success-icon`},m={key:2,class:`error-icon`},h={key:3},g={class:`captcha-text`,"aria-live":`polite`},_={key:0},v={key:1,class:`success-text`},y={key:2,class:`error-text`},b={key:3},x=[`title`,`aria-label`],S=(0,n.defineComponent)({name:`C_Captcha`,__name:`index`,props:{triggerText:{},images:{default:()=>[]},disabled:{type:Boolean,default:!1},theme:{default:`dark`},verifier:{},verificationTimeout:{default:1e4},requireServerVerification:{type:Boolean,default:!1},feedback:{},locale:{}},emits:[`success`,`fail`,`verify-error`,`load-error`,`change`,`reset`],setup(t,{expose:i,emit:S}){let C=t,w=S,T=e.r(()=>C.feedback),{t:E}=e.i(()=>C.locale),D=typeof window>`u`?()=>null:(0,n.defineAsyncComponent)({loader:()=>import(`vue3-puzzle-vcode`).then(e=>e.default),onError(e,t,n){T.error(E(`captcha.loadFailed`),e),w(`load-error`,e),n()}}),O=(0,n.ref)(!1),k=(0,n.ref)(!1),A=(0,n.ref)(!1),j=(0,n.ref)(!1),M=(0,n.ref)(null),N=null,P=null,F=(0,n.computed)(()=>C.images.length>0?C.images:void 0),I=(0,n.computed)(()=>j.value?E(`captcha.verifying`):k.value?E(`captcha.success`):A.value?E(`captcha.failed`):C.triggerText??E(`captcha.trigger`)),L=()=>{N&&=(clearTimeout(N),null)},R=(e,t)=>{k.value=!1,A.value=!0,M.value=null,L(),N=setTimeout(()=>{A.value=!1,N=null},3e3),w(`fail`,e),w(`change`,!1),t&&w(`verify-error`,t)},z=()=>{C.disabled||j.value||k.value||(A.value=!1,O.value=!0)},B=async()=>{O.value=!1,A.value=!1,P?.abort();let e=new AbortController;P=e,j.value=!0;try{let t=await o(a(),{verifier:C.verifier,timeout:C.verificationTimeout,requireServerVerification:C.requireServerVerification,signal:e.signal});if(P!==e)return;M.value=t,k.value=!0,w(`success`,t),w(`change`,!0)}catch(t){if(P!==e||t instanceof r&&t.code===`aborted`)return;let n=t instanceof Error?t.message:E(`captcha.failed`);T.error(E(`captcha.verifyFailed`),t),R(n,t)}finally{P===e&&(P=null,j.value=!1)}},V=()=>{O.value=!1,R(E(`captcha.puzzleFailed`))},H=()=>{O.value=!1},U=()=>{P?.abort(),P=null,j.value=!1,k.value=!1,A.value=!1,O.value=!1,M.value=null,L(),w(`reset`),w(`change`,!1)};return i({validate:()=>k.value,getToken:()=>M.value?.token??``,getVerificationData:()=>M.value,reset:U,show:z}),(0,n.onBeforeUnmount)(()=>{P?.abort(),L()}),(e,r)=>((0,n.openBlock)(),(0,n.createElementBlock)(`div`,{class:`c-captcha-modern`,"data-theme":t.theme},[(0,n.createElementVNode)(`div`,c,[(0,n.createElementVNode)(`button`,{type:`button`,class:(0,n.normalizeClass)([`captcha-trigger`,{verified:k.value,error:A.value,disabled:t.disabled||j.value}]),disabled:t.disabled||j.value||k.value,"aria-busy":j.value,"aria-label":I.value,onClick:z},[(0,n.createElementVNode)(`span`,u,[(0,n.createElementVNode)(`span`,d,[j.value?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,f,`…`)):k.value?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,p,`✓`)):A.value?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,m,`⚠️`)):((0,n.openBlock)(),(0,n.createElementBlock)(`span`,h,`🧩`))]),(0,n.createElementVNode)(`span`,g,[j.value?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,_,(0,n.toDisplayString)((0,n.unref)(E)(`captcha.verifying`)),1)):k.value?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,v,(0,n.toDisplayString)((0,n.unref)(E)(`captcha.success`)),1)):A.value?((0,n.openBlock)(),(0,n.createElementBlock)(`span`,y,(0,n.toDisplayString)((0,n.unref)(E)(`captcha.failed`)),1)):((0,n.openBlock)(),(0,n.createElementBlock)(`span`,b,(0,n.toDisplayString)(t.triggerText??(0,n.unref)(E)(`captcha.trigger`)),1))])])],10,l),k.value||A.value?((0,n.openBlock)(),(0,n.createElementBlock)(`button`,{key:0,type:`button`,class:`refresh-button`,title:(0,n.unref)(E)(`captcha.reset`),"aria-label":(0,n.unref)(E)(`captcha.reset`),onClick:U},` ↻ `,8,x)):(0,n.createCommentVNode)(`v-if`,!0)]),(0,n.createVNode)((0,n.unref)(D),{show:O.value,imgs:F.value,onSuccess:B,onClose:H,onFail:V},null,8,[`show`,`imgs`])],8,s))}});var C=t.t(S,[[`__scopeId`,`data-v-29edd4c3`]]);Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return C}});
@@ -1 +1 @@
1
- import{i as e,r as t}from"./config.js";import{t as n}from"./export-helper.js";import{computed as r,createCommentVNode as i,createElementBlock as a,createElementVNode as o,createVNode as s,defineAsyncComponent as c,defineComponent as l,normalizeClass as u,onBeforeUnmount as d,openBlock as f,ref as p,toDisplayString as m,unref as h}from"vue";var g=class extends Error{constructor(e,t,n){super(t),this.code=e,this.cause=n,this.name=`CaptchaVerificationError`}};let _=0;function v(){let e=Date.now();return{token:`puzzle_${e}_${globalThis.crypto?.randomUUID?.()??`${++_}`}`,timestamp:e,type:`puzzle-captcha`}}async function y(e,t={}){let{verifier:n,requireServerVerification:r=!1,signal:i}=t,a=t.timeout??1e4,o=Number.isFinite(a)&&a>0?a:1e4;if(i?.aborted)throw new g(`aborted`,`Verification was cancelled.`);if(!n){if(r)throw new g(`missing-verifier`,`Server verification is required but no verifier was configured.`);return{...e,verifiedBy:`local`}}let s=new AbortController,c=()=>s.abort(i?.reason);i?.addEventListener(`abort`,c,{once:!0});let l,u=new Promise((e,t)=>{l=setTimeout(()=>{s.abort(`timeout`),t(new g(`timeout`,`Verification timed out after ${o}ms.`))},o)}),d=new Promise((e,t)=>{s.signal.addEventListener(`abort`,()=>{s.signal.reason!==`timeout`&&t(new g(`aborted`,`Verification was cancelled.`))},{once:!0})});try{let t=await Promise.race([Promise.resolve(n({...e,signal:s.signal})),u,d]),i=typeof t==`boolean`?{valid:t}:t;if(!i.valid)throw new g(`rejected`,i.message||`Server verification rejected the challenge.`);let a=i.token?.trim();if(r&&!a)throw new g(`missing-token`,`Server verification did not return a trusted token.`);return{...e,token:a||e.token,verifiedBy:`server`}}catch(e){throw e instanceof g?e:new g(`rejected`,`Server verification failed.`,e)}finally{l&&clearTimeout(l),i?.removeEventListener(`abort`,c)}}const b=[`data-theme`],x={class:`captcha-shell`},S=[`disabled`,`aria-busy`,`aria-label`],C={class:`captcha-content`},w={class:`captcha-icon`,"aria-hidden":`true`},T={key:0},E={key:1,class:`success-icon`},D={key:2,class:`error-icon`},O={key:3},k={class:`captcha-text`,"aria-live":`polite`},A={key:0},j={key:1,class:`success-text`},M={key:2,class:`error-text`},N={key:3},P=[`title`,`aria-label`];var F=n(l({name:`C_Captcha`,__name:`index`,props:{triggerText:{},images:{default:()=>[]},disabled:{type:Boolean,default:!1},theme:{default:`dark`},verifier:{},verificationTimeout:{default:1e4},requireServerVerification:{type:Boolean,default:!1},feedback:{},locale:{}},emits:[`success`,`fail`,`verify-error`,`load-error`,`change`,`reset`],setup(n,{expose:l,emit:_}){let F=n,I=_,L=t(()=>F.feedback),{t:R}=e(()=>F.locale),z=typeof window>`u`?()=>null:c({loader:()=>import(`vue3-puzzle-vcode`).then(e=>e.default),onError(e,t,n){L.error(R(`captcha.loadFailed`),e),I(`load-error`,e),n()}}),B=p(!1),V=p(!1),H=p(!1),U=p(!1),W=p(null),G=null,K=null,q=r(()=>F.images.length>0?F.images:void 0),J=r(()=>U.value?R(`captcha.verifying`):V.value?R(`captcha.success`):H.value?R(`captcha.failed`):F.triggerText||R(`captcha.trigger`)),Y=()=>{G&&=(clearTimeout(G),null)},X=(e,t)=>{V.value=!1,H.value=!0,W.value=null,Y(),G=setTimeout(()=>{H.value=!1,G=null},3e3),I(`fail`,e),I(`change`,!1),t&&I(`verify-error`,t)},Z=()=>{F.disabled||U.value||V.value||(H.value=!1,B.value=!0)},Q=async()=>{B.value=!1,H.value=!1,K?.abort();let e=new AbortController;K=e,U.value=!0;try{let t=await y(v(),{verifier:F.verifier,timeout:F.verificationTimeout,requireServerVerification:F.requireServerVerification,signal:e.signal});if(K!==e)return;W.value=t,V.value=!0,I(`success`,t),I(`change`,!0)}catch(t){if(K!==e||t instanceof g&&t.code===`aborted`)return;let n=t instanceof Error?t.message:R(`captcha.failed`);L.error(R(`captcha.verifyFailed`),t),X(n,t)}finally{K===e&&(K=null,U.value=!1)}},ee=()=>{B.value=!1,X(R(`captcha.puzzleFailed`))},te=()=>{B.value=!1},$=()=>{K?.abort(),K=null,U.value=!1,V.value=!1,H.value=!1,B.value=!1,W.value=null,Y(),I(`reset`),I(`change`,!1)};return l({validate:()=>V.value,getToken:()=>W.value?.token??``,getVerificationData:()=>W.value,reset:$,show:Z}),d(()=>{K?.abort(),Y()}),(e,t)=>(f(),a(`div`,{class:`c-captcha-modern`,"data-theme":n.theme},[o(`div`,x,[o(`button`,{type:`button`,class:u([`captcha-trigger`,{verified:V.value,error:H.value,disabled:n.disabled||U.value}]),disabled:n.disabled||U.value||V.value,"aria-busy":U.value,"aria-label":J.value,onClick:Z},[o(`span`,C,[o(`span`,w,[U.value?(f(),a(`span`,T,`…`)):V.value?(f(),a(`span`,E,`✓`)):H.value?(f(),a(`span`,D,`!`)):(f(),a(`span`,O,`↔`))]),o(`span`,k,[U.value?(f(),a(`span`,A,m(h(R)(`captcha.verifying`)),1)):V.value?(f(),a(`span`,j,m(h(R)(`captcha.success`)),1)):H.value?(f(),a(`span`,M,m(h(R)(`captcha.failed`)),1)):(f(),a(`span`,N,m(n.triggerText||h(R)(`captcha.trigger`)),1))])])],10,S),V.value||H.value?(f(),a(`button`,{key:0,type:`button`,class:`refresh-button`,title:h(R)(`captcha.reset`),"aria-label":h(R)(`captcha.reset`),onClick:$},` ↻ `,8,P)):i(`v-if`,!0)]),s(h(z),{show:B.value,imgs:q.value,onSuccess:Q,onClose:te,onFail:ee},null,8,[`show`,`imgs`])],8,b))}}),[[`__scopeId`,`data-v-3b02fca0`]]);export{y as i,g as n,v as r,F as t};
1
+ import{i as e,r as t}from"./config.js";import{t as n}from"./export-helper.js";import{computed as r,createCommentVNode as i,createElementBlock as a,createElementVNode as o,createVNode as s,defineAsyncComponent as c,defineComponent as l,normalizeClass as u,onBeforeUnmount as d,openBlock as f,ref as p,toDisplayString as m,unref as h}from"vue";var g=class extends Error{constructor(e,t,n){super(t),this.code=e,this.cause=n,this.name=`CaptchaVerificationError`}};let _=0;function v(){let e=Date.now();return{token:`puzzle_${e}_${globalThis.crypto?.randomUUID?.()??`${++_}`}`,timestamp:e,type:`puzzle-captcha`}}async function y(e,t={}){let{verifier:n,requireServerVerification:r=!1,signal:i}=t,a=t.timeout??1e4,o=Number.isFinite(a)&&a>0?a:1e4;if(i?.aborted)throw new g(`aborted`,`Verification was cancelled.`);if(!n){if(r)throw new g(`missing-verifier`,`Server verification is required but no verifier was configured.`);return{...e,verifiedBy:`local`}}let s=new AbortController,c=()=>s.abort(i?.reason);i?.addEventListener(`abort`,c,{once:!0});let l,u=new Promise((e,t)=>{l=setTimeout(()=>{s.abort(`timeout`),t(new g(`timeout`,`Verification timed out after ${o}ms.`))},o)}),d=new Promise((e,t)=>{s.signal.addEventListener(`abort`,()=>{s.signal.reason!==`timeout`&&t(new g(`aborted`,`Verification was cancelled.`))},{once:!0})});try{let t=await Promise.race([Promise.resolve(n({...e,signal:s.signal})),u,d]),i=typeof t==`boolean`?{valid:t}:t;if(!i.valid)throw new g(`rejected`,i.message||`Server verification rejected the challenge.`);let a=i.token?.trim();if(r&&!a)throw new g(`missing-token`,`Server verification did not return a trusted token.`);return{...e,token:a||e.token,verifiedBy:`server`}}catch(e){throw e instanceof g?e:new g(`rejected`,`Server verification failed.`,e)}finally{l&&clearTimeout(l),i?.removeEventListener(`abort`,c)}}const b=[`data-theme`],x={class:`captcha-shell`},S=[`disabled`,`aria-busy`,`aria-label`],C={class:`captcha-content`},w={class:`captcha-icon`,"aria-hidden":`true`},T={key:0},E={key:1,class:`success-icon`},D={key:2,class:`error-icon`},O={key:3},k={class:`captcha-text`,"aria-live":`polite`},A={key:0},j={key:1,class:`success-text`},M={key:2,class:`error-text`},N={key:3},P=[`title`,`aria-label`];var F=n(l({name:`C_Captcha`,__name:`index`,props:{triggerText:{},images:{default:()=>[]},disabled:{type:Boolean,default:!1},theme:{default:`dark`},verifier:{},verificationTimeout:{default:1e4},requireServerVerification:{type:Boolean,default:!1},feedback:{},locale:{}},emits:[`success`,`fail`,`verify-error`,`load-error`,`change`,`reset`],setup(n,{expose:l,emit:_}){let F=n,I=_,L=t(()=>F.feedback),{t:R}=e(()=>F.locale),z=typeof window>`u`?()=>null:c({loader:()=>import(`vue3-puzzle-vcode`).then(e=>e.default),onError(e,t,n){L.error(R(`captcha.loadFailed`),e),I(`load-error`,e),n()}}),B=p(!1),V=p(!1),H=p(!1),U=p(!1),W=p(null),G=null,K=null,q=r(()=>F.images.length>0?F.images:void 0),J=r(()=>U.value?R(`captcha.verifying`):V.value?R(`captcha.success`):H.value?R(`captcha.failed`):F.triggerText??R(`captcha.trigger`)),Y=()=>{G&&=(clearTimeout(G),null)},X=(e,t)=>{V.value=!1,H.value=!0,W.value=null,Y(),G=setTimeout(()=>{H.value=!1,G=null},3e3),I(`fail`,e),I(`change`,!1),t&&I(`verify-error`,t)},Z=()=>{F.disabled||U.value||V.value||(H.value=!1,B.value=!0)},Q=async()=>{B.value=!1,H.value=!1,K?.abort();let e=new AbortController;K=e,U.value=!0;try{let t=await y(v(),{verifier:F.verifier,timeout:F.verificationTimeout,requireServerVerification:F.requireServerVerification,signal:e.signal});if(K!==e)return;W.value=t,V.value=!0,I(`success`,t),I(`change`,!0)}catch(t){if(K!==e||t instanceof g&&t.code===`aborted`)return;let n=t instanceof Error?t.message:R(`captcha.failed`);L.error(R(`captcha.verifyFailed`),t),X(n,t)}finally{K===e&&(K=null,U.value=!1)}},ee=()=>{B.value=!1,X(R(`captcha.puzzleFailed`))},te=()=>{B.value=!1},$=()=>{K?.abort(),K=null,U.value=!1,V.value=!1,H.value=!1,B.value=!1,W.value=null,Y(),I(`reset`),I(`change`,!1)};return l({validate:()=>V.value,getToken:()=>W.value?.token??``,getVerificationData:()=>W.value,reset:$,show:Z}),d(()=>{K?.abort(),Y()}),(e,t)=>(f(),a(`div`,{class:`c-captcha-modern`,"data-theme":n.theme},[o(`div`,x,[o(`button`,{type:`button`,class:u([`captcha-trigger`,{verified:V.value,error:H.value,disabled:n.disabled||U.value}]),disabled:n.disabled||U.value||V.value,"aria-busy":U.value,"aria-label":J.value,onClick:Z},[o(`span`,C,[o(`span`,w,[U.value?(f(),a(`span`,T,`…`)):V.value?(f(),a(`span`,E,`✓`)):H.value?(f(),a(`span`,D,`⚠️`)):(f(),a(`span`,O,`🧩`))]),o(`span`,k,[U.value?(f(),a(`span`,A,m(h(R)(`captcha.verifying`)),1)):V.value?(f(),a(`span`,j,m(h(R)(`captcha.success`)),1)):H.value?(f(),a(`span`,M,m(h(R)(`captcha.failed`)),1)):(f(),a(`span`,N,m(n.triggerText??h(R)(`captcha.trigger`)),1))])])],10,S),V.value||H.value?(f(),a(`button`,{key:0,type:`button`,class:`refresh-button`,title:h(R)(`captcha.reset`),"aria-label":h(R)(`captcha.reset`),onClick:$},` ↻ `,8,P)):i(`v-if`,!0)]),s(h(z),{show:B.value,imgs:q.value,onSuccess:Q,onClose:te,onFail:ee},null,8,[`show`,`imgs`])],8,b))}}),[[`__scopeId`,`data-v-29edd4c3`]]);export{y as i,g as n,v as r,F as t};
package/dist/C_Chat.css CHANGED
@@ -1,3 +1,62 @@
1
+ /* unplugin-vue-components disabled */.c-icon[data-v-d0d8dba0] {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ user-select: none;
6
+ transition: all 0.2s ease-in-out;
7
+ }
8
+ .c-icon--clickable[data-v-d0d8dba0] {
9
+ cursor: pointer;
10
+ }
11
+ .c-icon--clickable[data-v-d0d8dba0]:hover {
12
+ opacity: 0.8;
13
+ transform: scale(1.05);
14
+ }
15
+ .c-icon--clickable[data-v-d0d8dba0]:active {
16
+ transform: scale(0.95);
17
+ }
18
+ .c-icon--clickable[data-v-d0d8dba0]:focus-visible {
19
+ outline: 2px solid currentColor;
20
+ outline-offset: 2px;
21
+ border-radius: 4px;
22
+ }
23
+ .c-icon--loading[data-v-d0d8dba0] {
24
+ opacity: 0.6;
25
+ cursor: wait;
26
+ }
27
+ .c-icon--error[data-v-d0d8dba0] {
28
+ opacity: 0.5;
29
+ }
30
+ .c-icon__loading[data-v-d0d8dba0] {
31
+ position: relative;
32
+ }
33
+ .c-icon__spinner[data-v-d0d8dba0] {
34
+ width: 100%;
35
+ height: 100%;
36
+ border: 2px solid currentColor;
37
+ border-radius: 50%;
38
+ border-top-color: transparent;
39
+ animation: spin-d0d8dba0 1s linear infinite;
40
+ }
41
+ .c-icon__error[data-v-d0d8dba0] {
42
+ font-size: 0.8em;
43
+ opacity: 0.5;
44
+ }
45
+ .c-icon__rotatable[data-v-d0d8dba0] {
46
+ transition: transform 0.3s ease-in-out;
47
+ }
48
+ .c-icon__flippable[data-v-d0d8dba0] {
49
+ transition: transform 0.3s ease-in-out;
50
+ }
51
+ @keyframes spin-d0d8dba0 {
52
+ 0% {
53
+ transform: rotate(0deg);
54
+ }
55
+ 100% {
56
+ transform: rotate(360deg);
57
+ }
58
+ }
59
+
1
60
  /* unplugin-vue-components disabled *//* ─── CSS 变量(基于项目主题变量,自动适配明暗) ───────────────────────── */
2
61
  .c-chat[data-v-5b4bf8dc] {
3
62
  --chat-bg: var(--card-color);
package/dist/C_Code.css CHANGED
@@ -1,3 +1,62 @@
1
+ /* unplugin-vue-components disabled */.c-icon[data-v-d0d8dba0] {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ user-select: none;
6
+ transition: all 0.2s ease-in-out;
7
+ }
8
+ .c-icon--clickable[data-v-d0d8dba0] {
9
+ cursor: pointer;
10
+ }
11
+ .c-icon--clickable[data-v-d0d8dba0]:hover {
12
+ opacity: 0.8;
13
+ transform: scale(1.05);
14
+ }
15
+ .c-icon--clickable[data-v-d0d8dba0]:active {
16
+ transform: scale(0.95);
17
+ }
18
+ .c-icon--clickable[data-v-d0d8dba0]:focus-visible {
19
+ outline: 2px solid currentColor;
20
+ outline-offset: 2px;
21
+ border-radius: 4px;
22
+ }
23
+ .c-icon--loading[data-v-d0d8dba0] {
24
+ opacity: 0.6;
25
+ cursor: wait;
26
+ }
27
+ .c-icon--error[data-v-d0d8dba0] {
28
+ opacity: 0.5;
29
+ }
30
+ .c-icon__loading[data-v-d0d8dba0] {
31
+ position: relative;
32
+ }
33
+ .c-icon__spinner[data-v-d0d8dba0] {
34
+ width: 100%;
35
+ height: 100%;
36
+ border: 2px solid currentColor;
37
+ border-radius: 50%;
38
+ border-top-color: transparent;
39
+ animation: spin-d0d8dba0 1s linear infinite;
40
+ }
41
+ .c-icon__error[data-v-d0d8dba0] {
42
+ font-size: 0.8em;
43
+ opacity: 0.5;
44
+ }
45
+ .c-icon__rotatable[data-v-d0d8dba0] {
46
+ transition: transform 0.3s ease-in-out;
47
+ }
48
+ .c-icon__flippable[data-v-d0d8dba0] {
49
+ transition: transform 0.3s ease-in-out;
50
+ }
51
+ @keyframes spin-d0d8dba0 {
52
+ 0% {
53
+ transform: rotate(0deg);
54
+ }
55
+ 100% {
56
+ transform: rotate(360deg);
57
+ }
58
+ }
59
+
1
60
  pre code.hljs {
2
61
  display: block;
3
62
  overflow-x: auto;
@@ -1,3 +1,62 @@
1
+ /* unplugin-vue-components disabled */.c-icon[data-v-d0d8dba0] {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ user-select: none;
6
+ transition: all 0.2s ease-in-out;
7
+ }
8
+ .c-icon--clickable[data-v-d0d8dba0] {
9
+ cursor: pointer;
10
+ }
11
+ .c-icon--clickable[data-v-d0d8dba0]:hover {
12
+ opacity: 0.8;
13
+ transform: scale(1.05);
14
+ }
15
+ .c-icon--clickable[data-v-d0d8dba0]:active {
16
+ transform: scale(0.95);
17
+ }
18
+ .c-icon--clickable[data-v-d0d8dba0]:focus-visible {
19
+ outline: 2px solid currentColor;
20
+ outline-offset: 2px;
21
+ border-radius: 4px;
22
+ }
23
+ .c-icon--loading[data-v-d0d8dba0] {
24
+ opacity: 0.6;
25
+ cursor: wait;
26
+ }
27
+ .c-icon--error[data-v-d0d8dba0] {
28
+ opacity: 0.5;
29
+ }
30
+ .c-icon__loading[data-v-d0d8dba0] {
31
+ position: relative;
32
+ }
33
+ .c-icon__spinner[data-v-d0d8dba0] {
34
+ width: 100%;
35
+ height: 100%;
36
+ border: 2px solid currentColor;
37
+ border-radius: 50%;
38
+ border-top-color: transparent;
39
+ animation: spin-d0d8dba0 1s linear infinite;
40
+ }
41
+ .c-icon__error[data-v-d0d8dba0] {
42
+ font-size: 0.8em;
43
+ opacity: 0.5;
44
+ }
45
+ .c-icon__rotatable[data-v-d0d8dba0] {
46
+ transition: transform 0.3s ease-in-out;
47
+ }
48
+ .c-icon__flippable[data-v-d0d8dba0] {
49
+ transition: transform 0.3s ease-in-out;
50
+ }
51
+ @keyframes spin-d0d8dba0 {
52
+ 0% {
53
+ transform: rotate(0deg);
54
+ }
55
+ 100% {
56
+ transform: rotate(360deg);
57
+ }
58
+ }
59
+
1
60
  /* unplugin-vue-components disabled *//* ─── 变量 ───────────────────────────────────────── */
2
61
  /* ─── 容器 ───────────────────────────────────────── */
3
62
  .c-collapse-panel[data-v-3ad19a41] {