@robot-admin/naive-ui-components 0.4.0 → 0.4.2

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 (46) hide show
  1. package/dist/{C_GlobalSearch-vYKBV1fJ.css.map → C_GlobalSearch-DoPjldFm.css.map} +1 -1
  2. package/dist/C_GlobalSearch2.js +1 -1
  3. package/dist/C_GlobalSearch2.js.map +1 -1
  4. package/dist/{C_Table-XKQOEFHF.css.map → C_Table-C55H4kPr.css.map} +1 -1
  5. package/dist/C_Table2.js +21 -4
  6. package/dist/C_Table2.js.map +1 -1
  7. package/dist/constants.d.ts +1 -1
  8. package/dist/constants2.d.ts +2 -2
  9. package/dist/constants3.d.ts +5 -5
  10. package/dist/constants4.d.ts +3 -3
  11. package/dist/index.cjs +28 -0
  12. package/dist/index.d.cts +17 -1
  13. package/dist/index.d.cts.map +1 -1
  14. package/dist/index.d.ts +17 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +28 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/index10.vue.d.ts +1 -1
  19. package/dist/index12.vue.d.ts +3 -3
  20. package/dist/index13.vue.d.ts +2 -2
  21. package/dist/index14.vue.d.ts +1 -1
  22. package/dist/index16.vue.d.ts +2 -2
  23. package/dist/index16.vue.d.ts.map +1 -1
  24. package/dist/index2.vue.d.ts +5 -5
  25. package/dist/index3.vue.d.ts +2 -2
  26. package/dist/index6.vue.d.ts +1 -1
  27. package/dist/index8.vue.d.ts +1 -1
  28. package/dist/style.css +183 -183
  29. package/dist/useCollapsePanel.d.ts +4 -4
  30. package/dist/useCropperCore.d.ts +3 -3
  31. package/dist/useDraggableLayout.d.ts +2 -2
  32. package/dist/useDynamicFormState.d.ts +6 -6
  33. package/dist/useEdgeInteraction.d.ts +1 -1
  34. package/dist/useFullscreen.d.ts +2 -2
  35. package/dist/useGlobalSearch.d.ts.map +1 -1
  36. package/dist/useInfiniteScroll.d.ts +1 -1
  37. package/dist/useModalEdit.d.ts +2 -2
  38. package/dist/useModalEdit.d.ts.map +1 -1
  39. package/dist/useQRCode.d.ts +3 -3
  40. package/dist/useQRCode.d.ts.map +1 -1
  41. package/dist/useSignatureHistory.d.ts +3 -3
  42. package/dist/useSplitResize.d.ts +4 -4
  43. package/dist/useTimeSelection.d.ts +2 -2
  44. package/dist/useTreeOperations.d.ts +3 -3
  45. package/dist/useWorkflowValidation.d.ts +2 -2
  46. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"C_GlobalSearch-vYKBV1fJ.css","names":[],"sources":["../src/components/C_GlobalSearch/index.vue?vue&type=style&index=0&scoped=b899016b&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled */[data-v-b899016b] .robot-highlight {\n background: linear-gradient(135deg, rgba(255, 193, 7, 0.25), rgba(255, 193, 7, 0.35));\n color: inherit;\n border-radius: 3px;\n padding: 1px 2px;\n font-weight: 600;\n box-shadow: 0 0 0 1px rgba(255, 193, 7, 0.2);\n}\n.dialog-dark[data-v-b899016b] .robot-highlight {\n background: linear-gradient(135deg, rgba(255, 193, 7, 0.3), rgba(255, 193, 7, 0.45));\n box-shadow: 0 0 0 1px rgba(255, 193, 7, 0.3);\n}\n.robot-search-trigger[data-v-b899016b] {\n display: inline-flex;\n align-items: center;\n gap: 12px;\n padding: 4px 14px;\n background: linear-gradient(145deg, rgba(99, 102, 241, 0.12), rgba(139, 92, 246, 0.08));\n backdrop-filter: blur(20px);\n border: 1px solid rgba(99, 102, 241, 0.2);\n border-radius: 14px;\n font-size: 13px;\n color: #4f46e5;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n user-select: none;\n min-width: 160px;\n position: relative;\n overflow: hidden;\n}\n.robot-search-trigger[data-v-b899016b]::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: -100%;\n width: 100%;\n height: 100%;\n background: linear-gradient(90deg, transparent, rgba(99, 102, 241, 0.15), transparent);\n transition: left 0.5s ease;\n}\n.robot-search-trigger .robot-trigger-icon[data-v-b899016b] {\n font-size: 16px;\n opacity: 0.9;\n flex-shrink: 0;\n transition: all 0.3s ease;\n}\n.robot-search-trigger .robot-trigger-text[data-v-b899016b] {\n flex: 1;\n font-weight: 500;\n letter-spacing: 0.01em;\n}\n.robot-search-trigger .robot-trigger-shortcut[data-v-b899016b] {\n font-size: 11px;\n opacity: 0.9;\n font-family: ui-monospace, \"SF Mono\", Monaco, \"Cascadia Code\", \"Roboto Mono\", Consolas, \"Courier New\", monospace;\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.15), rgba(139, 92, 246, 0.12));\n padding: 2px 6px;\n border-radius: 4px;\n border: 1px solid rgba(99, 102, 241, 0.25);\n margin-left: auto;\n color: #3730a3;\n transition: all 0.3s ease;\n}\n.robot-search-trigger[data-v-b899016b]:hover {\n background: linear-gradient(145deg, rgba(99, 102, 241, 0.18), rgba(139, 92, 246, 0.12));\n border-color: rgba(99, 102, 241, 0.3);\n color: #3730a3;\n transform: translateY(-1px);\n}\n.robot-search-trigger[data-v-b899016b]:hover::before {\n left: 100%;\n}\n.robot-search-trigger:hover .robot-trigger-icon[data-v-b899016b] {\n opacity: 1;\n transform: scale(1.05);\n}\n.robot-search-trigger:hover .robot-trigger-shortcut[data-v-b899016b] {\n opacity: 1;\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.22), rgba(139, 92, 246, 0.18));\n border-color: rgba(99, 102, 241, 0.35);\n color: #312e81;\n transform: scale(1.05);\n}\n.robot-search-trigger[data-v-b899016b]:active {\n transform: translateY(0) scale(0.98);\n transition: all 0.1s ease;\n}\n.robot-search-trigger.trigger-dark[data-v-b899016b] {\n background: linear-gradient(145deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.03));\n border-color: rgba(255, 255, 255, 0.12);\n color: #d1d5db;\n}\n.robot-search-trigger.trigger-dark[data-v-b899016b]::before {\n background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.1), transparent);\n}\n.robot-search-trigger.trigger-dark .robot-trigger-shortcut[data-v-b899016b] {\n background: rgba(255, 255, 255, 0.1);\n border-color: rgba(255, 255, 255, 0.15);\n color: #b4b8c0;\n}\n.robot-search-trigger.trigger-dark[data-v-b899016b]:hover {\n background: linear-gradient(145deg, rgba(255, 255, 255, 0.12), rgba(255, 255, 255, 0.06));\n border-color: rgba(255, 255, 255, 0.18);\n color: #e5e7eb;\n}\n.robot-search-trigger.trigger-dark:hover .robot-trigger-shortcut[data-v-b899016b] {\n background: rgba(255, 255, 255, 0.15);\n border-color: rgba(255, 255, 255, 0.25);\n color: #d1d5db;\n}\n.robot-dialog-overlay[data-v-b899016b] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: linear-gradient(135deg, rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.4));\n backdrop-filter: blur(12px);\n z-index: 9999;\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding: 80px 16px 16px;\n overflow-y: auto;\n}\n.robot-dialog-container[data-v-b899016b] {\n width: 100%;\n max-width: 580px;\n background: linear-gradient(145deg, rgba(255, 255, 255, 0.98), rgba(255, 255, 255, 0.92));\n backdrop-filter: blur(24px);\n border-radius: 16px;\n border: 1px solid rgba(255, 255, 255, 0.4);\n box-shadow: 0 24px 32px -8px rgba(0, 0, 0, 0.12), 0 16px 24px -8px rgba(0, 0, 0, 0.08), 0 8px 16px -4px rgba(0, 0, 0, 0.04), 0 0 0 1px rgba(255, 255, 255, 0.1);\n overflow: hidden;\n margin: 0 auto;\n position: relative;\n}\n.robot-dialog-container[data-v-b899016b]::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 1px;\n background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.6), transparent);\n}\n.robot-dialog-container.dialog-dark[data-v-b899016b] {\n background: linear-gradient(145deg, rgba(24, 24, 27, 0.98), rgba(18, 18, 20, 0.95));\n backdrop-filter: blur(32px);\n border-color: rgba(255, 255, 255, 0.12);\n box-shadow: 0 24px 32px -8px rgba(0, 0, 0, 0.4), 0 16px 24px -8px rgba(0, 0, 0, 0.3), 0 8px 16px -4px rgba(0, 0, 0, 0.2), 0 0 0 1px rgba(255, 255, 255, 0.05);\n}\n.robot-dialog-container.dialog-dark[data-v-b899016b]::before {\n background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.15), transparent);\n}\n.robot-search-header[data-v-b899016b] {\n display: flex;\n align-items: center;\n padding: 20px 24px;\n gap: 14px;\n border-bottom: 1px solid rgba(0, 0, 0, 0.06);\n background: linear-gradient(180deg, rgba(255, 255, 255, 0.5), rgba(255, 255, 255, 0.2));\n}\n.robot-search-header .robot-search-icon[data-v-b899016b] {\n color: #6b7280;\n font-size: 20px;\n flex-shrink: 0;\n opacity: 0.8;\n}\n.robot-search-header .robot-search-input[data-v-b899016b] {\n flex: 1;\n border: none;\n outline: none;\n background: transparent;\n font-size: 16px;\n color: #1f2937;\n line-height: 1.6;\n font-weight: 400;\n}\n.robot-search-header .robot-search-input[data-v-b899016b]::placeholder {\n color: #9ca3af;\n font-weight: 400;\n}\n.robot-search-header .robot-close-btn[data-v-b899016b] {\n padding: 8px;\n border: none;\n background: rgba(0, 0, 0, 0.04);\n border-radius: 8px;\n color: #6b7280;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n backdrop-filter: blur(8px);\n}\n.robot-search-header .robot-close-btn[data-v-b899016b]:hover {\n background: rgba(0, 0, 0, 0.08);\n color: #374151;\n transform: scale(1.05);\n}\n.robot-search-header .robot-close-btn[data-v-b899016b]:active {\n transform: scale(0.95);\n}\n.dialog-dark .robot-search-header[data-v-b899016b] {\n border-bottom-color: rgba(255, 255, 255, 0.08);\n background: linear-gradient(180deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.03));\n}\n.dialog-dark .robot-search-header .robot-search-icon[data-v-b899016b],\n.dialog-dark .robot-search-header .robot-close-btn[data-v-b899016b] {\n color: #9ca3af;\n}\n.dialog-dark .robot-search-header .robot-close-btn[data-v-b899016b] {\n background: rgba(255, 255, 255, 0.06);\n}\n.dialog-dark .robot-search-header .robot-close-btn[data-v-b899016b]:hover {\n color: #d1d5db;\n background: rgba(255, 255, 255, 0.12);\n}\n.dialog-dark .robot-search-header .robot-search-input[data-v-b899016b] {\n color: #f9fafb;\n}\n.dialog-dark .robot-search-header .robot-search-input[data-v-b899016b]::placeholder {\n color: #6b7280;\n}\n.robot-search-content[data-v-b899016b] {\n max-height: 420px;\n overflow-y: auto;\n overscroll-behavior: contain;\n}\n.robot-search-content[data-v-b899016b]::-webkit-scrollbar {\n width: 6px;\n}\n.robot-search-content[data-v-b899016b]::-webkit-scrollbar-track {\n background: transparent;\n}\n.robot-search-content[data-v-b899016b]::-webkit-scrollbar-thumb {\n background: rgba(0, 0, 0, 0.1);\n border-radius: 3px;\n}\n.robot-search-content[data-v-b899016b]::-webkit-scrollbar-thumb:hover {\n background: rgba(0, 0, 0, 0.15);\n}\n.dialog-dark .robot-search-content[data-v-b899016b]::-webkit-scrollbar-thumb {\n background: rgba(255, 255, 255, 0.1);\n}\n.dialog-dark .robot-search-content[data-v-b899016b]::-webkit-scrollbar-thumb:hover {\n background: rgba(255, 255, 255, 0.15);\n}\n.robot-empty-state[data-v-b899016b] {\n padding: 40px 24px;\n text-align: center;\n}\n.robot-empty-state .robot-empty-icon[data-v-b899016b] {\n font-size: 36px;\n color: #d1d5db;\n margin-bottom: 16px;\n opacity: 0.8;\n}\n.robot-empty-state p[data-v-b899016b] {\n margin: 0;\n font-size: 15px;\n color: #6b7280;\n font-weight: 400;\n line-height: 1.5;\n}\n.dialog-dark .robot-empty-state .robot-empty-icon[data-v-b899016b] {\n color: #6b7280;\n}\n.dialog-dark .robot-empty-state p[data-v-b899016b] {\n color: #9ca3af;\n}\n.robot-search-results[data-v-b899016b] {\n padding: 12px 0 8px;\n}\n.robot-result-group[data-v-b899016b]:not(:last-child) {\n margin-bottom: 12px;\n}\n.robot-group-title[data-v-b899016b] {\n padding: 16px 24px 10px;\n font-size: 12px;\n font-weight: 700;\n color: #6b7280;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n margin: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n background: linear-gradient(90deg, rgba(0, 0, 0, 0.02), transparent);\n}\n.robot-group-title .robot-group-icon[data-v-b899016b] {\n font-size: 14px;\n opacity: 0.8;\n}\n.robot-group-title .robot-group-count[data-v-b899016b] {\n margin-left: auto;\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.1), rgba(99, 102, 241, 0.05));\n color: #6366f1;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 10px;\n font-weight: 600;\n border: 1px solid rgba(99, 102, 241, 0.15);\n box-shadow: 0 1px 2px rgba(99, 102, 241, 0.1);\n}\n.robot-group-title .robot-clear-history[data-v-b899016b] {\n padding: 4px;\n margin-left: 8px;\n background: rgba(239, 68, 68, 0.1);\n border: 1px solid rgba(239, 68, 68, 0.2);\n border-radius: 6px;\n color: #ef4444;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n width: 24px;\n height: 24px;\n}\n.robot-group-title .robot-clear-history div[data-v-b899016b] {\n width: 12px;\n height: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.robot-group-title .robot-clear-history[data-v-b899016b]:hover {\n background: rgba(239, 68, 68, 0.15);\n border-color: rgba(239, 68, 68, 0.3);\n color: #dc2626;\n transform: scale(1.05);\n}\n.robot-group-title .robot-clear-history[data-v-b899016b]:active {\n transform: scale(0.95);\n}\n.dialog-dark .robot-group-title[data-v-b899016b] {\n color: #9ca3af;\n background: linear-gradient(90deg, rgba(255, 255, 255, 0.03), transparent);\n}\n.dialog-dark .robot-group-title .robot-group-count[data-v-b899016b] {\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.15), rgba(99, 102, 241, 0.08));\n color: #a5b4fc;\n border-color: rgba(99, 102, 241, 0.2);\n}\n.robot-group-items[data-v-b899016b] {\n padding: 0 12px;\n}\n.robot-result-item[data-v-b899016b] {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 12px 14px;\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n margin: 2px 0;\n}\n.robot-result-item[data-v-b899016b]::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: linear-gradient(135deg, rgba(0, 0, 0, 0.02), rgba(0, 0, 0, 0.01));\n border-radius: 10px;\n opacity: 0;\n transition: opacity 0.2s ease;\n}\n.robot-result-item[data-v-b899016b]:hover, .robot-result-item.robot-result-item-selected[data-v-b899016b] {\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.06), rgba(99, 102, 241, 0.03));\n transform: translateX(2px);\n box-shadow: 0 2px 8px rgba(99, 102, 241, 0.1), 0 1px 3px rgba(0, 0, 0, 0.05);\n border: 1px solid rgba(99, 102, 241, 0.1);\n}\n.robot-result-item[data-v-b899016b]:hover::before, .robot-result-item.robot-result-item-selected[data-v-b899016b]::before {\n opacity: 1;\n}\n.robot-result-item:hover .robot-item-icon[data-v-b899016b], .robot-result-item.robot-result-item-selected .robot-item-icon[data-v-b899016b] {\n transform: scale(1.05);\n color: #6366f1;\n}\n.robot-result-item:hover .robot-item-label[data-v-b899016b], .robot-result-item.robot-result-item-selected .robot-item-label[data-v-b899016b] {\n color: #4f46e5;\n}\n.robot-result-item:hover.robot-history-item .robot-history-delete[data-v-b899016b], .robot-result-item.robot-result-item-selected.robot-history-item .robot-history-delete[data-v-b899016b] {\n opacity: 1;\n transform: scale(1);\n}\n.robot-result-item .robot-item-icon[data-v-b899016b] {\n font-size: 18px;\n color: #6b7280;\n flex-shrink: 0;\n width: 22px;\n height: 22px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n border-radius: 6px;\n background: rgba(0, 0, 0, 0.02);\n}\n.robot-result-item .robot-item-icon.robot-default-icon[data-v-b899016b] {\n opacity: 0.6;\n background: rgba(0, 0, 0, 0.04);\n}\n.robot-result-item .robot-item-content[data-v-b899016b] {\n flex: 1;\n min-width: 0;\n}\n.robot-result-item .robot-item-content .robot-item-label[data-v-b899016b] {\n font-size: 14px;\n font-weight: 600;\n color: #1f2937;\n line-height: 1.4;\n transition: color 0.2s ease;\n margin-bottom: 1px;\n}\n.robot-result-item .robot-item-content .robot-item-desc[data-v-b899016b] {\n font-size: 12px;\n color: #6b7280;\n line-height: 1.3;\n opacity: 0.8;\n font-weight: 400;\n}\n.robot-result-item .robot-item-badge[data-v-b899016b] {\n font-size: 10px;\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.12), rgba(99, 102, 241, 0.08));\n color: #6366f1;\n padding: 3px 8px;\n border-radius: 12px;\n font-weight: 600;\n min-width: 22px;\n text-align: center;\n border: 1px solid rgba(99, 102, 241, 0.15);\n box-shadow: 0 1px 2px rgba(99, 102, 241, 0.1);\n transition: all 0.2s ease;\n}\n.robot-result-item .robot-history-delete[data-v-b899016b] {\n padding: 4px;\n background: rgba(239, 68, 68, 0.08);\n border: 1px solid rgba(239, 68, 68, 0.15);\n border-radius: 6px;\n color: #ef4444;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n opacity: 0;\n transform: scale(0.8);\n flex-shrink: 0;\n width: 24px;\n height: 24px;\n}\n.robot-result-item .robot-history-delete[data-v-b899016b]:hover {\n background: rgba(239, 68, 68, 0.15);\n border-color: rgba(239, 68, 68, 0.25);\n color: #dc2626;\n transform: scale(1.05);\n}\n.robot-result-item .robot-history-delete[data-v-b899016b]:active {\n transform: scale(0.9);\n}\n.dialog-dark .robot-result-item[data-v-b899016b]:hover, .dialog-dark .robot-result-item.robot-result-item-selected[data-v-b899016b] {\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.12), rgba(99, 102, 241, 0.06));\n border-color: rgba(99, 102, 241, 0.15);\n box-shadow: 0 2px 8px rgba(99, 102, 241, 0.15), 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n.dialog-dark .robot-result-item:hover .robot-item-icon[data-v-b899016b], .dialog-dark .robot-result-item.robot-result-item-selected .robot-item-icon[data-v-b899016b] {\n color: #a5b4fc;\n background: rgba(255, 255, 255, 0.08);\n}\n.dialog-dark .robot-result-item:hover .robot-item-label[data-v-b899016b], .dialog-dark .robot-result-item.robot-result-item-selected .robot-item-label[data-v-b899016b] {\n color: #c7d2fe;\n}\n.dialog-dark .robot-result-item .robot-item-icon[data-v-b899016b] {\n color: #9ca3af;\n background: rgba(255, 255, 255, 0.04);\n}\n.dialog-dark .robot-result-item .robot-item-icon.robot-default-icon[data-v-b899016b] {\n background: rgba(255, 255, 255, 0.06);\n}\n.dialog-dark .robot-result-item .robot-item-content .robot-item-label[data-v-b899016b] {\n color: #f9fafb;\n}\n.dialog-dark .robot-result-item .robot-item-content .robot-item-desc[data-v-b899016b] {\n color: #9ca3af;\n}\n.dialog-dark .robot-result-item .robot-item-badge[data-v-b899016b] {\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.2), rgba(99, 102, 241, 0.12));\n color: #a5b4fc;\n border-color: rgba(99, 102, 241, 0.25);\n}\n.robot-search-footer[data-v-b899016b] {\n padding: 16px 24px;\n border-top: 1px solid rgba(0, 0, 0, 0.06);\n background: linear-gradient(180deg, rgba(0, 0, 0, 0.02), rgba(0, 0, 0, 0.01));\n display: flex;\n justify-content: space-between;\n align-items: center;\n backdrop-filter: blur(8px);\n}\n.robot-search-footer .robot-footer-info[data-v-b899016b] {\n font-size: 11px;\n color: #9ca3af;\n font-weight: 500;\n}\n.dialog-dark .robot-search-footer[data-v-b899016b] {\n border-top-color: rgba(255, 255, 255, 0.08);\n background: linear-gradient(180deg, rgba(255, 255, 255, 0.04), rgba(255, 255, 255, 0.02));\n}\n.dialog-dark .robot-search-footer .robot-footer-info[data-v-b899016b] {\n color: #6b7280;\n}\n.robot-footer-actions[data-v-b899016b] {\n display: flex;\n gap: 18px;\n}\n.robot-footer-actions .robot-action-item[data-v-b899016b] {\n display: flex;\n align-items: center;\n gap: 7px;\n font-size: 12px;\n color: #6b7280;\n font-weight: 500;\n}\n.robot-footer-actions .robot-action-item kbd[data-v-b899016b] {\n padding: 3px 8px;\n background: linear-gradient(135deg, rgba(255, 255, 255, 0.9), rgba(255, 255, 255, 0.7));\n border: 1px solid rgba(0, 0, 0, 0.12);\n border-radius: 5px;\n font-family: ui-monospace, \"SF Mono\", Monaco, \"Cascadia Code\", \"Roboto Mono\", Consolas, \"Courier New\", monospace;\n font-size: 10px;\n line-height: 1;\n color: #4b5563;\n min-width: 22px;\n text-align: center;\n font-weight: 600;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.8);\n}\n.dialog-dark .robot-footer-actions .robot-action-item kbd[data-v-b899016b] {\n background: linear-gradient(135deg, rgba(255, 255, 255, 0.12), rgba(255, 255, 255, 0.08));\n border-color: rgba(255, 255, 255, 0.18);\n color: #d1d5db;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n.robot-footer-actions .robot-action-item span[data-v-b899016b] {\n font-size: 11px;\n font-weight: 500;\n}\n.dialog-dark .robot-footer-actions .robot-action-item[data-v-b899016b] {\n color: #9ca3af;\n}\n.robot-dialog-enter-active[data-v-b899016b],\n.robot-dialog-leave-active[data-v-b899016b] {\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.robot-dialog-enter-from[data-v-b899016b],\n.robot-dialog-leave-to[data-v-b899016b] {\n opacity: 0;\n}\n.robot-dialog-enter-from .robot-dialog-container[data-v-b899016b],\n.robot-dialog-leave-to .robot-dialog-container[data-v-b899016b] {\n transform: scale(0.92) translateY(-40px);\n opacity: 0;\n}\n.robot-dialog-enter-to[data-v-b899016b] {\n opacity: 1;\n}\n.robot-dialog-enter-to .robot-dialog-container[data-v-b899016b] {\n transform: scale(1) translateY(0);\n opacity: 1;\n}\n@media (max-width: 640px) {\n.robot-dialog-overlay[data-v-b899016b] {\n padding: 60px 12px 12px;\n}\n.robot-dialog-container[data-v-b899016b] {\n border-radius: 12px;\n}\n.robot-search-header[data-v-b899016b] {\n padding: 16px 18px;\n}\n.robot-group-title[data-v-b899016b] {\n padding: 14px 18px 8px;\n}\n.robot-group-items[data-v-b899016b] {\n padding: 0 6px;\n}\n.robot-result-item[data-v-b899016b] {\n padding: 10px 12px;\n gap: 12px;\n}\n.robot-search-footer[data-v-b899016b] {\n padding: 14px 18px;\n flex-direction: column;\n gap: 8px;\n align-items: stretch;\n}\n.robot-search-footer .robot-footer-actions[data-v-b899016b] {\n justify-content: center;\n gap: 14px;\n}\n.robot-search-footer .robot-footer-info[data-v-b899016b] {\n text-align: center;\n order: -1;\n}\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
1
+ {"version":3,"file":"C_GlobalSearch-DoPjldFm.css","names":[],"sources":["../src/components/C_GlobalSearch/index.vue?vue&type=style&index=0&scoped=4b182fa8&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled */[data-v-4b182fa8] .robot-highlight {\n background: linear-gradient(135deg, rgba(255, 193, 7, 0.25), rgba(255, 193, 7, 0.35));\n color: inherit;\n border-radius: 3px;\n padding: 1px 2px;\n font-weight: 600;\n box-shadow: 0 0 0 1px rgba(255, 193, 7, 0.2);\n}\n.dialog-dark[data-v-4b182fa8] .robot-highlight {\n background: linear-gradient(135deg, rgba(255, 193, 7, 0.3), rgba(255, 193, 7, 0.45));\n box-shadow: 0 0 0 1px rgba(255, 193, 7, 0.3);\n}\n.robot-search-trigger[data-v-4b182fa8] {\n display: inline-flex;\n align-items: center;\n gap: 12px;\n padding: 4px 14px;\n background: linear-gradient(145deg, rgba(99, 102, 241, 0.12), rgba(139, 92, 246, 0.08));\n backdrop-filter: blur(20px);\n border: 1px solid rgba(99, 102, 241, 0.2);\n border-radius: 14px;\n font-size: 13px;\n color: #4f46e5;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n user-select: none;\n min-width: 160px;\n position: relative;\n overflow: hidden;\n}\n.robot-search-trigger[data-v-4b182fa8]::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: -100%;\n width: 100%;\n height: 100%;\n background: linear-gradient(90deg, transparent, rgba(99, 102, 241, 0.15), transparent);\n transition: left 0.5s ease;\n}\n.robot-search-trigger .robot-trigger-icon[data-v-4b182fa8] {\n font-size: 16px;\n opacity: 0.9;\n flex-shrink: 0;\n transition: all 0.3s ease;\n}\n.robot-search-trigger .robot-trigger-text[data-v-4b182fa8] {\n flex: 1;\n font-weight: 500;\n letter-spacing: 0.01em;\n}\n.robot-search-trigger .robot-trigger-shortcut[data-v-4b182fa8] {\n font-size: 11px;\n opacity: 0.9;\n font-family: ui-monospace, \"SF Mono\", Monaco, \"Cascadia Code\", \"Roboto Mono\", Consolas, \"Courier New\", monospace;\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.15), rgba(139, 92, 246, 0.12));\n padding: 2px 6px;\n border-radius: 4px;\n border: 1px solid rgba(99, 102, 241, 0.25);\n margin-left: auto;\n color: #3730a3;\n transition: all 0.3s ease;\n}\n.robot-search-trigger[data-v-4b182fa8]:hover {\n background: linear-gradient(145deg, rgba(99, 102, 241, 0.18), rgba(139, 92, 246, 0.12));\n border-color: rgba(99, 102, 241, 0.3);\n color: #3730a3;\n transform: translateY(-1px);\n}\n.robot-search-trigger[data-v-4b182fa8]:hover::before {\n left: 100%;\n}\n.robot-search-trigger:hover .robot-trigger-icon[data-v-4b182fa8] {\n opacity: 1;\n transform: scale(1.05);\n}\n.robot-search-trigger:hover .robot-trigger-shortcut[data-v-4b182fa8] {\n opacity: 1;\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.22), rgba(139, 92, 246, 0.18));\n border-color: rgba(99, 102, 241, 0.35);\n color: #312e81;\n transform: scale(1.05);\n}\n.robot-search-trigger[data-v-4b182fa8]:active {\n transform: translateY(0) scale(0.98);\n transition: all 0.1s ease;\n}\n.robot-search-trigger.trigger-dark[data-v-4b182fa8] {\n background: linear-gradient(145deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.03));\n border-color: rgba(255, 255, 255, 0.12);\n color: #d1d5db;\n}\n.robot-search-trigger.trigger-dark[data-v-4b182fa8]::before {\n background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.1), transparent);\n}\n.robot-search-trigger.trigger-dark .robot-trigger-shortcut[data-v-4b182fa8] {\n background: rgba(255, 255, 255, 0.1);\n border-color: rgba(255, 255, 255, 0.15);\n color: #b4b8c0;\n}\n.robot-search-trigger.trigger-dark[data-v-4b182fa8]:hover {\n background: linear-gradient(145deg, rgba(255, 255, 255, 0.12), rgba(255, 255, 255, 0.06));\n border-color: rgba(255, 255, 255, 0.18);\n color: #e5e7eb;\n}\n.robot-search-trigger.trigger-dark:hover .robot-trigger-shortcut[data-v-4b182fa8] {\n background: rgba(255, 255, 255, 0.15);\n border-color: rgba(255, 255, 255, 0.25);\n color: #d1d5db;\n}\n.robot-dialog-overlay[data-v-4b182fa8] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: linear-gradient(135deg, rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.4));\n backdrop-filter: blur(12px);\n z-index: 9999;\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding: 80px 16px 16px;\n overflow-y: auto;\n}\n.robot-dialog-container[data-v-4b182fa8] {\n width: 100%;\n max-width: 580px;\n background: linear-gradient(145deg, rgba(255, 255, 255, 0.98), rgba(255, 255, 255, 0.92));\n backdrop-filter: blur(24px);\n border-radius: 16px;\n border: 1px solid rgba(255, 255, 255, 0.4);\n box-shadow: 0 24px 32px -8px rgba(0, 0, 0, 0.12), 0 16px 24px -8px rgba(0, 0, 0, 0.08), 0 8px 16px -4px rgba(0, 0, 0, 0.04), 0 0 0 1px rgba(255, 255, 255, 0.1);\n overflow: hidden;\n margin: 0 auto;\n position: relative;\n}\n.robot-dialog-container[data-v-4b182fa8]::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n height: 1px;\n background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.6), transparent);\n}\n.robot-dialog-container.dialog-dark[data-v-4b182fa8] {\n background: linear-gradient(145deg, rgba(24, 24, 27, 0.98), rgba(18, 18, 20, 0.95));\n backdrop-filter: blur(32px);\n border-color: rgba(255, 255, 255, 0.12);\n box-shadow: 0 24px 32px -8px rgba(0, 0, 0, 0.4), 0 16px 24px -8px rgba(0, 0, 0, 0.3), 0 8px 16px -4px rgba(0, 0, 0, 0.2), 0 0 0 1px rgba(255, 255, 255, 0.05);\n}\n.robot-dialog-container.dialog-dark[data-v-4b182fa8]::before {\n background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.15), transparent);\n}\n.robot-search-header[data-v-4b182fa8] {\n display: flex;\n align-items: center;\n padding: 20px 24px;\n gap: 14px;\n border-bottom: 1px solid rgba(0, 0, 0, 0.06);\n background: linear-gradient(180deg, rgba(255, 255, 255, 0.5), rgba(255, 255, 255, 0.2));\n}\n.robot-search-header .robot-search-icon[data-v-4b182fa8] {\n color: #6b7280;\n font-size: 20px;\n flex-shrink: 0;\n opacity: 0.8;\n}\n.robot-search-header .robot-search-input[data-v-4b182fa8] {\n flex: 1;\n border: none;\n outline: none;\n background: transparent;\n font-size: 16px;\n color: #1f2937;\n line-height: 1.6;\n font-weight: 400;\n}\n.robot-search-header .robot-search-input[data-v-4b182fa8]::placeholder {\n color: #9ca3af;\n font-weight: 400;\n}\n.robot-search-header .robot-close-btn[data-v-4b182fa8] {\n padding: 8px;\n border: none;\n background: rgba(0, 0, 0, 0.04);\n border-radius: 8px;\n color: #6b7280;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n backdrop-filter: blur(8px);\n}\n.robot-search-header .robot-close-btn[data-v-4b182fa8]:hover {\n background: rgba(0, 0, 0, 0.08);\n color: #374151;\n transform: scale(1.05);\n}\n.robot-search-header .robot-close-btn[data-v-4b182fa8]:active {\n transform: scale(0.95);\n}\n.dialog-dark .robot-search-header[data-v-4b182fa8] {\n border-bottom-color: rgba(255, 255, 255, 0.08);\n background: linear-gradient(180deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.03));\n}\n.dialog-dark .robot-search-header .robot-search-icon[data-v-4b182fa8],\n.dialog-dark .robot-search-header .robot-close-btn[data-v-4b182fa8] {\n color: #9ca3af;\n}\n.dialog-dark .robot-search-header .robot-close-btn[data-v-4b182fa8] {\n background: rgba(255, 255, 255, 0.06);\n}\n.dialog-dark .robot-search-header .robot-close-btn[data-v-4b182fa8]:hover {\n color: #d1d5db;\n background: rgba(255, 255, 255, 0.12);\n}\n.dialog-dark .robot-search-header .robot-search-input[data-v-4b182fa8] {\n color: #f9fafb;\n}\n.dialog-dark .robot-search-header .robot-search-input[data-v-4b182fa8]::placeholder {\n color: #6b7280;\n}\n.robot-search-content[data-v-4b182fa8] {\n max-height: 420px;\n overflow-y: auto;\n overscroll-behavior: contain;\n}\n.robot-search-content[data-v-4b182fa8]::-webkit-scrollbar {\n width: 6px;\n}\n.robot-search-content[data-v-4b182fa8]::-webkit-scrollbar-track {\n background: transparent;\n}\n.robot-search-content[data-v-4b182fa8]::-webkit-scrollbar-thumb {\n background: rgba(0, 0, 0, 0.1);\n border-radius: 3px;\n}\n.robot-search-content[data-v-4b182fa8]::-webkit-scrollbar-thumb:hover {\n background: rgba(0, 0, 0, 0.15);\n}\n.dialog-dark .robot-search-content[data-v-4b182fa8]::-webkit-scrollbar-thumb {\n background: rgba(255, 255, 255, 0.1);\n}\n.dialog-dark .robot-search-content[data-v-4b182fa8]::-webkit-scrollbar-thumb:hover {\n background: rgba(255, 255, 255, 0.15);\n}\n.robot-empty-state[data-v-4b182fa8] {\n padding: 40px 24px;\n text-align: center;\n}\n.robot-empty-state .robot-empty-icon[data-v-4b182fa8] {\n font-size: 36px;\n color: #d1d5db;\n margin-bottom: 16px;\n opacity: 0.8;\n}\n.robot-empty-state p[data-v-4b182fa8] {\n margin: 0;\n font-size: 15px;\n color: #6b7280;\n font-weight: 400;\n line-height: 1.5;\n}\n.dialog-dark .robot-empty-state .robot-empty-icon[data-v-4b182fa8] {\n color: #6b7280;\n}\n.dialog-dark .robot-empty-state p[data-v-4b182fa8] {\n color: #9ca3af;\n}\n.robot-search-results[data-v-4b182fa8] {\n padding: 12px 0 8px;\n}\n.robot-result-group[data-v-4b182fa8]:not(:last-child) {\n margin-bottom: 12px;\n}\n.robot-group-title[data-v-4b182fa8] {\n padding: 16px 24px 10px;\n font-size: 12px;\n font-weight: 700;\n color: #6b7280;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n margin: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n background: linear-gradient(90deg, rgba(0, 0, 0, 0.02), transparent);\n}\n.robot-group-title .robot-group-icon[data-v-4b182fa8] {\n font-size: 14px;\n opacity: 0.8;\n}\n.robot-group-title .robot-group-count[data-v-4b182fa8] {\n margin-left: auto;\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.1), rgba(99, 102, 241, 0.05));\n color: #6366f1;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 10px;\n font-weight: 600;\n border: 1px solid rgba(99, 102, 241, 0.15);\n box-shadow: 0 1px 2px rgba(99, 102, 241, 0.1);\n}\n.robot-group-title .robot-clear-history[data-v-4b182fa8] {\n padding: 4px;\n margin-left: 8px;\n background: rgba(239, 68, 68, 0.1);\n border: 1px solid rgba(239, 68, 68, 0.2);\n border-radius: 6px;\n color: #ef4444;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n width: 24px;\n height: 24px;\n}\n.robot-group-title .robot-clear-history div[data-v-4b182fa8] {\n width: 12px;\n height: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.robot-group-title .robot-clear-history[data-v-4b182fa8]:hover {\n background: rgba(239, 68, 68, 0.15);\n border-color: rgba(239, 68, 68, 0.3);\n color: #dc2626;\n transform: scale(1.05);\n}\n.robot-group-title .robot-clear-history[data-v-4b182fa8]:active {\n transform: scale(0.95);\n}\n.dialog-dark .robot-group-title[data-v-4b182fa8] {\n color: #9ca3af;\n background: linear-gradient(90deg, rgba(255, 255, 255, 0.03), transparent);\n}\n.dialog-dark .robot-group-title .robot-group-count[data-v-4b182fa8] {\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.15), rgba(99, 102, 241, 0.08));\n color: #a5b4fc;\n border-color: rgba(99, 102, 241, 0.2);\n}\n.robot-group-items[data-v-4b182fa8] {\n padding: 0 12px;\n}\n.robot-result-item[data-v-4b182fa8] {\n display: flex;\n align-items: center;\n gap: 14px;\n padding: 12px 14px;\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n margin: 2px 0;\n}\n.robot-result-item[data-v-4b182fa8]::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: linear-gradient(135deg, rgba(0, 0, 0, 0.02), rgba(0, 0, 0, 0.01));\n border-radius: 10px;\n opacity: 0;\n transition: opacity 0.2s ease;\n}\n.robot-result-item[data-v-4b182fa8]:hover, .robot-result-item.robot-result-item-selected[data-v-4b182fa8] {\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.06), rgba(99, 102, 241, 0.03));\n transform: translateX(2px);\n box-shadow: 0 2px 8px rgba(99, 102, 241, 0.1), 0 1px 3px rgba(0, 0, 0, 0.05);\n border: 1px solid rgba(99, 102, 241, 0.1);\n}\n.robot-result-item[data-v-4b182fa8]:hover::before, .robot-result-item.robot-result-item-selected[data-v-4b182fa8]::before {\n opacity: 1;\n}\n.robot-result-item:hover .robot-item-icon[data-v-4b182fa8], .robot-result-item.robot-result-item-selected .robot-item-icon[data-v-4b182fa8] {\n transform: scale(1.05);\n color: #6366f1;\n}\n.robot-result-item:hover .robot-item-label[data-v-4b182fa8], .robot-result-item.robot-result-item-selected .robot-item-label[data-v-4b182fa8] {\n color: #4f46e5;\n}\n.robot-result-item:hover.robot-history-item .robot-history-delete[data-v-4b182fa8], .robot-result-item.robot-result-item-selected.robot-history-item .robot-history-delete[data-v-4b182fa8] {\n opacity: 1;\n transform: scale(1);\n}\n.robot-result-item .robot-item-icon[data-v-4b182fa8] {\n font-size: 18px;\n color: #6b7280;\n flex-shrink: 0;\n width: 22px;\n height: 22px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n border-radius: 6px;\n background: rgba(0, 0, 0, 0.02);\n}\n.robot-result-item .robot-item-icon.robot-default-icon[data-v-4b182fa8] {\n opacity: 0.6;\n background: rgba(0, 0, 0, 0.04);\n}\n.robot-result-item .robot-item-content[data-v-4b182fa8] {\n flex: 1;\n min-width: 0;\n}\n.robot-result-item .robot-item-content .robot-item-label[data-v-4b182fa8] {\n font-size: 14px;\n font-weight: 600;\n color: #1f2937;\n line-height: 1.4;\n transition: color 0.2s ease;\n margin-bottom: 1px;\n}\n.robot-result-item .robot-item-content .robot-item-desc[data-v-4b182fa8] {\n font-size: 12px;\n color: #6b7280;\n line-height: 1.3;\n opacity: 0.8;\n font-weight: 400;\n}\n.robot-result-item .robot-item-badge[data-v-4b182fa8] {\n font-size: 10px;\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.12), rgba(99, 102, 241, 0.08));\n color: #6366f1;\n padding: 3px 8px;\n border-radius: 12px;\n font-weight: 600;\n min-width: 22px;\n text-align: center;\n border: 1px solid rgba(99, 102, 241, 0.15);\n box-shadow: 0 1px 2px rgba(99, 102, 241, 0.1);\n transition: all 0.2s ease;\n}\n.robot-result-item .robot-history-delete[data-v-4b182fa8] {\n padding: 4px;\n background: rgba(239, 68, 68, 0.08);\n border: 1px solid rgba(239, 68, 68, 0.15);\n border-radius: 6px;\n color: #ef4444;\n cursor: pointer;\n transition: all 0.2s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n opacity: 0;\n transform: scale(0.8);\n flex-shrink: 0;\n width: 24px;\n height: 24px;\n}\n.robot-result-item .robot-history-delete[data-v-4b182fa8]:hover {\n background: rgba(239, 68, 68, 0.15);\n border-color: rgba(239, 68, 68, 0.25);\n color: #dc2626;\n transform: scale(1.05);\n}\n.robot-result-item .robot-history-delete[data-v-4b182fa8]:active {\n transform: scale(0.9);\n}\n.dialog-dark .robot-result-item[data-v-4b182fa8]:hover, .dialog-dark .robot-result-item.robot-result-item-selected[data-v-4b182fa8] {\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.12), rgba(99, 102, 241, 0.06));\n border-color: rgba(99, 102, 241, 0.15);\n box-shadow: 0 2px 8px rgba(99, 102, 241, 0.15), 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n.dialog-dark .robot-result-item:hover .robot-item-icon[data-v-4b182fa8], .dialog-dark .robot-result-item.robot-result-item-selected .robot-item-icon[data-v-4b182fa8] {\n color: #a5b4fc;\n background: rgba(255, 255, 255, 0.08);\n}\n.dialog-dark .robot-result-item:hover .robot-item-label[data-v-4b182fa8], .dialog-dark .robot-result-item.robot-result-item-selected .robot-item-label[data-v-4b182fa8] {\n color: #c7d2fe;\n}\n.dialog-dark .robot-result-item .robot-item-icon[data-v-4b182fa8] {\n color: #9ca3af;\n background: rgba(255, 255, 255, 0.04);\n}\n.dialog-dark .robot-result-item .robot-item-icon.robot-default-icon[data-v-4b182fa8] {\n background: rgba(255, 255, 255, 0.06);\n}\n.dialog-dark .robot-result-item .robot-item-content .robot-item-label[data-v-4b182fa8] {\n color: #f9fafb;\n}\n.dialog-dark .robot-result-item .robot-item-content .robot-item-desc[data-v-4b182fa8] {\n color: #9ca3af;\n}\n.dialog-dark .robot-result-item .robot-item-badge[data-v-4b182fa8] {\n background: linear-gradient(135deg, rgba(99, 102, 241, 0.2), rgba(99, 102, 241, 0.12));\n color: #a5b4fc;\n border-color: rgba(99, 102, 241, 0.25);\n}\n.robot-search-footer[data-v-4b182fa8] {\n padding: 16px 24px;\n border-top: 1px solid rgba(0, 0, 0, 0.06);\n background: linear-gradient(180deg, rgba(0, 0, 0, 0.02), rgba(0, 0, 0, 0.01));\n display: flex;\n justify-content: space-between;\n align-items: center;\n backdrop-filter: blur(8px);\n}\n.robot-search-footer .robot-footer-info[data-v-4b182fa8] {\n font-size: 11px;\n color: #9ca3af;\n font-weight: 500;\n}\n.dialog-dark .robot-search-footer[data-v-4b182fa8] {\n border-top-color: rgba(255, 255, 255, 0.08);\n background: linear-gradient(180deg, rgba(255, 255, 255, 0.04), rgba(255, 255, 255, 0.02));\n}\n.dialog-dark .robot-search-footer .robot-footer-info[data-v-4b182fa8] {\n color: #6b7280;\n}\n.robot-footer-actions[data-v-4b182fa8] {\n display: flex;\n gap: 18px;\n}\n.robot-footer-actions .robot-action-item[data-v-4b182fa8] {\n display: flex;\n align-items: center;\n gap: 7px;\n font-size: 12px;\n color: #6b7280;\n font-weight: 500;\n}\n.robot-footer-actions .robot-action-item kbd[data-v-4b182fa8] {\n padding: 3px 8px;\n background: linear-gradient(135deg, rgba(255, 255, 255, 0.9), rgba(255, 255, 255, 0.7));\n border: 1px solid rgba(0, 0, 0, 0.12);\n border-radius: 5px;\n font-family: ui-monospace, \"SF Mono\", Monaco, \"Cascadia Code\", \"Roboto Mono\", Consolas, \"Courier New\", monospace;\n font-size: 10px;\n line-height: 1;\n color: #4b5563;\n min-width: 22px;\n text-align: center;\n font-weight: 600;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1), inset 0 1px 0 rgba(255, 255, 255, 0.8);\n}\n.dialog-dark .robot-footer-actions .robot-action-item kbd[data-v-4b182fa8] {\n background: linear-gradient(135deg, rgba(255, 255, 255, 0.12), rgba(255, 255, 255, 0.08));\n border-color: rgba(255, 255, 255, 0.18);\n color: #d1d5db;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2), inset 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n.robot-footer-actions .robot-action-item span[data-v-4b182fa8] {\n font-size: 11px;\n font-weight: 500;\n}\n.dialog-dark .robot-footer-actions .robot-action-item[data-v-4b182fa8] {\n color: #9ca3af;\n}\n.robot-dialog-enter-active[data-v-4b182fa8],\n.robot-dialog-leave-active[data-v-4b182fa8] {\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.robot-dialog-enter-from[data-v-4b182fa8],\n.robot-dialog-leave-to[data-v-4b182fa8] {\n opacity: 0;\n}\n.robot-dialog-enter-from .robot-dialog-container[data-v-4b182fa8],\n.robot-dialog-leave-to .robot-dialog-container[data-v-4b182fa8] {\n transform: scale(0.92) translateY(-40px);\n opacity: 0;\n}\n.robot-dialog-enter-to[data-v-4b182fa8] {\n opacity: 1;\n}\n.robot-dialog-enter-to .robot-dialog-container[data-v-4b182fa8] {\n transform: scale(1) translateY(0);\n opacity: 1;\n}\n@media (max-width: 640px) {\n.robot-dialog-overlay[data-v-4b182fa8] {\n padding: 60px 12px 12px;\n}\n.robot-dialog-container[data-v-4b182fa8] {\n border-radius: 12px;\n}\n.robot-search-header[data-v-4b182fa8] {\n padding: 16px 18px;\n}\n.robot-group-title[data-v-4b182fa8] {\n padding: 14px 18px 8px;\n}\n.robot-group-items[data-v-4b182fa8] {\n padding: 0 6px;\n}\n.robot-result-item[data-v-4b182fa8] {\n padding: 10px 12px;\n gap: 12px;\n}\n.robot-search-footer[data-v-4b182fa8] {\n padding: 14px 18px;\n flex-direction: column;\n gap: 8px;\n align-items: stretch;\n}\n.robot-search-footer .robot-footer-actions[data-v-4b182fa8] {\n justify-content: center;\n gap: 14px;\n}\n.robot-search-footer .robot-footer-info[data-v-4b182fa8] {\n text-align: center;\n order: -1;\n}\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
@@ -329,7 +329,7 @@ var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCo
329
329
 
330
330
  //#endregion
331
331
  //#region src/components/C_GlobalSearch/index.vue
332
- var C_GlobalSearch_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-b899016b"]]);
332
+ var C_GlobalSearch_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-4b182fa8"]]);
333
333
 
334
334
  //#endregion
335
335
  export { useGlobalSearch as n, C_GlobalSearch_default as t };
@@ -1 +1 @@
1
- {"version":3,"file":"C_GlobalSearch2.js","names":["placeholder","emptyText","resultGroupTitle"],"sources":["../src/components/C_GlobalSearch/composables/useGlobalSearch.ts","../src/components/C_GlobalSearch/index.vue","../src/components/C_GlobalSearch/index.vue","../src/components/C_GlobalSearch/index.vue"],"sourcesContent":["import { ref, computed, watch, onMounted, onUnmounted, nextTick } from 'vue'\nimport type { SearchMenuItem, HistoryItem, GlobalSearchOptions } from '../types'\n\n/**\n * 全局搜索逻辑 — 管理菜单搜索、历史记录、键盘导航\n *\n * 已解耦:不依赖任何项目级 store / router,\n * 所有外部数据通过 options 注入。\n */\nexport function useGlobalSearch(options: GlobalSearchOptions) {\n const {\n menuItems: getMenuItems,\n isDark: getIsDark,\n onSelect,\n storageKey = 'robot-search-history',\n maxHistory = 10,\n maxDisplayHistory = 5,\n } = options\n\n // ==================== 响应式状态 ====================\n const showDialog = ref(false)\n const searchValue = ref('')\n const selectedIndex = ref(0)\n const searchInputRef = ref<HTMLInputElement>()\n const searchHistory = ref<HistoryItem[]>([])\n\n // ==================== 计算属性 ====================\n const isDark = computed(() => getIsDark?.() ?? false)\n\n const filteredMenuItems = computed(() => {\n if (!searchValue.value.trim()) return []\n const query = searchValue.value.toLowerCase()\n const items = getMenuItems()\n return items.filter(\n item =>\n item.label.toLowerCase().includes(query) ||\n formatMenuPath(item.key).toLowerCase().includes(query)\n )\n })\n\n const displayHistory = computed(() =>\n searchHistory.value.slice(0, maxDisplayHistory)\n )\n const hasResults = computed(() => filteredMenuItems.value.length > 0)\n const hasContent = computed(\n () => hasResults.value || displayHistory.value.length > 0\n )\n\n // ==================== 工具函数 ====================\n const getItemClasses = (index: number, isHistory: boolean) => [\n 'robot-result-item',\n isHistory && 'robot-history-item',\n { 'robot-result-item-selected': selectedIndex.value === index },\n ]\n\n const highlightMatch = (text: string, search: string): string => {\n if (!search) return text\n const regex = new RegExp(\n `(${search.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')})`,\n 'gi'\n )\n return text.replace(regex, '<mark class=\"robot-highlight\">$1</mark>')\n }\n\n const formatMenuPath = (key: string): string =>\n key.replace(/^\\//, '').replace(/\\//g, ' > ') || '首页'\n\n // ==================== 搜索历史管理 ====================\n const addToHistory = (menuItem: SearchMenuItem) => {\n if (!menuItem.label.trim()) return\n const query = menuItem.label\n const filtered = searchHistory.value.filter(\n (item: HistoryItem) =>\n !(item.query === query && item.menuItem?.key === menuItem.key)\n )\n searchHistory.value = [\n { query, menuItem, timestamp: Date.now() },\n ...filtered,\n ].slice(0, maxHistory)\n localStorage.setItem(storageKey, JSON.stringify(searchHistory.value))\n }\n\n const loadHistory = () => {\n try {\n const saved = localStorage.getItem(storageKey)\n if (saved) {\n const parsed = JSON.parse(saved)\n searchHistory.value = parsed.map((item: any) =>\n typeof item === 'string'\n ? { query: item, menuItem: null, timestamp: 0 }\n : item\n )\n }\n } catch (error) {\n console.error('加载搜索历史失败:', error)\n }\n }\n\n const clearHistory = () => {\n searchHistory.value = []\n localStorage.removeItem(storageKey)\n }\n\n const removeHistoryItem = (index: number) => {\n searchHistory.value.splice(index, 1)\n localStorage.setItem(storageKey, JSON.stringify(searchHistory.value))\n if (selectedIndex.value >= searchHistory.value.length) {\n selectedIndex.value = Math.max(0, searchHistory.value.length - 1)\n }\n }\n\n // ==================== 对话框控制 ====================\n const openDialog = async () => {\n showDialog.value = true\n searchValue.value = ''\n selectedIndex.value = 0\n await nextTick()\n searchInputRef.value?.focus()\n }\n\n const closeDialog = () => {\n showDialog.value = false\n searchValue.value = ''\n selectedIndex.value = 0\n }\n\n // ==================== 选择项目 ====================\n const selectHistoryItem = (historyItem: HistoryItem) => {\n if (historyItem.menuItem) {\n const hasChildren = !!historyItem.menuItem.children?.length\n onSelect?.(historyItem.menuItem.key, hasChildren)\n closeDialog()\n } else {\n searchValue.value = historyItem.query\n selectedIndex.value = 0\n }\n }\n\n const selectItem = (item: SearchMenuItem) => {\n addToHistory(item)\n const hasChildren = !!item.children?.length\n onSelect?.(item.key, hasChildren)\n closeDialog()\n }\n\n // ==================== 键盘导航 ====================\n const handleEnter = () => {\n const isHistoryMode =\n !searchValue.value.trim() && displayHistory.value.length > 0\n const isSearchMode =\n searchValue.value.trim() && filteredMenuItems.value.length > 0\n\n if (isHistoryMode) {\n const historyItem = displayHistory.value[selectedIndex.value]\n if (historyItem) selectHistoryItem(historyItem)\n } else if (isSearchMode) {\n const item = filteredMenuItems.value[selectedIndex.value]\n if (item) selectItem(item)\n }\n }\n\n const focusNext = () => {\n const maxIndex = !searchValue.value.trim()\n ? displayHistory.value.length - 1\n : filteredMenuItems.value.length - 1\n selectedIndex.value = Math.min(selectedIndex.value + 1, maxIndex)\n }\n\n const focusPrev = () => {\n selectedIndex.value = Math.max(selectedIndex.value - 1, 0)\n }\n\n // ==================== 监听器和生命周期 ====================\n watch(searchValue, () => {\n selectedIndex.value = 0\n })\n\n onMounted(() => {\n loadHistory()\n const handleKeydown = (e: KeyboardEvent) => {\n if ((e.ctrlKey || e.metaKey) && e.key === 'k') {\n e.preventDefault()\n openDialog()\n }\n }\n document.addEventListener('keydown', handleKeydown)\n onUnmounted(() => document.removeEventListener('keydown', handleKeydown))\n })\n\n return {\n showDialog,\n searchValue,\n selectedIndex,\n searchInputRef,\n isDark,\n filteredMenuItems,\n displayHistory,\n hasResults,\n hasContent,\n getItemClasses,\n highlightMatch,\n formatMenuPath,\n clearHistory,\n removeHistoryItem,\n openDialog,\n closeDialog,\n selectHistoryItem,\n selectItem,\n handleEnter,\n focusNext,\n focusPrev,\n }\n}\n","/* unplugin-vue-components disabled */<!--\r\n * @Description: 全局搜索组件 - 命令面板式搜索\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"robot-search-palette\">\r\n <!-- 搜索触发按钮 -->\r\n <div\r\n class=\"robot-search-trigger\"\r\n :class=\"{ 'trigger-dark': isDark }\"\r\n @click=\"openDialog\"\r\n >\r\n <div class=\"i-mdi:search robot-trigger-icon\" />\r\n <span class=\"robot-trigger-text\">搜索</span>\r\n <span class=\"robot-trigger-shortcut\">Ctrl K</span>\r\n </div>\r\n\r\n <!-- 搜索对话框 -->\r\n <Teleport to=\"body\">\r\n <Transition name=\"robot-dialog\">\r\n <div\r\n v-if=\"showDialog\"\r\n class=\"robot-dialog-overlay\"\r\n @click=\"closeDialog\"\r\n @keydown.esc=\"closeDialog\"\r\n >\r\n <div\r\n class=\"robot-dialog-container\"\r\n :class=\"{ 'dialog-dark': isDark }\"\r\n @click.stop\r\n >\r\n <!-- 搜索头部 -->\r\n <div class=\"robot-search-header\">\r\n <div class=\"i-mdi:magnify robot-search-icon\" />\r\n <input\r\n ref=\"searchInputRef\"\r\n v-model=\"searchValue\"\r\n type=\"text\"\r\n :placeholder=\"placeholder\"\r\n class=\"robot-search-input\"\r\n @keydown.esc=\"closeDialog\"\r\n @keydown.enter=\"handleEnter\"\r\n @keydown.arrow-down=\"focusNext\"\r\n @keydown.arrow-up=\"focusPrev\"\r\n />\r\n <button class=\"robot-close-btn\" @click=\"closeDialog\">\r\n <div class=\"i-mdi:close\" />\r\n </button>\r\n </div>\r\n\r\n <!-- 搜索内容 -->\r\n <div class=\"robot-search-content\">\r\n <!-- 空状态 -->\r\n <div v-if=\"!hasContent\" class=\"robot-empty-state\">\r\n <div class=\"i-mdi:magnify robot-empty-icon\" />\r\n <p>{{ emptyText }}</p>\r\n </div>\r\n\r\n <!-- 搜索历史 -->\r\n <template\r\n v-else-if=\"!searchValue.trim() && displayHistory.length > 0\"\r\n >\r\n <div class=\"robot-search-results\">\r\n <div class=\"robot-result-group\">\r\n <div class=\"robot-group-title\">\r\n <div\r\n class=\"i-mdi:clock-time-four-outline robot-group-icon\"\r\n />\r\n 最近搜索\r\n <span class=\"robot-group-count\">{{\r\n displayHistory.length\r\n }}</span>\r\n <button\r\n class=\"robot-clear-history\"\r\n @click=\"clearHistory\"\r\n title=\"清空历史\"\r\n >\r\n <div class=\"i-mdi:delete-outline\" />\r\n </button>\r\n </div>\r\n <div class=\"robot-group-items\">\r\n <div\r\n v-for=\"(historyItem, index) in displayHistory\"\r\n :key=\"`history-${index}`\"\r\n :class=\"getItemClasses(index, true)\"\r\n @click=\"selectHistoryItem(historyItem)\"\r\n @mouseenter=\"selectedIndex = index\"\r\n >\r\n <component\r\n v-if=\"historyItem.menuItem?.icon\"\r\n :is=\"historyItem.menuItem.icon\"\r\n class=\"robot-item-icon\"\r\n />\r\n <div\r\n v-else\r\n class=\"robot-item-icon robot-default-icon\"\r\n >\r\n <div class=\"i-mdi:file-document-outline\" />\r\n </div>\r\n <div class=\"robot-item-content\">\r\n <div class=\"robot-item-label\">\r\n {{ historyItem.query }}\r\n </div>\r\n <div class=\"robot-item-desc\">\r\n {{\r\n formatMenuPath(historyItem.menuItem?.key || \"\")\r\n }}\r\n </div>\r\n </div>\r\n <button\r\n class=\"robot-history-delete\"\r\n @click.stop=\"removeHistoryItem(index)\"\r\n title=\"删除此记录\"\r\n >\r\n <div class=\"i-mdi:close\" />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </template>\r\n\r\n <!-- 搜索结果 -->\r\n <template v-else-if=\"searchValue.trim()\">\r\n <div class=\"robot-search-results\">\r\n <!-- 无结果状态 -->\r\n <div v-if=\"!hasResults\" class=\"robot-empty-state\">\r\n <div class=\"i-mdi:magnify robot-empty-icon\" />\r\n <p>未找到 \"{{ searchValue }}\" 相关内容</p>\r\n </div>\r\n\r\n <!-- 搜索结果列表 -->\r\n <div v-else class=\"robot-result-group\">\r\n <div class=\"robot-group-title\">\r\n <div class=\"i-mdi:menu robot-group-icon\" />\r\n {{ resultGroupTitle }}\r\n <span class=\"robot-group-count\">{{\r\n filteredMenuItems.length\r\n }}</span>\r\n </div>\r\n <div class=\"robot-group-items\">\r\n <div\r\n v-for=\"(item, index) in filteredMenuItems\"\r\n :key=\"item.key\"\r\n :class=\"getItemClasses(index, false)\"\r\n @click=\"selectItem(item)\"\r\n @mouseenter=\"selectedIndex = index\"\r\n >\r\n <component\r\n v-if=\"item.icon\"\r\n :is=\"item.icon\"\r\n class=\"robot-item-icon\"\r\n />\r\n <div\r\n v-else\r\n class=\"robot-item-icon robot-default-icon\"\r\n >\r\n <div class=\"i-mdi:file-document-outline\" />\r\n </div>\r\n <div class=\"robot-item-content\">\r\n <div\r\n class=\"robot-item-label\"\r\n v-html=\"highlightMatch(item.label, searchValue)\"\r\n ></div>\r\n <div class=\"robot-item-desc\">\r\n {{ formatMenuPath(item.key) }}\r\n </div>\r\n </div>\r\n <div v-if=\"item.children?.length\" class=\"robot-item-badge\">\r\n {{ item.children.length }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </template>\r\n </div>\r\n\r\n <!-- 搜索底部 -->\r\n <div class=\"robot-search-footer\">\r\n <div class=\"robot-footer-actions\">\r\n <div class=\"robot-action-item\">\r\n <kbd>↵</kbd><span>选择</span>\r\n </div>\r\n <div class=\"robot-action-item\">\r\n <kbd>↑↓</kbd><span>导航</span>\r\n </div>\r\n <div class=\"robot-action-item\">\r\n <kbd>esc</kbd><span>关闭</span>\r\n </div>\r\n </div>\r\n <div v-if=\"hasContent\" class=\"robot-footer-info\">\r\n <span v-if=\"searchValue.trim() && hasResults\">\r\n 共 {{ filteredMenuItems.length }} 项结果\r\n </span>\r\n <span\r\n v-else-if=\"!searchValue.trim() && displayHistory.length > 0\"\r\n >\r\n {{ displayHistory.length }} 条历史记录\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { useGlobalSearch } from \"./composables/useGlobalSearch\";\r\nimport type { GlobalSearchOptions } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_GlobalSearch\" });\r\n\r\ninterface Props {\r\n /** useGlobalSearch 配置(必须传入 menuItems + onSelect) */\r\n options: GlobalSearchOptions;\r\n /** 搜索框 placeholder */\r\n placeholder?: string;\r\n /** 无内容提示文字 */\r\n emptyText?: string;\r\n /** 结果分组标题 */\r\n resultGroupTitle?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n placeholder: \"搜索导航菜单...\",\r\n emptyText: \"输入关键词搜索菜单\",\r\n resultGroupTitle: \"菜单导航\",\r\n});\r\n\r\nconst {\r\n showDialog,\r\n searchValue,\r\n selectedIndex,\r\n searchInputRef,\r\n isDark,\r\n filteredMenuItems,\r\n displayHistory,\r\n hasResults,\r\n hasContent,\r\n getItemClasses,\r\n highlightMatch,\r\n formatMenuPath,\r\n clearHistory,\r\n removeHistoryItem,\r\n openDialog,\r\n closeDialog,\r\n selectHistoryItem,\r\n selectItem,\r\n handleEnter,\r\n focusNext,\r\n focusPrev,\r\n} = useGlobalSearch(props.options);\r\n\r\ndefineExpose({ openDialog, closeDialog });\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Description: 全局搜索组件 - 命令面板式搜索\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"robot-search-palette\">\r\n <!-- 搜索触发按钮 -->\r\n <div\r\n class=\"robot-search-trigger\"\r\n :class=\"{ 'trigger-dark': isDark }\"\r\n @click=\"openDialog\"\r\n >\r\n <div class=\"i-mdi:search robot-trigger-icon\" />\r\n <span class=\"robot-trigger-text\">搜索</span>\r\n <span class=\"robot-trigger-shortcut\">Ctrl K</span>\r\n </div>\r\n\r\n <!-- 搜索对话框 -->\r\n <Teleport to=\"body\">\r\n <Transition name=\"robot-dialog\">\r\n <div\r\n v-if=\"showDialog\"\r\n class=\"robot-dialog-overlay\"\r\n @click=\"closeDialog\"\r\n @keydown.esc=\"closeDialog\"\r\n >\r\n <div\r\n class=\"robot-dialog-container\"\r\n :class=\"{ 'dialog-dark': isDark }\"\r\n @click.stop\r\n >\r\n <!-- 搜索头部 -->\r\n <div class=\"robot-search-header\">\r\n <div class=\"i-mdi:magnify robot-search-icon\" />\r\n <input\r\n ref=\"searchInputRef\"\r\n v-model=\"searchValue\"\r\n type=\"text\"\r\n :placeholder=\"placeholder\"\r\n class=\"robot-search-input\"\r\n @keydown.esc=\"closeDialog\"\r\n @keydown.enter=\"handleEnter\"\r\n @keydown.arrow-down=\"focusNext\"\r\n @keydown.arrow-up=\"focusPrev\"\r\n />\r\n <button class=\"robot-close-btn\" @click=\"closeDialog\">\r\n <div class=\"i-mdi:close\" />\r\n </button>\r\n </div>\r\n\r\n <!-- 搜索内容 -->\r\n <div class=\"robot-search-content\">\r\n <!-- 空状态 -->\r\n <div v-if=\"!hasContent\" class=\"robot-empty-state\">\r\n <div class=\"i-mdi:magnify robot-empty-icon\" />\r\n <p>{{ emptyText }}</p>\r\n </div>\r\n\r\n <!-- 搜索历史 -->\r\n <template\r\n v-else-if=\"!searchValue.trim() && displayHistory.length > 0\"\r\n >\r\n <div class=\"robot-search-results\">\r\n <div class=\"robot-result-group\">\r\n <div class=\"robot-group-title\">\r\n <div\r\n class=\"i-mdi:clock-time-four-outline robot-group-icon\"\r\n />\r\n 最近搜索\r\n <span class=\"robot-group-count\">{{\r\n displayHistory.length\r\n }}</span>\r\n <button\r\n class=\"robot-clear-history\"\r\n @click=\"clearHistory\"\r\n title=\"清空历史\"\r\n >\r\n <div class=\"i-mdi:delete-outline\" />\r\n </button>\r\n </div>\r\n <div class=\"robot-group-items\">\r\n <div\r\n v-for=\"(historyItem, index) in displayHistory\"\r\n :key=\"`history-${index}`\"\r\n :class=\"getItemClasses(index, true)\"\r\n @click=\"selectHistoryItem(historyItem)\"\r\n @mouseenter=\"selectedIndex = index\"\r\n >\r\n <component\r\n v-if=\"historyItem.menuItem?.icon\"\r\n :is=\"historyItem.menuItem.icon\"\r\n class=\"robot-item-icon\"\r\n />\r\n <div\r\n v-else\r\n class=\"robot-item-icon robot-default-icon\"\r\n >\r\n <div class=\"i-mdi:file-document-outline\" />\r\n </div>\r\n <div class=\"robot-item-content\">\r\n <div class=\"robot-item-label\">\r\n {{ historyItem.query }}\r\n </div>\r\n <div class=\"robot-item-desc\">\r\n {{\r\n formatMenuPath(historyItem.menuItem?.key || \"\")\r\n }}\r\n </div>\r\n </div>\r\n <button\r\n class=\"robot-history-delete\"\r\n @click.stop=\"removeHistoryItem(index)\"\r\n title=\"删除此记录\"\r\n >\r\n <div class=\"i-mdi:close\" />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </template>\r\n\r\n <!-- 搜索结果 -->\r\n <template v-else-if=\"searchValue.trim()\">\r\n <div class=\"robot-search-results\">\r\n <!-- 无结果状态 -->\r\n <div v-if=\"!hasResults\" class=\"robot-empty-state\">\r\n <div class=\"i-mdi:magnify robot-empty-icon\" />\r\n <p>未找到 \"{{ searchValue }}\" 相关内容</p>\r\n </div>\r\n\r\n <!-- 搜索结果列表 -->\r\n <div v-else class=\"robot-result-group\">\r\n <div class=\"robot-group-title\">\r\n <div class=\"i-mdi:menu robot-group-icon\" />\r\n {{ resultGroupTitle }}\r\n <span class=\"robot-group-count\">{{\r\n filteredMenuItems.length\r\n }}</span>\r\n </div>\r\n <div class=\"robot-group-items\">\r\n <div\r\n v-for=\"(item, index) in filteredMenuItems\"\r\n :key=\"item.key\"\r\n :class=\"getItemClasses(index, false)\"\r\n @click=\"selectItem(item)\"\r\n @mouseenter=\"selectedIndex = index\"\r\n >\r\n <component\r\n v-if=\"item.icon\"\r\n :is=\"item.icon\"\r\n class=\"robot-item-icon\"\r\n />\r\n <div\r\n v-else\r\n class=\"robot-item-icon robot-default-icon\"\r\n >\r\n <div class=\"i-mdi:file-document-outline\" />\r\n </div>\r\n <div class=\"robot-item-content\">\r\n <div\r\n class=\"robot-item-label\"\r\n v-html=\"highlightMatch(item.label, searchValue)\"\r\n ></div>\r\n <div class=\"robot-item-desc\">\r\n {{ formatMenuPath(item.key) }}\r\n </div>\r\n </div>\r\n <div v-if=\"item.children?.length\" class=\"robot-item-badge\">\r\n {{ item.children.length }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </template>\r\n </div>\r\n\r\n <!-- 搜索底部 -->\r\n <div class=\"robot-search-footer\">\r\n <div class=\"robot-footer-actions\">\r\n <div class=\"robot-action-item\">\r\n <kbd>↵</kbd><span>选择</span>\r\n </div>\r\n <div class=\"robot-action-item\">\r\n <kbd>↑↓</kbd><span>导航</span>\r\n </div>\r\n <div class=\"robot-action-item\">\r\n <kbd>esc</kbd><span>关闭</span>\r\n </div>\r\n </div>\r\n <div v-if=\"hasContent\" class=\"robot-footer-info\">\r\n <span v-if=\"searchValue.trim() && hasResults\">\r\n 共 {{ filteredMenuItems.length }} 项结果\r\n </span>\r\n <span\r\n v-else-if=\"!searchValue.trim() && displayHistory.length > 0\"\r\n >\r\n {{ displayHistory.length }} 条历史记录\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { useGlobalSearch } from \"./composables/useGlobalSearch\";\r\nimport type { GlobalSearchOptions } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_GlobalSearch\" });\r\n\r\ninterface Props {\r\n /** useGlobalSearch 配置(必须传入 menuItems + onSelect) */\r\n options: GlobalSearchOptions;\r\n /** 搜索框 placeholder */\r\n placeholder?: string;\r\n /** 无内容提示文字 */\r\n emptyText?: string;\r\n /** 结果分组标题 */\r\n resultGroupTitle?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n placeholder: \"搜索导航菜单...\",\r\n emptyText: \"输入关键词搜索菜单\",\r\n resultGroupTitle: \"菜单导航\",\r\n});\r\n\r\nconst {\r\n showDialog,\r\n searchValue,\r\n selectedIndex,\r\n searchInputRef,\r\n isDark,\r\n filteredMenuItems,\r\n displayHistory,\r\n hasResults,\r\n hasContent,\r\n getItemClasses,\r\n highlightMatch,\r\n formatMenuPath,\r\n clearHistory,\r\n removeHistoryItem,\r\n openDialog,\r\n closeDialog,\r\n selectHistoryItem,\r\n selectItem,\r\n handleEnter,\r\n focusNext,\r\n focusPrev,\r\n} = useGlobalSearch(props.options);\r\n\r\ndefineExpose({ openDialog, closeDialog });\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","<!--\r\n * @Description: 全局搜索组件 - 命令面板式搜索\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"robot-search-palette\">\r\n <!-- 搜索触发按钮 -->\r\n <div\r\n class=\"robot-search-trigger\"\r\n :class=\"{ 'trigger-dark': isDark }\"\r\n @click=\"openDialog\"\r\n >\r\n <div class=\"i-mdi:search robot-trigger-icon\" />\r\n <span class=\"robot-trigger-text\">搜索</span>\r\n <span class=\"robot-trigger-shortcut\">Ctrl K</span>\r\n </div>\r\n\r\n <!-- 搜索对话框 -->\r\n <Teleport to=\"body\">\r\n <Transition name=\"robot-dialog\">\r\n <div\r\n v-if=\"showDialog\"\r\n class=\"robot-dialog-overlay\"\r\n @click=\"closeDialog\"\r\n @keydown.esc=\"closeDialog\"\r\n >\r\n <div\r\n class=\"robot-dialog-container\"\r\n :class=\"{ 'dialog-dark': isDark }\"\r\n @click.stop\r\n >\r\n <!-- 搜索头部 -->\r\n <div class=\"robot-search-header\">\r\n <div class=\"i-mdi:magnify robot-search-icon\" />\r\n <input\r\n ref=\"searchInputRef\"\r\n v-model=\"searchValue\"\r\n type=\"text\"\r\n :placeholder=\"placeholder\"\r\n class=\"robot-search-input\"\r\n @keydown.esc=\"closeDialog\"\r\n @keydown.enter=\"handleEnter\"\r\n @keydown.arrow-down=\"focusNext\"\r\n @keydown.arrow-up=\"focusPrev\"\r\n />\r\n <button class=\"robot-close-btn\" @click=\"closeDialog\">\r\n <div class=\"i-mdi:close\" />\r\n </button>\r\n </div>\r\n\r\n <!-- 搜索内容 -->\r\n <div class=\"robot-search-content\">\r\n <!-- 空状态 -->\r\n <div v-if=\"!hasContent\" class=\"robot-empty-state\">\r\n <div class=\"i-mdi:magnify robot-empty-icon\" />\r\n <p>{{ emptyText }}</p>\r\n </div>\r\n\r\n <!-- 搜索历史 -->\r\n <template\r\n v-else-if=\"!searchValue.trim() && displayHistory.length > 0\"\r\n >\r\n <div class=\"robot-search-results\">\r\n <div class=\"robot-result-group\">\r\n <div class=\"robot-group-title\">\r\n <div\r\n class=\"i-mdi:clock-time-four-outline robot-group-icon\"\r\n />\r\n 最近搜索\r\n <span class=\"robot-group-count\">{{\r\n displayHistory.length\r\n }}</span>\r\n <button\r\n class=\"robot-clear-history\"\r\n @click=\"clearHistory\"\r\n title=\"清空历史\"\r\n >\r\n <div class=\"i-mdi:delete-outline\" />\r\n </button>\r\n </div>\r\n <div class=\"robot-group-items\">\r\n <div\r\n v-for=\"(historyItem, index) in displayHistory\"\r\n :key=\"`history-${index}`\"\r\n :class=\"getItemClasses(index, true)\"\r\n @click=\"selectHistoryItem(historyItem)\"\r\n @mouseenter=\"selectedIndex = index\"\r\n >\r\n <component\r\n v-if=\"historyItem.menuItem?.icon\"\r\n :is=\"historyItem.menuItem.icon\"\r\n class=\"robot-item-icon\"\r\n />\r\n <div\r\n v-else\r\n class=\"robot-item-icon robot-default-icon\"\r\n >\r\n <div class=\"i-mdi:file-document-outline\" />\r\n </div>\r\n <div class=\"robot-item-content\">\r\n <div class=\"robot-item-label\">\r\n {{ historyItem.query }}\r\n </div>\r\n <div class=\"robot-item-desc\">\r\n {{\r\n formatMenuPath(historyItem.menuItem?.key || \"\")\r\n }}\r\n </div>\r\n </div>\r\n <button\r\n class=\"robot-history-delete\"\r\n @click.stop=\"removeHistoryItem(index)\"\r\n title=\"删除此记录\"\r\n >\r\n <div class=\"i-mdi:close\" />\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </template>\r\n\r\n <!-- 搜索结果 -->\r\n <template v-else-if=\"searchValue.trim()\">\r\n <div class=\"robot-search-results\">\r\n <!-- 无结果状态 -->\r\n <div v-if=\"!hasResults\" class=\"robot-empty-state\">\r\n <div class=\"i-mdi:magnify robot-empty-icon\" />\r\n <p>未找到 \"{{ searchValue }}\" 相关内容</p>\r\n </div>\r\n\r\n <!-- 搜索结果列表 -->\r\n <div v-else class=\"robot-result-group\">\r\n <div class=\"robot-group-title\">\r\n <div class=\"i-mdi:menu robot-group-icon\" />\r\n {{ resultGroupTitle }}\r\n <span class=\"robot-group-count\">{{\r\n filteredMenuItems.length\r\n }}</span>\r\n </div>\r\n <div class=\"robot-group-items\">\r\n <div\r\n v-for=\"(item, index) in filteredMenuItems\"\r\n :key=\"item.key\"\r\n :class=\"getItemClasses(index, false)\"\r\n @click=\"selectItem(item)\"\r\n @mouseenter=\"selectedIndex = index\"\r\n >\r\n <component\r\n v-if=\"item.icon\"\r\n :is=\"item.icon\"\r\n class=\"robot-item-icon\"\r\n />\r\n <div\r\n v-else\r\n class=\"robot-item-icon robot-default-icon\"\r\n >\r\n <div class=\"i-mdi:file-document-outline\" />\r\n </div>\r\n <div class=\"robot-item-content\">\r\n <div\r\n class=\"robot-item-label\"\r\n v-html=\"highlightMatch(item.label, searchValue)\"\r\n ></div>\r\n <div class=\"robot-item-desc\">\r\n {{ formatMenuPath(item.key) }}\r\n </div>\r\n </div>\r\n <div v-if=\"item.children?.length\" class=\"robot-item-badge\">\r\n {{ item.children.length }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </template>\r\n </div>\r\n\r\n <!-- 搜索底部 -->\r\n <div class=\"robot-search-footer\">\r\n <div class=\"robot-footer-actions\">\r\n <div class=\"robot-action-item\">\r\n <kbd>↵</kbd><span>选择</span>\r\n </div>\r\n <div class=\"robot-action-item\">\r\n <kbd>↑↓</kbd><span>导航</span>\r\n </div>\r\n <div class=\"robot-action-item\">\r\n <kbd>esc</kbd><span>关闭</span>\r\n </div>\r\n </div>\r\n <div v-if=\"hasContent\" class=\"robot-footer-info\">\r\n <span v-if=\"searchValue.trim() && hasResults\">\r\n 共 {{ filteredMenuItems.length }} 项结果\r\n </span>\r\n <span\r\n v-else-if=\"!searchValue.trim() && displayHistory.length > 0\"\r\n >\r\n {{ displayHistory.length }} 条历史记录\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { useGlobalSearch } from \"./composables/useGlobalSearch\";\r\nimport type { GlobalSearchOptions } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_GlobalSearch\" });\r\n\r\ninterface Props {\r\n /** useGlobalSearch 配置(必须传入 menuItems + onSelect) */\r\n options: GlobalSearchOptions;\r\n /** 搜索框 placeholder */\r\n placeholder?: string;\r\n /** 无内容提示文字 */\r\n emptyText?: string;\r\n /** 结果分组标题 */\r\n resultGroupTitle?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n placeholder: \"搜索导航菜单...\",\r\n emptyText: \"输入关键词搜索菜单\",\r\n resultGroupTitle: \"菜单导航\",\r\n});\r\n\r\nconst {\r\n showDialog,\r\n searchValue,\r\n selectedIndex,\r\n searchInputRef,\r\n isDark,\r\n filteredMenuItems,\r\n displayHistory,\r\n hasResults,\r\n hasContent,\r\n getItemClasses,\r\n highlightMatch,\r\n formatMenuPath,\r\n clearHistory,\r\n removeHistoryItem,\r\n openDialog,\r\n closeDialog,\r\n selectHistoryItem,\r\n selectItem,\r\n handleEnter,\r\n focusNext,\r\n focusPrev,\r\n} = useGlobalSearch(props.options);\r\n\r\ndefineExpose({ openDialog, closeDialog });\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"C_GlobalSearch2.js","names":["placeholder","emptyText","resultGroupTitle"],"sources":["../src/components/C_GlobalSearch/composables/useGlobalSearch.ts","../src/components/C_GlobalSearch/index.vue","../src/components/C_GlobalSearch/index.vue","../src/components/C_GlobalSearch/index.vue"],"sourcesContent":["import { ref, computed, watch, onMounted, onUnmounted, nextTick } from 'vue'\nimport type { SearchMenuItem, HistoryItem, GlobalSearchOptions } from '../types'\n\n/**\n * 全局搜索逻辑 — 管理菜单搜索、历史记录、键盘导航\n *\n * 已解耦:不依赖任何项目级 store / router,\n * 所有外部数据通过 options 注入。\n */\nexport function useGlobalSearch(options: GlobalSearchOptions) {\n const {\n menuItems: getMenuItems,\n isDark: getIsDark,\n onSelect,\n storageKey = 'robot-search-history',\n maxHistory = 10,\n maxDisplayHistory = 5,\n } = options\n\n // ==================== 响应式状态 ====================\n const showDialog = ref(false)\n const searchValue = ref('')\n const selectedIndex = ref(0)\n const searchInputRef = ref<HTMLInputElement>()\n const searchHistory = ref<HistoryItem[]>([])\n\n // ==================== 计算属性 ====================\n const isDark = computed(() => getIsDark?.() ?? false)\n\n const filteredMenuItems = computed(() => {\n if (!searchValue.value.trim()) return []\n const query = searchValue.value.toLowerCase()\n const items = getMenuItems()\n return items.filter(\n item =>\n item.label.toLowerCase().includes(query) ||\n formatMenuPath(item.key).toLowerCase().includes(query)\n )\n })\n\n const displayHistory = computed(() =>\n searchHistory.value.slice(0, maxDisplayHistory)\n )\n const hasResults = computed(() => filteredMenuItems.value.length > 0)\n const hasContent = computed(\n () => hasResults.value || displayHistory.value.length > 0\n )\n\n // ==================== 工具函数 ====================\n const getItemClasses = (index: number, isHistory: boolean) => [\n 'robot-result-item',\n isHistory && 'robot-history-item',\n { 'robot-result-item-selected': selectedIndex.value === index },\n ]\n\n const highlightMatch = (text: string, search: string): string => {\n if (!search) return text\n const regex = new RegExp(\n `(${search.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')})`,\n 'gi'\n )\n return text.replace(regex, '<mark class=\"robot-highlight\">$1</mark>')\n }\n\n const formatMenuPath = (key: string): string =>\n key.replace(/^\\//, '').replace(/\\//g, ' > ') || '首页'\n\n // ==================== 搜索历史管理 ====================\n const addToHistory = (menuItem: SearchMenuItem) => {\n if (!menuItem.label.trim()) return\n const query = menuItem.label\n const filtered = searchHistory.value.filter(\n (item: HistoryItem) =>\n !(item.query === query && item.menuItem?.key === menuItem.key)\n )\n searchHistory.value = [\n { query, menuItem, timestamp: Date.now() },\n ...filtered,\n ].slice(0, maxHistory)\n localStorage.setItem(storageKey, JSON.stringify(searchHistory.value))\n }\n\n const loadHistory = () => {\n try {\n const saved = localStorage.getItem(storageKey)\n if (saved) {\n const parsed = JSON.parse(saved)\n searchHistory.value = parsed.map((item: any) =>\n typeof item === 'string'\n ? { query: item, menuItem: null, timestamp: 0 }\n : item\n )\n }\n } catch (error) {\n console.error('加载搜索历史失败:', error)\n }\n }\n\n const clearHistory = () => {\n searchHistory.value = []\n localStorage.removeItem(storageKey)\n }\n\n const removeHistoryItem = (index: number) => {\n searchHistory.value.splice(index, 1)\n localStorage.setItem(storageKey, JSON.stringify(searchHistory.value))\n if (selectedIndex.value >= searchHistory.value.length) {\n selectedIndex.value = Math.max(0, searchHistory.value.length - 1)\n }\n }\n\n // ==================== 对话框控制 ====================\n const openDialog = async () => {\n showDialog.value = true\n searchValue.value = ''\n selectedIndex.value = 0\n await nextTick()\n searchInputRef.value?.focus()\n }\n\n const closeDialog = () => {\n showDialog.value = false\n searchValue.value = ''\n selectedIndex.value = 0\n }\n\n // ==================== 选择项目 ====================\n const selectHistoryItem = (historyItem: HistoryItem) => {\n if (historyItem.menuItem) {\n const hasChildren = !!historyItem.menuItem.children?.length\n onSelect?.(historyItem.menuItem.key, hasChildren)\n closeDialog()\n } else {\n searchValue.value = historyItem.query\n selectedIndex.value = 0\n }\n }\n\n const selectItem = (item: SearchMenuItem) => {\n addToHistory(item)\n const hasChildren = !!item.children?.length\n onSelect?.(item.key, hasChildren)\n closeDialog()\n }\n\n // ==================== 键盘导航 ====================\n const handleEnter = () => {\n const isHistoryMode =\n !searchValue.value.trim() && displayHistory.value.length > 0\n const isSearchMode =\n searchValue.value.trim() && filteredMenuItems.value.length > 0\n\n if (isHistoryMode) {\n const historyItem = displayHistory.value[selectedIndex.value]\n if (historyItem) selectHistoryItem(historyItem)\n } else if (isSearchMode) {\n const item = filteredMenuItems.value[selectedIndex.value]\n if (item) selectItem(item)\n }\n }\n\n const focusNext = () => {\n const maxIndex = !searchValue.value.trim()\n ? displayHistory.value.length - 1\n : filteredMenuItems.value.length - 1\n selectedIndex.value = Math.min(selectedIndex.value + 1, maxIndex)\n }\n\n const focusPrev = () => {\n selectedIndex.value = Math.max(selectedIndex.value - 1, 0)\n }\n\n // ==================== 监听器和生命周期 ====================\n watch(searchValue, () => {\n selectedIndex.value = 0\n })\n\n onMounted(() => {\n loadHistory()\n const handleKeydown = (e: KeyboardEvent) => {\n if ((e.ctrlKey || e.metaKey) && e.key === 'k') {\n e.preventDefault()\n openDialog()\n }\n }\n document.addEventListener('keydown', handleKeydown)\n onUnmounted(() => document.removeEventListener('keydown', handleKeydown))\n })\n\n return {\n showDialog,\n searchValue,\n selectedIndex,\n searchInputRef,\n isDark,\n filteredMenuItems,\n displayHistory,\n hasResults,\n hasContent,\n getItemClasses,\n highlightMatch,\n formatMenuPath,\n clearHistory,\n removeHistoryItem,\n openDialog,\n closeDialog,\n selectHistoryItem,\n selectItem,\n handleEnter,\n focusNext,\n focusPrev,\n }\n}\n","/* unplugin-vue-components disabled */<!--\n * @Description: 全局搜索组件 - 命令面板式搜索\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <div class=\"robot-search-palette\">\n <!-- 搜索触发按钮 -->\n <div\n class=\"robot-search-trigger\"\n :class=\"{ 'trigger-dark': isDark }\"\n @click=\"openDialog\"\n >\n <div class=\"i-mdi:search robot-trigger-icon\" />\n <span class=\"robot-trigger-text\">搜索</span>\n <span class=\"robot-trigger-shortcut\">Ctrl K</span>\n </div>\n\n <!-- 搜索对话框 -->\n <Teleport to=\"body\">\n <Transition name=\"robot-dialog\">\n <div\n v-if=\"showDialog\"\n class=\"robot-dialog-overlay\"\n @click=\"closeDialog\"\n @keydown.esc=\"closeDialog\"\n >\n <div\n class=\"robot-dialog-container\"\n :class=\"{ 'dialog-dark': isDark }\"\n @click.stop\n >\n <!-- 搜索头部 -->\n <div class=\"robot-search-header\">\n <div class=\"i-mdi:magnify robot-search-icon\" />\n <input\n ref=\"searchInputRef\"\n v-model=\"searchValue\"\n type=\"text\"\n :placeholder=\"placeholder\"\n class=\"robot-search-input\"\n @keydown.esc=\"closeDialog\"\n @keydown.enter=\"handleEnter\"\n @keydown.arrow-down=\"focusNext\"\n @keydown.arrow-up=\"focusPrev\"\n />\n <button\n class=\"robot-close-btn\"\n @click=\"closeDialog\"\n >\n <div class=\"i-mdi:close\" />\n </button>\n </div>\n\n <!-- 搜索内容 -->\n <div class=\"robot-search-content\">\n <!-- 空状态 -->\n <div\n v-if=\"!hasContent\"\n class=\"robot-empty-state\"\n >\n <div class=\"i-mdi:magnify robot-empty-icon\" />\n <p>{{ emptyText }}</p>\n </div>\n\n <!-- 搜索历史 -->\n <template\n v-else-if=\"!searchValue.trim() && displayHistory.length > 0\"\n >\n <div class=\"robot-search-results\">\n <div class=\"robot-result-group\">\n <div class=\"robot-group-title\">\n <div\n class=\"i-mdi:clock-time-four-outline robot-group-icon\"\n />\n 最近搜索\n <span class=\"robot-group-count\">{{\n displayHistory.length\n }}</span>\n <button\n class=\"robot-clear-history\"\n @click=\"clearHistory\"\n title=\"清空历史\"\n >\n <div class=\"i-mdi:delete-outline\" />\n </button>\n </div>\n <div class=\"robot-group-items\">\n <div\n v-for=\"(historyItem, index) in displayHistory\"\n :key=\"`history-${index}`\"\n :class=\"getItemClasses(index, true)\"\n @click=\"selectHistoryItem(historyItem)\"\n @mouseenter=\"selectedIndex = index\"\n >\n <component\n v-if=\"historyItem.menuItem?.icon\"\n :is=\"historyItem.menuItem.icon\"\n class=\"robot-item-icon\"\n />\n <div\n v-else\n class=\"robot-item-icon robot-default-icon\"\n >\n <div class=\"i-mdi:file-document-outline\" />\n </div>\n <div class=\"robot-item-content\">\n <div class=\"robot-item-label\">\n {{ historyItem.query }}\n </div>\n <div class=\"robot-item-desc\">\n {{\n formatMenuPath(historyItem.menuItem?.key || '')\n }}\n </div>\n </div>\n <button\n class=\"robot-history-delete\"\n @click.stop=\"removeHistoryItem(index)\"\n title=\"删除此记录\"\n >\n <div class=\"i-mdi:close\" />\n </button>\n </div>\n </div>\n </div>\n </div>\n </template>\n\n <!-- 搜索结果 -->\n <template v-else-if=\"searchValue.trim()\">\n <div class=\"robot-search-results\">\n <!-- 无结果状态 -->\n <div\n v-if=\"!hasResults\"\n class=\"robot-empty-state\"\n >\n <div class=\"i-mdi:magnify robot-empty-icon\" />\n <p>未找到 \"{{ searchValue }}\" 相关内容</p>\n </div>\n\n <!-- 搜索结果列表 -->\n <div\n v-else\n class=\"robot-result-group\"\n >\n <div class=\"robot-group-title\">\n <div class=\"i-mdi:menu robot-group-icon\" />\n {{ resultGroupTitle }}\n <span class=\"robot-group-count\">{{\n filteredMenuItems.length\n }}</span>\n </div>\n <div class=\"robot-group-items\">\n <div\n v-for=\"(item, index) in filteredMenuItems\"\n :key=\"item.key\"\n :class=\"getItemClasses(index, false)\"\n @click=\"selectItem(item)\"\n @mouseenter=\"selectedIndex = index\"\n >\n <component\n v-if=\"item.icon\"\n :is=\"item.icon\"\n class=\"robot-item-icon\"\n />\n <div\n v-else\n class=\"robot-item-icon robot-default-icon\"\n >\n <div class=\"i-mdi:file-document-outline\" />\n </div>\n <div class=\"robot-item-content\">\n <div\n class=\"robot-item-label\"\n v-html=\"highlightMatch(item.label, searchValue)\"\n ></div>\n <div class=\"robot-item-desc\">\n {{ formatMenuPath(item.key) }}\n </div>\n </div>\n <div\n v-if=\"item.children?.length\"\n class=\"robot-item-badge\"\n >\n {{ item.children.length }}\n </div>\n </div>\n </div>\n </div>\n </div>\n </template>\n </div>\n\n <!-- 搜索底部 -->\n <div class=\"robot-search-footer\">\n <div class=\"robot-footer-actions\">\n <div class=\"robot-action-item\">\n <kbd>↵</kbd><span>选择</span>\n </div>\n <div class=\"robot-action-item\">\n <kbd>↑↓</kbd><span>导航</span>\n </div>\n <div class=\"robot-action-item\">\n <kbd>esc</kbd><span>关闭</span>\n </div>\n </div>\n <div\n v-if=\"hasContent\"\n class=\"robot-footer-info\"\n >\n <span v-if=\"searchValue.trim() && hasResults\">\n 共 {{ filteredMenuItems.length }} 项结果\n </span>\n <span\n v-else-if=\"!searchValue.trim() && displayHistory.length > 0\"\n >\n {{ displayHistory.length }} 条历史记录\n </span>\n </div>\n </div>\n </div>\n </div>\n </Transition>\n </Teleport>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { useGlobalSearch } from './composables/useGlobalSearch'\n import type { GlobalSearchOptions } from './types'\n\n defineOptions({ name: 'C_GlobalSearch' })\n\n interface Props {\n /** useGlobalSearch 配置(必须传入 menuItems + onSelect) */\n options: GlobalSearchOptions\n /** 搜索框 placeholder */\n placeholder?: string\n /** 无内容提示文字 */\n emptyText?: string\n /** 结果分组标题 */\n resultGroupTitle?: string\n }\n\n const props = withDefaults(defineProps<Props>(), {\n placeholder: '搜索导航菜单...',\n emptyText: '输入关键词搜索菜单',\n resultGroupTitle: '菜单导航',\n })\n\n const {\n showDialog,\n searchValue,\n selectedIndex,\n searchInputRef,\n isDark,\n filteredMenuItems,\n displayHistory,\n hasResults,\n hasContent,\n getItemClasses,\n highlightMatch,\n formatMenuPath,\n clearHistory,\n removeHistoryItem,\n openDialog,\n closeDialog,\n selectHistoryItem,\n selectItem,\n handleEnter,\n focusNext,\n focusPrev,\n } = useGlobalSearch(props.options)\n\n defineExpose({ openDialog, closeDialog })\n</script>\n\n<style lang=\"scss\" scoped>\n @use './index.scss';\n</style>\n","/* unplugin-vue-components disabled */<!--\n * @Description: 全局搜索组件 - 命令面板式搜索\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <div class=\"robot-search-palette\">\n <!-- 搜索触发按钮 -->\n <div\n class=\"robot-search-trigger\"\n :class=\"{ 'trigger-dark': isDark }\"\n @click=\"openDialog\"\n >\n <div class=\"i-mdi:search robot-trigger-icon\" />\n <span class=\"robot-trigger-text\">搜索</span>\n <span class=\"robot-trigger-shortcut\">Ctrl K</span>\n </div>\n\n <!-- 搜索对话框 -->\n <Teleport to=\"body\">\n <Transition name=\"robot-dialog\">\n <div\n v-if=\"showDialog\"\n class=\"robot-dialog-overlay\"\n @click=\"closeDialog\"\n @keydown.esc=\"closeDialog\"\n >\n <div\n class=\"robot-dialog-container\"\n :class=\"{ 'dialog-dark': isDark }\"\n @click.stop\n >\n <!-- 搜索头部 -->\n <div class=\"robot-search-header\">\n <div class=\"i-mdi:magnify robot-search-icon\" />\n <input\n ref=\"searchInputRef\"\n v-model=\"searchValue\"\n type=\"text\"\n :placeholder=\"placeholder\"\n class=\"robot-search-input\"\n @keydown.esc=\"closeDialog\"\n @keydown.enter=\"handleEnter\"\n @keydown.arrow-down=\"focusNext\"\n @keydown.arrow-up=\"focusPrev\"\n />\n <button\n class=\"robot-close-btn\"\n @click=\"closeDialog\"\n >\n <div class=\"i-mdi:close\" />\n </button>\n </div>\n\n <!-- 搜索内容 -->\n <div class=\"robot-search-content\">\n <!-- 空状态 -->\n <div\n v-if=\"!hasContent\"\n class=\"robot-empty-state\"\n >\n <div class=\"i-mdi:magnify robot-empty-icon\" />\n <p>{{ emptyText }}</p>\n </div>\n\n <!-- 搜索历史 -->\n <template\n v-else-if=\"!searchValue.trim() && displayHistory.length > 0\"\n >\n <div class=\"robot-search-results\">\n <div class=\"robot-result-group\">\n <div class=\"robot-group-title\">\n <div\n class=\"i-mdi:clock-time-four-outline robot-group-icon\"\n />\n 最近搜索\n <span class=\"robot-group-count\">{{\n displayHistory.length\n }}</span>\n <button\n class=\"robot-clear-history\"\n @click=\"clearHistory\"\n title=\"清空历史\"\n >\n <div class=\"i-mdi:delete-outline\" />\n </button>\n </div>\n <div class=\"robot-group-items\">\n <div\n v-for=\"(historyItem, index) in displayHistory\"\n :key=\"`history-${index}`\"\n :class=\"getItemClasses(index, true)\"\n @click=\"selectHistoryItem(historyItem)\"\n @mouseenter=\"selectedIndex = index\"\n >\n <component\n v-if=\"historyItem.menuItem?.icon\"\n :is=\"historyItem.menuItem.icon\"\n class=\"robot-item-icon\"\n />\n <div\n v-else\n class=\"robot-item-icon robot-default-icon\"\n >\n <div class=\"i-mdi:file-document-outline\" />\n </div>\n <div class=\"robot-item-content\">\n <div class=\"robot-item-label\">\n {{ historyItem.query }}\n </div>\n <div class=\"robot-item-desc\">\n {{\n formatMenuPath(historyItem.menuItem?.key || '')\n }}\n </div>\n </div>\n <button\n class=\"robot-history-delete\"\n @click.stop=\"removeHistoryItem(index)\"\n title=\"删除此记录\"\n >\n <div class=\"i-mdi:close\" />\n </button>\n </div>\n </div>\n </div>\n </div>\n </template>\n\n <!-- 搜索结果 -->\n <template v-else-if=\"searchValue.trim()\">\n <div class=\"robot-search-results\">\n <!-- 无结果状态 -->\n <div\n v-if=\"!hasResults\"\n class=\"robot-empty-state\"\n >\n <div class=\"i-mdi:magnify robot-empty-icon\" />\n <p>未找到 \"{{ searchValue }}\" 相关内容</p>\n </div>\n\n <!-- 搜索结果列表 -->\n <div\n v-else\n class=\"robot-result-group\"\n >\n <div class=\"robot-group-title\">\n <div class=\"i-mdi:menu robot-group-icon\" />\n {{ resultGroupTitle }}\n <span class=\"robot-group-count\">{{\n filteredMenuItems.length\n }}</span>\n </div>\n <div class=\"robot-group-items\">\n <div\n v-for=\"(item, index) in filteredMenuItems\"\n :key=\"item.key\"\n :class=\"getItemClasses(index, false)\"\n @click=\"selectItem(item)\"\n @mouseenter=\"selectedIndex = index\"\n >\n <component\n v-if=\"item.icon\"\n :is=\"item.icon\"\n class=\"robot-item-icon\"\n />\n <div\n v-else\n class=\"robot-item-icon robot-default-icon\"\n >\n <div class=\"i-mdi:file-document-outline\" />\n </div>\n <div class=\"robot-item-content\">\n <div\n class=\"robot-item-label\"\n v-html=\"highlightMatch(item.label, searchValue)\"\n ></div>\n <div class=\"robot-item-desc\">\n {{ formatMenuPath(item.key) }}\n </div>\n </div>\n <div\n v-if=\"item.children?.length\"\n class=\"robot-item-badge\"\n >\n {{ item.children.length }}\n </div>\n </div>\n </div>\n </div>\n </div>\n </template>\n </div>\n\n <!-- 搜索底部 -->\n <div class=\"robot-search-footer\">\n <div class=\"robot-footer-actions\">\n <div class=\"robot-action-item\">\n <kbd>↵</kbd><span>选择</span>\n </div>\n <div class=\"robot-action-item\">\n <kbd>↑↓</kbd><span>导航</span>\n </div>\n <div class=\"robot-action-item\">\n <kbd>esc</kbd><span>关闭</span>\n </div>\n </div>\n <div\n v-if=\"hasContent\"\n class=\"robot-footer-info\"\n >\n <span v-if=\"searchValue.trim() && hasResults\">\n 共 {{ filteredMenuItems.length }} 项结果\n </span>\n <span\n v-else-if=\"!searchValue.trim() && displayHistory.length > 0\"\n >\n {{ displayHistory.length }} 条历史记录\n </span>\n </div>\n </div>\n </div>\n </div>\n </Transition>\n </Teleport>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { useGlobalSearch } from './composables/useGlobalSearch'\n import type { GlobalSearchOptions } from './types'\n\n defineOptions({ name: 'C_GlobalSearch' })\n\n interface Props {\n /** useGlobalSearch 配置(必须传入 menuItems + onSelect) */\n options: GlobalSearchOptions\n /** 搜索框 placeholder */\n placeholder?: string\n /** 无内容提示文字 */\n emptyText?: string\n /** 结果分组标题 */\n resultGroupTitle?: string\n }\n\n const props = withDefaults(defineProps<Props>(), {\n placeholder: '搜索导航菜单...',\n emptyText: '输入关键词搜索菜单',\n resultGroupTitle: '菜单导航',\n })\n\n const {\n showDialog,\n searchValue,\n selectedIndex,\n searchInputRef,\n isDark,\n filteredMenuItems,\n displayHistory,\n hasResults,\n hasContent,\n getItemClasses,\n highlightMatch,\n formatMenuPath,\n clearHistory,\n removeHistoryItem,\n openDialog,\n closeDialog,\n selectHistoryItem,\n selectItem,\n handleEnter,\n focusNext,\n focusPrev,\n } = useGlobalSearch(props.options)\n\n defineExpose({ openDialog, closeDialog })\n</script>\n\n<style lang=\"scss\" scoped>\n @use './index.scss';\n</style>\n","<!--\n * @Description: 全局搜索组件 - 命令面板式搜索\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <div class=\"robot-search-palette\">\n <!-- 搜索触发按钮 -->\n <div\n class=\"robot-search-trigger\"\n :class=\"{ 'trigger-dark': isDark }\"\n @click=\"openDialog\"\n >\n <div class=\"i-mdi:search robot-trigger-icon\" />\n <span class=\"robot-trigger-text\">搜索</span>\n <span class=\"robot-trigger-shortcut\">Ctrl K</span>\n </div>\n\n <!-- 搜索对话框 -->\n <Teleport to=\"body\">\n <Transition name=\"robot-dialog\">\n <div\n v-if=\"showDialog\"\n class=\"robot-dialog-overlay\"\n @click=\"closeDialog\"\n @keydown.esc=\"closeDialog\"\n >\n <div\n class=\"robot-dialog-container\"\n :class=\"{ 'dialog-dark': isDark }\"\n @click.stop\n >\n <!-- 搜索头部 -->\n <div class=\"robot-search-header\">\n <div class=\"i-mdi:magnify robot-search-icon\" />\n <input\n ref=\"searchInputRef\"\n v-model=\"searchValue\"\n type=\"text\"\n :placeholder=\"placeholder\"\n class=\"robot-search-input\"\n @keydown.esc=\"closeDialog\"\n @keydown.enter=\"handleEnter\"\n @keydown.arrow-down=\"focusNext\"\n @keydown.arrow-up=\"focusPrev\"\n />\n <button\n class=\"robot-close-btn\"\n @click=\"closeDialog\"\n >\n <div class=\"i-mdi:close\" />\n </button>\n </div>\n\n <!-- 搜索内容 -->\n <div class=\"robot-search-content\">\n <!-- 空状态 -->\n <div\n v-if=\"!hasContent\"\n class=\"robot-empty-state\"\n >\n <div class=\"i-mdi:magnify robot-empty-icon\" />\n <p>{{ emptyText }}</p>\n </div>\n\n <!-- 搜索历史 -->\n <template\n v-else-if=\"!searchValue.trim() && displayHistory.length > 0\"\n >\n <div class=\"robot-search-results\">\n <div class=\"robot-result-group\">\n <div class=\"robot-group-title\">\n <div\n class=\"i-mdi:clock-time-four-outline robot-group-icon\"\n />\n 最近搜索\n <span class=\"robot-group-count\">{{\n displayHistory.length\n }}</span>\n <button\n class=\"robot-clear-history\"\n @click=\"clearHistory\"\n title=\"清空历史\"\n >\n <div class=\"i-mdi:delete-outline\" />\n </button>\n </div>\n <div class=\"robot-group-items\">\n <div\n v-for=\"(historyItem, index) in displayHistory\"\n :key=\"`history-${index}`\"\n :class=\"getItemClasses(index, true)\"\n @click=\"selectHistoryItem(historyItem)\"\n @mouseenter=\"selectedIndex = index\"\n >\n <component\n v-if=\"historyItem.menuItem?.icon\"\n :is=\"historyItem.menuItem.icon\"\n class=\"robot-item-icon\"\n />\n <div\n v-else\n class=\"robot-item-icon robot-default-icon\"\n >\n <div class=\"i-mdi:file-document-outline\" />\n </div>\n <div class=\"robot-item-content\">\n <div class=\"robot-item-label\">\n {{ historyItem.query }}\n </div>\n <div class=\"robot-item-desc\">\n {{\n formatMenuPath(historyItem.menuItem?.key || '')\n }}\n </div>\n </div>\n <button\n class=\"robot-history-delete\"\n @click.stop=\"removeHistoryItem(index)\"\n title=\"删除此记录\"\n >\n <div class=\"i-mdi:close\" />\n </button>\n </div>\n </div>\n </div>\n </div>\n </template>\n\n <!-- 搜索结果 -->\n <template v-else-if=\"searchValue.trim()\">\n <div class=\"robot-search-results\">\n <!-- 无结果状态 -->\n <div\n v-if=\"!hasResults\"\n class=\"robot-empty-state\"\n >\n <div class=\"i-mdi:magnify robot-empty-icon\" />\n <p>未找到 \"{{ searchValue }}\" 相关内容</p>\n </div>\n\n <!-- 搜索结果列表 -->\n <div\n v-else\n class=\"robot-result-group\"\n >\n <div class=\"robot-group-title\">\n <div class=\"i-mdi:menu robot-group-icon\" />\n {{ resultGroupTitle }}\n <span class=\"robot-group-count\">{{\n filteredMenuItems.length\n }}</span>\n </div>\n <div class=\"robot-group-items\">\n <div\n v-for=\"(item, index) in filteredMenuItems\"\n :key=\"item.key\"\n :class=\"getItemClasses(index, false)\"\n @click=\"selectItem(item)\"\n @mouseenter=\"selectedIndex = index\"\n >\n <component\n v-if=\"item.icon\"\n :is=\"item.icon\"\n class=\"robot-item-icon\"\n />\n <div\n v-else\n class=\"robot-item-icon robot-default-icon\"\n >\n <div class=\"i-mdi:file-document-outline\" />\n </div>\n <div class=\"robot-item-content\">\n <div\n class=\"robot-item-label\"\n v-html=\"highlightMatch(item.label, searchValue)\"\n ></div>\n <div class=\"robot-item-desc\">\n {{ formatMenuPath(item.key) }}\n </div>\n </div>\n <div\n v-if=\"item.children?.length\"\n class=\"robot-item-badge\"\n >\n {{ item.children.length }}\n </div>\n </div>\n </div>\n </div>\n </div>\n </template>\n </div>\n\n <!-- 搜索底部 -->\n <div class=\"robot-search-footer\">\n <div class=\"robot-footer-actions\">\n <div class=\"robot-action-item\">\n <kbd>↵</kbd><span>选择</span>\n </div>\n <div class=\"robot-action-item\">\n <kbd>↑↓</kbd><span>导航</span>\n </div>\n <div class=\"robot-action-item\">\n <kbd>esc</kbd><span>关闭</span>\n </div>\n </div>\n <div\n v-if=\"hasContent\"\n class=\"robot-footer-info\"\n >\n <span v-if=\"searchValue.trim() && hasResults\">\n 共 {{ filteredMenuItems.length }} 项结果\n </span>\n <span\n v-else-if=\"!searchValue.trim() && displayHistory.length > 0\"\n >\n {{ displayHistory.length }} 条历史记录\n </span>\n </div>\n </div>\n </div>\n </div>\n </Transition>\n </Teleport>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { useGlobalSearch } from './composables/useGlobalSearch'\n import type { GlobalSearchOptions } from './types'\n\n defineOptions({ name: 'C_GlobalSearch' })\n\n interface Props {\n /** useGlobalSearch 配置(必须传入 menuItems + onSelect) */\n options: GlobalSearchOptions\n /** 搜索框 placeholder */\n placeholder?: string\n /** 无内容提示文字 */\n emptyText?: string\n /** 结果分组标题 */\n resultGroupTitle?: string\n }\n\n const props = withDefaults(defineProps<Props>(), {\n placeholder: '搜索导航菜单...',\n emptyText: '输入关键词搜索菜单',\n resultGroupTitle: '菜单导航',\n })\n\n const {\n showDialog,\n searchValue,\n selectedIndex,\n searchInputRef,\n isDark,\n filteredMenuItems,\n displayHistory,\n hasResults,\n hasContent,\n getItemClasses,\n highlightMatch,\n formatMenuPath,\n clearHistory,\n removeHistoryItem,\n openDialog,\n closeDialog,\n selectHistoryItem,\n selectItem,\n handleEnter,\n focusNext,\n focusPrev,\n } = useGlobalSearch(props.options)\n\n defineExpose({ openDialog, closeDialog })\n</script>\n\n<style lang=\"scss\" scoped>\n @use './index.scss';\n</style>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"C_Table-XKQOEFHF.css","names":[],"sources":["../src/components/C_Table/components/ColumnSettings/index.vue?vue&type=style&index=0&scoped=a4d013ea&lang.scss","../src/components/C_Table/index.vue?vue&type=style&index=0&scoped=9c9392e6&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled */.column-management-tab .search-row[data-v-a4d013ea] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n}\n.column-management-tab .search-row .search-input[data-v-a4d013ea] {\n flex: 1;\n min-width: 0;\n}\n.column-management-tab .search-row .resizable-control[data-v-a4d013ea] {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n padding: 0 10px;\n height: 34px;\n background: var(--n-color-target);\n border-radius: 6px;\n white-space: nowrap;\n}\n.column-management-tab .top-actions-bar[data-v-a4d013ea] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n padding: 10px 12px;\n background: var(--n-color-target);\n border-radius: 6px;\n}\n.column-management-tab .top-actions-bar .stats-info[data-v-a4d013ea] {\n flex: 1;\n}\n.column-management-tab .top-actions-bar .quick-actions[data-v-a4d013ea] {\n flex-shrink: 0;\n}\n.column-management-tab .column-list .column-item[data-v-a4d013ea] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 4px;\n margin-bottom: 4px;\n border-radius: 4px;\n background: transparent;\n cursor: move;\n transition: all 0.2s ease;\n}\n.column-management-tab .column-list .column-item[data-v-a4d013ea]:hover {\n background: var(--n-color-target);\n}\n.column-management-tab .column-list .column-item.disabled[data-v-a4d013ea] {\n opacity: 0.6;\n cursor: not-allowed;\n}\n.column-management-tab .column-list .column-item.fixed-left[data-v-a4d013ea] {\n background: rgba(24, 160, 88, 0.08);\n}\n.column-management-tab .column-list .column-item.fixed-right[data-v-a4d013ea] {\n background: rgba(240, 138, 0, 0.08);\n}\n.column-management-tab .column-list .column-item .column-info[data-v-a4d013ea] {\n display: flex;\n align-items: center;\n flex: 1;\n gap: 10px;\n min-width: 0;\n}\n.column-management-tab .column-list .column-item .column-info .column-controls[data-v-a4d013ea] {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n}\n.column-management-tab .column-list .column-item .column-info .column-controls .drag-handle[data-v-a4d013ea] {\n color: var(--n-text-color-3);\n cursor: grab;\n}\n.column-management-tab .column-list .column-item .column-info .column-controls .drag-handle[data-v-a4d013ea]:active {\n cursor: grabbing;\n}\n.column-management-tab .column-list .column-item .column-info .column-controls .drag-handle.disabled[data-v-a4d013ea] {\n cursor: not-allowed;\n opacity: 0.3;\n}\n.column-management-tab .column-list .column-item .column-info .column-details[data-v-a4d013ea] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n min-width: 0;\n overflow: hidden;\n}\n.column-management-tab .column-list .column-item .column-actions[data-v-a4d013ea] {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-shrink: 0;\n}\n.column-management-tab .column-list .column-item .column-actions .drag-controls[data-v-a4d013ea] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n.column-management-tab .column-list .column-item .column-actions .drag-controls .c-icon[data-v-a4d013ea] {\n opacity: 0.6;\n transition: all 0.2s ease;\n}\n.column-management-tab .column-list .column-item .column-actions .drag-controls .c-icon[data-v-a4d013ea]:not(.disabled):hover {\n opacity: 1;\n transform: scale(1.15);\n}\n.column-management-tab .column-list .column-item .column-actions .drag-controls .c-icon.disabled[data-v-a4d013ea] {\n opacity: 0.3;\n cursor: not-allowed;\n}\n.column-management-tab .column-list .column-item .column-actions .c-icon[data-v-a4d013ea] {\n transition: all 0.2s ease;\n}\n.column-management-tab .column-list .column-item .column-actions .c-icon[data-v-a4d013ea]:hover {\n transform: scale(1.15);\n}","/* unplugin-vue-components disabled *//* ================= 1. 组件根容器 ================= */\n.c-table-wrapper[data-v-9c9392e6] {\n width: 100%;\n position: relative;\n}\n\n/* ================= 2. 表格工具栏 ================= */\n.table-toolbar[data-v-9c9392e6] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n.table-toolbar .toolbar-left[data-v-9c9392e6] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n.table-toolbar .toolbar-right[data-v-9c9392e6] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.table-toolbar .toolbar-right .column-settings-btn[data-v-9c9392e6] {\n opacity: 0.6;\n transition: opacity 0.2s ease, transform 0.2s ease;\n cursor: pointer;\n}\n.table-toolbar .toolbar-right .column-settings-btn[data-v-9c9392e6]:hover {\n opacity: 1;\n transform: scale(1.1);\n}\n\n/* ================= 3. 动态行工具栏 ================= */\n.dynamic-rows-toolbar[data-v-9c9392e6] {\n margin-bottom: 16px;\n padding: 16px;\n border-radius: 8px;\n border: 1px solid var(--n-border-color);\n background-color: var(--n-card-color);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n transition: all 0.2s ease;\n}\n.dynamic-rows-toolbar[data-v-9c9392e6]:hover {\n border-color: var(--n-primary-color-suppl);\n}\n\n/* ================= 4. 表格布局基础 ================= */\n[data-v-9c9392e6] .n-data-table {\n table-layout: auto !important;\n width: 100% !important;\n border-radius: 8px;\n overflow: hidden;\n}\n\n/* 确保表格容器允许横向滚动(固定列必需) */\n[data-v-9c9392e6] .n-data-table-wrapper {\n overflow-x: auto !important;\n}\n\n/* 分页组件样式 */\n.pagination-wrapper[data-v-9c9392e6] {\n margin-top: 16px;\n display: flex;\n justify-content: flex-end;\n}\n\n/* ================= 5. 表格列宽度管理 ================= */\n/* 普通列的最小宽度保护 */\n[data-v-9c9392e6] .n-data-table-th:not(:last-child) {\n min-width: 80px !important;\n}\n\n/* 操作列固定宽度(适应4个按钮的布局) */\n[data-v-9c9392e6] .n-data-table-th:last-child {\n width: 180px !important;\n min-width: 160px !important;\n max-width: 200px !important;\n text-align: center !important;\n padding: 8px 12px !important;\n}\n\n/* 操作按钮容器居中 */\n[data-v-9c9392e6] .n-data-table-td:last-child .n-space {\n justify-content: center !important;\n align-items: center !important;\n}\n\n/* ================= 6. 可编辑单元格样式 ================= */\n/* 单元格编辑容器 - 精致化设计 */\n.cell-edit-wrapper[data-v-9c9392e6] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n padding: 6px 8px;\n min-height: 36px;\n border-radius: 4px;\n transition: all 0.2s ease;\n cursor: pointer;\n position: relative;\n /* 悬停效果 */\n /* 激活状态 */\n}\n.cell-edit-wrapper[data-v-9c9392e6]:hover {\n background-color: var(--n-color-target);\n}\n.cell-edit-wrapper:hover .cell-edit-icon[data-v-9c9392e6] {\n opacity: 1;\n color: var(--n-color-success);\n transform: scale(1.05);\n}\n.cell-edit-wrapper[data-v-9c9392e6]:active {\n transform: translateY(1px);\n}\n\n/* 单元格内容 */\n.cell-value[data-v-9c9392e6] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin-right: 16px;\n line-height: 1.4;\n font-size: 13px;\n}\n\n/* 编辑图标 - 使用全局选择器确保动态创建的元素也能被选中 */\n.cell-edit-icon[data-v-9c9392e6],.cell-edit-icon {\n flex-shrink: 0;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n cursor: pointer;\n margin-left: 4px;\n transition: all 0.25s ease;\n color: var(--n-color-success);\n opacity: 0;\n position: relative;\n /* 悬停效果 */\n /* 激活效果 */\n /* 图标尺寸 */\n}\n.cell-edit-icon[data-v-9c9392e6]:hover,.cell-edit-icon {\n opacity: 1 !important;\n color: var(--n-color-success-hover) !important;\n background-color: var(--n-color-success-pressed);\n transform: scale(1.1);\n}\n.cell-edit-icon[data-v-9c9392e6]:active,.cell-edit-icon {\n transform: scale(0.95);\n}\n.cell-edit-icon svg[data-v-9c9392e6],.cell-edit-icon {\n width: 14px;\n height: 14px;\n}\n\n/* ================= 7. 单元格编辑状态样式 ================= */\n/* 编辑容器 - 确保水平布局不换行 */\n.cell-editing-container[data-v-9c9392e6],[data-v-9c9392e6] .cell-editing-container {\n display: flex !important;\n align-items: center !important;\n width: 100% !important;\n min-height: 36px !important;\n background-color: var(--n-input-color) !important;\n border: 1px solid var(--n-primary-color) !important;\n border-radius: 6px !important;\n padding: 4px 6px !important;\n box-shadow: 0 0 0 2px var(--n-primary-color-suppl) !important;\n gap: 8px !important;\n}\n\n/* 编辑输入区域 - 占据剩余空间 */\n.cell-editing-input[data-v-9c9392e6],[data-v-9c9392e6] .cell-editing-input {\n flex: 1 !important;\n min-width: 0 !important;\n}\n\n/* 深度选择器处理输入框样式 */\n[data-v-9c9392e6] .cell-editing-input .n-input {\n border: none !important;\n box-shadow: none !important;\n background: transparent !important;\n}\n[data-v-9c9392e6] .cell-editing-input .n-input.n-input--focus {\n border: none !important;\n box-shadow: none !important;\n}\n[data-v-9c9392e6] .cell-editing-input .n-input-number {\n border: none !important;\n box-shadow: none !important;\n background: transparent !important;\n}\n[data-v-9c9392e6] .cell-editing-input .n-select {\n border: none !important;\n box-shadow: none !important;\n background: transparent !important;\n}\n[data-v-9c9392e6] .cell-editing-input .n-select .n-base-selection {\n border: none !important;\n box-shadow: none !important;\n background: transparent !important;\n}\n\n/* 编辑操作按钮容器 */\n.cell-editing-actions[data-v-9c9392e6],[data-v-9c9392e6] .cell-editing-actions {\n display: flex !important;\n flex-shrink: 0 !important;\n align-items: center !important;\n gap: 4px !important;\n background: var(--n-color-popover) !important;\n border: 1px solid var(--n-border-color) !important;\n border-radius: 4px !important;\n padding: 2px !important;\n box-shadow: var(--n-box-shadow) !important;\n}\n\n/* 编辑操作按钮 */\n.cell-action-btn[data-v-9c9392e6],[data-v-9c9392e6] .cell-action-btn {\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n width: 20px !important;\n height: 20px !important;\n border: none !important;\n border-radius: 3px !important;\n cursor: pointer !important;\n transition: all 0.2s ease !important;\n background: transparent !important;\n /* 保存按钮 */\n /* 取消按钮 */\n /* 图标尺寸 */\n}\n.cell-action-btn.cell-action-save[data-v-9c9392e6],[data-v-9c9392e6] .cell-action-btn.cell-action-save {\n color: var(--n-color-success) !important;\n}\n.cell-action-btn.cell-action-save[data-v-9c9392e6]:hover,[data-v-9c9392e6] .cell-action-btn.cell-action-save:hover {\n background: var(--n-color-success-pressed) !important;\n transform: scale(1.1) !important;\n}\n.cell-action-btn.cell-action-cancel[data-v-9c9392e6],[data-v-9c9392e6] .cell-action-btn.cell-action-cancel {\n color: var(--n-color-error) !important;\n}\n.cell-action-btn.cell-action-cancel[data-v-9c9392e6]:hover,[data-v-9c9392e6] .cell-action-btn.cell-action-cancel:hover {\n background: var(--n-color-error-pressed) !important;\n transform: scale(1.1) !important;\n}\n.cell-action-btn svg[data-v-9c9392e6],[data-v-9c9392e6] .cell-action-btn svg {\n width: 11px !important;\n height: 11px !important;\n}\n\n/* ================= 7. 操作按钮样式 ================= */\n/* 通用按钮样式 */\n[data-v-9c9392e6] .n-button {\n white-space: nowrap;\n font-size: 12px !important;\n flex-shrink: 0 !important;\n border-radius: 6px;\n transition: all 0.2s ease;\n font-weight: 500;\n /* 图标间距 */\n /* 小尺寸按钮优化 */\n /* 四元按钮样式 */\n}\n[data-v-9c9392e6] .n-button .n-icon {\n margin-right: 4px !important;\n}\n[data-v-9c9392e6] .n-button.n-button--small-type {\n padding: 4px 8px;\n height: 28px;\n line-height: 20px;\n}\n[data-v-9c9392e6] .n-button.n-button--quaternary-type:hover {\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n[data-v-9c9392e6] .n-button.n-button--quaternary-type:active {\n transform: translateY(0);\n}\n\n/* ================= 8. 按钮组间距优化 ================= */\n/* 操作按钮组 */\n[data-v-9c9392e6] .n-space.n-space--horizontal .n-space-item:not(:last-child) {\n margin-right: 6px !important;\n}\n\n/* ================= 9. 模态框样式优化 ================= */\n/* 编辑模态框 */\n[data-v-9c9392e6] .n-modal .n-card {\n border-radius: 12px;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);\n}\n[data-v-9c9392e6] .n-modal .n-card__header {\n padding: 20px 24px 16px;\n font-weight: 600;\n font-size: 16px;\n}\n[data-v-9c9392e6] .n-modal .n-card__content {\n padding: 0 24px 16px;\n}\n[data-v-9c9392e6] .n-modal .n-card__action {\n padding: 16px 24px 20px;\n border-top: 1px solid var(--n-divider-color);\n}\n\n/* ================= 10. 描述列表样式 ================= */\n/* 详情模态框描述列表 */\n[data-v-9c9392e6] .n-descriptions .n-descriptions-item-label {\n font-weight: 500;\n color: var(--n-text-color-2);\n}\n[data-v-9c9392e6] .n-descriptions .n-descriptions-item-content {\n color: var(--n-text-color-1);\n word-break: break-all;\n}\n\n/* ================= 11. 响应式设计 ================= */\n/* 移动端适配 */\n@media (max-width: 768px) {\n.c-table-wrapper[data-v-9c9392e6] {\n overflow-x: auto;\n}\n /* 操作列在移动端的适配 */\n[data-v-9c9392e6] .n-data-table-th:last-child {\n width: 160px !important;\n min-width: 160px !important;\n}\n /* 按钮在移动端的优化 */\n[data-v-9c9392e6] .n-button {\n font-size: 11px !important;\n padding: 3px 6px;\n}\n[data-v-9c9392e6] .n-button .n-icon {\n margin-right: 2px !important;\n}\n /* 单元格编辑图标在移动端始终显示 */\n.cell-edit-icon[data-v-9c9392e6] {\n opacity: 0.6;\n}\n}\n/* ================= 12. 主题适配 ================= */\n/* 暗色主题适配 - 已通过 CSS 变量自动适配 */\n[data-theme=dark][data-v-9c9392e6] {\n /* CSS 变量已自动适配,如有特殊需求可在此添加 */\n}\n\n/* ================= 13. 响应式优化 ================= */\n/* 小屏幕下的单元格编辑优化 */\n@media (max-width: 768px) {\n.cell-editing-container[data-v-9c9392e6],[data-v-9c9392e6] .cell-editing-container {\n gap: 6px !important;\n}\n.cell-editing-actions[data-v-9c9392e6],[data-v-9c9392e6] .cell-editing-actions {\n gap: 3px !important;\n padding: 2px !important;\n}\n.cell-action-btn[data-v-9c9392e6],[data-v-9c9392e6] .cell-action-btn {\n width: 18px !important;\n height: 18px !important;\n}\n.cell-action-btn svg[data-v-9c9392e6],[data-v-9c9392e6] .cell-action-btn svg {\n width: 10px !important;\n height: 10px !important;\n}\n /* 移动端编辑图标 */\n.cell-edit-icon[data-v-9c9392e6] {\n opacity: 0.6 !important;\n}\n.cell-value[data-v-9c9392e6] {\n margin-right: 12px !important;\n}\n}\n/* ================= 14. 性能优化 ================= */\n/* 使用 GPU 加速的动画 */\n.cell-edit-icon[data-v-9c9392e6],\n.cell-action-btn[data-v-9c9392e6] {\n will-change: transform;\n backface-visibility: hidden;\n}\n[data-v-9c9392e6] .n-button {\n will-change: transform;\n backface-visibility: hidden;\n}\n\n/* ================= 15. 可访问性优化 ================= */\n/* 聚焦状态 */\n.cell-edit-wrapper[data-v-9c9392e6]:focus-within,\n.cell-editing-container[data-v-9c9392e6]:focus-within {\n outline: 2px solid var(--n-primary-color);\n outline-offset: 2px;\n}\n\n/* 高对比度模式支持 */\n@media (prefers-contrast: high) {\n.cell-edit-icon[data-v-9c9392e6] {\n opacity: 0.8;\n}\n.cell-editing-actions[data-v-9c9392e6] {\n border-width: 2px;\n}\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvHA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
1
+ {"version":3,"file":"C_Table-C55H4kPr.css","names":[],"sources":["../src/components/C_Table/components/ColumnSettings/index.vue?vue&type=style&index=0&scoped=a4d013ea&lang.scss","../src/components/C_Table/index.vue?vue&type=style&index=0&scoped=767c7393&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled */.column-management-tab .search-row[data-v-a4d013ea] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n}\n.column-management-tab .search-row .search-input[data-v-a4d013ea] {\n flex: 1;\n min-width: 0;\n}\n.column-management-tab .search-row .resizable-control[data-v-a4d013ea] {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n padding: 0 10px;\n height: 34px;\n background: var(--n-color-target);\n border-radius: 6px;\n white-space: nowrap;\n}\n.column-management-tab .top-actions-bar[data-v-a4d013ea] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n padding: 10px 12px;\n background: var(--n-color-target);\n border-radius: 6px;\n}\n.column-management-tab .top-actions-bar .stats-info[data-v-a4d013ea] {\n flex: 1;\n}\n.column-management-tab .top-actions-bar .quick-actions[data-v-a4d013ea] {\n flex-shrink: 0;\n}\n.column-management-tab .column-list .column-item[data-v-a4d013ea] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 4px;\n margin-bottom: 4px;\n border-radius: 4px;\n background: transparent;\n cursor: move;\n transition: all 0.2s ease;\n}\n.column-management-tab .column-list .column-item[data-v-a4d013ea]:hover {\n background: var(--n-color-target);\n}\n.column-management-tab .column-list .column-item.disabled[data-v-a4d013ea] {\n opacity: 0.6;\n cursor: not-allowed;\n}\n.column-management-tab .column-list .column-item.fixed-left[data-v-a4d013ea] {\n background: rgba(24, 160, 88, 0.08);\n}\n.column-management-tab .column-list .column-item.fixed-right[data-v-a4d013ea] {\n background: rgba(240, 138, 0, 0.08);\n}\n.column-management-tab .column-list .column-item .column-info[data-v-a4d013ea] {\n display: flex;\n align-items: center;\n flex: 1;\n gap: 10px;\n min-width: 0;\n}\n.column-management-tab .column-list .column-item .column-info .column-controls[data-v-a4d013ea] {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n}\n.column-management-tab .column-list .column-item .column-info .column-controls .drag-handle[data-v-a4d013ea] {\n color: var(--n-text-color-3);\n cursor: grab;\n}\n.column-management-tab .column-list .column-item .column-info .column-controls .drag-handle[data-v-a4d013ea]:active {\n cursor: grabbing;\n}\n.column-management-tab .column-list .column-item .column-info .column-controls .drag-handle.disabled[data-v-a4d013ea] {\n cursor: not-allowed;\n opacity: 0.3;\n}\n.column-management-tab .column-list .column-item .column-info .column-details[data-v-a4d013ea] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n min-width: 0;\n overflow: hidden;\n}\n.column-management-tab .column-list .column-item .column-actions[data-v-a4d013ea] {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-shrink: 0;\n}\n.column-management-tab .column-list .column-item .column-actions .drag-controls[data-v-a4d013ea] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n.column-management-tab .column-list .column-item .column-actions .drag-controls .c-icon[data-v-a4d013ea] {\n opacity: 0.6;\n transition: all 0.2s ease;\n}\n.column-management-tab .column-list .column-item .column-actions .drag-controls .c-icon[data-v-a4d013ea]:not(.disabled):hover {\n opacity: 1;\n transform: scale(1.15);\n}\n.column-management-tab .column-list .column-item .column-actions .drag-controls .c-icon.disabled[data-v-a4d013ea] {\n opacity: 0.3;\n cursor: not-allowed;\n}\n.column-management-tab .column-list .column-item .column-actions .c-icon[data-v-a4d013ea] {\n transition: all 0.2s ease;\n}\n.column-management-tab .column-list .column-item .column-actions .c-icon[data-v-a4d013ea]:hover {\n transform: scale(1.15);\n}","/* unplugin-vue-components disabled *//* ================= 1. 组件根容器 ================= */\n.c-table-wrapper[data-v-767c7393] {\n width: 100%;\n position: relative;\n}\n\n/* ================= 2. 表格工具栏 ================= */\n.table-toolbar[data-v-767c7393] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n.table-toolbar .toolbar-left[data-v-767c7393] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n.table-toolbar .toolbar-right[data-v-767c7393] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.table-toolbar .toolbar-right .column-settings-btn[data-v-767c7393] {\n opacity: 0.6;\n transition: opacity 0.2s ease, transform 0.2s ease;\n cursor: pointer;\n}\n.table-toolbar .toolbar-right .column-settings-btn[data-v-767c7393]:hover {\n opacity: 1;\n transform: scale(1.1);\n}\n\n/* ================= 3. 动态行工具栏 ================= */\n.dynamic-rows-toolbar[data-v-767c7393] {\n margin-bottom: 16px;\n padding: 16px;\n border-radius: 8px;\n border: 1px solid var(--n-border-color);\n background-color: var(--n-card-color);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n transition: all 0.2s ease;\n}\n.dynamic-rows-toolbar[data-v-767c7393]:hover {\n border-color: var(--n-primary-color-suppl);\n}\n\n/* ================= 4. 表格布局基础 ================= */\n[data-v-767c7393] .n-data-table {\n table-layout: auto !important;\n width: 100% !important;\n border-radius: 8px;\n overflow: hidden;\n}\n\n/* 确保表格容器允许横向滚动(固定列必需) */\n[data-v-767c7393] .n-data-table-wrapper {\n overflow-x: auto !important;\n}\n\n/* 分页组件样式 */\n.pagination-wrapper[data-v-767c7393] {\n margin-top: 16px;\n display: flex;\n justify-content: flex-end;\n}\n\n/* ================= 5. 表格列宽度管理 ================= */\n/* 普通列的最小宽度保护 */\n[data-v-767c7393] .n-data-table-th:not(:last-child) {\n min-width: 80px !important;\n}\n\n/* 操作列固定宽度(适应4个按钮的布局) */\n[data-v-767c7393] .n-data-table-th:last-child {\n width: 180px !important;\n min-width: 160px !important;\n max-width: 200px !important;\n text-align: center !important;\n padding: 8px 12px !important;\n}\n\n/* 操作按钮容器居中 */\n[data-v-767c7393] .n-data-table-td:last-child .n-space {\n justify-content: center !important;\n align-items: center !important;\n}\n\n/* ================= 6. 可编辑单元格样式 ================= */\n/* 单元格编辑容器 - 精致化设计 */\n.cell-edit-wrapper[data-v-767c7393] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n padding: 6px 8px;\n min-height: 36px;\n border-radius: 4px;\n transition: all 0.2s ease;\n cursor: pointer;\n position: relative;\n /* 悬停效果 */\n /* 激活状态 */\n}\n.cell-edit-wrapper[data-v-767c7393]:hover {\n background-color: var(--n-color-target);\n}\n.cell-edit-wrapper:hover .cell-edit-icon[data-v-767c7393] {\n opacity: 1;\n color: var(--n-color-success);\n transform: scale(1.05);\n}\n.cell-edit-wrapper[data-v-767c7393]:active {\n transform: translateY(1px);\n}\n\n/* 单元格内容 */\n.cell-value[data-v-767c7393] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin-right: 16px;\n line-height: 1.4;\n font-size: 13px;\n}\n\n/* 编辑图标 - 使用全局选择器确保动态创建的元素也能被选中 */\n.cell-edit-icon[data-v-767c7393],.cell-edit-icon {\n flex-shrink: 0;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n cursor: pointer;\n margin-left: 4px;\n transition: all 0.25s ease;\n color: var(--n-color-success);\n opacity: 0;\n position: relative;\n /* 悬停效果 */\n /* 激活效果 */\n /* 图标尺寸 */\n}\n.cell-edit-icon[data-v-767c7393]:hover,.cell-edit-icon {\n opacity: 1 !important;\n color: var(--n-color-success-hover) !important;\n background-color: var(--n-color-success-pressed);\n transform: scale(1.1);\n}\n.cell-edit-icon[data-v-767c7393]:active,.cell-edit-icon {\n transform: scale(0.95);\n}\n.cell-edit-icon svg[data-v-767c7393],.cell-edit-icon {\n width: 14px;\n height: 14px;\n}\n\n/* ================= 7. 单元格编辑状态样式 ================= */\n/* 编辑容器 - 确保水平布局不换行 */\n.cell-editing-container[data-v-767c7393],[data-v-767c7393] .cell-editing-container {\n display: flex !important;\n align-items: center !important;\n width: 100% !important;\n min-height: 36px !important;\n background-color: var(--n-input-color) !important;\n border: 1px solid var(--n-primary-color) !important;\n border-radius: 6px !important;\n padding: 4px 6px !important;\n box-shadow: 0 0 0 2px var(--n-primary-color-suppl) !important;\n gap: 8px !important;\n}\n\n/* 编辑输入区域 - 占据剩余空间 */\n.cell-editing-input[data-v-767c7393],[data-v-767c7393] .cell-editing-input {\n flex: 1 !important;\n min-width: 0 !important;\n}\n\n/* 深度选择器处理输入框样式 */\n[data-v-767c7393] .cell-editing-input .n-input {\n border: none !important;\n box-shadow: none !important;\n background: transparent !important;\n}\n[data-v-767c7393] .cell-editing-input .n-input.n-input--focus {\n border: none !important;\n box-shadow: none !important;\n}\n[data-v-767c7393] .cell-editing-input .n-input-number {\n border: none !important;\n box-shadow: none !important;\n background: transparent !important;\n}\n[data-v-767c7393] .cell-editing-input .n-select {\n border: none !important;\n box-shadow: none !important;\n background: transparent !important;\n}\n[data-v-767c7393] .cell-editing-input .n-select .n-base-selection {\n border: none !important;\n box-shadow: none !important;\n background: transparent !important;\n}\n\n/* 编辑操作按钮容器 */\n.cell-editing-actions[data-v-767c7393],[data-v-767c7393] .cell-editing-actions {\n display: flex !important;\n flex-shrink: 0 !important;\n align-items: center !important;\n gap: 4px !important;\n background: var(--n-color-popover) !important;\n border: 1px solid var(--n-border-color) !important;\n border-radius: 4px !important;\n padding: 2px !important;\n box-shadow: var(--n-box-shadow) !important;\n}\n\n/* 编辑操作按钮 */\n.cell-action-btn[data-v-767c7393],[data-v-767c7393] .cell-action-btn {\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n width: 20px !important;\n height: 20px !important;\n border: none !important;\n border-radius: 3px !important;\n cursor: pointer !important;\n transition: all 0.2s ease !important;\n background: transparent !important;\n /* 保存按钮 */\n /* 取消按钮 */\n /* 图标尺寸 */\n}\n.cell-action-btn.cell-action-save[data-v-767c7393],[data-v-767c7393] .cell-action-btn.cell-action-save {\n color: var(--n-color-success) !important;\n}\n.cell-action-btn.cell-action-save[data-v-767c7393]:hover,[data-v-767c7393] .cell-action-btn.cell-action-save:hover {\n background: var(--n-color-success-pressed) !important;\n transform: scale(1.1) !important;\n}\n.cell-action-btn.cell-action-cancel[data-v-767c7393],[data-v-767c7393] .cell-action-btn.cell-action-cancel {\n color: var(--n-color-error) !important;\n}\n.cell-action-btn.cell-action-cancel[data-v-767c7393]:hover,[data-v-767c7393] .cell-action-btn.cell-action-cancel:hover {\n background: var(--n-color-error-pressed) !important;\n transform: scale(1.1) !important;\n}\n.cell-action-btn svg[data-v-767c7393],[data-v-767c7393] .cell-action-btn svg {\n width: 11px !important;\n height: 11px !important;\n}\n\n/* ================= 7. 操作按钮样式 ================= */\n/* 通用按钮样式 */\n[data-v-767c7393] .n-button {\n white-space: nowrap;\n font-size: 12px !important;\n flex-shrink: 0 !important;\n border-radius: 6px;\n transition: all 0.2s ease;\n font-weight: 500;\n /* 图标间距 */\n /* 小尺寸按钮优化 */\n /* 四元按钮样式 */\n}\n[data-v-767c7393] .n-button .n-icon {\n margin-right: 4px !important;\n}\n[data-v-767c7393] .n-button.n-button--small-type {\n padding: 4px 8px;\n height: 28px;\n line-height: 20px;\n}\n[data-v-767c7393] .n-button.n-button--quaternary-type:hover {\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n[data-v-767c7393] .n-button.n-button--quaternary-type:active {\n transform: translateY(0);\n}\n\n/* ================= 8. 按钮组间距优化 ================= */\n/* 操作按钮组 */\n[data-v-767c7393] .n-space.n-space--horizontal .n-space-item:not(:last-child) {\n margin-right: 6px !important;\n}\n\n/* ================= 9. 模态框样式优化 ================= */\n/* 编辑模态框 */\n[data-v-767c7393] .n-modal .n-card {\n border-radius: 12px;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);\n}\n[data-v-767c7393] .n-modal .n-card__header {\n padding: 20px 24px 16px;\n font-weight: 600;\n font-size: 16px;\n}\n[data-v-767c7393] .n-modal .n-card__content {\n padding: 0 24px 16px;\n}\n[data-v-767c7393] .n-modal .n-card__action {\n padding: 16px 24px 20px;\n border-top: 1px solid var(--n-divider-color);\n}\n\n/* ================= 10. 描述列表样式 ================= */\n/* 详情模态框描述列表 */\n[data-v-767c7393] .n-descriptions .n-descriptions-item-label {\n font-weight: 500;\n color: var(--n-text-color-2);\n}\n[data-v-767c7393] .n-descriptions .n-descriptions-item-content {\n color: var(--n-text-color-1);\n word-break: break-all;\n}\n\n/* ================= 11. 响应式设计 ================= */\n/* 移动端适配 */\n@media (max-width: 768px) {\n.c-table-wrapper[data-v-767c7393] {\n overflow-x: auto;\n}\n /* 操作列在移动端的适配 */\n[data-v-767c7393] .n-data-table-th:last-child {\n width: 160px !important;\n min-width: 160px !important;\n}\n /* 按钮在移动端的优化 */\n[data-v-767c7393] .n-button {\n font-size: 11px !important;\n padding: 3px 6px;\n}\n[data-v-767c7393] .n-button .n-icon {\n margin-right: 2px !important;\n}\n /* 单元格编辑图标在移动端始终显示 */\n.cell-edit-icon[data-v-767c7393] {\n opacity: 0.6;\n}\n}\n/* ================= 12. 主题适配 ================= */\n/* 暗色主题适配 - 已通过 CSS 变量自动适配 */\n[data-theme=dark][data-v-767c7393] {\n /* CSS 变量已自动适配,如有特殊需求可在此添加 */\n}\n\n/* ================= 13. 响应式优化 ================= */\n/* 小屏幕下的单元格编辑优化 */\n@media (max-width: 768px) {\n.cell-editing-container[data-v-767c7393],[data-v-767c7393] .cell-editing-container {\n gap: 6px !important;\n}\n.cell-editing-actions[data-v-767c7393],[data-v-767c7393] .cell-editing-actions {\n gap: 3px !important;\n padding: 2px !important;\n}\n.cell-action-btn[data-v-767c7393],[data-v-767c7393] .cell-action-btn {\n width: 18px !important;\n height: 18px !important;\n}\n.cell-action-btn svg[data-v-767c7393],[data-v-767c7393] .cell-action-btn svg {\n width: 10px !important;\n height: 10px !important;\n}\n /* 移动端编辑图标 */\n.cell-edit-icon[data-v-767c7393] {\n opacity: 0.6 !important;\n}\n.cell-value[data-v-767c7393] {\n margin-right: 12px !important;\n}\n}\n/* ================= 14. 性能优化 ================= */\n/* 使用 GPU 加速的动画 */\n.cell-edit-icon[data-v-767c7393],\n.cell-action-btn[data-v-767c7393] {\n will-change: transform;\n backface-visibility: hidden;\n}\n[data-v-767c7393] .n-button {\n will-change: transform;\n backface-visibility: hidden;\n}\n\n/* ================= 15. 可访问性优化 ================= */\n/* 聚焦状态 */\n.cell-edit-wrapper[data-v-767c7393]:focus-within,\n.cell-editing-container[data-v-767c7393]:focus-within {\n outline: 2px solid var(--n-primary-color);\n outline-offset: 2px;\n}\n\n/* 高对比度模式支持 */\n@media (prefers-contrast: high) {\n.cell-edit-icon[data-v-767c7393] {\n opacity: 0.8;\n}\n.cell-editing-actions[data-v-767c7393] {\n border-width: 2px;\n}\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvHA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
package/dist/C_Table2.js CHANGED
@@ -2766,9 +2766,26 @@ var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCo
2766
2766
  const effectiveColumns = computed(() => props.columns ?? props.crud?.columns.value ?? []);
2767
2767
  const resolved = computed(() => resolveConfig(effectiveConfig.value));
2768
2768
  const editModeChecker = computed(() => createEditModeChecker(resolved.value));
2769
- const unwrapRef = (val) => val && typeof val === "object" && "value" in val ? val.value : val;
2770
- const normalizedData = computed(() => unwrapRef(props.data) ?? props.crud?.data.value ?? []);
2771
- const normalizedLoading = computed(() => unwrapRef(props.loading) ?? props.crud?.loading.value ?? false);
2769
+ const unwrapMaybeRef = (val) => val && typeof val === "object" && "value" in val ? val.value : val;
2770
+ const normalizedData = computed(() => unwrapMaybeRef(props.data) ?? props.crud?.data.value ?? []);
2771
+ /**
2772
+ * Loading 状态:使用 watchEffect 主动追踪 props.loading / crud.loading
2773
+ * 解决跨 npm 包时 computed 对 props.crud.loading.value 依赖追踪不稳定的问题
2774
+ */
2775
+ const normalizedLoading = ref(false);
2776
+ watchEffect(() => {
2777
+ const propVal = props.loading;
2778
+ if (propVal !== void 0) {
2779
+ normalizedLoading.value = propVal && typeof propVal === "object" && "value" in propVal ? !!propVal.value : !!propVal;
2780
+ return;
2781
+ }
2782
+ const crudLoading = props.crud?.loading;
2783
+ if (crudLoading !== void 0) {
2784
+ normalizedLoading.value = crudLoading && typeof crudLoading === "object" && "value" in crudLoading ? !!crudLoading.value : !!crudLoading;
2785
+ return;
2786
+ }
2787
+ normalizedLoading.value = false;
2788
+ });
2772
2789
  const pagination = usePagination({
2773
2790
  data: normalizedData,
2774
2791
  config: computed(() => resolved.value.pagination),
@@ -3000,7 +3017,7 @@ var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCo
3000
3017
 
3001
3018
  //#endregion
3002
3019
  //#region src/components/C_Table/index.vue
3003
- var C_Table_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-9c9392e6"]]);
3020
+ var C_Table_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-767c7393"]]);
3004
3021
 
3005
3022
  //#endregion
3006
3023
  export { useTableManager as a, usePrintWatermark as c, useCellEdit as d, useRowEdit as f, usePagination as i, useTableExpand as l, resolveConfig as m, useTableColumns as n, useDynamicRows as o, createEditModeChecker as p, useTableActions as r, printPresets as s, C_Table_default as t, useModalEdit as u };