@bagelink/vue 0.0.986 → 0.0.992

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 (75) hide show
  1. package/dist/components/Btn.vue.d.ts.map +1 -1
  2. package/dist/components/Loading.vue.d.ts +16 -0
  3. package/dist/components/Loading.vue.d.ts.map +1 -0
  4. package/dist/components/form/BglField.vue.d.ts.map +1 -1
  5. package/dist/components/form/inputs/CodeEditor/CodeTypes.d.ts +197 -0
  6. package/dist/components/form/inputs/CodeEditor/CodeTypes.d.ts.map +1 -0
  7. package/dist/components/form/inputs/CodeEditor/Index.vue.d.ts +15 -0
  8. package/dist/components/form/inputs/CodeEditor/Index.vue.d.ts.map +1 -0
  9. package/dist/components/form/inputs/CodeEditor/format.d.ts +2 -0
  10. package/dist/components/form/inputs/CodeEditor/format.d.ts.map +1 -0
  11. package/dist/components/form/inputs/FileUpload.vue.d.ts.map +1 -1
  12. package/dist/components/form/inputs/RichText/Toolbar.vue.d.ts +5 -3
  13. package/dist/components/form/inputs/RichText/Toolbar.vue.d.ts.map +1 -1
  14. package/dist/components/form/inputs/RichText/components/Toolbar.vue.d.ts +14 -0
  15. package/dist/components/form/inputs/RichText/components/Toolbar.vue.d.ts.map +1 -0
  16. package/dist/components/form/inputs/RichText/components/gridBox.vue.d.ts +7 -0
  17. package/dist/components/form/inputs/RichText/components/gridBox.vue.d.ts.map +1 -0
  18. package/dist/components/form/inputs/RichText/composables/useEditor.d.ts +86 -0
  19. package/dist/components/form/inputs/RichText/composables/useEditor.d.ts.map +1 -0
  20. package/dist/components/form/inputs/RichText/composables/useEditorKeyboard.d.ts +2 -0
  21. package/dist/components/form/inputs/RichText/composables/useEditorKeyboard.d.ts.map +1 -0
  22. package/dist/components/form/inputs/RichText/config.d.ts +5 -0
  23. package/dist/components/form/inputs/RichText/config.d.ts.map +1 -0
  24. package/dist/components/form/inputs/RichText/index.vue.d.ts +1 -1
  25. package/dist/components/form/inputs/RichText/index.vue.d.ts.map +1 -1
  26. package/dist/components/form/inputs/RichText/utils/formatting.d.ts +7 -0
  27. package/dist/components/form/inputs/RichText/utils/formatting.d.ts.map +1 -0
  28. package/dist/components/form/inputs/RichText/utils/media.d.ts +4 -0
  29. package/dist/components/form/inputs/RichText/utils/media.d.ts.map +1 -0
  30. package/dist/components/form/inputs/RichText/utils/selection.d.ts +4 -0
  31. package/dist/components/form/inputs/RichText/utils/selection.d.ts.map +1 -0
  32. package/dist/components/form/inputs/RichText/utils/table.d.ts +7 -0
  33. package/dist/components/form/inputs/RichText/utils/table.d.ts.map +1 -0
  34. package/dist/components/form/inputs/index.d.ts +1 -0
  35. package/dist/components/form/inputs/index.d.ts.map +1 -1
  36. package/dist/components/index.d.ts +1 -0
  37. package/dist/components/index.d.ts.map +1 -1
  38. package/dist/components/layout/TabsNav.vue.d.ts.map +1 -1
  39. package/dist/editor-CUDRLdmS.js +4 -0
  40. package/dist/editor-Cu374vEW.cjs +4 -0
  41. package/dist/editor-a8DSbb6P.js +4 -0
  42. package/dist/editor-xBt_vIha.cjs +4 -0
  43. package/dist/index.cjs +15594 -1103
  44. package/dist/index.mjs +15595 -1104
  45. package/dist/style.css +790 -511
  46. package/package.json +6 -33
  47. package/src/components/Btn.vue +113 -136
  48. package/src/components/Loading.vue +177 -0
  49. package/src/components/form/BglField.vue +2 -0
  50. package/src/components/form/inputs/CodeEditor/CodeTypes.ts +446 -0
  51. package/src/components/form/inputs/CodeEditor/Index.vue +117 -0
  52. package/src/components/form/inputs/CodeEditor/format.ts +98 -0
  53. package/src/components/form/inputs/FileUpload.vue +2 -1
  54. package/src/components/form/inputs/RichText/components/Toolbar.vue +51 -0
  55. package/src/components/form/inputs/RichText/components/gridBox.vue +51 -0
  56. package/src/components/form/inputs/RichText/composables/useEditor.ts +215 -0
  57. package/src/components/form/inputs/RichText/composables/useEditorKeyboard.ts +21 -0
  58. package/src/components/form/inputs/RichText/config.ts +73 -0
  59. package/src/components/form/inputs/RichText/editor.css +25 -0
  60. package/src/components/form/inputs/RichText/index.vue +84 -195
  61. package/src/components/form/inputs/RichText/richTextTypes.d.ts +77 -0
  62. package/src/components/form/inputs/RichText/utils/formatting.ts +98 -0
  63. package/src/components/form/inputs/RichText/utils/media.ts +42 -0
  64. package/src/components/form/inputs/RichText/utils/selection.ts +48 -0
  65. package/src/components/form/inputs/RichText/utils/table.ts +81 -0
  66. package/src/components/form/inputs/index.ts +1 -0
  67. package/src/components/index.ts +2 -2
  68. package/src/components/layout/TabsNav.vue +1 -0
  69. package/src/styles/theme.css +256 -256
  70. package/src/components/form/inputs/RichText/Toolbar.vue +0 -87
  71. package/src/components/form/inputs/RichText/formatting.ts +0 -246
  72. package/src/components/form/inputs/RichText/richtext-types.ts +0 -29
  73. package/src/components/formkit/FileUploader.vue +0 -406
  74. package/src/components/formkit/MiscFields.vue +0 -74
  75. package/src/components/formkit/Toggle.vue +0 -149
@@ -1,406 +0,0 @@
1
- <script setup lang="ts">
2
- interface UploadFile {
3
- dataUrl: string
4
- progress: number
5
- uploading: boolean
6
- file?: File
7
- name: string
8
- serverFile?: any
9
- uploaded: boolean
10
- }
11
-
12
- import { Btn, Icon, useBagel } from '@bagelink/vue'
13
-
14
- import { onMounted, onUnmounted } from 'vue'
15
-
16
- const props = withDefaults(
17
- defineProps<{
18
- context: { [key: string]: any }
19
- dragDropLabel?: string
20
- browseLabel?: string
21
- multiple?: boolean
22
- }>(),
23
- {
24
- dragDropLabel: 'Drag and drop your files here',
25
- browseLabel: 'or browse',
26
- multiple: false,
27
- },
28
- )
29
-
30
- const bagel = useBagel()
31
-
32
- let draggingOver = $ref(false)
33
- const dropCircle = $ref<HTMLElement>()
34
- const dropZoneEl = $ref<HTMLElement>()
35
- const fileInputEl = $ref<HTMLInputElement>()
36
-
37
- const files = $ref<UploadFile[]>([])
38
-
39
- const computedDragDropLabel = $computed(() => props.context.attrs?.dragDropLabel || props.dragDropLabel)
40
- const computedDrowseLabel = $computed(() => props.context.attrs?.browseLabel || props.browseLabel)
41
- const computedMultiple = $computed(() => !!(props.context.attrs?.multiple || props.multiple))
42
-
43
- const allowUpload = $computed(() => {
44
- const tooManyFiles = !computedMultiple && files.length > 0
45
- return !tooManyFiles
46
- })
47
-
48
- const openFileDialog = () => (allowUpload ? fileInputEl?.click() : '')
49
-
50
- function animateCircle(e: DragEvent) {
51
- e.preventDefault()
52
- const zoneRect = dropZoneEl?.getBoundingClientRect()
53
- if (!zoneRect) return
54
- draggingOver = true
55
- const left = e.clientX - zoneRect.left
56
- const top = e.clientY - zoneRect.top
57
- dropCircle?.style.setProperty('left', `${left}px`)
58
- dropCircle?.style.setProperty('top', `${top}px`)
59
- }
60
-
61
- function emitValue() {
62
- // const fileValues = files.map((f) => f.serverFile?.id);
63
- const relationshipObjKey = props.context.attrs?.relationshipObjKey
64
- if (!computedMultiple) return props.context.node.input(relationshipObjKey ? files[0].serverFile.id : files[0].serverFile)
65
-
66
- alert('not implemented')
67
- }
68
-
69
- function isImg(file: UploadFile) {
70
- return file.file?.type.includes('image')
71
- || file.serverFile?.mimetype?.match(/image\/|jpg|png|gif|bmp|jpeg/i)
72
- || file.serverFile.extension?.match(/jpg|png|gif|bmp|jpeg/i)
73
- }
74
-
75
- function uploadFiles() {
76
- files.forEach(async (file) => {
77
- if (file.uploaded || file.uploading || !file.file) return
78
- file.uploading = true
79
- file.serverFile = await bagel.uploadFile(file.file, {
80
- onUploadProgress: (e: any) => (file.progress = e.progress * 100 - 1),
81
- })
82
- file.progress += 1
83
- emitValue()
84
- file.uploaded = true
85
- file.uploading = false
86
- })
87
- }
88
-
89
- async function deleteImg(file: UploadFile) {
90
- await bagel.delete(`files/${file.serverFile.id}`)
91
- const index = files.indexOf(file)
92
- files.splice(index, 1)
93
- emitValue()
94
- }
95
-
96
- function readAsDataURL(file: File): Promise<any> {
97
- return new Promise((resolve, reject) => {
98
- const reader = new FileReader()
99
- reader.onload = () => { resolve(reader.result) }
100
- reader.onerror = reject
101
- reader.readAsDataURL(file)
102
- })
103
- }
104
-
105
- async function addFiles(addedFiles: FileList) {
106
- if (!allowUpload) return
107
- for (let i = 0; i < addedFiles.length; i++) {
108
- const f = addedFiles[i]
109
- const file: UploadFile = {
110
- // eslint-disable-next-line no-await-in-loop
111
- dataUrl: await readAsDataURL(f),
112
- file: f,
113
- name: f.name,
114
- progress: 0,
115
- uploading: false,
116
- uploaded: false,
117
- }
118
- files.push(file)
119
- }
120
- uploadFiles()
121
- }
122
-
123
- onMounted(() => {
124
- dropZoneEl?.addEventListener('dragover', animateCircle)
125
- const relationshipObjKey = props.context.attrs?.relationshipObjKey
126
- const imageObj = relationshipObjKey ? props.context.node?.parent?.value[relationshipObjKey] : props.context.node?.value
127
- if (!computedMultiple && imageObj) {
128
- files.push({
129
- serverFile: imageObj,
130
- uploaded: true,
131
- uploading: false,
132
- progress: 100,
133
- dataUrl: imageObj?.url,
134
- name: imageObj?.name,
135
- })
136
- }
137
- })
138
- onUnmounted(() => dropZoneEl?.removeEventListener('dragover', animateCircle))
139
-
140
- function handleFileInput(e: Event) {
141
- const filesToAdd: FileList = (e.target as any).files
142
- void addFiles(filesToAdd) // TODO: Nati: should be awaited?
143
- }
144
-
145
- function onDrop(e: DragEvent) {
146
- draggingOver = false
147
- e.preventDefault()
148
- const filesToAdd = e.dataTransfer?.files
149
- if (filesToAdd) void addFiles(filesToAdd) // TODO: Nati: should be awaited?
150
- }
151
- </script>
152
-
153
- <template>
154
- <div class="files-wrapper flex">
155
- <div
156
- ref="dropZoneEl"
157
- class="drop-zone flex-grow"
158
- @click="openFileDialog"
159
- @drop.prevent.stop="onDrop"
160
- @dragleave="draggingOver = false"
161
- >
162
- <Transition name="pop">
163
- <div
164
- v-if="draggingOver"
165
- ref="dropCircle"
166
- class="drop-circle"
167
- />
168
- </Transition>
169
- <div
170
- v-if="allowUpload"
171
- class="img-label"
172
- >
173
- <p>
174
- {{ computedDragDropLabel }} <span>{{ computedDrowseLabel }}</span>
175
- </p>
176
- </div>
177
- <div class="uploading-wrap">
178
- <div
179
- v-for="(item, index) in files"
180
- :key="index"
181
- :class="{ uploading: item.uploading }"
182
- >
183
- <div class="load-file-bar">
184
- <!-- Preview File if image -->
185
- <img
186
- v-if="isImg(item)"
187
- width="40"
188
- :src="item.dataUrl"
189
- :alt="item.name"
190
- style="margin-inline-end: 10px"
191
- >
192
- <p>
193
- {{ item.name }}
194
- </p>
195
- <div class="flex">
196
- <div
197
- class="pie"
198
- :style="`--p:${item.progress}`"
199
- style="--b: 2px"
200
- :class="{ complete: item.progress === 100 }"
201
- >
202
- <span
203
- v-if="item.progress < 100"
204
- class="progress"
205
- >{{
206
- `${item.progress.toFixed(0)}`
207
- }}</span>
208
- <Icon
209
- class="success"
210
- icon="check"
211
- />
212
- </div>
213
- <Btn
214
- v-if="item.progress === 100"
215
- thin
216
- class="delete-btn"
217
- icon="delete"
218
- @click.stop="deleteImg(item)"
219
- />
220
- </div>
221
- </div>
222
- </div>
223
- </div>
224
- </div>
225
- <input
226
- ref="fileInputEl"
227
- class="file-input"
228
- type="file"
229
- :multiple="computedMultiple"
230
- @change="handleFileInput"
231
- >
232
- </div>
233
- </template>
234
-
235
- <style>
236
- .uploading-wrap {
237
- width: 100%;
238
- padding-right: 5px;
239
- padding-left: 5px;
240
- }
241
-
242
- /*
243
- .uploading {}
244
- */
245
-
246
- .img-label .bgl_icon-font {
247
- font-size: 30px;
248
- margin-bottom: 10px;
249
- }
250
-
251
- .img-label span {
252
- text-decoration: underline;
253
- }
254
-
255
- .file-input {
256
- display: none;
257
- }
258
-
259
- .files-wrapper {
260
- flex-direction: column;
261
- border-radius: 10px;
262
- /*overflow: hidden;*/
263
- min-height: calc(var(--input-height) * 1.5);
264
-
265
- font-size: var(--input-font-size);
266
- }
267
-
268
- .drop-zone {
269
- background-color: var(--input-bg);
270
- height: 100%;
271
- width: 100%;
272
- flex-grow: 1;
273
- position: relative;
274
- overflow: hidden;
275
- cursor: pointer;
276
- transition: var(--bgl-transition);
277
- outline: dashed 1px var(--border-color);
278
- border-radius: 10px;
279
- padding: 1px;
280
- display: flex;
281
- flex-direction: column;
282
- align-items: center;
283
- justify-content: center;
284
- color: var(--input-color);
285
- }
286
-
287
- .drop-zone:hover {
288
- color: var(--bgl-primary);
289
- outline: dashed 1px var(--bgl-primary-tint);
290
- }
291
-
292
- .drop-circle {
293
- pointer-events: none;
294
- position: absolute;
295
- width: 100px;
296
- height: 100px;
297
- border-radius: 50%;
298
- background-color: var(--bgl-primary-tint);
299
- display: flex;
300
- transform: translate(-50%, -50%) scale(1);
301
- transform-origin: left top;
302
- }
303
-
304
- .load-file-bar {
305
- display: flex;
306
- align-items: center;
307
- justify-content: space-between;
308
- background: var(--bgl-box-bg);
309
- border-radius: var(--btn-border-radius);
310
- width: 100%;
311
- color: var(--input-color);
312
- height: var(--btn-height);
313
- padding: 0.5rem;
314
- height: 46px;
315
- box-shadow: 0 1px 2px 0 rgb(0 0 0 / 10%);
316
- white-space: nowrap;
317
- }
318
-
319
- .load-file-bar p {
320
- width: calc(100% - 40px);
321
- overflow: hidden;
322
- text-overflow: ellipsis;
323
- }
324
-
325
- .load-file-bar span {
326
- font-size: 10px;
327
- }
328
-
329
- .pie {
330
- width: 30px;
331
- height: 30px;
332
- position: relative;
333
- display: flex;
334
- align-items: center;
335
- justify-content: center;
336
- }
337
-
338
- .pie:before {
339
- content: "";
340
- position: absolute;
341
- border-radius: 50%;
342
- inset: 0;
343
- transition: all 0.2s ease-in-out;
344
- background: conic-gradient(var(--bgl-primary) calc(var(--p) * 1%), #0000 0);
345
- -webkit-mask: radial-gradient(farthest-side,
346
- #0000 calc(99% - var(--b)),
347
- #000 calc(100% - var(--b)));
348
- mask: radial-gradient(farthest-side,
349
- #0000 calc(99% - var(--b)),
350
- #000 calc(100% - var(--b)));
351
- }
352
-
353
- .pie .success {
354
- transform: scale(0);
355
- opacity: 0;
356
- transition: all 0.3s ease-in-out;
357
- }
358
-
359
- .pie .progress {
360
- position: absolute;
361
- font-size: 10px;
362
- }
363
-
364
- .pie.complete .progress {
365
- display: none;
366
- }
367
-
368
- .pie.complete .success {
369
- transform: scale(1.3);
370
- opacity: 1;
371
- }
372
-
373
- .pie.complete:before {
374
- background: conic-gradient(var(--bgl-green) calc(var(--p) * 1%), #0000 0);
375
- }
376
-
377
- .pie.complete {
378
- color: var(--bgl-green);
379
- }
380
- </style>
381
-
382
- <style>
383
- .pop-enter-active {
384
- transition: scale 0.2s cubic-bezier(0.55, 0, 0.1, 1);
385
- }
386
-
387
- .pop-leave-active {
388
- transition: scale 0.2s cubic-bezier(0.55, 0, 0.1, 1);
389
- }
390
-
391
- .pop-enter-from,
392
- .pop-leave-to {
393
- scale: 0;
394
- }
395
-
396
- .delete-btn {
397
- margin-inline-end: -30px;
398
- opacity: 0;
399
- margin-inline-start: 10px;
400
- }
401
-
402
- .uploading-wrap:hover .delete-btn {
403
- opacity: 1;
404
- margin-inline-end: 0;
405
- }
406
- </style>
@@ -1,74 +0,0 @@
1
- <script lang="ts" setup>
2
- import { Btn } from '@bagelink/vue'
3
-
4
- const props = defineProps<{
5
- context: { [key: string]: any }
6
- addBtnLabel: string
7
- }>()
8
-
9
- const fields = $computed(() => props.context.node?.parent?.children || [])
10
-
11
- function addToField(field: any) {
12
- field.input([{}])
13
- console.log(fields)
14
- }
15
- </script>
16
-
17
- <template>
18
- <div class="misc-wrap">
19
- <Btn
20
- v-for="(field, i) in fields.filter(
21
- (field: any) => field.value?.length === 0,
22
- )"
23
- :key="i"
24
- class="add-btn"
25
- color="gray"
26
- flat
27
- thin
28
- @click="addToField(field)"
29
- >
30
- {{ addBtnLabel }} {{ field.context?.label }}
31
- </Btn>
32
- </div>
33
- </template>
34
-
35
- <style scoped>
36
- .misc-wrap {
37
- display: flex;
38
- gap: 1rem;
39
- border-top: 1px solid var(--border-color);
40
- padding-top: 0.5rem;
41
- margin-bottom: auto;
42
- }
43
-
44
- .gray.thin.bgl_flatBtn.bgl_btn.add-btn {
45
- display: flex;
46
- gap: 0.5rem;
47
- align-items: center;
48
- padding-left: 0;
49
- padding-right: 0;
50
- transition: var(--bgl-transition);
51
- }
52
-
53
- .add-btn:active {
54
- background: none !important;
55
- }
56
-
57
- .add-btn::before {
58
- content: "+";
59
- font-size: 10px;
60
- background: var(--bgl-gray-light);
61
- border-radius: 100%;
62
- height: 14px;
63
- width: 14px;
64
- display: flex;
65
- align-items: center;
66
- justify-content: center;
67
- color: var(--bgl-gray);
68
- }
69
-
70
- .add-btn:hover::before {
71
- background: var(--bgl-primary);
72
- color: var(--bgl-light-text);
73
- }
74
- </style>
@@ -1,149 +0,0 @@
1
- <script setup lang="ts">
2
- defineProps<{
3
- helpText?: string
4
- id: string
5
- label?: string
6
- }>()
7
- const inputVal = defineModel('modelValue', {
8
- type: Boolean,
9
- default: false,
10
- })
11
- </script>
12
-
13
- <template>
14
- <div class="bagel-input checkbox" :title="label">
15
- <label class="switch">
16
- <input :id="id" v-model="inputVal" type="checkbox">
17
- <span class="slider rounded" />
18
- </label>
19
- </div>
20
- </template>
21
-
22
- <style>
23
- .checkbox-label {
24
- display: flex;
25
- gap: 0.5rem;
26
- flex-direction: row-reverse;
27
- justify-content: flex-end;
28
- align-items: center;
29
- cursor: pointer;
30
- }
31
- </style>
32
-
33
- <style scoped>
34
- .no-edit {
35
- pointer-events: none;
36
- }
37
-
38
- .radio-wrap p {
39
- display: inline-block;
40
- color: var(--input-bg);
41
- font-size: var(--input-font-size);
42
- margin-inline-end: 10px;
43
- }
44
-
45
- .radio-wrap label {
46
- padding: 3px 5px;
47
- display: inline-block;
48
- border-radius: var(--input-border-radius);
49
- font-size: var(--input-font-size);
50
- background: var(--input-bg);
51
- color: var(--bgl-text-color);
52
- text-align: center;
53
- margin: 8px 5px;
54
- cursor: pointer;
55
- user-select: none;
56
- }
57
-
58
- .bagel-input .radio-wrap label::after {
59
- background: transparent;
60
- }
61
-
62
- .radio-wrap input {
63
- display: none;
64
- }
65
-
66
- .radio-wrap input:checked:checked+label {
67
- background: var(--bgl-primary);
68
- color: var( --bgl-light-text);
69
- }
70
-
71
- .checkbox {
72
- position: relative;
73
- }
74
-
75
- .switch {
76
- position: relative;
77
- display: inline-block;
78
- height: calc(var(--input-height) / 2);
79
- width: var(--input-height);
80
- border-radius: var(--input-height);
81
- }
82
-
83
- .switch input {
84
- opacity: 0;
85
- width: 0;
86
- height: 0;
87
- }
88
-
89
- .bagel-input.checkbox.check {
90
- margin: 0;
91
- }
92
-
93
- .bagel-input.checkbox.check .switch {
94
- width: calc(var(--input-height) / 2);
95
- height: calc(var(--input-height) / 2);
96
- transition: 0.2s;
97
- }
98
-
99
- .bagel-input.checkbox.check .slider:before {
100
- position: absolute;
101
- font-family: "Material Symbols Outlined", serif;
102
- content: "";
103
- color: var( --bgl-light-text);
104
- background: transparent;
105
- display: flex;
106
- align-items: center;
107
- justify-content: center;
108
- }
109
-
110
- .bagel-input.checkbox.check input:checked+.slider:before {
111
- transform: none;
112
- content: "check";
113
- }
114
-
115
- .slider {
116
- position: absolute;
117
- cursor: pointer;
118
- top: 0;
119
- left: 0;
120
- right: 0;
121
- bottom: 0;
122
- background: var(--input-bg);
123
- -webkit-transition: 0.4s;
124
- transition: 0.4s;
125
- border-radius: calc(var(--input-height) / 2);
126
- box-shadow: inset 0 0 10px #00000020;
127
- }
128
-
129
- .slider:before {
130
- position: absolute;
131
- content: "";
132
- height: calc(var(--input-height) / 2 - 4px);
133
- width: calc(var(--input-height) / 2 - 4px);
134
- left: 2px;
135
- bottom: 2px;
136
- border-radius: 50%;
137
- background: var(--bgl-popup-bg);
138
- -webkit-transition: 0.4s;
139
- transition: 0.4s;
140
- }
141
-
142
- input:checked+.slider {
143
- background: var(--bgl-primary);
144
- }
145
-
146
- input:checked+.slider:before {
147
- transform: translateX(calc(var(--input-height) / 2));
148
- }
149
- </style>