foucui 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/dist/components/QiuCanvasKit/QiuCanvasEditor.vue.d.ts +3 -1
  2. package/dist/components/QiuCanvasKit/components/DataModulesPanel.vue.d.ts +1 -0
  3. package/dist/components/QiuTable/index.vue.d.ts +12 -12
  4. package/dist/foucui.css +1 -1
  5. package/dist/foucui.js +7476 -7373
  6. package/dist/foucui.umd.cjs +19 -19
  7. package/package.json +23 -13
  8. package/components/QiuAffix/index.vue +0 -186
  9. package/components/QiuAlert/index.vue +0 -208
  10. package/components/QiuAnchor/context.ts +0 -18
  11. package/components/QiuAnchor/index.vue +0 -180
  12. package/components/QiuAnchorLink/index.vue +0 -67
  13. package/components/QiuApp/index.vue +0 -9
  14. package/components/QiuAutocomplete/index.vue +0 -408
  15. package/components/QiuAvatar/index.vue +0 -140
  16. package/components/QiuBacktop/index.vue +0 -121
  17. package/components/QiuBadge/api/index.ts +0 -389
  18. package/components/QiuBadge/components/BadgeImagePickerDialog.vue +0 -243
  19. package/components/QiuBadge/components/BadgeLibraryManagerDialog.vue +0 -30
  20. package/components/QiuBadge/components/BadgeLibraryPanel.vue +0 -182
  21. package/components/QiuBadge/composables/useTableHostHeight.ts +0 -53
  22. package/components/QiuBadge/index.ts +0 -18
  23. package/components/QiuBadge/shared/BadgeTemplateRenderer.vue +0 -32
  24. package/components/QiuBadge/shared/assetUrl.ts +0 -26
  25. package/components/QiuBadge/shared/badgeTemplate.ts +0 -309
  26. package/components/QiuBadge/utils/chinaAreaData.ts +0 -44
  27. package/components/QiuBadge/utils/hostRegion.ts +0 -22
  28. package/components/QiuBadge/utils/pca-code.json +0 -1
  29. package/components/QiuBadge/utils/pdfFromElement.ts +0 -348
  30. package/components/QiuBadge/views/BadgeLibraryView.vue +0 -32
  31. package/components/QiuBadge/views/BadgeManageView.vue +0 -1364
  32. package/components/QiuBadge/views/BadgeTemplateEditorView.vue +0 -10
  33. package/components/QiuBadge/views/BadgeTemplateListView.vue +0 -229
  34. package/components/QiuBadge/views/DeskLabelTemplateListView.vue +0 -227
  35. package/components/QiuBadge/views/DeskLabelView.vue +0 -683
  36. package/components/QiuBadgeDot/index.vue +0 -87
  37. package/components/QiuButton/index.vue +0 -247
  38. package/components/QiuButtonGroup/index.vue +0 -63
  39. package/components/QiuCanvasKit/QiuCanvasEditor.vue +0 -5503
  40. package/components/QiuCanvasKit/QiuCanvasRenderer.vue +0 -348
  41. package/components/QiuCanvasKit/assetUrl.ts +0 -11
  42. package/components/QiuCanvasKit/components/DataModulesPanel.vue +0 -352
  43. package/components/QiuCanvasKit/export/html.ts +0 -132
  44. package/components/QiuCanvasKit/export/pdf.ts +0 -48
  45. package/components/QiuCanvasKit/export/png.ts +0 -50
  46. package/components/QiuCanvasKit/index.ts +0 -20
  47. package/components/QiuCanvasKit/modules/badgeCompat.ts +0 -84
  48. package/components/QiuCanvasKit/modules/dataRegistry.ts +0 -207
  49. package/components/QiuCanvasKit/modules/merge.ts +0 -71
  50. package/components/QiuCanvasKit/presets/badge.ts +0 -67
  51. package/components/QiuCanvasKit/presets/banner.ts +0 -79
  52. package/components/QiuCanvasKit/types.ts +0 -138
  53. package/components/QiuCard/index.vue +0 -104
  54. package/components/QiuCarousel/context.ts +0 -16
  55. package/components/QiuCarousel/index.vue +0 -343
  56. package/components/QiuCarouselItem/index.vue +0 -47
  57. package/components/QiuCascader/index.vue +0 -879
  58. package/components/QiuCascader/types.ts +0 -48
  59. package/components/QiuCheckbox/QiuCheckboxGroup.vue +0 -78
  60. package/components/QiuCheckbox/index.vue +0 -231
  61. package/components/QiuCheckbox/types.ts +0 -8
  62. package/components/QiuCode/index.vue +0 -64
  63. package/components/QiuCol/col.scss +0 -55
  64. package/components/QiuCol/index.vue +0 -64
  65. package/components/QiuCollapse/context.ts +0 -10
  66. package/components/QiuCollapse/index.vue +0 -70
  67. package/components/QiuCollapseItem/index.vue +0 -167
  68. package/components/QiuColorField/index.vue +0 -296
  69. package/components/QiuColorPicker/README.md +0 -118
  70. package/components/QiuColorPicker/index.vue +0 -60
  71. package/components/QiuColorfulCard/index.vue +0 -101
  72. package/components/QiuCombobox/index.vue +0 -277
  73. package/components/QiuConfigProvider/index.vue +0 -31
  74. package/components/QiuContextMenu/index.vue +0 -209
  75. package/components/QiuDate/index.vue +0 -1134
  76. package/components/QiuDescriptions/context.ts +0 -20
  77. package/components/QiuDescriptions/index.vue +0 -115
  78. package/components/QiuDescriptionsItem/index.vue +0 -103
  79. package/components/QiuDialog/index.vue +0 -828
  80. package/components/QiuDigitalCard/index.vue +0 -159
  81. package/components/QiuDivider/index.vue +0 -185
  82. package/components/QiuDot/index.vue +0 -83
  83. package/components/QiuDrawer/index.vue +0 -350
  84. package/components/QiuDropdown/QiuDropdownItem.vue +0 -74
  85. package/components/QiuDropdown/QiuDropdownMenu.vue +0 -22
  86. package/components/QiuDropdown/context.ts +0 -9
  87. package/components/QiuDropdown/index.vue +0 -189
  88. package/components/QiuEmpty/index.vue +0 -73
  89. package/components/QiuForm/index.vue +0 -172
  90. package/components/QiuForm/types.ts +0 -39
  91. package/components/QiuFormItem/index.vue +0 -276
  92. package/components/QiuFullscreen/index.vue +0 -11
  93. package/components/QiuGrid/index.vue +0 -408
  94. package/components/QiuHoverCard/index.vue +0 -192
  95. package/components/QiuIcon/index.vue +0 -117
  96. package/components/QiuIconPicker/iconify.libraries.ts +0 -182
  97. package/components/QiuIconPicker/icons.catalog.ts +0 -3072
  98. package/components/QiuIconPicker/index.vue +0 -488
  99. package/components/QiuImage/index.vue +0 -177
  100. package/components/QiuInput/index.vue +0 -328
  101. package/components/QiuInputNumber/index.vue +0 -295
  102. package/components/QiuInputOtp/index.vue +0 -190
  103. package/components/QiuKbd/index.vue +0 -57
  104. package/components/QiuLayoutContainer/index.vue +0 -50
  105. package/components/QiuLinkPreview/index.vue +0 -224
  106. package/components/QiuLoading/index.ts +0 -176
  107. package/components/QiuLoading/spinner.vue +0 -820
  108. package/components/QiuLoading/types.ts +0 -44
  109. package/components/QiuMention/index.vue +0 -299
  110. package/components/QiuMenu/QiuMenuRoot.vue +0 -241
  111. package/components/QiuMenu/components/QiuMenuItem.vue +0 -340
  112. package/components/QiuMenu/components/QiuSubMenu.vue +0 -504
  113. package/components/QiuMenu/context.ts +0 -21
  114. package/components/QiuMenu/index.vue +0 -43
  115. package/components/QiuMenuNav/QiuMenuNavItem.vue +0 -100
  116. package/components/QiuMenuNav/QiuMenuNavSub.vue +0 -120
  117. package/components/QiuMenuNav/context.ts +0 -14
  118. package/components/QiuMenuNav/index.vue +0 -148
  119. package/components/QiuMsg/QiuMsgItem.vue +0 -180
  120. package/components/QiuMsg/index.ts +0 -158
  121. package/components/QiuMsg/types.ts +0 -23
  122. package/components/QiuMsgBox/index.ts +0 -147
  123. package/components/QiuNotification/QiuNotificationItem.vue +0 -168
  124. package/components/QiuNotification/index.ts +0 -155
  125. package/components/QiuNotification/types.ts +0 -14
  126. package/components/QiuPage/index.vue +0 -12
  127. package/components/QiuPageHeader/index.vue +0 -115
  128. package/components/QiuPageMain/index.vue +0 -78
  129. package/components/QiuPagination/index.vue +0 -421
  130. package/components/QiuPasswordStrength/index.vue +0 -101
  131. package/components/QiuPopconfirm/index.vue +0 -196
  132. package/components/QiuPopover/index.vue +0 -277
  133. package/components/QiuProgress/index.vue +0 -235
  134. package/components/QiuQrcode/index.vue +0 -302
  135. package/components/QiuQueryForm/components/QiuQueryFormBottomPanel.vue +0 -13
  136. package/components/QiuQueryForm/components/QiuQueryFormLeftPanel.vue +0 -37
  137. package/components/QiuQueryForm/components/QiuQueryFormRightPanel.vue +0 -37
  138. package/components/QiuQueryForm/components/QiuQueryFormTopPanel.vue +0 -13
  139. package/components/QiuQueryForm/index.vue +0 -117
  140. package/components/QiuRadio/QiuRadioGroup.vue +0 -75
  141. package/components/QiuRadio/index.vue +0 -191
  142. package/components/QiuRadio/types.ts +0 -9
  143. package/components/QiuRate/index.vue +0 -184
  144. package/components/QiuRefresh/index.vue +0 -32
  145. package/components/QiuResult/index.vue +0 -103
  146. package/components/QiuRow/index.vue +0 -60
  147. package/components/QiuRow/types.ts +0 -5
  148. package/components/QiuScrollbar/index.vue +0 -107
  149. package/components/QiuSearchBar/index.vue +0 -154
  150. package/components/QiuSegmented/index.vue +0 -120
  151. package/components/QiuSelect/QiuOption.vue +0 -93
  152. package/components/QiuSelect/index.vue +0 -452
  153. package/components/QiuSelect/types.ts +0 -15
  154. package/components/QiuSkeleton/index.vue +0 -78
  155. package/components/QiuSlider/index.vue +0 -266
  156. package/components/QiuSpace/index.vue +0 -95
  157. package/components/QiuSparkline/index.vue +0 -92
  158. package/components/QiuStatistic/index.vue +0 -4
  159. package/components/QiuStatistics/index.vue +0 -123
  160. package/components/QiuStep/index.vue +0 -220
  161. package/components/QiuSteps/context.ts +0 -25
  162. package/components/QiuSteps/index.vue +0 -84
  163. package/components/QiuSwitch/index.vue +0 -145
  164. package/components/QiuTabBar/index.vue +0 -218
  165. package/components/QiuTabBar/types.ts +0 -19
  166. package/components/QiuTabPane/index.vue +0 -82
  167. package/components/QiuTable/columns.ts +0 -16
  168. package/components/QiuTable/export.ts +0 -102
  169. package/components/QiuTable/index.ts +0 -24
  170. package/components/QiuTable/index.vue +0 -3503
  171. package/components/QiuTable/registry.ts +0 -75
  172. package/components/QiuTable/styles/table.scss +0 -1230
  173. package/components/QiuTable/types.ts +0 -413
  174. package/components/QiuTable/useArea.ts +0 -202
  175. package/components/QiuTable/useColumns.ts +0 -325
  176. package/components/QiuTable/useEdit.ts +0 -136
  177. package/components/QiuTable/useExtras.ts +0 -115
  178. package/components/QiuTable/useHistory.ts +0 -77
  179. package/components/QiuTable/useMerge.ts +0 -105
  180. package/components/QiuTable/useResize.ts +0 -86
  181. package/components/QiuTable/useScrollSync.ts +0 -152
  182. package/components/QiuTable/useVirtual.ts +0 -97
  183. package/components/QiuTable/utils.ts +0 -165
  184. package/components/QiuTableColumn/index.vue +0 -101
  185. package/components/QiuTag/index.vue +0 -143
  186. package/components/QiuText/index.vue +0 -99
  187. package/components/QiuTime/index.vue +0 -548
  188. package/components/QiuTimeAgo/index.vue +0 -103
  189. package/components/QiuTimeline/index.vue +0 -54
  190. package/components/QiuTimelineItem/index.vue +0 -140
  191. package/components/QiuTips/index.vue +0 -323
  192. package/components/QiuTooltip/index.vue +0 -237
  193. package/components/QiuTransfer/index.vue +0 -277
  194. package/components/QiuTree/QiuTreeNode.vue +0 -146
  195. package/components/QiuTree/index.vue +0 -143
  196. package/components/QiuTree/types.ts +0 -30
  197. package/components/QiuTreeSelect/index.vue +0 -259
  198. package/components/QiuTrend/index.vue +0 -92
  199. package/components/QiuUpload/index.vue +0 -628
  200. package/components/QiuUploadCrop/index.vue +0 -1267
  201. package/components/QiuWatermark/index.vue +0 -121
  202. package/components/useBodyScrollLock.ts +0 -28
  203. package/dist/components/QiuBadge/utils/pca-code.json.d.ts +0 -3
  204. package/plugins/qiu.ts +0 -83
  205. package/plugins/shortcuts.ts +0 -69
  206. package/src/bridge/@/api/media.ts +0 -8
  207. package/src/bridge/@/api/notice.ts +0 -5
  208. package/src/bridge/@/config/index.ts +0 -38
  209. package/src/bridge/@/config/media.config.ts +0 -37
  210. package/src/bridge/@/config/security.config.ts +0 -8
  211. package/src/bridge/@/i18n/index.ts +0 -6
  212. package/src/bridge/@/store/modules/bing.ts +0 -9
  213. package/src/bridge/@/store/modules/errorLog.ts +0 -9
  214. package/src/bridge/@/store/modules/media.ts +0 -10
  215. package/src/bridge/@/store/modules/routes.ts +0 -10
  216. package/src/bridge/@/store/modules/settings.ts +0 -9
  217. package/src/bridge/@/store/modules/tabs.ts +0 -9
  218. package/src/bridge/@/store/modules/user.ts +0 -9
  219. package/src/bridge/@/utils/convertToCamelCase.ts +0 -11
  220. package/src/bridge/@/utils/index.ts +0 -9
  221. package/src/bridge/@/utils/pageTitle.ts +0 -4
  222. package/src/bridge/@/utils/routes.ts +0 -14
  223. package/src/bridge/@/utils/validate.ts +0 -17
  224. package/src/bridge/@qiu/plugins/shortcuts.ts +0 -3
  225. package/src/i18n.ts +0 -8
  226. package/src/icons/qiu-logo.svg +0 -1
  227. package/styles/dark.scss +0 -194
  228. package/styles/normalize.css +0 -349
  229. package/styles/plain.scss +0 -423
  230. package/styles/qiu-tokens.scss +0 -40
  231. package/styles/qiu.scss +0 -1149
  232. package/styles/technology.scss +0 -452
  233. package/styles/var.scss +0 -382
  234. package/styles/variables.scss +0 -77
@@ -1,302 +0,0 @@
1
- <template>
2
- <div class="qiu-qrcode" :style="{ width: `${size}px`, height: `${size}px` }">
3
- <canvas ref="canvasRef" :width="size" :height="size" class="qiu-qrcode__canvas" />
4
- <div v-if="error" class="qiu-qrcode__error">生成失败</div>
5
- </div>
6
- </template>
7
-
8
- <script lang="ts" setup>
9
- import { onMounted, ref, watch } from 'vue'
10
-
11
- defineOptions({ name: 'QiuQrcode' })
12
-
13
- const props = withDefaults(
14
- defineProps<{
15
- value?: string
16
- size?: number
17
- /** 容错级别 L/M/Q/H */
18
- level?: 'L' | 'M' | 'Q' | 'H'
19
- fgColor?: string
20
- bgColor?: string
21
- margin?: number
22
- }>(),
23
- {
24
- value: '',
25
- size: 160,
26
- level: 'M',
27
- fgColor: '#000000',
28
- bgColor: '#ffffff',
29
- margin: 2,
30
- }
31
- )
32
-
33
- const canvasRef = ref<HTMLCanvasElement | null>(null)
34
- const error = ref(false)
35
-
36
- // 极简 QR 算法(基于数值技巧的 Reed-Solomon 容错),
37
- // 采用通用 QR 矩阵生成思路,覆盖常用版本与容错。
38
- const QR = (() => {
39
- // 基础常量
40
- const PAD0 = 0xec
41
- const PAD1 = 0x11
42
-
43
- const expTable = new Array(256)
44
- const logTable = new Array(256)
45
- let x = 1
46
- for (let i = 0; i < 255; i++) {
47
- expTable[i] = x
48
- logTable[x] = i
49
- x <<= 1
50
- if (x & 0x100) x ^= 0x11d
51
- }
52
-
53
- const gexp = (n: number) => expTable[(n % 255 + 255) % 255]
54
- const glog = (n: number) => logTable[n]
55
-
56
- const gmul = (a: number, b: number) => (a === 0 || b === 0 ? 0 : gexp(glog(a) + glog(b)))
57
-
58
- // 生成多项式系数
59
- const rsPoly = (ecLength: number) => {
60
- let poly = [1]
61
- for (let i = 0; i < ecLength; i++) {
62
- const next = new Array(poly.length + 1).fill(0)
63
- for (let j = 0; j < poly.length; j++) {
64
- next[j] ^= gmul(poly[j], 1)
65
- next[j + 1] ^= gmul(poly[j], gexp(i))
66
- }
67
- poly = next
68
- }
69
- return poly
70
- }
71
-
72
- // BCH 纠错位数
73
- const EC_CODEWORDS = [
74
- [7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
75
- [10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
76
- [13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
77
- [17, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
78
- ]
79
- // 仅支持 L/M/Q/H 在小版本:这里用预置表格(版本1-10 简化)
80
- const EC = {
81
- 1: { L: 7, M: 10, Q: 13, H: 17 },
82
- 2: { L: 10, M: 16, Q: 22, H: 28 },
83
- 3: { L: 15, M: 26, Q: 36, H: 44 },
84
- 4: { L: 20, M: 36, Q: 52, H: 64 },
85
- 5: { L: 26, M: 48, Q: 72, H: 86 },
86
- 6: { L: 36, M: 64, Q: 96, H: 112 },
87
- 7: { L: 40, M: 72, Q: 108, H: 130 },
88
- 8: { L: 48, M: 88, Q: 132, H: 156 },
89
- 9: { L: 60, M: 110, Q: 160, H: 192 },
90
- 10: { L: 72, M: 130, Q: 192, H: 224 },
91
- }
92
- const VERSION_SIZE = [
93
- 21, 25, 29, 33, 37, 41, 45, 49, 53, 57,
94
- ]
95
-
96
- const getBestVersion = (len: number, level: keyof typeof EC[1]) => {
97
- for (let v = 1; v <= 10; v++) {
98
- const capacity = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
99
- const cap8 = [17, 32, 53, 78, 106, 134, 154, 192, 230, 271][v - 1]
100
- if (cap8 >= len) return v
101
- }
102
- return 10
103
- }
104
-
105
- const build = (text: string, level: 'L' | 'M' | 'Q' | 'H') => {
106
- const bytes = new TextEncoder().encode(text)
107
- const version = getBestVersion(bytes.length, level)
108
- const size = VERSION_SIZE[version - 1]
109
- const ecCount = (EC as any)[version][level]
110
-
111
- // 数据码字:模式(字节=0100) + 长度(8bit) + 数据
112
- const dataBits: number[] = []
113
- const pushBits = (val: number, len: number) => {
114
- for (let i = len - 1; i >= 0; i--) dataBits.push((val >> i) & 1)
115
- }
116
- pushBits(4, 4) // byte mode
117
- pushBits(bytes.length, 8) // length (version<=9 用8bit)
118
- for (const b of bytes) pushBits(b, 8)
119
-
120
- const totalData = ((size - 17) * (size - 17) / 8) | 0 // 粗略
121
- const capacityBits = totalData * 8
122
- // terminator
123
- for (let i = 0; i < 4 && dataBits.length < capacityBits; i++) dataBits.push(0)
124
- while (dataBits.length % 8 !== 0) dataBits.push(0)
125
-
126
- const dataCodewords: number[] = []
127
- for (let i = 0; i < dataBits.length; i += 8) {
128
- let byte = 0
129
- for (let j = 0; j < 8; j++) byte = (byte << 1) | (dataBits[i + j] || 0)
130
- dataCodewords.push(byte)
131
- }
132
- const dataCapacity = Math.floor(capacityBits / 8)
133
- let p = dataCodewords.length
134
- let flip = true
135
- while (p < dataCapacity) {
136
- dataCodewords.push(flip ? PAD0 : PAD1)
137
- flip = !flip
138
- p++
139
- }
140
-
141
- // 纠错码字
142
- const gen = rsPoly(ecCount)
143
- const ec = new Array(ecCount).fill(0)
144
- for (const b of dataCodewords) {
145
- const factor = b ^ ec[0]
146
- ec.shift()
147
- ec.push(0)
148
- if (factor !== 0) {
149
- for (let i = 0; i < ecCount; i++) {
150
- ec[i] ^= gmul(gen[i + 1], factor)
151
- }
152
- }
153
- }
154
-
155
- const all = [...dataCodewords, ...ec]
156
-
157
- // 构造模块矩阵(含定位/时序/对齐的简化实现)
158
- const moduleCount = size
159
- const modules = Array.from({ length: moduleCount }, () => new Array(moduleCount).fill(null as boolean | null))
160
- // 是否需要让模块记录保留位
161
- const reserved = Array.from({ length: moduleCount }, () => new Array(moduleCount).fill(false))
162
-
163
- const set = (r: number, c: number, v: boolean, res = true) => {
164
- modules[r][c] = v
165
- if (res) reserved[r][c] = true
166
- }
167
-
168
- // 定位标记
169
- const placeFinder = (top: number, left: number) => {
170
- for (let r = -1; r <= 7; r++) {
171
- for (let c = -1; c <= 7; c++) {
172
- const rr = top + r
173
- const cc = left + c
174
- if (rr < 0 || rr >= moduleCount || cc < 0 || cc >= moduleCount) continue
175
- let v = false
176
- if (r >= 0 && r <= 6 && (c === 0 || c === 6)) v = true
177
- else if (c >= 0 && c <= 6 && (r === 0 || r === 6)) v = true
178
- else if (r >= 2 && r <= 4 && c >= 2 && c <= 4) v = true
179
- set(rr, cc, v, true)
180
- }
181
- }
182
- }
183
- placeFinder(0, 0)
184
- placeFinder(0, moduleCount - 7)
185
- placeFinder(moduleCount - 7, 0)
186
-
187
- // 时序图样
188
- for (let i = 8; i < moduleCount - 8; i++) {
189
- const v = i % 2 === 0
190
- if (!reserved[6][i]) set(6, i, v, true)
191
- if (!reserved[i][6]) set(i, 6, v, true)
192
- }
193
-
194
- // 对齐图案(版本2+ 简化放中心一个)
195
- if (version >= 2) {
196
- const pos = moduleCount - 7
197
- for (let r = -2; r <= 2; r++) {
198
- for (let c = -2; c <= 2; c++) {
199
- const rr = pos + r
200
- const cc = pos + c
201
- const v = Math.max(Math.abs(r), Math.abs(c)) !== 1
202
- if (!reserved[rr][cc]) set(rr, cc, v, true)
203
- }
204
- }
205
- }
206
-
207
- // 深色模块 + 格式预留(简化:固定格式位)
208
- set(8, 0, true, true)
209
- set(moduleCount - 8, 8, true, true)
210
-
211
- // 写入数据(之字形)
212
- let bitIndex = 0
213
- let direction = -1
214
- let row = moduleCount - 1
215
- let col = moduleCount - 1
216
- while (col > 0) {
217
- if (col === 6) col--
218
- while (row >= 0 && row < moduleCount) {
219
- for (let c = 0; c < 2; c++) {
220
- const cc = col - c
221
- if (!reserved[row][cc]) {
222
- let bit = false
223
- if (bitIndex < all.length * 8) {
224
- const byte = all[bitIndex >> 3]
225
- bit = ((byte >> (7 - (bitIndex & 7))) & 1) === 1
226
- bitIndex++
227
- }
228
- set(row, cc, bit, false)
229
- }
230
- }
231
- row += direction
232
- }
233
- direction = -direction
234
- row += direction
235
- col -= 2
236
- }
237
-
238
- return { size: moduleCount, modules }
239
- }
240
-
241
- return { build }
242
- })()
243
-
244
- const render = () => {
245
- error.value = false
246
- const canvas = canvasRef.value
247
- if (!canvas) return
248
- const ctx = canvas.getContext('2d')
249
- if (!ctx) return
250
- try {
251
- const { size, modules } = QR.build(props.value || ' ', props.level)
252
- const count = modules.length
253
- const cell = props.size / (count + props.margin * 2)
254
- ctx.fillStyle = props.bgColor
255
- ctx.fillRect(0, 0, props.size, props.size)
256
- ctx.fillStyle = props.fgColor
257
- for (let r = 0; r < count; r++) {
258
- for (let c = 0; c < count; c++) {
259
- if (modules[r][c]) {
260
- ctx.fillRect(
261
- Math.round(props.margin * cell + c * cell),
262
- Math.round(props.margin * cell + r * cell),
263
- Math.ceil(cell),
264
- Math.ceil(cell)
265
- )
266
- }
267
- }
268
- }
269
- } catch {
270
- error.value = true
271
- }
272
- }
273
-
274
- onMounted(render)
275
- watch(
276
- () => [props.value, props.size, props.level, props.fgColor, props.bgColor, props.margin],
277
- render
278
- )
279
- </script>
280
-
281
- <style lang="scss" scoped>
282
- .qiu-qrcode {
283
- position: relative;
284
- display: inline-block;
285
-
286
- &__canvas {
287
- display: block;
288
- border-radius: 4px;
289
- }
290
-
291
- &__error {
292
- position: absolute;
293
- inset: 0;
294
- display: flex;
295
- align-items: center;
296
- justify-content: center;
297
- font-size: 12px;
298
- color: var(--qiu-color-danger, #f56c6c);
299
- background: var(--qiu-bg-color, #fff);
300
- }
301
- }
302
- </style>
@@ -1,13 +0,0 @@
1
- <template>
2
- <div class="qiu-query-form-col qiu-query-form-col--full">
3
- <div class="bottom-panel">
4
- <slot />
5
- </div>
6
- </div>
7
- </template>
8
-
9
- <script lang="ts" setup>
10
- defineOptions({
11
- name: 'QiuQueryFormBottomPanel',
12
- })
13
- </script>
@@ -1,37 +0,0 @@
1
- <template>
2
- <div class="qiu-query-form-col" :style="colStyle">
3
- <div class="left-panel">
4
- <slot />
5
- </div>
6
- </div>
7
- </template>
8
-
9
- <script lang="ts" setup>
10
- defineOptions({
11
- name: 'QiuQueryFormLeftPanel',
12
- })
13
-
14
- const props = defineProps({
15
- span: {
16
- type: Number,
17
- default: 14,
18
- },
19
- })
20
-
21
- const colStyle = computed(() => ({
22
- '--qiu-query-col-span': String(props.span),
23
- }))
24
- </script>
25
-
26
- <style lang="scss" scoped>
27
- .qiu-query-form-col {
28
- flex: 0 0 calc(var(--qiu-query-col-span, 14) / 24 * 100%);
29
- max-width: calc(var(--qiu-query-col-span, 14) / 24 * 100%);
30
- box-sizing: border-box;
31
-
32
- @media (max-width: 992px) {
33
- flex: 0 0 100%;
34
- max-width: 100%;
35
- }
36
- }
37
- </style>
@@ -1,37 +0,0 @@
1
- <template>
2
- <div class="qiu-query-form-col" :style="colStyle">
3
- <div class="right-panel">
4
- <slot />
5
- </div>
6
- </div>
7
- </template>
8
-
9
- <script lang="ts" setup>
10
- defineOptions({
11
- name: 'QiuQueryFormRightPanel',
12
- })
13
-
14
- const props = defineProps({
15
- span: {
16
- type: Number,
17
- default: 10,
18
- },
19
- })
20
-
21
- const colStyle = computed(() => ({
22
- '--qiu-query-col-span': String(props.span),
23
- }))
24
- </script>
25
-
26
- <style lang="scss" scoped>
27
- .qiu-query-form-col {
28
- flex: 0 0 calc(var(--qiu-query-col-span, 10) / 24 * 100%);
29
- max-width: calc(var(--qiu-query-col-span, 10) / 24 * 100%);
30
- box-sizing: border-box;
31
-
32
- @media (max-width: 992px) {
33
- flex: 0 0 100%;
34
- max-width: 100%;
35
- }
36
- }
37
- </style>
@@ -1,13 +0,0 @@
1
- <template>
2
- <div class="qiu-query-form-col qiu-query-form-col--full">
3
- <div class="top-panel">
4
- <slot />
5
- </div>
6
- </div>
7
- </template>
8
-
9
- <script lang="ts" setup>
10
- defineOptions({
11
- name: 'QiuQueryFormTopPanel',
12
- })
13
- </script>
@@ -1,117 +0,0 @@
1
- <template>
2
- <div class="qiu-query-form">
3
- <slot />
4
- </div>
5
- </template>
6
-
7
- <script lang="ts" setup>
8
- defineOptions({
9
- name: 'QiuQueryForm',
10
- })
11
- </script>
12
-
13
- <style lang="scss" scoped>
14
- @mixin panel {
15
- display: flex;
16
- flex-wrap: nowrap;
17
- align-content: center;
18
- align-items: center;
19
- min-height: var(--qiu-input-height, 32px);
20
- margin: 0;
21
-
22
- :deep(.el-form-item) {
23
- margin-right: 12px !important;
24
- margin-bottom: 0 !important;
25
- }
26
-
27
- :deep(.el-form-item__content) {
28
- display: flex;
29
- align-items: center;
30
- }
31
-
32
- :deep(> .el-button),
33
- :deep(> .qiu-button) {
34
- margin: 0 0 0 8px !important;
35
- }
36
- }
37
-
38
- .qiu-query-form {
39
- width: 100%;
40
-
41
- /* 关键:left-panel 与 right-panel 同一行,按钮不换行 */
42
- :deep(.el-form) {
43
- display: flex;
44
- flex-wrap: nowrap;
45
- gap: 8px;
46
- align-items: center;
47
- width: 100%;
48
- margin: 0;
49
- }
50
-
51
- :deep(.qiu-query-form-col--full) {
52
- flex: 0 0 100%;
53
- max-width: 100%;
54
- box-sizing: border-box;
55
- }
56
-
57
- :deep(.el-input),
58
- :deep(.el-select) {
59
- width: 160px;
60
- }
61
-
62
- :deep(.el-date-editor) {
63
- --qiu-date-editor-daterange-width: 220px;
64
- width: 220px;
65
- }
66
-
67
- :deep(.top-panel) {
68
- @include panel;
69
- flex-wrap: wrap;
70
- width: 100%;
71
- }
72
-
73
- :deep(.bottom-panel) {
74
- @include panel;
75
- flex-wrap: wrap;
76
- width: 100%;
77
- border-top: 1px solid var(--qiu-border-color, #dcdfe6);
78
- }
79
-
80
- :deep(.left-panel) {
81
- @include panel;
82
- flex: 1 1 auto;
83
- justify-content: flex-start;
84
- min-width: 0;
85
- overflow-x: auto;
86
- overflow-y: hidden;
87
- }
88
-
89
- :deep(.right-panel) {
90
- @include panel;
91
- flex: 0 0 auto;
92
- justify-content: flex-end;
93
- white-space: nowrap;
94
- }
95
- }
96
-
97
- /* 窄屏才允许整行换行 */
98
- @media (max-width: 900px) {
99
- .qiu-query-form {
100
- :deep(.el-form) {
101
- flex-wrap: wrap;
102
- }
103
-
104
- :deep(.left-panel) {
105
- flex: 1 1 100%;
106
- flex-wrap: wrap;
107
- overflow-x: visible;
108
- }
109
-
110
- :deep(.right-panel) {
111
- flex: 1 1 100%;
112
- justify-content: flex-end;
113
- margin-top: 4px;
114
- }
115
- }
116
- }
117
- </style>
@@ -1,75 +0,0 @@
1
- <template>
2
- <div
3
- class="qiu-radio-group"
4
- :class="[
5
- { 'is-disabled': disabled },
6
- `qiu-radio-group--${type}`,
7
- ]"
8
- role="radiogroup"
9
- >
10
- <slot />
11
- </div>
12
- </template>
13
-
14
- <script lang="ts" setup>
15
- import type { QiuRadioGroupContext } from './types'
16
-
17
- defineOptions({ name: 'QiuRadioGroup' })
18
-
19
- const props = withDefaults(
20
- defineProps<{
21
- modelValue?: string | number | boolean
22
- disabled?: boolean
23
- name?: string
24
- type?: 'default' | 'button'
25
- }>(),
26
- {
27
- disabled: false,
28
- name: '',
29
- type: 'default',
30
- }
31
- )
32
-
33
- const emit = defineEmits<{
34
- 'update:modelValue': [string | number | boolean]
35
- change: [string | number | boolean]
36
- }>()
37
-
38
- const groupName = computed(() => props.name || `qiu-radio-group-${Math.random().toString(36).slice(2, 9)}`)
39
- const modelValueRef = computed(() => props.modelValue)
40
- const disabledRef = computed(() => props.disabled)
41
-
42
- const changeEvent = (val: string | number | boolean) => {
43
- emit('update:modelValue', val)
44
- emit('change', val)
45
- }
46
-
47
- provide<QiuRadioGroupContext>('qiuRadioGroup', {
48
- modelValue: modelValueRef as Ref<string | number | boolean | undefined>,
49
- disabled: disabledRef as Ref<boolean>,
50
- name: groupName as Ref<string>,
51
- type: computed(() => props.type),
52
- changeEvent,
53
- })
54
- </script>
55
-
56
- <style lang="scss" scoped>
57
- .qiu-radio-group {
58
- display: inline-flex;
59
- flex-wrap: wrap;
60
- align-items: center;
61
-
62
- &.is-disabled {
63
- cursor: not-allowed;
64
- opacity: 0.6;
65
- }
66
-
67
- &--button {
68
- flex-wrap: nowrap;
69
-
70
- :deep(.qiu-radio) {
71
- margin-right: 0;
72
- }
73
- }
74
- }
75
- </style>