@neatui/nuxt 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/README.md +3 -0
  2. package/package.json +43 -0
  3. package/rollup.config.js +35 -0
  4. package/src/components/basic/IDraggable.vue +84 -0
  5. package/src/components/basic/IDraggable@b.vue +80 -0
  6. package/src/components/basic/IFollowView.vue +211 -0
  7. package/src/components/basic/IPickerView.vue +351 -0
  8. package/src/components/basic/IRouterView.vue +360 -0
  9. package/src/components/basic/IScrollView.vue +127 -0
  10. package/src/components/basic/Icon.vue +54 -0
  11. package/src/components/basic/LayerView/Layer.vue +339 -0
  12. package/src/components/basic/LayerView/index.ts +5 -0
  13. package/src/components/basic/index.ts +7 -0
  14. package/src/components/display/Avatar.vue +1 -0
  15. package/src/components/display/Badge.vue +1 -0
  16. package/src/components/display/Calendar.vue +245 -0
  17. package/src/components/display/CalendarReg.vue +245 -0
  18. package/src/components/display/Card.vue +1 -0
  19. package/src/components/display/Carousel.vue +1 -0
  20. package/src/components/display/ChartView.vue +123 -0
  21. package/src/components/display/Collapse.vue +1 -0
  22. package/src/components/display/Desriptions.vue +1 -0
  23. package/src/components/display/Empty.vue +1 -0
  24. package/src/components/display/Image.vue +112 -0
  25. package/src/components/display/List.vue +1 -0
  26. package/src/components/display/PhotoEditor.vue +181 -0
  27. package/src/components/display/PhotoViewer.vue +50 -0
  28. package/src/components/display/Popover.vue +1 -0
  29. package/src/components/display/QRCode.vue +1 -0
  30. package/src/components/display/Segmented.vue +1 -0
  31. package/src/components/display/Statistic.vue +1 -0
  32. package/src/components/display/Table.vue +1 -0
  33. package/src/components/display/Tabs.vue +1 -0
  34. package/src/components/display/Tag.vue +1 -0
  35. package/src/components/display/Timeline.vue +1 -0
  36. package/src/components/display/Tooltip.vue +1 -0
  37. package/src/components/display/Tour.vue +1 -0
  38. package/src/components/display/Tree.vue +431 -0
  39. package/src/components/display/TreeView.vue +225 -0
  40. package/src/components/display/index.ts +8 -0
  41. package/src/components/form/Cascader.vue +435 -0
  42. package/src/components/form/DatePicker.vue +124 -0
  43. package/src/components/form/DateRangePicker@v2.vue.backup +224 -0
  44. package/src/components/form/DateRangePicker@v3.vue +116 -0
  45. package/src/components/form/DateRangeView@v3.vue +386 -0
  46. package/src/components/form/DateView.vue +229 -0
  47. package/src/components/form/DateView@v2.vue +386 -0
  48. package/src/components/form/DateView@v3.vue +471 -0
  49. package/src/components/form/EditUpload.vue +4 -0
  50. package/src/components/form/ImgUpload.vue +174 -0
  51. package/src/components/form/Input.vue.backup +230 -0
  52. package/src/components/form/Input@v3.vue +267 -0
  53. package/src/components/form/InputNumber.vue +200 -0
  54. package/src/components/form/InputRange.vue +235 -0
  55. package/src/components/form/MoreSelect.vue.backup +144 -0
  56. package/src/components/form/MoreSelect@v3.vue +195 -0
  57. package/src/components/form/MoreSelectList.vue +125 -0
  58. package/src/components/form/MoreSelectPanel@v3.vue +190 -0
  59. package/src/components/form/MoreSelectPicker.vue +124 -0
  60. package/src/components/form/MoreSelectTags.vue +124 -0
  61. package/src/components/form/PageMoreSelect.vue +187 -0
  62. package/src/components/form/PageSelect.vue +189 -0
  63. package/src/components/form/SearchMoreSelect.vue +173 -0
  64. package/src/components/form/SearchSelect.vue.backup +194 -0
  65. package/src/components/form/SearchSelect@v3.vue +202 -0
  66. package/src/components/form/Select@v3.vue +201 -0
  67. package/src/components/form/SelectList.vue +58 -0
  68. package/src/components/form/SelectPicker.vue +97 -0
  69. package/src/components/form/SelectTags.vue +52 -0
  70. package/src/components/form/SelectTree/SelectTree@v1.vue +227 -0
  71. package/src/components/form/Switch.vue +135 -0
  72. package/src/components/form/TextArea.vue +193 -0
  73. package/src/components/form/TimePicker.vue +11 -0
  74. package/src/components/form/TimeView.vue +244 -0
  75. package/src/components/form/Upload.vue +346 -0
  76. package/src/components/form/index.ts +82 -0
  77. package/src/components/loader/FormLoader/FormLoader@v2.vue +422 -0
  78. package/src/components/loader/FormLoader/FormLoader@v3.vue.backup +318 -0
  79. package/src/components/loader/FormLoader/index.ts +2 -0
  80. package/src/components/loader/FormLoader@v1/FormLoader.vue +506 -0
  81. package/src/components/loader/FormLoader@v1/FormRender.vue +277 -0
  82. package/src/components/loader/LimitLoader/LimitLoader.vue.backup +131 -0
  83. package/src/components/loader/LimitLoader/LimitLoader@v2.vue.backup +174 -0
  84. package/src/components/loader/LimitLoader/LimitLoader@v3.vue +183 -0
  85. package/src/components/loader/LimitLoader/index.ts +2 -0
  86. package/src/components/loader/TableLoader/TableColView.vue +115 -0
  87. package/src/components/loader/TableLoader/TableLoader.vue +360 -0
  88. package/src/components/loader/TableLoader/index.ts +2 -0
  89. package/src/components/loader/ViewLoader/ViewLoader@v1.vue +256 -0
  90. package/src/components/loader/ViewLoader/index.ts +2 -0
  91. package/src/components/loader/index.ts +5 -0
  92. package/src/components/tools/FormDraftsView.vue +330 -0
  93. package/src/components/tools/FormVerifyView.vue +206 -0
  94. package/src/components/tools/MoreTools.vue +74 -0
  95. package/src/components/tools/MoreTools@v2.vue +74 -0
  96. package/src/components/tools/Pagination@a.vue +222 -0
  97. package/src/components/tools/Pagination@b.vue +221 -0
  98. package/src/components/tools/index.ts +5 -0
  99. package/src/index.ts +9 -0
  100. package/src/shims-vue.d.ts +5 -0
  101. package/src/store/myui.ts +50 -0
  102. package/tsconfig.json +24 -0
@@ -0,0 +1,112 @@
1
+ <template>
2
+ <div>
3
+ <div :class="`mc-img b-solid bk-case b-xs ${imgClass}`" :style="imgStyle">
4
+ <img :src="src[srcName]" :style="`object-fit: ${fit}`" @click.stop="showPreview" />
5
+ <div v-if="tools" class="mc-img-tools">
6
+ <slot name="tools">
7
+ <div class="mc-img-clean co-risk" @click="delImg"></div>
8
+ </slot>
9
+ </div>
10
+ </div>
11
+ <Layer :id="`PhotoViewer${layerId}${initialSlide}`" am="as">
12
+ <PhotoViewer :initialSlide="initialSlide" :files="files" :srcName="srcName" :id="`PhotoViewer${layerId}${initialSlide}`"></PhotoViewer>
13
+ </Layer>
14
+ </div>
15
+ </template>
16
+ <script setup lang="ts">
17
+ import { Layer, LayerById } from '../basic';
18
+ import PhotoViewer from './PhotoViewer.vue';
19
+
20
+ const props: any = defineProps({
21
+ tools: { type: Boolean, default: true },
22
+ srcName: { type: String, default: 'imgUrl' },
23
+ theme: { type: String, default: '@a' },
24
+ co: { type: String, default: 'note' },
25
+ imgClass: { type: String, default: '' },
26
+ imgStyle: { type: String, default: '' },
27
+ src: {
28
+ type: Object,
29
+ default: () => ({})
30
+ },
31
+ files: {
32
+ type: Array as () => any[],
33
+ default: () => []
34
+ },
35
+ // 图片如何适应容器框,同原生object-fit
36
+ fit: {
37
+ type: String,
38
+ default: 'contain'
39
+ },
40
+ // 是否开启图片预览放大
41
+ preview: {
42
+ type: Boolean,
43
+ default: true
44
+ },
45
+ initialSlide: {
46
+ type: Number,
47
+ default: 0
48
+ }
49
+ });
50
+
51
+ const emit = defineEmits(['delImg']);
52
+ const layerId = Math.random().toString(36).slice(-6);
53
+
54
+ //预览
55
+ const showPreview = () => {
56
+ if (!props.preview) return;
57
+ LayerById(`PhotoViewer${layerId}${props.initialSlide}`).show();
58
+ };
59
+ const delImg = () => {
60
+ emit('delImg', props.src);
61
+ };
62
+ </script>
63
+ <style lang="scss">
64
+ .mc-img {
65
+ height: 8em;
66
+ width: 8em;
67
+ padding: 0.5em;
68
+ border-radius: 0.25em;
69
+ position: relative;
70
+ overflow: hidden;
71
+ // @include theme {
72
+ // border: 1px solid var(--co-case);
73
+ // }
74
+
75
+ img {
76
+ width: 100%;
77
+ height: 100%;
78
+ transform: translate3d(0, 0, 0);
79
+ border-radius: 0.15em;
80
+ }
81
+
82
+ &-tools {
83
+ position: absolute;
84
+ height: 1.5em;
85
+ opacity: 0;
86
+ right: 0;
87
+ top: 0;
88
+ text-align: center;
89
+ transition: all 0.5s;
90
+
91
+ & > * {
92
+ width: 1.5em;
93
+ height: 1.5em;
94
+ border-radius: 50%;
95
+ text-align: center;
96
+ }
97
+ }
98
+ &-clean {
99
+ display: inline-block;
100
+
101
+ background:
102
+ linear-gradient(45deg, transparent 40%, #fff 45%, #fff 55%, transparent 60%) no-repeat center/38% 38%,
103
+ linear-gradient(-45deg, transparent 40%, #fff 45%, #fff 55%, transparent 60%) no-repeat center/38% 38%,
104
+ radial-gradient(circle at 50% 50%, currentColor 53%, transparent 58%);
105
+ }
106
+ &:hover {
107
+ .mc-img-tools {
108
+ opacity: 1;
109
+ }
110
+ }
111
+ }
112
+ </style>
@@ -0,0 +1 @@
1
+ <template><div></div></template>
@@ -0,0 +1,181 @@
1
+ <template>
2
+ <div class="photo-editor bg-fore n-mm">
3
+ <div class="mt-mm" ui-note="@b risk">抠图和压缩处理需要较长时间,期间请耐心等待不要关闭本窗口或进行操作,本功能需要付费,请尽量珍惜每一次处理避免不必要的浪费~</div>
4
+ <div v-if="state.img" class="photo-editor-viewer bg-weak my-mm" ui-flex="row">
5
+ <div class="mr-mm" style="flex: 1">
6
+ <vue-cropper ref="cropperRef" :img="state.img" :autoCrop="state.autoCrop" @realTime="realTime"></vue-cropper>
7
+ </div>
8
+ <div style="flex: 1" class="photo-editor-transparent">
9
+ <img :src="state.previews || ''" />
10
+ </div>
11
+ </div>
12
+ <div v-else class="photo-editor-viewer bg-weak my-mm" ui-flex="row cm">
13
+ <input type="file" class="input pa" @change="change" />
14
+ <div class="ac input-icon">
15
+ <i class="icon icon-upload fs-ml"></i>
16
+ <div class="fs-sl">请先上传图片</div>
17
+ </div>
18
+ </div>
19
+ <div ui-flex="row cm" class="mr-ls-sub">
20
+ <button ui-btn="@a s none :square" class="nx-mm" @click="reset">还原</button>
21
+ <button ui-btn="@a s none :square" class="nx-mm" @click="crop">
22
+ <i v-if="state.cropLoad" className="icon icon-loading am-r360"></i>
23
+ 抠图
24
+ </button>
25
+ <button ui-btn="@a s none :square" class="nx-mm" @click="use">使用</button>
26
+ </div>
27
+ <div class="fekit-layer-close" @click="LayerById(layerId).hide()"></div>
28
+ </div>
29
+ </template>
30
+ <script setup lang="ts">
31
+ import { ref, reactive } from 'vue';
32
+ import { VueCropper } from 'vue-cropper/next';
33
+ import Compressor from 'compressorjs';
34
+ import { LayerById } from '../basic';
35
+ import axios from 'axios';
36
+ import 'vue-cropper/next/dist/index.css';
37
+
38
+ const props: any = defineProps({
39
+ layerId: {
40
+ type: String,
41
+ default: 'PhotoEditor'
42
+ }
43
+ });
44
+
45
+ const state = reactive({
46
+ img: null as any, //blob格式
47
+ // outputType: 'jepg', // 裁剪生成图片格式
48
+ autoCrop: true,
49
+ previews: null, //base格式
50
+ cropLoad: 0
51
+ });
52
+
53
+ const emit = defineEmits(['fileChange']);
54
+
55
+ const cropperRef = ref<any>(null);
56
+
57
+ const change = async ({ target: { files = [] } = {} }: any = {}) => {
58
+ const file = files[0];
59
+ const blob: any = await new Promise((resolve, reject) => {
60
+ new Compressor(file, {
61
+ quality: 1,
62
+ checkOrientation: false,
63
+ success: resolve,
64
+ maxWidth: 1000,
65
+ maxHeight: 700,
66
+ error: reject
67
+ });
68
+ });
69
+ const _file = blobToFile(blob);
70
+ const _blob: any = URL.createObjectURL(_file);
71
+ state.img = _blob;
72
+ };
73
+
74
+ // 实时响应预览图片
75
+ const realTime = (data: any) => {
76
+ cropperRef.value.getCropBlob((data: any) => {
77
+ blobToDataURI(data, (res: any) => {
78
+ state.previews = res;
79
+ });
80
+ });
81
+ };
82
+
83
+ //还原
84
+ const reset = () => {
85
+ cropperRef.value.clearCrop(); // 清除截图信息
86
+ cropperRef.value.goAutoCrop(); // 自动生成截图框函数
87
+ };
88
+
89
+ //抠图
90
+ const crop = async () => {
91
+ if (!state.cropLoad) {
92
+ state.cropLoad = 1;
93
+
94
+ const formData = {
95
+ image_file_b64: state.previews,
96
+ image_url: '',
97
+ size: 'preview',
98
+ type: 'auto',
99
+ type_level: '1',
100
+ format: 'auto',
101
+ roi: '0% 0% 100% 100%',
102
+ crop: false,
103
+ crop_margin: '0',
104
+ scale: 'original',
105
+ position: 'original',
106
+ channels: 'rgba',
107
+ add_shadow: false,
108
+ semitransparency: true,
109
+ bg_color: '',
110
+ bg_image_url: ''
111
+ };
112
+ const res: any = await axios.post(
113
+ 'https://api.remove.bg/v1.0/removebg',
114
+ { ...formData },
115
+ { responseType: 'arraybuffer', headers: { 'X-Api-Key': 'kg4jrcKZd6Gjdx5CmBYmksuN' } }
116
+ );
117
+ if (res.status === 200) {
118
+ const blob = new Blob([res.data], { type: 'image/png' });
119
+ blobToDataURI(blob, (data: any) => {
120
+ state.previews = data;
121
+ state.cropLoad = 0;
122
+ });
123
+ }
124
+ }
125
+ };
126
+
127
+ //使用
128
+ const use = () => {
129
+ const file = base64ToFile(state.previews);
130
+ LayerById(props.layerId).hide();
131
+ emit('fileChange', file);
132
+ };
133
+
134
+ //blob 转 base64
135
+ const blobToDataURI = (blob: any, callback: any) => {
136
+ const reader = new FileReader();
137
+ reader.readAsDataURL(blob);
138
+ reader.onload = function (e: any) {
139
+ callback(e.target.result);
140
+ };
141
+ };
142
+ //base64 转 file
143
+ const base64ToFile = (data: any) => {
144
+ const arr = data.split(','),
145
+ mime = arr[0].match(/:(.*?);/)[1],
146
+ bstr = atob(arr[1]);
147
+ let n = bstr.length;
148
+ const u8arr = new Uint8Array(n);
149
+ while (n--) {
150
+ u8arr[n] = bstr.charCodeAt(n);
151
+ }
152
+ const blob = new Blob([u8arr], { type: mime });
153
+ const type = mime.replace(/image\//, '');
154
+ const file = new File([blob], new Date().getTime() + `.${type}`);
155
+ return file;
156
+ };
157
+ //blob转file
158
+ const blobToFile = (blob: any) => {
159
+ const { name = '' } = blob || {};
160
+ const file = new File([blob], name);
161
+ return file;
162
+ };
163
+ </script>
164
+ <style lang="scss">
165
+ .photo-editor {
166
+ &-viewer {
167
+ height: 27rem;
168
+ }
169
+ .input {
170
+ opacity: 0;
171
+ height: 100%;
172
+ width: 100%;
173
+ }
174
+ .input-icon {
175
+ line-height: 1.5;
176
+ }
177
+ &-transparent {
178
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAIElEQVQoU2NkQAOXLl36jyzESAcF6Hbq6emhWMtIewUAeQ8d3cWD32MAAAAASUVORK5CYII=);
179
+ }
180
+ }
181
+ </style>
@@ -0,0 +1,50 @@
1
+ <template>
2
+ <div class="full nx-mm">
3
+ <Swiper
4
+ :slidesPerView="1"
5
+ :initialSlide="initialSlide"
6
+ :spaceBetween="30"
7
+ :keyboard="{
8
+ enabled: true
9
+ }"
10
+ :pagination="{
11
+ clickable: true
12
+ }"
13
+ :navigation="true"
14
+ :modules="[Keyboard, Pagination, Navigation]"
15
+ class="mySwiper"
16
+ >
17
+ <SwiperSlide v-for="item in files" :key="item.id" class="ac" ui-flex="col cm">
18
+ <img :src="item[srcName]" class="vc" />
19
+ </SwiperSlide>
20
+ </Swiper>
21
+ <div class="fekit-layer-close close-img m-mm" @click="LayerById(id).hide()"></div>
22
+ </div>
23
+ </template>
24
+ <script setup lang="ts">
25
+ import { Swiper, SwiperSlide } from 'swiper/vue';
26
+ import { Keyboard, Pagination, Navigation } from 'swiper/modules';
27
+ import { LayerById } from '../basic';
28
+ import 'swiper/css';
29
+ import 'swiper/css/pagination';
30
+ import 'swiper/css/navigation';
31
+
32
+ const props: any = defineProps({
33
+ srcName: {
34
+ type: String,
35
+ default: 'imgUrl'
36
+ },
37
+ id: {
38
+ type: String,
39
+ default: 'PhotoViewer'
40
+ },
41
+ initialSlide: {
42
+ type: Number,
43
+ default: 0
44
+ },
45
+ files: {
46
+ type: Array as () => any[],
47
+ default: () => []
48
+ }
49
+ });
50
+ </script>
@@ -0,0 +1 @@
1
+ <template><div></div></template>
@@ -0,0 +1 @@
1
+ <template><div></div></template>
@@ -0,0 +1 @@
1
+ <template><div></div></template>
@@ -0,0 +1 @@
1
+ <template><div></div></template>
@@ -0,0 +1 @@
1
+ <template><div></div></template>
@@ -0,0 +1 @@
1
+ <template><div></div></template>
@@ -0,0 +1 @@
1
+ <template><div></div></template>
@@ -0,0 +1 @@
1
+ <template><div></div></template>
@@ -0,0 +1 @@
1
+ <template><div></div></template>
@@ -0,0 +1 @@
1
+ <template><div></div></template>