@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.
- package/LICENSE +21 -0
- package/changelog.md +83 -0
- package/components/snake-activity-list/snake-activity-list.vue +365 -0
- package/components/snake-activity-list/types.ts +29 -0
- package/components/snake-auxiliary-segmentation/snake-auxiliary-segmentation.vue +44 -0
- package/components/snake-auxiliary-segmentation/types.ts +5 -0
- package/components/snake-button/snake-button.vue +357 -0
- package/components/snake-button/types.ts +103 -0
- package/components/snake-button-sort/snake-button-sort.vue +72 -0
- package/components/snake-button-sort/types.ts +22 -0
- package/components/snake-calendar/snake-calendar.vue +998 -0
- package/components/snake-calendar/types.ts +189 -0
- package/components/snake-cell-group/snake-cell-group.vue +55 -0
- package/components/snake-cell-group/types.ts +19 -0
- package/components/snake-cell-item/snake-cell-item.vue +159 -0
- package/components/snake-cell-item/types.ts +66 -0
- package/components/snake-checkbox/snake-checkbox.vue +264 -0
- package/components/snake-checkbox/types.ts +70 -0
- package/components/snake-checkbox-group/snake-checkbox-group.vue +154 -0
- package/components/snake-checkbox-group/types.ts +52 -0
- package/components/snake-cms/blocks/v2/cms-v2-carousel.vue +87 -0
- package/components/snake-cms/blocks/v2/cms-v2-coupon.vue +25 -0
- package/components/snake-cms/blocks/v2/cms-v2-custom.vue +12 -0
- package/components/snake-cms/blocks/v2/cms-v2-divider.vue +33 -0
- package/components/snake-cms/blocks/v2/cms-v2-floatbutton.vue +28 -0
- package/components/snake-cms/blocks/v2/cms-v2-goods-list.vue +150 -0
- package/components/snake-cms/blocks/v2/cms-v2-hotzone.vue +41 -0
- package/components/snake-cms/blocks/v2/cms-v2-images.vue +41 -0
- package/components/snake-cms/blocks/v2/cms-v2-magiccube.vue +93 -0
- package/components/snake-cms/blocks/v2/cms-v2-notice.vue +80 -0
- package/components/snake-cms/blocks/v2/cms-v2-popup.vue +46 -0
- package/components/snake-cms/blocks/v2/cms-v2-richtext.vue +18 -0
- package/components/snake-cms/blocks/v2/cms-v2-search.vue +115 -0
- package/components/snake-cms/blocks/v2/cms-v2-video.vue +25 -0
- package/components/snake-cms/blocks/v2/shared.ts +84 -0
- package/components/snake-cms/snake-cms.vue +409 -0
- package/components/snake-cms/types.ts +50 -0
- package/components/snake-commodity-search/snake-commodity-search.vue +234 -0
- package/components/snake-commodity-search/types.ts +11 -0
- package/components/snake-config-provider/snake-config-provider.vue +61 -0
- package/components/snake-config-provider/types.ts +22 -0
- package/components/snake-count-down/snake-count-down.vue +231 -0
- package/components/snake-count-down/types.ts +103 -0
- package/components/snake-coupon/snake-coupon.vue +209 -0
- package/components/snake-coupon/types.ts +21 -0
- package/components/snake-custom-module/snake-custom-module.vue +25 -0
- package/components/snake-custom-module/types.ts +11 -0
- package/components/snake-drop-menu/snake-drop-menu.vue +123 -0
- package/components/snake-drop-menu/types.ts +95 -0
- package/components/snake-drop-menu-item/snake-drop-menu-item.vue +181 -0
- package/components/snake-drop-menu-item/types.ts +48 -0
- package/components/snake-empty/snake-empty.vue +100 -0
- package/components/snake-empty/types.ts +48 -0
- package/components/snake-filter-sorts/filter-page.vue +695 -0
- package/components/snake-filter-sorts/snake-filter-sorts.vue +185 -0
- package/components/snake-filter-sorts/types.ts +57 -0
- package/components/snake-floating-bubble/snake-floating-bubble.vue +157 -0
- package/components/snake-floating-bubble/types.ts +43 -0
- package/components/snake-follow/snake-follow.vue +18 -0
- package/components/snake-follow/types.ts +2 -0
- package/components/snake-form/snake-form.vue +124 -0
- package/components/snake-form/types.ts +96 -0
- package/components/snake-form-item/snake-form-item.vue +331 -0
- package/components/snake-form-item/types.ts +70 -0
- package/components/snake-goods-list/snake-goods-list.vue +792 -0
- package/components/snake-goods-list/types.ts +55 -0
- package/components/snake-graphic-navigation/snake-graphic-navigation.vue +198 -0
- package/components/snake-graphic-navigation/types.ts +43 -0
- package/components/snake-icon/icon-names.ts +222 -0
- package/components/snake-icon/snake-icon.vue +220 -0
- package/components/snake-icon/types.ts +45 -0
- package/components/snake-image/snake-image.vue +230 -0
- package/components/snake-image/types.ts +70 -0
- package/components/snake-images/snake-images.vue +80 -0
- package/components/snake-images/types.ts +5 -0
- package/components/snake-index-anchor/snake-index-anchor.vue +83 -0
- package/components/snake-index-anchor/types.ts +14 -0
- package/components/snake-index-list/anchor-registry.ts +80 -0
- package/components/snake-index-list/snake-index-list.vue +259 -0
- package/components/snake-index-list/types.ts +115 -0
- package/components/snake-index-list-panel/snake-index-list-panel.vue +277 -0
- package/components/snake-index-list-panel/types.ts +10 -0
- package/components/snake-input/snake-input.vue +225 -0
- package/components/snake-input/types.ts +99 -0
- package/components/snake-jump-applet/snake-jump-applet.vue +99 -0
- package/components/snake-jump-applet/types.ts +17 -0
- package/components/snake-line/snake-line.vue +42 -0
- package/components/snake-line/types.ts +30 -0
- package/components/snake-line-progress/snake-line-progress.vue +105 -0
- package/components/snake-line-progress/types.ts +26 -0
- package/components/snake-link/snake-link.vue +74 -0
- package/components/snake-link/types.ts +30 -0
- package/components/snake-list-switching/components/tree-select/index.vue +156 -0
- package/components/snake-list-switching/snake-list-switching.vue +1285 -0
- package/components/snake-list-switching/types.ts +11 -0
- package/components/snake-loading/snake-loading.vue +241 -0
- package/components/snake-loading/types.ts +34 -0
- package/components/snake-loadmore/snake-loadmore.vue +103 -0
- package/components/snake-loadmore/types.ts +56 -0
- package/components/snake-magic-cube/snake-magic-cube.vue +622 -0
- package/components/snake-magic-cube/types.ts +5 -0
- package/components/snake-modal/snake-modal.vue +434 -0
- package/components/snake-modal/types.ts +71 -0
- package/components/snake-navbar/snake-navbar.vue +194 -0
- package/components/snake-navbar/types.ts +54 -0
- package/components/snake-no-network/snake-no-network.vue +125 -0
- package/components/snake-no-network/types.ts +27 -0
- package/components/snake-notice/snake-notice.vue +44 -0
- package/components/snake-notice/types.ts +5 -0
- package/components/snake-notice-bar/snake-notice-bar.vue +336 -0
- package/components/snake-notice-bar/types.ts +82 -0
- package/components/snake-overlay/snake-overlay.vue +73 -0
- package/components/snake-overlay/types.ts +35 -0
- package/components/snake-page-popup/snake-page-popup.vue +146 -0
- package/components/snake-page-popup/types.ts +28 -0
- package/components/snake-parse/audio/audio.vue +286 -0
- package/components/snake-parse/audio/context.js +11 -0
- package/components/snake-parse/audio/index.js +34 -0
- package/components/snake-parse/node/node.vue +830 -0
- package/components/snake-parse/parser.js +1480 -0
- package/components/snake-parse/snake-parse.vue +548 -0
- package/components/snake-parse/static/app-plus/snake-parse/js/handler.js +109 -0
- package/components/snake-parse/static/app-plus/snake-parse/js/uni.webview.js +0 -0
- package/components/snake-parse/static/app-plus/snake-parse/js/uni.webview.min.js +1 -0
- package/components/snake-parse/static/app-plus/snake-parse/local.html +3 -0
- package/components/snake-parse/style/index.js +132 -0
- package/components/snake-parse/style/parser.js +175 -0
- package/components/snake-parse/types.ts +49 -0
- package/components/snake-picture-ads/snake-picture-ads.vue +292 -0
- package/components/snake-picture-ads/types.ts +5 -0
- package/components/snake-popup/snake-popup.vue +348 -0
- package/components/snake-popup/types.ts +88 -0
- package/components/snake-qr-code/qrcode.ts +1214 -0
- package/components/snake-qr-code/snake-qr-code.vue +408 -0
- package/components/snake-qr-code/types.ts +78 -0
- package/components/snake-radio/snake-radio.vue +271 -0
- package/components/snake-radio/types.ts +64 -0
- package/components/snake-radio-group/snake-radio-group.vue +98 -0
- package/components/snake-radio-group/types.ts +48 -0
- package/components/snake-read-more/snake-read-more.vue +140 -0
- package/components/snake-read-more/types.ts +53 -0
- package/components/snake-rich-text/snake-rich-text.vue +24 -0
- package/components/snake-rich-text/types.ts +5 -0
- package/components/snake-root-portal/snake-root-portal.vue +92 -0
- package/components/snake-root-portal/types.ts +9 -0
- package/components/snake-search/snake-search.vue +202 -0
- package/components/snake-search/types.ts +84 -0
- package/components/snake-select/snake-select.vue +371 -0
- package/components/snake-select/types.ts +75 -0
- package/components/snake-skeleton/snake-skeleton.vue +104 -0
- package/components/snake-skeleton/types.ts +32 -0
- package/components/snake-skeleton-item/snake-skeleton-item.vue +90 -0
- package/components/snake-skeleton-item/types.ts +30 -0
- package/components/snake-slider/snake-slider.vue +249 -0
- package/components/snake-slider/types.ts +59 -0
- package/components/snake-sticky/snake-sticky.vue +178 -0
- package/components/snake-sticky/types.ts +48 -0
- package/components/snake-subsection/snake-subsection.vue +188 -0
- package/components/snake-subsection/types.ts +54 -0
- package/components/snake-swiper/snake-swiper.vue +229 -0
- package/components/snake-swiper/types.ts +79 -0
- package/components/snake-switch/snake-switch.vue +100 -0
- package/components/snake-switch/types.ts +41 -0
- package/components/snake-tabbar/snake-tabbar.vue +306 -0
- package/components/snake-tabbar/types.ts +93 -0
- package/components/snake-tabs/snake-tabs.vue +305 -0
- package/components/snake-tabs/types.ts +79 -0
- package/components/snake-text/snake-text.vue +292 -0
- package/components/snake-text/types.ts +100 -0
- package/components/snake-textarea/snake-textarea.vue +171 -0
- package/components/snake-textarea/types.ts +79 -0
- package/components/snake-toast/snake-toast.vue +330 -0
- package/components/snake-toast/types.ts +55 -0
- package/components/snake-tooltip/position.ts +33 -0
- package/components/snake-tooltip/snake-tooltip.vue +339 -0
- package/components/snake-tooltip/types.ts +80 -0
- package/components/snake-transition/snake-transition.vue +315 -0
- package/components/snake-transition/types.ts +65 -0
- package/components/snake-upload/snake-upload.vue +1801 -0
- package/components/snake-upload/types.ts +256 -0
- package/components/snake-videos/snake-videos.vue +122 -0
- package/components/snake-videos/types.ts +7 -0
- package/iconfont.css +881 -0
- package/index.d.ts +7 -0
- package/index.scss +26 -0
- package/index.ts +94 -0
- package/libs/cms/blocks.ts +103 -0
- package/libs/cms/config.ts +25 -0
- package/libs/cms/index.ts +7 -0
- package/libs/cms/normalize.ts +135 -0
- package/libs/cms/resolve.ts +12 -0
- package/libs/cms/types.ts +164 -0
- package/libs/cms/use-commerce.ts +385 -0
- package/libs/cms/v2.ts +193 -0
- package/libs/config/index.ts +4 -0
- package/libs/config/modal.ts +93 -0
- package/libs/config/state.ts +33 -0
- package/libs/config/theme.ts +351 -0
- package/libs/config/toast.ts +71 -0
- package/libs/config/types.ts +135 -0
- package/libs/config/zIndex.ts +44 -0
- package/libs/css/color.scss +105 -0
- package/libs/css/common.scss +171 -0
- package/libs/css/style.h5.scss +7 -0
- package/libs/css/style.mp.scss +7 -0
- package/libs/css/style.theme.scss +70 -0
- package/libs/css/style.vue.scss +140 -0
- package/libs/form/async-validator.min.d.ts +75 -0
- package/libs/form/async-validator.min.js +3 -0
- package/libs/form/index.ts +3 -0
- package/libs/form/path.ts +40 -0
- package/libs/form/types.ts +51 -0
- package/libs/form/validate.ts +149 -0
- package/libs/foundation.ts +96 -0
- package/libs/function/$parent.ts +33 -0
- package/libs/function/clipboard.ts +13 -0
- package/libs/function/color.ts +55 -0
- package/libs/function/debounce.ts +34 -0
- package/libs/function/deepClone.ts +30 -0
- package/libs/function/deepMerge.ts +25 -0
- package/libs/function/emitter.ts +30 -0
- package/libs/function/format.ts +27 -0
- package/libs/function/getParent.ts +53 -0
- package/libs/function/getRect.ts +29 -0
- package/libs/function/guid.ts +11 -0
- package/libs/function/index.ts +31 -0
- package/libs/function/queryParams.ts +73 -0
- package/libs/function/random.ts +6 -0
- package/libs/function/randomArray.ts +14 -0
- package/libs/function/route.ts +155 -0
- package/libs/function/sleep.ts +7 -0
- package/libs/function/style.ts +58 -0
- package/libs/function/styleUtils.ts +83 -0
- package/libs/function/system.ts +14 -0
- package/libs/function/test.ts +202 -0
- package/libs/function/throttle.ts +36 -0
- package/libs/function/timeFormat.ts +27 -0
- package/libs/function/timeFrom.ts +27 -0
- package/libs/function/toast.ts +10 -0
- package/libs/function/trim.ts +11 -0
- package/libs/function/type2icon.ts +11 -0
- package/libs/function/unit.ts +45 -0
- package/libs/hooks/index.ts +11 -0
- package/libs/hooks/useChildren.ts +125 -0
- package/libs/hooks/useColor.ts +5 -0
- package/libs/hooks/useDebounce.ts +5 -0
- package/libs/hooks/useLocale.ts +13 -0
- package/libs/hooks/useModal.ts +131 -0
- package/libs/hooks/useParent.ts +62 -0
- package/libs/hooks/useRect.ts +44 -0
- package/libs/hooks/useRouter.ts +5 -0
- package/libs/hooks/useTheme.ts +31 -0
- package/libs/hooks/useThrottle.ts +5 -0
- package/libs/hooks/useToast.ts +116 -0
- package/libs/index.ts +18 -0
- package/libs/request/auto-http.ts +1 -0
- package/libs/request/index.ts +343 -0
- package/libs/runtime/accessors.ts +55 -0
- package/libs/runtime/context.ts +40 -0
- package/libs/runtime/index.ts +18 -0
- package/libs/runtime/types.ts +49 -0
- package/libs/util/calendar.ts +6 -0
- package/locale/index.ts +130 -0
- package/locale/lang/en-US.ts +67 -0
- package/locale/lang/zh-CN.ts +67 -0
- package/package.json +134 -5
- package/plugins/index.ts +1 -0
- package/plugins/root/README.md +86 -0
- package/plugins/root/index.ts +123 -0
- package/plugins/root/page.ts +77 -0
- package/plugins/root/root.ts +53 -0
- package/plugins/root/utils.ts +137 -0
- package/readme.md +79 -0
- package/theme.scss +118 -0
- package/types/components.d.ts +236 -0
- package/types/global.d.ts +21 -0
- package/types/index.d.ts +6 -0
- package/types/uni-app.d.ts +16 -0
- 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,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,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
|
+
}
|