bge-ui 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. package/README.md +18 -0
  2. package/icons/Coin/HKD.svg +6 -0
  3. package/icons/Coin/USD.svg +4 -0
  4. package/icons/Intl/CH.svg +4 -0
  5. package/icons/Intl/EN.svg +14 -0
  6. package/icons/Intl/EUR.svg +15 -0
  7. package/icons/Intl/HKG.svg +8 -0
  8. package/icons/Intl/JPN.svg +4 -0
  9. package/icons/Intl/KOR.svg +6 -0
  10. package/icons/Intl/USA.svg +6 -0
  11. package/icons/Intl/VNM.svg +4 -0
  12. package/icons/Media/Facebook.svg +3 -0
  13. package/icons/Media/Instagram.svg +3 -0
  14. package/icons/Media/Linked.svg +3 -0
  15. package/icons/Media/Twitter.svg +3 -0
  16. package/icons/Mono/International.svg +3 -0
  17. package/icons/Mono/add-subtract.svg +4 -0
  18. package/icons/Mono/add.svg +3 -0
  19. package/icons/Mono/android.svg +3 -0
  20. package/icons/Mono/api.svg +5 -0
  21. package/icons/Mono/apple.svg +3 -0
  22. package/icons/Mono/arrow-down.svg +3 -0
  23. package/icons/Mono/arrow-up.svg +3 -0
  24. package/icons/Mono/assets.svg +4 -0
  25. package/icons/Mono/audit.svg +3 -0
  26. package/icons/Mono/bank card.svg +4 -0
  27. package/icons/Mono/building.svg +3 -0
  28. package/icons/Mono/calendar.svg +3 -0
  29. package/icons/Mono/check-fill.svg +3 -0
  30. package/icons/Mono/chevron-left.svg +3 -0
  31. package/icons/Mono/chevron-right-double.svg +4 -0
  32. package/icons/Mono/chevron-right.svg +3 -0
  33. package/icons/Mono/classify01.svg +3 -0
  34. package/icons/Mono/classify02.svg +6 -0
  35. package/icons/Mono/close-one.svg +4 -0
  36. package/icons/Mono/close.svg +3 -0
  37. package/icons/Mono/complete.svg +3 -0
  38. package/icons/Mono/copy.svg +4 -0
  39. package/icons/Mono/docunment.svg +5 -0
  40. package/icons/Mono/edit.svg +4 -0
  41. package/icons/Mono/email01.svg +3 -0
  42. package/icons/Mono/email02.svg +3 -0
  43. package/icons/Mono/exclamationmark-fill.svg +3 -0
  44. package/icons/Mono/eye-close.svg +4 -0
  45. package/icons/Mono/eye.svg +4 -0
  46. package/icons/Mono/googleplay.svg +6 -0
  47. package/icons/Mono/help.svg +5 -0
  48. package/icons/Mono/less.svg +3 -0
  49. package/icons/Mono/logout.svg +4 -0
  50. package/icons/Mono/menu.svg +5 -0
  51. package/icons/Mono/moon.svg +3 -0
  52. package/icons/Mono/more.svg +5 -0
  53. package/icons/Mono/notification.svg +3 -0
  54. package/icons/Mono/other-device.svg +5 -0
  55. package/icons/Mono/pic-error.svg +5 -0
  56. package/icons/Mono/pic.svg +4 -0
  57. package/icons/Mono/remove.svg +4 -0
  58. package/icons/Mono/route.svg +5 -0
  59. package/icons/Mono/safety.svg +4 -0
  60. package/icons/Mono/search.svg +3 -0
  61. package/icons/Mono/sun.svg +11 -0
  62. package/icons/Mono/time.svg +4 -0
  63. package/icons/Mono/toward-fill.svg +3 -0
  64. package/icons/Mono/transfer.svg +4 -0
  65. package/icons/Mono/trash.svg +6 -0
  66. package/icons/Mono/wallet.svg +4 -0
  67. package/icons/Mono/win.svg +6 -0
  68. package/icons/color/c2-all.svg +4 -0
  69. package/icons/color/c2-api.svg +5 -0
  70. package/icons/color/c2-assets.svg +4 -0
  71. package/icons/color/c2-bill-1.svg +4 -0
  72. package/icons/color/c2-bill-2.svg +5 -0
  73. package/icons/color/c2-card.svg +4 -0
  74. package/icons/color/c2-complete.svg +4 -0
  75. package/icons/color/c2-deal.svg +5 -0
  76. package/icons/color/c2-email.svg +4 -0
  77. package/icons/color/c2-fee.svg +6 -0
  78. package/icons/color/c2-google.svg +4 -0
  79. package/icons/color/c2-home.svg +4 -0
  80. package/icons/color/c2-kyc.svg +5 -0
  81. package/icons/color/c2-language.svg +4 -0
  82. package/icons/color/c2-level.svg +4 -0
  83. package/icons/color/c2-notification.svg +4 -0
  84. package/icons/color/c2-pdf.svg +4 -0
  85. package/icons/color/c2-phone.svg +4 -0
  86. package/icons/color/c2-register.svg +5 -0
  87. package/icons/color/c2-right-down.svg +4 -0
  88. package/icons/color/c2-right-up.svg +4 -0
  89. package/icons/color/c2-safe-shield.svg +4 -0
  90. package/icons/color/c2-safe.svg +4 -0
  91. package/icons/color/c2-traffic-cone.svg +7 -0
  92. package/icons/color/c2-user-every.svg +9 -0
  93. package/icons/color/c2-user.svg +5 -0
  94. package/icons/color/c3-Licensing.svg +5 -0
  95. package/icons/color/c3-audits.svg +7 -0
  96. package/icons/color/c3-card.svg +5 -0
  97. package/icons/color/c3-company.svg +6 -0
  98. package/icons/color/c3-deposit.svg +6 -0
  99. package/icons/color/c3-establish.svg +5 -0
  100. package/icons/color/c3-framework.svg +5 -0
  101. package/icons/color/c3-kyc.svg +7 -0
  102. package/icons/color/c3-not-passed.svg +7 -0
  103. package/icons/color/c3-pass.svg +7 -0
  104. package/icons/color/c3-safes.svg +8 -0
  105. package/icons/color/c3-trading.svg +5 -0
  106. package/icons/color/c3-user-every.svg +11 -0
  107. package/icons/color/c3-user-follow.svg +6 -0
  108. package/icons/color/c3-user.svg +6 -0
  109. package/icons/color/close-fill.svg +4 -0
  110. package/icons/color/completed-fill.svg +4 -0
  111. package/icons/color/cookie.svg +16 -0
  112. package/icons/color/star.svg +4 -0
  113. package/icons/color/success-fill.svg +11 -0
  114. package/icons/color/time-fill.svg +4 -0
  115. package/icons/color/toward-fill.svg +6 -0
  116. package/icons/generate.ts +152 -0
  117. package/package.json +37 -0
  118. package/src/button/index.vue +120 -0
  119. package/src/button/type.ts +4 -0
  120. package/src/dropdown/index.vue +10 -0
  121. package/src/form/form-item.vue +234 -0
  122. package/src/form/index.vue +122 -0
  123. package/src/icons/CoinHkd.vue +80 -0
  124. package/src/icons/CoinUsd.vue +72 -0
  125. package/src/icons/ColorC2All.vue +75 -0
  126. package/src/icons/ColorC2Api.vue +71 -0
  127. package/src/icons/ColorC2Assets.vue +72 -0
  128. package/src/icons/ColorC2Bill1.vue +70 -0
  129. package/src/icons/ColorC2Bill2.vue +68 -0
  130. package/src/icons/ColorC2Card.vue +67 -0
  131. package/src/icons/ColorC2Complete.vue +72 -0
  132. package/src/icons/ColorC2Deal.vue +74 -0
  133. package/src/icons/ColorC2Email.vue +70 -0
  134. package/src/icons/ColorC2Fee.vue +78 -0
  135. package/src/icons/ColorC2Google.vue +70 -0
  136. package/src/icons/ColorC2Home.vue +70 -0
  137. package/src/icons/ColorC2Kyc.vue +73 -0
  138. package/src/icons/ColorC2Language.vue +70 -0
  139. package/src/icons/ColorC2Level.vue +72 -0
  140. package/src/icons/ColorC2Notification.vue +75 -0
  141. package/src/icons/ColorC2Pdf.vue +73 -0
  142. package/src/icons/ColorC2Phone.vue +67 -0
  143. package/src/icons/ColorC2Register.vue +68 -0
  144. package/src/icons/ColorC2RightDown.vue +72 -0
  145. package/src/icons/ColorC2RightUp.vue +72 -0
  146. package/src/icons/ColorC2Safe.vue +75 -0
  147. package/src/icons/ColorC2SafeShield.vue +72 -0
  148. package/src/icons/ColorC2TrafficCone.vue +79 -0
  149. package/src/icons/ColorC2User.vue +79 -0
  150. package/src/icons/ColorC2UserEvery.vue +90 -0
  151. package/src/icons/ColorC3Audits.vue +76 -0
  152. package/src/icons/ColorC3Card.vue +68 -0
  153. package/src/icons/ColorC3Company.vue +69 -0
  154. package/src/icons/ColorC3Deposit.vue +74 -0
  155. package/src/icons/ColorC3Establish.vue +78 -0
  156. package/src/icons/ColorC3Framework.vue +71 -0
  157. package/src/icons/ColorC3Kyc.vue +76 -0
  158. package/src/icons/ColorC3Licensing.vue +71 -0
  159. package/src/icons/ColorC3NotPassed.vue +76 -0
  160. package/src/icons/ColorC3Pass.vue +78 -0
  161. package/src/icons/ColorC3Safes.vue +83 -0
  162. package/src/icons/ColorC3Trading.vue +78 -0
  163. package/src/icons/ColorC3User.vue +78 -0
  164. package/src/icons/ColorC3UserEvery.vue +98 -0
  165. package/src/icons/ColorC3UserFollow.vue +83 -0
  166. package/src/icons/ColorCloseFill.vue +74 -0
  167. package/src/icons/ColorCompletedFill.vue +71 -0
  168. package/src/icons/ColorCookie.vue +99 -0
  169. package/src/icons/ColorStar.vue +72 -0
  170. package/src/icons/ColorSuccessFill.vue +78 -0
  171. package/src/icons/ColorTimeFill.vue +66 -0
  172. package/src/icons/ColorTowardFill.vue +68 -0
  173. package/src/icons/IntlCh.vue +76 -0
  174. package/src/icons/IntlEn.vue +112 -0
  175. package/src/icons/IntlEur.vue +116 -0
  176. package/src/icons/IntlHkg.vue +98 -0
  177. package/src/icons/IntlJpn.vue +76 -0
  178. package/src/icons/IntlKor.vue +88 -0
  179. package/src/icons/IntlUsa.vue +83 -0
  180. package/src/icons/IntlVnm.vue +76 -0
  181. package/src/icons/MediaFacebook.vue +72 -0
  182. package/src/icons/MediaInstagram.vue +72 -0
  183. package/src/icons/MediaLinked.vue +72 -0
  184. package/src/icons/MediaTwitter.vue +70 -0
  185. package/src/icons/MonoAdd.vue +70 -0
  186. package/src/icons/MonoAddSubtract.vue +68 -0
  187. package/src/icons/MonoAndroid.vue +72 -0
  188. package/src/icons/MonoApi.vue +77 -0
  189. package/src/icons/MonoApple.vue +70 -0
  190. package/src/icons/MonoArrowDown.vue +67 -0
  191. package/src/icons/MonoArrowUp.vue +67 -0
  192. package/src/icons/MonoAssets.vue +78 -0
  193. package/src/icons/MonoAudit.vue +72 -0
  194. package/src/icons/MonoBankCard.vue +73 -0
  195. package/src/icons/MonoBuilding.vue +72 -0
  196. package/src/icons/MonoCalendar.vue +72 -0
  197. package/src/icons/MonoCheckFill.vue +72 -0
  198. package/src/icons/MonoChevronLeft.vue +72 -0
  199. package/src/icons/MonoChevronRight.vue +72 -0
  200. package/src/icons/MonoChevronRightDouble.vue +78 -0
  201. package/src/icons/MonoClassify01.vue +72 -0
  202. package/src/icons/MonoClassify02.vue +90 -0
  203. package/src/icons/MonoClose.vue +70 -0
  204. package/src/icons/MonoCloseOne.vue +76 -0
  205. package/src/icons/MonoComplete.vue +72 -0
  206. package/src/icons/MonoCopy.vue +73 -0
  207. package/src/icons/MonoDocunment.vue +74 -0
  208. package/src/icons/MonoEdit.vue +78 -0
  209. package/src/icons/MonoEmail01.vue +72 -0
  210. package/src/icons/MonoEmail02.vue +72 -0
  211. package/src/icons/MonoExclamationmarkFill.vue +72 -0
  212. package/src/icons/MonoEye.vue +78 -0
  213. package/src/icons/MonoEyeClose.vue +78 -0
  214. package/src/icons/MonoGoogleplay.vue +82 -0
  215. package/src/icons/MonoHelp.vue +77 -0
  216. package/src/icons/MonoInternational.vue +70 -0
  217. package/src/icons/MonoLess.vue +67 -0
  218. package/src/icons/MonoLogout.vue +71 -0
  219. package/src/icons/MonoMenu.vue +69 -0
  220. package/src/icons/MonoMoon.vue +72 -0
  221. package/src/icons/MonoMore.vue +69 -0
  222. package/src/icons/MonoNotification.vue +72 -0
  223. package/src/icons/MonoOtherDevice.vue +74 -0
  224. package/src/icons/MonoPic.vue +76 -0
  225. package/src/icons/MonoPicError.vue +80 -0
  226. package/src/icons/MonoRemove.vue +73 -0
  227. package/src/icons/MonoRoute.vue +69 -0
  228. package/src/icons/MonoSafety.vue +76 -0
  229. package/src/icons/MonoSearch.vue +72 -0
  230. package/src/icons/MonoSun.vue +95 -0
  231. package/src/icons/MonoTime.vue +78 -0
  232. package/src/icons/MonoTowardFill.vue +72 -0
  233. package/src/icons/MonoTransfer.vue +74 -0
  234. package/src/icons/MonoTrash.vue +75 -0
  235. package/src/icons/MonoWallet.vue +73 -0
  236. package/src/icons/MonoWin.vue +70 -0
  237. package/src/icons/index.ts +231 -0
  238. package/src/index.ts +50 -0
  239. package/src/input/index.vue +256 -0
  240. package/src/link/index.vue +95 -0
  241. package/src/message/index.vue +205 -0
  242. package/src/message/method.ts +138 -0
  243. package/src/tabs/index.vue +126 -0
  244. package/src/tabs/tab-pane.vue +96 -0
  245. package/src/tooltip/index.vue +338 -0
  246. package/src/tooltip/only-child.tsx +70 -0
  247. package/src/tooltip/usePopper.ts +578 -0
@@ -0,0 +1,120 @@
1
+ <script setup lang="ts">
2
+ import { defineProps } from 'vue'
3
+ defineOptions({
4
+ name: 'Button',
5
+ })
6
+
7
+
8
+ defineProps({
9
+ size: {
10
+ default: 'default',
11
+ value: [
12
+ 'default',
13
+ 'large',
14
+ 'mini',
15
+ ],
16
+ type: String,
17
+ },
18
+ type: {
19
+ default: 'primary',
20
+ value: [
21
+ 'primary',
22
+ 'secondary',
23
+ 'white',
24
+ 'violet'
25
+ ],
26
+ type: String,
27
+ },
28
+ disabled: {
29
+ default: false,
30
+ type: Boolean
31
+ }
32
+ })
33
+ </script>
34
+
35
+ <template>
36
+ <button type="button" :class="`bge-button bge-button--${type} bge-button--${size}`" :disabled="disabled">
37
+ <slot></slot>
38
+ </button>
39
+ </template>
40
+ <style lang="scss" scoped>
41
+ .bge-button {
42
+
43
+ &+.bge-button {
44
+ margin-left: 12px;
45
+ }
46
+
47
+ &.bge-button--primary {
48
+ --color: var(--persistent-black);
49
+ --btn: var(--btn-primary);
50
+ --btn-hover: var(--btn-primary-hover);
51
+ --btn-pressed: var(--btn-primary-pressed);
52
+ --btn-disable: var(--btn-primary-disable);
53
+ }
54
+
55
+ &.bge-button--secondary {
56
+ --color: var(--tc-primary);
57
+ --btn: var(--btn-secondary);
58
+ --btn-hover: var(--btn-secondary-hover);
59
+ --btn-pressed: var(--btn-secondary-pressed);
60
+ --btn-disable: var(--btn-secondary-disable);
61
+ }
62
+
63
+ &.bge-button--white {
64
+ --color: var(--persistent-black);
65
+ --btn: var(--btn-white);
66
+ --btn-hover: var(--btn-white-hover);
67
+ --btn-pressed: var(--btn-white-pressed);
68
+ --btn-disable: var(--btn-white-disable);
69
+ }
70
+
71
+ &.bge-button--violet {
72
+ --color: var(--persistent-white);
73
+ --btn: var(--btn-violet);
74
+ --btn-hover: var(--btn-violet-hover);
75
+ --btn-pressed: var(--btn-violet-hover);
76
+ --btn-disable: var(--btn-violet-disable);
77
+ }
78
+
79
+ &.bge-button--large {
80
+ font-size: 16px;
81
+ font-weight: 500;
82
+ line-height: 28px;
83
+ padding: 12px 24px;
84
+ }
85
+
86
+ &.bge-button--mini {
87
+ font-size: 12px;
88
+ font-weight: 500;
89
+ line-height: 20px;
90
+ padding: 4px 16px;
91
+ }
92
+
93
+ background: var(--btn);
94
+ color: var(--color);
95
+ padding: 8px 16px;
96
+ font-size: 14px;
97
+ font-weight: 500;
98
+ border-radius: 0;
99
+ border: none;
100
+ outline: none;
101
+ text-align: center;
102
+ cursor: pointer;
103
+ white-space: nowrap;
104
+ box-sizing: border-box;
105
+ user-select: none;
106
+
107
+ &:hover {
108
+ background: var(--btn-hover);
109
+ }
110
+
111
+ &:active {
112
+ background: var(--btn-pressed);
113
+ }
114
+
115
+ &:disabled {
116
+ cursor: not-allowed;
117
+ background: var(--btn-disable);
118
+ }
119
+ }
120
+ </style>
@@ -0,0 +1,4 @@
1
+ import { ExtractPropTypes } from "vue";
2
+ import UiButton from "./index.vue";
3
+
4
+ export type UiButtonProps = ExtractPropTypes<typeof UiButton>;
@@ -0,0 +1,10 @@
1
+ <template>
2
+ <div class="bge-dropdown">
3
+ <slot></slot>
4
+ <div class="bge-popper bge-dropdown__popper">
5
+ <slot name="dropdown"></slot>
6
+ </div>
7
+ </div>
8
+ </template>
9
+ <script setup lang="ts">
10
+ </script>
@@ -0,0 +1,234 @@
1
+ <template>
2
+ <div ref="formItemRef" class="bge-form-item">
3
+ <div class="bge-form-item__label" v-if="isShowLabel">
4
+ <slot name="label" :label="currentLabel">
5
+ {{ currentLabel }}
6
+ </slot>
7
+ </div>
8
+
9
+ <div class="bge-form-item__content" :class="{ error: shouldShowError }">
10
+ <slot />
11
+ <transition-group name="form-item-zoom-in-top">
12
+ <slot v-if="shouldShowError" name="error" :error="validateMessage">
13
+ <div class="bge-form-item__error">
14
+ {{ validateMessage }}
15
+ </div>
16
+ </slot>
17
+ </transition-group>
18
+ </div>
19
+ </div>
20
+ </template>
21
+ <script setup lang="ts">
22
+ import { computed, inject, onMounted, provide, reactive, ref, toRefs, useSlots } from 'vue'
23
+ import { refDebounced } from '@vueuse/core'
24
+ import AsyncValidator from 'async-validator'
25
+
26
+ const props = defineProps({
27
+ label: String,
28
+ formItemClass: String,
29
+ prop: [String, Array],
30
+ required: Boolean,
31
+ rules: [Array, Object]
32
+ })
33
+
34
+ const labelSlot = useSlots().label
35
+ const isShowLabel = computed(() => {
36
+ return !!labelSlot || props.label
37
+ })
38
+ let isString: any = (value: any) => typeof value === 'string' || value instanceof String;
39
+
40
+ const propString: any = computed(() => {
41
+ if (!props.prop) return ''
42
+ return isString(props.prop) ? props.prop : (props.prop as Array<any>).join('.')
43
+ })
44
+
45
+
46
+ const formContextKey = 'bge-form-context'
47
+ const formContext: any = inject(formContextKey, undefined)
48
+
49
+ const validateMessage = ref('')
50
+ const validateState = ref<string>('')
51
+ const formItemRef = ref<HTMLDivElement>()
52
+
53
+ let isResettingField = false
54
+
55
+ const fieldValue = computed(() => {
56
+ const model = formContext?.model
57
+ if (!model || !props.prop) {
58
+ return
59
+ }
60
+ return model[props.prop as string]
61
+ })
62
+
63
+ const setValidationState = (state: any) => {
64
+ validateState.value = state
65
+ }
66
+
67
+ const onValidationFailed = (error: any) => {
68
+ const { errors, fields } = error
69
+ if (!errors || !fields) {
70
+ console.error(error)
71
+ }
72
+
73
+ setValidationState('error')
74
+ validateMessage.value = errors
75
+ ? errors?.[0]?.message ?? `${props.prop} is required`
76
+ : ''
77
+
78
+ formContext?.emit('validate', props.prop!, false, validateMessage.value)
79
+ }
80
+
81
+ const onValidationSucceeded = () => {
82
+ setValidationState('success')
83
+ formContext?.emit('validate', props.prop!, true, '')
84
+ }
85
+
86
+ const doValidate = async (rules: any[]): Promise<true> => {
87
+ const modelName: string = propString.value
88
+ const validator = new AsyncValidator({
89
+ [modelName]: rules,
90
+ })
91
+ return validator
92
+ .validate({ [modelName]: fieldValue.value }, { firstFields: true })
93
+ .then(() => {
94
+ onValidationSucceeded()
95
+ return true as const
96
+ })
97
+ .catch((err: any) => {
98
+ onValidationFailed(err)
99
+ return Promise.reject(err)
100
+ })
101
+ }
102
+
103
+ function isFunction(functionToCheck: any) {
104
+ return functionToCheck && {}.toString.call(functionToCheck) === '[object Function]';
105
+ }
106
+
107
+ function ensureArray(arr: [] | object) {
108
+ return Array.isArray(arr) ? arr : [arr]
109
+ }
110
+
111
+ const validateEnabled = computed(() => normalizedRules.value.length > 0)
112
+
113
+ const normalizedRules = computed(() => {
114
+
115
+ const rules: any[] = []
116
+
117
+ if (props.rules) {
118
+ rules.push(...ensureArray(props.rules))
119
+ }
120
+
121
+ const formRules: any = formContext?.rules
122
+ if (formRules && props.prop) {
123
+ const _rules = formRules[props.prop as string]
124
+ if (_rules) {
125
+ rules.push(...ensureArray(_rules))
126
+ }
127
+ }
128
+ return rules
129
+ })
130
+
131
+ const getFilteredRule = (trigger: string) => {
132
+ const rules = normalizedRules.value
133
+ return (
134
+ rules
135
+ .filter((rule) => {
136
+ if (!rule.trigger || !trigger) return true
137
+ if (Array.isArray(rule.trigger)) {
138
+ return rule.trigger.includes(trigger)
139
+ } else {
140
+ return rule.trigger === trigger
141
+ }
142
+ })
143
+ // exclude trigger
144
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
145
+ .map(({ trigger, ...rule }): any => rule)
146
+ )
147
+ }
148
+
149
+ const validate: any = async (trigger: any, callback: any) => {
150
+ // skip validation if its resetting
151
+ if (isResettingField || !props.prop) {
152
+ return false
153
+ }
154
+
155
+ const hasCallback = isFunction(callback)
156
+ if (!validateEnabled.value) {
157
+ callback?.(false)
158
+ return false
159
+ }
160
+
161
+ const rules = getFilteredRule(trigger)
162
+ if (rules.length === 0) {
163
+ callback?.(true)
164
+ return true
165
+ }
166
+
167
+ setValidationState('validating')
168
+
169
+ return doValidate(rules)
170
+ .then(() => {
171
+ callback?.(true)
172
+ return true as const
173
+ })
174
+ .catch((err: any) => {
175
+ const { fields } = err
176
+ callback?.(false, fields)
177
+ return hasCallback ? false : Promise.reject(fields)
178
+ })
179
+ }
180
+
181
+ const context: any = reactive({
182
+ ...toRefs(props),
183
+ $el: formItemRef,
184
+ validateState,
185
+ // resetField,
186
+ // clearValidate,
187
+ validate,
188
+ })
189
+
190
+ provide('bge-form-item-context', context)
191
+
192
+
193
+ const validateStateDebounced = refDebounced(validateState, 100)
194
+
195
+
196
+ const currentLabel = computed(
197
+ () => `${props.label || ''}`
198
+ )
199
+
200
+ const shouldShowError = computed(
201
+ () =>
202
+ validateStateDebounced.value === 'error'
203
+ )
204
+
205
+ onMounted(() => {
206
+ formContext?.addField(context)
207
+ })
208
+ </script>
209
+ <style lang="scss" scoped>
210
+ .bge-form-item {
211
+ margin-bottom: 24px;
212
+
213
+ .bge-form-item__label {
214
+ color: var(--tc-secondary, #798EA3);
215
+ padding: var(--layout-x-0, 0);
216
+ font-size: 14px;
217
+ font-weight: 400;
218
+ line-height: 24px;
219
+ margin-bottom: 4px;
220
+ }
221
+
222
+ &:last-child {
223
+ margin-bottom: 0;
224
+ }
225
+
226
+ .bge-form-item__error {
227
+ color: var(--tc-red, #FF477E);
228
+ font-size: 12px;
229
+ font-weight: 400;
230
+ line-height: 20px;
231
+ margin-top: 4px;
232
+ }
233
+ }
234
+ </style>
@@ -0,0 +1,122 @@
1
+ <template>
2
+ <form class="bge-form" :class="{ inline: inline }">
3
+ <slot name="default" />
4
+ </form>
5
+ </template>
6
+ <script setup lang="ts">
7
+ import { defineProps, provide, reactive, toRefs } from 'vue'
8
+ defineOptions({
9
+ name: 'Form',
10
+ })
11
+ const emit = defineEmits(['validate'])
12
+ const props = defineProps({
13
+ inline: Boolean,
14
+ formClass: {
15
+ type: String,
16
+ default: ''
17
+ },
18
+ rules: {
19
+ type: Object,
20
+ },
21
+ model: {
22
+ type: Object,
23
+ },
24
+ disabled: Boolean,
25
+ })
26
+
27
+
28
+ async function validate(callback: any) {
29
+ let validationErrors: any = {}
30
+ for (const field of fields) {
31
+ try {
32
+ await field.validate()
33
+ } catch (errors) {
34
+ validationErrors = {
35
+ ...validationErrors,
36
+ ...(errors as any),
37
+ }
38
+ }
39
+ }
40
+ if (Object.keys(validationErrors).length === 0) return callback && callback(true, validationErrors)
41
+
42
+ return callback(false, validationErrors)
43
+ }
44
+ function resetFields() {
45
+ console.log('resetFields')
46
+ }
47
+
48
+ function clearValidate() {
49
+ console.log('clearValidate')
50
+ }
51
+
52
+ function validateField() {
53
+ console.log('validateField')
54
+ }
55
+
56
+ const fields: any = []
57
+ function addField(ctx: any) {
58
+ fields.push(ctx)
59
+ }
60
+
61
+
62
+ provide(
63
+ 'bge-form-context',
64
+ reactive({
65
+ ...toRefs(props),
66
+ resetFields,
67
+ clearValidate,
68
+ validateField,
69
+ addField,
70
+ emit
71
+ })
72
+ )
73
+
74
+ defineExpose({
75
+ /**
76
+ * @description Validate the whole form. Receives a callback or returns `Promise`.
77
+ */
78
+ validate,
79
+ /**
80
+ * @description Validate specified fields.
81
+ */
82
+ validateField,
83
+ /**
84
+ * @description Reset specified fields and remove validation result.
85
+ */
86
+ resetFields,
87
+ /**
88
+ * @description Clear validation message for specified fields.
89
+ */
90
+ clearValidate,
91
+ })
92
+
93
+ </script>
94
+ <style lang="scss">
95
+ .bge-form {
96
+
97
+ &.inline {
98
+ .bge-form-item__content {
99
+ width: 220px;
100
+ }
101
+
102
+ .bge-form-item {
103
+ display: inline-flex;
104
+ vertical-align: middle;
105
+ margin-right: 32px;
106
+ }
107
+ }
108
+
109
+ .bge-form-item__content {
110
+ &.error {
111
+ .bge-input__wrapper {
112
+ border: 1px solid var(--tc-red, #FF477E);
113
+ }
114
+ }
115
+ }
116
+ }
117
+ </style>
118
+ <style lang="scss" scoped>
119
+ .bge-form {
120
+ margin: 0;
121
+ }
122
+ </style>
@@ -0,0 +1,80 @@
1
+ <template>
2
+ <svg
3
+ :style="`width: 1em; height: 1em; font-size: ${size}px;`"
4
+ width="24"
5
+ height="24"
6
+ viewBox="0 0 24 24"
7
+ fill="none"
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ >
10
+ <path
11
+ d="M0 12C-3.32088e-08 13.5759 0.310389 15.1363 0.913446 16.5922C1.5165 18.0481 2.40042 19.371 3.51472 20.4853C4.62902 21.5996 5.95189 22.4835 7.4078 23.0866C8.86371 23.6896 10.4241 24 12 24C13.5759 24 15.1363 23.6896 16.5922 23.0866C18.0481 22.4835 19.371 21.5996 20.4853 20.4853C21.5996 19.371 22.4835 18.0481 23.0866 16.5922C23.6896 15.1363 24 13.5759 24 12C24 8.8174 22.7357 5.76516 20.4853 3.51472C18.2348 1.26428 15.1826 0 12 0C8.8174 0 5.76516 1.26428 3.51472 3.51472C1.26428 5.76516 0 8.8174 0 12Z"
12
+ fill="#D93145"
13
+ />
14
+ <path
15
+ d="M3.975 16.225V7.29641H5.94559V10.9119H7.3217V7.29641H9.3033V16.225H7.3217V12.3229H5.94559V16.225H3.975Z"
16
+ fill="white"
17
+ />
18
+ <path
19
+ d="M10.2828 16.225V7.29641H12.2534V10.945L13.7506 7.29641H15.6772L14.0259 11.3308L15.7542 16.225H13.7506L12.4626 12.2788L12.2534 12.6315V16.225H10.2828Z"
20
+ fill="white"
21
+ />
22
+ <path
23
+ d="M17.7114 17.4375V16.3463C16.9555 16.3095 16.5367 16.067 16.155 15.6187C15.7807 15.1631 15.5789 14.465 15.5496 13.5244L17.2339 13.2708C17.2413 13.653 17.2743 13.9616 17.333 14.1968C17.3917 14.4319 17.4761 14.601 17.5862 14.7038C17.7036 14.8067 17.8431 14.8582 18.0045 14.8582C18.21 14.8582 18.3421 14.7883 18.4009 14.6487C18.4669 14.5091 18.4999 14.3621 18.4999 14.2078C18.4999 13.8404 18.4119 13.5317 18.2357 13.2819C18.0669 13.0247 17.8321 12.7675 17.5312 12.5103L16.7495 11.8379C16.5293 11.6395 16.3275 11.4374 16.144 11.2316C15.9679 11.0185 15.8248 10.776 15.7147 10.5041C15.6046 10.2248 15.5496 9.89415 15.5496 9.51202C15.5496 8.8139 15.7477 8.26643 16.144 7.8696C16.5477 7.47278 16.9875 7.21877 17.3873 7.1972V6.15002H18.3238V7.18618C18.7495 7.20823 19.0907 7.30743 19.3476 7.4838C19.6045 7.65282 19.7953 7.86593 19.9201 8.12313C20.0522 8.37299 20.1403 8.64121 20.1843 8.92781C20.2357 9.20706 20.265 9.46793 20.2724 9.71044L18.566 9.91987C18.5586 9.65532 18.5403 9.42384 18.5109 9.22543C18.4889 9.02701 18.4376 8.87637 18.3568 8.77349C18.2834 8.66326 18.1623 8.61182 17.9935 8.61916C17.81 8.61916 17.6743 8.69633 17.5862 8.85065C17.4981 9.00497 17.4541 9.15929 17.4541 9.31361C17.4541 9.66634 17.5422 9.95294 17.7183 10.1734C17.9018 10.3865 18.0999 10.5886 18.3128 10.7797L19.0614 11.43C19.3109 11.6578 19.5384 11.9003 19.7439 12.1575C19.9568 12.4147 20.1256 12.7013 20.2503 13.0173C20.3751 13.3333 20.4375 13.6971 20.4375 14.1086C20.4375 14.4981 20.3568 14.8545 20.1953 15.1778C20.0338 15.5012 19.8027 15.7657 19.5017 15.9715C19.2008 16.1699 18.9912 16.2911 18.5729 16.3352V17.4375H17.7114Z"
24
+ fill="white"
25
+ />
26
+ </svg>
27
+ </template>
28
+ <script lang="ts" setup>
29
+ import { defineProps } from 'vue'
30
+ defineProps({
31
+ size: {
32
+ default: 24,
33
+ type: [Number, String],
34
+ },
35
+ color: {
36
+ default: '',
37
+ type: String,
38
+ },
39
+ })
40
+ defineOptions({
41
+ name: 'CoinHkd',
42
+ })
43
+ </script>
44
+ <style lang="scss">
45
+ .bge-color-svg {
46
+ --icon-theme: #fff833;
47
+ --icon-gray: #9baec2;
48
+ --icon-gay-dark: #526375;
49
+
50
+ .dark & {
51
+ --icon-theme: #ffff38;
52
+ --icon-gray: #708397;
53
+ --icon-gay-dark: #32404d;
54
+ }
55
+ }
56
+
57
+ .bge-fill-icon-theme {
58
+ fill: var(--icon-theme);
59
+ }
60
+
61
+ .bge-fill-icon-gray {
62
+ fill: var(--icon-gray);
63
+ }
64
+
65
+ .bge-fill-gay-dark {
66
+ fill: var(--icon-gay-dark);
67
+ }
68
+
69
+ .bge-stroke-icon-theme {
70
+ stroke: var(--icon-theme);
71
+ }
72
+
73
+ .bge-stroke-icon-gray {
74
+ stroke: var(--icon-gray);
75
+ }
76
+
77
+ .bge-stroke-gay-dark {
78
+ stroke: var(--icon-gay-dark);
79
+ }
80
+ </style>
@@ -0,0 +1,72 @@
1
+ <template>
2
+ <svg
3
+ :style="`width: 1em; height: 1em; font-size: ${size}px;`"
4
+ width="24"
5
+ height="24"
6
+ viewBox="0 0 24 24"
7
+ fill="none"
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ >
10
+ <path
11
+ d="M0 12C-3.32088e-08 13.5759 0.310389 15.1363 0.913446 16.5922C1.5165 18.0481 2.40042 19.371 3.51472 20.4853C4.62902 21.5996 5.95189 22.4835 7.4078 23.0866C8.86371 23.6896 10.4241 24 12 24C13.5759 24 15.1363 23.6896 16.5922 23.0866C18.0481 22.4835 19.371 21.5996 20.4853 20.4853C21.5996 19.371 22.4835 18.0481 23.0866 16.5922C23.6896 15.1363 24 13.5759 24 12C24 8.8174 22.7357 5.76516 20.4853 3.51472C18.2348 1.26428 15.1826 0 12 0C8.8174 0 5.76516 1.26428 3.51472 3.51472C1.26428 5.76516 0 8.8174 0 12Z"
12
+ fill="#4CAF50"
13
+ />
14
+ <path
15
+ d="M13.7942 15.0764C13.7942 13.805 12.7089 13.4632 11.5457 12.9415C9.92673 12.2279 8.19388 11.6162 8.19388 9.0916C8.19388 8.27005 8.45171 5.98529 11.6356 5.57751V3.71252H13.0267V5.6015C15.8448 6.08723 16.2585 8.19809 16.3125 9.6553H13.7942C13.7942 8.15611 13.1106 7.57443 12.2112 7.57443C12.0088 7.56077 11.8058 7.59101 11.6161 7.66306C11.4264 7.73512 11.2545 7.8473 11.1122 7.99193C10.9698 8.13656 10.8604 8.31023 10.7914 8.50105C10.7224 8.69188 10.6953 8.89537 10.7122 9.0976C10.7122 11.7122 16.3125 10.7407 16.3125 15.0584C16.3125 18.0927 13.3685 18.5005 12.8468 18.5545V20.2875H11.4437V18.5605C10.9233 18.5447 10.4114 18.4242 9.93859 18.2061C9.4658 17.988 9.04182 17.6768 8.692 17.2911C8.34218 16.9054 8.0737 16.4531 7.90261 15.9613C7.73151 15.4695 7.66131 14.9483 7.69621 14.4287H10.1966C10.1966 16.6295 11.8634 16.5755 12.1033 16.5755C12.3155 16.6019 12.5308 16.5828 12.735 16.5195C12.9392 16.4562 13.1276 16.35 13.2876 16.2082C13.4475 16.0663 13.5755 15.892 13.6628 15.6969C13.7502 15.5017 13.795 15.2902 13.7942 15.0764Z"
16
+ fill="#FDFDFD"
17
+ />
18
+ </svg>
19
+ </template>
20
+ <script lang="ts" setup>
21
+ import { defineProps } from 'vue'
22
+ defineProps({
23
+ size: {
24
+ default: 24,
25
+ type: [Number, String],
26
+ },
27
+ color: {
28
+ default: '',
29
+ type: String,
30
+ },
31
+ })
32
+ defineOptions({
33
+ name: 'CoinUsd',
34
+ })
35
+ </script>
36
+ <style lang="scss">
37
+ .bge-color-svg {
38
+ --icon-theme: #fff833;
39
+ --icon-gray: #9baec2;
40
+ --icon-gay-dark: #526375;
41
+
42
+ .dark & {
43
+ --icon-theme: #ffff38;
44
+ --icon-gray: #708397;
45
+ --icon-gay-dark: #32404d;
46
+ }
47
+ }
48
+
49
+ .bge-fill-icon-theme {
50
+ fill: var(--icon-theme);
51
+ }
52
+
53
+ .bge-fill-icon-gray {
54
+ fill: var(--icon-gray);
55
+ }
56
+
57
+ .bge-fill-gay-dark {
58
+ fill: var(--icon-gay-dark);
59
+ }
60
+
61
+ .bge-stroke-icon-theme {
62
+ stroke: var(--icon-theme);
63
+ }
64
+
65
+ .bge-stroke-icon-gray {
66
+ stroke: var(--icon-gray);
67
+ }
68
+
69
+ .bge-stroke-gay-dark {
70
+ stroke: var(--icon-gay-dark);
71
+ }
72
+ </style>