@puresnake/snake-ui 0.0.0-stage → 0.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 (279) hide show
  1. package/LICENSE +21 -0
  2. package/changelog.md +83 -0
  3. package/components/snake-activity-list/snake-activity-list.vue +365 -0
  4. package/components/snake-activity-list/types.ts +29 -0
  5. package/components/snake-auxiliary-segmentation/snake-auxiliary-segmentation.vue +44 -0
  6. package/components/snake-auxiliary-segmentation/types.ts +5 -0
  7. package/components/snake-button/snake-button.vue +357 -0
  8. package/components/snake-button/types.ts +103 -0
  9. package/components/snake-button-sort/snake-button-sort.vue +72 -0
  10. package/components/snake-button-sort/types.ts +22 -0
  11. package/components/snake-calendar/snake-calendar.vue +998 -0
  12. package/components/snake-calendar/types.ts +189 -0
  13. package/components/snake-cell-group/snake-cell-group.vue +55 -0
  14. package/components/snake-cell-group/types.ts +19 -0
  15. package/components/snake-cell-item/snake-cell-item.vue +159 -0
  16. package/components/snake-cell-item/types.ts +66 -0
  17. package/components/snake-checkbox/snake-checkbox.vue +264 -0
  18. package/components/snake-checkbox/types.ts +70 -0
  19. package/components/snake-checkbox-group/snake-checkbox-group.vue +154 -0
  20. package/components/snake-checkbox-group/types.ts +52 -0
  21. package/components/snake-cms/blocks/v2/cms-v2-carousel.vue +87 -0
  22. package/components/snake-cms/blocks/v2/cms-v2-coupon.vue +25 -0
  23. package/components/snake-cms/blocks/v2/cms-v2-custom.vue +12 -0
  24. package/components/snake-cms/blocks/v2/cms-v2-divider.vue +33 -0
  25. package/components/snake-cms/blocks/v2/cms-v2-floatbutton.vue +28 -0
  26. package/components/snake-cms/blocks/v2/cms-v2-goods-list.vue +150 -0
  27. package/components/snake-cms/blocks/v2/cms-v2-hotzone.vue +41 -0
  28. package/components/snake-cms/blocks/v2/cms-v2-images.vue +41 -0
  29. package/components/snake-cms/blocks/v2/cms-v2-magiccube.vue +93 -0
  30. package/components/snake-cms/blocks/v2/cms-v2-notice.vue +80 -0
  31. package/components/snake-cms/blocks/v2/cms-v2-popup.vue +46 -0
  32. package/components/snake-cms/blocks/v2/cms-v2-richtext.vue +18 -0
  33. package/components/snake-cms/blocks/v2/cms-v2-search.vue +115 -0
  34. package/components/snake-cms/blocks/v2/cms-v2-video.vue +25 -0
  35. package/components/snake-cms/blocks/v2/shared.ts +84 -0
  36. package/components/snake-cms/snake-cms.vue +409 -0
  37. package/components/snake-cms/types.ts +50 -0
  38. package/components/snake-commodity-search/snake-commodity-search.vue +234 -0
  39. package/components/snake-commodity-search/types.ts +11 -0
  40. package/components/snake-config-provider/snake-config-provider.vue +61 -0
  41. package/components/snake-config-provider/types.ts +22 -0
  42. package/components/snake-count-down/snake-count-down.vue +231 -0
  43. package/components/snake-count-down/types.ts +103 -0
  44. package/components/snake-coupon/snake-coupon.vue +209 -0
  45. package/components/snake-coupon/types.ts +21 -0
  46. package/components/snake-custom-module/snake-custom-module.vue +25 -0
  47. package/components/snake-custom-module/types.ts +11 -0
  48. package/components/snake-drop-menu/snake-drop-menu.vue +123 -0
  49. package/components/snake-drop-menu/types.ts +95 -0
  50. package/components/snake-drop-menu-item/snake-drop-menu-item.vue +181 -0
  51. package/components/snake-drop-menu-item/types.ts +48 -0
  52. package/components/snake-empty/snake-empty.vue +100 -0
  53. package/components/snake-empty/types.ts +48 -0
  54. package/components/snake-filter-sorts/filter-page.vue +695 -0
  55. package/components/snake-filter-sorts/snake-filter-sorts.vue +185 -0
  56. package/components/snake-filter-sorts/types.ts +57 -0
  57. package/components/snake-floating-bubble/snake-floating-bubble.vue +157 -0
  58. package/components/snake-floating-bubble/types.ts +43 -0
  59. package/components/snake-follow/snake-follow.vue +18 -0
  60. package/components/snake-follow/types.ts +2 -0
  61. package/components/snake-form/snake-form.vue +124 -0
  62. package/components/snake-form/types.ts +96 -0
  63. package/components/snake-form-item/snake-form-item.vue +331 -0
  64. package/components/snake-form-item/types.ts +70 -0
  65. package/components/snake-goods-list/snake-goods-list.vue +792 -0
  66. package/components/snake-goods-list/types.ts +55 -0
  67. package/components/snake-graphic-navigation/snake-graphic-navigation.vue +198 -0
  68. package/components/snake-graphic-navigation/types.ts +43 -0
  69. package/components/snake-icon/icon-names.ts +222 -0
  70. package/components/snake-icon/snake-icon.vue +220 -0
  71. package/components/snake-icon/types.ts +45 -0
  72. package/components/snake-image/snake-image.vue +230 -0
  73. package/components/snake-image/types.ts +70 -0
  74. package/components/snake-images/snake-images.vue +80 -0
  75. package/components/snake-images/types.ts +5 -0
  76. package/components/snake-index-anchor/snake-index-anchor.vue +83 -0
  77. package/components/snake-index-anchor/types.ts +14 -0
  78. package/components/snake-index-list/anchor-registry.ts +80 -0
  79. package/components/snake-index-list/snake-index-list.vue +259 -0
  80. package/components/snake-index-list/types.ts +115 -0
  81. package/components/snake-index-list-panel/snake-index-list-panel.vue +277 -0
  82. package/components/snake-index-list-panel/types.ts +10 -0
  83. package/components/snake-input/snake-input.vue +225 -0
  84. package/components/snake-input/types.ts +99 -0
  85. package/components/snake-jump-applet/snake-jump-applet.vue +99 -0
  86. package/components/snake-jump-applet/types.ts +17 -0
  87. package/components/snake-line/snake-line.vue +42 -0
  88. package/components/snake-line/types.ts +30 -0
  89. package/components/snake-line-progress/snake-line-progress.vue +105 -0
  90. package/components/snake-line-progress/types.ts +26 -0
  91. package/components/snake-link/snake-link.vue +74 -0
  92. package/components/snake-link/types.ts +30 -0
  93. package/components/snake-list-switching/components/tree-select/index.vue +156 -0
  94. package/components/snake-list-switching/snake-list-switching.vue +1285 -0
  95. package/components/snake-list-switching/types.ts +11 -0
  96. package/components/snake-loading/snake-loading.vue +241 -0
  97. package/components/snake-loading/types.ts +34 -0
  98. package/components/snake-loadmore/snake-loadmore.vue +103 -0
  99. package/components/snake-loadmore/types.ts +56 -0
  100. package/components/snake-magic-cube/snake-magic-cube.vue +622 -0
  101. package/components/snake-magic-cube/types.ts +5 -0
  102. package/components/snake-modal/snake-modal.vue +434 -0
  103. package/components/snake-modal/types.ts +71 -0
  104. package/components/snake-navbar/snake-navbar.vue +194 -0
  105. package/components/snake-navbar/types.ts +54 -0
  106. package/components/snake-no-network/snake-no-network.vue +125 -0
  107. package/components/snake-no-network/types.ts +27 -0
  108. package/components/snake-notice/snake-notice.vue +44 -0
  109. package/components/snake-notice/types.ts +5 -0
  110. package/components/snake-notice-bar/snake-notice-bar.vue +336 -0
  111. package/components/snake-notice-bar/types.ts +82 -0
  112. package/components/snake-overlay/snake-overlay.vue +73 -0
  113. package/components/snake-overlay/types.ts +35 -0
  114. package/components/snake-page-popup/snake-page-popup.vue +146 -0
  115. package/components/snake-page-popup/types.ts +28 -0
  116. package/components/snake-parse/audio/audio.vue +286 -0
  117. package/components/snake-parse/audio/context.js +11 -0
  118. package/components/snake-parse/audio/index.js +34 -0
  119. package/components/snake-parse/node/node.vue +830 -0
  120. package/components/snake-parse/parser.js +1480 -0
  121. package/components/snake-parse/snake-parse.vue +548 -0
  122. package/components/snake-parse/static/app-plus/snake-parse/js/handler.js +109 -0
  123. package/components/snake-parse/static/app-plus/snake-parse/js/uni.webview.js +0 -0
  124. package/components/snake-parse/static/app-plus/snake-parse/js/uni.webview.min.js +1 -0
  125. package/components/snake-parse/static/app-plus/snake-parse/local.html +3 -0
  126. package/components/snake-parse/style/index.js +132 -0
  127. package/components/snake-parse/style/parser.js +175 -0
  128. package/components/snake-parse/types.ts +49 -0
  129. package/components/snake-picture-ads/snake-picture-ads.vue +292 -0
  130. package/components/snake-picture-ads/types.ts +5 -0
  131. package/components/snake-popup/snake-popup.vue +348 -0
  132. package/components/snake-popup/types.ts +88 -0
  133. package/components/snake-qr-code/qrcode.ts +1214 -0
  134. package/components/snake-qr-code/snake-qr-code.vue +408 -0
  135. package/components/snake-qr-code/types.ts +78 -0
  136. package/components/snake-radio/snake-radio.vue +271 -0
  137. package/components/snake-radio/types.ts +64 -0
  138. package/components/snake-radio-group/snake-radio-group.vue +98 -0
  139. package/components/snake-radio-group/types.ts +48 -0
  140. package/components/snake-read-more/snake-read-more.vue +140 -0
  141. package/components/snake-read-more/types.ts +53 -0
  142. package/components/snake-rich-text/snake-rich-text.vue +24 -0
  143. package/components/snake-rich-text/types.ts +5 -0
  144. package/components/snake-root-portal/snake-root-portal.vue +92 -0
  145. package/components/snake-root-portal/types.ts +9 -0
  146. package/components/snake-search/snake-search.vue +202 -0
  147. package/components/snake-search/types.ts +84 -0
  148. package/components/snake-select/snake-select.vue +371 -0
  149. package/components/snake-select/types.ts +75 -0
  150. package/components/snake-skeleton/snake-skeleton.vue +104 -0
  151. package/components/snake-skeleton/types.ts +32 -0
  152. package/components/snake-skeleton-item/snake-skeleton-item.vue +90 -0
  153. package/components/snake-skeleton-item/types.ts +30 -0
  154. package/components/snake-slider/snake-slider.vue +249 -0
  155. package/components/snake-slider/types.ts +59 -0
  156. package/components/snake-sticky/snake-sticky.vue +178 -0
  157. package/components/snake-sticky/types.ts +48 -0
  158. package/components/snake-subsection/snake-subsection.vue +188 -0
  159. package/components/snake-subsection/types.ts +54 -0
  160. package/components/snake-swiper/snake-swiper.vue +229 -0
  161. package/components/snake-swiper/types.ts +79 -0
  162. package/components/snake-switch/snake-switch.vue +100 -0
  163. package/components/snake-switch/types.ts +41 -0
  164. package/components/snake-tabbar/snake-tabbar.vue +306 -0
  165. package/components/snake-tabbar/types.ts +93 -0
  166. package/components/snake-tabs/snake-tabs.vue +305 -0
  167. package/components/snake-tabs/types.ts +79 -0
  168. package/components/snake-text/snake-text.vue +292 -0
  169. package/components/snake-text/types.ts +100 -0
  170. package/components/snake-textarea/snake-textarea.vue +171 -0
  171. package/components/snake-textarea/types.ts +79 -0
  172. package/components/snake-toast/snake-toast.vue +330 -0
  173. package/components/snake-toast/types.ts +55 -0
  174. package/components/snake-tooltip/position.ts +33 -0
  175. package/components/snake-tooltip/snake-tooltip.vue +339 -0
  176. package/components/snake-tooltip/types.ts +80 -0
  177. package/components/snake-transition/snake-transition.vue +315 -0
  178. package/components/snake-transition/types.ts +65 -0
  179. package/components/snake-upload/snake-upload.vue +1801 -0
  180. package/components/snake-upload/types.ts +256 -0
  181. package/components/snake-videos/snake-videos.vue +122 -0
  182. package/components/snake-videos/types.ts +7 -0
  183. package/iconfont.css +881 -0
  184. package/index.d.ts +7 -0
  185. package/index.scss +26 -0
  186. package/index.ts +94 -0
  187. package/libs/cms/blocks.ts +103 -0
  188. package/libs/cms/config.ts +25 -0
  189. package/libs/cms/index.ts +7 -0
  190. package/libs/cms/normalize.ts +135 -0
  191. package/libs/cms/resolve.ts +12 -0
  192. package/libs/cms/types.ts +164 -0
  193. package/libs/cms/use-commerce.ts +385 -0
  194. package/libs/cms/v2.ts +193 -0
  195. package/libs/config/index.ts +4 -0
  196. package/libs/config/modal.ts +93 -0
  197. package/libs/config/state.ts +33 -0
  198. package/libs/config/theme.ts +351 -0
  199. package/libs/config/toast.ts +71 -0
  200. package/libs/config/types.ts +135 -0
  201. package/libs/config/zIndex.ts +44 -0
  202. package/libs/css/color.scss +105 -0
  203. package/libs/css/common.scss +171 -0
  204. package/libs/css/style.h5.scss +7 -0
  205. package/libs/css/style.mp.scss +7 -0
  206. package/libs/css/style.theme.scss +70 -0
  207. package/libs/css/style.vue.scss +140 -0
  208. package/libs/form/async-validator.min.d.ts +75 -0
  209. package/libs/form/async-validator.min.js +3 -0
  210. package/libs/form/index.ts +3 -0
  211. package/libs/form/path.ts +40 -0
  212. package/libs/form/types.ts +51 -0
  213. package/libs/form/validate.ts +149 -0
  214. package/libs/foundation.ts +96 -0
  215. package/libs/function/$parent.ts +33 -0
  216. package/libs/function/clipboard.ts +13 -0
  217. package/libs/function/color.ts +55 -0
  218. package/libs/function/debounce.ts +34 -0
  219. package/libs/function/deepClone.ts +30 -0
  220. package/libs/function/deepMerge.ts +25 -0
  221. package/libs/function/emitter.ts +30 -0
  222. package/libs/function/format.ts +27 -0
  223. package/libs/function/getParent.ts +53 -0
  224. package/libs/function/getRect.ts +29 -0
  225. package/libs/function/guid.ts +11 -0
  226. package/libs/function/index.ts +31 -0
  227. package/libs/function/queryParams.ts +73 -0
  228. package/libs/function/random.ts +6 -0
  229. package/libs/function/randomArray.ts +14 -0
  230. package/libs/function/route.ts +155 -0
  231. package/libs/function/sleep.ts +7 -0
  232. package/libs/function/style.ts +58 -0
  233. package/libs/function/styleUtils.ts +83 -0
  234. package/libs/function/system.ts +14 -0
  235. package/libs/function/test.ts +202 -0
  236. package/libs/function/throttle.ts +36 -0
  237. package/libs/function/timeFormat.ts +27 -0
  238. package/libs/function/timeFrom.ts +27 -0
  239. package/libs/function/toast.ts +10 -0
  240. package/libs/function/trim.ts +11 -0
  241. package/libs/function/type2icon.ts +11 -0
  242. package/libs/function/unit.ts +45 -0
  243. package/libs/hooks/index.ts +11 -0
  244. package/libs/hooks/useChildren.ts +125 -0
  245. package/libs/hooks/useColor.ts +5 -0
  246. package/libs/hooks/useDebounce.ts +5 -0
  247. package/libs/hooks/useLocale.ts +13 -0
  248. package/libs/hooks/useModal.ts +131 -0
  249. package/libs/hooks/useParent.ts +62 -0
  250. package/libs/hooks/useRect.ts +44 -0
  251. package/libs/hooks/useRouter.ts +5 -0
  252. package/libs/hooks/useTheme.ts +31 -0
  253. package/libs/hooks/useThrottle.ts +5 -0
  254. package/libs/hooks/useToast.ts +116 -0
  255. package/libs/index.ts +18 -0
  256. package/libs/request/auto-http.ts +1 -0
  257. package/libs/request/index.ts +343 -0
  258. package/libs/runtime/accessors.ts +55 -0
  259. package/libs/runtime/context.ts +40 -0
  260. package/libs/runtime/index.ts +18 -0
  261. package/libs/runtime/types.ts +49 -0
  262. package/libs/util/calendar.ts +6 -0
  263. package/locale/index.ts +130 -0
  264. package/locale/lang/en-US.ts +67 -0
  265. package/locale/lang/zh-CN.ts +67 -0
  266. package/package.json +134 -5
  267. package/plugins/index.ts +1 -0
  268. package/plugins/root/README.md +86 -0
  269. package/plugins/root/index.ts +123 -0
  270. package/plugins/root/page.ts +77 -0
  271. package/plugins/root/root.ts +53 -0
  272. package/plugins/root/utils.ts +137 -0
  273. package/readme.md +79 -0
  274. package/theme.scss +118 -0
  275. package/types/components.d.ts +236 -0
  276. package/types/global.d.ts +21 -0
  277. package/types/index.d.ts +6 -0
  278. package/types/uni-app.d.ts +16 -0
  279. package/README.md +0 -3
@@ -0,0 +1,105 @@
1
+ /*
2
+ * 功能色工具类
3
+ * 全部走 $snake-color-* SCSS 别名(= var(--snake-color-*)),随主题/暗黑模式换肤。
4
+ */
5
+
6
+ // ===== primary(7 档) =====
7
+ .snake-primary {
8
+ color: $snake-color-primary;
9
+ }
10
+
11
+ .snake-primary-bg {
12
+ background-color: $snake-color-primary;
13
+ }
14
+
15
+ .snake-primary-light {
16
+ color: $snake-color-primary-light;
17
+ }
18
+
19
+ .snake-primary-light-bg {
20
+ background-color: $snake-color-primary-light;
21
+ }
22
+
23
+ .snake-primary-dark {
24
+ color: $snake-color-primary-dark;
25
+ }
26
+
27
+ .snake-primary-dark-bg {
28
+ background-color: $snake-color-primary-dark;
29
+ }
30
+
31
+ .snake-primary-deep {
32
+ color: $snake-color-primary-deep;
33
+ }
34
+
35
+ .snake-primary-deep-bg {
36
+ background-color: $snake-color-primary-deep;
37
+ }
38
+
39
+ .snake-primary-deeper {
40
+ color: $snake-color-primary-deeper;
41
+ }
42
+
43
+ .snake-primary-deeper-bg {
44
+ background-color: $snake-color-primary-deeper;
45
+ }
46
+
47
+ .snake-primary-disabled {
48
+ color: $snake-color-primary-disabled;
49
+ }
50
+
51
+ .snake-primary-ink {
52
+ color: $snake-color-primary-ink;
53
+ }
54
+
55
+ // ===== success / warning / error / info(4 档) =====
56
+ @each $type in success, warning, error, info {
57
+ .snake-#{$type} {
58
+ color: var(--snake-color-#{$type});
59
+ }
60
+
61
+ .snake-#{$type}-bg {
62
+ background-color: var(--snake-color-#{$type});
63
+ }
64
+
65
+ .snake-#{$type}-light {
66
+ color: var(--snake-color-#{$type}-light);
67
+ }
68
+
69
+ .snake-#{$type}-light-bg {
70
+ background-color: var(--snake-color-#{$type}-light);
71
+ }
72
+
73
+ .snake-#{$type}-dark {
74
+ color: var(--snake-color-#{$type}-dark);
75
+ }
76
+
77
+ .snake-#{$type}-dark-bg {
78
+ background-color: var(--snake-color-#{$type}-dark);
79
+ }
80
+
81
+ .snake-#{$type}-disabled {
82
+ color: var(--snake-color-#{$type}-disabled);
83
+ }
84
+
85
+ .snake-#{$type}-disabled-bg {
86
+ background-color: var(--snake-color-#{$type}-disabled);
87
+ }
88
+ }
89
+
90
+ // ===== 文字 4 级 =====
91
+ .snake-text {
92
+ color: $snake-color-text;
93
+ }
94
+
95
+ .snake-text-secondary {
96
+ color: $snake-color-text-secondary;
97
+ }
98
+
99
+ .snake-text-muted {
100
+ color: $snake-color-text-muted;
101
+ }
102
+
103
+ .snake-text-light {
104
+ color: $snake-color-text-light;
105
+ }
@@ -0,0 +1,171 @@
1
+ /*
2
+ * 布局工具类
3
+ * 保留原有 snake-flex-center / snake-line / snake-hover-class 等类以兼容旧用法。
4
+ */
5
+
6
+ .snake-relative,
7
+ .snake-rela {
8
+ position: relative;
9
+ }
10
+
11
+ .snake-absolute,
12
+ .snake-abso {
13
+ position: absolute;
14
+ }
15
+
16
+ // 字号档位(rpx)
17
+ .snake-font-xs {
18
+ font-size: 22rpx;
19
+ }
20
+
21
+ .snake-font-sm {
22
+ font-size: 26rpx;
23
+ }
24
+
25
+ .snake-font-md {
26
+ font-size: 28rpx;
27
+ }
28
+
29
+ .snake-font-lg {
30
+ font-size: 30rpx;
31
+ }
32
+
33
+ .snake-font-xl {
34
+ font-size: 34rpx;
35
+ }
36
+
37
+ // ===== flex 族(对齐 u-flex 语义:row + 垂直居中) =====
38
+ .snake-flex {
39
+ display: flex;
40
+ flex-direction: row;
41
+ align-items: center;
42
+ }
43
+
44
+ .snake-flex-center {
45
+ display: flex;
46
+ align-items: center;
47
+ justify-content: center;
48
+ }
49
+
50
+ .snake-flex-col {
51
+ display: flex;
52
+ flex-direction: column;
53
+ }
54
+
55
+ .snake-flex-wrap {
56
+ flex-wrap: wrap;
57
+ }
58
+
59
+ .snake-flex-nowrap {
60
+ flex-wrap: nowrap;
61
+ }
62
+
63
+ .snake-col-center {
64
+ align-items: center;
65
+ }
66
+
67
+ .snake-col-top {
68
+ align-items: flex-start;
69
+ }
70
+
71
+ .snake-col-bottom {
72
+ align-items: flex-end;
73
+ }
74
+
75
+ .snake-row-center {
76
+ justify-content: center;
77
+ }
78
+
79
+ .snake-row-left {
80
+ justify-content: flex-start;
81
+ }
82
+
83
+ .snake-row-right {
84
+ justify-content: flex-end;
85
+ }
86
+
87
+ .snake-row-between {
88
+ justify-content: space-between;
89
+ }
90
+
91
+ .snake-row-around {
92
+ justify-content: space-around;
93
+ }
94
+
95
+ .snake-text-left {
96
+ text-align: left;
97
+ }
98
+
99
+ .snake-text-center {
100
+ text-align: center;
101
+ }
102
+
103
+ .snake-text-right {
104
+ text-align: right;
105
+ }
106
+
107
+ .snake-hidden {
108
+ opacity: 0;
109
+ visibility: hidden;
110
+ }
111
+
112
+ // 定义flex等分
113
+ @for $i from 0 through 12 {
114
+ .snake-flex-#{$i} {
115
+ flex: $i;
116
+ }
117
+ }
118
+
119
+ // 定义字体(px)单位,小于20都为px单位字体
120
+ @for $i from 9 to 20 {
121
+ .snake-font-#{$i} {
122
+ font-size: $i + px;
123
+ }
124
+ }
125
+
126
+ // 定义字体(rpx)单位,大于或等于20的都为rpx单位字体
127
+ @for $i from 20 through 40 {
128
+ .snake-font-#{$i} {
129
+ font-size: $i + rpx;
130
+ }
131
+ }
132
+
133
+ // 定义内外边距,历遍1-80
134
+ @for $i from 0 through 80 {
135
+ // 只要双数和能被5除尽的数
136
+ @if $i % 2 == 0 or $i % 5 == 0 {
137
+ // 得出:snake-margin-30 或者 snake-m-30
138
+ .snake-margin-#{$i},
139
+ .snake-m-#{$i} {
140
+ margin: $i + rpx !important;
141
+ }
142
+
143
+ // 得出:snake-padding-30 或者 snake-p-30
144
+ .snake-padding-#{$i},
145
+ .snake-p-#{$i} {
146
+ padding: $i + rpx !important;
147
+ }
148
+
149
+ @each $short, $long in l left, t top, r right, b bottom {
150
+ // 缩写版,结果如:snake-m-l-30
151
+ .snake-m-#{$short}-#{$i} {
152
+ margin-#{$long}: $i + rpx !important;
153
+ }
154
+
155
+ // 定义内边距
156
+ .snake-p-#{$short}-#{$i} {
157
+ padding-#{$long}: $i + rpx !important;
158
+ }
159
+
160
+ // 完整版,结果如:snake-margin-left-30
161
+ .snake-margin-#{$long}-#{$i} {
162
+ margin-#{$long}: $i + rpx !important;
163
+ }
164
+
165
+ // 定义内边距
166
+ .snake-padding-#{$long}-#{$i} {
167
+ padding-#{$long}: $i + rpx !important;
168
+ }
169
+ }
170
+ }
171
+ }
@@ -0,0 +1,7 @@
1
+ /* #ifdef H5 */
2
+ body {
3
+ color: var(--snake-color-text);
4
+ background: var(--snake-color-background);
5
+ }
6
+ /* #endif */
7
+
@@ -0,0 +1,7 @@
1
+ /* #ifdef MP */
2
+ page {
3
+ color: var(--snake-color-text);
4
+ background: var(--snake-color-background);
5
+ }
6
+ /* #endif */
7
+
@@ -0,0 +1,70 @@
1
+ /*
2
+ * 页面级主题应用
3
+ * - H5 下 html 会由 applySnakeTheme() 加 snake-theme-dark class 与 data-snake-theme-mode
4
+ * - 页面根部由 snake-config-provider 携带同名 class(snake-theme-dark / data-snake-theme-mode)
5
+ */
6
+
7
+ /* #ifdef H5 */
8
+ :root {
9
+ color-scheme: light;
10
+ }
11
+
12
+ :root.snake-theme-dark,
13
+ :root[data-snake-theme-mode='dark'] {
14
+ color-scheme: dark;
15
+ }
16
+ /* #endif */
17
+
18
+ page {
19
+ color: $snake-color-text;
20
+ background-color: $snake-color-background;
21
+ font-size: 28rpx;
22
+ }
23
+
24
+ page.snake-theme-dark,
25
+ :root.snake-theme-dark page,
26
+ :root[data-snake-theme-mode='dark'] page {
27
+ background-color: $snake-color-background;
28
+ color: $snake-color-text;
29
+ }
30
+
31
+ .snake-config-provider {
32
+ color: $snake-color-text;
33
+ background-color: var(--snake-color-surface, #ffffff);
34
+ }
35
+
36
+ .snake-config-provider.snake-theme-dark {
37
+ background-color: var(--snake-color-surface, #151918);
38
+ color: $snake-color-text;
39
+ }
40
+
41
+ // picker-view遮罩层背景色
42
+ .snake-picker-view-mask,
43
+ .uni-picker-view-mask {
44
+ background-image:
45
+ linear-gradient(
46
+ 180deg,
47
+ rgba(var(--snake-color-surface-rgb, 255, 255, 255), 0.95),
48
+ rgba(var(--snake-color-surface-rgb, 255, 255, 255), 0.6)
49
+ ),
50
+ linear-gradient(
51
+ 0deg,
52
+ rgba(var(--snake-color-surface-rgb, 255, 255, 255), 0.95),
53
+ rgba(var(--snake-color-surface-rgb, 255, 255, 255), 0.6)
54
+ ) !important;
55
+ }
56
+
57
+ .snake-picker-view-indicator {
58
+ border: rgba(var(--snake-color-surface-rgb, 255, 255, 255), 0.6) !important;
59
+ }
60
+
61
+ // picker-view指示器边框色
62
+ .snake-picker-view-indicator::before,
63
+ .uni-picker-view-indicator::before {
64
+ border-top: 1px solid var(--snake-color-border, #dcdfe6) !important;
65
+ }
66
+
67
+ .snake-picker-view-indicator::after,
68
+ .uni-picker-view-indicator::after {
69
+ border-bottom: 1px solid var(--snake-color-border, #dcdfe6) !important;
70
+ }
@@ -0,0 +1,140 @@
1
+ /*
2
+ * vue 页面通用工具类
3
+ * line-clamp / 1px retina 边框 / safe-area / reset-button / hover 等。
4
+ */
5
+
6
+ // icon图标外层套一个view,让其达到更好的垂直居中的效果
7
+ .snake-icon-wrap {
8
+ display: flex;
9
+ align-items: center;
10
+ }
11
+
12
+ // ===== iPhoneX 安全区 =====
13
+ @each $d in top, right, bottom, left {
14
+ .snake-safe-area-inset-#{$d} {
15
+ padding-#{$d}: 0;
16
+ padding-#{$d}: constant(safe-area-inset-#{$d});
17
+ padding-#{$d}: env(safe-area-inset-#{$d});
18
+ }
19
+ }
20
+
21
+ // ===== hover 点击反馈 =====
22
+ .snake-hover-class {
23
+ opacity: 0.78;
24
+ }
25
+
26
+ .snake-cell-hover {
27
+ background-color: $snake-color-surface-muted !important;
28
+ }
29
+
30
+ // ===== 文本行数限制(1-5 行省略) =====
31
+ @for $i from 1 through 5 {
32
+ .snake-line-#{$i} {
33
+ @if $i == 1 {
34
+ overflow: hidden;
35
+ white-space: nowrap;
36
+ text-overflow: ellipsis;
37
+ } @else {
38
+ display: -webkit-box;
39
+ overflow: hidden;
40
+ text-overflow: ellipsis;
41
+ word-break: break-all;
42
+ -webkit-line-clamp: $i;
43
+ -webkit-box-orient: vertical;
44
+ }
45
+ }
46
+ }
47
+
48
+ .snake-line-force {
49
+ display: -webkit-box !important;
50
+ -webkit-box-orient: vertical !important;
51
+ }
52
+
53
+ // ===== Retina 屏幕下的 1px 边框 =====
54
+ .snake-border,
55
+ .snake-border-bottom,
56
+ .snake-border-left,
57
+ .snake-border-right,
58
+ .snake-border-top,
59
+ .snake-border-top-bottom {
60
+ position: relative;
61
+ }
62
+
63
+ .snake-border-bottom:after,
64
+ .snake-border-left:after,
65
+ .snake-border-right:after,
66
+ .snake-border-top-bottom:after,
67
+ .snake-border-top:after,
68
+ .snake-border:after {
69
+ content: ' ';
70
+ position: absolute;
71
+ left: 0;
72
+ top: 0;
73
+ pointer-events: none;
74
+ box-sizing: border-box;
75
+ -webkit-transform-origin: 0 0;
76
+ transform-origin: 0 0;
77
+ // 略小于 200% 是 Retina 伪元素缩放的防缺边补偿;勿简化为 200%,否则部分设备边框会出现断裂。
78
+ width: 199.8%;
79
+ height: 199.7%;
80
+ transform: scale(0.5, 0.5);
81
+ border: 0 solid $snake-color-border;
82
+ z-index: 2;
83
+ }
84
+
85
+ .snake-border-top:after {
86
+ border-top-width: 1px;
87
+ }
88
+
89
+ .snake-border-left:after {
90
+ border-left-width: 1px;
91
+ }
92
+
93
+ .snake-border-right:after {
94
+ border-right-width: 1px;
95
+ }
96
+
97
+ .snake-border-bottom:after {
98
+ border-bottom-width: 1px;
99
+ }
100
+
101
+ .snake-border-top-bottom:after {
102
+ border-width: 1px 0;
103
+ }
104
+
105
+ .snake-border:after {
106
+ border-width: 1px;
107
+ }
108
+
109
+ // ===== clearfix =====
110
+ .snake-clearfix:after,
111
+ .clearfix:after {
112
+ content: '';
113
+ display: table;
114
+ clear: both;
115
+ }
116
+
117
+ // ===== 去除button的所有默认样式,让其表现跟普通的view、text元素一样 =====
118
+ .snake-reset-button {
119
+ padding: 0;
120
+ margin: 0;
121
+ background-color: transparent;
122
+ font-size: inherit;
123
+ line-height: inherit;
124
+ color: inherit;
125
+ }
126
+
127
+ .snake-reset-button::after {
128
+ border: none;
129
+ }
130
+
131
+ // ===== 提升H5端uni.toast()的层级,避免被组件库的modal等遮盖 =====
132
+ /* #ifdef H5 */
133
+ uni-toast {
134
+ z-index: 10090;
135
+ }
136
+
137
+ uni-toast .uni-toast {
138
+ z-index: 10090;
139
+ }
140
+ /* #endif */
@@ -0,0 +1,75 @@
1
+ /**
2
+ * async-validator 类型声明文件
3
+ * 适用于 uView Pro 内置 async-validator.js
4
+ * 支持 Schema、规则、校验回调、辅助类型等
5
+ */
6
+
7
+ declare type ValidateError = {
8
+ message: string;
9
+ field?: string;
10
+ [key: string]: any;
11
+ };
12
+
13
+ declare type ValidateCallback = (
14
+ errors?: ValidateError[] | null,
15
+ fields?: Record<string, ValidateError[]> | null
16
+ ) => void;
17
+
18
+ declare interface ValidateRule {
19
+ type?: string;
20
+ required?: boolean;
21
+ message?: string;
22
+ validator?: (
23
+ rule: ValidateRule,
24
+ value: any,
25
+ callback: ValidateCallback,
26
+ source: Record<string, any>,
27
+ options: ValidateOptions
28
+ ) => void | boolean | string | Error | string[] | Promise<any>;
29
+ asyncValidator?: (
30
+ rule: ValidateRule,
31
+ value: any,
32
+ callback: ValidateCallback,
33
+ source: Record<string, any>,
34
+ options: ValidateOptions
35
+ ) => Promise<any>;
36
+ enum?: any[];
37
+ len?: number;
38
+ min?: number;
39
+ max?: number;
40
+ pattern?: RegExp | string;
41
+ whitespace?: boolean;
42
+ fields?: Record<string, ValidateRule | ValidateRule[]>;
43
+ defaultField?: ValidateRule | ValidateRule[];
44
+ transform?: (value: any) => any;
45
+ [key: string]: any;
46
+ }
47
+
48
+ declare interface ValidateOptions {
49
+ messages?: Record<string, any>;
50
+ suppressWarning?: boolean;
51
+ first?: boolean;
52
+ firstFields?: boolean | string[];
53
+ keys?: string[];
54
+ error?: (rule: ValidateRule, msg: string) => ValidateError;
55
+ [key: string]: any;
56
+ }
57
+
58
+ declare class Schema {
59
+ constructor(descriptor: Record<string, ValidateRule | ValidateRule[]>);
60
+ messages(messages?: Record<string, any>): Record<string, any>;
61
+ define(rules: Record<string, ValidateRule | ValidateRule[]>): void;
62
+ validate(
63
+ source: Record<string, any>,
64
+ options?: ValidateOptions | ValidateCallback,
65
+ callback?: ValidateCallback
66
+ ): Promise<void>;
67
+ getType(rule: ValidateRule): string;
68
+ getValidationMethod(rule: ValidateRule): ((...args: any[]) => unknown) | false;
69
+ static register(type: string, validator: (...args: any[]) => unknown): void;
70
+ static warning: (...args: any[]) => void;
71
+ static messages: Record<string, any>;
72
+ }
73
+
74
+ export = Schema;
75
+ export as namespace Schema;
@@ -0,0 +1,3 @@
1
+ function _extends(){return(_extends=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var t,n=arguments[r];for(t in n)Object.prototype.hasOwnProperty.call(n,t)&&(e[t]=n[t])}return e}).apply(this,arguments)}var formatRegExp=/%[sdj%]/g,warning=function(){};function convertFieldsError(e){if(!e||!e.length)return null;var t={};return e.forEach(function(e){var r=e.field;t[r]=t[r]||[],t[r].push(e)}),t}function format(){for(var e=arguments.length,r=new Array(e),t=0;t<e;t++)r[t]=arguments[t];var n=1,a=r[0],i=r.length;if("function"==typeof a)return a.apply(null,r.slice(1));if("string"!=typeof a)return a;for(var s=String(a).replace(formatRegExp,function(e){if("%%"===e)return"%";if(i<=n)return e;switch(e){case"%s":return String(r[n++]);case"%d":return Number(r[n++]);case"%j":try{return JSON.stringify(r[n++])}catch(e){return"[Circular]"}break;default:return e}}),u=r[n];n<i;u=r[++n])s+=" "+u;return s}function isNativeStringType(e){return"string"===e||"url"===e||"hex"===e||"email"===e||"pattern"===e}function isEmptyValue(e,r){return null==e||(!("array"!==r||!Array.isArray(e)||e.length)||!(!isNativeStringType(r)||"string"!=typeof e||e))}function asyncParallelArray(e,r,t){var n=[],a=0,i=e.length;function s(e){n.push.apply(n,e),++a===i&&t(n)}e.forEach(function(e){r(e,s)})}function asyncSerialArray(t,n,a){var i=0,s=t.length;!function e(r){r&&r.length?a(r):(r=i,i+=1,r<s?n(t[r],e):a([]))}([])}function flattenObjArr(r){var t=[];return Object.keys(r).forEach(function(e){t.push.apply(t,r[e])}),t}function asyncMap(a,e,i,s){if(e.first){var r=new Promise(function(r,t){asyncSerialArray(flattenObjArr(a),i,function(e){return s(e),e.length?t({errors:e,fields:convertFieldsError(e)}):r()})});return r.catch(function(e){return e}),r}var u=e.firstFields||[];!0===u&&(u=Object.keys(a));var o=Object.keys(a),l=o.length,f=0,p=[],e=new Promise(function(r,t){function n(e){if(p.push.apply(p,e),++f===l)return s(p),p.length?t({errors:p,fields:convertFieldsError(p)}):r()}o.length||(s(p),r()),o.forEach(function(e){var r=a[e];(-1!==u.indexOf(e)?asyncSerialArray:asyncParallelArray)(r,i,n)})});return e.catch(function(e){return e}),e}function complementError(r){return function(e){return e&&e.message?(e.field=e.field||r.fullField,e):{message:"function"==typeof e?e():e,field:e.field||r.fullField}}}function deepMerge(e,r){if(r)for(var t in r){var n;r.hasOwnProperty(t)&&("object"==typeof(n=r[t])&&"object"==typeof e[t]?e[t]=_extends({},e[t],{},n):e[t]=n)}return e}function required(e,r,t,n,a,i){!e.required||t.hasOwnProperty(e.field)&&!isEmptyValue(r,i||e.type)||n.push(format(a.messages.required,e.fullField))}function whitespace(e,r,t,n,a){!/^\s+$/.test(r)&&""!==r||n.push(format(a.messages.whitespace,e.fullField))}"undefined"!=typeof process&&process.env&&"production"!==process.env.NODE_ENV&&"undefined"!=typeof window&&"undefined"!=typeof document&&(warning=function(e,r){"undefined"!=typeof console&&console.warn&&r.every(function(e){return"string"==typeof e})&&console.warn(e,r)});var pattern={email:/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,url:new RegExp("^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$","i"),hex:/^#?([a-f0-9]{6}|[a-f0-9]{3})$/i},types={integer:function(e){return types.number(e)&&parseInt(e,10)===e},float:function(e){return types.number(e)&&!types.integer(e)},array:function(e){return Array.isArray(e)},regexp:function(e){if(e instanceof RegExp)return!0;try{return!!new RegExp(e)}catch(e){return!1}},date:function(e){return"function"==typeof e.getTime&&"function"==typeof e.getMonth&&"function"==typeof e.getYear},number:function(e){return!isNaN(e)&&"number"==typeof+e},object:function(e){return"object"==typeof e&&!types.array(e)},method:function(e){return"function"==typeof e},email:function(e){return"string"==typeof e&&!!e.match(pattern.email)&&e.length<255},url:function(e){return"string"==typeof e&&!!e.match(pattern.url)},hex:function(e){return"string"==typeof e&&!!e.match(pattern.hex)}};function type(e,r,t,n,a){e.required&&void 0===r?required(e,r,t,n,a):(t=e.type,-1<["integer","float","array","regexp","object","method","email","number","date","url","hex"].indexOf(t)?types[t](r)||n.push(format(a.messages.types[t],e.fullField,e.type)):t&&typeof r!==e.type&&n.push(format(a.messages.types[t],e.fullField,e.type)))}function range(e,r,t,n,a){var i="number"==typeof e.len,s="number"==typeof e.min,u="number"==typeof e.max,o=r,l=null,f="number"==typeof r,p="string"==typeof r,d=Array.isArray(r);if(f?l="number":p?l="string":d&&(l="array"),!l)return!1;d&&(o=r.length),p&&(o=r.replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,"_").length),i?o!==e.len&&n.push(format(a.messages[l].len,e.fullField,e.len)):s&&!u&&o<e.min?n.push(format(a.messages[l].min,e.fullField,e.min)):u&&!s&&o>e.max?n.push(format(a.messages[l].max,e.fullField,e.max)):s&&u&&(o<e.min||o>e.max)&&n.push(format(a.messages[l].range,e.fullField,e.min,e.max))}var ENUM="enum";function enumerable(e,r,t,n,a){e[ENUM]=Array.isArray(e[ENUM])?e[ENUM]:[],-1===e[ENUM].indexOf(r)&&n.push(format(a.messages[ENUM],e.fullField,e[ENUM].join(", ")))}function pattern$1(e,r,t,n,a){e.pattern&&(e.pattern instanceof RegExp?(e.pattern.lastIndex=0,e.pattern.test(r)||n.push(format(a.messages.pattern.mismatch,e.fullField,r,e.pattern))):"string"==typeof e.pattern&&(new RegExp(e.pattern).test(r)||n.push(format(a.messages.pattern.mismatch,e.fullField,r,e.pattern))))}var rules={required:required,whitespace:whitespace,type:type,range:range,enum:enumerable,pattern:pattern$1};function string(e,r,t,n,a){var i=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(isEmptyValue(r,"string")&&!e.required)return t();rules.required(e,r,n,i,a,"string"),isEmptyValue(r,"string")||(rules.type(e,r,n,i,a),rules.range(e,r,n,i,a),rules.pattern(e,r,n,i,a),!0===e.whitespace&&rules.whitespace(e,r,n,i,a))}t(i)}function method(e,r,t,n,a){var i=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(isEmptyValue(r)&&!e.required)return t();rules.required(e,r,n,i,a),void 0!==r&&rules.type(e,r,n,i,a)}t(i)}function number(e,r,t,n,a){var i=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(""===r&&(r=void 0),isEmptyValue(r)&&!e.required)return t();rules.required(e,r,n,i,a),void 0!==r&&(rules.type(e,r,n,i,a),rules.range(e,r,n,i,a))}t(i)}function _boolean(e,r,t,n,a){var i=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(isEmptyValue(r)&&!e.required)return t();rules.required(e,r,n,i,a),void 0!==r&&rules.type(e,r,n,i,a)}t(i)}function regexp(e,r,t,n,a){var i=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(isEmptyValue(r)&&!e.required)return t();rules.required(e,r,n,i,a),isEmptyValue(r)||rules.type(e,r,n,i,a)}t(i)}function integer(e,r,t,n,a){var i=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(isEmptyValue(r)&&!e.required)return t();rules.required(e,r,n,i,a),void 0!==r&&(rules.type(e,r,n,i,a),rules.range(e,r,n,i,a))}t(i)}function floatFn(e,r,t,n,a){var i=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(isEmptyValue(r)&&!e.required)return t();rules.required(e,r,n,i,a),void 0!==r&&(rules.type(e,r,n,i,a),rules.range(e,r,n,i,a))}t(i)}function array(e,r,t,n,a){var i=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(isEmptyValue(r,"array")&&!e.required)return t();rules.required(e,r,n,i,a,"array"),isEmptyValue(r,"array")||(rules.type(e,r,n,i,a),rules.range(e,r,n,i,a))}t(i)}function object(e,r,t,n,a){var i=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(isEmptyValue(r)&&!e.required)return t();rules.required(e,r,n,i,a),void 0!==r&&rules.type(e,r,n,i,a)}t(i)}var ENUM$1="enum";function enumerable$1(e,r,t,n,a){var i=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(isEmptyValue(r)&&!e.required)return t();rules.required(e,r,n,i,a),void 0!==r&&rules[ENUM$1](e,r,n,i,a)}t(i)}function pattern$2(e,r,t,n,a){var i=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(isEmptyValue(r,"string")&&!e.required)return t();rules.required(e,r,n,i,a),isEmptyValue(r,"string")||rules.pattern(e,r,n,i,a)}t(i)}function date(e,r,t,n,a){var i=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(isEmptyValue(r)&&!e.required)return t();rules.required(e,r,n,i,a),isEmptyValue(r)||(r="number"==typeof r?new Date(r):r,rules.type(e,r,n,i,a),r&&rules.range(e,r.getTime(),n,i,a))}t(i)}function required$1(e,r,t,n,a){var i=[],s=Array.isArray(r)?"array":typeof r;rules.required(e,r,n,i,a,s),t(i)}function type$1(e,r,t,n,a){var i=e.type,s=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(isEmptyValue(r,i)&&!e.required)return t();rules.required(e,r,n,s,a,i),isEmptyValue(r,i)||rules.type(e,r,n,s,a)}t(s)}function any(e,r,t,n,a){var i=[];if(e.required||!e.required&&n.hasOwnProperty(e.field)){if(isEmptyValue(r)&&!e.required)return t();rules.required(e,r,n,i,a)}t(i)}var validators={string:string,method:method,number:number,boolean:_boolean,regexp:regexp,integer:integer,float:floatFn,array:array,object:object,enum:enumerable$1,pattern:pattern$2,date:date,url:type$1,hex:type$1,email:type$1,required:required$1,any:any};function newMessages(){return{default:"Validation error on field %s",required:"%s is required",enum:"%s must be one of %s",whitespace:"%s cannot be empty",date:{format:"%s date %s is invalid for format %s",parse:"%s date could not be parsed, %s is invalid ",invalid:"%s date %s is invalid"},types:{string:"%s is not a %s",method:"%s is not a %s (function)",array:"%s is not an %s",object:"%s is not an %s",number:"%s is not a %s",date:"%s is not a %s",boolean:"%s is not a %s",integer:"%s is not an %s",float:"%s is not a %s",regexp:"%s is not a valid %s",email:"%s is not a valid %s",url:"%s is not a valid %s",hex:"%s is not a valid %s"},string:{len:"%s must be exactly %s characters",min:"%s must be at least %s characters",max:"%s cannot be longer than %s characters",range:"%s must be between %s and %s characters"},number:{len:"%s must equal %s",min:"%s cannot be less than %s",max:"%s cannot be greater than %s",range:"%s must be between %s and %s"},array:{len:"%s must be exactly %s in length",min:"%s cannot be less than %s in length",max:"%s cannot be greater than %s in length",range:"%s must be between %s and %s in length"},pattern:{mismatch:"%s value %s does not match pattern %s"},clone:function(){var e=JSON.parse(JSON.stringify(this));return e.clone=this.clone,e}}}var messages=newMessages();function Schema(e){this.rules=null,this._messages=messages,this.define(e)}Schema.prototype={messages:function(e){return e&&(this._messages=deepMerge(newMessages(),e)),this._messages},define:function(e){if(!e)throw new Error("Cannot configure a schema with no rules");if("object"!=typeof e||Array.isArray(e))throw new Error("Rules must be an object");var r,t;for(r in this.rules={},e)e.hasOwnProperty(r)&&(t=e[r],this.rules[r]=Array.isArray(t)?t:[t])},validate:function(t,e,r){var n=this;void 0===e&&(e={}),void 0===r&&(r=function(){});var a,i,s=t,p=e,u=r;if("function"==typeof p&&(u=p,p={}),!this.rules||0===Object.keys(this.rules).length)return u&&u(),Promise.resolve();p.messages?((r=this.messages())===messages&&(r=newMessages()),deepMerge(r,p.messages),p.messages=r):p.messages=this.messages();var o={};(p.keys||Object.keys(this.rules)).forEach(function(r){a=n.rules[r],i=s[r],a.forEach(function(e){"function"==typeof e.transform&&(s===t&&(s=_extends({},s)),i=s[r]=e.transform(i)),(e="function"==typeof e?{validator:e}:_extends({},e)).validator=n.getValidationMethod(e),e.field=r,e.fullField=e.fullField||r,e.type=n.getType(e),e.validator&&(o[r]=o[r]||[],o[r].push({rule:e,value:i,source:s,field:r}))})});var d={};return asyncMap(o,p,function(s,u){var e,o=s.rule,l=!("object"!==o.type&&"array"!==o.type||"object"!=typeof o.fields&&"object"!=typeof o.defaultField);function f(e,r){return _extends({},r,{fullField:o.fullField+"."+e})}function r(e){void 0===e&&(e=[]);var t=e;if(Array.isArray(t)||(t=[t]),!p.suppressWarning&&t.length&&Schema.warning("async-validator:",t),t.length&&o.message&&(t=[].concat(o.message)),t=t.map(complementError(o)),p.first&&t.length)return d[o.field]=1,u(t);if(l){if(o.required&&!s.value)return t=o.message?[].concat(o.message).map(complementError(o)):p.error?[p.error(o,format(p.messages.required,o.field))]:[],u(t);var r,n,a={};if(o.defaultField)for(var i in s.value)s.value.hasOwnProperty(i)&&(a[i]=o.defaultField);for(r in a=_extends({},a,{},s.rule.fields))a.hasOwnProperty(r)&&(n=Array.isArray(a[r])?a[r]:[a[r]],a[r]=n.map(f.bind(null,r)));e=new Schema(a);e.messages(p.messages),s.rule.options&&(s.rule.options.messages=p.messages,s.rule.options.error=p.error),e.validate(s.value,s.rule.options||p,function(e){var r=[];t&&t.length&&r.push.apply(r,t),e&&e.length&&r.push.apply(r,e),u(r.length?r:null)})}else u(t)}l=l&&(o.required||!o.required&&s.value),o.field=s.field,o.asyncValidator?e=o.asyncValidator(o,s.value,r,s.source,p):o.validator&&(!0===(e=o.validator(o,s.value,r,s.source,p))?r():!1===e?r(o.message||o.field+" fails"):e instanceof Array?r(e):e instanceof Error&&r(e.message)),e&&e.then&&e.then(function(){return r()},r)},function(e){!function(e){var r,t,n=[],a={};for(r=0;r<e.length;r++)t=e[r],Array.isArray(t)?n=n.concat.apply(n,t):n.push(t);a=n.length?convertFieldsError(n):n=null,u(n,a)}(e)})},getType:function(e){if(void 0===e.type&&e.pattern instanceof RegExp&&(e.type="pattern"),"function"!=typeof e.validator&&e.type&&!validators.hasOwnProperty(e.type))throw new Error(format("Unknown rule type %s",e.type));return e.type||"string"},getValidationMethod:function(e){if("function"==typeof e.validator)return e.validator;var r=Object.keys(e),t=r.indexOf("message");return-1!==t&&r.splice(t,1),1===r.length&&"required"===r[0]?validators.required:validators[this.getType(e)]||!1}},Schema.register=function(e,r){if("function"!=typeof r)throw new Error("Cannot register a validator by type, validator is not a function");validators[e]=r},Schema.warning=warning,Schema.messages=messages;export default Schema;
2
+
3
+
@@ -0,0 +1,3 @@
1
+ export * from './path';
2
+ export * from './types';
3
+ export * from './validate';
@@ -0,0 +1,40 @@
1
+ export type FormPath = string | Array<string | number>;
2
+
3
+ export function toPath(path: FormPath): Array<string | number> {
4
+ if (Array.isArray(path)) return [...path];
5
+ return String(path)
6
+ .replace(/\[(\d+)\]/g, '.$1')
7
+ .split('.')
8
+ .filter(Boolean)
9
+ .map(item => (/^\d+$/.test(item) ? Number(item) : item));
10
+ }
11
+
12
+ export function getPathValue(target: unknown, path: FormPath): unknown {
13
+ return toPath(path).reduce<unknown>(
14
+ (value, key) => (value == null ? undefined : (value as Record<string | number, unknown>)[key]),
15
+ target
16
+ );
17
+ }
18
+
19
+ export function setPathValue(target: unknown, path: FormPath, value: unknown): boolean {
20
+ const parts = toPath(path);
21
+ if (!target || typeof target !== 'object' || !parts.length) return false;
22
+ let cursor = target as Record<string | number, unknown>;
23
+ for (let index = 0; index < parts.length - 1; index += 1) {
24
+ const key = parts[index];
25
+ const nextKey = parts[index + 1];
26
+ if (!cursor[key] || typeof cursor[key] !== 'object') cursor[key] = typeof nextKey === 'number' ? [] : {};
27
+ cursor = cursor[key] as Record<string | number, unknown>;
28
+ }
29
+ cursor[parts[parts.length - 1]] = value;
30
+ return true;
31
+ }
32
+
33
+ export function cloneFormValue<T>(value: T): T {
34
+ if (value == null || typeof value !== 'object') return value;
35
+ if (value instanceof Date) return new Date(value.getTime()) as T;
36
+ if (Array.isArray(value)) return value.map(cloneFormValue) as T;
37
+ return Object.fromEntries(
38
+ Object.entries(value as Record<string, unknown>).map(([key, item]) => [key, cloneFormValue(item)])
39
+ ) as T;
40
+ }