@ebfe/vant-kit 0.0.1 → 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/es/field-multi-picker/README.md +97 -0
- package/es/field-multi-picker/index-sfc.less +3 -0
- package/es/field-multi-picker/index.ts +139 -0
- package/es/field-single-picker/README.md +94 -0
- package/es/field-single-picker/index-sfc.less +3 -0
- package/es/field-single-picker/index.ts +158 -0
- package/es/index.js +12 -5
- package/es/multi-picker/README.md +183 -0
- package/es/multi-picker/index-sfc.less +20 -0
- package/es/multi-picker/index.ts +399 -0
- package/es/single-picker/README.md +239 -0
- package/es/single-picker/index-sfc.less +1 -1
- package/es/single-picker/index.ts +253 -0
- package/lib/field-multi-picker/README.md +97 -0
- package/lib/field-multi-picker/index-sfc.less +3 -0
- package/lib/field-multi-picker/index.ts +139 -0
- package/lib/field-single-picker/README.md +94 -0
- package/lib/field-single-picker/index-sfc.less +3 -0
- package/lib/field-single-picker/index.ts +158 -0
- package/lib/index.js +13 -46
- package/lib/multi-picker/README.md +183 -0
- package/lib/multi-picker/index-sfc.less +20 -0
- package/lib/multi-picker/index.ts +399 -0
- package/lib/single-picker/README.md +239 -0
- package/lib/single-picker/index-sfc.less +1 -1
- package/lib/single-picker/index.ts +253 -0
- package/package.json +3 -3
- package/es/demo-button/index-sfc.css +0 -9
- package/es/demo-button/index-sfc.less +0 -9
- package/es/demo-button/index.d.ts +0 -44
- package/es/demo-button/index.js +0 -52
- package/es/index.d.ts +0 -10
- package/es/single-picker/index-sfc.css +0 -4
- package/es/single-picker/index.d.ts +0 -623
- package/es/single-picker/index.js +0 -249
- package/lib/demo-button/index-sfc.css +0 -9
- package/lib/demo-button/index-sfc.less +0 -9
- package/lib/demo-button/index.d.ts +0 -44
- package/lib/demo-button/index.js +0 -76
- package/lib/ebfe-vant-kit.cjs.js +0 -301
- package/lib/ebfe-vant-kit.es.js +0 -312
- package/lib/ebfe-vant-kit.js +0 -18216
- package/lib/ebfe-vant-kit.min.js +0 -13064
- package/lib/index.d.ts +0 -10
- package/lib/single-picker/index-sfc.css +0 -4
- package/lib/single-picker/index.d.ts +0 -623
- package/lib/single-picker/index.js +0 -261
- package/lib/single-picker/style/less.d.ts +0 -0
- package/lib/style.css +0 -7107
- package/lib/web-types.json +0 -35
- /package/es/{demo-button → field-multi-picker}/style/index.js +0 -0
- /package/es/{demo-button → field-multi-picker}/style/less.js +0 -0
- /package/{lib/demo-button → es/field-single-picker}/style/index.js +0 -0
- /package/{lib/demo-button → es/field-single-picker}/style/less.js +0 -0
- /package/es/{demo-button/style/index.d.ts → multi-picker/style/index.js} +0 -0
- /package/es/{demo-button/style/less.d.ts → multi-picker/style/less.js} +0 -0
- /package/{es/single-picker/style/index.d.ts → lib/field-multi-picker/style/index.js} +0 -0
- /package/{es/single-picker/style/less.d.ts → lib/field-multi-picker/style/less.js} +0 -0
- /package/lib/{demo-button/style/index.d.ts → field-single-picker/style/index.js} +0 -0
- /package/lib/{demo-button/style/less.d.ts → field-single-picker/style/less.js} +0 -0
- /package/lib/{index.css → multi-picker/style/index.js} +0 -0
- /package/lib/{single-picker/style/index.d.ts → multi-picker/style/less.js} +0 -0
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
import './index-sfc.css';
|
|
3
|
+
import { defineComponent as _defineComponent } from 'vue';
|
|
4
|
+
import type { PickerColumn, PickerOption, PickerProps } from 'vant';
|
|
5
|
+
import { computed, watch } from 'vue';
|
|
6
|
+
import { debounce } from 'lodash';
|
|
7
|
+
import { Popup as VanPopup, Picker as VanPicker, Search as VanSearch } from 'vant';
|
|
8
|
+
import { useWrapperRef } from '@ebfe/vhooks';
|
|
9
|
+
import { array2Single } from '@ebfe/utils';
|
|
10
|
+
|
|
11
|
+
const __default__ = {
|
|
12
|
+
name: 'SinglePicker',
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export type TSinglePickerProps = {
|
|
16
|
+
showSearch?: boolean;
|
|
17
|
+
searchDelay?: number;
|
|
18
|
+
modelValue: any;
|
|
19
|
+
pickerProps: Partial<PickerProps>;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export type TConfirmDisabledOptionPayload = {
|
|
23
|
+
option: any;
|
|
24
|
+
closePopup: () => void;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const __vue_sfc__ = /*@__PURE__*/ _defineComponent({
|
|
28
|
+
...__default__,
|
|
29
|
+
props: {
|
|
30
|
+
showSearch: { type: Boolean, required: false, default: false },
|
|
31
|
+
searchDelay: { type: Number, required: false, default: 300 },
|
|
32
|
+
modelValue: { type: null, required: true },
|
|
33
|
+
pickerProps: { type: Object, required: true },
|
|
34
|
+
},
|
|
35
|
+
emits: ['search', 'confirm', 'confirmDisabledOption', 'update:modelValue'],
|
|
36
|
+
setup(__props: any, { expose: __expose, emit: __emit }) {
|
|
37
|
+
const Props = __props;
|
|
38
|
+
|
|
39
|
+
const columnsFieldNames = computed(() =>
|
|
40
|
+
Object.assign({ text: 'label', value: 'value' }, Props?.pickerProps?.columnsFieldNames ?? {})
|
|
41
|
+
);
|
|
42
|
+
const computedPickerProps = computed(() =>
|
|
43
|
+
Object.assign(Props?.pickerProps ?? {}, {
|
|
44
|
+
columnsFieldNames: columnsFieldNames.value,
|
|
45
|
+
})
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
const Emitter = __emit;
|
|
49
|
+
|
|
50
|
+
const [popupShow, setPopupShow] = useWrapperRef<boolean>(false);
|
|
51
|
+
const triggerPopupShow = () => {
|
|
52
|
+
setPopupShow(true);
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const [modelFieldValue, setModelFieldValue] = useWrapperRef<any>(Props.modelValue);
|
|
56
|
+
watch(() => Props.modelValue, setModelFieldValue, { immediate: true });
|
|
57
|
+
const updateModelFieldValue = (newValue) => {
|
|
58
|
+
setModelFieldValue(newValue);
|
|
59
|
+
// console.log('updateModelFieldValue');
|
|
60
|
+
Emitter('update:modelValue', newValue);
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* idMapData 缓存
|
|
65
|
+
*/
|
|
66
|
+
const [columnsIdMapDataCache, setColumnsIdMapDataCache] = useWrapperRef<{
|
|
67
|
+
string: (PickerOption | PickerColumn)[];
|
|
68
|
+
}>({} as any);
|
|
69
|
+
const patchColumnsIdMapDataCache = (columns: (PickerOption | PickerColumn)[]) => {
|
|
70
|
+
const newColumns = { ...(columnsIdMapDataCache.value ?? {}) };
|
|
71
|
+
columns.forEach((item) => {
|
|
72
|
+
const id = item[columnsFieldNames.value.value];
|
|
73
|
+
newColumns[id] = item;
|
|
74
|
+
});
|
|
75
|
+
setColumnsIdMapDataCache({ ...newColumns });
|
|
76
|
+
};
|
|
77
|
+
watch(
|
|
78
|
+
() => computedPickerProps.value?.columns,
|
|
79
|
+
(columns) => {
|
|
80
|
+
patchColumnsIdMapDataCache(columns! ?? []);
|
|
81
|
+
},
|
|
82
|
+
{ immediate: true }
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* selectedOption
|
|
87
|
+
*/
|
|
88
|
+
const [selectedOption, setSelectedOption] = useWrapperRef<string>('');
|
|
89
|
+
watch(
|
|
90
|
+
[modelFieldValue, columnsIdMapDataCache],
|
|
91
|
+
([newValue, columnsIdMapData]) => {
|
|
92
|
+
setSelectedOption(columnsIdMapData?.[newValue]);
|
|
93
|
+
},
|
|
94
|
+
{ immediate: true }
|
|
95
|
+
);
|
|
96
|
+
const showValue = computed(() => {
|
|
97
|
+
return selectedOption.value?.[columnsFieldNames.value.text];
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* 兼容搜索模式
|
|
102
|
+
* 如果触发筛选后 columns 不存在,直接点击确认,则依旧选中上次选择的值(selectedValues 能够正确取到,而 selectedOptions 不行)
|
|
103
|
+
*/
|
|
104
|
+
const onConfirmPicker = (confirmInfo) => {
|
|
105
|
+
const { selectedOptions, selectedValues } = confirmInfo;
|
|
106
|
+
let option;
|
|
107
|
+
if (computedPickerProps.value?.columns?.length) {
|
|
108
|
+
option = array2Single(selectedOptions);
|
|
109
|
+
} else {
|
|
110
|
+
const selectedValue = array2Single(selectedValues);
|
|
111
|
+
option = columnsIdMapDataCache.value?.[selectedValue];
|
|
112
|
+
}
|
|
113
|
+
if (option.disabled) {
|
|
114
|
+
Emitter('confirmDisabledOption', {
|
|
115
|
+
option,
|
|
116
|
+
closePopup: () => setPopupShow(false),
|
|
117
|
+
});
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
Emitter('confirm', option);
|
|
121
|
+
const newValue = option?.[columnsFieldNames.value.value];
|
|
122
|
+
updateModelFieldValue(newValue);
|
|
123
|
+
setPopupShow(false);
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
const [keywords, _] = useWrapperRef<string | undefined>(undefined);
|
|
127
|
+
|
|
128
|
+
const onSearch = debounce((keywords: string) => {
|
|
129
|
+
Emitter('search', keywords);
|
|
130
|
+
}, Props.searchDelay);
|
|
131
|
+
|
|
132
|
+
__expose({});
|
|
133
|
+
|
|
134
|
+
const __returned__ = {
|
|
135
|
+
Props,
|
|
136
|
+
columnsFieldNames,
|
|
137
|
+
computedPickerProps,
|
|
138
|
+
Emitter,
|
|
139
|
+
popupShow,
|
|
140
|
+
setPopupShow,
|
|
141
|
+
triggerPopupShow,
|
|
142
|
+
modelFieldValue,
|
|
143
|
+
setModelFieldValue,
|
|
144
|
+
updateModelFieldValue,
|
|
145
|
+
columnsIdMapDataCache,
|
|
146
|
+
setColumnsIdMapDataCache,
|
|
147
|
+
patchColumnsIdMapDataCache,
|
|
148
|
+
selectedOption,
|
|
149
|
+
setSelectedOption,
|
|
150
|
+
showValue,
|
|
151
|
+
onConfirmPicker,
|
|
152
|
+
keywords,
|
|
153
|
+
_,
|
|
154
|
+
onSearch,
|
|
155
|
+
get VanPopup() {
|
|
156
|
+
return VanPopup;
|
|
157
|
+
},
|
|
158
|
+
get VanPicker() {
|
|
159
|
+
return VanPicker;
|
|
160
|
+
},
|
|
161
|
+
get VanSearch() {
|
|
162
|
+
return VanSearch;
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
Object.defineProperty(__returned__, '__isScriptSetup', { enumerable: false, value: true });
|
|
166
|
+
return __returned__;
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
import {
|
|
170
|
+
renderSlot as _renderSlot,
|
|
171
|
+
createCommentVNode as _createCommentVNode,
|
|
172
|
+
mergeProps as _mergeProps,
|
|
173
|
+
createVNode as _createVNode,
|
|
174
|
+
withCtx as _withCtx,
|
|
175
|
+
renderList as _renderList,
|
|
176
|
+
createSlots as _createSlots,
|
|
177
|
+
openBlock as _openBlock,
|
|
178
|
+
createElementBlock as _createElementBlock,
|
|
179
|
+
} from 'vue';
|
|
180
|
+
|
|
181
|
+
const _hoisted_1 = { class: 'single-picker' };
|
|
182
|
+
|
|
183
|
+
function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
184
|
+
return (
|
|
185
|
+
_openBlock(),
|
|
186
|
+
_createElementBlock('div', _hoisted_1, [
|
|
187
|
+
_renderSlot(_ctx.$slots, 'trigger', {
|
|
188
|
+
triggerPopupShow: $setup.triggerPopupShow,
|
|
189
|
+
showValue: $setup.showValue,
|
|
190
|
+
selectedOption: $setup.selectedOption,
|
|
191
|
+
}),
|
|
192
|
+
_createVNode(
|
|
193
|
+
$setup['VanPopup'],
|
|
194
|
+
{
|
|
195
|
+
show: $setup.popupShow,
|
|
196
|
+
'onUpdate:show': _cache[3] || (_cache[3] = ($event) => ($setup.popupShow = $event)),
|
|
197
|
+
position: 'bottom',
|
|
198
|
+
round: '',
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
default: _withCtx(() => [
|
|
202
|
+
_createVNode(
|
|
203
|
+
$setup['VanPicker'],
|
|
204
|
+
_mergeProps($setup.computedPickerProps, {
|
|
205
|
+
onConfirm: _cache[1] || (_cache[1] = (value) => $setup.onConfirmPicker(value)),
|
|
206
|
+
onCancel: _cache[2] || (_cache[2] = ($event) => $setup.setPopupShow(false)),
|
|
207
|
+
}),
|
|
208
|
+
_createSlots({ _: 2 /* DYNAMIC */ }, [
|
|
209
|
+
_renderList(_ctx.$slots, (_slot, name) => {
|
|
210
|
+
return {
|
|
211
|
+
name: name,
|
|
212
|
+
fn: _withCtx((slotData) => [_renderSlot(_ctx.$slots, name, _mergeProps(slotData, { key: name }))]),
|
|
213
|
+
};
|
|
214
|
+
}),
|
|
215
|
+
$props.showSearch
|
|
216
|
+
? {
|
|
217
|
+
name: 'title',
|
|
218
|
+
fn: _withCtx(() => [
|
|
219
|
+
_createVNode(
|
|
220
|
+
$setup['VanSearch'],
|
|
221
|
+
{
|
|
222
|
+
shape: 'round',
|
|
223
|
+
placeholder: '请输入搜索关键词',
|
|
224
|
+
modelValue: $setup.keywords,
|
|
225
|
+
'onUpdate:modelValue': [
|
|
226
|
+
_cache[0] || (_cache[0] = ($event) => ($setup.keywords = $event)),
|
|
227
|
+
$setup.onSearch,
|
|
228
|
+
],
|
|
229
|
+
},
|
|
230
|
+
null,
|
|
231
|
+
8 /* PROPS */,
|
|
232
|
+
['modelValue', 'onUpdate:modelValue']
|
|
233
|
+
),
|
|
234
|
+
]),
|
|
235
|
+
key: '0',
|
|
236
|
+
}
|
|
237
|
+
: undefined,
|
|
238
|
+
]),
|
|
239
|
+
1040 /* FULL_PROPS, DYNAMIC_SLOTS */
|
|
240
|
+
),
|
|
241
|
+
]),
|
|
242
|
+
_: 3 /* FORWARDED */,
|
|
243
|
+
},
|
|
244
|
+
8 /* PROPS */,
|
|
245
|
+
['show']
|
|
246
|
+
),
|
|
247
|
+
])
|
|
248
|
+
);
|
|
249
|
+
}
|
|
250
|
+
__vue_sfc__.render = __vue_render__;
|
|
251
|
+
|
|
252
|
+
__vue_sfc__.__scopeId = 'data-v-03e3b57e';
|
|
253
|
+
export default __vue_sfc__;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ebfe/vant-kit",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"description": "A project that includes common components from the H5 project (dependent on vant) and some utility functions",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"module": "es/index.js",
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
"publishConfig": {
|
|
14
14
|
"access": "public"
|
|
15
15
|
},
|
|
16
|
+
"license": "MIT",
|
|
16
17
|
"author": "astfn",
|
|
17
18
|
"peerDependencies": {
|
|
18
19
|
"vue": "^3.3.4"
|
|
@@ -23,8 +24,7 @@
|
|
|
23
24
|
"@vant/cli": "^7.0.0",
|
|
24
25
|
"sass": "^1.49.7",
|
|
25
26
|
"unplugin-dts": "1.0.0-beta.0",
|
|
26
|
-
"vue": "^3.3.4"
|
|
27
|
-
"@ebfe/tsconfig": "0.0.1"
|
|
27
|
+
"vue": "^3.3.4"
|
|
28
28
|
},
|
|
29
29
|
"eslintConfig": {
|
|
30
30
|
"root": true,
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import './index-sfc.css';
|
|
2
|
-
declare const __vue_sfc__: import('vue').DefineComponent<
|
|
3
|
-
import('vue').ExtractPropTypes<{
|
|
4
|
-
bgColor: {
|
|
5
|
-
type: StringConstructor;
|
|
6
|
-
required: false;
|
|
7
|
-
default: string;
|
|
8
|
-
};
|
|
9
|
-
}>,
|
|
10
|
-
{
|
|
11
|
-
Props: any;
|
|
12
|
-
computedBgColor: import('vue').ComputedRef<any>;
|
|
13
|
-
},
|
|
14
|
-
{},
|
|
15
|
-
{},
|
|
16
|
-
{},
|
|
17
|
-
import('vue').ComponentOptionsMixin,
|
|
18
|
-
import('vue').ComponentOptionsMixin,
|
|
19
|
-
{},
|
|
20
|
-
string,
|
|
21
|
-
import('vue').PublicProps,
|
|
22
|
-
Readonly<
|
|
23
|
-
import('vue').ExtractPropTypes<{
|
|
24
|
-
bgColor: {
|
|
25
|
-
type: StringConstructor;
|
|
26
|
-
required: false;
|
|
27
|
-
default: string;
|
|
28
|
-
};
|
|
29
|
-
}>
|
|
30
|
-
> &
|
|
31
|
-
Readonly<{}>,
|
|
32
|
-
{
|
|
33
|
-
bgColor: string;
|
|
34
|
-
},
|
|
35
|
-
{},
|
|
36
|
-
{},
|
|
37
|
-
{},
|
|
38
|
-
string,
|
|
39
|
-
import('vue').ComponentProvideOptions,
|
|
40
|
-
true,
|
|
41
|
-
{},
|
|
42
|
-
any
|
|
43
|
-
>;
|
|
44
|
-
export default __vue_sfc__;
|
package/es/demo-button/index.js
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
var __defProp = Object.defineProperty;
|
|
2
|
-
var __defProps = Object.defineProperties;
|
|
3
|
-
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
-
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
-
var __defNormalProp = (obj, key, value) =>
|
|
8
|
-
key in obj
|
|
9
|
-
? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value })
|
|
10
|
-
: (obj[key] = value);
|
|
11
|
-
var __spreadValues = (a, b) => {
|
|
12
|
-
for (var prop in b || (b = {})) if (__hasOwnProp.call(b, prop)) __defNormalProp(a, prop, b[prop]);
|
|
13
|
-
if (__getOwnPropSymbols)
|
|
14
|
-
for (var prop of __getOwnPropSymbols(b)) {
|
|
15
|
-
if (__propIsEnum.call(b, prop)) __defNormalProp(a, prop, b[prop]);
|
|
16
|
-
}
|
|
17
|
-
return a;
|
|
18
|
-
};
|
|
19
|
-
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
-
import './index-sfc.css';
|
|
21
|
-
import { useCssVars as _useCssVars, defineComponent as _defineComponent } from 'vue';
|
|
22
|
-
import { computed } from 'vue';
|
|
23
|
-
const __default__ = {
|
|
24
|
-
name: 'DemoButton',
|
|
25
|
-
};
|
|
26
|
-
const __vue_sfc__ = /* @__PURE__ */ _defineComponent(
|
|
27
|
-
__spreadProps(__spreadValues({}, __default__), {
|
|
28
|
-
props: {
|
|
29
|
-
bgColor: { type: String, required: false, default: '#f44' },
|
|
30
|
-
},
|
|
31
|
-
setup(__props, { expose: __expose }) {
|
|
32
|
-
__expose();
|
|
33
|
-
_useCssVars((_ctx) => ({
|
|
34
|
-
'5ccde05a-computedBgColor': computedBgColor.value,
|
|
35
|
-
}));
|
|
36
|
-
const Props = __props;
|
|
37
|
-
const computedBgColor = computed(() => Props.bgColor);
|
|
38
|
-
const __returned__ = { Props, computedBgColor };
|
|
39
|
-
Object.defineProperty(__returned__, '__isScriptSetup', { enumerable: false, value: true });
|
|
40
|
-
return __returned__;
|
|
41
|
-
},
|
|
42
|
-
})
|
|
43
|
-
);
|
|
44
|
-
import { renderSlot as _renderSlot, openBlock as _openBlock, createElementBlock as _createElementBlock } from 'vue';
|
|
45
|
-
const _hoisted_1 = { class: 'demo-button' };
|
|
46
|
-
function __vue_render__(_ctx, _cache, $props, $setup, $data, $options) {
|
|
47
|
-
return (_openBlock(), _createElementBlock('button', _hoisted_1, [_renderSlot(_ctx.$slots, 'default')]));
|
|
48
|
-
}
|
|
49
|
-
__vue_sfc__.render = __vue_render__;
|
|
50
|
-
__vue_sfc__.__scopeId = 'data-v-5ccde05a';
|
|
51
|
-
var stdin_default = __vue_sfc__;
|
|
52
|
-
export { stdin_default as default };
|
package/es/index.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
declare namespace _default {
|
|
2
|
-
export { install };
|
|
3
|
-
export { version };
|
|
4
|
-
}
|
|
5
|
-
export default _default;
|
|
6
|
-
export function install(app: any): void;
|
|
7
|
-
export const version: '0.0.0';
|
|
8
|
-
import DemoButton from './demo-button';
|
|
9
|
-
import SinglePicker from './single-picker';
|
|
10
|
-
export { DemoButton, SinglePicker };
|