@bagelink/vue 0.0.712 → 0.0.716

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 (177) hide show
  1. package/dist/components/Accordion.d.ts +12 -0
  2. package/dist/components/Accordion.d.ts.map +1 -0
  3. package/dist/components/AccordionItem.d.ts +34 -0
  4. package/dist/components/AccordionItem.d.ts.map +1 -0
  5. package/dist/components/Alert.d.ts +34 -0
  6. package/dist/components/Alert.d.ts.map +1 -0
  7. package/dist/components/Avatar.d.ts +36 -0
  8. package/dist/components/Avatar.d.ts.map +1 -0
  9. package/dist/components/Badge.d.ts +22 -0
  10. package/dist/components/Badge.d.ts.map +1 -0
  11. package/dist/components/BglVideo.d.ts +20 -0
  12. package/dist/components/BglVideo.d.ts.map +1 -0
  13. package/dist/components/Btn.d.ts +99 -0
  14. package/dist/components/Btn.d.ts.map +1 -0
  15. package/dist/components/Card.d.ts +39 -0
  16. package/dist/components/Card.d.ts.map +1 -0
  17. package/dist/components/Carousel.d.ts +74 -0
  18. package/dist/components/Carousel.d.ts.map +1 -0
  19. package/dist/components/ComboBox.vue.d.ts +3 -3
  20. package/dist/components/Comments.vue.d.ts +2 -2
  21. package/dist/components/ContactSubmissions.vue.d.ts +2 -2
  22. package/dist/components/DataPreview.d.ts +42 -0
  23. package/dist/components/DataPreview.d.ts.map +1 -0
  24. package/dist/components/Drop.vue.d.ts +34 -0
  25. package/dist/components/Drop.vue.d.ts.map +1 -0
  26. package/dist/components/DropDown.vue.d.ts +3 -3
  27. package/dist/components/FileUploader.vue.d.ts +60 -0
  28. package/dist/components/FileUploader.vue.d.ts.map +1 -0
  29. package/dist/components/Flag.d.ts +20 -0
  30. package/dist/components/Flag.d.ts.map +1 -0
  31. package/dist/components/FormSchema.vue.d.ts +5 -4
  32. package/dist/components/LangText.vue.d.ts +2 -2
  33. package/dist/components/ListItem.d.ts +34 -0
  34. package/dist/components/ListItem.d.ts.map +1 -0
  35. package/dist/components/ListItem.vue.d.ts.map +1 -1
  36. package/dist/components/ListView.d.ts +13 -0
  37. package/dist/components/ListView.d.ts.map +1 -0
  38. package/dist/components/MapEmbed.d.ts +3 -0
  39. package/dist/components/MapEmbed.d.ts.map +1 -0
  40. package/dist/components/MaterialIcon.d.ts +26 -0
  41. package/dist/components/MaterialIcon.d.ts.map +1 -0
  42. package/dist/components/Modal.d.ts +46 -0
  43. package/dist/components/Modal.d.ts.map +1 -0
  44. package/dist/components/ModalBglForm.vue.d.ts +21 -20
  45. package/dist/components/ModalConfirm.d.ts +24 -0
  46. package/dist/components/ModalConfirm.d.ts.map +1 -0
  47. package/dist/components/ModalForm.d.ts +78 -0
  48. package/dist/components/ModalForm.d.ts.map +1 -0
  49. package/dist/components/NavBar.d.ts +64 -0
  50. package/dist/components/NavBar.d.ts.map +1 -0
  51. package/dist/components/PageTitle.d.ts +24 -0
  52. package/dist/components/PageTitle.d.ts.map +1 -0
  53. package/dist/components/PersonPreview.vue.d.ts +5 -4
  54. package/dist/components/PersonPreviewFormkit.vue.d.ts +4 -3
  55. package/dist/components/RTXEditor.vue.d.ts +3 -3
  56. package/dist/components/RouterWrapper.d.ts +3 -0
  57. package/dist/components/RouterWrapper.d.ts.map +1 -0
  58. package/dist/components/TabbedLayout.vue.d.ts +5 -4
  59. package/dist/components/TableSchema.d.ts +35 -0
  60. package/dist/components/TableSchema.d.ts.map +1 -0
  61. package/dist/components/Title.d.ts +42 -0
  62. package/dist/components/Title.d.ts.map +1 -0
  63. package/dist/components/TopBar.d.ts +12 -0
  64. package/dist/components/TopBar.d.ts.map +1 -0
  65. package/dist/components/charts/BarChart.vue.d.ts +2 -2
  66. package/dist/components/dashboard/Lineart.d.ts +20 -0
  67. package/dist/components/dashboard/Lineart.d.ts.map +1 -0
  68. package/dist/components/form/BglField.d.ts +25 -0
  69. package/dist/components/form/BglField.d.ts.map +1 -0
  70. package/dist/components/form/BglForm.d.ts +75 -0
  71. package/dist/components/form/BglForm.d.ts.map +1 -0
  72. package/dist/components/form/ItemRef.vue.d.ts +5 -3
  73. package/dist/components/form/ItemRef.vue.d.ts.map +1 -1
  74. package/dist/components/form/MaterialIcon.vue.d.ts +4 -3
  75. package/dist/components/form/PlainInputField.vue.d.ts +3 -3
  76. package/dist/components/form/inputs/CheckInput.d.ts +56 -0
  77. package/dist/components/form/inputs/CheckInput.d.ts.map +1 -0
  78. package/dist/components/form/inputs/Checkbox.d.ts +16 -0
  79. package/dist/components/form/inputs/Checkbox.d.ts.map +1 -0
  80. package/dist/components/form/inputs/ColorPicker.d.ts +48 -0
  81. package/dist/components/form/inputs/ColorPicker.d.ts.map +1 -0
  82. package/dist/components/form/inputs/CurrencyInput.vue.d.ts +3 -3
  83. package/dist/components/form/inputs/DateInput.d.ts +64 -0
  84. package/dist/components/form/inputs/DateInput.d.ts.map +1 -0
  85. package/dist/components/form/inputs/DatePicker.d.ts +33 -0
  86. package/dist/components/form/inputs/DatePicker.d.ts.map +1 -0
  87. package/dist/components/form/inputs/DatetimeInput.vue.d.ts +3 -3
  88. package/dist/components/form/inputs/DurationInput.vue.d.ts +3 -3
  89. package/dist/components/form/inputs/DynamicLinkField.vue.d.ts +3 -3
  90. package/dist/components/form/inputs/EmailInput.vue.d.ts +3 -3
  91. package/dist/components/form/inputs/FileUpload.d.ts +108 -0
  92. package/dist/components/form/inputs/FileUpload.d.ts.map +1 -0
  93. package/dist/components/form/inputs/FileUpload.vue.d.ts +6 -0
  94. package/dist/components/form/inputs/FileUpload.vue.d.ts.map +1 -1
  95. package/dist/components/form/inputs/FloatInput.vue.d.ts +3 -3
  96. package/dist/components/form/inputs/IntInput.vue.d.ts +3 -3
  97. package/dist/components/form/inputs/JSONInput.d.ts +53 -0
  98. package/dist/components/form/inputs/JSONInput.d.ts.map +1 -0
  99. package/dist/components/form/inputs/LinkField.vue.d.ts +3 -3
  100. package/dist/components/form/inputs/Password.vue.d.ts +3 -3
  101. package/dist/components/form/inputs/PasswordInput.vue.d.ts +3 -3
  102. package/dist/components/form/inputs/PlainText.vue.d.ts +3 -3
  103. package/dist/components/form/inputs/RadioGroup.d.ts +42 -0
  104. package/dist/components/form/inputs/RadioGroup.d.ts.map +1 -0
  105. package/dist/components/form/inputs/RadioPillsInput.d.ts +48 -0
  106. package/dist/components/form/inputs/RadioPillsInput.d.ts.map +1 -0
  107. package/dist/components/form/inputs/ReadOnlyInput.vue.d.ts +2 -2
  108. package/dist/components/form/inputs/RichText.d.ts +20 -0
  109. package/dist/components/form/inputs/RichText.d.ts.map +1 -0
  110. package/dist/components/form/inputs/RichText2/Toolbar.d.ts +22 -0
  111. package/dist/components/form/inputs/RichText2/Toolbar.d.ts.map +1 -0
  112. package/dist/components/form/inputs/RichText2/Toolbar.vue.d.ts.map +1 -1
  113. package/dist/components/form/inputs/RichText2/index.d.ts +24 -0
  114. package/dist/components/form/inputs/RichText2/index.d.ts.map +1 -0
  115. package/dist/components/form/inputs/RichText2/index.vue.d.ts.map +1 -1
  116. package/dist/components/form/inputs/RichTextEditor.vue.d.ts +3 -3
  117. package/dist/components/form/inputs/SelectField.vue.d.ts +6 -8
  118. package/dist/components/form/inputs/SelectField.vue.d.ts.map +1 -1
  119. package/dist/components/form/inputs/SelectInput.d.ts +55 -0
  120. package/dist/components/form/inputs/SelectInput.d.ts.map +1 -0
  121. package/dist/components/form/inputs/SelectInput.vue.d.ts.map +1 -1
  122. package/dist/components/form/inputs/SignaturePad.d.ts +72 -0
  123. package/dist/components/form/inputs/SignaturePad.d.ts.map +1 -0
  124. package/dist/components/form/inputs/TableField.d.ts +45 -0
  125. package/dist/components/form/inputs/TableField.d.ts.map +1 -0
  126. package/dist/components/form/inputs/TelInput.d.ts +241 -0
  127. package/dist/components/form/inputs/TelInput.d.ts.map +1 -0
  128. package/dist/components/form/inputs/TextArea.vue.d.ts +3 -3
  129. package/dist/components/form/inputs/TextInput.d.ts +90 -0
  130. package/dist/components/form/inputs/TextInput.d.ts.map +1 -0
  131. package/dist/components/form/inputs/ToggleInput.d.ts +58 -0
  132. package/dist/components/form/inputs/ToggleInput.d.ts.map +1 -0
  133. package/dist/components/formkit/AddressArray.vue.d.ts +2 -2
  134. package/dist/components/formkit/BankDetailsArray.vue.d.ts +2 -2
  135. package/dist/components/formkit/ContactArrayFormKit.vue.d.ts +2 -2
  136. package/dist/components/formkit/FileUploader.vue.d.ts +2 -2
  137. package/dist/components/formkit/MiscFields.vue.d.ts +2 -2
  138. package/dist/components/formkit/Toggle.vue.d.ts +2 -2
  139. package/dist/components/layout/BottomMenu.d.ts +27 -0
  140. package/dist/components/layout/BottomMenu.d.ts.map +1 -0
  141. package/dist/components/layout/Layout.d.ts +58 -0
  142. package/dist/components/layout/Layout.d.ts.map +1 -0
  143. package/dist/components/layout/SidebarMenu.d.ts +38 -0
  144. package/dist/components/layout/SidebarMenu.d.ts.map +1 -0
  145. package/dist/components/layout/TabbedLayout.d.ts +42 -0
  146. package/dist/components/layout/TabbedLayout.d.ts.map +1 -0
  147. package/dist/components/layout/Tabs.d.ts +31 -0
  148. package/dist/components/layout/Tabs.d.ts.map +1 -0
  149. package/dist/components/layout/TabsBody.d.ts +23 -0
  150. package/dist/components/layout/TabsBody.d.ts.map +1 -0
  151. package/dist/components/layout/TabsNav.d.ts +35 -0
  152. package/dist/components/layout/TabsNav.d.ts.map +1 -0
  153. package/dist/components/whatsapp/form/MsgTemplate.vue.d.ts +4 -3
  154. package/dist/components/whatsapp/form/TextVariableExamples.vue.d.ts +2 -2
  155. package/dist/index.cjs +240 -184
  156. package/dist/index.d.ts +1 -0
  157. package/dist/index.d.ts.map +1 -1
  158. package/dist/index.mjs +240 -184
  159. package/dist/plugins/modal.d.ts.map +1 -1
  160. package/dist/style.css +178 -89
  161. package/dist/utils/constants.d.ts +5 -0
  162. package/dist/utils/constants.d.ts.map +1 -0
  163. package/dist/utils/objects.d.ts +1 -0
  164. package/package.json +13 -13
  165. package/src/components/ListItem.vue +6 -3
  166. package/src/components/form/inputs/FileUpload.vue +185 -64
  167. package/src/components/form/inputs/RichText2/Toolbar.vue +39 -62
  168. package/src/components/form/inputs/RichText2/index.vue +34 -16
  169. package/src/components/form/inputs/SelectInput.vue +20 -9
  170. package/src/index.ts +1 -0
  171. package/src/plugins/modal.ts +48 -16
  172. package/src/utils/constants.ts +4 -0
  173. package/dist/components/Popover.vue.d.ts +0 -10
  174. package/dist/components/Popover.vue.d.ts.map +0 -1
  175. package/dist/types/materialIcon.d.ts +0 -2
  176. package/dist/types/materialIcon.d.ts.map +0 -1
  177. package/src/components/form/inputs/FileUploadURL.vue +0 -300
@@ -1,6 +1,6 @@
1
1
  <script setup lang="ts">
2
2
  import { onMounted, watch } from 'vue'
3
- import { Btn, Icon, type StorageFile, useBagel } from '@bagelink/vue'
3
+ import { Btn, IMAGE_FORMATS, IMAGE_FORMATS_REGEXP, Icon, type StorageFile, useBagel } from '@bagelink/vue'
4
4
 
5
5
  const props = defineProps<{
6
6
  label?: string
@@ -9,7 +9,10 @@ const props = defineProps<{
9
9
  bindkey?: StrKey
10
10
  modelValue?: FSValue
11
11
  width?: string
12
+ height?: string | 'auto'
12
13
  topic?: string
14
+ fill?: boolean
15
+ oval?: boolean
13
16
  }>()
14
17
 
15
18
  const emit = defineEmits(['update:modelValue', 'addFileStart'])
@@ -30,6 +33,8 @@ type FSValue = string[] | string | number
30
33
 
31
34
  const bindKey: StrKey = props.bindkey || 'id'
32
35
 
36
+ const isImage = (str: string) => IMAGE_FORMATS_REGEXP.test(str)
37
+
33
38
  let file_bindkeys = $ref<FSValue>(props.modelValue || [])
34
39
  const storageFiles = $ref<StorageFile[]>([])
35
40
 
@@ -174,25 +179,26 @@ function drop(e: DragEvent) {
174
179
  <div
175
180
  class="fileUploadWrap"
176
181
  :class="{
177
- fileDropZone: !storageFiles.length && !fileQueue.length,
178
- dragover: isDragOver,
182
+ 'fileDropZone': !storageFiles.length && !fileQueue.length,
183
+ 'dragover': isDragOver,
184
+ 'bgl_oval-upload': oval,
179
185
  }"
186
+ :style="{ width: props.width, height: props.height || '215px' }"
180
187
  @click="browse"
181
188
  @dragover="dragover"
182
189
  @drop="drop"
183
190
  @dragleave="dragleave"
184
191
  >
185
192
  <slot name="files" :files="storageFiles" :fileQueue>
186
- <template v-for="file in storageFiles" :key="file.id">
187
- <div v-if="!multiple" class="single-image">
188
- <img class="single preview" :src="file.url" alt="">
189
- <!-- <p class="no-margin">
190
- {{ file.name }}
191
- </p> -->
192
- </div>
193
- <div v-if="multiple" class="multi-image-item previewName">
194
- <img class="preview" :src="file.url" alt="">
195
- <p class="no-margin">
193
+ <div v-if="multiple" class="bgl-multi-preview">
194
+ <div
195
+ v-for="file in storageFiles"
196
+ :key="file.id"
197
+ class="multi-image-item-preview"
198
+ >
199
+ <img v-if="isImage(file.extension || file.url)" class="multi-preview" :src="file.url" alt="">
200
+ <Icon v-else icon="draft" class="multi-preview" />
201
+ <p class="m-0">
196
202
  {{ file.name }}
197
203
  </p>
198
204
  <Btn
@@ -203,20 +209,24 @@ function drop(e: DragEvent) {
203
209
  @click.stop="removeFile(file)"
204
210
  />
205
211
  </div>
206
- </template>
207
- <template v-for="fileQ in fileQueue" :key="fileQ.file">
208
- <div v-if="!multiple" class="imagePreviewWrap">
209
- <img class="preview" :src="fileToUrl(fileQ.file)" alt="">
210
- </div>
211
- <div class="previewName">
212
- <img
213
- v-if="multiple"
214
- :width="width || '220'"
215
- class="preview"
216
- :src="fileToUrl(fileQ.file)"
217
- alt=""
218
- >
219
- <p class="no-margin">
212
+ <div
213
+ v-for="fileQ in fileQueue"
214
+ :key="fileQ.file.name"
215
+ class="multi-image-item-preview"
216
+ >
217
+ <template v-if="isImage(fileQ.file.type)">
218
+ <img
219
+ v-if="multiple"
220
+ :width="width || '220'"
221
+ class="multi-preview"
222
+ :src="fileToUrl(fileQ.file)"
223
+ alt=""
224
+ >
225
+ </template>
226
+
227
+ <Icon v-else icon="draft" class="multi-preview" />
228
+
229
+ <p class="no-margin multi-preview-txt">
220
230
  {{ fileQ.name }}
221
231
  </p>
222
232
  <div
@@ -231,7 +241,40 @@ function drop(e: DragEvent) {
231
241
  <Icon class="success" icon="check" />
232
242
  </div>
233
243
  </div>
234
- </template>
244
+ </div>
245
+
246
+ <div v-if="!multiple" class="bgl-single-preview">
247
+ <div
248
+ v-for="file in storageFiles"
249
+ :key="file.id"
250
+ class="single-image-item-preview"
251
+ :class="{ 'bgl_fill-image': fill }"
252
+ >
253
+ <img v-if="isImage(file.extension || file.url)" class="single-preview" :src="file.url" alt="">
254
+ <Icon v-else :size="4" weight="2" icon="draft" class="color-primary w-100" />
255
+ </div>
256
+
257
+ <div
258
+ v-for="fileQ in fileQueue"
259
+ :key="fileQ.file.name"
260
+ class="single-image-item-preview"
261
+ :class="{ 'bgl_fill-image': fill }"
262
+ >
263
+ <div
264
+ class="pie"
265
+ :style="`--p:${fileQ.progress}`"
266
+ style="--b: 2px"
267
+ :class="{ complete: fileQ.progress === 100 }"
268
+ >
269
+ <span v-if="fileQ.progress < 100" class="progress">
270
+ {{ `${fileQ.progress.toFixed(0)}` }}
271
+ </span>
272
+ <Icon class="success" icon="check" />
273
+ </div>
274
+ <img v-if="isImage(fileQ.file.type)" class="single-preview" :src="fileToUrl(fileQ.file)" alt="">
275
+ <!-- <Icon v-else :size="8" weight="2" icon="draft" class="color-primary" /> -->
276
+ </div>
277
+ </div>
235
278
  </slot>
236
279
  <slot
237
280
  v-if="(!storageFiles.length && !fileQueue.length) || multiple"
@@ -240,85 +283,163 @@ function drop(e: DragEvent) {
240
283
  :fileQueue
241
284
  :browse
242
285
  >
243
- <p>Drop files here or click to upload</p>
286
+ <p class="p-1 flex column hover fileUploadPlaceHolder">
287
+ <Icon icon="upload_2" />
288
+ Drop files here or click to upload
289
+ </p>
244
290
  </slot>
245
291
  </div>
246
292
  </div>
247
293
  </template>
248
294
 
249
295
  <style scoped>
250
- .bagel-input .fileUploadWrap {
251
- --width: 320px;
296
+ .fileUploadWrap {
252
297
  outline: 1px solid var(--border-color);
253
298
  border-radius: var(--input-border-radius);
254
299
  text-align: center;
255
300
  cursor: pointer;
256
301
  transition: var(--bgl-transition);
257
302
  position: relative;
258
- height: calc(var(--width) / 1.5);
259
303
  font-size: var(--input-font-size);
260
304
  overflow-y: auto;
261
305
  background: var(--input-bg);
306
+ height: 215px;
307
+ }
308
+ .bagel-input .fileUploadWrap.fileDropZone {
309
+ background: var(--input-bg);
310
+ display: flex;
311
+ align-items: center;
312
+ justify-content: center;
313
+ color: var(--bgl-gray);
314
+ flex-direction: column;
315
+ }
316
+
317
+ .fileUploadWrap.dragover,
318
+ .fileUploadWrap:hover {
319
+ box-shadow: inset 0 0 10px #00000012;
320
+ }
321
+
322
+ .fileUploadWrap[style*="height: auto;"] {
323
+ min-height: 215px;
262
324
  }
263
325
 
264
- .previewName {
265
- padding: 0.5rem;
326
+ .multi-image-item-preview {
327
+ border: 1px solid var(--border-color) !important;
328
+ border-radius: var(--input-border-radius);
329
+ margin: 0.5rem !important;
330
+ background: var(--bgl-white);
331
+ padding: 0;
332
+ padding-inline-end: 0.75rem;
266
333
  text-align: start;
267
334
  color: var(--input-color);
268
335
  display: grid;
269
336
  grid-template-columns: auto 1fr 22px;
270
337
  gap: 1rem;
271
338
  align-items: center;
272
- padding-inline: 14px;
273
339
  }
274
-
275
- .previewName p {
340
+ .multi-image-item-preview p {
276
341
  overflow: hidden;
277
342
  text-overflow: ellipsis;
278
343
  white-space: nowrap;
279
344
  }
280
-
281
- .imagePreviewWrap {
282
- background: var(--input-bg);
283
- border-radius: var(--input-border-radius);
284
- padding: 5px;
285
- min-height: 90px;
286
- }
287
-
288
- img.preview {
289
- /* max-height: calc(var(--width) / 2); */
290
- /* max-width: calc(var(--width) * 2); */
345
+ .multi-preview{
291
346
  width: 40px;
292
347
  height: 40px;
293
348
  border-radius: var(--input-border-radius);
294
349
  object-fit: cover;
295
350
  background: var(--bgl-gray-light);
296
- box-shadow: 0 0 10px #00000012;
351
+ text-align: center !important;
352
+ justify-content: center;
353
+ align-items: center;
354
+ display: flex;
355
+ }
356
+ .bgl-single-preview{
357
+ height: 100%;
358
+ position: relative;
359
+ }
360
+ .bgl-single-preview + .fileUploadPlaceHolder{
361
+ position: absolute;
362
+ inset: 0;
363
+ margin: auto;
364
+ top: calc(50% - 2rem);
365
+ }
366
+ .single-image-item-preview {
367
+ height: 100%;
368
+ min-height: 100%;
369
+ position: relative;
370
+ display: flex;
371
+ align-items: center;
372
+ justify-content: center;
373
+ }
374
+ .fileUploadWrap[style*="height: auto"] .single-image-item-preview {
375
+ min-height: 215px;
297
376
  }
298
377
 
299
- img.preview.single {
300
- max-width: var(--width);
301
- width: calc(100% - 2.75rem);
302
- object-fit: contain;
303
- height: auto;
304
- max-height: calc(var(--width) / 2);
378
+ .fileUploadWrap[style*="height: auto"] .single-preview {
379
+ margin: 0rem !important;
380
+
381
+ }
382
+ .single-preview{
383
+ border-radius: var(--input-border-radius);
305
384
  margin: 1rem;
385
+ padding: 0px;
386
+ min-height: calc(100% - 2rem);
387
+ height: calc(100% - 2rem);
388
+ object-fit: cover;
389
+ background: var(--bgl-gray-light);
390
+ box-shadow: 0 0 10px #00000012;
306
391
  }
307
-
308
- .fileUploadWrap.dragover,
309
- .fileUploadWrap:hover {
310
- box-shadow: inset 0 0 10px #00000012;
392
+ .bgl_fill-image.single-image-item-preview {
393
+ height: 100%;
394
+ }
395
+ .bgl_fill-image.single-image-item-preview .single-preview{
396
+ border-radius: unset;
397
+ object-fit: cover;
398
+ box-shadow: unset;
399
+ width: 100%;
400
+ height: auto;
311
401
  }
312
402
 
313
- .bagel-input .fileUploadWrap.fileDropZone {
314
- background: var(--input-bg);
403
+ .single-image-item-preview .pie {
404
+ transform-origin: top;
405
+ transform: scale(1.4);
406
+ position: absolute;
407
+ text-align: center;
408
+ inset: 0;
409
+ margin: auto;
315
410
  display: flex;
316
- align-items: center;
317
411
  justify-content: center;
318
- color: var(--bgl-gray);
319
- flex-direction: column;
412
+ align-items: center;
413
+ background: transparent;
414
+ border: none !important;
415
+ padding: 0 !important;
320
416
  }
321
417
 
418
+ .bgl_oval-upload {
419
+ border-radius: 100% !important;
420
+ overflow: hidden;
421
+ }
422
+ .bgl_oval-upload p {
423
+ padding: 0.75rem !important;
424
+ font-size: 12px
425
+ }
426
+ .bgl_oval-upload .fileUploadPlaceHolder{
427
+ top: 0;
428
+ }
429
+ .bgl_oval-upload .pie {
430
+ transform: scale(1);
431
+ }
432
+ .bgl_oval-upload span.bgl_icon-font.color-primary {
433
+ transform: scale(0.4) !important;
434
+ }
435
+ .bgl_oval-upload .single-image-item-preview{
436
+ height: 100%;
437
+ }
438
+ .bgl_oval-upload .single-preview {
439
+ margin: 0;
440
+ height: 100% !important;
441
+ }
442
+
322
443
  .pie {
323
444
  width: 30px;
324
445
  height: 30px;
@@ -1,5 +1,6 @@
1
1
  <script lang="ts" setup>
2
2
  import { Btn, type MaterialIcons } from '@bagelink/vue'
3
+ import SelectInput from '../SelectInput.vue'
3
4
  import type { ToolbarConfig, ToolbarConfigOption } from './richtext-types'
4
5
 
5
6
  defineProps<{ config: ToolbarConfig }>()
@@ -9,33 +10,26 @@ const colorPicker = $ref<HTMLInputElement | null>(null)
9
10
  const fontSizeInput = $ref<HTMLInputElement | null>(null)
10
11
 
11
12
  interface toolbarOption {
12
- name: ToolbarConfigOption
13
+ name: ToolbarConfigOption | 'separator'
13
14
  icon: MaterialIcons
14
15
  }
15
16
 
16
17
  const toolbarOptions: toolbarOption[] = [
18
+ { name: 'separator' },
17
19
  { name: 'bold', icon: 'format_bold' },
18
20
  { name: 'italic', icon: 'format_italic' },
19
21
  { name: 'underline', icon: 'format_underlined' },
20
- { name: 'fontSize', icon: 'format_size' },
21
- { name: 'fontFamily', icon: 'font_download' },
22
- { name: 'textColor', icon: 'text_format' },
23
- { name: 'backgroundColor', icon: 'format_color_fill' },
24
- { name: 'alignLeft', icon: 'format_align_left' },
25
- { name: 'alignCenter', icon: 'format_align_center' },
26
- { name: 'alignRight', icon: 'format_align_right' },
27
- { name: 'alignJustify', icon: 'format_align_justify' },
22
+ { name: 'separator' },
28
23
  { name: 'orderedList', icon: 'format_list_numbered' },
29
24
  { name: 'unorderedList', icon: 'format_list_bulleted' },
30
- { name: 'indent', icon: 'format_indent_increase' },
31
- { name: 'outdent', icon: 'format_indent_decrease' },
32
- { name: 'link', icon: 'link' },
33
- { name: 'image', icon: 'image' },
34
- { name: 'table', icon: 'table_chart' },
35
- { name: 'blockquote', icon: 'format_quote' },
36
- { name: 'codeBlock', icon: 'code' },
37
- { name: 'splitView', icon: 'splitscreen_right' },
38
- { name: 'codeView', icon: 'code' },
25
+ { name: 'separator' },
26
+ { name: 'link', icon: 'add_link' },
27
+ { name: 'image', icon: 'add_photo_alternate' },
28
+ { name: 'youtube', icon: 'youtube_activity' },
29
+ { name: 'separator' },
30
+ { name: 'splitView', icon: 'code' },
31
+ { name: 'clear', icon: 'format_clear' },
32
+
39
33
  ]
40
34
 
41
35
  function handleColorPick(type: 'textColor' | 'backgroundColor') {
@@ -51,57 +45,40 @@ function handleFontSizeChange() {
51
45
  emit('action', 'fontSize', size)
52
46
  }
53
47
  }
48
+ function handleSelectChange(selectedOption: string) {
49
+ emit('action', 'formatBlock', selectedOption)
50
+ }
54
51
  </script>
55
52
 
56
53
  <template>
57
- <div class="toolbar" role="toolbar">
58
- <Btn
59
- v-for="action in toolbarOptions.filter(t => config.includes(t.name))"
60
- :key="action.name"
61
- v-tooltip="action.name"
62
- thin
63
- color="light"
64
- :aria-label="action.name"
65
- :icon="action.icon"
66
- @click="emit('action', action.name)"
54
+ <div class="toolbar flex gap-025 pb-05 flex-wrap" role="toolbar">
55
+ <SelectInput
56
+ class="m-0 w150"
57
+ :options="['Text', 'Heading 1', 'Heading 2', 'Heading 3', 'Heading 4', 'Heading 5', 'Heading 6', 'Blockquote', 'Code']"
58
+ @change="handleSelectChange"
67
59
  />
68
- <input
69
- v-if="config.includes('textColor') || config.includes('backgroundColor')"
70
- ref="colorPicker"
71
- type="color"
72
- @change="handleColorPick(config.includes('textColor') ? 'textColor' : 'backgroundColor')"
73
- >
74
- <input
75
- v-if="config.includes('fontSize')"
76
- ref="fontSizeInput"
77
- type="number"
78
- min="1"
79
- max="7"
80
- @change="handleFontSizeChange"
81
- >
60
+
61
+ <template v-for="(action, index) in toolbarOptions">
62
+ <Btn
63
+ v-if="action.name !== 'separator' && config.includes(action.name)"
64
+ :key="action.name"
65
+ v-tooltip="action.name"
66
+ thin
67
+ flat
68
+ class="rounded"
69
+ :aria-label="action.name"
70
+ :icon="action.icon"
71
+ @click="emit('action', action.name)"
72
+ />
73
+ <span
74
+ v-if="action.name === 'separator'"
75
+ :key="`separator-${index}`"
76
+ class=" opacity-2 mb-025"
77
+ >|</span>
78
+ </template>
82
79
  </div>
83
80
  </template>
84
81
 
85
82
  <style scoped>
86
- .toolbar {
87
- display: flex;
88
- flex-wrap: wrap;
89
- gap: 5px;
90
- padding: 10px;
91
- background-color: #f0f0f0;
92
- border-bottom: 1px solid #ccc;
93
- }
94
83
 
95
- button:hover {
96
- background-color: #e0e0e0;
97
- }
98
-
99
- input[type="color"],
100
- input[type="number"] {
101
- width: 40px;
102
- height: 30px;
103
- padding: 0;
104
- border: 1px solid #ccc;
105
- border-radius: 3px;
106
- }
107
84
  </style>
@@ -30,7 +30,9 @@ const defaultConfig: ToolbarConfig = [
30
30
  'blockquote',
31
31
  'codeBlock',
32
32
  'splitView',
33
- 'codeView'
33
+ 'youtube',
34
+ 'codeView',
35
+ 'clear',
34
36
  ]
35
37
  const config = $ref<ToolbarConfig>(props.toolbarConfig || defaultConfig)
36
38
  let contentHtml = $ref(props.modelValue)
@@ -121,15 +123,16 @@ function handleKeyDown(event: KeyboardEvent) {
121
123
  </script>
122
124
 
123
125
  <template>
124
- <div class="rich-text-editor">
126
+ <div class="rich-text-editor round pt-05 px-1 pb-1">
125
127
  <Toolbar :config @action="handleToolbarAction" />
126
- <div class="editor-container" :class="{ 'split-view': isSplitView }">
127
- <div class="content-area" :class="{ 'code-view': isCodeView }">
128
+ <div class="editor-container flex flex-stretch" :class="{ 'split-view': isSplitView }">
129
+ <div class="content-area rounded p-1 bg-white shadow-light w-100 grid" :class="{ 'code-view': isCodeView }">
128
130
  <textarea v-if="isCodeView" v-model="contentHtml" @input="updateContent" />
129
131
  <div
130
132
  v-else
131
133
  ref="editableContent"
132
134
  contenteditable="true"
135
+ class="editableContent"
133
136
  role="textbox"
134
137
  aria-multiline="true"
135
138
  tabindex="0"
@@ -137,25 +140,40 @@ function handleKeyDown(event: KeyboardEvent) {
137
140
  @keydown="handleKeyDown"
138
141
  />
139
142
  </div>
140
- <div v-if="isSplitView" class="preview-area" v-html="contentHtml" />
143
+ <code v-if="isSplitView" class="preview-area bg-black color-white w-100 rounded p-1">{{ contentHtml }}</code>
141
144
  </div>
142
145
  </div>
143
146
  </template>
144
147
 
145
148
  <style scoped>
146
149
  .rich-text-editor {
147
- font-family: Arial, sans-serif;
148
- max-width: 800px;
149
- margin: 0 auto;
150
+ background: var(--input-bg);
151
+ margin-bottom: 0.5rem;
152
+ width: 100%;
153
+ /* font-family: Arial, sans-serif; */
154
+ /* max-width: 800px; */
155
+ /* margin: 0 auto; */
150
156
  }
151
-
152
- [contenteditable='true'] {
153
- white-space: pre-wrap;
154
- word-wrap: break-word;
157
+ .editableContent{
158
+ min-height: 100%;
159
+ white-space: pre-wrap;
160
+ outline: none;
161
+ }
162
+ /* [contenteditable='true'] {
163
+ white-space: pre-wrap;
164
+ word-wrap: break-word;
155
165
  outline: none;
156
- border: none;
157
166
  height: 100%;
167
+ } */
168
+ .content-area{
169
+ }
170
+ .content-area, .preview-area{
171
+ min-height: 200px;
172
+
158
173
  }
174
+ .preview-area{}
175
+
176
+ /*
159
177
 
160
178
  .editor-container {
161
179
  display: flex;
@@ -184,9 +202,9 @@ function handleKeyDown(event: KeyboardEvent) {
184
202
  .preview-area {
185
203
  background-color: #f9f9f9;
186
204
  border-left: 1px solid #ccc;
187
- }
205
+ } */
188
206
 
189
- @media (max-width: 768px) {
207
+ /* @media (max-width: 768px) {
190
208
  .split-view {
191
209
  flex-direction: column;
192
210
  }
@@ -200,5 +218,5 @@ function handleKeyDown(event: KeyboardEvent) {
200
218
  border-left: none;
201
219
  border-top: 1px solid #ccc;
202
220
  }
203
- }
221
+ } */
204
222
  </style>
@@ -203,9 +203,10 @@ onMounted(() => {
203
203
 
204
204
  <div v-if="clearable && selectedItemCount > 0" class="ms-auto ps-05 me-05">
205
205
  <Btn
206
+ flat
206
207
  thin
207
208
  icon="clear"
208
- class="color-primary bg-gray-20"
209
+ class="color-gray"
209
210
  @click="selectedItems = []; emitUpdate()"
210
211
  />
211
212
  </div>
@@ -238,7 +239,7 @@ onMounted(() => {
238
239
  placeholder="Search"
239
240
  icon="search"
240
241
  />
241
- <div class="selectinput-options">
242
+ <div class="selectinput-options" :class="{ multiselect }">
242
243
  <div
243
244
  v-for="(option, i) in filteredOptions"
244
245
  :key="`${option}${i}`"
@@ -250,12 +251,14 @@ onMounted(() => {
250
251
  @click="select(option)"
251
252
  @keydown.enter="select(option)"
252
253
  >
253
- <Icon v-if="isSelected(option)" icon="check" />
254
- <Icon
255
- v-if="!isSelected(option)"
256
- class="opacity-3"
257
- icon="fiber_manual_record"
258
- />
254
+ <template v-if="multiselect">
255
+ <Icon v-if="isSelected(option)" icon="select_check_box" />
256
+ <Icon
257
+ v-if="!isSelected(option)"
258
+ class="opacity-3"
259
+ icon="check_box_outline_blank"
260
+ />
261
+ </template>
259
262
  <span>
260
263
  {{ getLabel(option) }}
261
264
  </span>
@@ -278,10 +281,15 @@ onMounted(() => {
278
281
  border-radius: 5px;
279
282
  transition: all 0.2s;
280
283
  display: grid;
281
- grid-template-columns: 10px 1fr;
284
+ grid-template-columns:1fr;
282
285
  justify-content: space-between;
283
286
  width: 100%;
284
287
  font-size: var(--input-font-size);
288
+ margin-block: 0.15rem;
289
+ }
290
+ .selectinput-options.multiselect .selectinput-option {
291
+ grid-template-columns: 10px 1fr;
292
+
285
293
  }
286
294
 
287
295
  .selectinput-options {
@@ -295,6 +303,9 @@ onMounted(() => {
295
303
  .isEmpty p {
296
304
  opacity: 0.3;
297
305
  }
306
+ .selected{
307
+ background: var(--input-bg);
308
+ }
298
309
  </style>
299
310
 
300
311
  <style>
package/src/index.ts CHANGED
@@ -12,4 +12,5 @@ export * from './types'
12
12
  export * from './composables'
13
13
  export * from './components'
14
14
  export * from './utils/allCountries'
15
+ export * from './utils/constants'
15
16
  import './styles/bagel.css'