@bagelink/vue 0.0.988 → 0.0.996

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 (56) 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/Index.vue.d.ts +6 -55
  6. package/dist/components/form/inputs/CodeEditor/Index.vue.d.ts.map +1 -1
  7. package/dist/components/form/inputs/FileUpload.vue.d.ts.map +1 -1
  8. package/dist/components/form/inputs/RichText/components/Toolbar.vue.d.ts.map +1 -1
  9. package/dist/components/form/inputs/RichText/components/gridBox.vue.d.ts +3 -7
  10. package/dist/components/form/inputs/RichText/components/gridBox.vue.d.ts.map +1 -1
  11. package/dist/components/form/inputs/RichText/composables/useEditor.d.ts.map +1 -1
  12. package/dist/components/form/inputs/RichText/config.d.ts.map +1 -1
  13. package/dist/components/form/inputs/RichText/index.vue.d.ts.map +1 -1
  14. package/dist/components/form/inputs/RichText/utils/formatting.d.ts +1 -0
  15. package/dist/components/form/inputs/RichText/utils/formatting.d.ts.map +1 -1
  16. package/dist/components/form/inputs/RichText/utils/media.d.ts +3 -3
  17. package/dist/components/form/inputs/RichText/utils/media.d.ts.map +1 -1
  18. package/dist/components/form/inputs/RichText/utils/selection.d.ts.map +1 -1
  19. package/dist/components/form/inputs/RichText/utils/table.d.ts +2 -1
  20. package/dist/components/form/inputs/RichText/utils/table.d.ts.map +1 -1
  21. package/dist/components/index.d.ts +1 -0
  22. package/dist/components/index.d.ts.map +1 -1
  23. package/dist/components/layout/TabsNav.vue.d.ts.map +1 -1
  24. package/dist/editor-a8DSbb6P.js +4 -0
  25. package/dist/editor-xBt_vIha.cjs +4 -0
  26. package/dist/index.cjs +10525 -48629
  27. package/dist/index.mjs +10526 -48630
  28. package/dist/style.css +818 -20219
  29. package/package.json +6 -33
  30. package/src/components/Btn.vue +110 -136
  31. package/src/components/Loading.vue +177 -0
  32. package/src/components/form/BglField.vue +2 -0
  33. package/src/components/form/inputs/CodeEditor/Index.vue +88 -395
  34. package/src/components/form/inputs/CodeEditor/format.ts +2 -2
  35. package/src/components/form/inputs/FileUpload.vue +2 -1
  36. package/src/components/form/inputs/RichText/components/Toolbar.vue +1 -1
  37. package/src/components/form/inputs/RichText/components/gridBox.vue +37 -8
  38. package/src/components/form/inputs/RichText/composables/useEditor.ts +27 -7
  39. package/src/components/form/inputs/RichText/config.ts +6 -2
  40. package/src/components/form/inputs/RichText/editor.css +14 -14
  41. package/src/components/form/inputs/RichText/index.vue +12 -10
  42. package/src/components/form/inputs/RichText/richTextTypes.d.ts +2 -0
  43. package/src/components/form/inputs/RichText/utils/formatting.ts +281 -34
  44. package/src/components/form/inputs/RichText/utils/media.ts +9 -6
  45. package/src/components/form/inputs/RichText/utils/selection.ts +6 -22
  46. package/src/components/form/inputs/RichText/utils/table.ts +60 -58
  47. package/src/components/index.ts +2 -2
  48. package/src/components/layout/TabsNav.vue +1 -0
  49. package/src/styles/theme.css +256 -256
  50. package/src/components/form/inputs/CodeEditor/themes/brown-papersq.png +0 -0
  51. package/src/components/form/inputs/CodeEditor/themes/pojoaque.jpg +0 -0
  52. package/src/components/form/inputs/CodeEditor/themes/themes-base16.css +0 -12809
  53. package/src/components/form/inputs/CodeEditor/themes/themes.css +0 -6740
  54. package/src/components/formkit/FileUploader.vue +0 -406
  55. package/src/components/formkit/MiscFields.vue +0 -74
  56. 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>