@veltra/mobile 1.0.0 → 1.1.0

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 (245) hide show
  1. package/package.json +32 -6
  2. package/src/components/_internal/bottom-sheet/bottom-sheet.vue +81 -0
  3. package/src/components/_internal/bottom-sheet/index.ts +1 -0
  4. package/src/components/_internal/bottom-sheet/style.scss +116 -0
  5. package/src/components/_internal/bottom-sheet/style.ts +1 -0
  6. package/src/components/_internal/overlay-container.ts +34 -0
  7. package/src/components/avatar/avatar.vue +44 -0
  8. package/src/components/avatar/index.ts +1 -0
  9. package/src/components/avatar/style.scss +53 -0
  10. package/src/components/avatar/style.ts +1 -0
  11. package/src/components/badge/badge.vue +59 -0
  12. package/src/components/badge/index.ts +1 -0
  13. package/src/components/badge/style.scss +62 -0
  14. package/src/components/badge/style.ts +1 -0
  15. package/src/components/button/button.vue +76 -0
  16. package/src/components/button/index.ts +1 -0
  17. package/src/components/button/style.scss +207 -0
  18. package/src/components/button/style.ts +1 -0
  19. package/src/components/card/card.vue +24 -0
  20. package/src/components/card/index.ts +1 -0
  21. package/src/components/card/style.scss +35 -0
  22. package/src/components/card/style.ts +1 -0
  23. package/src/components/cascade/cascade.vue +595 -0
  24. package/src/components/cascade/index.ts +1 -0
  25. package/src/components/cascade/node.ts +29 -0
  26. package/src/components/cascade/style.scss +424 -0
  27. package/src/components/cascade/style.ts +2 -0
  28. package/src/components/check-tag/check-tag.vue +35 -0
  29. package/src/components/check-tag/index.ts +1 -0
  30. package/src/components/check-tag/style.scss +46 -0
  31. package/src/components/check-tag/style.ts +1 -0
  32. package/src/components/checkbox/checkbox.vue +67 -0
  33. package/src/components/checkbox/index.ts +1 -0
  34. package/src/components/checkbox/style.scss +132 -0
  35. package/src/components/checkbox/style.ts +2 -0
  36. package/src/components/checkbox-group/checkbox-group.vue +94 -0
  37. package/src/components/checkbox-group/index.ts +1 -0
  38. package/src/components/checkbox-group/style.scss +57 -0
  39. package/src/components/checkbox-group/style.ts +2 -0
  40. package/src/components/collapse/collapse-item.vue +134 -0
  41. package/src/components/collapse/collapse.vue +117 -0
  42. package/src/components/collapse/di.ts +18 -0
  43. package/src/components/collapse/index.ts +3 -0
  44. package/src/components/collapse/style.scss +157 -0
  45. package/src/components/collapse/style.ts +1 -0
  46. package/src/components/date-picker/date-picker.vue +326 -0
  47. package/src/components/date-picker/index.ts +1 -0
  48. package/src/components/date-picker/style.scss +236 -0
  49. package/src/components/date-picker/style.ts +2 -0
  50. package/src/components/descriptions/descriptions-item.vue +12 -0
  51. package/src/components/descriptions/descriptions.vue +50 -0
  52. package/src/components/descriptions/index.ts +2 -0
  53. package/src/components/descriptions/style.scss +120 -0
  54. package/src/components/descriptions/style.ts +1 -0
  55. package/src/components/dialog/dialog.vue +143 -0
  56. package/src/components/dialog/index.ts +1 -0
  57. package/src/components/dialog/style.scss +163 -0
  58. package/src/components/dialog/style.ts +4 -0
  59. package/src/components/divider/divider.vue +29 -0
  60. package/src/components/divider/index.ts +1 -0
  61. package/src/components/divider/style.scss +91 -0
  62. package/src/components/divider/style.ts +1 -0
  63. package/src/components/drawer/drawer.vue +168 -0
  64. package/src/components/drawer/index.ts +1 -0
  65. package/src/components/drawer/style.scss +240 -0
  66. package/src/components/drawer/style.ts +2 -0
  67. package/src/components/empty/empty.vue +22 -0
  68. package/src/components/empty/index.ts +1 -0
  69. package/src/components/empty/style.scss +36 -0
  70. package/src/components/empty/style.ts +1 -0
  71. package/src/components/form/form.vue +119 -0
  72. package/src/components/form/index.ts +1 -0
  73. package/src/components/form/is-field-modified.ts +16 -0
  74. package/src/components/form/style.scss +58 -0
  75. package/src/components/form/style.ts +2 -0
  76. package/src/components/form/use-form-fields.ts +115 -0
  77. package/src/components/form/use-node-interceptor.ts +101 -0
  78. package/src/components/form-item/form-item.vue +171 -0
  79. package/src/components/form-item/helper.ts +9 -0
  80. package/src/components/form-item/index.ts +1 -0
  81. package/src/components/form-item/style.scss +121 -0
  82. package/src/components/form-item/style.ts +1 -0
  83. package/src/components/form-item/validate.ts +131 -0
  84. package/src/components/icon/icon.vue +23 -0
  85. package/src/components/icon/index.ts +1 -0
  86. package/src/components/icon/style.scss +37 -0
  87. package/src/components/icon/style.ts +1 -0
  88. package/src/components/input/index.ts +1 -0
  89. package/src/components/input/input.vue +187 -0
  90. package/src/components/input/style.scss +121 -0
  91. package/src/components/input/style.ts +1 -0
  92. package/src/components/list/index.ts +3 -0
  93. package/src/components/list/list-item.vue +20 -0
  94. package/src/components/list/list.vue +20 -0
  95. package/src/components/list/style.scss +50 -0
  96. package/src/components/list/style.ts +1 -0
  97. package/src/components/loading/directive.ts +34 -0
  98. package/src/components/loading/index.ts +3 -0
  99. package/src/components/loading/loading.vue +25 -0
  100. package/src/components/loading/style.scss +179 -0
  101. package/src/components/loading/style.ts +2 -0
  102. package/src/components/message/helper.ts +28 -0
  103. package/src/components/message/index.ts +3 -0
  104. package/src/components/message/message-box.vue +31 -0
  105. package/src/components/message/message.ts +122 -0
  106. package/src/components/message/message.vue +54 -0
  107. package/src/components/message/style.scss +130 -0
  108. package/src/components/message/style.ts +1 -0
  109. package/src/components/message-confirm/index.ts +3 -0
  110. package/src/components/message-confirm/message-confirm-box.vue +36 -0
  111. package/src/components/message-confirm/message-confirm.ts +139 -0
  112. package/src/components/message-confirm/message-confirm.vue +53 -0
  113. package/src/components/message-confirm/style.scss +138 -0
  114. package/src/components/message-confirm/style.ts +1 -0
  115. package/src/components/multi-select/index.ts +1 -0
  116. package/src/components/multi-select/multi-select.vue +410 -0
  117. package/src/components/multi-select/style.scss +376 -0
  118. package/src/components/multi-select/style.ts +2 -0
  119. package/src/components/number-input/index.ts +1 -0
  120. package/src/components/number-input/number-input.vue +407 -0
  121. package/src/components/number-input/style.scss +118 -0
  122. package/src/components/number-input/style.ts +2 -0
  123. package/src/components/password-input/index.ts +1 -0
  124. package/src/components/password-input/password-input.vue +134 -0
  125. package/src/components/password-input/style.scss +40 -0
  126. package/src/components/password-input/style.ts +2 -0
  127. package/src/components/progress/index.ts +1 -0
  128. package/src/components/progress/progress.vue +90 -0
  129. package/src/components/progress/style.scss +73 -0
  130. package/src/components/progress/style.ts +1 -0
  131. package/src/components/radio/index.ts +1 -0
  132. package/src/components/radio/radio.vue +57 -0
  133. package/src/components/radio/style.scss +113 -0
  134. package/src/components/radio/style.ts +1 -0
  135. package/src/components/radio-group/index.ts +1 -0
  136. package/src/components/radio-group/radio-group.vue +60 -0
  137. package/src/components/radio-group/style.scss +29 -0
  138. package/src/components/radio-group/style.ts +2 -0
  139. package/src/components/segment/index.ts +1 -0
  140. package/src/components/segment/segment.vue +121 -0
  141. package/src/components/segment/style.scss +118 -0
  142. package/src/components/segment/style.ts +1 -0
  143. package/src/components/select/index.ts +1 -0
  144. package/src/components/select/select.vue +278 -0
  145. package/src/components/select/style.scss +237 -0
  146. package/src/components/select/style.ts +2 -0
  147. package/src/components/select/use-options.ts +195 -0
  148. package/src/components/skeleton/index.ts +1 -0
  149. package/src/components/skeleton/skeleton.vue +37 -0
  150. package/src/components/skeleton/style.scss +95 -0
  151. package/src/components/skeleton/style.ts +1 -0
  152. package/src/components/space/index.ts +1 -0
  153. package/src/components/space/space.vue +45 -0
  154. package/src/components/space/style.scss +41 -0
  155. package/src/components/space/style.ts +1 -0
  156. package/src/components/steps/index.ts +1 -0
  157. package/src/components/steps/steps.vue +114 -0
  158. package/src/components/steps/style.scss +231 -0
  159. package/src/components/steps/style.ts +1 -0
  160. package/src/components/switch/index.ts +1 -0
  161. package/src/components/switch/style.scss +137 -0
  162. package/src/components/switch/style.ts +1 -0
  163. package/src/components/switch/switch.vue +63 -0
  164. package/src/components/tabs/index.ts +1 -0
  165. package/src/components/tabs/style.scss +285 -0
  166. package/src/components/tabs/style.ts +1 -0
  167. package/src/components/tabs/tabs.vue +127 -0
  168. package/src/components/tag/index.ts +1 -0
  169. package/src/components/tag/style.scss +114 -0
  170. package/src/components/tag/style.ts +1 -0
  171. package/src/components/tag/tag.vue +49 -0
  172. package/src/components/text/index.ts +1 -0
  173. package/src/components/text/style.scss +63 -0
  174. package/src/components/text/style.ts +1 -0
  175. package/src/components/text/text.vue +63 -0
  176. package/src/components/textarea/index.ts +1 -0
  177. package/src/components/textarea/style.scss +124 -0
  178. package/src/components/textarea/style.ts +1 -0
  179. package/src/components/textarea/textarea.vue +121 -0
  180. package/src/components/textarea/utils.ts +11 -0
  181. package/src/components/time-picker/index.ts +1 -0
  182. package/src/components/time-picker/style.scss +216 -0
  183. package/src/components/time-picker/style.ts +2 -0
  184. package/src/components/time-picker/time-picker.vue +263 -0
  185. package/src/components/timeline/index.ts +2 -0
  186. package/src/components/timeline/style.scss +107 -0
  187. package/src/components/timeline/style.ts +1 -0
  188. package/src/components/timeline/timeline-item.vue +43 -0
  189. package/src/components/timeline/timeline.vue +16 -0
  190. package/src/components/uploader/index.ts +1 -0
  191. package/src/components/uploader/style.scss +220 -0
  192. package/src/components/uploader/style.ts +1 -0
  193. package/src/components/uploader/uploader.vue +306 -0
  194. package/src/env.d.ts +7 -0
  195. package/src/index.ts +99 -1
  196. package/src/shared/bem.ts +12 -0
  197. package/src/shared/use-scroll-lock.ts +111 -0
  198. package/src/shared/use-touch-gesture.ts +150 -0
  199. package/src/styles/_tokens.scss +129 -0
  200. package/src/types/avatar.ts +31 -0
  201. package/src/types/badge.ts +28 -0
  202. package/src/types/button.ts +48 -0
  203. package/src/types/card.ts +16 -0
  204. package/src/types/cascade.ts +87 -0
  205. package/src/types/check-tag.ts +24 -0
  206. package/src/types/checkbox-group.ts +20 -0
  207. package/src/types/checkbox.ts +15 -0
  208. package/src/types/collapse.ts +79 -0
  209. package/src/types/date-picker.ts +39 -0
  210. package/src/types/descriptions.ts +22 -0
  211. package/src/types/dialog.ts +54 -0
  212. package/src/types/divider.ts +14 -0
  213. package/src/types/drawer.ts +38 -0
  214. package/src/types/empty.ts +19 -0
  215. package/src/types/form-item.ts +22 -0
  216. package/src/types/form.ts +54 -0
  217. package/src/types/icon.ts +10 -0
  218. package/src/types/input.ts +51 -0
  219. package/src/types/list.ts +13 -0
  220. package/src/types/loading.ts +20 -0
  221. package/src/types/message-confirm.ts +72 -0
  222. package/src/types/message.ts +71 -0
  223. package/src/types/multi-select.ts +38 -0
  224. package/src/types/number-input.ts +32 -0
  225. package/src/types/password-input.ts +19 -0
  226. package/src/types/progress.ts +22 -0
  227. package/src/types/radio-group.ts +33 -0
  228. package/src/types/radio.ts +18 -0
  229. package/src/types/segment.ts +42 -0
  230. package/src/types/select.ts +63 -0
  231. package/src/types/skeleton.ts +29 -0
  232. package/src/types/space.ts +22 -0
  233. package/src/types/steps.ts +67 -0
  234. package/src/types/switch.ts +17 -0
  235. package/src/types/tabs.ts +63 -0
  236. package/src/types/tag.ts +19 -0
  237. package/src/types/text.ts +28 -0
  238. package/src/types/textarea.ts +76 -0
  239. package/src/types/time-picker.ts +40 -0
  240. package/src/types/timeline.ts +15 -0
  241. package/src/types/uploader.ts +50 -0
  242. package/.turbo/turbo-build.log +0 -2
  243. package/.turbo/turbo-check-types.log +0 -1
  244. package/tsconfig.json +0 -12
  245. package/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,207 @@
1
+ @use 'sass:map';
2
+ @use 'pkg:@veltra/styles/mixins' as m with ($namespace: um);
3
+ @use 'pkg:@veltra/styles/functions' as fn;
4
+ @use 'pkg:@veltra/styles/vars';
5
+ @use '../../styles/tokens' as t;
6
+
7
+ $root-name: button;
8
+
9
+ // 密度移动档:小档 14 号字(辅助场景),默认 / 大档主字号 16
10
+ $size-font: (
11
+ small: font-size-secondary,
12
+ default: font-size-main,
13
+ large: font-size-main
14
+ );
15
+
16
+ // 控件高度档 32 / 40 / 48,热区另有 44px 下限兜底
17
+ $size-height: (
18
+ small: control-height-small,
19
+ default: control-height-default,
20
+ large: control-height-large
21
+ );
22
+
23
+ $size-padding: (
24
+ small: spacing-sm,
25
+ default: spacing-lg,
26
+ large: spacing-xl
27
+ );
28
+
29
+ @keyframes um-button-icon-rotating {
30
+ 0% {
31
+ transform: rotateZ(0deg);
32
+ }
33
+ 100% {
34
+ transform: rotateZ(360deg);
35
+ }
36
+ }
37
+
38
+ @include m.b($root-name) {
39
+ color: fn.component-var(button, default-color, fn.use-var(text-color, main));
40
+ box-sizing: border-box;
41
+ line-height: 1;
42
+ outline: none;
43
+ text-decoration: none;
44
+ white-space: nowrap;
45
+ vertical-align: middle;
46
+ cursor: pointer;
47
+ -webkit-appearance: none;
48
+ -webkit-tap-highlight-color: transparent;
49
+ border: 1px solid fn.component-var(button, default-border, transparent);
50
+ background-color: fn.component-var(button, default-bg, fn.use-var(color, default));
51
+ box-shadow: fn.use-var(shadow, emboss);
52
+ transition:
53
+ background-color fn.use-var(transition, fast) fn.use-var(transition, ease),
54
+ border-color fn.use-var(transition, fast) fn.use-var(transition, ease),
55
+ color fn.use-var(transition, fast) fn.use-var(transition, ease),
56
+ box-shadow fn.use-var(transition, fast) fn.use-var(transition, ease);
57
+ gap: t.use-var(spacing-sm);
58
+
59
+ @include m.flex($display: inline-flex, $justify: center);
60
+
61
+ // 触控热区:任何尺寸的可点击区域不小于 44×44
62
+ @include m.size using ($size) {
63
+ $touch-size: max(
64
+ #{t.use-var(map.get($size-height, $size))},
65
+ #{t.use-var(touch-target)}
66
+ );
67
+
68
+ min-height: $touch-size;
69
+ font-size: t.use-var(map.get($size-font, $size));
70
+ padding: 0 t.use-var(map.get($size-padding, $size));
71
+ border-radius: t.control-radius($size);
72
+
73
+ @include m.is(circle) {
74
+ min-width: $touch-size;
75
+ }
76
+ }
77
+
78
+ // 按压态(移动端无 hover,用 :active 提供触控反馈)
79
+ &:active {
80
+ background-color: fn.component-var(
81
+ button,
82
+ default-hover-bg,
83
+ fn.use-var(color, default, 'dark-1')
84
+ );
85
+ border-color: fn.component-var(button, default-hover-border, transparent);
86
+ }
87
+
88
+ @include m.is(disabled, loading) {
89
+ cursor: not-allowed;
90
+ color: fn.use-var(text-color, second);
91
+ box-shadow: none !important;
92
+ }
93
+
94
+ @include m.is(plain) {
95
+ border-color: transparent;
96
+ box-shadow: none;
97
+ }
98
+
99
+ @include m.bem(icon) {
100
+ display: inline-flex;
101
+ align-items: center;
102
+ justify-content: center;
103
+ fill: currentColor;
104
+ color: inherit;
105
+ width: 1em;
106
+ height: 1em;
107
+ user-select: none;
108
+
109
+ svg {
110
+ width: 1em;
111
+ height: 1em;
112
+ }
113
+
114
+ @include m.is(loading) {
115
+ transform-origin: center;
116
+ animation: um-button-icon-rotating 2s linear infinite;
117
+ }
118
+ }
119
+
120
+ // 颜色
121
+ @each $type, $_ in vars.$color-types {
122
+ @include m.m(color-#{$type}) {
123
+ background-color: fn.use-var(color, $type);
124
+ border-color: fn.component-var(button, #{$type}-border, fn.use-var(color, $type));
125
+ color: fn.component-var(button, #{$type}-text-color, fn.use-var(text-color, white));
126
+
127
+ &:active {
128
+ background-color: fn.component-var(
129
+ button,
130
+ #{$type}-hover-bg,
131
+ fn.use-var(color, $type, dark-1)
132
+ );
133
+ border-color: fn.component-var(
134
+ button,
135
+ #{$type}-hover-border,
136
+ fn.use-var(color, $type, dark-1)
137
+ );
138
+ }
139
+
140
+ // 禁用
141
+ @include m.is(disabled, loading) {
142
+ background-color: fn.use-var(color, $type, 'light-5');
143
+ border-color: fn.use-var(color, $type, 'light-5');
144
+ color: fn.use-var(text-color, white);
145
+ box-shadow: none;
146
+ }
147
+
148
+ @include m.is(text) {
149
+ color: fn.use-var(color, $type);
150
+ border-color: transparent;
151
+ box-shadow: none;
152
+
153
+ &:active {
154
+ background-color: fn.component-var(
155
+ button,
156
+ #{$type}-plain-bg,
157
+ fn.use-var(color, $type, 'light-9')
158
+ );
159
+ }
160
+
161
+ @include m.is(disabled, loading) {
162
+ border-color: transparent;
163
+ color: fn.use-var(color, $type, 'light-5');
164
+ }
165
+ }
166
+
167
+ @include m.is(plain) {
168
+ border-color: transparent;
169
+ color: fn.component-var(button, #{$type}-plain-color, fn.use-var(color, $type));
170
+ background-color: fn.component-var(
171
+ button,
172
+ #{$type}-plain-bg,
173
+ fn.use-var(color, $type, light-9)
174
+ );
175
+
176
+ &:active {
177
+ background-color: fn.use-var(color, $type, light-7);
178
+ }
179
+
180
+ @include m.is(disabled, loading) {
181
+ border-color: transparent;
182
+ color: fn.use-var(color, $type, light-5);
183
+ background-color: fn.use-var(color, $type, light-9);
184
+ }
185
+ }
186
+ }
187
+ }
188
+
189
+ // 圆形
190
+ @include m.is(circle) {
191
+ border-radius: 50%;
192
+ padding: 0;
193
+ }
194
+
195
+ // 文本形态
196
+ @include m.is(text) {
197
+ background-color: transparent;
198
+ border: none;
199
+ box-shadow: none;
200
+ }
201
+
202
+ // 焦点环放在块尾并提升优先级,确保不被 plain/text 等变体的
203
+ // box-shadow: none 覆盖(焦点指示必须始终可见)
204
+ &:focus-visible:not(.is-disabled):not(.is-loading) {
205
+ box-shadow: fn.use-var(focus-ring);
206
+ }
207
+ }
@@ -0,0 +1 @@
1
+ import './style.scss'
@@ -0,0 +1,24 @@
1
+ <template>
2
+ <div :class="classList" :style="style">
3
+ <slot />
4
+ </div>
5
+ </template>
6
+
7
+ <script lang="ts" setup>
8
+ import { withUnit } from '@veltra/utils'
9
+ import { computed } from 'vue'
10
+
11
+ import { bem } from '../../shared/bem'
12
+ import type { CardProps } from '../../types/card'
13
+
14
+ defineOptions({ name: 'UCard' })
15
+
16
+ const { width, integrate, size } = defineProps<CardProps>()
17
+
18
+ const cls = bem('card')
19
+
20
+ // 移动端没有 header/content/action 子区块,尺寸档位直接作用于根节点(字号 + 内边距密度)
21
+ const classList = computed(() => [cls.b, cls.m(size ?? 'default'), bem.is('integrate', integrate)])
22
+
23
+ const style = computed(() => ({ width: withUnit(width, 'px') }))
24
+ </script>
@@ -0,0 +1 @@
1
+ export { default as UCard } from './card.vue'
@@ -0,0 +1,35 @@
1
+ @use 'sass:map';
2
+ @use 'pkg:@veltra/styles/mixins' as m with ($namespace: um);
3
+ @use 'pkg:@veltra/styles/functions' as fn;
4
+ @use '../../styles/tokens' as t;
5
+
6
+ $root-name: card;
7
+
8
+ // 内边距走移动端间距刻度:8 / 12 / 16(4px 基),字号统一主字号 16
9
+ $size-padding: (
10
+ small: spacing-sm,
11
+ default: spacing-md,
12
+ large: spacing-lg
13
+ );
14
+
15
+ @include m.b($root-name) {
16
+ border-radius: fn.component-var(card, radius, t.use-var('panel-radius'));
17
+ background-color: fn.use-var(bg-color, top);
18
+ box-shadow: fn.use-var(shadow, sm);
19
+ backdrop-filter: fn.use-var(bg-filter);
20
+ -webkit-backdrop-filter: fn.use-var(bg-filter);
21
+ overflow: hidden;
22
+
23
+ @include m.size using ($size) {
24
+ font-size: t.use-var(font-size-main);
25
+ padding: fn.component-var(
26
+ card,
27
+ padding-#{$size},
28
+ t.use-var(map.get($size-padding, $size))
29
+ );
30
+ }
31
+
32
+ @include m.is(integrate) {
33
+ box-shadow: none;
34
+ }
35
+ }
@@ -0,0 +1 @@
1
+ import './style.scss'