@veltra/desktop 1.6.4 → 1.6.6

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 (150) hide show
  1. package/dist/components/action/action.js.map +1 -1
  2. package/dist/components/auto-complete/auto-complete.js.map +1 -1
  3. package/dist/components/badge/badge.js.map +1 -1
  4. package/dist/components/batch-edit/batch-edit-form.js.map +1 -1
  5. package/dist/components/batch-edit/batch-edit-list.js.map +1 -1
  6. package/dist/components/batch-edit/batch-edit.js.map +1 -1
  7. package/dist/components/breadcrumb/breadcrumb.js.map +1 -1
  8. package/dist/components/button/button.js.map +1 -1
  9. package/dist/components/card/card-cover.js.map +1 -1
  10. package/dist/components/cascade/cascade-panel-item.js.map +1 -1
  11. package/dist/components/cascade/cascade.js.map +1 -1
  12. package/dist/components/checkbox/checkbox-button.js.map +1 -1
  13. package/dist/components/checkbox/checkbox.js.map +1 -1
  14. package/dist/components/checkbox-group/checkbox-group.js.map +1 -1
  15. package/dist/components/code-editor/basic-setup.js +2 -2
  16. package/dist/components/code-editor/code-editor.js +1 -1
  17. package/dist/components/code-editor/code-editor.js.map +1 -1
  18. package/dist/components/code-editor/shell-extension.js +1 -1
  19. package/dist/components/collapse/collapse-item.js.map +1 -1
  20. package/dist/components/condition-editor/components/condition-group.js.map +1 -1
  21. package/dist/components/condition-editor/components/condition-row.js.map +1 -1
  22. package/dist/components/contextmenu/contextmenu-item.js.map +1 -1
  23. package/dist/components/contextmenu/contextmenu-panel.js.map +1 -1
  24. package/dist/components/contextmenu/contextmenu-sub.js.map +1 -1
  25. package/dist/components/contextmenu/contextmenu.js.map +1 -1
  26. package/dist/components/date-panel/date-panel.js.map +1 -1
  27. package/dist/components/date-panel/headers/day.js.map +1 -1
  28. package/dist/components/date-panel/headers/month.js.map +1 -1
  29. package/dist/components/date-panel/headers/year.js.map +1 -1
  30. package/dist/components/date-panel/panels/day.js.map +1 -1
  31. package/dist/components/date-panel/panels/month.js.map +1 -1
  32. package/dist/components/date-panel/panels/year.js.map +1 -1
  33. package/dist/components/date-picker/date-picker.js.map +1 -1
  34. package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
  35. package/dist/components/dialog/dialog.js.map +1 -1
  36. package/dist/components/drawer/drawer.js.map +1 -1
  37. package/dist/components/dropdown/dropdown.js.map +1 -1
  38. package/dist/components/dual-nav/dual-nav-app.js.map +1 -1
  39. package/dist/components/dual-nav/dual-nav.js.map +1 -1
  40. package/dist/components/empty/empty.js.map +1 -1
  41. package/dist/components/expression-editor/components/path-preview.js.map +1 -1
  42. package/dist/components/expression-editor/components/variable-picker.js.map +1 -1
  43. package/dist/components/expression-editor/core/chip.js +1 -0
  44. package/dist/components/expression-editor/core/chip.js.map +1 -1
  45. package/dist/components/expression-editor/expression-editor.js.map +1 -1
  46. package/dist/components/file-picker/file-picker.js.map +1 -1
  47. package/dist/components/file-viewer/file-viewer.js.map +1 -1
  48. package/dist/components/file-viewer/previewers/docx-previewer.js.map +1 -1
  49. package/dist/components/file-viewer/previewers/image-previewer.js.map +1 -1
  50. package/dist/components/file-viewer/previewers/pdf-previewer.js.map +1 -1
  51. package/dist/components/file-viewer/previewers/sheet-previewer.js.map +1 -1
  52. package/dist/components/file-viewer/previewers/text-previewer.js.map +1 -1
  53. package/dist/components/file-viewer/previewers/video-previewer.js.map +1 -1
  54. package/dist/components/file-viewer/style2.css +2 -2
  55. package/dist/components/float-button/float-button.js.map +1 -1
  56. package/dist/components/grid/grid-item.js.map +1 -1
  57. package/dist/components/grid/grid.js.map +1 -1
  58. package/dist/components/grid-input/grid-input.js.map +1 -1
  59. package/dist/components/group-input/group-input.js.map +1 -1
  60. package/dist/components/group-nav/group-nav-item.js.map +1 -1
  61. package/dist/components/group-nav/group-nav.js.map +1 -1
  62. package/dist/components/layout/layout-resizer.js.map +1 -1
  63. package/dist/components/layout/layout.js.map +1 -1
  64. package/dist/components/list/list.js.map +1 -1
  65. package/dist/components/loading/loading.js.map +1 -1
  66. package/dist/components/message/message-box.js.map +1 -1
  67. package/dist/components/message/message.js.map +1 -1
  68. package/dist/components/message-confirm/message-confirm-box.js +1 -0
  69. package/dist/components/message-confirm/message-confirm-box.js.map +1 -1
  70. package/dist/components/message-confirm/message-confirm.js +13 -6
  71. package/dist/components/message-confirm/message-confirm.js.map +1 -1
  72. package/dist/components/message-confirm/message-confirm2.js +6 -4
  73. package/dist/components/message-confirm/message-confirm2.js.map +1 -1
  74. package/dist/components/message-confirm/style2.css +7 -0
  75. package/dist/components/multi-select/multi-select.js.map +1 -1
  76. package/dist/components/multi-tree-select/multi-tree-select.js.map +1 -1
  77. package/dist/components/nav/nav-icon.js.map +1 -1
  78. package/dist/components/nav/nav-item-collapsed.js.map +1 -1
  79. package/dist/components/nav/nav-item.js.map +1 -1
  80. package/dist/components/nav/nav-sub-collapsed.js.map +1 -1
  81. package/dist/components/nav/nav-sub.js.map +1 -1
  82. package/dist/components/nav/nav.js.map +1 -1
  83. package/dist/components/notification/notification-box.js.map +1 -1
  84. package/dist/components/notification/notification.js.map +1 -1
  85. package/dist/components/number-input/number-input.js.map +1 -1
  86. package/dist/components/number-range-input/number-range-input.js.map +1 -1
  87. package/dist/components/paginator/paginator.js.map +1 -1
  88. package/dist/components/palette/palette-color-switch.js.map +1 -1
  89. package/dist/components/palette/palette.js.map +1 -1
  90. package/dist/components/password-input/password-input.js.map +1 -1
  91. package/dist/components/pop-confirm/pop-confirm.js.map +1 -1
  92. package/dist/components/progress/progress.js.map +1 -1
  93. package/dist/components/progress-nodes/progress-nodes.js.map +1 -1
  94. package/dist/components/radio/radio.js.map +1 -1
  95. package/dist/components/radio-group/radio-group.js.map +1 -1
  96. package/dist/components/rich-text-editor/rich-text-editor.js.map +1 -1
  97. package/dist/components/rich-text-editor/toolbar.js.map +1 -1
  98. package/dist/components/scroll/scroll.js.map +1 -1
  99. package/dist/components/select/select.js.map +1 -1
  100. package/dist/components/slider/slider.js.map +1 -1
  101. package/dist/components/steps/steps.js.map +1 -1
  102. package/dist/components/switch/switch.js.map +1 -1
  103. package/dist/components/table/table-body.js.map +1 -1
  104. package/dist/components/table/table-cell.js.map +1 -1
  105. package/dist/components/table/table-foot.js.map +1 -1
  106. package/dist/components/table/table.js.map +1 -1
  107. package/dist/components/table-editor/table-editor.js.map +1 -1
  108. package/dist/components/tabs/tabs-horizontal.js.map +1 -1
  109. package/dist/components/tabs/tabs-vertical.js.map +1 -1
  110. package/dist/components/tabs/tabs.js.map +1 -1
  111. package/dist/components/tag/tag.js.map +1 -1
  112. package/dist/components/textarea/textarea.js.map +1 -1
  113. package/dist/components/theme/theme.js.map +1 -1
  114. package/dist/components/tip/tip.js.map +1 -1
  115. package/dist/components/tree/tree-node.js.map +1 -1
  116. package/dist/components/tree/tree.js.map +1 -1
  117. package/dist/components/tree-select/tree-select.js.map +1 -1
  118. package/dist/components/watermark/watermark.js.map +1 -1
  119. package/dist/node_modules/.bun/@codemirror_autocomplete@6.20.3/node_modules/@codemirror/autocomplete/dist/index.js +1 -1
  120. package/dist/node_modules/.bun/{@codemirror_commands@6.10.4 → @codemirror_commands@6.11.0}/node_modules/@codemirror/commands/dist/index.js +6 -5
  121. package/dist/node_modules/.bun/@codemirror_commands@6.11.0/node_modules/@codemirror/commands/dist/index.js.map +1 -0
  122. package/dist/node_modules/.bun/@codemirror_lang-css@6.3.1/node_modules/@codemirror/lang-css/dist/index.js +1 -1
  123. package/dist/node_modules/.bun/{@codemirror_lang-html@6.4.11 → @codemirror_lang-html@6.4.12}/node_modules/@codemirror/lang-html/dist/index.js +15 -6
  124. package/dist/node_modules/.bun/{@codemirror_lang-html@6.4.11 → @codemirror_lang-html@6.4.12}/node_modules/@codemirror/lang-html/dist/index.js.map +1 -1
  125. package/dist/node_modules/.bun/@codemirror_lang-javascript@6.2.5/node_modules/@codemirror/lang-javascript/dist/index.js +1 -1
  126. package/dist/node_modules/.bun/@codemirror_lang-markdown@6.5.2/node_modules/@codemirror/lang-markdown/dist/index.js +2 -2
  127. package/dist/node_modules/.bun/@codemirror_language@6.12.4/node_modules/@codemirror/language/dist/index.js +1 -1
  128. package/dist/node_modules/.bun/@codemirror_lint@6.9.7/node_modules/@codemirror/lint/dist/index.js +2 -2
  129. package/dist/node_modules/.bun/@codemirror_search@6.7.1/node_modules/@codemirror/search/dist/index.js +2 -2
  130. package/dist/node_modules/.bun/@codemirror_state@6.7.1/node_modules/@codemirror/state/dist/index.js +1 -1
  131. package/dist/node_modules/.bun/@codemirror_theme-one-dark@6.1.3/node_modules/@codemirror/theme-one-dark/dist/index.js +1 -1
  132. package/dist/node_modules/.bun/{@codemirror_view@6.43.8 → @codemirror_view@6.43.9}/node_modules/@codemirror/view/dist/index.js +5 -4
  133. package/dist/node_modules/.bun/{@codemirror_view@6.43.8 → @codemirror_view@6.43.9}/node_modules/@codemirror/view/dist/index.js.map +1 -1
  134. package/dist/node_modules/.bun/@lezer_css@1.3.6/node_modules/@lezer/css/dist/index.js +268 -0
  135. package/dist/node_modules/.bun/@lezer_css@1.3.6/node_modules/@lezer/css/dist/index.js.map +1 -0
  136. package/dist/node_modules/.bun/{@marijn_find-cluster-break@1.0.2 → @marijn_find-cluster-break@1.0.3}/node_modules/@marijn/find-cluster-break/src/index.js +2 -2
  137. package/dist/node_modules/.bun/{@marijn_find-cluster-break@1.0.2 → @marijn_find-cluster-break@1.0.3}/node_modules/@marijn/find-cluster-break/src/index.js.map +1 -1
  138. package/dist/node_modules/.bun/{crelt@1.0.6 → crelt@1.0.7}/node_modules/crelt/index.js +1 -1
  139. package/dist/node_modules/.bun/{crelt@1.0.6 → crelt@1.0.7}/node_modules/crelt/index.js.map +1 -1
  140. package/package.json +8 -8
  141. package/src/components/expression-editor/core/chip.ts +2 -0
  142. package/src/components/file-viewer/style.scss +11 -11
  143. package/src/components/message-confirm/__test__/message-confirm.test.ts +60 -0
  144. package/src/components/message-confirm/message-confirm-box.vue +1 -1
  145. package/src/components/message-confirm/message-confirm.ts +6 -4
  146. package/src/components/message-confirm/message-confirm.vue +5 -4
  147. package/src/components/message-confirm/style.scss +9 -1
  148. package/dist/node_modules/.bun/@codemirror_commands@6.10.4/node_modules/@codemirror/commands/dist/index.js.map +0 -1
  149. package/dist/node_modules/.bun/@lezer_css@1.3.4/node_modules/@lezer/css/dist/index.js +0 -268
  150. package/dist/node_modules/.bun/@lezer_css@1.3.4/node_modules/@lezer/css/dist/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"sheet-previewer.js","names":[],"sources":["../../../../src/components/file-viewer/previewers/sheet-previewer.vue"],"sourcesContent":["<template>\n <div :class=\"cls.e('sheet')\">\n <div v-if=\"unavailable\" :class=\"cls.e('empty')\">\n <u-empty text=\"无法预览表格:未安装 @veltra/sheet-core\" :size=\"32\" />\n </div>\n <template v-else>\n <div v-if=\"truncated\" :class=\"cls.e('sheet-note')\">\n 共 {{ totalRows.toLocaleString() }} 行,超出预览上限\n {{ maxRows.toLocaleString() }} 行,已全量加载\n </div>\n <div v-if=\"sheets.length > 1\" :class=\"cls.e('sheet-tabs')\">\n <button\n v-for=\"(s, i) in sheets\"\n :key=\"s.name\"\n :class=\"[cls.e('sheet-tab'), bem.is('active', i === activeSheetIndex)]\"\n @click=\"activeSheetIndex = i\"\n >\n {{ s.name }}\n </button>\n </div>\n <div ref=\"container\" :class=\"cls.e('sheet-stage')\" />\n <div v-if=\"loading\" :class=\"cls.e('loading')\">加载中…</div>\n </template>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem } from '@veltra/utils'\nimport { onBeforeUnmount, ref, shallowRef, useTemplateRef, watch } from 'vue'\n\nimport type { FileViewerItem } from '../../../types/file-viewer'\nimport { UEmpty } from '../../empty'\nimport { getExtension, toArrayBuffer } from '../helper'\n\ndefineOptions({ name: 'UFileViewerSheetPreviewer' })\n\n/** 仅类型查询;运行时通过动态 import 加载,未安装时不炸主入口 */\ntype SheetCoreModule = typeof import('@veltra/sheet-core') &\n typeof import('@veltra/sheet-core/grid')\ntype Sheet = InstanceType<SheetCoreModule['Sheet']>\ntype SheetGrid = InstanceType<SheetCoreModule['SheetGrid']>\n\nconst props = withDefaults(defineProps<{ file: FileViewerItem; maxRows?: number }>(), {\n maxRows: 50_000\n})\n\nconst emit = defineEmits<{ (e: 'error', err: unknown): void }>()\n\nconst cls = bem('file-viewer')\nconst container = useTemplateRef<HTMLDivElement>('container')\nconst loading = ref(true)\nconst unavailable = ref(false)\nconst truncated = ref(false)\nconst totalRows = ref(0)\nconst sheets = shallowRef<Sheet[]>([])\nconst activeSheetIndex = ref(0)\n\nlet controller: AbortController | undefined\n/** 递增 token:importXlsx 无 AbortSignal,靠它防止切文件后旧解析结果落地 */\nlet loadToken = 0\nlet grid: SheetGrid | undefined\nlet sheetCore: SheetCoreModule | undefined\n\nfunction releaseGrid() {\n grid?.release()\n grid = undefined\n}\n\n/** 动态加载 sheet-core;未安装 optional peer 时返回 undefined */\nasync function resolveSheetCore(): Promise<SheetCoreModule | undefined> {\n if (sheetCore) return sheetCore\n try {\n const [core, grid] = await Promise.all([\n import('@veltra/sheet-core'),\n import('@veltra/sheet-core/grid')\n ])\n sheetCore = { ...core, ...grid }\n return sheetCore\n } catch {\n return undefined\n }\n}\n\n/** 解析文件为 Sheet 列表:xlsx 多表(importXlsx 建工作簿);csv 单表,表名取文件名 */\nasync function parseFile(\n core: SheetCoreModule,\n file: FileViewerItem,\n signal?: AbortSignal\n): Promise<Sheet[]> {\n const buf = await toArrayBuffer(file.src, signal)\n if (getExtension(file.name) === 'csv') {\n const text = new TextDecoder('utf-8', { fatal: false }).decode(buf)\n const sheet = new core.Sheet(file.name)\n core.importCsv(text, sheet)\n return [sheet]\n }\n const workbook = await core.importXlsx(buf)\n return workbook.getSheets()\n}\n\nfunction renderActive() {\n const sheet = sheets.value[activeSheetIndex.value]\n const el = container.value\n releaseGrid()\n if (!sheet || !el || !sheetCore) return\n\n // SheetGrid 的 rows 选项是渲染行数下限(构造时数据高水位恒并入渲染尺寸),\n // 不能用作行数上限;deleteRows 硬裁又会让引用被裁区域的公式显示 #REF!,\n // 故 maxRows 只驱动截断提示,不裁模型\n const total = sheet.rowCount\n totalRows.value = total\n truncated.value = props.maxRows > 0 && total > props.maxRows\n\n grid = new sheetCore.SheetGrid({ container: el, sheet, readonly: true })\n}\n\nasync function load() {\n const token = ++loadToken\n controller?.abort()\n controller = new AbortController()\n loading.value = true\n truncated.value = false\n releaseGrid()\n sheets.value = []\n activeSheetIndex.value = 0\n\n try {\n const core = await resolveSheetCore()\n if (token !== loadToken) return\n if (!core) {\n unavailable.value = true\n emit('error', new Error('未安装 @veltra/sheet-core,无法预览 Excel/CSV'))\n return\n }\n unavailable.value = false\n\n const parsed = await parseFile(core, props.file, controller.signal)\n if (token !== loadToken) return\n sheets.value = parsed\n renderActive()\n } catch (err) {\n if (token !== loadToken) return\n if ((err as { name?: string })?.name === 'AbortError') return\n emit('error', err)\n } finally {\n if (token === loadToken) loading.value = false\n }\n}\n\nwatch(() => props.file, load, { immediate: true })\nwatch(activeSheetIndex, renderActive)\n\nonBeforeUnmount(() => {\n controller?.abort()\n releaseGrid()\n sheets.value = []\n})\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"sheet-previewer.js","names":[],"sources":["../../../../src/components/file-viewer/previewers/sheet-previewer.vue"],"sourcesContent":["<template>\n <div :class=\"cls.e('sheet')\">\n <div v-if=\"unavailable\" :class=\"cls.e('empty')\">\n <u-empty text=\"无法预览表格:未安装 @veltra/sheet-core\" :size=\"32\" />\n </div>\n <template v-else>\n <div v-if=\"truncated\" :class=\"cls.e('sheet-note')\">\n 共 {{ totalRows.toLocaleString() }} 行,超出预览上限\n {{ maxRows.toLocaleString() }} 行,已全量加载\n </div>\n <div v-if=\"sheets.length > 1\" :class=\"cls.e('sheet-tabs')\">\n <button\n v-for=\"(s, i) in sheets\"\n :key=\"s.name\"\n :class=\"[cls.e('sheet-tab'), bem.is('active', i === activeSheetIndex)]\"\n @click=\"activeSheetIndex = i\"\n >\n {{ s.name }}\n </button>\n </div>\n <div ref=\"container\" :class=\"cls.e('sheet-stage')\" />\n <div v-if=\"loading\" :class=\"cls.e('loading')\">加载中…</div>\n </template>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem } from '@veltra/utils'\nimport { onBeforeUnmount, ref, shallowRef, useTemplateRef, watch } from 'vue'\n\nimport type { FileViewerItem } from '../../../types/file-viewer'\nimport { UEmpty } from '../../empty'\nimport { getExtension, toArrayBuffer } from '../helper'\n\ndefineOptions({ name: 'UFileViewerSheetPreviewer' })\n\n/** 仅类型查询;运行时通过动态 import 加载,未安装时不炸主入口 */\ntype SheetCoreModule = typeof import('@veltra/sheet-core') &\n typeof import('@veltra/sheet-core/grid')\ntype Sheet = InstanceType<SheetCoreModule['Sheet']>\ntype SheetGrid = InstanceType<SheetCoreModule['SheetGrid']>\n\nconst props = withDefaults(defineProps<{ file: FileViewerItem; maxRows?: number }>(), {\n maxRows: 50_000\n})\n\nconst emit = defineEmits<{ (e: 'error', err: unknown): void }>()\n\nconst cls = bem('file-viewer')\nconst container = useTemplateRef<HTMLDivElement>('container')\nconst loading = ref(true)\nconst unavailable = ref(false)\nconst truncated = ref(false)\nconst totalRows = ref(0)\nconst sheets = shallowRef<Sheet[]>([])\nconst activeSheetIndex = ref(0)\n\nlet controller: AbortController | undefined\n/** 递增 token:importXlsx 无 AbortSignal,靠它防止切文件后旧解析结果落地 */\nlet loadToken = 0\nlet grid: SheetGrid | undefined\nlet sheetCore: SheetCoreModule | undefined\n\nfunction releaseGrid() {\n grid?.release()\n grid = undefined\n}\n\n/** 动态加载 sheet-core;未安装 optional peer 时返回 undefined */\nasync function resolveSheetCore(): Promise<SheetCoreModule | undefined> {\n if (sheetCore) return sheetCore\n try {\n const [core, grid] = await Promise.all([\n import('@veltra/sheet-core'),\n import('@veltra/sheet-core/grid')\n ])\n sheetCore = { ...core, ...grid }\n return sheetCore\n } catch {\n return undefined\n }\n}\n\n/** 解析文件为 Sheet 列表:xlsx 多表(importXlsx 建工作簿);csv 单表,表名取文件名 */\nasync function parseFile(\n core: SheetCoreModule,\n file: FileViewerItem,\n signal?: AbortSignal\n): Promise<Sheet[]> {\n const buf = await toArrayBuffer(file.src, signal)\n if (getExtension(file.name) === 'csv') {\n const text = new TextDecoder('utf-8', { fatal: false }).decode(buf)\n const sheet = new core.Sheet(file.name)\n core.importCsv(text, sheet)\n return [sheet]\n }\n const workbook = await core.importXlsx(buf)\n return workbook.getSheets()\n}\n\nfunction renderActive() {\n const sheet = sheets.value[activeSheetIndex.value]\n const el = container.value\n releaseGrid()\n if (!sheet || !el || !sheetCore) return\n\n // SheetGrid 的 rows 选项是渲染行数下限(构造时数据高水位恒并入渲染尺寸),\n // 不能用作行数上限;deleteRows 硬裁又会让引用被裁区域的公式显示 #REF!,\n // 故 maxRows 只驱动截断提示,不裁模型\n const total = sheet.rowCount\n totalRows.value = total\n truncated.value = props.maxRows > 0 && total > props.maxRows\n\n grid = new sheetCore.SheetGrid({ container: el, sheet, readonly: true })\n}\n\nasync function load() {\n const token = ++loadToken\n controller?.abort()\n controller = new AbortController()\n loading.value = true\n truncated.value = false\n releaseGrid()\n sheets.value = []\n activeSheetIndex.value = 0\n\n try {\n const core = await resolveSheetCore()\n if (token !== loadToken) return\n if (!core) {\n unavailable.value = true\n emit('error', new Error('未安装 @veltra/sheet-core,无法预览 Excel/CSV'))\n return\n }\n unavailable.value = false\n\n const parsed = await parseFile(core, props.file, controller.signal)\n if (token !== loadToken) return\n sheets.value = parsed\n renderActive()\n } catch (err) {\n if (token !== loadToken) return\n if ((err as { name?: string })?.name === 'AbortError') return\n emit('error', err)\n } finally {\n if (token === loadToken) loading.value = false\n }\n}\n\nwatch(() => props.file, load, { immediate: true })\nwatch(activeSheetIndex, renderActive)\n\nonBeforeUnmount(() => {\n controller?.abort()\n releaseGrid()\n sheets.value = []\n})\n</script>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"text-previewer.js","names":[],"sources":["../../../../src/components/file-viewer/previewers/text-previewer.vue"],"sourcesContent":["<template>\n <u-scroll tag=\"div\" :class=\"cls.e('text')\">\n <div v-if=\"truncated\" :class=\"cls.e('sheet-note')\">\n ⚠ 文件过大,仅展示前 {{ formatKb(maxBytes) }}\n </div>\n <pre :class=\"cls.e('text-pre')\"><code>{{ text }}</code></pre>\n <div v-if=\"loading\" :class=\"cls.e('loading')\">加载中…</div>\n </u-scroll>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem } from '@veltra/utils'\nimport { onBeforeUnmount, ref, shallowRef, watch } from 'vue'\n\nimport type { FileViewerItem } from '../../../types/file-viewer'\nimport { UScroll } from '../../scroll'\n\ndefineOptions({ name: 'UFileViewerTextPreviewer' })\n\nconst props = withDefaults(\n defineProps<{\n file: FileViewerItem\n /** 单文件最大读取字节数(超出截断),默认 2MB */\n maxBytes?: number\n }>(),\n { maxBytes: 2 * 1024 * 1024 }\n)\n\nconst emit = defineEmits<{ (e: 'error', err: unknown): void }>()\n\nconst cls = bem('file-viewer')\n\nconst text = shallowRef('')\nconst truncated = ref(false)\nconst loading = ref(true)\n\nlet controller: AbortController | undefined\n\nfunction formatKb(bytes: number): string {\n if (bytes >= 1024 * 1024) return `${(bytes / 1024 / 1024).toFixed(1)} MB`\n return `${(bytes / 1024).toFixed(0)} KB`\n}\n\nasync function load() {\n controller?.abort()\n controller = new AbortController()\n loading.value = true\n truncated.value = false\n text.value = ''\n\n try {\n const { toArrayBuffer } = await import('../helper')\n const buf = await toArrayBuffer(props.file.src, controller.signal)\n const max = props.maxBytes\n const view = max > 0 && buf.byteLength > max ? new Uint8Array(buf, 0, max) : new Uint8Array(buf)\n truncated.value = max > 0 && buf.byteLength > max\n text.value = new TextDecoder('utf-8', { fatal: false }).decode(view)\n } catch (err) {\n if ((err as { name?: string })?.name === 'AbortError') return\n emit('error', err)\n } finally {\n loading.value = false\n }\n}\n\nwatch(\n () => props.file,\n () => load(),\n { immediate: true }\n)\n\nonBeforeUnmount(() => {\n controller?.abort()\n text.value = ''\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;EAmBA,MAAM,QAAQ;EASd,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,aAAa;EAE7B,MAAM,OAAO,WAAW,EAAE;EAC1B,MAAM,YAAY,IAAI,KAAK;EAC3B,MAAM,UAAU,IAAI,IAAI;EAExB,IAAI;EAEJ,SAAS,SAAS,OAAuB;GACvC,IAAI,SAAS,SAAa,OAAO,IAAI,QAAQ,OAAO,KAAA,CAAM,QAAQ,CAAC,EAAE;GACrE,OAAO,IAAI,QAAQ,KAAA,CAAM,QAAQ,CAAC,EAAE;EACtC;EAEA,eAAe,OAAO;GACpB,YAAY,MAAM;GAClB,aAAa,IAAI,gBAAgB;GACjC,QAAQ,QAAQ;GAChB,UAAU,QAAQ;GAClB,KAAK,QAAQ;GAEb,IAAI;IACF,MAAM,EAAE,kBAAkB,MAAM,OAAO;IACvC,MAAM,MAAM,MAAM,cAAc,MAAM,KAAK,KAAK,WAAW,MAAM;IACjE,MAAM,MAAM,MAAM;IAClB,MAAM,OAAO,MAAM,KAAK,IAAI,aAAa,MAAM,IAAI,WAAW,KAAK,GAAG,GAAG,IAAI,IAAI,WAAW,GAAG;IAC/F,UAAU,QAAQ,MAAM,KAAK,IAAI,aAAa;IAC9C,KAAK,QAAQ,IAAI,YAAY,SAAS,EAAE,OAAO,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI;GACrE,SAAS,KAAK;IACZ,IAAK,KAA2B,SAAS,cAAc;IACvD,KAAK,SAAS,GAAG;GACnB,UAAU;IACR,QAAQ,QAAQ;GAClB;EACF;EAEA,YACQ,MAAM,YACN,KAAK,GACX,EAAE,WAAW,KAAK,CACpB;EAEA,sBAAsB;GACpB,YAAY,MAAM;GAClB,KAAK,QAAQ;EACf,CAAC;;GAzEC,OAAA,UAAA,GAAA,YAMW,MAAA,WAAA,GAAA;IAND,KAAI;IAAO,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,CAAA;;IAGzB,SAAA,cAAA;KAFK,UAAA,SAAA,UAAA,GAAX,mBAEM,OAAA;;MAFiB,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,YAAA,CAAA;KAAgB,GAAA,kBACrC,gBAAG,SAAS,QAAA,QAAQ,CAAA,GAAA,CAAA,KAAA,mBAAA,QAAA,IAAA;KAElC,mBAA6D,OAAA,EAAvD,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,UAAA,CAAA,EAAA,GAAc,CAAA,mBAAuB,QAAA,MAAA,gBAAd,KAAA,KAAI,GAAA,CAAA,CAAA,GAAA,CAAA;KAClC,QAAA,SAAA,UAAA,GAAX,mBAAwD,OAAA;;MAAnC,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,SAAA,CAAA;KAAa,GAAA,QAAI,CAAA,KAAA,mBAAA,QAAA,IAAA"}
1
+ {"version":3,"file":"text-previewer.js","names":[],"sources":["../../../../src/components/file-viewer/previewers/text-previewer.vue"],"sourcesContent":["<template>\n <u-scroll tag=\"div\" :class=\"cls.e('text')\">\n <div v-if=\"truncated\" :class=\"cls.e('sheet-note')\">\n ⚠ 文件过大,仅展示前 {{ formatKb(maxBytes) }}\n </div>\n <pre :class=\"cls.e('text-pre')\"><code>{{ text }}</code></pre>\n <div v-if=\"loading\" :class=\"cls.e('loading')\">加载中…</div>\n </u-scroll>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem } from '@veltra/utils'\nimport { onBeforeUnmount, ref, shallowRef, watch } from 'vue'\n\nimport type { FileViewerItem } from '../../../types/file-viewer'\nimport { UScroll } from '../../scroll'\n\ndefineOptions({ name: 'UFileViewerTextPreviewer' })\n\nconst props = withDefaults(\n defineProps<{\n file: FileViewerItem\n /** 单文件最大读取字节数(超出截断),默认 2MB */\n maxBytes?: number\n }>(),\n { maxBytes: 2 * 1024 * 1024 }\n)\n\nconst emit = defineEmits<{ (e: 'error', err: unknown): void }>()\n\nconst cls = bem('file-viewer')\n\nconst text = shallowRef('')\nconst truncated = ref(false)\nconst loading = ref(true)\n\nlet controller: AbortController | undefined\n\nfunction formatKb(bytes: number): string {\n if (bytes >= 1024 * 1024) return `${(bytes / 1024 / 1024).toFixed(1)} MB`\n return `${(bytes / 1024).toFixed(0)} KB`\n}\n\nasync function load() {\n controller?.abort()\n controller = new AbortController()\n loading.value = true\n truncated.value = false\n text.value = ''\n\n try {\n const { toArrayBuffer } = await import('../helper')\n const buf = await toArrayBuffer(props.file.src, controller.signal)\n const max = props.maxBytes\n const view = max > 0 && buf.byteLength > max ? new Uint8Array(buf, 0, max) : new Uint8Array(buf)\n truncated.value = max > 0 && buf.byteLength > max\n text.value = new TextDecoder('utf-8', { fatal: false }).decode(view)\n } catch (err) {\n if ((err as { name?: string })?.name === 'AbortError') return\n emit('error', err)\n } finally {\n loading.value = false\n }\n}\n\nwatch(\n () => props.file,\n () => load(),\n { immediate: true }\n)\n\nonBeforeUnmount(() => {\n controller?.abort()\n text.value = ''\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;EAmBA,MAAM,QAAQ;EASd,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,aAAa;EAE7B,MAAM,OAAO,WAAW,EAAE;EAC1B,MAAM,YAAY,IAAI,KAAK;EAC3B,MAAM,UAAU,IAAI,IAAI;EAExB,IAAI;EAEJ,SAAS,SAAS,OAAuB;GACvC,IAAI,SAAS,SAAa,OAAO,IAAI,QAAQ,OAAO,KAAA,CAAM,QAAQ,CAAC,EAAE;GACrE,OAAO,IAAI,QAAQ,KAAA,CAAM,QAAQ,CAAC,EAAE;EACtC;EAEA,eAAe,OAAO;GACpB,YAAY,MAAM;GAClB,aAAa,IAAI,gBAAgB;GACjC,QAAQ,QAAQ;GAChB,UAAU,QAAQ;GAClB,KAAK,QAAQ;GAEb,IAAI;IACF,MAAM,EAAE,kBAAkB,MAAM,OAAO;IACvC,MAAM,MAAM,MAAM,cAAc,MAAM,KAAK,KAAK,WAAW,MAAM;IACjE,MAAM,MAAM,MAAM;IAClB,MAAM,OAAO,MAAM,KAAK,IAAI,aAAa,MAAM,IAAI,WAAW,KAAK,GAAG,GAAG,IAAI,IAAI,WAAW,GAAG;IAC/F,UAAU,QAAQ,MAAM,KAAK,IAAI,aAAa;IAC9C,KAAK,QAAQ,IAAI,YAAY,SAAS,EAAE,OAAO,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI;GACrE,SAAS,KAAK;IACZ,IAAK,KAA2B,SAAS,cAAc;IACvD,KAAK,SAAS,GAAG;GACnB,UAAU;IACR,QAAQ,QAAQ;GAClB;EACF;EAEA,YACQ,MAAM,YACN,KAAK,GACX,EAAE,WAAW,KAAK,CACpB;EAEA,sBAAsB;GACpB,YAAY,MAAM;GAClB,KAAK,QAAQ;EACf,CAAC;;GAzEC,OAAA,UAAA,GAAA,YAMW,MAAA,WAAA,GAAA;IAND,KAAI;IAAO,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,CAAA;;IAC/B,SAAA,cAEM;KAFK,UAAA,SAAX,UAAA,GAAA,mBAEM,OAAA;;MAFiB,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,YAAA,CAAA;KAAgB,GAAA,kBACrC,gBAAG,SAAS,QAAA,QAAQ,CAAA,GAAA,CAAA,KAAA,mBAAA,QAAA,IAAA;KAElC,mBAA6D,OAAA,EAAvD,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,UAAA,CAAA,EAAA,GAAc,CAAA,mBAAuB,QAAA,MAAA,gBAAd,KAAA,KAAI,GAAA,CAAA,CAAA,GAAA,CAAA;KAClC,QAAA,SAAX,UAAA,GAAA,mBAAwD,OAAA;;MAAnC,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,SAAA,CAAA;KAAa,GAAA,QAAI,CAAA,KAAA,mBAAA,QAAA,IAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"video-previewer.js","names":[],"sources":["../../../../src/components/file-viewer/previewers/video-previewer.vue"],"sourcesContent":["<template>\n <div :class=\"cls.e('video')\">\n <video\n v-if=\"url\"\n ref=\"videoRef\"\n :src=\"url\"\n :type=\"file.mime\"\n controls\n preload=\"metadata\"\n playsinline\n @error=\"onVideoError\"\n />\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem } from '@veltra/utils'\nimport { onBeforeUnmount, shallowRef, useTemplateRef, watch } from 'vue'\n\nimport type { FileViewerItem } from '../../../types/file-viewer'\nimport { toBlobUrl } from '../helper'\n\ndefineOptions({ name: 'UFileViewerVideoPreviewer' })\n\nconst props = defineProps<{ file: FileViewerItem }>()\n\nconst emit = defineEmits<{ (e: 'error', err: unknown): void }>()\n\nconst cls = bem('file-viewer')\n\nconst url = shallowRef<string>('')\nconst videoRef = useTemplateRef<HTMLVideoElement>('videoRef')\n\nlet revoke: (() => void) | undefined\nlet unmounting = false\n\nfunction load() {\n revoke?.()\n const r = toBlobUrl(props.file.src, props.file.mime)\n url.value = r.url\n revoke = r.revoke\n}\n\nfunction onVideoError(e: Event) {\n if (unmounting) return\n const v = e.target as HTMLVideoElement | null\n if (!v?.src) return\n emit('error', e)\n}\n\nwatch(\n () => props.file,\n () => load(),\n { immediate: true }\n)\n\nonBeforeUnmount(() => {\n unmounting = true\n const v = videoRef.value\n if (v) {\n v.pause()\n v.removeAttribute('src')\n try {\n v.load()\n } catch {\n /* noop */\n }\n }\n revoke?.()\n url.value = ''\n})\n</script>\n"],"mappings":";;;;;;;;;;;EAwBA,MAAM,QAAQ;EAEd,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,aAAa;EAE7B,MAAM,MAAM,WAAmB,EAAE;EACjC,MAAM,WAAW,eAAiC,UAAU;EAE5D,IAAI;EACJ,IAAI,aAAa;EAEjB,SAAS,OAAO;GACd,SAAS;GACT,MAAM,IAAI,UAAU,MAAM,KAAK,KAAK,MAAM,KAAK,IAAI;GACnD,IAAI,QAAQ,EAAE;GACd,SAAS,EAAE;EACb;EAEA,SAAS,aAAa,GAAU;GAC9B,IAAI,YAAY;GAEhB,IAAI,CADM,EAAE,QACJ,KAAK;GACb,KAAK,SAAS,CAAC;EACjB;EAEA,YACQ,MAAM,YACN,KAAK,GACX,EAAE,WAAW,KAAK,CACpB;EAEA,sBAAsB;GACpB,aAAa;GACb,MAAM,IAAI,SAAS;GACnB,IAAI,GAAG;IACL,EAAE,MAAM;IACR,EAAE,gBAAgB,KAAK;IACvB,IAAI;KACF,EAAE,KAAK;IACT,QAAQ,CAER;GACF;GACA,SAAS;GACT,IAAI,QAAQ;EACd,CAAC;;GArEC,OAAA,UAAA,GAAA,mBAWM,OAAA,EAXA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA,EAAA,GAER,CAAA,IAAA,SAAA,UAAA,GADR,mBASE,SAAA;;IAPI,SAAA;IAAJ,KAAI;IACH,KAAK,IAAA;IACL,MAAM,QAAA,KAAK;IACZ,UAAA;IACA,SAAQ;IACR,aAAA;IACC,SAAO"}
1
+ {"version":3,"file":"video-previewer.js","names":[],"sources":["../../../../src/components/file-viewer/previewers/video-previewer.vue"],"sourcesContent":["<template>\n <div :class=\"cls.e('video')\">\n <video\n v-if=\"url\"\n ref=\"videoRef\"\n :src=\"url\"\n :type=\"file.mime\"\n controls\n preload=\"metadata\"\n playsinline\n @error=\"onVideoError\"\n />\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem } from '@veltra/utils'\nimport { onBeforeUnmount, shallowRef, useTemplateRef, watch } from 'vue'\n\nimport type { FileViewerItem } from '../../../types/file-viewer'\nimport { toBlobUrl } from '../helper'\n\ndefineOptions({ name: 'UFileViewerVideoPreviewer' })\n\nconst props = defineProps<{ file: FileViewerItem }>()\n\nconst emit = defineEmits<{ (e: 'error', err: unknown): void }>()\n\nconst cls = bem('file-viewer')\n\nconst url = shallowRef<string>('')\nconst videoRef = useTemplateRef<HTMLVideoElement>('videoRef')\n\nlet revoke: (() => void) | undefined\nlet unmounting = false\n\nfunction load() {\n revoke?.()\n const r = toBlobUrl(props.file.src, props.file.mime)\n url.value = r.url\n revoke = r.revoke\n}\n\nfunction onVideoError(e: Event) {\n if (unmounting) return\n const v = e.target as HTMLVideoElement | null\n if (!v?.src) return\n emit('error', e)\n}\n\nwatch(\n () => props.file,\n () => load(),\n { immediate: true }\n)\n\nonBeforeUnmount(() => {\n unmounting = true\n const v = videoRef.value\n if (v) {\n v.pause()\n v.removeAttribute('src')\n try {\n v.load()\n } catch {\n /* noop */\n }\n }\n revoke?.()\n url.value = ''\n})\n</script>\n"],"mappings":";;;;;;;;;;;EAwBA,MAAM,QAAQ;EAEd,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,aAAa;EAE7B,MAAM,MAAM,WAAmB,EAAE;EACjC,MAAM,WAAW,eAAiC,UAAU;EAE5D,IAAI;EACJ,IAAI,aAAa;EAEjB,SAAS,OAAO;GACd,SAAS;GACT,MAAM,IAAI,UAAU,MAAM,KAAK,KAAK,MAAM,KAAK,IAAI;GACnD,IAAI,QAAQ,EAAE;GACd,SAAS,EAAE;EACb;EAEA,SAAS,aAAa,GAAU;GAC9B,IAAI,YAAY;GAEhB,IAAI,CADM,EAAE,QACJ,KAAK;GACb,KAAK,SAAS,CAAC;EACjB;EAEA,YACQ,MAAM,YACN,KAAK,GACX,EAAE,WAAW,KAAK,CACpB;EAEA,sBAAsB;GACpB,aAAa;GACb,MAAM,IAAI,SAAS;GACnB,IAAI,GAAG;IACL,EAAE,MAAM;IACR,EAAE,gBAAgB,KAAK;IACvB,IAAI;KACF,EAAE,KAAK;IACT,QAAQ,CAER;GACF;GACA,SAAS;GACT,IAAI,QAAQ;EACd,CAAC;;GArEC,OAAA,UAAA,GAAA,mBAWM,OAAA,EAXA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA,EAAA,GAER,CAAA,IAAA,SADR,UAAA,GAAA,mBASE,SAAA;;IAPI,SAAA;IAAJ,KAAI;IACH,KAAK,IAAA;IACL,MAAM,QAAA,KAAK;IACZ,UAAA;IACA,SAAQ;IACR,aAAA;IACC,SAAO"}
@@ -575,7 +575,7 @@
575
575
  min-height: 100%;
576
576
  padding: clamp(22px, 3vw, 44px);
577
577
  }
578
- .u-file-viewer__docx-body :deep(.u-file-viewer__docx-doc) {
578
+ .u-file-viewer__docx-doc {
579
579
  margin: 0 auto;
580
580
  color: #222;
581
581
  background: #fff;
@@ -584,7 +584,7 @@
584
584
  .u-file-viewer.is-modal .u-file-viewer__docx-body {
585
585
  padding: clamp(24px, 4vw, 64px);
586
586
  }
587
- .u-file-viewer.is-modal .u-file-viewer__docx-body :deep(.u-file-viewer__docx-doc) {
587
+ .u-file-viewer.is-modal .u-file-viewer__docx-doc {
588
588
  box-shadow: 0 38px 110px rgba(0, 0, 0, 0.5), 0 0 0 1px rgba(255, 255, 255, 0.04);
589
589
  }
590
590
  .u-file-viewer__sheet {
@@ -1 +1 @@
1
- {"version":3,"file":"float-button.js","names":[],"sources":["../../../src/components/float-button/float-button.vue"],"sourcesContent":["<template>\n <Teleport to=\"body\">\n <div\n :class=\"cls.b\"\n @mouseenter=\"handleMouseEnter\"\n @mouseleave=\"handleMouseLeave\"\n ref=\"floatButtonRef\"\n >\n <u-button\n v-for=\"(item, index) of items\"\n :key=\"item.key\"\n :class=\"[cls.e('item'), bem.is('first', index === 0)]\"\n circle\n :size=\"size\"\n :type=\"item.type ?? 'primary'\"\n ref=\"itemsRef\"\n :style=\"{ transitionDelay: index * 0.1 + 's' }\"\n @transitionend=\"handleTransitionEnd(index, $event)\"\n @click=\"emit('click', item.key)\"\n :title=\"item.name ?? item.key\"\n >\n <u-icon v-if=\"item.icon\"> <component :is=\"item.icon\" /> </u-icon>\n <span v-else>{{ item.name?.[0] ?? item.key[0] }}</span>\n </u-button>\n </div>\n </Teleport>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem, removeStyles, setStyles } from '@veltra/utils'\nimport { shallowRef } from 'vue'\n\nimport type { FloatButtonProps, FloatButtonEmits, ButtonExposed } from '../../types'\nimport { UButton } from '../button'\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'UFloatButton' })\n\ndefineProps<FloatButtonProps>()\n\nconst emit = defineEmits<FloatButtonEmits>()\n\nconst cls = bem('float-button')\nconst hoveredCls = bem.is('hovered')\n\nconst floatButtonRef = shallowRef<HTMLElement>()\nconst itemsRef = shallowRef<ButtonExposed[]>()\n\nconst hovered = shallowRef(false)\n\nconst handleMouseEnter = () => {\n hovered.value = true\n\n itemsRef.value?.forEach((item) => {\n setStyles(item.el!, { display: 'flex' })\n })\n\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n itemsRef.value?.forEach((item) => {\n item.el!.classList.add(hoveredCls)\n })\n })\n })\n}\nconst handleMouseLeave = () => {\n hovered.value = false\n itemsRef.value?.forEach((item) => {\n item.el!.classList.remove(hoveredCls)\n })\n}\n\n/**\n * 动画结束回调\n * @param index 发生的元素索引\n * @param e 事件\n */\nconst handleTransitionEnd = (index: number, e: TransitionEvent) => {\n if (index !== 1 || hovered.value) return\n\n itemsRef.value?.forEach((item) => {\n removeStyles(item.el!, ['display'])\n })\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;EAwCA,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,cAAc;EAC9B,MAAM,aAAa,IAAI,GAAG,SAAS;EAEnC,MAAM,iBAAiB,WAAwB;EAC/C,MAAM,WAAW,WAA4B;EAE7C,MAAM,UAAU,WAAW,KAAK;EAEhC,MAAM,yBAAyB;GAC7B,QAAQ,QAAQ;GAEhB,SAAS,OAAO,SAAS,SAAS;IAChC,UAAU,KAAK,IAAK,EAAE,SAAS,OAAO,CAAC;GACzC,CAAC;GAED,4BAA4B;IAC1B,4BAA4B;KAC1B,SAAS,OAAO,SAAS,SAAS;MAChC,KAAK,GAAI,UAAU,IAAI,UAAU;KACnC,CAAC;IACH,CAAC;GACH,CAAC;EACH;EACA,MAAM,yBAAyB;GAC7B,QAAQ,QAAQ;GAChB,SAAS,OAAO,SAAS,SAAS;IAChC,KAAK,GAAI,UAAU,OAAO,UAAU;GACtC,CAAC;EACH;;;;;;EAOA,MAAM,uBAAuB,OAAe,MAAuB;GACjE,IAAI,UAAU,KAAK,QAAQ,OAAO;GAElC,SAAS,OAAO,SAAS,SAAS;IAChC,aAAa,KAAK,IAAK,CAAC,SAAS,CAAC;GACpC,CAAC;EACH;;GAlFE,OAAA,UAAA,GAAA,YAwBW,UAAA,EAxBD,IAAG,OAAM,GAAA,CACjB,mBAsBM,OAAA;IArBH,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,CAAC;IACZ,cAAY;IACZ,cAAY;IACT,SAAA;IAAJ,KAAI;GAEJ,GAAA,EAAA,UAAA,IAAA,GAAA,mBAeW,UAAA,MAAA,WAde,QAAA,QAAhB,MAAM,UAAK;IADrB,OAAA,UAAA,GAAA,YAeW,MAAA,WAAA,GAAA;KAbR,KAAK,KAAK;KACV,OAAK,eAAA,CAAG,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,GAAU,MAAA,GAAA,CAAG,CAAC,GAAE,SAAU,UAAK,CAAA,CAAA,CAAA;KAC7C,QAAA;KACC,MAAM,QAAA;KACN,MAAM,KAAK,QAAI;;KACZ,SAAA;KAAJ,KAAI;KACH,OAAK,eAAA,EAAA,iBAAqB,QAAK,KAAA,IAAA,CAAA;KAC/B,kBAAa,WAAE,oBAAoB,OAAO,MAAM;KAChD,UAAK,WAAE,KAAI,SAAU,KAAK,GAAG;KAC7B,OAAO,KAAK,QAAQ,KAAK;;KAEuC,SAAA,cAAA,CAAnD,KAAK,QAAA,UAAA,GAAnB,YAAiE,MAAA,WAAA,GAAA,EAAA,KAAA,EAAA,GAAA;MAAV,SAAA,cAAA,EAAA,UAAA,GAA7B,YAA6B,wBAAb,KAAK,IAAI,CAAA,EAAA,CAAA;;KACnD,GAAA,IAAA,MAAA,UAAA,GAAA,mBAAuD,QAAA,YAAA,gBAAvC,KAAK,OAAI,MAAS,KAAK,IAAG,EAAA,GAAA,CAAA,EAAA,CAAA"}
1
+ {"version":3,"file":"float-button.js","names":[],"sources":["../../../src/components/float-button/float-button.vue"],"sourcesContent":["<template>\n <Teleport to=\"body\">\n <div\n :class=\"cls.b\"\n @mouseenter=\"handleMouseEnter\"\n @mouseleave=\"handleMouseLeave\"\n ref=\"floatButtonRef\"\n >\n <u-button\n v-for=\"(item, index) of items\"\n :key=\"item.key\"\n :class=\"[cls.e('item'), bem.is('first', index === 0)]\"\n circle\n :size=\"size\"\n :type=\"item.type ?? 'primary'\"\n ref=\"itemsRef\"\n :style=\"{ transitionDelay: index * 0.1 + 's' }\"\n @transitionend=\"handleTransitionEnd(index, $event)\"\n @click=\"emit('click', item.key)\"\n :title=\"item.name ?? item.key\"\n >\n <u-icon v-if=\"item.icon\"> <component :is=\"item.icon\" /> </u-icon>\n <span v-else>{{ item.name?.[0] ?? item.key[0] }}</span>\n </u-button>\n </div>\n </Teleport>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem, removeStyles, setStyles } from '@veltra/utils'\nimport { shallowRef } from 'vue'\n\nimport type { FloatButtonProps, FloatButtonEmits, ButtonExposed } from '../../types'\nimport { UButton } from '../button'\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'UFloatButton' })\n\ndefineProps<FloatButtonProps>()\n\nconst emit = defineEmits<FloatButtonEmits>()\n\nconst cls = bem('float-button')\nconst hoveredCls = bem.is('hovered')\n\nconst floatButtonRef = shallowRef<HTMLElement>()\nconst itemsRef = shallowRef<ButtonExposed[]>()\n\nconst hovered = shallowRef(false)\n\nconst handleMouseEnter = () => {\n hovered.value = true\n\n itemsRef.value?.forEach((item) => {\n setStyles(item.el!, { display: 'flex' })\n })\n\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n itemsRef.value?.forEach((item) => {\n item.el!.classList.add(hoveredCls)\n })\n })\n })\n}\nconst handleMouseLeave = () => {\n hovered.value = false\n itemsRef.value?.forEach((item) => {\n item.el!.classList.remove(hoveredCls)\n })\n}\n\n/**\n * 动画结束回调\n * @param index 发生的元素索引\n * @param e 事件\n */\nconst handleTransitionEnd = (index: number, e: TransitionEvent) => {\n if (index !== 1 || hovered.value) return\n\n itemsRef.value?.forEach((item) => {\n removeStyles(item.el!, ['display'])\n })\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;EAwCA,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,cAAc;EAC9B,MAAM,aAAa,IAAI,GAAG,SAAS;EAEnC,MAAM,iBAAiB,WAAwB;EAC/C,MAAM,WAAW,WAA4B;EAE7C,MAAM,UAAU,WAAW,KAAK;EAEhC,MAAM,yBAAyB;GAC7B,QAAQ,QAAQ;GAEhB,SAAS,OAAO,SAAS,SAAS;IAChC,UAAU,KAAK,IAAK,EAAE,SAAS,OAAO,CAAC;GACzC,CAAC;GAED,4BAA4B;IAC1B,4BAA4B;KAC1B,SAAS,OAAO,SAAS,SAAS;MAChC,KAAK,GAAI,UAAU,IAAI,UAAU;KACnC,CAAC;IACH,CAAC;GACH,CAAC;EACH;EACA,MAAM,yBAAyB;GAC7B,QAAQ,QAAQ;GAChB,SAAS,OAAO,SAAS,SAAS;IAChC,KAAK,GAAI,UAAU,OAAO,UAAU;GACtC,CAAC;EACH;;;;;;EAOA,MAAM,uBAAuB,OAAe,MAAuB;GACjE,IAAI,UAAU,KAAK,QAAQ,OAAO;GAElC,SAAS,OAAO,SAAS,SAAS;IAChC,aAAa,KAAK,IAAK,CAAC,SAAS,CAAC;GACpC,CAAC;EACH;;GAlFE,OAAA,UAAA,GAAA,YAwBW,UAAA,EAxBD,IAAG,OAAM,GAAA,CACjB,mBAsBM,OAAA;IArBH,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,CAAC;IACZ,cAAY;IACZ,cAAY;IACT,SAAA;IAAJ,KAAI;GAEJ,GAAA,EAAA,UAAA,IAAA,GAAA,mBAeW,UAAA,MAAA,WAde,QAAA,QAAhB,MAAM,UAAK;IADrB,OAAA,UAAA,GAAA,YAeW,MAAA,WAAA,GAAA;KAbR,KAAK,KAAK;KACV,OAAK,eAAA,CAAG,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,GAAU,MAAA,GAAA,CAAG,CAAC,GAAE,SAAU,UAAK,CAAA,CAAA,CAAA;KAC7C,QAAA;KACC,MAAM,QAAA;KACN,MAAM,KAAK,QAAI;;KACZ,SAAA;KAAJ,KAAI;KACH,OAAK,eAAA,EAAA,iBAAqB,QAAK,KAAA,IAAA,CAAA;KAC/B,kBAAa,WAAE,oBAAoB,OAAO,MAAM;KAChD,UAAK,WAAE,KAAI,SAAU,KAAK,GAAG;KAC7B,OAAO,KAAK,QAAQ,KAAK;;KAE1B,SAAA,cAAiE,CAAnD,KAAK,QAAnB,UAAA,GAAA,YAAiE,MAAA,WAAA,GAAA,EAAA,KAAA,EAAA,GAAA;MAAvC,SAAA,cAA6B,EAA7B,UAAA,GAAA,YAA6B,wBAAb,KAAK,IAAI,CAAA,EAAA,CAAA;;KACnD,GAAA,IAAA,MAAA,UAAA,GAAA,mBAAuD,QAAA,YAAA,gBAAvC,KAAK,OAAI,MAAS,KAAK,IAAG,EAAA,GAAA,CAAA,EAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"grid-item.js","names":[],"sources":["../../../src/components/grid/grid-item.vue"],"sourcesContent":["<template>\n <component :is=\"tag\" :style=\"style\" :class=\"cls.b\" v-if=\"span !== 0\">\n <slot />\n </component>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem } from '@veltra/utils'\nimport { computed, inject, type CSSProperties, watch } from 'vue'\n\nimport type { GridItemProps } from '../../types'\nimport { GridDIKey } from './di'\n\ndefineOptions({ name: 'UGridItem' })\n\nconst props = withDefaults(defineProps<GridItemProps>(), { tag: 'div' })\n\nconst cls = bem('grid-item')\n\nconst { currentBreakpoint, gridItemsProps } = inject(GridDIKey) ?? {}\n\nif (!currentBreakpoint) {\n console.error('GridItem组件仅能在Grid组件中使用')\n}\n\nconst span = computed<number | 'full'>(() => {\n let { span } = props\n if (span === undefined) return 1\n if (span === 'full') return 'full'\n\n if (typeof span === 'number') return span\n\n const breakpoint = currentBreakpoint?.value\n\n if (!breakpoint) return span.default\n return span[breakpoint.name] ?? span.default\n})\n\nconst style = computed<CSSProperties>(() => {\n return { gridColumn: span.value === 'full' ? '1 / -1' : `span ${span.value}` }\n})\n\nwatch(\n () => props.span,\n (span) => {\n if (typeof span === 'object') {\n gridItemsProps?.add(props)\n } else {\n gridItemsProps?.delete(props)\n }\n },\n { immediate: true }\n)\n</script>\n"],"mappings":";;;;;;;;;;;;EAeA,MAAM,QAAQ;EAEd,MAAM,MAAM,IAAI,WAAW;EAE3B,MAAM,EAAE,mBAAmB,mBAAmB,OAAO,SAAS,KAAK,CAAC;EAEpE,IAAI,CAAC,mBACH,QAAQ,MAAM,wBAAwB;EAGxC,MAAM,OAAO,eAAgC;GAC3C,IAAI,EAAE,SAAS;GACf,IAAI,SAAS,KAAA,GAAW,OAAO;GAC/B,IAAI,SAAS,QAAQ,OAAO;GAE5B,IAAI,OAAO,SAAS,UAAU,OAAO;GAErC,MAAM,aAAa,mBAAmB;GAEtC,IAAI,CAAC,YAAY,OAAO,KAAK;GAC7B,OAAO,KAAK,WAAW,SAAS,KAAK;EACvC,CAAC;EAED,MAAM,QAAQ,eAA8B;GAC1C,OAAO,EAAE,YAAY,KAAK,UAAU,SAAS,WAAW,QAAQ,KAAK,QAAQ;EAC/E,CAAC;EAED,YACQ,MAAM,OACX,SAAS;GACR,IAAI,OAAO,SAAS,UAClB,gBAAgB,IAAI,KAAK;QAEzB,gBAAgB,OAAO,KAAK;EAEhC,GACA,EAAE,WAAW,KAAK,CACpB;;GAnD2D,OAAA,KAAA,UAAI,KAAA,UAAA,GAA7D,YAEY,wBAFI,QAAA,GAAG,GAAA;;IAAG,OAAK,eAAE,MAAA,KAAK;IAAG,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,CAAC;;IACvC,SAAA,cAAA,CAAR,WAAQ,KAAA,QAAA,SAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"grid-item.js","names":[],"sources":["../../../src/components/grid/grid-item.vue"],"sourcesContent":["<template>\n <component :is=\"tag\" :style=\"style\" :class=\"cls.b\" v-if=\"span !== 0\">\n <slot />\n </component>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem } from '@veltra/utils'\nimport { computed, inject, type CSSProperties, watch } from 'vue'\n\nimport type { GridItemProps } from '../../types'\nimport { GridDIKey } from './di'\n\ndefineOptions({ name: 'UGridItem' })\n\nconst props = withDefaults(defineProps<GridItemProps>(), { tag: 'div' })\n\nconst cls = bem('grid-item')\n\nconst { currentBreakpoint, gridItemsProps } = inject(GridDIKey) ?? {}\n\nif (!currentBreakpoint) {\n console.error('GridItem组件仅能在Grid组件中使用')\n}\n\nconst span = computed<number | 'full'>(() => {\n let { span } = props\n if (span === undefined) return 1\n if (span === 'full') return 'full'\n\n if (typeof span === 'number') return span\n\n const breakpoint = currentBreakpoint?.value\n\n if (!breakpoint) return span.default\n return span[breakpoint.name] ?? span.default\n})\n\nconst style = computed<CSSProperties>(() => {\n return { gridColumn: span.value === 'full' ? '1 / -1' : `span ${span.value}` }\n})\n\nwatch(\n () => props.span,\n (span) => {\n if (typeof span === 'object') {\n gridItemsProps?.add(props)\n } else {\n gridItemsProps?.delete(props)\n }\n },\n { immediate: true }\n)\n</script>\n"],"mappings":";;;;;;;;;;;;EAeA,MAAM,QAAQ;EAEd,MAAM,MAAM,IAAI,WAAW;EAE3B,MAAM,EAAE,mBAAmB,mBAAmB,OAAO,SAAS,KAAK,CAAC;EAEpE,IAAI,CAAC,mBACH,QAAQ,MAAM,wBAAwB;EAGxC,MAAM,OAAO,eAAgC;GAC3C,IAAI,EAAE,SAAS;GACf,IAAI,SAAS,KAAA,GAAW,OAAO;GAC/B,IAAI,SAAS,QAAQ,OAAO;GAE5B,IAAI,OAAO,SAAS,UAAU,OAAO;GAErC,MAAM,aAAa,mBAAmB;GAEtC,IAAI,CAAC,YAAY,OAAO,KAAK;GAC7B,OAAO,KAAK,WAAW,SAAS,KAAK;EACvC,CAAC;EAED,MAAM,QAAQ,eAA8B;GAC1C,OAAO,EAAE,YAAY,KAAK,UAAU,SAAS,WAAW,QAAQ,KAAK,QAAQ;EAC/E,CAAC;EAED,YACQ,MAAM,OACX,SAAS;GACR,IAAI,OAAO,SAAS,UAClB,gBAAgB,IAAI,KAAK;QAEzB,gBAAgB,OAAO,KAAK;EAEhC,GACA,EAAE,WAAW,KAAK,CACpB;;GAnD2D,OAAA,KAAA,UAAI,KAA7D,UAAA,GAAA,YAEY,wBAFI,QAAA,GAAG,GAAA;;IAAG,OAAK,eAAE,MAAA,KAAK;IAAG,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,CAAC;;IAC/C,SAAA,cAAQ,CAAR,WAAQ,KAAA,QAAA,SAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"grid.js","names":[],"sources":["../../../src/components/grid/grid.vue"],"sourcesContent":["<template>\n <component :is=\"tag\" :class=\"cls.b\" ref=\"grid\">\n <slot />\n </component>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem, removeStyles, setStyles, withUnit } from '@veltra/utils'\nimport { type CSSProperties, provide, watch, useTemplateRef, computed } from 'vue'\n\nimport type { GridProps, GridEmits, _GridExposed } from '../../types'\nimport { getBreakpointCols } from './breakpoint'\nimport { GridDIKey } from './di'\nimport { useResponsive } from './use-responsive'\n\ndefineOptions({ name: 'UGrid' })\n\nconst props = withDefaults(defineProps<GridProps>(), { tag: 'div' })\n\nconst emit = defineEmits<GridEmits>()\n\nconst cls = bem('grid')\n\nconst gridRef = useTemplateRef<HTMLElement>('grid')\n\nconst { currentBreakpoint, gridItemsProps } = useResponsive({ props, emit, gridRef })\n\nconst styles = computed(() => {\n const { gap, cols } = props\n const result: CSSProperties = {}\n\n // 间距\n if (typeof gap === 'number') {\n if (gap > 0) {\n result.rowGap = result.columnGap = gap + 'px'\n }\n } else if (typeof gap === 'string') {\n const [rowGap, columnGap] = gap.split(' ')\n result.columnGap = withUnit(columnGap || rowGap, 'px')\n result.rowGap = withUnit(rowGap, 'px')\n }\n\n const breakpoint = currentBreakpoint.value\n\n switch (typeof cols) {\n case 'number':\n result.gridTemplateColumns = `repeat(${cols}, minmax(0px, 1fr))`\n break\n case 'function':\n if (breakpoint) {\n result.gridTemplateColumns = `repeat(${cols(breakpoint)}, minmax(0px, 1fr))`\n }\n break\n case 'object':\n if (breakpoint) {\n const amount = getBreakpointCols(cols, breakpoint)\n result.gridTemplateColumns = `repeat(${amount}, minmax(0px, 1fr))`\n }\n }\n\n return result\n})\n\nwatch([styles, gridRef], ([styles, dom]) => {\n if (!dom) return\n\n // 重置并移除样式\n removeStyles(dom, ['gridTemplateColumns', 'columnGap', 'rowGap'])\n setStyles(dom, styles)\n})\n\nprovide(GridDIKey, { currentBreakpoint, gridItemsProps })\n\ndefineExpose<_GridExposed>({ el: gridRef })\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;EAiBA,MAAM,QAAQ;EAEd,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,MAAM;EAEtB,MAAM,UAAU,eAA4B,MAAM;EAElD,MAAM,EAAE,mBAAmB,mBAAmB,cAAc;GAAE;GAAO;GAAM;EAAQ,CAAC;EAEpF,MAAM,SAAS,eAAe;GAC5B,MAAM,EAAE,KAAK,SAAS;GACtB,MAAM,SAAwB,CAAC;GAG/B,IAAI,OAAO,QAAQ,UACb;QAAA,MAAM,GACR,OAAO,SAAS,OAAO,YAAY,MAAM;GAAA,OAEtC,IAAI,OAAO,QAAQ,UAAU;IAClC,MAAM,CAAC,QAAQ,aAAa,IAAI,MAAM,GAAG;IACzC,OAAO,YAAY,SAAS,aAAa,QAAQ,IAAI;IACrD,OAAO,SAAS,SAAS,QAAQ,IAAI;GACvC;GAEA,MAAM,aAAa,kBAAkB;GAErC,QAAQ,OAAO,MAAf;IACE,KAAK;KACH,OAAO,sBAAsB,UAAU,KAAK;KAC5C;IACF,KAAK;KACH,IAAI,YACF,OAAO,sBAAsB,UAAU,KAAK,UAAU,EAAE;KAE1D;IACF,KAAK,UACH,IAAI,YAEF,OAAO,sBAAsB,UADd,kBAAkB,MAAM,UACA,EAAO;GAEpD;GAEA,OAAO;EACT,CAAC;EAED,MAAM,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,SAAS;GAC1C,IAAI,CAAC,KAAK;GAGV,aAAa,KAAK;IAAC;IAAuB;IAAa;GAAQ,CAAC;GAChE,UAAU,KAAK,MAAM;EACvB,CAAC;EAED,QAAQ,WAAW;GAAE;GAAmB;EAAe,CAAC;EAExD,SAA2B,EAAE,IAAI,QAAQ,CAAC;;GAxExC,OAAA,UAAA,GAAA,YAEY,wBAFI,QAAA,GAAG,GAAA;IAAG,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,CAAC;IAAE,KAAI;;IAC9B,SAAA,cAAA,CAAR,WAAQ,KAAA,QAAA,SAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"grid.js","names":[],"sources":["../../../src/components/grid/grid.vue"],"sourcesContent":["<template>\n <component :is=\"tag\" :class=\"cls.b\" ref=\"grid\">\n <slot />\n </component>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem, removeStyles, setStyles, withUnit } from '@veltra/utils'\nimport { type CSSProperties, provide, watch, useTemplateRef, computed } from 'vue'\n\nimport type { GridProps, GridEmits, _GridExposed } from '../../types'\nimport { getBreakpointCols } from './breakpoint'\nimport { GridDIKey } from './di'\nimport { useResponsive } from './use-responsive'\n\ndefineOptions({ name: 'UGrid' })\n\nconst props = withDefaults(defineProps<GridProps>(), { tag: 'div' })\n\nconst emit = defineEmits<GridEmits>()\n\nconst cls = bem('grid')\n\nconst gridRef = useTemplateRef<HTMLElement>('grid')\n\nconst { currentBreakpoint, gridItemsProps } = useResponsive({ props, emit, gridRef })\n\nconst styles = computed(() => {\n const { gap, cols } = props\n const result: CSSProperties = {}\n\n // 间距\n if (typeof gap === 'number') {\n if (gap > 0) {\n result.rowGap = result.columnGap = gap + 'px'\n }\n } else if (typeof gap === 'string') {\n const [rowGap, columnGap] = gap.split(' ')\n result.columnGap = withUnit(columnGap || rowGap, 'px')\n result.rowGap = withUnit(rowGap, 'px')\n }\n\n const breakpoint = currentBreakpoint.value\n\n switch (typeof cols) {\n case 'number':\n result.gridTemplateColumns = `repeat(${cols}, minmax(0px, 1fr))`\n break\n case 'function':\n if (breakpoint) {\n result.gridTemplateColumns = `repeat(${cols(breakpoint)}, minmax(0px, 1fr))`\n }\n break\n case 'object':\n if (breakpoint) {\n const amount = getBreakpointCols(cols, breakpoint)\n result.gridTemplateColumns = `repeat(${amount}, minmax(0px, 1fr))`\n }\n }\n\n return result\n})\n\nwatch([styles, gridRef], ([styles, dom]) => {\n if (!dom) return\n\n // 重置并移除样式\n removeStyles(dom, ['gridTemplateColumns', 'columnGap', 'rowGap'])\n setStyles(dom, styles)\n})\n\nprovide(GridDIKey, { currentBreakpoint, gridItemsProps })\n\ndefineExpose<_GridExposed>({ el: gridRef })\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;EAiBA,MAAM,QAAQ;EAEd,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,MAAM;EAEtB,MAAM,UAAU,eAA4B,MAAM;EAElD,MAAM,EAAE,mBAAmB,mBAAmB,cAAc;GAAE;GAAO;GAAM;EAAQ,CAAC;EAEpF,MAAM,SAAS,eAAe;GAC5B,MAAM,EAAE,KAAK,SAAS;GACtB,MAAM,SAAwB,CAAC;GAG/B,IAAI,OAAO,QAAQ,UACb;QAAA,MAAM,GACR,OAAO,SAAS,OAAO,YAAY,MAAM;GAAA,OAEtC,IAAI,OAAO,QAAQ,UAAU;IAClC,MAAM,CAAC,QAAQ,aAAa,IAAI,MAAM,GAAG;IACzC,OAAO,YAAY,SAAS,aAAa,QAAQ,IAAI;IACrD,OAAO,SAAS,SAAS,QAAQ,IAAI;GACvC;GAEA,MAAM,aAAa,kBAAkB;GAErC,QAAQ,OAAO,MAAf;IACE,KAAK;KACH,OAAO,sBAAsB,UAAU,KAAK;KAC5C;IACF,KAAK;KACH,IAAI,YACF,OAAO,sBAAsB,UAAU,KAAK,UAAU,EAAE;KAE1D;IACF,KAAK,UACH,IAAI,YAEF,OAAO,sBAAsB,UADd,kBAAkB,MAAM,UACA,EAAO;GAEpD;GAEA,OAAO;EACT,CAAC;EAED,MAAM,CAAC,QAAQ,OAAO,IAAI,CAAC,QAAQ,SAAS;GAC1C,IAAI,CAAC,KAAK;GAGV,aAAa,KAAK;IAAC;IAAuB;IAAa;GAAQ,CAAC;GAChE,UAAU,KAAK,MAAM;EACvB,CAAC;EAED,QAAQ,WAAW;GAAE;GAAmB;EAAe,CAAC;EAExD,SAA2B,EAAE,IAAI,QAAQ,CAAC;;GAxExC,OAAA,UAAA,GAAA,YAEY,wBAFI,QAAA,GAAG,GAAA;IAAG,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,CAAC;IAAE,KAAI;;IACtC,SAAA,cAAQ,CAAR,WAAQ,KAAA,QAAA,SAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"grid-input.js","names":[],"sources":["../../../src/components/grid-input/grid-input.vue"],"sourcesContent":["<template>\n <ul :class=\"[cls.b, cls.m(size)]\">\n <li\n v-for=\"(_, index) in length\"\n :key=\"index\"\n tabindex=\"0\"\n @keydown=\"onKeydown($event, valueArray[index]!, index)\"\n @focus=\"focus(index)\"\n @blur=\"index === position && (blur = true)\"\n ref=\"items\"\n :class=\"[cls.e('item'), bem.is('focus', index === position && !blur)]\"\n >\n <span :class=\"cls.em('item', 'text')\" v-if=\"index < valueArray.length\">\n {{ valueArray[index] }}\n </span>\n\n <span :class=\"cls.em('item', 'cursor')\" v-else-if=\"index === position\"></span>\n </li>\n </ul>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem } from '@veltra/utils'\nimport { computed, ref, getCurrentInstance, watch } from 'vue'\n\nimport type { GridInputProps, GridInputEmits, GridInputExposed } from '../../types'\n\ndefineOptions({ name: 'UGridInput' })\n\nconst emit = defineEmits<GridInputEmits>()\n\nconst props = withDefaults(defineProps<GridInputProps>(), {\n length: 6,\n zero: false,\n separator: '-'\n})\n\nconst { size } = useFallbackProps([props], { size: 'default' })\n\nconst cls = bem('grid-input')\n\nconst numberReg = computed(() => (props.zero ? /^[0-9]$/ : /^[1-9]$/))\n\nconst valueArray = ref<string[]>([])\n\nconst position = ref<number>(-1)\n\nconst blur = ref<boolean>(false)\n\nconst instance = getCurrentInstance()\n\n/** 将格子数组拼成对外 modelValue */\nconst joinValue = (cells: string[]) => cells.join(props.separator)\n\n/** 按分隔符解析 modelValue 为格子内容 */\nconst parseValue = (value?: string): string[] => {\n if (!value) return []\n const sep = props.separator\n const parts = sep === '' ? Array.from(value) : value.split(sep)\n return parts.filter((part) => part !== '').slice(0, props.length)\n}\n\n// 外部 modelValue / 分隔符变化时回填格子(支持初始值与回显)\nwatch(\n () => [props.modelValue, props.separator, props.length] as const,\n () => {\n const next = parseValue(props.modelValue)\n if (joinValue(next) === joinValue(valueArray.value)) return\n valueArray.value = next\n },\n { immediate: true }\n)\n\nconst emitValue = () => {\n const value = joinValue(valueArray.value)\n emit('input', value)\n emit('update:modelValue', value)\n}\n\nconst focus = async (index?: number) => {\n if (index === undefined) {\n focus(position.value)\n return\n }\n if (index !== 0 && index > valueArray.value.length) {\n index = valueArray.value.length\n }\n position.value = index\n const items = (instance?.refs as { items?: unknown })?.items as any\n let dom = items?.[index]\n dom?.focus()\n blur.value = false\n}\n\nconst changeValue = (value: string, index: number) => {\n if (position.value === props.length) return\n\n if (index < valueArray.value.length) {\n valueArray.value.splice(index, 1, value)\n } else if (index === valueArray.value.length) {\n valueArray.value.push(value)\n } else {\n return\n }\n position.value++\n focus()\n\n emitValue()\n}\n\nconst baseOperation: Record<string, (value: string, index: number) => void> = {\n Backspace: (_value: string, index: number) => {\n if (index < valueArray.value.length) {\n valueArray.value.splice(index, 1)\n } else if (index - 1 >= 0) {\n valueArray.value.splice(index - 1, 1)\n }\n if (index !== 0) {\n focus(index - 1)\n }\n emitValue()\n },\n ArrowLeft: (_value: string, index: number) => {\n if (index === 0) return\n focus(index - 1)\n },\n ArrowRight: (_value: string, index: number) => {\n if (index === valueArray.value.length) return\n focus(index + 1)\n }\n}\n\nconst onKeydown = (e: KeyboardEvent, value: string, index: number) => {\n if (numberReg.value.test(e.key)) {\n changeValue(e.key, index)\n return\n }\n baseOperation[e.key]?.(value, index)\n}\n\nconst clear = () => {\n valueArray.value = []\n position.value = -1\n}\n\ndefineExpose<GridInputExposed>({ clear })\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"grid-input.js","names":[],"sources":["../../../src/components/grid-input/grid-input.vue"],"sourcesContent":["<template>\n <ul :class=\"[cls.b, cls.m(size)]\">\n <li\n v-for=\"(_, index) in length\"\n :key=\"index\"\n tabindex=\"0\"\n @keydown=\"onKeydown($event, valueArray[index]!, index)\"\n @focus=\"focus(index)\"\n @blur=\"index === position && (blur = true)\"\n ref=\"items\"\n :class=\"[cls.e('item'), bem.is('focus', index === position && !blur)]\"\n >\n <span :class=\"cls.em('item', 'text')\" v-if=\"index < valueArray.length\">\n {{ valueArray[index] }}\n </span>\n\n <span :class=\"cls.em('item', 'cursor')\" v-else-if=\"index === position\"></span>\n </li>\n </ul>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem } from '@veltra/utils'\nimport { computed, ref, getCurrentInstance, watch } from 'vue'\n\nimport type { GridInputProps, GridInputEmits, GridInputExposed } from '../../types'\n\ndefineOptions({ name: 'UGridInput' })\n\nconst emit = defineEmits<GridInputEmits>()\n\nconst props = withDefaults(defineProps<GridInputProps>(), {\n length: 6,\n zero: false,\n separator: '-'\n})\n\nconst { size } = useFallbackProps([props], { size: 'default' })\n\nconst cls = bem('grid-input')\n\nconst numberReg = computed(() => (props.zero ? /^[0-9]$/ : /^[1-9]$/))\n\nconst valueArray = ref<string[]>([])\n\nconst position = ref<number>(-1)\n\nconst blur = ref<boolean>(false)\n\nconst instance = getCurrentInstance()\n\n/** 将格子数组拼成对外 modelValue */\nconst joinValue = (cells: string[]) => cells.join(props.separator)\n\n/** 按分隔符解析 modelValue 为格子内容 */\nconst parseValue = (value?: string): string[] => {\n if (!value) return []\n const sep = props.separator\n const parts = sep === '' ? Array.from(value) : value.split(sep)\n return parts.filter((part) => part !== '').slice(0, props.length)\n}\n\n// 外部 modelValue / 分隔符变化时回填格子(支持初始值与回显)\nwatch(\n () => [props.modelValue, props.separator, props.length] as const,\n () => {\n const next = parseValue(props.modelValue)\n if (joinValue(next) === joinValue(valueArray.value)) return\n valueArray.value = next\n },\n { immediate: true }\n)\n\nconst emitValue = () => {\n const value = joinValue(valueArray.value)\n emit('input', value)\n emit('update:modelValue', value)\n}\n\nconst focus = async (index?: number) => {\n if (index === undefined) {\n focus(position.value)\n return\n }\n if (index !== 0 && index > valueArray.value.length) {\n index = valueArray.value.length\n }\n position.value = index\n const items = (instance?.refs as { items?: unknown })?.items as any\n let dom = items?.[index]\n dom?.focus()\n blur.value = false\n}\n\nconst changeValue = (value: string, index: number) => {\n if (position.value === props.length) return\n\n if (index < valueArray.value.length) {\n valueArray.value.splice(index, 1, value)\n } else if (index === valueArray.value.length) {\n valueArray.value.push(value)\n } else {\n return\n }\n position.value++\n focus()\n\n emitValue()\n}\n\nconst baseOperation: Record<string, (value: string, index: number) => void> = {\n Backspace: (_value: string, index: number) => {\n if (index < valueArray.value.length) {\n valueArray.value.splice(index, 1)\n } else if (index - 1 >= 0) {\n valueArray.value.splice(index - 1, 1)\n }\n if (index !== 0) {\n focus(index - 1)\n }\n emitValue()\n },\n ArrowLeft: (_value: string, index: number) => {\n if (index === 0) return\n focus(index - 1)\n },\n ArrowRight: (_value: string, index: number) => {\n if (index === valueArray.value.length) return\n focus(index + 1)\n }\n}\n\nconst onKeydown = (e: KeyboardEvent, value: string, index: number) => {\n if (numberReg.value.test(e.key)) {\n changeValue(e.key, index)\n return\n }\n baseOperation[e.key]?.(value, index)\n}\n\nconst clear = () => {\n valueArray.value = []\n position.value = -1\n}\n\ndefineExpose<GridInputExposed>({ clear })\n</script>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"group-input.js","names":["$attrs"],"sources":["../../../src/components/group-input/group-input.vue"],"sourcesContent":["<template>\n <ul v-if=\"!readonly\" v-bind=\"$attrs\" :class=\"[cls.b, cls.m(size)]\">\n <li v-if=\"isEmpty && creatable\">\n <u-button style=\"width: 100%\" :icon=\"Plus\" @click=\"handleAdd(0)\" :size=\"size\">\n 新增\n </u-button>\n </li>\n <li v-for=\"(item, index) of items\" :key=\"item.id\" :class=\"cls.e('item')\" :style=\"itemStyle\">\n <slot v-bind=\"{ item: item.data, index }\" />\n <span :class=\"cls.e('actions')\">\n <u-button\n :icon=\"Minus\"\n circle\n :disabled=\"disabled\"\n :size=\"size\"\n @click=\"handleRemove(index)\"\n />\n <u-button\n :icon=\"Plus\"\n circle\n :disabled=\"disabled\"\n :size=\"size\"\n type=\"primary\"\n @click=\"handleAdd(index)\"\n />\n </span>\n </li>\n </ul>\n\n <template v-else-if=\"items?.length\">\n <ul :class=\"[cls.b, cls.m(size)]\">\n <li v-for=\"item of items\" :key=\"item.id\" :class=\"cls.e('item')\">\n <span v-for=\"v in item.data\">{{ v }}</span>\n </li>\n </ul>\n </template>\n\n <template v-else>\n {{ FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup generic=\"GroupItem extends Record<string, any>\">\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { Minus, Plus } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { GroupInputEmits, GroupInputProps } from '../../types'\nimport { UButton } from '../button'\nimport { useGroupItems } from './use-group-items'\n\ndefineOptions({ name: 'UGroupInput', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<GroupInputProps<GroupItem>>(), {\n modelValue: () => [],\n disabled: undefined,\n readonly: undefined,\n creatable: true\n})\n\nconst emit = defineEmits<GroupInputEmits>()\n\nconst cls = bem('group-input')\n\nconst { formProps } = injectFormContext()\nconst { disabled, size, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst { items, createItem, runByEvent } = useGroupItems({ props, emit })\n\nconst isEmpty = computed(() => {\n return !items.value.length\n})\n\nfunction handleAdd(index: number) {\n runByEvent(() => {\n items.value = [\n ...items.value.slice(0, index + 1),\n createItem({}),\n ...items.value.slice(index + 1)\n ]\n })\n}\n\nfunction handleRemove(index: number) {\n runByEvent(() => {\n items.value = [...items.value.slice(0, index), ...items.value.slice(index + 1)]\n })\n}\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"group-input.js","names":["$attrs"],"sources":["../../../src/components/group-input/group-input.vue"],"sourcesContent":["<template>\n <ul v-if=\"!readonly\" v-bind=\"$attrs\" :class=\"[cls.b, cls.m(size)]\">\n <li v-if=\"isEmpty && creatable\">\n <u-button style=\"width: 100%\" :icon=\"Plus\" @click=\"handleAdd(0)\" :size=\"size\">\n 新增\n </u-button>\n </li>\n <li v-for=\"(item, index) of items\" :key=\"item.id\" :class=\"cls.e('item')\" :style=\"itemStyle\">\n <slot v-bind=\"{ item: item.data, index }\" />\n <span :class=\"cls.e('actions')\">\n <u-button\n :icon=\"Minus\"\n circle\n :disabled=\"disabled\"\n :size=\"size\"\n @click=\"handleRemove(index)\"\n />\n <u-button\n :icon=\"Plus\"\n circle\n :disabled=\"disabled\"\n :size=\"size\"\n type=\"primary\"\n @click=\"handleAdd(index)\"\n />\n </span>\n </li>\n </ul>\n\n <template v-else-if=\"items?.length\">\n <ul :class=\"[cls.b, cls.m(size)]\">\n <li v-for=\"item of items\" :key=\"item.id\" :class=\"cls.e('item')\">\n <span v-for=\"v in item.data\">{{ v }}</span>\n </li>\n </ul>\n </template>\n\n <template v-else>\n {{ FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup generic=\"GroupItem extends Record<string, any>\">\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { Minus, Plus } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { GroupInputEmits, GroupInputProps } from '../../types'\nimport { UButton } from '../button'\nimport { useGroupItems } from './use-group-items'\n\ndefineOptions({ name: 'UGroupInput', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<GroupInputProps<GroupItem>>(), {\n modelValue: () => [],\n disabled: undefined,\n readonly: undefined,\n creatable: true\n})\n\nconst emit = defineEmits<GroupInputEmits>()\n\nconst cls = bem('group-input')\n\nconst { formProps } = injectFormContext()\nconst { disabled, size, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst { items, createItem, runByEvent } = useGroupItems({ props, emit })\n\nconst isEmpty = computed(() => {\n return !items.value.length\n})\n\nfunction handleAdd(index: number) {\n runByEvent(() => {\n items.value = [\n ...items.value.slice(0, index + 1),\n createItem({}),\n ...items.value.slice(index + 1)\n ]\n })\n}\n\nfunction handleRemove(index: number) {\n runByEvent(() => {\n items.value = [...items.value.slice(0, index), ...items.value.slice(index + 1)]\n })\n}\n</script>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"group-nav-item.js","names":[],"sources":["../../../src/components/group-nav/group-nav-item.vue"],"sourcesContent":["<template>\n <li\n :class=\"[cls.e('item'), bem.is('active', active), bem.is('disabled', item.disabled ?? false)]\"\n @click=\"handleClick\"\n >\n <NavIcon v-if=\"item.icon\" :icon=\"item.icon\" :class=\"cls.e('icon')\" />\n\n <span :class=\"cls.e('item-title')\">\n {{ item.title }}\n </span>\n </li>\n</template>\n\n<script setup lang=\"ts\">\nimport { bem } from '@veltra/utils'\n\nimport type { NavItem } from '../../types/nav'\nimport NavIcon from '../nav/nav-icon.vue'\n\ndefineOptions({ name: 'UGroupNavItem' })\n\nconst props = defineProps<{ item: NavItem; active: boolean }>()\n\nconst emit = defineEmits<{ (e: 'click', item: NavItem): void }>()\n\nconst cls = bem('group-nav')\n\nfunction handleClick() {\n if (props.item.disabled) return\n emit('click', props.item)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;EAqBA,MAAM,QAAQ;EAEd,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,WAAW;EAE3B,SAAS,cAAc;GACrB,IAAI,MAAM,KAAK,UAAU;GACzB,KAAK,SAAS,MAAM,IAAI;EAC1B;;GA7BE,OAAA,UAAA,GAAA,mBASK,MAAA;IARF,OAAK,eAAA;KAAG,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA;KAAU,MAAA,GAAA,CAAG,CAAC,GAAE,UAAW,QAAA,MAAM;KAAG,MAAA,GAAA,CAAG,CAAC,GAAE,YAAa,QAAA,KAAK,YAAQ,KAAA;IAAA,CAAA;IACjF,SAAO;GAEO,GAAA,CAAA,QAAA,KAAK,QAAA,UAAA,GAApB,YAAqE,aAAA;;IAA1C,MAAM,QAAA,KAAK;IAAO,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,CAAA;GAEzD,GAAA,MAAA,GAAA,CAAA,QAAA,OAAA,CAAA,KAAA,mBAAA,QAAA,IAAA,GAAA,mBAEO,QAAA,EAFA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,YAAA,CAAA,EAAA,GACd,gBAAA,QAAA,KAAK,KAAK,GAAA,CAAA,CAAA,GAAA,CAAA"}
1
+ {"version":3,"file":"group-nav-item.js","names":[],"sources":["../../../src/components/group-nav/group-nav-item.vue"],"sourcesContent":["<template>\n <li\n :class=\"[cls.e('item'), bem.is('active', active), bem.is('disabled', item.disabled ?? false)]\"\n @click=\"handleClick\"\n >\n <NavIcon v-if=\"item.icon\" :icon=\"item.icon\" :class=\"cls.e('icon')\" />\n\n <span :class=\"cls.e('item-title')\">\n {{ item.title }}\n </span>\n </li>\n</template>\n\n<script setup lang=\"ts\">\nimport { bem } from '@veltra/utils'\n\nimport type { NavItem } from '../../types/nav'\nimport NavIcon from '../nav/nav-icon.vue'\n\ndefineOptions({ name: 'UGroupNavItem' })\n\nconst props = defineProps<{ item: NavItem; active: boolean }>()\n\nconst emit = defineEmits<{ (e: 'click', item: NavItem): void }>()\n\nconst cls = bem('group-nav')\n\nfunction handleClick() {\n if (props.item.disabled) return\n emit('click', props.item)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;EAqBA,MAAM,QAAQ;EAEd,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,WAAW;EAE3B,SAAS,cAAc;GACrB,IAAI,MAAM,KAAK,UAAU;GACzB,KAAK,SAAS,MAAM,IAAI;EAC1B;;GA7BE,OAAA,UAAA,GAAA,mBASK,MAAA;IARF,OAAK,eAAA;KAAG,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA;KAAU,MAAA,GAAA,CAAG,CAAC,GAAE,UAAW,QAAA,MAAM;KAAG,MAAA,GAAA,CAAG,CAAC,GAAE,YAAa,QAAA,KAAK,YAAQ,KAAA;IAAA,CAAA;IACjF,SAAO;GAEO,GAAA,CAAA,QAAA,KAAK,QAApB,UAAA,GAAA,YAAqE,aAAA;;IAA1C,MAAM,QAAA,KAAK;IAAO,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,CAAA;GAEzD,GAAA,MAAA,GAAA,CAAA,QAAA,OAAA,CAAA,KAAA,mBAAA,QAAA,IAAA,GAAA,mBAEO,QAAA,EAFA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,YAAA,CAAA,EACd,GAAA,gBAAA,QAAA,KAAK,KAAK,GAAA,CAAA,CAAA,GAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"group-nav.js","names":[],"sources":["../../../src/components/group-nav/group-nav.vue"],"sourcesContent":["<template>\n <u-scroll tag=\"ul\" :class=\"cls.b\" :container-class=\"cls.e('container')\">\n <li v-for=\"(group, index) of groups\" :key=\"group.title || index\" :class=\"cls.e('group')\">\n <div :class=\"cls.e('group-label')\">{{ group.title }}</div>\n <ul :class=\"cls.e('group-list')\">\n <GroupNavItem\n v-for=\"(child, childIndex) of group.children\"\n :key=\"child.path || childIndex\"\n :item=\"child\"\n :active=\"currentPath === child.path\"\n @click=\"handleItemClick\"\n />\n </ul>\n </li>\n </u-scroll>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem } from '@veltra/utils'\n\nimport type { GroupNavEmits, GroupNavProps } from '../../types/group-nav'\nimport type { NavItem } from '../../types/nav'\nimport { UScroll } from '../scroll'\nimport GroupNavItem from './group-nav-item.vue'\n\ndefineOptions({ name: 'UGroupNav' })\n\ndefineProps<GroupNavProps>()\nconst emit = defineEmits<GroupNavEmits>()\n\nconst cls = bem('group-nav')\n\nfunction handleItemClick(item: NavItem) {\n emit('item-click', item)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;EA4BA,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,WAAW;EAE3B,SAAS,gBAAgB,MAAe;GACtC,KAAK,cAAc,IAAI;EACzB;;GAjCE,OAAA,UAAA,GAAA,YAaW,MAAA,WAAA,GAAA;IAbD,KAAI;IAAM,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,CAAC;IAAG,mBAAiB,MAAA,GAAA,CAAG,CAAC,EAAC,WAAA;;IACnB,SAAA,cAAA,EAAA,UAAA,IAAA,GAApC,mBAWK,UAAA,MAAA,WAXwB,QAAA,SAAjB,OAAO,UAAK;KAAxB,OAAA,UAAA,GAAA,mBAWK,MAAA;MAXiC,KAAK,MAAM,SAAS;MAAQ,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA;KAC5E,GAAA,CAAA,mBAA0D,OAAA,EAApD,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,aAAA,CAAA,EAAA,GAAoB,gBAAA,MAAM,KAAK,GAAA,CAAA,GACjD,mBAQK,MAAA,EARA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,YAAA,CAAA,EAAA,GACf,EAAA,UAAA,IAAA,GAAA,mBAME,UAAA,MAAA,WAL8B,MAAM,WAA5B,OAAO,eAAU;MAD3B,OAAA,UAAA,GAAA,YAME,aAAA;OAJC,KAAK,MAAM,QAAQ;OACnB,MAAM;OACN,QAAQ,QAAA,gBAAgB,MAAM;OAC9B,SAAO"}
1
+ {"version":3,"file":"group-nav.js","names":[],"sources":["../../../src/components/group-nav/group-nav.vue"],"sourcesContent":["<template>\n <u-scroll tag=\"ul\" :class=\"cls.b\" :container-class=\"cls.e('container')\">\n <li v-for=\"(group, index) of groups\" :key=\"group.title || index\" :class=\"cls.e('group')\">\n <div :class=\"cls.e('group-label')\">{{ group.title }}</div>\n <ul :class=\"cls.e('group-list')\">\n <GroupNavItem\n v-for=\"(child, childIndex) of group.children\"\n :key=\"child.path || childIndex\"\n :item=\"child\"\n :active=\"currentPath === child.path\"\n @click=\"handleItemClick\"\n />\n </ul>\n </li>\n </u-scroll>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem } from '@veltra/utils'\n\nimport type { GroupNavEmits, GroupNavProps } from '../../types/group-nav'\nimport type { NavItem } from '../../types/nav'\nimport { UScroll } from '../scroll'\nimport GroupNavItem from './group-nav-item.vue'\n\ndefineOptions({ name: 'UGroupNav' })\n\ndefineProps<GroupNavProps>()\nconst emit = defineEmits<GroupNavEmits>()\n\nconst cls = bem('group-nav')\n\nfunction handleItemClick(item: NavItem) {\n emit('item-click', item)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;EA4BA,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,WAAW;EAE3B,SAAS,gBAAgB,MAAe;GACtC,KAAK,cAAc,IAAI;EACzB;;GAjCE,OAAA,UAAA,GAAA,YAaW,MAAA,WAAA,GAAA;IAbD,KAAI;IAAM,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,CAAC;IAAG,mBAAiB,MAAA,GAAA,CAAG,CAAC,EAAC,WAAA;;IACnD,SAAA,cAAgC,EAApC,UAAA,IAAA,GAAA,mBAWK,UAAA,MAAA,WAXwB,QAAA,SAAjB,OAAO,UAAK;KAAxB,OAAA,UAAA,GAAA,mBAWK,MAAA;MAXiC,KAAK,MAAM,SAAS;MAAQ,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA;KAC5E,GAAA,CAAA,mBAA0D,OAAA,EAApD,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,aAAA,CAAA,EAAoB,GAAA,gBAAA,MAAM,KAAK,GAAA,CAAA,GACjD,mBAQK,MAAA,EARA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,YAAA,CAAA,EAAA,GACf,EAAA,UAAA,IAAA,GAAA,mBAME,UAAA,MAAA,WAL8B,MAAM,WAA5B,OAAO,eAAU;MAD3B,OAAA,UAAA,GAAA,YAME,aAAA;OAJC,KAAK,MAAM,QAAQ;OACnB,MAAM;OACN,QAAQ,QAAA,gBAAgB,MAAM;OAC9B,SAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"layout-resizer.js","names":[],"sources":["../../../src/components/layout/layout-resizer.vue"],"sourcesContent":["<template>\n <div\n :class=\"className\"\n :style=\"{ transform: `translate3d(${offsets.x}, ${offsets.y}, 0)` }\"\n ref=\"resizerRef\"\n >\n <u-icon :size=\"10\"> <Move /> </u-icon>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useDrag } from '@veltra/compositions'\nimport { Move } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, inject, shallowReactive, shallowRef } from 'vue'\n\nimport { UIcon } from '../icon'\nimport { LayoutDIKey } from './di'\n\ndefineOptions({ name: 'ULayoutResizer' })\n\nconst props = defineProps<{\n /** 是否横向 */\n horizontal?: boolean\n /** 默认偏移量 */\n offset?: number\n}>()\n\nconst emit = defineEmits<{\n (e: 'resize', offset: number): void\n (e: 'resize-start'): void\n (e: 'resize-end'): void\n}>()\n\nconst { cls } = inject(LayoutDIKey)!\n\nconst className = computed(() => {\n return [cls.e('resizer'), bem.is('horizontal', props.horizontal)]\n})\n\nconst resizerRef = shallowRef<HTMLDivElement>()\n\nlet offset = props.offset ?? 0\nconst offsets = shallowReactive({\n x: props.horizontal ? '0' : offset + 'px',\n y: props.horizontal ? offset + 'px' : '0'\n})\nlet currentOffset = 0\nuseDrag({\n target: resizerRef,\n onDragStart() {\n currentOffset = offset\n emit('resize-start')\n },\n onDrag({ x, y }) {\n if (!props.horizontal) {\n offset = currentOffset + x\n offsets.x = offset + 'px'\n emit('resize', x)\n } else {\n offset = currentOffset + y\n offsets.y = offset + 'px'\n emit('resize', y)\n }\n },\n onDragEnd() {\n emit('resize-end')\n }\n})\n\ndefineExpose({\n update(_offset: number): void {\n offset = _offset\n if (!props.horizontal) {\n offsets.x = offset + 'px'\n } else {\n offsets.y = offset + 'px'\n }\n }\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;EAqBA,MAAM,QAAQ;EAOd,MAAM,OAAO;EAMb,MAAM,EAAE,QAAQ,OAAO,WAAW;EAElC,MAAM,YAAY,eAAe;GAC/B,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,GAAG,cAAc,MAAM,UAAU,CAAC;EAClE,CAAC;EAED,MAAM,aAAa,WAA2B;EAE9C,IAAI,SAAS,MAAM,UAAU;EAC7B,MAAM,UAAU,gBAAgB;GAC9B,GAAG,MAAM,aAAa,MAAM,SAAS;GACrC,GAAG,MAAM,aAAa,SAAS,OAAO;EACxC,CAAC;EACD,IAAI,gBAAgB;EACpB,QAAQ;GACN,QAAQ;GACR,cAAc;IACZ,gBAAgB;IAChB,KAAK,cAAc;GACrB;GACA,OAAO,EAAE,GAAG,KAAK;IACf,IAAI,CAAC,MAAM,YAAY;KACrB,SAAS,gBAAgB;KACzB,QAAQ,IAAI,SAAS;KACrB,KAAK,UAAU,CAAC;IAClB,OAAO;KACL,SAAS,gBAAgB;KACzB,QAAQ,IAAI,SAAS;KACrB,KAAK,UAAU,CAAC;IAClB;GACF;GACA,YAAY;IACV,KAAK,YAAY;GACnB;EACF,CAAC;EAED,SAAa,EACX,OAAO,SAAuB;GAC5B,SAAS;GACT,IAAI,CAAC,MAAM,YACT,QAAQ,IAAI,SAAS;QAErB,QAAQ,IAAI,SAAS;EAEzB,EACF,CAAC;;GA9EC,OAAA,UAAA,GAAA,mBAMM,OAAA;IALH,OAAK,eAAE,UAAA,KAAS;IAChB,OAAK,eAAA,EAAA,WAAA,eAA8B,MAAA,OAAA,CAAO,CAAC,EAAC,IAAK,MAAA,OAAA,CAAO,CAAC,EAAC,MAAA,CAAA;IACvD,SAAA;IAAJ,KAAI;GAEJ,GAAA,CAAA,YAAsC,MAAA,WAAA,GAAA,EAA7B,MAAM,GAAE,GAAA;IAAW,SAAA,cAAA,CAAR,YAAQ,MAAA,IAAA,CAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"layout-resizer.js","names":[],"sources":["../../../src/components/layout/layout-resizer.vue"],"sourcesContent":["<template>\n <div\n :class=\"className\"\n :style=\"{ transform: `translate3d(${offsets.x}, ${offsets.y}, 0)` }\"\n ref=\"resizerRef\"\n >\n <u-icon :size=\"10\"> <Move /> </u-icon>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useDrag } from '@veltra/compositions'\nimport { Move } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, inject, shallowReactive, shallowRef } from 'vue'\n\nimport { UIcon } from '../icon'\nimport { LayoutDIKey } from './di'\n\ndefineOptions({ name: 'ULayoutResizer' })\n\nconst props = defineProps<{\n /** 是否横向 */\n horizontal?: boolean\n /** 默认偏移量 */\n offset?: number\n}>()\n\nconst emit = defineEmits<{\n (e: 'resize', offset: number): void\n (e: 'resize-start'): void\n (e: 'resize-end'): void\n}>()\n\nconst { cls } = inject(LayoutDIKey)!\n\nconst className = computed(() => {\n return [cls.e('resizer'), bem.is('horizontal', props.horizontal)]\n})\n\nconst resizerRef = shallowRef<HTMLDivElement>()\n\nlet offset = props.offset ?? 0\nconst offsets = shallowReactive({\n x: props.horizontal ? '0' : offset + 'px',\n y: props.horizontal ? offset + 'px' : '0'\n})\nlet currentOffset = 0\nuseDrag({\n target: resizerRef,\n onDragStart() {\n currentOffset = offset\n emit('resize-start')\n },\n onDrag({ x, y }) {\n if (!props.horizontal) {\n offset = currentOffset + x\n offsets.x = offset + 'px'\n emit('resize', x)\n } else {\n offset = currentOffset + y\n offsets.y = offset + 'px'\n emit('resize', y)\n }\n },\n onDragEnd() {\n emit('resize-end')\n }\n})\n\ndefineExpose({\n update(_offset: number): void {\n offset = _offset\n if (!props.horizontal) {\n offsets.x = offset + 'px'\n } else {\n offsets.y = offset + 'px'\n }\n }\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;EAqBA,MAAM,QAAQ;EAOd,MAAM,OAAO;EAMb,MAAM,EAAE,QAAQ,OAAO,WAAW;EAElC,MAAM,YAAY,eAAe;GAC/B,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,GAAG,cAAc,MAAM,UAAU,CAAC;EAClE,CAAC;EAED,MAAM,aAAa,WAA2B;EAE9C,IAAI,SAAS,MAAM,UAAU;EAC7B,MAAM,UAAU,gBAAgB;GAC9B,GAAG,MAAM,aAAa,MAAM,SAAS;GACrC,GAAG,MAAM,aAAa,SAAS,OAAO;EACxC,CAAC;EACD,IAAI,gBAAgB;EACpB,QAAQ;GACN,QAAQ;GACR,cAAc;IACZ,gBAAgB;IAChB,KAAK,cAAc;GACrB;GACA,OAAO,EAAE,GAAG,KAAK;IACf,IAAI,CAAC,MAAM,YAAY;KACrB,SAAS,gBAAgB;KACzB,QAAQ,IAAI,SAAS;KACrB,KAAK,UAAU,CAAC;IAClB,OAAO;KACL,SAAS,gBAAgB;KACzB,QAAQ,IAAI,SAAS;KACrB,KAAK,UAAU,CAAC;IAClB;GACF;GACA,YAAY;IACV,KAAK,YAAY;GACnB;EACF,CAAC;EAED,SAAa,EACX,OAAO,SAAuB;GAC5B,SAAS;GACT,IAAI,CAAC,MAAM,YACT,QAAQ,IAAI,SAAS;QAErB,QAAQ,IAAI,SAAS;EAEzB,EACF,CAAC;;GA9EC,OAAA,UAAA,GAAA,mBAMM,OAAA;IALH,OAAK,eAAE,UAAA,KAAS;IAChB,OAAK,eAAA,EAAA,WAAA,eAA8B,MAAA,OAAA,CAAO,CAAC,EAAC,IAAK,MAAA,OAAA,CAAO,CAAC,EAAC,MAAA,CAAA;IACvD,SAAA;IAAJ,KAAI;GAEJ,GAAA,CAAA,YAAsC,MAAA,WAAA,GAAA,EAA7B,MAAM,GAAE,GAAA;IAAG,SAAA,cAAQ,CAAR,YAAQ,MAAA,IAAA,CAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"layout.js","names":[],"sources":["../../../src/components/layout/layout.vue"],"sourcesContent":["<template>\n <component :is=\"tag\" :class=\"cls.b\" :style=\"style\" ref=\"containerRef\">\n <slot />\n\n <!-- 竖向调节 -->\n <ULayoutResizer\n v-for=\"(offset, index) of resizerOffsets\"\n :offset=\"offset\"\n :key=\"index\"\n ref=\"resizerRefs\"\n direction=\"vertical\"\n @resize=\"handleResize($event, index)\"\n @resize-start=\"handleStartResize(index)\"\n @resize-end=\"emit('resize-end', index)\"\n >\n </ULayoutResizer>\n\n <!-- 横向调节 -->\n <!-- <ULayoutResizer\n v-for=\"item in horizontalResizerList\"\n :key=\"item\"\n direction=\"horizontal\"\n /> -->\n </component>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useResizeObserver } from '@veltra/compositions'\nimport { bem, withUnit } from '@veltra/utils'\nimport {\n computed,\n shallowRef,\n type CSSProperties,\n provide,\n watchEffect,\n ref,\n watch,\n nextTick\n} from 'vue'\n\nimport type { LayoutEmits, LayoutProps } from '../../types'\nimport { LayoutDIKey } from './di'\nimport ULayoutResizer from './layout-resizer.vue'\n\ndefineOptions({ name: 'ULayout' })\n\nconst props = withDefaults(defineProps<LayoutProps>(), { tag: 'div' })\n\nconst emit = defineEmits<LayoutEmits>()\n\nconst cls = bem('layout')\n\nconst templateCols = ref<string[]>([])\n\nwatchEffect(() => {\n const { cols } = props\n if (!cols) {\n templateCols.value = []\n return\n }\n templateCols.value = typeof cols === 'string' ? cols.split(' ') : [...cols]\n})\n\nconst style = computed<CSSProperties>(() => {\n const { rows, gap, resizable } = props\n return {\n gridTemplateColumns: templateCols.value.join(' '),\n gridTemplateRows: rows ? (typeof rows === 'string' ? rows : rows.join(' ')) : '',\n columnGap: resizable ? '10px' : withUnit(gap, 'px')\n }\n})\n\nconst containerRef = shallowRef<HTMLElement>()\nconst resizerRefs = shallowRef<InstanceType<typeof ULayoutResizer>[]>([])\n\nconst resizerOffsets = ref<number[]>([])\n\nfunction getResizeOffsets() {\n const container = containerRef.value\n if (!props.resizable || !container || !props.cols) {\n return (resizerOffsets.value = [])\n }\n\n resizerOffsets.value = templateCols.value.slice(0, -1).map((_, index) => {\n const dom = container.children[index] as HTMLElement\n if (!dom) return 0\n return dom.offsetLeft + dom.offsetWidth\n })\n}\n\nwatch([() => props.resizable, containerRef, () => props.cols], () => {\n nextTick(() => {\n syncResizers()\n })\n})\n\nuseResizeObserver({\n targets: containerRef,\n onResize() {\n syncResizers()\n }\n})\n\n/** 重新测量各列边界并同步所有拖拽手柄位置(容器尺寸或 cols 程序化变化后调用) */\nfunction syncResizers() {\n getResizeOffsets()\n resizerRefs.value.forEach((r, i) => {\n r.update(resizerOffsets.value![i]!)\n })\n}\n\n// const horizontalResizerList = []\n\n// const resizing = shallowRef(false)\n\nlet prevSize = 0\nlet nextSize = 0\nconst handleStartResize = (index: number) => {\n const container = containerRef.value\n if (!container) return\n\n // 拖拽前把相邻两列按实际渲染宽度固定成 px,\n // 这样拖拽时两列等量增减、容器整体宽度保持不变。\n const prevDom = container.children[index] as HTMLElement | undefined\n const nextDom = container.children[index + 1] as HTMLElement | undefined\n prevSize = prevDom ? prevDom.getBoundingClientRect().width : 0\n nextSize = nextDom ? nextDom.getBoundingClientRect().width : 0\n emit('resize-start', index)\n}\nconst handleResize = (offset: number, index: number) => {\n // 钳位到 [colMin-prevSize, nextSize-colMin],避免轨道尺寸出现负值或小于列最小宽度——\n // 一旦 grid-template-columns 中带负值,整条声明会被浏览器丢弃。\n const minPrev = props.colMinSizes?.[index] ?? 0\n const minNext = props.colMinSizes?.[index + 1] ?? 0\n const clamped = Math.max(minPrev - prevSize, Math.min(nextSize - minNext, offset))\n templateCols.value[index] = `${prevSize + clamped}px`\n templateCols.value[index + 1] = `${nextSize - clamped}px`\n}\n\nprovide(LayoutDIKey, { cls })\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"layout.js","names":[],"sources":["../../../src/components/layout/layout.vue"],"sourcesContent":["<template>\n <component :is=\"tag\" :class=\"cls.b\" :style=\"style\" ref=\"containerRef\">\n <slot />\n\n <!-- 竖向调节 -->\n <ULayoutResizer\n v-for=\"(offset, index) of resizerOffsets\"\n :offset=\"offset\"\n :key=\"index\"\n ref=\"resizerRefs\"\n direction=\"vertical\"\n @resize=\"handleResize($event, index)\"\n @resize-start=\"handleStartResize(index)\"\n @resize-end=\"emit('resize-end', index)\"\n >\n </ULayoutResizer>\n\n <!-- 横向调节 -->\n <!-- <ULayoutResizer\n v-for=\"item in horizontalResizerList\"\n :key=\"item\"\n direction=\"horizontal\"\n /> -->\n </component>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useResizeObserver } from '@veltra/compositions'\nimport { bem, withUnit } from '@veltra/utils'\nimport {\n computed,\n shallowRef,\n type CSSProperties,\n provide,\n watchEffect,\n ref,\n watch,\n nextTick\n} from 'vue'\n\nimport type { LayoutEmits, LayoutProps } from '../../types'\nimport { LayoutDIKey } from './di'\nimport ULayoutResizer from './layout-resizer.vue'\n\ndefineOptions({ name: 'ULayout' })\n\nconst props = withDefaults(defineProps<LayoutProps>(), { tag: 'div' })\n\nconst emit = defineEmits<LayoutEmits>()\n\nconst cls = bem('layout')\n\nconst templateCols = ref<string[]>([])\n\nwatchEffect(() => {\n const { cols } = props\n if (!cols) {\n templateCols.value = []\n return\n }\n templateCols.value = typeof cols === 'string' ? cols.split(' ') : [...cols]\n})\n\nconst style = computed<CSSProperties>(() => {\n const { rows, gap, resizable } = props\n return {\n gridTemplateColumns: templateCols.value.join(' '),\n gridTemplateRows: rows ? (typeof rows === 'string' ? rows : rows.join(' ')) : '',\n columnGap: resizable ? '10px' : withUnit(gap, 'px')\n }\n})\n\nconst containerRef = shallowRef<HTMLElement>()\nconst resizerRefs = shallowRef<InstanceType<typeof ULayoutResizer>[]>([])\n\nconst resizerOffsets = ref<number[]>([])\n\nfunction getResizeOffsets() {\n const container = containerRef.value\n if (!props.resizable || !container || !props.cols) {\n return (resizerOffsets.value = [])\n }\n\n resizerOffsets.value = templateCols.value.slice(0, -1).map((_, index) => {\n const dom = container.children[index] as HTMLElement\n if (!dom) return 0\n return dom.offsetLeft + dom.offsetWidth\n })\n}\n\nwatch([() => props.resizable, containerRef, () => props.cols], () => {\n nextTick(() => {\n syncResizers()\n })\n})\n\nuseResizeObserver({\n targets: containerRef,\n onResize() {\n syncResizers()\n }\n})\n\n/** 重新测量各列边界并同步所有拖拽手柄位置(容器尺寸或 cols 程序化变化后调用) */\nfunction syncResizers() {\n getResizeOffsets()\n resizerRefs.value.forEach((r, i) => {\n r.update(resizerOffsets.value![i]!)\n })\n}\n\n// const horizontalResizerList = []\n\n// const resizing = shallowRef(false)\n\nlet prevSize = 0\nlet nextSize = 0\nconst handleStartResize = (index: number) => {\n const container = containerRef.value\n if (!container) return\n\n // 拖拽前把相邻两列按实际渲染宽度固定成 px,\n // 这样拖拽时两列等量增减、容器整体宽度保持不变。\n const prevDom = container.children[index] as HTMLElement | undefined\n const nextDom = container.children[index + 1] as HTMLElement | undefined\n prevSize = prevDom ? prevDom.getBoundingClientRect().width : 0\n nextSize = nextDom ? nextDom.getBoundingClientRect().width : 0\n emit('resize-start', index)\n}\nconst handleResize = (offset: number, index: number) => {\n // 钳位到 [colMin-prevSize, nextSize-colMin],避免轨道尺寸出现负值或小于列最小宽度——\n // 一旦 grid-template-columns 中带负值,整条声明会被浏览器丢弃。\n const minPrev = props.colMinSizes?.[index] ?? 0\n const minNext = props.colMinSizes?.[index + 1] ?? 0\n const clamped = Math.max(minPrev - prevSize, Math.min(nextSize - minNext, offset))\n templateCols.value[index] = `${prevSize + clamped}px`\n templateCols.value[index + 1] = `${nextSize - clamped}px`\n}\n\nprovide(LayoutDIKey, { cls })\n</script>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","names":[],"sources":["../../../src/components/list/list.vue"],"sourcesContent":["<template>\n <u-scroll tag=\"ul\" :class=\"[cls.b, cls.m(size)]\">\n <slot v-for=\"(item, index) of data\" v-bind=\"{ item, index }\" />\n </u-scroll>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem } from '@veltra/utils'\n\nimport type { ListProps } from '../../types'\nimport type { ComponentSize } from '../../types'\nimport { UScroll } from '../scroll'\n\ndefineOptions({ name: 'UList' })\n\nconst props = withDefaults(defineProps<ListProps>(), {})\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('list')\n</script>\n"],"mappings":";;;;;;;;;;;;;EAkBA,MAAM,EAAE,SAAS,iBAAiB,CAAC,OAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,MAAM;;GAnBpB,OAAA,UAAA,GAAA,YAEW,MAAA,WAAA,GAAA;IAFD,KAAI;IAAM,OAAK,eAAA,CAAG,MAAA,GAAA,CAAG,CAAC,GAAG,MAAA,GAAA,CAAG,CAAC,EAAE,MAAA,IAAA,CAAI,CAAA,CAAA;;IACR,SAAA,cAAA,EAAA,UAAA,IAAA,GAAnC,mBAA+D,UAAA,MAAA,WAAjC,QAAA,OAAhB,MAAM,UAAK;KAAzB,OAAA,WAA+D,KAAA,QAAA,WAA/D,WAA+D,EAAA,SAAA,KAAA,GAAA;MAAjB;MAAM;KAAK,CAAA,CAAA"}
1
+ {"version":3,"file":"list.js","names":[],"sources":["../../../src/components/list/list.vue"],"sourcesContent":["<template>\n <u-scroll tag=\"ul\" :class=\"[cls.b, cls.m(size)]\">\n <slot v-for=\"(item, index) of data\" v-bind=\"{ item, index }\" />\n </u-scroll>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem } from '@veltra/utils'\n\nimport type { ListProps } from '../../types'\nimport type { ComponentSize } from '../../types'\nimport { UScroll } from '../scroll'\n\ndefineOptions({ name: 'UList' })\n\nconst props = withDefaults(defineProps<ListProps>(), {})\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('list')\n</script>\n"],"mappings":";;;;;;;;;;;;;EAkBA,MAAM,EAAE,SAAS,iBAAiB,CAAC,OAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,MAAM;;GAnBpB,OAAA,UAAA,GAAA,YAEW,MAAA,WAAA,GAAA;IAFD,KAAI;IAAM,OAAK,eAAA,CAAG,MAAA,GAAA,CAAG,CAAC,GAAG,MAAA,GAAA,CAAG,CAAC,EAAE,MAAA,IAAA,CAAI,CAAA,CAAA;;IACrC,SAAA,cAA6B,EAAnC,UAAA,IAAA,GAAA,mBAA+D,UAAA,MAAA,WAAjC,QAAA,OAAhB,MAAM,UAAK;KAAzB,OAAA,WAA+D,KAAA,QAAA,WAA/D,WAA+D,EAAA,SAAA,KAAA,GAAA;MAAjB;MAAM;KAAK,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"loading.js","names":[],"sources":["../../../src/components/loading/loading.vue"],"sourcesContent":["<template>\n <transition name=\"fade\" appear>\n <div :class=\"className\" :style=\"{ zIndex: zIndex() }\">\n <div :class=\"cls.e('loader')\"></div>\n </div>\n </transition>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem, zIndex } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { LoadingProps, ComponentSize } from '../../types'\n\ndefineOptions({ name: 'ULoading' })\n\nconst props = withDefaults(defineProps<LoadingProps>(), { type: 'dual-ring' })\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('loading')\n\nconst className = computed(() => {\n return [cls.b, cls.m(size.value), cls.e(props.type)]\n})\n</script>\n"],"mappings":";;;;;;;;;EAiBA,MAAM,QAAQ;EAEd,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,SAAS;EAEzB,MAAM,YAAY,eAAe;GAC/B,OAAO;IAAC,IAAI;IAAG,IAAI,EAAE,KAAK,KAAK;IAAG,IAAI,EAAE,MAAM,IAAI;GAAC;EACrD,CAAC;;GAxBC,OAAA,UAAA,GAAA,YAIa,YAAA;IAJD,MAAK;IAAO,QAAA;;IAGhB,SAAA,cAAA,CAFN,mBAEM,OAAA;KAFA,OAAK,eAAE,UAAA,KAAS;KAAG,OAAK,eAAA,EAAA,QAAY,MAAA,MAAA,CAAM,CAAA,EAAA,CAAA;IAC9C,GAAA,CAAA,mBAAoC,OAAA,EAA9B,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,QAAA,CAAA,EAAA,GAAA,MAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"loading.js","names":[],"sources":["../../../src/components/loading/loading.vue"],"sourcesContent":["<template>\n <transition name=\"fade\" appear>\n <div :class=\"className\" :style=\"{ zIndex: zIndex() }\">\n <div :class=\"cls.e('loader')\"></div>\n </div>\n </transition>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem, zIndex } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { LoadingProps, ComponentSize } from '../../types'\n\ndefineOptions({ name: 'ULoading' })\n\nconst props = withDefaults(defineProps<LoadingProps>(), { type: 'dual-ring' })\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('loading')\n\nconst className = computed(() => {\n return [cls.b, cls.m(size.value), cls.e(props.type)]\n})\n</script>\n"],"mappings":";;;;;;;;;EAiBA,MAAM,QAAQ;EAEd,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,SAAS;EAEzB,MAAM,YAAY,eAAe;GAC/B,OAAO;IAAC,IAAI;IAAG,IAAI,EAAE,KAAK,KAAK;IAAG,IAAI,EAAE,MAAM,IAAI;GAAC;EACrD,CAAC;;GAxBC,OAAA,UAAA,GAAA,YAIa,YAAA;IAJD,MAAK;IAAO,QAAA;;IACtB,SAAA,cAEM,CAFN,mBAEM,OAAA;KAFA,OAAK,eAAE,UAAA,KAAS;KAAG,OAAK,eAAA,EAAA,QAAY,MAAA,MAAA,CAAM,CAAA,EAAA,CAAA;IAC9C,GAAA,CAAA,mBAAoC,OAAA,EAA9B,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,QAAA,CAAA,EAAA,GAAA,MAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"message-box.js","names":[],"sources":["../../../src/components/message/message-box.vue"],"sourcesContent":["<template>\n <transition-group name=\"message\" appear @after-leave=\"handleAfterLeave\">\n <UMessage\n v-for=\"({ onClose, ...message }, index) of messages\"\n v-bind=\"message\"\n :data-id=\"message.key\"\n @close=\"handleClose(index, onClose)\"\n />\n </transition-group>\n</template>\n\n<script lang=\"ts\" setup>\nimport type { MessageOptions } from '../../types'\nimport UMessage from './message.vue'\n\ndefineOptions({ name: 'UMessageBox' })\n\ndefineProps<{ messages: Array<Omit<MessageOptions & { key: string }, 'onClosed'>> }>()\n\nconst emit = defineEmits<{ (e: 'closed', id: string): void; (e: 'close', index: number): void }>()\n\nfunction handleAfterLeave(el: Element) {\n emit('closed', (el as HTMLElement).dataset.id as string)\n}\n\nfunction handleClose(i: number, onClose?: () => void) {\n emit('close', i)\n onClose?.()\n}\n</script>\n"],"mappings":";;;;;;;;;EAmBA,MAAM,OAAO;EAEb,SAAS,iBAAiB,IAAa;GACrC,KAAK,UAAW,GAAmB,QAAQ,EAAY;EACzD;EAEA,SAAS,YAAY,GAAW,SAAsB;GACpD,KAAK,SAAS,CAAC;GACf,UAAU;EACZ;;GA3BE,OAAA,UAAA,GAAA,YAOmB,iBAAA;IAPD,MAAK;IAAU,QAAA;IAAQ,cAAa;;IAEE,SAAA,cAAA,EAAA,UAAA,IAAA,GADtD,mBAKE,UAAA,MAAA,WAJ2C,QAAA,WAAQ,EAAzC,SAAO,GAAK,WAAW,UAAK;KADxC,OAAA,UAAA,GAAA,YAKE,aALF,WAKE,EAAA,SAAA,KAAA,GAHQ,SAAO;MACd,WAAS,QAAQ;MACjB,UAAK,WAAE,YAAY,OAAO,OAAO"}
1
+ {"version":3,"file":"message-box.js","names":[],"sources":["../../../src/components/message/message-box.vue"],"sourcesContent":["<template>\n <transition-group name=\"message\" appear @after-leave=\"handleAfterLeave\">\n <UMessage\n v-for=\"({ onClose, ...message }, index) of messages\"\n v-bind=\"message\"\n :data-id=\"message.key\"\n @close=\"handleClose(index, onClose)\"\n />\n </transition-group>\n</template>\n\n<script lang=\"ts\" setup>\nimport type { MessageOptions } from '../../types'\nimport UMessage from './message.vue'\n\ndefineOptions({ name: 'UMessageBox' })\n\ndefineProps<{ messages: Array<Omit<MessageOptions & { key: string }, 'onClosed'>> }>()\n\nconst emit = defineEmits<{ (e: 'closed', id: string): void; (e: 'close', index: number): void }>()\n\nfunction handleAfterLeave(el: Element) {\n emit('closed', (el as HTMLElement).dataset.id as string)\n}\n\nfunction handleClose(i: number, onClose?: () => void) {\n emit('close', i)\n onClose?.()\n}\n</script>\n"],"mappings":";;;;;;;;;EAmBA,MAAM,OAAO;EAEb,SAAS,iBAAiB,IAAa;GACrC,KAAK,UAAW,GAAmB,QAAQ,EAAY;EACzD;EAEA,SAAS,YAAY,GAAW,SAAsB;GACpD,KAAK,SAAS,CAAC;GACf,UAAU;EACZ;;GA3BE,OAAA,UAAA,GAAA,YAOmB,iBAAA;IAPD,MAAK;IAAU,QAAA;IAAQ,cAAa;;IAElD,SAAA,cAAoD,EADtD,UAAA,IAAA,GAAA,mBAKE,UAAA,MAAA,WAJ2C,QAAA,WAAQ,EAAzC,SAAO,GAAK,WAAW,UAAK;KADxC,OAAA,UAAA,GAAA,YAKE,aALF,WAKE,EAAA,SAAA,KAAA,GAHQ,SAAO;MACd,WAAS,QAAQ;MACjB,UAAK,WAAE,YAAY,OAAO,OAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"message.js","names":[],"sources":["../../../src/components/message/message.vue"],"sourcesContent":["<template>\n <li\n :class=\"[cls.b, cls.m(size), cls.m('color-' + getTypeColor(type))]\"\n @mouseenter=\"suspendClose\"\n @mouseleave=\"close\"\n >\n <div :class=\"cls.e('icon')\">\n <UIcon>\n <component :is=\"getTypeIcon(type, icon)\" />\n </UIcon>\n </div>\n <div :class=\"cls.e('content')\" v-if=\"html\" v-html=\"message\"></div>\n <div :class=\"cls.e('content')\" v-else>\n {{ message }}\n </div>\n <div :class=\"cls.e('close')\" v-if=\"closable || duration === 0\" @click.stop=\"immediateClose\">\n <UIcon><Close /></UIcon>\n </div>\n </li>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { onMounted } from 'vue'\n\nimport type { MessageProps } from '../../types'\nimport { UIcon } from '../icon'\nimport { getTypeColor, getTypeIcon } from './helper'\n\ndefineOptions({ name: 'UMessage' })\n\nconst props = withDefaults(defineProps<MessageProps>(), {\n type: 'default',\n duration: 3000,\n offset: 20\n})\n\nconst emit = defineEmits<{ (e: 'close'): void }>()\n\nconst { size } = useFallbackProps([props], { size: 'default' })\n\nconst cls = bem('message')\n\nlet startTime = 0\nlet timer: number\nlet restDuration = 0\n\nfunction close() {\n if (props.duration === 0) return\n startTime = Date.now()\n timer = setTimeout(() => {\n emit('close')\n }, restDuration)\n}\n\nfunction startClose() {\n if (props.duration <= 0) return\n restDuration = props.duration\n close()\n}\n\nonMounted(() => {\n startClose()\n})\n\nfunction suspendClose() {\n clearTimeout(timer)\n restDuration = restDuration - (Date.now() - startTime)\n}\n\nfunction immediateClose() {\n emit('close')\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;EAiCA,MAAM,QAAQ;EAMd,MAAM,OAAO;EAEb,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAAU,CAAC;EAE9D,MAAM,MAAM,IAAI,SAAS;EAEzB,IAAI,YAAY;EAChB,IAAI;EACJ,IAAI,eAAe;EAEnB,SAAS,QAAQ;GACf,IAAI,MAAM,aAAa,GAAG;GAC1B,YAAY,KAAK,IAAI;GACrB,QAAQ,iBAAiB;IACvB,KAAK,OAAO;GACd,GAAG,YAAY;EACjB;EAEA,SAAS,aAAa;GACpB,IAAI,MAAM,YAAY,GAAG;GACzB,eAAe,MAAM;GACrB,MAAM;EACR;EAEA,gBAAgB;GACd,WAAW;EACb,CAAC;EAED,SAAS,eAAe;GACtB,aAAa,KAAK;GAClB,eAAe,gBAAgB,KAAK,IAAI,IAAI;EAC9C;EAEA,SAAS,iBAAiB;GACxB,KAAK,OAAO;EACd;;GAzEE,OAAA,UAAA,GAAA,mBAiBK,MAAA;IAhBF,OAAK,eAAA;KAAG,MAAA,GAAA,CAAG,CAAC;KAAG,MAAA,GAAA,CAAG,CAAC,EAAE,MAAA,IAAA,CAAI;KAAG,MAAA,GAAA,CAAG,CAAC,EAAC,WAAY,MAAA,YAAA,CAAY,CAAC,QAAA,IAAI,CAAA;IAAA,CAAA;IAC9D,cAAY;IACZ,cAAY;;IAEb,mBAIM,OAAA,EAJA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,CAAA,EAAA,GAChB,CAAA,YAEQ,MAAA,WAAA,GAAA,MAAA;KADqC,SAAA,cAAA,EAAA,UAAA,GAA3C,YAA2C,wBAA3B,MAAA,WAAA,CAAW,CAAC,QAAA,MAAM,QAAA,IAAI,CAAA,CAAA,EAAA,CAAA;;;IAGL,QAAA,QAAA,UAAA,GAArC,mBAAkE,OAAA;;KAA5D,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,SAAA,CAAA;KAAyB,WAAQ,QAAA;IACnD,GAAA,MAAA,IAAA,UAAA,MAAA,UAAA,GAAA,mBAEM,OAAA;;KAFA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,SAAA,CAAA;IACb,GAAA,gBAAA,QAAA,OAAO,GAAA,CAAA;IAEuB,QAAA,YAAY,QAAA,aAAQ,KAAA,UAAA,GAAvD,mBAEM,OAAA;;KAFA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA;KAA8C,SAAK,cAAO,gBAAc,CAAA,MAAA,CAAA;IACxF,GAAA,CAAA,YAAwB,MAAA,WAAA,GAAA,MAAA;KAAR,SAAA,cAAA,CAAT,YAAS,MAAA,KAAA,CAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"message.js","names":[],"sources":["../../../src/components/message/message.vue"],"sourcesContent":["<template>\n <li\n :class=\"[cls.b, cls.m(size), cls.m('color-' + getTypeColor(type))]\"\n @mouseenter=\"suspendClose\"\n @mouseleave=\"close\"\n >\n <div :class=\"cls.e('icon')\">\n <UIcon>\n <component :is=\"getTypeIcon(type, icon)\" />\n </UIcon>\n </div>\n <div :class=\"cls.e('content')\" v-if=\"html\" v-html=\"message\"></div>\n <div :class=\"cls.e('content')\" v-else>\n {{ message }}\n </div>\n <div :class=\"cls.e('close')\" v-if=\"closable || duration === 0\" @click.stop=\"immediateClose\">\n <UIcon><Close /></UIcon>\n </div>\n </li>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { onMounted } from 'vue'\n\nimport type { MessageProps } from '../../types'\nimport { UIcon } from '../icon'\nimport { getTypeColor, getTypeIcon } from './helper'\n\ndefineOptions({ name: 'UMessage' })\n\nconst props = withDefaults(defineProps<MessageProps>(), {\n type: 'default',\n duration: 3000,\n offset: 20\n})\n\nconst emit = defineEmits<{ (e: 'close'): void }>()\n\nconst { size } = useFallbackProps([props], { size: 'default' })\n\nconst cls = bem('message')\n\nlet startTime = 0\nlet timer: number\nlet restDuration = 0\n\nfunction close() {\n if (props.duration === 0) return\n startTime = Date.now()\n timer = setTimeout(() => {\n emit('close')\n }, restDuration)\n}\n\nfunction startClose() {\n if (props.duration <= 0) return\n restDuration = props.duration\n close()\n}\n\nonMounted(() => {\n startClose()\n})\n\nfunction suspendClose() {\n clearTimeout(timer)\n restDuration = restDuration - (Date.now() - startTime)\n}\n\nfunction immediateClose() {\n emit('close')\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;EAiCA,MAAM,QAAQ;EAMd,MAAM,OAAO;EAEb,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAAU,CAAC;EAE9D,MAAM,MAAM,IAAI,SAAS;EAEzB,IAAI,YAAY;EAChB,IAAI;EACJ,IAAI,eAAe;EAEnB,SAAS,QAAQ;GACf,IAAI,MAAM,aAAa,GAAG;GAC1B,YAAY,KAAK,IAAI;GACrB,QAAQ,iBAAiB;IACvB,KAAK,OAAO;GACd,GAAG,YAAY;EACjB;EAEA,SAAS,aAAa;GACpB,IAAI,MAAM,YAAY,GAAG;GACzB,eAAe,MAAM;GACrB,MAAM;EACR;EAEA,gBAAgB;GACd,WAAW;EACb,CAAC;EAED,SAAS,eAAe;GACtB,aAAa,KAAK;GAClB,eAAe,gBAAgB,KAAK,IAAI,IAAI;EAC9C;EAEA,SAAS,iBAAiB;GACxB,KAAK,OAAO;EACd;;GAzEE,OAAA,UAAA,GAAA,mBAiBK,MAAA;IAhBF,OAAK,eAAA;KAAG,MAAA,GAAA,CAAG,CAAC;KAAG,MAAA,GAAA,CAAG,CAAC,EAAE,MAAA,IAAA,CAAI;KAAG,MAAA,GAAA,CAAG,CAAC,EAAC,WAAY,MAAA,YAAA,CAAY,CAAC,QAAA,IAAI,CAAA;IAAA,CAAA;IAC9D,cAAY;IACZ,cAAY;;IAEb,mBAIM,OAAA,EAJA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,CAAA,EAAA,GAChB,CAAA,YAEQ,MAAA,WAAA,GAAA,MAAA;KADN,SAAA,cAA2C,EAA3C,UAAA,GAAA,YAA2C,wBAA3B,MAAA,WAAA,CAAW,CAAC,QAAA,MAAM,QAAA,IAAI,CAAA,CAAA,EAAA,CAAA;;;IAGL,QAAA,QAArC,UAAA,GAAA,mBAAkE,OAAA;;KAA5D,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,SAAA,CAAA;KAAyB,WAAQ,QAAA;IACnD,GAAA,MAAA,IAAA,UAAA,MAAA,UAAA,GAAA,mBAEM,OAAA;;KAFA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,SAAA,CAAA;IACb,GAAA,gBAAA,QAAA,OAAO,GAAA,CAAA;IAEuB,QAAA,YAAY,QAAA,aAAQ,KAAvD,UAAA,GAAA,mBAEM,OAAA;;KAFA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA;KAA8C,SAAK,cAAO,gBAAc,CAAA,MAAA,CAAA;IACxF,GAAA,CAAA,YAAwB,MAAA,WAAA,GAAA,MAAA;KAAjB,SAAA,cAAS,CAAT,YAAS,MAAA,KAAA,CAAA,CAAA,CAAA"}
@@ -18,6 +18,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
18
18
  return (_ctx, _cache) => {
19
19
  return openBlock(), createBlock(TransitionGroup, {
20
20
  name: "message-confirm",
21
+ tag: "div",
21
22
  appear: "",
22
23
  onAfterLeave: handleAfterLeave
23
24
  }, {
@@ -1 +1 @@
1
- {"version":3,"file":"message-confirm-box.js","names":[],"sources":["../../../src/components/message-confirm/message-confirm-box.vue"],"sourcesContent":["<template>\n <transition-group name=\"message-confirm\" appear @after-leave=\"handleAfterLeave\">\n <UMessageConfirm\n v-for=\"{ onClose, onClosed, ...confirm } of confirms\"\n v-bind=\"confirm\"\n :key=\"confirm.key\"\n :data-key=\"confirm.key\"\n @close=\"handleClose(confirm.key, onClose, $event)\"\n />\n </transition-group>\n</template>\n\n<script lang=\"ts\" setup>\nimport type { MessageConfirmAction, MessageConfirmOptions } from '../../types'\nimport UMessageConfirm from './message-confirm.vue'\n\ndefineOptions({ name: 'UMessageConfirmBox' })\n\ntype ConfirmItem = MessageConfirmOptions & { key: string }\n\ndefineProps<{ confirms: ConfirmItem[] }>()\n\nconst emit = defineEmits<{\n (e: 'closed', key: string): void\n (e: 'close', key: string, action: MessageConfirmAction): void\n}>()\n\nfunction handleAfterLeave(el: Element) {\n emit('closed', (el as HTMLElement).dataset.key as string)\n}\n\nfunction handleClose(key: string, onClose: ConfirmItem['onClose'], action: MessageConfirmAction) {\n emit('close', key, action)\n onClose?.(action)\n}\n</script>\n"],"mappings":";;;;;;;;;EAsBA,MAAM,OAAO;EAKb,SAAS,iBAAiB,IAAa;GACrC,KAAK,UAAW,GAAmB,QAAQ,GAAa;EAC1D;EAEA,SAAS,YAAY,KAAa,SAAiC,QAA8B;GAC/F,KAAK,SAAS,KAAK,MAAM;GACzB,UAAU,MAAM;EAClB;;GAjCE,OAAA,UAAA,GAAA,YAQmB,iBAAA;IARD,MAAK;IAAkB,QAAA;IAAQ,cAAa;;IAEL,SAAA,cAAA,EAAA,UAAA,IAAA,GADvD,mBAME,UAAA,MAAA,WAL4C,QAAA,WAAQ,EAA3C,SAAS,UAAQ,GAAK,cAAO;KADxC,OAAA,UAAA,GAAA,YAME,aANF,WAME,EAAA,SAAA,KAAA,GAJQ,SAAO;MACd,KAAK,QAAQ;MACb,YAAU,QAAQ;MAClB,UAAK,WAAE,YAAY,QAAQ,KAAK,SAAS,MAAM"}
1
+ {"version":3,"file":"message-confirm-box.js","names":[],"sources":["../../../src/components/message-confirm/message-confirm-box.vue"],"sourcesContent":["<template>\n <transition-group name=\"message-confirm\" tag=\"div\" appear @after-leave=\"handleAfterLeave\">\n <UMessageConfirm\n v-for=\"{ onClose, onClosed, ...confirm } of confirms\"\n v-bind=\"confirm\"\n :key=\"confirm.key\"\n :data-key=\"confirm.key\"\n @close=\"handleClose(confirm.key, onClose, $event)\"\n />\n </transition-group>\n</template>\n\n<script lang=\"ts\" setup>\nimport type { MessageConfirmAction, MessageConfirmOptions } from '../../types'\nimport UMessageConfirm from './message-confirm.vue'\n\ndefineOptions({ name: 'UMessageConfirmBox' })\n\ntype ConfirmItem = MessageConfirmOptions & { key: string }\n\ndefineProps<{ confirms: ConfirmItem[] }>()\n\nconst emit = defineEmits<{\n (e: 'closed', key: string): void\n (e: 'close', key: string, action: MessageConfirmAction): void\n}>()\n\nfunction handleAfterLeave(el: Element) {\n emit('closed', (el as HTMLElement).dataset.key as string)\n}\n\nfunction handleClose(key: string, onClose: ConfirmItem['onClose'], action: MessageConfirmAction) {\n emit('close', key, action)\n onClose?.(action)\n}\n</script>\n"],"mappings":";;;;;;;;;EAsBA,MAAM,OAAO;EAKb,SAAS,iBAAiB,IAAa;GACrC,KAAK,UAAW,GAAmB,QAAQ,GAAa;EAC1D;EAEA,SAAS,YAAY,KAAa,SAAiC,QAA8B;GAC/F,KAAK,SAAS,KAAK,MAAM;GACzB,UAAU,MAAM;EAClB;;GAjCE,OAAA,UAAA,GAAA,YAQmB,iBAAA;IARD,MAAK;IAAkB,KAAI;IAAM,QAAA;IAAQ,cAAa;;IAEpE,SAAA,cAAqD,EADvD,UAAA,IAAA,GAAA,mBAME,UAAA,MAAA,WAL4C,QAAA,WAAQ,EAA3C,SAAS,UAAQ,GAAK,cAAO;KADxC,OAAA,UAAA,GAAA,YAME,aANF,WAME,EAAA,SAAA,KAAA,GAJQ,SAAO;MACd,KAAK,QAAQ;MACb,YAAU,QAAQ;MAClB,UAAK,WAAE,YAAY,QAAQ,KAAK,SAAS,MAAM"}
@@ -1,7 +1,7 @@
1
1
  import _sfc_main$1 from "../button/button.js";
2
- import { createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, normalizeStyle, openBlock, toDisplayString, unref, withCtx } from "vue";
2
+ import { createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, toDisplayString, unref, withCtx } from "vue";
3
3
  import { useFallbackProps } from "@veltra/compositions";
4
- import { bem } from "@veltra/utils";
4
+ import { bem, zIndex } from "@veltra/utils";
5
5
  //#region src/components/message-confirm/message-confirm.vue
6
6
  const _sfc_main = /*@__PURE__*/ defineComponent({
7
7
  name: "UMessageConfirm",
@@ -21,11 +21,18 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
21
21
  const emit = __emit;
22
22
  const { size } = useFallbackProps([props], { size: "default" });
23
23
  const cls = bem("message-confirm");
24
+ const overlayStyle = { zIndex: props.zIndex ?? zIndex() };
24
25
  return (_ctx, _cache) => {
25
- return openBlock(), createElementBlock("div", { class: normalizeClass([unref(cls).b, unref(cls).m(unref(size))]) }, [createElementVNode("div", {
26
+ return openBlock(), createElementBlock("div", {
27
+ class: normalizeClass([unref(cls).b, unref(cls).m(unref(size))]),
28
+ style: overlayStyle
29
+ }, [createElementVNode("div", {
26
30
  class: normalizeClass(unref(cls).e("mask")),
27
- style: normalizeStyle({ zIndex: __props.zIndex })
28
- }, [createElementVNode("div", { class: normalizeClass(unref(cls).e("box")) }, [
31
+ style: overlayStyle
32
+ }, [createElementVNode("div", {
33
+ class: normalizeClass(unref(cls).e("box")),
34
+ style: overlayStyle
35
+ }, [
29
36
  __props.title ? (openBlock(), createElementBlock("div", {
30
37
  key: 0,
31
38
  class: normalizeClass(unref(cls).e("header"))
@@ -47,7 +54,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
47
54
  default: withCtx(() => [createTextVNode(toDisplayString(__props.confirmButtonText), 1)]),
48
55
  _: 1
49
56
  }, 8, ["type", "class"])], 2)
50
- ], 2)], 6)], 2);
57
+ ], 2)], 2)], 2);
51
58
  };
52
59
  }
53
60
  });
@@ -1 +1 @@
1
- {"version":3,"file":"message-confirm.js","names":[],"sources":["../../../src/components/message-confirm/message-confirm.vue"],"sourcesContent":["<template>\n <div :class=\"[cls.b, cls.m(size)]\">\n <div :class=\"cls.e('mask')\" :style=\"{ zIndex }\">\n <div :class=\"cls.e('box')\">\n <div :class=\"cls.e('header')\" v-if=\"title\">{{ title }}</div>\n <div :class=\"cls.e('content')\">{{ message }}</div>\n <div :class=\"cls.e('footer')\">\n <UButton\n plain\n @click=\"emit('close', 'cancel')\"\n :class=\"cls.em('footer', 'btn')\"\n v-if=\"cancelButtonText\"\n >{{ cancelButtonText }}</UButton\n >\n <UButton\n :type=\"confirmButtonType\"\n @click=\"emit('close', 'confirm')\"\n :class=\"cls.em('footer', 'btn')\"\n >{{ confirmButtonText }}</UButton\n >\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem } from '@veltra/utils'\n\nimport type {\n MessageConfirmProps,\n MessageConfirmEmits,\n ColorType,\n ComponentSize\n} from '../../types'\nimport { UButton } from '../button'\n\ndefineOptions({ name: 'UMessageConfirm' })\n\nconst props = withDefaults(defineProps<MessageConfirmProps>(), {\n title: '',\n message: '',\n confirmButtonText: '确定',\n confirmButtonType: 'primary' as ColorType,\n cancelButtonText: ''\n})\n\nconst emit = defineEmits<MessageConfirmEmits>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('message-confirm')\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;EAwCA,MAAM,QAAQ;EAQd,MAAM,OAAO;EAEb,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,iBAAiB;;GAnD/B,OAAA,UAAA,GAAA,mBAsBM,OAAA,EAtBA,OAAK,eAAA,CAAG,MAAA,GAAA,CAAG,CAAC,GAAG,MAAA,GAAA,CAAG,CAAC,EAAE,MAAA,IAAA,CAAI,CAAA,CAAA,EAAA,GAC7B,CAAA,mBAoBM,OAAA;IApBA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,CAAA;IAAW,OAAK,eAAA,EAAA,QAAI,QAAA,OAAM,CAAA;GAC1C,GAAA,CAAA,mBAkBM,OAAA,EAlBA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,KAAA,CAAA,EAAA,GAAA;IACoB,QAAA,SAAA,UAAA,GAApC,mBAA4D,OAAA;;KAAtD,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,QAAA,CAAA;IAA4B,GAAA,gBAAA,QAAA,KAAK,GAAA,CAAA,KAAA,mBAAA,QAAA,IAAA;IACnD,mBAAkD,OAAA,EAA5C,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,SAAA,CAAA,EAAA,GAAgB,gBAAA,QAAA,OAAO,GAAA,CAAA;IACzC,mBAcM,OAAA,EAdA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,QAAA,CAAA,EAAA,GAKR,CAAA,QAAA,oBAAA,UAAA,GAJR,YAMC,MAAA,WAAA,GAAA;;KALC,OAAA;KACC,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,SAAA,QAAA;KACX,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,GAAE,UAAA,KAAA,CAAA;;KAES,SAAA,cAAA,CAAA,gBAAnB,gBAAA,QAAA,gBAAgB,GAAA,CAAA,CAAA,CAAA;;IAEtB,GAAA,GAAA,CAAA,OAAA,CAAA,KAAA,mBAAA,QAAA,IAAA,GAAA,YAKC,MAAA,WAAA,GAAA;KAJE,MAAM,QAAA;KACN,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,SAAA,SAAA;KACX,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,GAAE,UAAA,KAAA,CAAA;;KACU,SAAA,cAAA,CAAA,gBAApB,gBAAA,QAAA,iBAAiB,GAAA,CAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"message-confirm.js","names":[],"sources":["../../../src/components/message-confirm/message-confirm.vue"],"sourcesContent":["<template>\n <div :class=\"[cls.b, cls.m(size)]\" :style=\"overlayStyle\">\n <div :class=\"cls.e('mask')\" :style=\"overlayStyle\">\n <div :class=\"cls.e('box')\" :style=\"overlayStyle\">\n <div :class=\"cls.e('header')\" v-if=\"title\">{{ title }}</div>\n <div :class=\"cls.e('content')\">{{ message }}</div>\n <div :class=\"cls.e('footer')\">\n <UButton\n plain\n @click=\"emit('close', 'cancel')\"\n :class=\"cls.em('footer', 'btn')\"\n v-if=\"cancelButtonText\"\n >{{ cancelButtonText }}</UButton\n >\n <UButton\n :type=\"confirmButtonType\"\n @click=\"emit('close', 'confirm')\"\n :class=\"cls.em('footer', 'btn')\"\n >{{ confirmButtonText }}</UButton\n >\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem, zIndex } from '@veltra/utils'\n\nimport type {\n MessageConfirmProps,\n MessageConfirmEmits,\n ColorType,\n ComponentSize\n} from '../../types'\nimport { UButton } from '../button'\n\ndefineOptions({ name: 'UMessageConfirm' })\n\nconst props = withDefaults(defineProps<MessageConfirmProps>(), {\n title: '',\n message: '',\n confirmButtonText: '确定',\n confirmButtonType: 'primary' as ColorType,\n cancelButtonText: ''\n})\n\nconst emit = defineEmits<MessageConfirmEmits>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('message-confirm')\nconst overlayStyle = { zIndex: props.zIndex ?? zIndex() }\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;EAwCA,MAAM,QAAQ;EAQd,MAAM,OAAO;EAEb,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,iBAAiB;EACjC,MAAM,eAAe,EAAE,QAAQ,MAAM,UAAU,OAAO,EAAE;;GApDtD,OAAA,UAAA,GAAA,mBAsBM,OAAA;IAtBA,OAAK,eAAA,CAAG,MAAA,GAAA,CAAG,CAAC,GAAG,MAAA,GAAA,CAAG,CAAC,EAAE,MAAA,IAAA,CAAI,CAAA,CAAA;IAAK,OAAO;GACzC,GAAA,CAAA,mBAoBM,OAAA;IApBA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,CAAA;IAAW,OAAO;GAClC,GAAA,CAAA,mBAkBM,OAAA;IAlBA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,KAAA,CAAA;IAAU,OAAO;;IACG,QAAA,SAApC,UAAA,GAAA,mBAA4D,OAAA;;KAAtD,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,QAAA,CAAA;IAA4B,GAAA,gBAAA,QAAA,KAAK,GAAA,CAAA,KAAA,mBAAA,QAAA,IAAA;IACnD,mBAAkD,OAAA,EAA5C,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,SAAA,CAAA,EAAgB,GAAA,gBAAA,QAAA,OAAO,GAAA,CAAA;IACzC,mBAcM,OAAA,EAdA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,QAAA,CAAA,EAAA,GAKR,CAAA,QAAA,oBAJR,UAAA,GAAA,YAMC,MAAA,WAAA,GAAA;;KALC,OAAA;KACC,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,SAAA,QAAA;KACX,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,GAAE,UAAA,KAAA,CAAA;;KAEb,SAAA,cAAsB,CAAnB,gBAAA,gBAAA,QAAA,gBAAgB,GAAA,CAAA,CAAA,CAAA;;IAEtB,GAAA,GAAA,CAAA,OAAA,CAAA,KAAA,mBAAA,QAAA,IAAA,GAAA,YAKC,MAAA,WAAA,GAAA;KAJE,MAAM,QAAA;KACN,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,SAAA,SAAA;KACX,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,GAAE,UAAA,KAAA,CAAA;;KACb,SAAA,cAAuB,CAApB,gBAAA,gBAAA,QAAA,iBAAiB,GAAA,CAAA,CAAA,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import _sfc_main from "./message-confirm-box.js";
2
2
  import { h, render, shallowReactive } from "vue";
3
- import { bem, zIndex } from "@veltra/utils";
3
+ import { bem, setStyles, zIndex } from "@veltra/utils";
4
4
  //#region src/components/message-confirm/message-confirm.ts
5
5
  const cls = bem("message-confirm");
6
6
  /** --- 状态管理 --- */
@@ -48,8 +48,9 @@ const ensureContainer = () => {
48
48
  return container;
49
49
  };
50
50
  /** 执行 Vue 渲染逻辑 */
51
- const updateView = () => {
51
+ const updateView = (layer) => {
52
52
  const el = ensureContainer();
53
+ setStyles(el, { zIndex: layer });
53
54
  const vnode = h(_sfc_main, {
54
55
  confirms,
55
56
  onClosed: handleClosed,
@@ -69,12 +70,13 @@ const createConfirm = (options) => {
69
70
  userOnClosed?.(action);
70
71
  resolveClosed(action);
71
72
  });
73
+ const layer = confirmOptions.zIndex ?? zIndex();
72
74
  confirms.push({
73
- zIndex: zIndex(),
74
75
  ...confirmOptions,
76
+ zIndex: layer,
75
77
  key: id
76
78
  });
77
- updateView();
79
+ updateView(layer);
78
80
  return {
79
81
  id,
80
82
  close: (action = "cancel") => handleClose(id, action),
@@ -1 +1 @@
1
- {"version":3,"file":"message-confirm2.js","names":["UMessageConfirmBox"],"sources":["../../../src/components/message-confirm/message-confirm.ts"],"sourcesContent":["import { bem, zIndex } from '@veltra/utils'\nimport { h, render, shallowReactive } from 'vue'\n\nimport type {\n MessageConfirm,\n MessageConfirmAction,\n MessageConfirmInstance,\n MessageConfirmOptions\n} from '../../types'\nimport UMessageConfirmBox from './message-confirm-box.vue'\n\nconst cls = bem('message-confirm')\n\n/** 确认框项数据结构 */\ntype ConfirmItem = MessageConfirmOptions & { key: string }\n\n/** --- 状态管理 --- */\nlet container: HTMLElement | null = null\nconst confirms = shallowReactive<ConfirmItem[]>([])\n\n/** 关闭动画结束后的回调 */\nconst closedCallbacks = new Map<string, (action: MessageConfirmAction) => void>()\n\n/** 记录每项关闭时的用户操作,动画结束后随回调抛出 */\nconst pendingActions = new Map<string, MessageConfirmAction>()\n\n/** 用于计数正在显示的 DOM 节点 (包含动画执行中) */\nlet activeCount = 0\nlet uid = 0\n\n/** --- 内部辅助函数 --- */\n\n/** 彻底销毁容器 */\nconst destroy = () => {\n if (container) {\n render(null, container)\n document.body.removeChild(container)\n container = null\n }\n}\n\n/** 离开动画结束后的清理 */\nconst handleClosed = (key: string) => {\n activeCount--\n\n const cb = closedCallbacks.get(key)\n if (cb) {\n cb(pendingActions.get(key) ?? 'cancel')\n closedCallbacks.delete(key)\n }\n pendingActions.delete(key)\n\n // 没有活跃确认框时销毁容器,保持页面干净\n if (activeCount === 0) destroy()\n}\n\n/** 触发关闭 (仅从数组移除,触发 Transition 离开动画) */\nconst handleClose = (key: string, action: MessageConfirmAction) => {\n pendingActions.set(key, action)\n const index = confirms.findIndex((c) => c.key === key)\n if (index !== -1) confirms.splice(index, 1)\n}\n\n/** 挂载并渲染容器 */\nconst ensureContainer = () => {\n if (container) return container\n\n container = document.createElement('div')\n container.className = cls.e('container')\n document.body.appendChild(container)\n return container\n}\n\n/** 执行 Vue 渲染逻辑 */\nconst updateView = () => {\n const el = ensureContainer()\n\n const vnode = h(UMessageConfirmBox, { confirms, onClosed: handleClosed, onClose: handleClose })\n\n vnode.appContext = messageConfirm._context\n render(vnode, el)\n}\n\n/** 创建确认框实例 */\nconst createConfirm = (options: MessageConfirmOptions): MessageConfirmInstance => {\n const { onClosed: userOnClosed, ...confirmOptions } = options\n const id = `confirm_${uid++}`\n activeCount++\n\n // 生命周期 Promise\n let resolveClosed: (action: MessageConfirmAction) => void\n const onClosed = new Promise<MessageConfirmAction>((r) => (resolveClosed = r))\n\n closedCallbacks.set(id, (action) => {\n userOnClosed?.(action)\n resolveClosed(action)\n })\n\n confirms.push({ zIndex: zIndex(), ...confirmOptions, key: id })\n updateView()\n\n return { id, close: (action = 'cancel') => handleClose(id, action), onClosed }\n}\n\n/** --- 导出 API --- */\n\nexport const messageConfirm = ((options) => {\n return createConfirm(typeof options === 'string' ? { message: options } : options)\n}) as MessageConfirm\n\nmessageConfirm._context = null\n\n// 挂载快捷方法: messageConfirm.danger(...)\nconst confirmTypes = ['primary', 'success', 'info', 'warning', 'danger'] as const\nconfirmTypes.forEach((type) => {\n messageConfirm[type] = (msg, config) =>\n messageConfirm({ ...config, message: msg, confirmButtonType: type })\n})\n\n/** 关闭所有当前显示的确认框 */\nmessageConfirm.closeAll = () => {\n confirms.splice(0)\n}\n"],"mappings":";;;;AAWA,MAAM,MAAM,IAAI,iBAAiB;;AAMjC,IAAI,YAAgC;AACpC,MAAM,WAAW,gBAA+B,CAAC,CAAC;;AAGlD,MAAM,kCAAkB,IAAI,IAAoD;;AAGhF,MAAM,iCAAiB,IAAI,IAAkC;;AAG7D,IAAI,cAAc;AAClB,IAAI,MAAM;;;AAKV,MAAM,gBAAgB;CACpB,IAAI,WAAW;EACb,OAAO,MAAM,SAAS;EACtB,SAAS,KAAK,YAAY,SAAS;EACnC,YAAY;CACd;AACF;;AAGA,MAAM,gBAAgB,QAAgB;CACpC;CAEA,MAAM,KAAK,gBAAgB,IAAI,GAAG;CAClC,IAAI,IAAI;EACN,GAAG,eAAe,IAAI,GAAG,KAAK,QAAQ;EACtC,gBAAgB,OAAO,GAAG;CAC5B;CACA,eAAe,OAAO,GAAG;CAGzB,IAAI,gBAAgB,GAAG,QAAQ;AACjC;;AAGA,MAAM,eAAe,KAAa,WAAiC;CACjE,eAAe,IAAI,KAAK,MAAM;CAC9B,MAAM,QAAQ,SAAS,WAAW,MAAM,EAAE,QAAQ,GAAG;CACrD,IAAI,UAAU,IAAI,SAAS,OAAO,OAAO,CAAC;AAC5C;;AAGA,MAAM,wBAAwB;CAC5B,IAAI,WAAW,OAAO;CAEtB,YAAY,SAAS,cAAc,KAAK;CACxC,UAAU,YAAY,IAAI,EAAE,WAAW;CACvC,SAAS,KAAK,YAAY,SAAS;CACnC,OAAO;AACT;;AAGA,MAAM,mBAAmB;CACvB,MAAM,KAAK,gBAAgB;CAE3B,MAAM,QAAQ,EAAEA,WAAoB;EAAE;EAAU,UAAU;EAAc,SAAS;CAAY,CAAC;CAE9F,MAAM,aAAa,eAAe;CAClC,OAAO,OAAO,EAAE;AAClB;;AAGA,MAAM,iBAAiB,YAA2D;CAChF,MAAM,EAAE,UAAU,cAAc,GAAG,mBAAmB;CACtD,MAAM,KAAK,WAAW;CACtB;CAGA,IAAI;CACJ,MAAM,WAAW,IAAI,SAA+B,MAAO,gBAAgB,CAAE;CAE7E,gBAAgB,IAAI,KAAK,WAAW;EAClC,eAAe,MAAM;EACrB,cAAc,MAAM;CACtB,CAAC;CAED,SAAS,KAAK;EAAE,QAAQ,OAAO;EAAG,GAAG;EAAgB,KAAK;CAAG,CAAC;CAC9D,WAAW;CAEX,OAAO;EAAE;EAAI,QAAQ,SAAS,aAAa,YAAY,IAAI,MAAM;EAAG;CAAS;AAC/E;;AAIA,MAAa,mBAAmB,YAAY;CAC1C,OAAO,cAAc,OAAO,YAAY,WAAW,EAAE,SAAS,QAAQ,IAAI,OAAO;AACnF;AAEA,eAAe,WAAW;AAI1B;CADsB;CAAW;CAAW;CAAQ;CAAW;AACpD,CAAC,CAAC,SAAS,SAAS;CAC7B,eAAe,SAAS,KAAK,WAC3B,eAAe;EAAE,GAAG;EAAQ,SAAS;EAAK,mBAAmB;CAAK,CAAC;AACvE,CAAC;;AAGD,eAAe,iBAAiB;CAC9B,SAAS,OAAO,CAAC;AACnB"}
1
+ {"version":3,"file":"message-confirm2.js","names":["UMessageConfirmBox"],"sources":["../../../src/components/message-confirm/message-confirm.ts"],"sourcesContent":["import { bem, setStyles, zIndex } from '@veltra/utils'\nimport { h, render, shallowReactive } from 'vue'\n\nimport type {\n MessageConfirm,\n MessageConfirmAction,\n MessageConfirmInstance,\n MessageConfirmOptions\n} from '../../types'\nimport UMessageConfirmBox from './message-confirm-box.vue'\n\nconst cls = bem('message-confirm')\n\n/** 确认框项数据结构 */\ntype ConfirmItem = MessageConfirmOptions & { key: string }\n\n/** --- 状态管理 --- */\nlet container: HTMLElement | null = null\nconst confirms = shallowReactive<ConfirmItem[]>([])\n\n/** 关闭动画结束后的回调 */\nconst closedCallbacks = new Map<string, (action: MessageConfirmAction) => void>()\n\n/** 记录每项关闭时的用户操作,动画结束后随回调抛出 */\nconst pendingActions = new Map<string, MessageConfirmAction>()\n\n/** 用于计数正在显示的 DOM 节点 (包含动画执行中) */\nlet activeCount = 0\nlet uid = 0\n\n/** --- 内部辅助函数 --- */\n\n/** 彻底销毁容器 */\nconst destroy = () => {\n if (container) {\n render(null, container)\n document.body.removeChild(container)\n container = null\n }\n}\n\n/** 离开动画结束后的清理 */\nconst handleClosed = (key: string) => {\n activeCount--\n\n const cb = closedCallbacks.get(key)\n if (cb) {\n cb(pendingActions.get(key) ?? 'cancel')\n closedCallbacks.delete(key)\n }\n pendingActions.delete(key)\n\n // 没有活跃确认框时销毁容器,保持页面干净\n if (activeCount === 0) destroy()\n}\n\n/** 触发关闭 (仅从数组移除,触发 Transition 离开动画) */\nconst handleClose = (key: string, action: MessageConfirmAction) => {\n pendingActions.set(key, action)\n const index = confirms.findIndex((c) => c.key === key)\n if (index !== -1) confirms.splice(index, 1)\n}\n\n/** 挂载并渲染容器 */\nconst ensureContainer = () => {\n if (container) return container\n\n container = document.createElement('div')\n container.className = cls.e('container')\n document.body.appendChild(container)\n return container\n}\n\n/** 执行 Vue 渲染逻辑 */\nconst updateView = (layer: number) => {\n const el = ensureContainer()\n setStyles(el, { zIndex: layer })\n\n const vnode = h(UMessageConfirmBox, { confirms, onClosed: handleClosed, onClose: handleClose })\n\n vnode.appContext = messageConfirm._context\n render(vnode, el)\n}\n\n/** 创建确认框实例 */\nconst createConfirm = (options: MessageConfirmOptions): MessageConfirmInstance => {\n const { onClosed: userOnClosed, ...confirmOptions } = options\n const id = `confirm_${uid++}`\n activeCount++\n\n // 生命周期 Promise\n let resolveClosed: (action: MessageConfirmAction) => void\n const onClosed = new Promise<MessageConfirmAction>((r) => (resolveClosed = r))\n\n closedCallbacks.set(id, (action) => {\n userOnClosed?.(action)\n resolveClosed(action)\n })\n\n const layer = confirmOptions.zIndex ?? zIndex()\n confirms.push({ ...confirmOptions, zIndex: layer, key: id })\n updateView(layer)\n\n return { id, close: (action = 'cancel') => handleClose(id, action), onClosed }\n}\n\n/** --- 导出 API --- */\n\nexport const messageConfirm = ((options) => {\n return createConfirm(typeof options === 'string' ? { message: options } : options)\n}) as MessageConfirm\n\nmessageConfirm._context = null\n\n// 挂载快捷方法: messageConfirm.danger(...)\nconst confirmTypes = ['primary', 'success', 'info', 'warning', 'danger'] as const\nconfirmTypes.forEach((type) => {\n messageConfirm[type] = (msg, config) =>\n messageConfirm({ ...config, message: msg, confirmButtonType: type })\n})\n\n/** 关闭所有当前显示的确认框 */\nmessageConfirm.closeAll = () => {\n confirms.splice(0)\n}\n"],"mappings":";;;;AAWA,MAAM,MAAM,IAAI,iBAAiB;;AAMjC,IAAI,YAAgC;AACpC,MAAM,WAAW,gBAA+B,CAAC,CAAC;;AAGlD,MAAM,kCAAkB,IAAI,IAAoD;;AAGhF,MAAM,iCAAiB,IAAI,IAAkC;;AAG7D,IAAI,cAAc;AAClB,IAAI,MAAM;;;AAKV,MAAM,gBAAgB;CACpB,IAAI,WAAW;EACb,OAAO,MAAM,SAAS;EACtB,SAAS,KAAK,YAAY,SAAS;EACnC,YAAY;CACd;AACF;;AAGA,MAAM,gBAAgB,QAAgB;CACpC;CAEA,MAAM,KAAK,gBAAgB,IAAI,GAAG;CAClC,IAAI,IAAI;EACN,GAAG,eAAe,IAAI,GAAG,KAAK,QAAQ;EACtC,gBAAgB,OAAO,GAAG;CAC5B;CACA,eAAe,OAAO,GAAG;CAGzB,IAAI,gBAAgB,GAAG,QAAQ;AACjC;;AAGA,MAAM,eAAe,KAAa,WAAiC;CACjE,eAAe,IAAI,KAAK,MAAM;CAC9B,MAAM,QAAQ,SAAS,WAAW,MAAM,EAAE,QAAQ,GAAG;CACrD,IAAI,UAAU,IAAI,SAAS,OAAO,OAAO,CAAC;AAC5C;;AAGA,MAAM,wBAAwB;CAC5B,IAAI,WAAW,OAAO;CAEtB,YAAY,SAAS,cAAc,KAAK;CACxC,UAAU,YAAY,IAAI,EAAE,WAAW;CACvC,SAAS,KAAK,YAAY,SAAS;CACnC,OAAO;AACT;;AAGA,MAAM,cAAc,UAAkB;CACpC,MAAM,KAAK,gBAAgB;CAC3B,UAAU,IAAI,EAAE,QAAQ,MAAM,CAAC;CAE/B,MAAM,QAAQ,EAAEA,WAAoB;EAAE;EAAU,UAAU;EAAc,SAAS;CAAY,CAAC;CAE9F,MAAM,aAAa,eAAe;CAClC,OAAO,OAAO,EAAE;AAClB;;AAGA,MAAM,iBAAiB,YAA2D;CAChF,MAAM,EAAE,UAAU,cAAc,GAAG,mBAAmB;CACtD,MAAM,KAAK,WAAW;CACtB;CAGA,IAAI;CACJ,MAAM,WAAW,IAAI,SAA+B,MAAO,gBAAgB,CAAE;CAE7E,gBAAgB,IAAI,KAAK,WAAW;EAClC,eAAe,MAAM;EACrB,cAAc,MAAM;CACtB,CAAC;CAED,MAAM,QAAQ,eAAe,UAAU,OAAO;CAC9C,SAAS,KAAK;EAAE,GAAG;EAAgB,QAAQ;EAAO,KAAK;CAAG,CAAC;CAC3D,WAAW,KAAK;CAEhB,OAAO;EAAE;EAAI,QAAQ,SAAS,aAAa,YAAY,IAAI,MAAM;EAAG;CAAS;AAC/E;;AAIA,MAAa,mBAAmB,YAAY;CAC1C,OAAO,cAAc,OAAO,YAAY,WAAW,EAAE,SAAS,QAAQ,IAAI,OAAO;AACnF;AAEA,eAAe,WAAW;AAI1B;CADsB;CAAW;CAAW;CAAQ;CAAW;AACpD,CAAC,CAAC,SAAS,SAAS;CAC7B,eAAe,SAAS,KAAK,WAC3B,eAAe;EAAE,GAAG;EAAQ,SAAS;EAAK,mBAAmB;CAAK,CAAC;AACvE,CAAC;;AAGD,eAAe,iBAAiB;CAC9B,SAAS,OAAO,CAAC;AACnB"}
@@ -16,8 +16,14 @@
16
16
  */
17
17
  /** 暗色:data-theme 与系统偏好,与 UITheme.injectBuiltInThemes 选择器策略一致 */
18
18
  .u-message-confirm {
19
+ position: fixed;
20
+ inset: 0;
19
21
  transition: opacity var(--u-transition-normal) var(--u-transition-ease);
20
22
  }
23
+ .u-message-confirm__container {
24
+ position: fixed;
25
+ inset: 0;
26
+ }
21
27
  .u-message-confirm__mask {
22
28
  background-color: rgba(0, 0, 0, 0.32);
23
29
  position: fixed;
@@ -32,6 +38,7 @@
32
38
  transition: opacity var(--u-transition-normal) var(--u-transition-ease);
33
39
  }
34
40
  .u-message-confirm__box {
41
+ position: relative;
35
42
  width: 420px;
36
43
  background-color: var(--u-bg-color-top);
37
44
  border: var(--u-border);