foucui 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -0
- package/components/QiuAffix/index.vue +186 -0
- package/components/QiuAlert/index.vue +208 -0
- package/components/QiuAnchor/context.ts +18 -0
- package/components/QiuAnchor/index.vue +180 -0
- package/components/QiuAnchorLink/index.vue +67 -0
- package/components/QiuApp/index.vue +9 -0
- package/components/QiuAutocomplete/index.vue +408 -0
- package/components/QiuAvatar/index.vue +140 -0
- package/components/QiuBacktop/index.vue +121 -0
- package/components/QiuBadge/api/index.ts +389 -0
- package/components/QiuBadge/components/BadgeImagePickerDialog.vue +243 -0
- package/components/QiuBadge/components/BadgeLibraryManagerDialog.vue +30 -0
- package/components/QiuBadge/components/BadgeLibraryPanel.vue +182 -0
- package/components/QiuBadge/composables/useTableHostHeight.ts +53 -0
- package/components/QiuBadge/index.ts +18 -0
- package/components/QiuBadge/shared/BadgeTemplateRenderer.vue +32 -0
- package/components/QiuBadge/shared/assetUrl.ts +26 -0
- package/components/QiuBadge/shared/badgeTemplate.ts +309 -0
- package/components/QiuBadge/utils/chinaAreaData.ts +44 -0
- package/components/QiuBadge/utils/hostRegion.ts +22 -0
- package/components/QiuBadge/utils/pca-code.json +1 -0
- package/components/QiuBadge/utils/pdfFromElement.ts +348 -0
- package/components/QiuBadge/views/BadgeLibraryView.vue +32 -0
- package/components/QiuBadge/views/BadgeManageView.vue +1364 -0
- package/components/QiuBadge/views/BadgeTemplateEditorView.vue +10 -0
- package/components/QiuBadge/views/BadgeTemplateListView.vue +229 -0
- package/components/QiuBadge/views/DeskLabelTemplateListView.vue +227 -0
- package/components/QiuBadge/views/DeskLabelView.vue +683 -0
- package/components/QiuBadgeDot/index.vue +87 -0
- package/components/QiuButton/index.vue +247 -0
- package/components/QiuButtonGroup/index.vue +63 -0
- package/components/QiuCanvasKit/QiuCanvasEditor.vue +5503 -0
- package/components/QiuCanvasKit/QiuCanvasRenderer.vue +348 -0
- package/components/QiuCanvasKit/assetUrl.ts +11 -0
- package/components/QiuCanvasKit/components/DataModulesPanel.vue +352 -0
- package/components/QiuCanvasKit/export/html.ts +132 -0
- package/components/QiuCanvasKit/export/pdf.ts +48 -0
- package/components/QiuCanvasKit/export/png.ts +50 -0
- package/components/QiuCanvasKit/index.ts +20 -0
- package/components/QiuCanvasKit/modules/badgeCompat.ts +84 -0
- package/components/QiuCanvasKit/modules/dataRegistry.ts +207 -0
- package/components/QiuCanvasKit/modules/merge.ts +71 -0
- package/components/QiuCanvasKit/presets/badge.ts +67 -0
- package/components/QiuCanvasKit/presets/banner.ts +79 -0
- package/components/QiuCanvasKit/types.ts +138 -0
- package/components/QiuCard/index.vue +104 -0
- package/components/QiuCarousel/context.ts +16 -0
- package/components/QiuCarousel/index.vue +343 -0
- package/components/QiuCarouselItem/index.vue +47 -0
- package/components/QiuCascader/index.vue +879 -0
- package/components/QiuCascader/types.ts +48 -0
- package/components/QiuCheckbox/QiuCheckboxGroup.vue +78 -0
- package/components/QiuCheckbox/index.vue +231 -0
- package/components/QiuCheckbox/types.ts +8 -0
- package/components/QiuCode/index.vue +64 -0
- package/components/QiuCol/col.scss +55 -0
- package/components/QiuCol/index.vue +64 -0
- package/components/QiuCollapse/context.ts +10 -0
- package/components/QiuCollapse/index.vue +70 -0
- package/components/QiuCollapseItem/index.vue +167 -0
- package/components/QiuColorField/index.vue +296 -0
- package/components/QiuColorPicker/README.md +118 -0
- package/components/QiuColorPicker/index.vue +60 -0
- package/components/QiuColorfulCard/index.vue +101 -0
- package/components/QiuCombobox/index.vue +277 -0
- package/components/QiuConfigProvider/index.vue +31 -0
- package/components/QiuContextMenu/index.vue +209 -0
- package/components/QiuDate/index.vue +1134 -0
- package/components/QiuDescriptions/context.ts +20 -0
- package/components/QiuDescriptions/index.vue +115 -0
- package/components/QiuDescriptionsItem/index.vue +103 -0
- package/components/QiuDialog/index.vue +828 -0
- package/components/QiuDigitalCard/index.vue +159 -0
- package/components/QiuDivider/index.vue +185 -0
- package/components/QiuDot/index.vue +83 -0
- package/components/QiuDrawer/index.vue +350 -0
- package/components/QiuDropdown/QiuDropdownItem.vue +74 -0
- package/components/QiuDropdown/QiuDropdownMenu.vue +22 -0
- package/components/QiuDropdown/context.ts +9 -0
- package/components/QiuDropdown/index.vue +189 -0
- package/components/QiuEmpty/index.vue +73 -0
- package/components/QiuForm/index.vue +172 -0
- package/components/QiuForm/types.ts +39 -0
- package/components/QiuFormItem/index.vue +276 -0
- package/components/QiuFullscreen/index.vue +11 -0
- package/components/QiuGrid/index.vue +408 -0
- package/components/QiuHoverCard/index.vue +192 -0
- package/components/QiuIcon/index.vue +117 -0
- package/components/QiuIconPicker/iconify.libraries.ts +182 -0
- package/components/QiuIconPicker/icons.catalog.ts +3072 -0
- package/components/QiuIconPicker/index.vue +488 -0
- package/components/QiuImage/index.vue +177 -0
- package/components/QiuInput/index.vue +328 -0
- package/components/QiuInputNumber/index.vue +295 -0
- package/components/QiuInputOtp/index.vue +190 -0
- package/components/QiuKbd/index.vue +57 -0
- package/components/QiuLayoutContainer/index.vue +50 -0
- package/components/QiuLinkPreview/index.vue +224 -0
- package/components/QiuLoading/index.ts +176 -0
- package/components/QiuLoading/spinner.vue +820 -0
- package/components/QiuLoading/types.ts +44 -0
- package/components/QiuMention/index.vue +299 -0
- package/components/QiuMenu/QiuMenuRoot.vue +241 -0
- package/components/QiuMenu/components/QiuMenuItem.vue +340 -0
- package/components/QiuMenu/components/QiuSubMenu.vue +504 -0
- package/components/QiuMenu/context.ts +21 -0
- package/components/QiuMenu/index.vue +43 -0
- package/components/QiuMenuNav/QiuMenuNavItem.vue +100 -0
- package/components/QiuMenuNav/QiuMenuNavSub.vue +120 -0
- package/components/QiuMenuNav/context.ts +14 -0
- package/components/QiuMenuNav/index.vue +148 -0
- package/components/QiuMsg/QiuMsgItem.vue +180 -0
- package/components/QiuMsg/index.ts +158 -0
- package/components/QiuMsg/types.ts +23 -0
- package/components/QiuMsgBox/index.ts +147 -0
- package/components/QiuNotification/QiuNotificationItem.vue +168 -0
- package/components/QiuNotification/index.ts +155 -0
- package/components/QiuNotification/types.ts +14 -0
- package/components/QiuPage/index.vue +12 -0
- package/components/QiuPageHeader/index.vue +115 -0
- package/components/QiuPageMain/index.vue +78 -0
- package/components/QiuPagination/index.vue +421 -0
- package/components/QiuPasswordStrength/index.vue +101 -0
- package/components/QiuPopconfirm/index.vue +196 -0
- package/components/QiuPopover/index.vue +277 -0
- package/components/QiuProgress/index.vue +235 -0
- package/components/QiuQrcode/index.vue +302 -0
- package/components/QiuQueryForm/components/QiuQueryFormBottomPanel.vue +13 -0
- package/components/QiuQueryForm/components/QiuQueryFormLeftPanel.vue +37 -0
- package/components/QiuQueryForm/components/QiuQueryFormRightPanel.vue +37 -0
- package/components/QiuQueryForm/components/QiuQueryFormTopPanel.vue +13 -0
- package/components/QiuQueryForm/index.vue +117 -0
- package/components/QiuRadio/QiuRadioGroup.vue +75 -0
- package/components/QiuRadio/index.vue +191 -0
- package/components/QiuRadio/types.ts +9 -0
- package/components/QiuRate/index.vue +184 -0
- package/components/QiuRefresh/index.vue +32 -0
- package/components/QiuResult/index.vue +103 -0
- package/components/QiuRow/index.vue +60 -0
- package/components/QiuRow/types.ts +5 -0
- package/components/QiuScrollbar/index.vue +107 -0
- package/components/QiuSearchBar/index.vue +154 -0
- package/components/QiuSegmented/index.vue +120 -0
- package/components/QiuSelect/QiuOption.vue +93 -0
- package/components/QiuSelect/index.vue +452 -0
- package/components/QiuSelect/types.ts +15 -0
- package/components/QiuSkeleton/index.vue +78 -0
- package/components/QiuSlider/index.vue +266 -0
- package/components/QiuSpace/index.vue +95 -0
- package/components/QiuSparkline/index.vue +92 -0
- package/components/QiuStatistic/index.vue +4 -0
- package/components/QiuStatistics/index.vue +123 -0
- package/components/QiuStep/index.vue +220 -0
- package/components/QiuSteps/context.ts +25 -0
- package/components/QiuSteps/index.vue +84 -0
- package/components/QiuSwitch/index.vue +145 -0
- package/components/QiuTabBar/index.vue +218 -0
- package/components/QiuTabBar/types.ts +19 -0
- package/components/QiuTabPane/index.vue +82 -0
- package/components/QiuTable/columns.ts +16 -0
- package/components/QiuTable/export.ts +102 -0
- package/components/QiuTable/index.ts +24 -0
- package/components/QiuTable/index.vue +3503 -0
- package/components/QiuTable/registry.ts +75 -0
- package/components/QiuTable/styles/table.scss +1230 -0
- package/components/QiuTable/types.ts +413 -0
- package/components/QiuTable/useArea.ts +202 -0
- package/components/QiuTable/useColumns.ts +325 -0
- package/components/QiuTable/useEdit.ts +136 -0
- package/components/QiuTable/useExtras.ts +115 -0
- package/components/QiuTable/useHistory.ts +77 -0
- package/components/QiuTable/useMerge.ts +105 -0
- package/components/QiuTable/useResize.ts +86 -0
- package/components/QiuTable/useScrollSync.ts +152 -0
- package/components/QiuTable/useVirtual.ts +97 -0
- package/components/QiuTable/utils.ts +165 -0
- package/components/QiuTableColumn/index.vue +101 -0
- package/components/QiuTag/index.vue +143 -0
- package/components/QiuText/index.vue +99 -0
- package/components/QiuTime/index.vue +548 -0
- package/components/QiuTimeAgo/index.vue +103 -0
- package/components/QiuTimeline/index.vue +54 -0
- package/components/QiuTimelineItem/index.vue +140 -0
- package/components/QiuTips/index.vue +323 -0
- package/components/QiuTooltip/index.vue +237 -0
- package/components/QiuTransfer/index.vue +277 -0
- package/components/QiuTree/QiuTreeNode.vue +146 -0
- package/components/QiuTree/index.vue +143 -0
- package/components/QiuTree/types.ts +30 -0
- package/components/QiuTreeSelect/index.vue +259 -0
- package/components/QiuTrend/index.vue +92 -0
- package/components/QiuUpload/index.vue +628 -0
- package/components/QiuUploadCrop/index.vue +1267 -0
- package/components/QiuWatermark/index.vue +121 -0
- package/components/useBodyScrollLock.ts +28 -0
- package/dist/components/QiuAnchor/context.d.ts +15 -0
- package/dist/components/QiuAnchorLink/index.vue.d.ts +23 -0
- package/dist/components/QiuBadge/api/index.d.ts +110 -0
- package/dist/components/QiuBadge/components/BadgeImagePickerDialog.vue.d.ts +16 -0
- package/dist/components/QiuBadge/components/BadgeLibraryManagerDialog.vue.d.ts +9 -0
- package/dist/components/QiuBadge/components/BadgeLibraryPanel.vue.d.ts +5 -0
- package/dist/components/QiuBadge/composables/useTableHostHeight.d.ts +7 -0
- package/dist/components/QiuBadge/index.d.ts +18 -0
- package/dist/components/QiuBadge/shared/BadgeTemplateRenderer.vue.d.ts +14 -0
- package/dist/components/QiuBadge/shared/assetUrl.d.ts +1 -0
- package/dist/components/QiuBadge/shared/badgeTemplate.d.ts +132 -0
- package/dist/components/QiuBadge/utils/chinaAreaData.d.ts +9 -0
- package/dist/components/QiuBadge/utils/hostRegion.d.ts +3 -0
- package/dist/components/QiuBadge/utils/pca-code.json.d.ts +3 -0
- package/dist/components/QiuBadge/utils/pdfFromElement.d.ts +14 -0
- package/dist/components/QiuBadge/views/BadgeLibraryView.vue.d.ts +2 -0
- package/dist/components/QiuBadge/views/BadgeManageView.vue.d.ts +7 -0
- package/dist/components/QiuBadge/views/BadgeTemplateListView.vue.d.ts +4 -0
- package/dist/components/QiuBadge/views/DeskLabelTemplateListView.vue.d.ts +4 -0
- package/dist/components/QiuBadge/views/DeskLabelView.vue.d.ts +4 -0
- package/dist/components/QiuButton/index.vue.d.ts +52 -0
- package/dist/components/QiuCanvasKit/QiuCanvasEditor.vue.d.ts +24 -0
- package/dist/components/QiuCanvasKit/QiuCanvasRenderer.vue.d.ts +13 -0
- package/dist/components/QiuCanvasKit/assetUrl.d.ts +7 -0
- package/dist/components/QiuCanvasKit/components/DataModulesPanel.vue.d.ts +23 -0
- package/dist/components/QiuCanvasKit/export/html.d.ts +12 -0
- package/dist/components/QiuCanvasKit/export/pdf.d.ts +9 -0
- package/dist/components/QiuCanvasKit/export/png.d.ts +8 -0
- package/dist/components/QiuCanvasKit/index.d.ts +19 -0
- package/dist/components/QiuCanvasKit/modules/badgeCompat.d.ts +8 -0
- package/dist/components/QiuCanvasKit/modules/dataRegistry.d.ts +23 -0
- package/dist/components/QiuCanvasKit/modules/merge.d.ts +12 -0
- package/dist/components/QiuCanvasKit/presets/badge.d.ts +12 -0
- package/dist/components/QiuCanvasKit/presets/banner.d.ts +4 -0
- package/dist/components/QiuCanvasKit/types.d.ts +119 -0
- package/dist/components/QiuCarousel/context.d.ts +13 -0
- package/dist/components/QiuCarouselItem/index.vue.d.ts +20 -0
- package/dist/components/QiuCascader/types.d.ts +25 -0
- package/dist/components/QiuCheckbox/QiuCheckboxGroup.vue.d.ts +33 -0
- package/dist/components/QiuCheckbox/index.vue.d.ts +38 -0
- package/dist/components/QiuCheckbox/types.d.ts +7 -0
- package/dist/components/QiuCode/index.vue.d.ts +15 -0
- package/dist/components/QiuCollapse/context.d.ts +8 -0
- package/dist/components/QiuCollapseItem/index.vue.d.ts +30 -0
- package/dist/components/QiuColorField/index.vue.d.ts +23 -0
- package/dist/components/QiuColorPicker/index.vue.d.ts +21 -0
- package/dist/components/QiuCombobox/index.vue.d.ts +54 -0
- package/dist/components/QiuContextMenu/index.vue.d.ts +46 -0
- package/dist/components/QiuDescriptions/context.d.ts +16 -0
- package/dist/components/QiuDescriptionsItem/index.vue.d.ts +25 -0
- package/dist/components/QiuDigitalCard/index.vue.d.ts +45 -0
- package/dist/components/QiuDropdown/QiuDropdownItem.vue.d.ts +30 -0
- package/dist/components/QiuDropdown/QiuDropdownMenu.vue.d.ts +17 -0
- package/dist/components/QiuDropdown/context.d.ts +7 -0
- package/dist/components/QiuDropdown/index.vue.d.ts +46 -0
- package/dist/components/QiuForm/types.d.ts +31 -0
- package/dist/components/QiuHoverCard/index.vue.d.ts +44 -0
- package/dist/components/QiuIcon/index.vue.d.ts +18 -0
- package/dist/components/QiuIconPicker/iconify.libraries.d.ts +18 -0
- package/dist/components/QiuIconPicker/icons.catalog.d.ts +12 -0
- package/dist/components/QiuInput/index.vue.d.ts +71 -0
- package/dist/components/QiuInputNumber/index.vue.d.ts +38 -0
- package/dist/components/QiuInputOtp/index.vue.d.ts +28 -0
- package/dist/components/QiuKbd/index.vue.d.ts +22 -0
- package/dist/components/QiuLayoutContainer/index.vue.d.ts +29 -0
- package/dist/components/QiuLinkPreview/index.vue.d.ts +43 -0
- package/dist/components/QiuLoading/index.d.ts +26 -0
- package/dist/components/QiuLoading/spinner.vue.d.ts +14 -0
- package/dist/components/QiuLoading/types.d.ts +2 -0
- package/dist/components/QiuMention/index.vue.d.ts +35 -0
- package/dist/components/QiuMenu/QiuMenuRoot.vue.d.ts +36 -0
- package/dist/components/QiuMenu/context.d.ts +19 -0
- package/dist/components/QiuMenuNav/QiuMenuNavItem.vue.d.ts +26 -0
- package/dist/components/QiuMenuNav/QiuMenuNavSub.vue.d.ts +25 -0
- package/dist/components/QiuMenuNav/context.d.ts +12 -0
- package/dist/components/QiuMenuNav/index.vue.d.ts +35 -0
- package/dist/components/QiuMsg/QiuMsgItem.vue.d.ts +15 -0
- package/dist/components/QiuMsg/index.d.ts +30 -0
- package/dist/components/QiuMsg/types.d.ts +12 -0
- package/dist/components/QiuMsgBox/index.d.ts +14 -0
- package/dist/components/QiuNotification/QiuNotificationItem.vue.d.ts +16 -0
- package/dist/components/QiuNotification/index.d.ts +30 -0
- package/dist/components/QiuNotification/types.d.ts +12 -0
- package/dist/components/QiuPageMain/index.vue.d.ts +27 -0
- package/dist/components/QiuPagination/index.vue.d.ts +44 -0
- package/dist/components/QiuPasswordStrength/index.vue.d.ts +9 -0
- package/dist/components/QiuQrcode/index.vue.d.ts +20 -0
- package/dist/components/QiuRadio/QiuRadioGroup.vue.d.ts +33 -0
- package/dist/components/QiuRadio/types.d.ts +8 -0
- package/dist/components/QiuRow/types.d.ts +4 -0
- package/dist/components/QiuSearchBar/index.vue.d.ts +38 -0
- package/dist/components/QiuSelect/QiuOption.vue.d.ts +24 -0
- package/dist/components/QiuSelect/index.vue.d.ts +52 -0
- package/dist/components/QiuSelect/types.d.ts +13 -0
- package/dist/components/QiuSparkline/index.vue.d.ts +18 -0
- package/dist/components/QiuStep/index.vue.d.ts +31 -0
- package/dist/components/QiuSteps/context.d.ts +21 -0
- package/dist/components/QiuSwitch/index.vue.d.ts +25 -0
- package/dist/components/QiuTabBar/index.vue.d.ts +32 -0
- package/dist/components/QiuTabBar/types.d.ts +16 -0
- package/dist/components/QiuTabPane/index.vue.d.ts +25 -0
- package/dist/components/QiuTable/columns.d.ts +1 -0
- package/dist/components/QiuTable/export.d.ts +18 -0
- package/dist/components/QiuTable/index.d.ts +3 -0
- package/dist/components/QiuTable/index.vue.d.ts +322 -0
- package/dist/components/QiuTable/registry.d.ts +39 -0
- package/dist/components/QiuTable/types.d.ts +353 -0
- package/dist/components/QiuTable/useArea.d.ts +51 -0
- package/dist/components/QiuTable/useColumns.d.ts +67 -0
- package/dist/components/QiuTable/useEdit.d.ts +36 -0
- package/dist/components/QiuTable/useExtras.d.ts +38 -0
- package/dist/components/QiuTable/useHistory.d.ts +44 -0
- package/dist/components/QiuTable/useMerge.d.ts +28 -0
- package/dist/components/QiuTable/useResize.d.ts +19 -0
- package/dist/components/QiuTable/useScrollSync.d.ts +25 -0
- package/dist/components/QiuTable/useVirtual.d.ts +30 -0
- package/dist/components/QiuTable/utils.d.ts +54 -0
- package/dist/components/QiuTime/index.vue.d.ts +43 -0
- package/dist/components/QiuTimeAgo/index.vue.d.ts +35 -0
- package/dist/components/QiuTimelineItem/index.vue.d.ts +35 -0
- package/dist/components/QiuTooltip/index.vue.d.ts +38 -0
- package/dist/components/QiuTree/types.d.ts +13 -0
- package/dist/components/QiuTrend/index.vue.d.ts +34 -0
- package/dist/components/QiuUpload/index.vue.d.ts +86 -0
- package/dist/components/QiuUploadCrop/index.vue.d.ts +136 -0
- package/dist/components/useBodyScrollLock.d.ts +4 -0
- package/dist/foucui.css +1 -0
- package/dist/foucui.js +26509 -0
- package/dist/foucui.umd.cjs +125 -0
- package/dist/index.d.ts +46 -0
- package/dist/src/bridge/@/api/media.d.ts +7 -0
- package/dist/src/bridge/@/api/notice.d.ts +5 -0
- package/dist/src/bridge/@/config/index.d.ts +29 -0
- package/dist/src/bridge/@/config/media.config.d.ts +15 -0
- package/dist/src/bridge/@/config/security.config.d.ts +7 -0
- package/dist/src/bridge/@/i18n/index.d.ts +7 -0
- package/dist/src/bridge/@/store/modules/bing.d.ts +3 -0
- package/dist/src/bridge/@/store/modules/errorLog.d.ts +3 -0
- package/dist/src/bridge/@/store/modules/media.d.ts +4 -0
- package/dist/src/bridge/@/store/modules/routes.d.ts +3 -0
- package/dist/src/bridge/@/store/modules/settings.d.ts +3 -0
- package/dist/src/bridge/@/store/modules/tabs.d.ts +3 -0
- package/dist/src/bridge/@/store/modules/user.d.ts +3 -0
- package/dist/src/bridge/@/utils/convertToCamelCase.d.ts +2 -0
- package/dist/src/bridge/@/utils/index.d.ts +5 -0
- package/dist/src/bridge/@/utils/pageTitle.d.ts +1 -0
- package/dist/src/bridge/@/utils/routes.d.ts +11 -0
- package/dist/src/bridge/@/utils/validate.d.ts +13 -0
- package/dist/src/bridge/@qiu/plugins/shortcuts.d.ts +2 -0
- package/dist/src/i18n.d.ts +2 -0
- package/package.json +83 -0
- package/plugins/qiu.ts +83 -0
- package/plugins/shortcuts.ts +69 -0
- package/src/bridge/@/api/media.ts +8 -0
- package/src/bridge/@/api/notice.ts +5 -0
- package/src/bridge/@/config/index.ts +38 -0
- package/src/bridge/@/config/media.config.ts +37 -0
- package/src/bridge/@/config/security.config.ts +8 -0
- package/src/bridge/@/i18n/index.ts +6 -0
- package/src/bridge/@/store/modules/bing.ts +9 -0
- package/src/bridge/@/store/modules/errorLog.ts +9 -0
- package/src/bridge/@/store/modules/media.ts +10 -0
- package/src/bridge/@/store/modules/routes.ts +10 -0
- package/src/bridge/@/store/modules/settings.ts +9 -0
- package/src/bridge/@/store/modules/tabs.ts +9 -0
- package/src/bridge/@/store/modules/user.ts +9 -0
- package/src/bridge/@/utils/convertToCamelCase.ts +11 -0
- package/src/bridge/@/utils/index.ts +9 -0
- package/src/bridge/@/utils/pageTitle.ts +4 -0
- package/src/bridge/@/utils/routes.ts +14 -0
- package/src/bridge/@/utils/validate.ts +17 -0
- package/src/bridge/@qiu/plugins/shortcuts.ts +3 -0
- package/src/i18n.ts +8 -0
- package/src/icons/qiu-logo.svg +1 -0
- package/styles/dark.scss +194 -0
- package/styles/normalize.css +349 -0
- package/styles/plain.scss +423 -0
- package/styles/qiu-tokens.scss +40 -0
- package/styles/qiu.scss +1149 -0
- package/styles/technology.scss +452 -0
- package/styles/var.scss +382 -0
- package/styles/variables.scss +77 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div ref="rootRef" class="qiu-watermark">
|
|
3
|
+
<div class="qiu-watermark__layer" :style="layerStyle" aria-hidden="true" />
|
|
4
|
+
<div class="qiu-watermark__content">
|
|
5
|
+
<slot />
|
|
6
|
+
</div>
|
|
7
|
+
</div>
|
|
8
|
+
</template>
|
|
9
|
+
|
|
10
|
+
<script lang="ts" setup>
|
|
11
|
+
defineOptions({ name: 'QiuWatermark' })
|
|
12
|
+
|
|
13
|
+
const props = withDefaults(
|
|
14
|
+
defineProps<{
|
|
15
|
+
content?: string | string[]
|
|
16
|
+
font?: {
|
|
17
|
+
color?: string
|
|
18
|
+
fontSize?: number
|
|
19
|
+
fontFamily?: string
|
|
20
|
+
fontWeight?: string | number
|
|
21
|
+
}
|
|
22
|
+
gap?: [number, number]
|
|
23
|
+
rotate?: number
|
|
24
|
+
zIndex?: number
|
|
25
|
+
offset?: [number, number]
|
|
26
|
+
}>(),
|
|
27
|
+
{
|
|
28
|
+
content: '',
|
|
29
|
+
font: () => ({
|
|
30
|
+
color: 'rgba(0,0,0,0.12)',
|
|
31
|
+
fontSize: 16,
|
|
32
|
+
fontFamily: 'sans-serif',
|
|
33
|
+
fontWeight: 'normal',
|
|
34
|
+
}),
|
|
35
|
+
gap: () => [100, 100],
|
|
36
|
+
rotate: -22,
|
|
37
|
+
zIndex: 9,
|
|
38
|
+
offset: () => [0, 0],
|
|
39
|
+
}
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
const rootRef = ref<HTMLElement | null>(null)
|
|
43
|
+
const bgUrl = ref('')
|
|
44
|
+
|
|
45
|
+
const lines = computed(() => {
|
|
46
|
+
if (Array.isArray(props.content)) return props.content
|
|
47
|
+
return props.content ? [props.content] : []
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
const buildWatermark = () => {
|
|
51
|
+
if (!lines.value.length) {
|
|
52
|
+
bgUrl.value = ''
|
|
53
|
+
return
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const [gapX, gapY] = props.gap
|
|
57
|
+
const [offsetX, offsetY] = props.offset
|
|
58
|
+
const font = props.font
|
|
59
|
+
const canvas = document.createElement('canvas')
|
|
60
|
+
const ctx = canvas.getContext('2d')
|
|
61
|
+
if (!ctx) return
|
|
62
|
+
|
|
63
|
+
const fontSize = font.fontSize ?? 16
|
|
64
|
+
const fontFamily = font.fontFamily ?? 'sans-serif'
|
|
65
|
+
const fontWeight = font.fontWeight ?? 'normal'
|
|
66
|
+
ctx.font = `${fontWeight} ${fontSize}px ${fontFamily}`
|
|
67
|
+
|
|
68
|
+
const maxWidth = Math.max(...lines.value.map((l) => ctx.measureText(l).width))
|
|
69
|
+
const lineHeight = fontSize * 1.4
|
|
70
|
+
const textHeight = lines.value.length * lineHeight
|
|
71
|
+
|
|
72
|
+
canvas.width = gapX + maxWidth + 20
|
|
73
|
+
canvas.height = gapY + textHeight + 20
|
|
74
|
+
|
|
75
|
+
ctx.clearRect(0, 0, canvas.width, canvas.height)
|
|
76
|
+
ctx.translate(canvas.width / 2 + offsetX, canvas.height / 2 + offsetY)
|
|
77
|
+
ctx.rotate((props.rotate * Math.PI) / 180)
|
|
78
|
+
ctx.fillStyle = font.color ?? 'rgba(0,0,0,0.12)'
|
|
79
|
+
ctx.font = `${fontWeight} ${fontSize}px ${fontFamily}`
|
|
80
|
+
ctx.textAlign = 'center'
|
|
81
|
+
ctx.textBaseline = 'middle'
|
|
82
|
+
|
|
83
|
+
const startY = -((lines.value.length - 1) * lineHeight) / 2
|
|
84
|
+
lines.value.forEach((line, i) => {
|
|
85
|
+
ctx.fillText(line, 0, startY + i * lineHeight)
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
bgUrl.value = canvas.toDataURL()
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const layerStyle = computed(() => ({
|
|
92
|
+
zIndex: String(props.zIndex),
|
|
93
|
+
backgroundImage: bgUrl.value ? `url(${bgUrl.value})` : undefined,
|
|
94
|
+
}))
|
|
95
|
+
|
|
96
|
+
watch(
|
|
97
|
+
() => [props.content, props.gap, props.rotate, props.font, props.offset],
|
|
98
|
+
() => buildWatermark(),
|
|
99
|
+
{ deep: true, immediate: true }
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
onMounted(() => buildWatermark())
|
|
103
|
+
</script>
|
|
104
|
+
|
|
105
|
+
<style lang="scss" scoped>
|
|
106
|
+
.qiu-watermark {
|
|
107
|
+
position: relative;
|
|
108
|
+
|
|
109
|
+
&__layer {
|
|
110
|
+
position: absolute;
|
|
111
|
+
inset: 0;
|
|
112
|
+
pointer-events: none;
|
|
113
|
+
background-repeat: repeat;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
&__content {
|
|
117
|
+
position: relative;
|
|
118
|
+
z-index: 1;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
</style>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 共享的 body 滚动锁:使用引用计数,保证 Drawer / Dialog 等多实例同时打开时,
|
|
3
|
+
* 仅当最后一个实例关闭后才真正释放 body 滚动,避免「关闭一个弹层背景就滚动」的问题。
|
|
4
|
+
* 同时仅在 body 之前没有自定义 overflow 时才接管,关闭时恢复原值。
|
|
5
|
+
*/
|
|
6
|
+
let lockCount = 0
|
|
7
|
+
let prevOverflow = ''
|
|
8
|
+
|
|
9
|
+
export function useBodyScrollLock() {
|
|
10
|
+
const lock = () => {
|
|
11
|
+
if (lockCount === 0) {
|
|
12
|
+
prevOverflow = document.body.style.overflow
|
|
13
|
+
document.body.style.overflow = 'hidden'
|
|
14
|
+
}
|
|
15
|
+
lockCount += 1
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const unlock = () => {
|
|
19
|
+
if (lockCount === 0) return
|
|
20
|
+
lockCount -= 1
|
|
21
|
+
if (lockCount === 0) {
|
|
22
|
+
document.body.style.overflow = prevOverflow
|
|
23
|
+
prevOverflow = ''
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return { lock, unlock }
|
|
28
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { InjectionKey, Ref } from 'vue';
|
|
2
|
+
export interface QiuAnchorLinkRecord {
|
|
3
|
+
href: string;
|
|
4
|
+
title: string;
|
|
5
|
+
el: HTMLElement | null;
|
|
6
|
+
}
|
|
7
|
+
export interface QiuAnchorContext {
|
|
8
|
+
offset: Ref<number>;
|
|
9
|
+
bound: Ref<string>;
|
|
10
|
+
activeLink: Ref<string>;
|
|
11
|
+
registerLink: (link: QiuAnchorLinkRecord) => void;
|
|
12
|
+
unregisterLink: (href: string) => void;
|
|
13
|
+
scrollToLink: (href: string) => void;
|
|
14
|
+
}
|
|
15
|
+
export declare const QIU_ANCHOR_KEY: InjectionKey<QiuAnchorContext>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
href: string;
|
|
3
|
+
title?: string;
|
|
4
|
+
};
|
|
5
|
+
declare function __VLS_template(): {
|
|
6
|
+
attrs: Partial<{}>;
|
|
7
|
+
slots: {
|
|
8
|
+
default?(_: {}): any;
|
|
9
|
+
};
|
|
10
|
+
refs: {};
|
|
11
|
+
rootEl: HTMLAnchorElement;
|
|
12
|
+
};
|
|
13
|
+
type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
|
|
14
|
+
declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
15
|
+
title: string;
|
|
16
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLAnchorElement>;
|
|
17
|
+
declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
|
|
18
|
+
export default _default;
|
|
19
|
+
type __VLS_WithTemplateSlots<T, S> = T & {
|
|
20
|
+
new (): {
|
|
21
|
+
$slots: S;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { BadgeTemplateDoc } from '../shared/badgeTemplate';
|
|
2
|
+
type ApiOk<T> = {
|
|
3
|
+
code: number;
|
|
4
|
+
data: T;
|
|
5
|
+
msg?: string;
|
|
6
|
+
};
|
|
7
|
+
export interface BadgeTemplateRow {
|
|
8
|
+
id: number;
|
|
9
|
+
competition_id: number;
|
|
10
|
+
name: string;
|
|
11
|
+
width_mm: number;
|
|
12
|
+
height_mm: number;
|
|
13
|
+
is_default: boolean;
|
|
14
|
+
update_time: string;
|
|
15
|
+
doc?: BadgeTemplateDoc | null;
|
|
16
|
+
default_test_json?: Record<string, unknown> | null;
|
|
17
|
+
kind?: 'badge' | 'desk';
|
|
18
|
+
}
|
|
19
|
+
export interface BadgeLibraryImage {
|
|
20
|
+
id: number;
|
|
21
|
+
url: string;
|
|
22
|
+
name: string;
|
|
23
|
+
create_time: string;
|
|
24
|
+
}
|
|
25
|
+
/** —— competition / template —— */
|
|
26
|
+
export declare const getCompetitions: (params?: any) => Promise<ApiOk<{
|
|
27
|
+
list: any[];
|
|
28
|
+
total: number;
|
|
29
|
+
page: number;
|
|
30
|
+
page_size: number;
|
|
31
|
+
}>>;
|
|
32
|
+
export declare const getCompetition: (id: number) => Promise<ApiOk<any>>;
|
|
33
|
+
export declare const listBadgeTemplates: (competitionId: number) => Promise<ApiOk<{
|
|
34
|
+
list: BadgeTemplateRow[];
|
|
35
|
+
}>>;
|
|
36
|
+
export declare const createBadgeTemplate: (competitionId: number, data: {
|
|
37
|
+
name: string;
|
|
38
|
+
}) => Promise<ApiOk<BadgeTemplateRow>>;
|
|
39
|
+
export declare const getBadgeTemplateOne: (competitionId: number, templateId: number) => Promise<ApiOk<any>>;
|
|
40
|
+
export declare const getBadgeTemplate: (competitionId: number) => Promise<ApiOk<any>>;
|
|
41
|
+
export declare const putBadgeTemplateOne: (competitionId: number, templateId: number, data: Record<string, unknown>) => Promise<ApiOk<any>>;
|
|
42
|
+
export declare const deleteBadgeTemplate: (competitionId: number, templateId: number) => Promise<ApiOk<boolean>>;
|
|
43
|
+
export declare const setDefaultBadgeTemplate: (competitionId: number, templateId: number) => Promise<ApiOk<boolean>>;
|
|
44
|
+
/** desk label templates */
|
|
45
|
+
export declare const listDeskLabelTemplates: (competitionId: number) => Promise<ApiOk<{
|
|
46
|
+
list: BadgeTemplateRow[];
|
|
47
|
+
}>>;
|
|
48
|
+
export declare const createDeskLabelTemplate: (competitionId: number, data: {
|
|
49
|
+
name: string;
|
|
50
|
+
}) => Promise<ApiOk<BadgeTemplateRow>>;
|
|
51
|
+
export declare const getDeskLabelTemplateOne: (competitionId: number, templateId: number) => Promise<ApiOk<any>>;
|
|
52
|
+
export declare const getDeskLabelTemplate: (competitionId: number) => Promise<ApiOk<any>>;
|
|
53
|
+
export declare const putDeskLabelTemplateOne: (competitionId: number, templateId: number, data: Record<string, unknown>) => Promise<ApiOk<any>>;
|
|
54
|
+
export declare const deleteDeskLabelTemplate: (competitionId: number, templateId: number) => Promise<ApiOk<boolean>>;
|
|
55
|
+
export declare const setDefaultDeskLabelTemplate: (competitionId: number, templateId: number) => Promise<ApiOk<boolean>>;
|
|
56
|
+
/** —— upload / library —— */
|
|
57
|
+
export declare const getBadgeLibraryImages: (params?: {
|
|
58
|
+
page?: number;
|
|
59
|
+
page_size?: number;
|
|
60
|
+
}) => Promise<ApiOk<{
|
|
61
|
+
list: BadgeLibraryImage[];
|
|
62
|
+
total: number;
|
|
63
|
+
page: number;
|
|
64
|
+
page_size: number;
|
|
65
|
+
}>>;
|
|
66
|
+
export declare const uploadBadgeLibraryImage: (file: File) => Promise<ApiOk<BadgeLibraryImage>>;
|
|
67
|
+
export declare const deleteBadgeLibraryImage: (id: number) => Promise<ApiOk<boolean>>;
|
|
68
|
+
/** —— student / print data stubs —— */
|
|
69
|
+
export declare const getBadgeSchools: (_competitionId: number) => Promise<ApiOk<{
|
|
70
|
+
id: number;
|
|
71
|
+
name: string;
|
|
72
|
+
short_name: string;
|
|
73
|
+
}[]>>;
|
|
74
|
+
export declare const getBadges: (_competitionId: number, _params?: any) => Promise<ApiOk<{
|
|
75
|
+
list: {
|
|
76
|
+
id: number;
|
|
77
|
+
student_name: string;
|
|
78
|
+
competition_no: string;
|
|
79
|
+
school_name: string;
|
|
80
|
+
age_group: string;
|
|
81
|
+
competition_room: string;
|
|
82
|
+
seat_no: string;
|
|
83
|
+
}[];
|
|
84
|
+
total: number;
|
|
85
|
+
}>>;
|
|
86
|
+
export declare const getBadgesExportData: (competitionId: number, params?: any) => Promise<ApiOk<{
|
|
87
|
+
list: {
|
|
88
|
+
id: number;
|
|
89
|
+
student_name: string;
|
|
90
|
+
competition_no: string;
|
|
91
|
+
school_name: string;
|
|
92
|
+
age_group: string;
|
|
93
|
+
competition_room: string;
|
|
94
|
+
seat_no: string;
|
|
95
|
+
}[];
|
|
96
|
+
total: number;
|
|
97
|
+
}>>;
|
|
98
|
+
export declare const getStudents: (_competitionId: number, _params?: any) => Promise<ApiOk<{
|
|
99
|
+
list: any[];
|
|
100
|
+
total: number;
|
|
101
|
+
}>>;
|
|
102
|
+
export declare const finalizeSeatAssignmentLock: (_competitionId: number, _data?: any) => Promise<ApiOk<boolean>>;
|
|
103
|
+
export declare const getDeskLabels: (_competitionId: number) => Promise<ApiOk<{
|
|
104
|
+
id: number;
|
|
105
|
+
competition_room: string;
|
|
106
|
+
seat_no: string;
|
|
107
|
+
student_name: string;
|
|
108
|
+
school_name: string;
|
|
109
|
+
}[]>>;
|
|
110
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
modelValue: boolean;
|
|
3
|
+
defaultTab?: 'lib' | 'up';
|
|
4
|
+
};
|
|
5
|
+
declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
6
|
+
"update:modelValue": (args_0: boolean) => any;
|
|
7
|
+
pick: (args_0: string) => any;
|
|
8
|
+
}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
9
|
+
"onUpdate:modelValue"?: (args_0: boolean) => any;
|
|
10
|
+
onPick?: (args_0: string) => any;
|
|
11
|
+
}>, {
|
|
12
|
+
defaultTab: "lib" | "up";
|
|
13
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
|
|
14
|
+
fileInputRef: HTMLInputElement;
|
|
15
|
+
}, any>;
|
|
16
|
+
export default _default;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
modelValue: boolean;
|
|
3
|
+
};
|
|
4
|
+
declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
5
|
+
"update:modelValue": (args_0: boolean) => any;
|
|
6
|
+
}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
7
|
+
"onUpdate:modelValue"?: (args_0: boolean) => any;
|
|
8
|
+
}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
9
|
+
export default _default;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
declare function load(): Promise<void>;
|
|
2
|
+
declare const _default: import('vue').DefineComponent<{}, {
|
|
3
|
+
load: typeof load;
|
|
4
|
+
}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
|
|
5
|
+
export default _default;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** 测量容器高度供 qiu-table 的 `height` 使用,使表格占满剩余区域。
|
|
2
|
+
* 使用 ResizeObserver(宿主为表格外层 div,非表格根节点)+ window resize,避免仅靠窗口尺寸遗漏侧栏折叠等变化。 */
|
|
3
|
+
export declare function useTableHostHeight(minHeight?: number): {
|
|
4
|
+
hostRef: globalThis.Ref<HTMLElement, HTMLElement>;
|
|
5
|
+
tableHeight: globalThis.Ref<number, number>;
|
|
6
|
+
recalcTableHeight: () => void;
|
|
7
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QiuBadge — 证件 / 桌签制作插件
|
|
3
|
+
* 源码迁自 zhihui web-admin + shared,先落地再调。
|
|
4
|
+
*/
|
|
5
|
+
/** 编辑器真源在 QiuCanvasKit;此入口保持兼容 */
|
|
6
|
+
export { default as QiuBadgeTemplateEditor } from '../QiuCanvasKit/QiuCanvasEditor.vue';
|
|
7
|
+
export { default as QiuBadgeTemplateList } from './views/BadgeTemplateListView.vue';
|
|
8
|
+
export { default as QiuBadgeManage } from './views/BadgeManageView.vue';
|
|
9
|
+
export { default as QiuBadgeLibrary } from './views/BadgeLibraryView.vue';
|
|
10
|
+
export { default as QiuDeskLabel } from './views/DeskLabelView.vue';
|
|
11
|
+
export { default as QiuDeskLabelTemplateList } from './views/DeskLabelTemplateListView.vue';
|
|
12
|
+
export { default as QiuBadgeTemplateRenderer } from './shared/BadgeTemplateRenderer.vue';
|
|
13
|
+
export { default as QiuBadgeImagePickerDialog } from './components/BadgeImagePickerDialog.vue';
|
|
14
|
+
export { default as QiuBadgeLibraryManagerDialog } from './components/BadgeLibraryManagerDialog.vue';
|
|
15
|
+
export { default as QiuBadgeLibraryPanel } from './components/BadgeLibraryPanel.vue';
|
|
16
|
+
export * from './shared/badgeTemplate';
|
|
17
|
+
export * from './shared/assetUrl';
|
|
18
|
+
export * as QiuBadgeApi from './api/index';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { BadgeTemplateDoc } from './badgeTemplate';
|
|
2
|
+
import { MergeContext } from '../../QiuCanvasKit/types';
|
|
3
|
+
type __VLS_Props = {
|
|
4
|
+
doc: BadgeTemplateDoc | null;
|
|
5
|
+
mergeData?: MergeContext | Record<string, string>;
|
|
6
|
+
screenScale?: number;
|
|
7
|
+
enableLinks?: boolean;
|
|
8
|
+
};
|
|
9
|
+
declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
10
|
+
mergeData: MergeContext | Record<string, string>;
|
|
11
|
+
screenScale: number;
|
|
12
|
+
enableLinks: boolean;
|
|
13
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
14
|
+
export default _default;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function resolveAssetUrl(src: string | null | undefined): string;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/** 与后端 BadgeData 及 allowedBadgePlaceholderKeys 一致 */
|
|
2
|
+
export declare const BADGE_PLACEHOLDER_KEYS: readonly ["competition_name", "student_name", "competition_no", "school_name", "school_short_name", "age_group", "competition_room", "seat_no", "floor", "teacher_name", "date", "session", "enroll_teacher_name", "teacher_phone", "signup_teacher_name", "signup_teacher_phone", "signup_teacher_department", "signup_teacher_position", "signup_teacher_id_card", "signup_teacher_email", "signup_teacher_username", "venue_name", "venue_address", "competition_daily_start", "competition_daily_end"];
|
|
3
|
+
export type BadgePlaceholderKey = (typeof BADGE_PLACEHOLDER_KEYS)[number];
|
|
4
|
+
export declare const BADGE_PLACEHOLDER_LABELS: Record<string, string>;
|
|
5
|
+
export interface BadgeTemplateCanvas {
|
|
6
|
+
widthMm: number;
|
|
7
|
+
heightMm: number;
|
|
8
|
+
background?: string;
|
|
9
|
+
backgroundImage?: string;
|
|
10
|
+
/** 是否绘制画布边框(编辑/预览/打印一致) */
|
|
11
|
+
showBorder?: boolean;
|
|
12
|
+
borderColor?: string;
|
|
13
|
+
/** 边框宽度(mm) */
|
|
14
|
+
borderWidthMm?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface BadgeCanvasRegion {
|
|
17
|
+
id: string;
|
|
18
|
+
name: string;
|
|
19
|
+
xMm: number;
|
|
20
|
+
yMm: number;
|
|
21
|
+
wMm: number;
|
|
22
|
+
hMm: number;
|
|
23
|
+
background?: string;
|
|
24
|
+
backgroundImage?: string;
|
|
25
|
+
}
|
|
26
|
+
/** 元素跳转链接(Banner 热区 / 按钮形态) */
|
|
27
|
+
export type BadgeElementLink = {
|
|
28
|
+
href: string;
|
|
29
|
+
target?: '_blank' | '_self';
|
|
30
|
+
};
|
|
31
|
+
export interface BadgeTextElement {
|
|
32
|
+
id: string;
|
|
33
|
+
type: 'text';
|
|
34
|
+
zIndex: number;
|
|
35
|
+
xMm: number;
|
|
36
|
+
yMm: number;
|
|
37
|
+
wMm: number;
|
|
38
|
+
hMm: number;
|
|
39
|
+
rotation?: number;
|
|
40
|
+
flipX?: boolean;
|
|
41
|
+
flipY?: boolean;
|
|
42
|
+
groupId?: string;
|
|
43
|
+
regionId?: string;
|
|
44
|
+
align?: string;
|
|
45
|
+
text: string;
|
|
46
|
+
fontSize: number;
|
|
47
|
+
fontFamily: string;
|
|
48
|
+
color: string;
|
|
49
|
+
textDirection?: 'horizontal' | 'vertical';
|
|
50
|
+
link?: BadgeElementLink;
|
|
51
|
+
}
|
|
52
|
+
export interface BadgeImageElement {
|
|
53
|
+
id: string;
|
|
54
|
+
type: 'image' | 'seal';
|
|
55
|
+
zIndex: number;
|
|
56
|
+
xMm: number;
|
|
57
|
+
yMm: number;
|
|
58
|
+
wMm: number;
|
|
59
|
+
hMm: number;
|
|
60
|
+
rotation?: number;
|
|
61
|
+
flipX?: boolean;
|
|
62
|
+
flipY?: boolean;
|
|
63
|
+
groupId?: string;
|
|
64
|
+
regionId?: string;
|
|
65
|
+
align?: string;
|
|
66
|
+
src: string;
|
|
67
|
+
clipboardSource?: 'clipboard';
|
|
68
|
+
clipboardUploadState?: 'pending' | 'uploaded';
|
|
69
|
+
clipboardUploadKey?: string;
|
|
70
|
+
clipboardImageId?: number;
|
|
71
|
+
clipboardOrigName?: string;
|
|
72
|
+
link?: BadgeElementLink;
|
|
73
|
+
}
|
|
74
|
+
export interface BadgeShapeElement {
|
|
75
|
+
id: string;
|
|
76
|
+
type: 'shape';
|
|
77
|
+
shape: 'rect' | 'circle' | 'triangle' | 'line' | 'polygon' | 'trapezoid';
|
|
78
|
+
zIndex: number;
|
|
79
|
+
xMm: number;
|
|
80
|
+
yMm: number;
|
|
81
|
+
wMm: number;
|
|
82
|
+
hMm: number;
|
|
83
|
+
rotation?: number;
|
|
84
|
+
flipX?: boolean;
|
|
85
|
+
flipY?: boolean;
|
|
86
|
+
groupId?: string;
|
|
87
|
+
regionId?: string;
|
|
88
|
+
background?: string;
|
|
89
|
+
lockAspectRatio?: boolean;
|
|
90
|
+
showStroke?: boolean;
|
|
91
|
+
strokeColor?: string;
|
|
92
|
+
strokeWidthMm?: number;
|
|
93
|
+
opacity?: number;
|
|
94
|
+
polygonSides?: number;
|
|
95
|
+
link?: BadgeElementLink;
|
|
96
|
+
}
|
|
97
|
+
export type BadgeElement = BadgeTextElement | BadgeImageElement | BadgeShapeElement;
|
|
98
|
+
export interface BadgeGuideLine {
|
|
99
|
+
id: string;
|
|
100
|
+
axis: 'horizontal' | 'vertical';
|
|
101
|
+
offsetMm: number;
|
|
102
|
+
}
|
|
103
|
+
export interface BadgeTemplateDoc {
|
|
104
|
+
version: number;
|
|
105
|
+
canvas: BadgeTemplateCanvas;
|
|
106
|
+
elements: BadgeElement[];
|
|
107
|
+
guides?: BadgeGuideLine[];
|
|
108
|
+
regions?: BadgeCanvasRegion[];
|
|
109
|
+
/** 可选:画布级数据模块(与 QiuCanvasKit 对齐) */
|
|
110
|
+
dataModules?: Array<{
|
|
111
|
+
id: string;
|
|
112
|
+
label: string;
|
|
113
|
+
fields: Array<{
|
|
114
|
+
key: string;
|
|
115
|
+
label: string;
|
|
116
|
+
type?: string;
|
|
117
|
+
}>;
|
|
118
|
+
sample?: Record<string, string>;
|
|
119
|
+
builtin?: boolean;
|
|
120
|
+
enabled?: boolean;
|
|
121
|
+
}>;
|
|
122
|
+
}
|
|
123
|
+
export declare function mergeBadgeText(text: string, data: Record<string, string>): string;
|
|
124
|
+
/** 将接口返回的一条证件(参赛证/工作证等)记录转为占位符合并表 */
|
|
125
|
+
export declare function flattenBadgeForMerge(b: Record<string, unknown>, competitionNameFallback?: string): Record<string, string>;
|
|
126
|
+
export declare function sortBadgeElements(els: BadgeElement[]): BadgeElement[];
|
|
127
|
+
/** 桌面贴模板可用占位符:与参赛证保持一致,实际值由 DeskLabels 接口尽量补齐 */
|
|
128
|
+
export declare const DESK_LABEL_PLACEHOLDER_KEYS: readonly ["competition_name", "student_name", "competition_no", "school_name", "school_short_name", "age_group", "competition_room", "seat_no", "floor", "teacher_name", "date", "session", "enroll_teacher_name", "teacher_phone", "signup_teacher_name", "signup_teacher_phone", "signup_teacher_department", "signup_teacher_position", "signup_teacher_id_card", "signup_teacher_email", "signup_teacher_username", "venue_name", "venue_address", "competition_daily_start", "competition_daily_end"];
|
|
129
|
+
export type DeskLabelPlaceholderKey = BadgePlaceholderKey;
|
|
130
|
+
export declare const DESK_LABEL_PLACEHOLDER_LABELS: Record<string, string>;
|
|
131
|
+
/** 单条桌面贴数据 → 与证件模板相同的合并表(未用字段留空,便于复用 BadgeTemplateRenderer) */
|
|
132
|
+
export declare function flattenDeskLabelForMerge(row: Record<string, unknown>, competitionNameFallback?: string): Record<string, string>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface ChinaAreaNode {
|
|
2
|
+
value: string;
|
|
3
|
+
label: string;
|
|
4
|
+
children?: ChinaAreaNode[];
|
|
5
|
+
}
|
|
6
|
+
/** 与 element-china-area-data 的 regionData 同形 */
|
|
7
|
+
export declare const regionData: ChinaAreaNode[];
|
|
8
|
+
/** code → 中文名 */
|
|
9
|
+
export declare const codeToText: Record<string, string>;
|