@finema/core 1.4.110 → 1.4.112

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 (58) hide show
  1. package/README.md +60 -60
  2. package/dist/module.json +1 -1
  3. package/dist/module.mjs +6 -1
  4. package/dist/runtime/components/Alert.vue +48 -48
  5. package/dist/runtime/components/Avatar.vue +27 -27
  6. package/dist/runtime/components/Badge.vue +11 -11
  7. package/dist/runtime/components/Breadcrumb.vue +44 -44
  8. package/dist/runtime/components/Button/Group.vue +37 -37
  9. package/dist/runtime/components/Button/index.vue +75 -75
  10. package/dist/runtime/components/Card.vue +38 -38
  11. package/dist/runtime/components/Core.vue +13 -13
  12. package/dist/runtime/components/Dialog/index.vue +108 -108
  13. package/dist/runtime/components/Dropdown/index.vue +70 -70
  14. package/dist/runtime/components/FlexDeck/Base.vue +90 -90
  15. package/dist/runtime/components/FlexDeck/index.vue +66 -66
  16. package/dist/runtime/components/Form/FieldWrapper.vue +23 -23
  17. package/dist/runtime/components/Form/Fields.vue +222 -222
  18. package/dist/runtime/components/Form/InputCheckbox/index.vue +21 -21
  19. package/dist/runtime/components/Form/InputDateTime/index.vue +60 -60
  20. package/dist/runtime/components/Form/InputDateTimeRange/index.vue +83 -83
  21. package/dist/runtime/components/Form/InputNumber/index.vue +27 -27
  22. package/dist/runtime/components/Form/InputRadio/index.vue +27 -27
  23. package/dist/runtime/components/Form/InputSelect/index.vue +36 -36
  24. package/dist/runtime/components/Form/InputStatic/index.vue +16 -16
  25. package/dist/runtime/components/Form/InputTags/index.vue +134 -134
  26. package/dist/runtime/components/Form/InputText/index.vue +67 -67
  27. package/dist/runtime/components/Form/InputTextarea/index.vue +25 -25
  28. package/dist/runtime/components/Form/InputToggle/index.vue +14 -14
  29. package/dist/runtime/components/Form/InputUploadDropzone/index.vue +206 -206
  30. package/dist/runtime/components/Form/InputUploadDropzoneAuto/index.vue +333 -333
  31. package/dist/runtime/components/Form/InputUploadDropzoneAutoMultiple/Item.vue +260 -260
  32. package/dist/runtime/components/Form/InputUploadDropzoneAutoMultiple/index.vue +140 -140
  33. package/dist/runtime/components/Form/InputUploadDropzoneImageAutoMultiple/index.vue +148 -148
  34. package/dist/runtime/components/Form/InputUploadDropzoneImageAutoMultiple/item.vue +179 -179
  35. package/dist/runtime/components/Form/InputUploadFileClassic/index.vue +95 -95
  36. package/dist/runtime/components/Form/InputUploadFileClassicAuto/index.vue +143 -143
  37. package/dist/runtime/components/Form/InputUploadImageAuto/index.vue +222 -222
  38. package/dist/runtime/components/Form/InputWYSIWYG/index.vue +55 -40
  39. package/dist/runtime/components/Form/index.vue +6 -6
  40. package/dist/runtime/components/Icon.vue +23 -23
  41. package/dist/runtime/components/Image.vue +36 -36
  42. package/dist/runtime/components/Loader.vue +27 -27
  43. package/dist/runtime/components/Modal/index.vue +146 -146
  44. package/dist/runtime/components/QRCode.vue +22 -22
  45. package/dist/runtime/components/SimplePagination.vue +96 -96
  46. package/dist/runtime/components/Slideover/index.vue +110 -110
  47. package/dist/runtime/components/Table/Base.vue +139 -139
  48. package/dist/runtime/components/Table/ColumnDate.vue +16 -16
  49. package/dist/runtime/components/Table/ColumnDateTime.vue +18 -18
  50. package/dist/runtime/components/Table/ColumnImage.vue +15 -15
  51. package/dist/runtime/components/Table/ColumnNumber.vue +14 -14
  52. package/dist/runtime/components/Table/ColumnText.vue +25 -25
  53. package/dist/runtime/components/Table/Simple.vue +69 -69
  54. package/dist/runtime/components/Table/index.vue +65 -65
  55. package/dist/runtime/components/Tabs/index.vue +64 -64
  56. package/dist/runtime/quill.plugin.d.ts +2 -0
  57. package/dist/runtime/quill.plugin.mjs +5 -0
  58. package/package.json +92 -92
@@ -1,222 +1,222 @@
1
- <template>
2
- <FieldWrapper v-bind="wrapperProps">
3
- <div :class="[ui.base]">
4
- <input
5
- ref="fileInputRef"
6
- type="file"
7
- class="hidden"
8
- :name="name"
9
- :accept="acceptFile"
10
- :disabled="isDisabled"
11
- @change="handleChange"
12
- />
13
-
14
- <div :class="[ui.imageItem.wrapper]">
15
- <div v-if="!selectedFile" class="w-full">
16
- <div :class="[ui.action.addingWrapper]" @click="handleOpenFile">
17
- <Icon :name="ui.action.addingIcon" :class="[ui.action.addingBtnClass]" />
18
- <p :class="[ui.action.addingTextClass]">{{ uploadAddLabel }}</p>
19
- </div>
20
- </div>
21
-
22
- <!-- Loading State -->
23
- <div v-if="selectedFile && upload.status.value.isLoading" class="w-full">
24
- <div :class="[ui.imageItem.onLoading.wrapper]">
25
- <div :class="[ui.imageItem.onLoading.percentClass]">{{ percent }}%</div>
26
- <UProgress :value="percent" />
27
- </div>
28
- </div>
29
-
30
- <!-- Success State -->
31
- <div v-if="selectedFile && upload.status.value.isSuccess" class="w-full">
32
- <div :class="[ui.imageItem.onPreview.wrapper]">
33
- <img
34
- :class="[ui.imageItem.onPreview.previewImgClass]"
35
- :src="upload.data.value[responseKey || 'url']"
36
- alt="img"
37
- />
38
- <div :class="[ui.imageItem.onPreview.previewActionWrapper]">
39
- <Icon
40
- title="ดูตัวอย่าง"
41
- :name="ui.action.previewIcon"
42
- :class="[ui.imageItem.onPreview.actionBtnClass]"
43
- @click="() => (isPreviewOpen = true)"
44
- />
45
- <Icon
46
- title="ลบไฟล์"
47
- :name="ui.action.deleteIcon"
48
- :class="[ui.imageItem.onPreview.actionBtnClass]"
49
- @click="handleDeleteFile"
50
- />
51
- <Modal v-model="isPreviewOpen" size="xl">
52
- <div class="absolute -top-8 left-0 flex w-full justify-between text-gray-600">
53
- <p>{{ selectedFile?.name }}</p>
54
- <Icon
55
- name="i-heroicons-x-mark"
56
- class="size-6 cursor-pointer hover:text-gray-400"
57
- @click="() => (isPreviewOpen = false)"
58
- />
59
- </div>
60
- <img
61
- :src="upload.data.value[responseKey || 'url']"
62
- alt="img-preview"
63
- class="w-full rounded-lg"
64
- />
65
- </Modal>
66
- </div>
67
- </div>
68
-
69
- <div :class="[ui.imageItem.onPreview.previewTextWrapper]">
70
- <p :class="[ui.imageItem.onPreview.previewText]">{{ selectedFile.name }}</p>
71
- </div>
72
- </div>
73
-
74
- <!-- Failed State -->
75
- <div v-if="selectedFile && upload.status.value.isError" class="w-full">
76
- <div :class="[ui.imageItem.onFailed.wrapper]">
77
- <img
78
- :class="[ui.imageItem.onFailed.failedImgClass]"
79
- :src="generateURL(selectedFile)"
80
- alt="img"
81
- />
82
- <div :class="[ui.imageItem.onFailed.failedActionWrapper]">
83
- <Icon
84
- title="ลบไฟล์"
85
- :name="ui.action.deleteIcon"
86
- :class="[ui.imageItem.onFailed.actionBtnClass]"
87
- @click="handleDeleteFile"
88
- />
89
- </div>
90
- </div>
91
- </div>
92
- </div>
93
- </div>
94
- </FieldWrapper>
95
- </template>
96
-
97
- <script lang="ts" setup>
98
- import { type IUploadImageAutoProps } from './types'
99
- import FieldWrapper from '#core/components/Form/FieldWrapper.vue'
100
- import { useFieldHOC } from '#core/composables/useForm'
101
- import {
102
- computed,
103
- ref,
104
- toRef,
105
- useUI,
106
- useUiConfig,
107
- useWatchTrue,
108
- useUploadLoader,
109
- _get,
110
- type IUploadRequest,
111
- } from '#imports'
112
- import { uploadImage } from '#core/ui.config'
113
- import {
114
- checkMaxSize,
115
- generateURL,
116
- useFileAllocate,
117
- useFileProgress,
118
- } from '#core/helpers/componentHelper'
119
- import i18next from 'i18next'
120
-
121
- const config = useUiConfig<typeof uploadImage>(uploadImage, 'uploadImage')
122
-
123
- const props = withDefaults(defineProps<IUploadImageAutoProps>(), {
124
- accept: 'image/*',
125
- bodyKey: 'file',
126
- responseKey: 'url',
127
- uploadAddLabel: 'อัพโหลด',
128
- })
129
-
130
- const emits = defineEmits(['change', 'success', 'delete', 'error'])
131
-
132
- const request: IUploadRequest = {
133
- pathURL: props.uploadPathURL,
134
- requestOptions: props.requestOptions,
135
- }
136
-
137
- const selectedFile = ref<File>()
138
- const isPreviewOpen = ref<boolean>(false)
139
-
140
- const { wrapperProps, value, errorMessage } = useFieldHOC<string | undefined>(props)
141
-
142
- const upload = useUploadLoader(request)
143
- const { ui } = useUI('uploadImage', toRef(props, 'ui'), config)
144
-
145
- const fileInputRef = ref<HTMLInputElement | null>()
146
-
147
- const fileAllocate = useFileAllocate(toRef(selectedFile), props)
148
- const { onUploadProgress, onDownloadProgress, percent } = useFileProgress()
149
- const acceptFile = computed(() =>
150
- typeof props.accept === 'string' ? props.accept : props.accept?.join(',')
151
- )
152
-
153
- const handleChange = (e: Event) => {
154
- if (props.isDisabled) return
155
-
156
- const file = (e.target as HTMLInputElement).files?.[0]
157
- const result = handleCheckFileCondition(file)
158
-
159
- if (result && file) {
160
- selectedFile.value = file
161
- emits('change', selectedFile.value)
162
- const formData = new FormData()
163
-
164
- formData.append(props.bodyKey, file)
165
- upload.run(formData, { data: { onUploadProgress, onDownloadProgress } })
166
- }
167
- }
168
-
169
- const handleCheckFileCondition = (file: File | undefined): boolean => {
170
- if (!file) return false
171
- const maxSize = checkMaxSize(file, fileAllocate.acceptFileSizeKb.value)
172
-
173
- if (!maxSize) {
174
- if (fileAllocate.isAcceptFileUseMb.value) {
175
- errorMessage.value = i18next.t('custom:invalid_file_size_mb', {
176
- size: fileAllocate.acceptFileSizeMb.value,
177
- })
178
- } else {
179
- errorMessage.value = i18next.t('custom:invalid_file_size_kb', {
180
- size: fileAllocate.acceptFileSizeKb.value,
181
- })
182
- }
183
-
184
- return false
185
- }
186
-
187
- errorMessage.value = ''
188
-
189
- return true
190
- }
191
-
192
- const handleOpenFile = () => {
193
- fileInputRef.value?.click()
194
- }
195
-
196
- const handleDeleteFile = () => {
197
- fileInputRef.value!.value = ''
198
- selectedFile.value = undefined
199
- value.value = undefined
200
- emits('change', undefined)
201
-
202
- emits('delete')
203
- }
204
-
205
- useWatchTrue(
206
- () => upload.status.value.isSuccess,
207
- () => {
208
- const response = _get(upload.data.value, props.responseKey, '')
209
-
210
- value.value = response
211
-
212
- emits('success', response)
213
- }
214
- )
215
-
216
- useWatchTrue(
217
- () => upload.status.value.isError,
218
- () => {
219
- emits('error', upload.status.value.errorData)
220
- }
221
- )
222
- </script>
1
+ <template>
2
+ <FieldWrapper v-bind="wrapperProps">
3
+ <div :class="[ui.base]">
4
+ <input
5
+ ref="fileInputRef"
6
+ type="file"
7
+ class="hidden"
8
+ :name="name"
9
+ :accept="acceptFile"
10
+ :disabled="isDisabled"
11
+ @change="handleChange"
12
+ />
13
+
14
+ <div :class="[ui.imageItem.wrapper]">
15
+ <div v-if="!selectedFile" class="w-full">
16
+ <div :class="[ui.action.addingWrapper]" @click="handleOpenFile">
17
+ <Icon :name="ui.action.addingIcon" :class="[ui.action.addingBtnClass]" />
18
+ <p :class="[ui.action.addingTextClass]">{{ uploadAddLabel }}</p>
19
+ </div>
20
+ </div>
21
+
22
+ <!-- Loading State -->
23
+ <div v-if="selectedFile && upload.status.value.isLoading" class="w-full">
24
+ <div :class="[ui.imageItem.onLoading.wrapper]">
25
+ <div :class="[ui.imageItem.onLoading.percentClass]">{{ percent }}%</div>
26
+ <UProgress :value="percent" />
27
+ </div>
28
+ </div>
29
+
30
+ <!-- Success State -->
31
+ <div v-if="selectedFile && upload.status.value.isSuccess" class="w-full">
32
+ <div :class="[ui.imageItem.onPreview.wrapper]">
33
+ <img
34
+ :class="[ui.imageItem.onPreview.previewImgClass]"
35
+ :src="upload.data.value[responseKey || 'url']"
36
+ alt="img"
37
+ />
38
+ <div :class="[ui.imageItem.onPreview.previewActionWrapper]">
39
+ <Icon
40
+ title="ดูตัวอย่าง"
41
+ :name="ui.action.previewIcon"
42
+ :class="[ui.imageItem.onPreview.actionBtnClass]"
43
+ @click="() => (isPreviewOpen = true)"
44
+ />
45
+ <Icon
46
+ title="ลบไฟล์"
47
+ :name="ui.action.deleteIcon"
48
+ :class="[ui.imageItem.onPreview.actionBtnClass]"
49
+ @click="handleDeleteFile"
50
+ />
51
+ <Modal v-model="isPreviewOpen" size="xl">
52
+ <div class="absolute -top-8 left-0 flex w-full justify-between text-gray-600">
53
+ <p>{{ selectedFile?.name }}</p>
54
+ <Icon
55
+ name="i-heroicons-x-mark"
56
+ class="size-6 cursor-pointer hover:text-gray-400"
57
+ @click="() => (isPreviewOpen = false)"
58
+ />
59
+ </div>
60
+ <img
61
+ :src="upload.data.value[responseKey || 'url']"
62
+ alt="img-preview"
63
+ class="w-full rounded-lg"
64
+ />
65
+ </Modal>
66
+ </div>
67
+ </div>
68
+
69
+ <div :class="[ui.imageItem.onPreview.previewTextWrapper]">
70
+ <p :class="[ui.imageItem.onPreview.previewText]">{{ selectedFile.name }}</p>
71
+ </div>
72
+ </div>
73
+
74
+ <!-- Failed State -->
75
+ <div v-if="selectedFile && upload.status.value.isError" class="w-full">
76
+ <div :class="[ui.imageItem.onFailed.wrapper]">
77
+ <img
78
+ :class="[ui.imageItem.onFailed.failedImgClass]"
79
+ :src="generateURL(selectedFile)"
80
+ alt="img"
81
+ />
82
+ <div :class="[ui.imageItem.onFailed.failedActionWrapper]">
83
+ <Icon
84
+ title="ลบไฟล์"
85
+ :name="ui.action.deleteIcon"
86
+ :class="[ui.imageItem.onFailed.actionBtnClass]"
87
+ @click="handleDeleteFile"
88
+ />
89
+ </div>
90
+ </div>
91
+ </div>
92
+ </div>
93
+ </div>
94
+ </FieldWrapper>
95
+ </template>
96
+
97
+ <script lang="ts" setup>
98
+ import { type IUploadImageAutoProps } from './types'
99
+ import FieldWrapper from '#core/components/Form/FieldWrapper.vue'
100
+ import { useFieldHOC } from '#core/composables/useForm'
101
+ import {
102
+ computed,
103
+ ref,
104
+ toRef,
105
+ useUI,
106
+ useUiConfig,
107
+ useWatchTrue,
108
+ useUploadLoader,
109
+ _get,
110
+ type IUploadRequest,
111
+ } from '#imports'
112
+ import { uploadImage } from '#core/ui.config'
113
+ import {
114
+ checkMaxSize,
115
+ generateURL,
116
+ useFileAllocate,
117
+ useFileProgress,
118
+ } from '#core/helpers/componentHelper'
119
+ import i18next from 'i18next'
120
+
121
+ const config = useUiConfig<typeof uploadImage>(uploadImage, 'uploadImage')
122
+
123
+ const props = withDefaults(defineProps<IUploadImageAutoProps>(), {
124
+ accept: 'image/*',
125
+ bodyKey: 'file',
126
+ responseKey: 'url',
127
+ uploadAddLabel: 'อัพโหลด',
128
+ })
129
+
130
+ const emits = defineEmits(['change', 'success', 'delete', 'error'])
131
+
132
+ const request: IUploadRequest = {
133
+ pathURL: props.uploadPathURL,
134
+ requestOptions: props.requestOptions,
135
+ }
136
+
137
+ const selectedFile = ref<File>()
138
+ const isPreviewOpen = ref<boolean>(false)
139
+
140
+ const { wrapperProps, value, errorMessage } = useFieldHOC<string | undefined>(props)
141
+
142
+ const upload = useUploadLoader(request)
143
+ const { ui } = useUI('uploadImage', toRef(props, 'ui'), config)
144
+
145
+ const fileInputRef = ref<HTMLInputElement | null>()
146
+
147
+ const fileAllocate = useFileAllocate(toRef(selectedFile), props)
148
+ const { onUploadProgress, onDownloadProgress, percent } = useFileProgress()
149
+ const acceptFile = computed(() =>
150
+ typeof props.accept === 'string' ? props.accept : props.accept?.join(',')
151
+ )
152
+
153
+ const handleChange = (e: Event) => {
154
+ if (props.isDisabled) return
155
+
156
+ const file = (e.target as HTMLInputElement).files?.[0]
157
+ const result = handleCheckFileCondition(file)
158
+
159
+ if (result && file) {
160
+ selectedFile.value = file
161
+ emits('change', selectedFile.value)
162
+ const formData = new FormData()
163
+
164
+ formData.append(props.bodyKey, file)
165
+ upload.run(formData, { data: { onUploadProgress, onDownloadProgress } })
166
+ }
167
+ }
168
+
169
+ const handleCheckFileCondition = (file: File | undefined): boolean => {
170
+ if (!file) return false
171
+ const maxSize = checkMaxSize(file, fileAllocate.acceptFileSizeKb.value)
172
+
173
+ if (!maxSize) {
174
+ if (fileAllocate.isAcceptFileUseMb.value) {
175
+ errorMessage.value = i18next.t('custom:invalid_file_size_mb', {
176
+ size: fileAllocate.acceptFileSizeMb.value,
177
+ })
178
+ } else {
179
+ errorMessage.value = i18next.t('custom:invalid_file_size_kb', {
180
+ size: fileAllocate.acceptFileSizeKb.value,
181
+ })
182
+ }
183
+
184
+ return false
185
+ }
186
+
187
+ errorMessage.value = ''
188
+
189
+ return true
190
+ }
191
+
192
+ const handleOpenFile = () => {
193
+ fileInputRef.value?.click()
194
+ }
195
+
196
+ const handleDeleteFile = () => {
197
+ fileInputRef.value!.value = ''
198
+ selectedFile.value = undefined
199
+ value.value = undefined
200
+ emits('change', undefined)
201
+
202
+ emits('delete')
203
+ }
204
+
205
+ useWatchTrue(
206
+ () => upload.status.value.isSuccess,
207
+ () => {
208
+ const response = _get(upload.data.value, props.responseKey, '')
209
+
210
+ value.value = response
211
+
212
+ emits('success', response)
213
+ }
214
+ )
215
+
216
+ useWatchTrue(
217
+ () => upload.status.value.isError,
218
+ () => {
219
+ emits('error', upload.status.value.errorData)
220
+ }
221
+ )
222
+ </script>
@@ -1,40 +1,55 @@
1
- <template>
2
- <FieldWrapper v-bind="wrapperProps">
3
- <div :id="id" />
4
- </FieldWrapper>
5
- </template>
6
- <script lang="ts" setup>
7
- import { useFieldHOC } from '#core/composables/useForm'
8
- import FieldWrapper from '#core/components/Form/FieldWrapper.vue'
9
- import type { IWYSIWYGFieldProps } from '#core/components/Form/InputWYSIWYG/types'
10
- import 'quill/dist/quill.core.css'
11
- import 'quill/dist/quill.snow.css'
12
- import { onMounted } from 'vue'
13
- import { useId } from '#app'
14
- import type Quill from 'quill'
15
-
16
- const props = withDefaults(defineProps<IWYSIWYGFieldProps>(), {})
17
- const id = useId()
18
- const { value, wrapperProps } = useFieldHOC<string>(props)
19
-
20
- onMounted(async () => {
21
- if (process.client) {
22
- const Quill = await import('quill')
23
-
24
- // eslint-disable-next-line
25
- const quill: Quill = new Quill.default(`#${id}`, {
26
- theme: 'snow',
27
- placeholder: props.placeholder,
28
- readOnly: props.isDisabled || props.isReadonly,
29
- })
30
-
31
- quill.setContents(quill.clipboard.convert({ html: value.value }))
32
-
33
- quill.on('text-change', (delta, oldDelta, source) => {
34
- if (value.value === quill.getSemanticHTML()) return
35
-
36
- value.value = quill.getSemanticHTML()
37
- })
38
- }
39
- })
40
- </script>
1
+ <template>
2
+ <FieldWrapper v-bind="wrapperProps">
3
+ <ClientOnly>
4
+ <QuillEditor
5
+ v-model:content="value"
6
+ :placeholder="placeholder ?? label"
7
+ :autofocus="autoFocus"
8
+ :disabled="isDisabled || isReadonly"
9
+ :name="name"
10
+ class="ql-snow focus:ring-primary-500 min-h-[300px] rounded-b-md ring-1 ring-inset ring-gray-300 focus:ring-2"
11
+ content-type="html"
12
+ :options="options"
13
+ />
14
+ </ClientOnly>
15
+ </FieldWrapper>
16
+ </template>
17
+ <script lang="ts" setup>
18
+ import { useFieldHOC } from '#core/composables/useForm'
19
+ import FieldWrapper from '#core/components/Form/FieldWrapper.vue'
20
+ import '@vueup/vue-quill/dist/vue-quill.snow.css'
21
+ import type { IWYSIWYGFieldProps } from '#core/components/Form/InputWYSIWYG/types'
22
+
23
+ const props = withDefaults(defineProps<IWYSIWYGFieldProps>(), {})
24
+ const { value, wrapperProps } = useFieldHOC<string>(props)
25
+
26
+ const options = {
27
+ modules: {
28
+ toolbar: [
29
+ // [{ size: ['small', false, 'large', 'huge'] }], // custom dropdown
30
+ ['bold', 'italic', 'underline'], // toggled buttons
31
+ // ['blockquote', 'code-block'],
32
+ // ['link', 'image', 'video'], // link and image, video
33
+ ['link'],
34
+
35
+ // [{ header: 1 }, { header: 2 }], // custom button values
36
+ // [{ list: 'ordered' }, { list: 'bullet' }],
37
+ // [{ script: 'sub' }, { script: 'super' }], // superscript/subscript
38
+ // [{ indent: '-1' }, { indent: '+1' }], // outdent/indent
39
+ // [{ direction: 'rtl' }], // text direction
40
+
41
+ // [{ header: [1, 2, 3, 4, 5, 6, false] }],
42
+
43
+ [{ color: [] }, { background: [] }], // dropdown with defaults from theme
44
+ // [{ font: [] }],
45
+ // [{ align: [] }],
46
+ //
47
+ ['clean'], // remove formatting button
48
+ ],
49
+ },
50
+ theme: 'snow',
51
+ }
52
+ </script>
53
+ <style>
54
+ .ql-toolbar.ql-snow{@apply rounded-t-md border-b-0}.ql-container.ql-snow,.ql-snow{@apply border-0}
55
+ </style>
@@ -1,6 +1,6 @@
1
- <template>
2
- <form class="form">
3
- <slot />
4
- </form>
5
- </template>
6
- <script lang="ts" setup></script>
1
+ <template>
2
+ <form class="form">
3
+ <slot />
4
+ </form>
5
+ </template>
6
+ <script lang="ts" setup></script>
@@ -1,23 +1,23 @@
1
- <template>
2
- <UIcon :name="name" :dynamic="dynamicValue" />
3
- </template>
4
-
5
- <script lang="ts" setup>
6
- import { computed, useUiConfig } from '#imports'
7
- import { icon } from '#core/ui.config'
8
-
9
- const props = defineProps({
10
- name: {
11
- type: String,
12
- required: true,
13
- },
14
- dynamic: {
15
- type: Boolean,
16
- default: false,
17
- },
18
- })
19
-
20
- const config = useUiConfig<typeof icon>(icon, 'icon')
21
-
22
- const dynamicValue = computed(() => props.dynamic || config.dynamic)
23
- </script>
1
+ <template>
2
+ <UIcon :name="name" :dynamic="dynamicValue" />
3
+ </template>
4
+
5
+ <script lang="ts" setup>
6
+ import { computed, useUiConfig } from '#imports'
7
+ import { icon } from '#core/ui.config'
8
+
9
+ const props = defineProps({
10
+ name: {
11
+ type: String,
12
+ required: true,
13
+ },
14
+ dynamic: {
15
+ type: Boolean,
16
+ default: false,
17
+ },
18
+ })
19
+
20
+ const config = useUiConfig<typeof icon>(icon, 'icon')
21
+
22
+ const dynamicValue = computed(() => props.dynamic || config.dynamic)
23
+ </script>