@bagelink/vue 0.0.25 → 0.0.35

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 (82) hide show
  1. package/package.json +34 -9
  2. package/src/components/Btn.vue +221 -0
  3. package/src/components/Comments.vue +284 -0
  4. package/src/components/ContactArray.vue +142 -0
  5. package/src/components/ContactSubmissions.vue +45 -0
  6. package/src/components/DataPreview.vue +85 -0
  7. package/src/components/DropDown.vue +122 -0
  8. package/src/components/FileUploader.vue +353 -0
  9. package/src/components/FormKitTable.vue +299 -0
  10. package/src/components/FormSchema.vue +79 -0
  11. package/src/components/LangText.vue +32 -0
  12. package/src/components/ListItem.vue +20 -0
  13. package/src/components/ListView.vue +54 -0
  14. package/src/components/MaterialIcon.vue +19 -0
  15. package/src/components/Modal.vue +62 -0
  16. package/src/components/ModalForm.vue +109 -0
  17. package/src/components/NavBar.vue +353 -0
  18. package/src/components/PageTitle.vue +17 -0
  19. package/src/components/PersonPreview.vue +203 -0
  20. package/src/components/PersonPreviewFormkit.vue +205 -0
  21. package/src/components/RTXEditor.vue +151 -0
  22. package/src/components/RouterWrapper.vue +17 -0
  23. package/src/components/TabbedLayout.vue +83 -0
  24. package/src/components/TableSchema.vue +248 -0
  25. package/src/components/TopBar.vue +5 -0
  26. package/src/components/charts/BarChart.vue +316 -0
  27. package/src/components/dashboard/Lineart.vue +197 -0
  28. package/src/components/form/ItemRef.vue +45 -0
  29. package/src/components/form/MaterialIcon.vue +19 -0
  30. package/src/components/form/PlainInputField.vue +79 -0
  31. package/src/components/form/inputs/CheckInput.vue +143 -0
  32. package/src/components/form/inputs/Checkbox.vue +77 -0
  33. package/src/components/form/inputs/ColorPicker.vue +47 -0
  34. package/src/components/form/inputs/CurrencyInput.vue +137 -0
  35. package/src/components/form/inputs/DateInput.vue +55 -0
  36. package/src/components/form/inputs/DatetimeInput.vue +50 -0
  37. package/src/components/form/inputs/DurationInput.vue +55 -0
  38. package/src/components/form/inputs/DynamicLinkField.vue +142 -0
  39. package/src/components/form/inputs/EmailInput.vue +57 -0
  40. package/src/components/form/inputs/FloatInput.vue +52 -0
  41. package/src/components/form/inputs/IntInput.vue +53 -0
  42. package/src/components/form/inputs/JSONInput.vue +55 -0
  43. package/src/components/form/inputs/LinkField.vue +300 -0
  44. package/src/components/form/inputs/Password.vue +91 -0
  45. package/src/components/form/inputs/PasswordInput.vue +92 -0
  46. package/src/components/form/inputs/PlainText.vue +63 -0
  47. package/src/components/form/inputs/ReadOnlyInput.vue +28 -0
  48. package/src/components/form/inputs/RichTextEditor.vue +56 -0
  49. package/src/components/form/inputs/SelectField.vue +258 -0
  50. package/src/components/form/inputs/TableField.vue +319 -0
  51. package/src/components/form/inputs/TextArea.vue +79 -0
  52. package/src/components/form/inputs/TextInput.vue +63 -0
  53. package/src/components/form/inputs/index.ts +16 -0
  54. package/src/components/formkit/AddressArray.vue +240 -0
  55. package/src/components/formkit/BankDetailsArray.vue +265 -0
  56. package/src/components/formkit/ContactArrayFormKit.vue +192 -0
  57. package/src/components/formkit/FileUploader.vue +391 -0
  58. package/src/components/formkit/MiscFields.vue +74 -0
  59. package/src/components/formkit/Toggle.vue +164 -0
  60. package/src/components/formkit/index.ts +29 -0
  61. package/src/components/index.ts +20 -0
  62. package/src/components/whatsapp/form/MsgTemplate.vue +227 -0
  63. package/src/components/whatsapp/form/TextVariableExamples.vue +79 -0
  64. package/src/components/whatsapp/interfaces.ts +58 -0
  65. package/src/index.ts +1 -26
  66. package/src/plugins/bagel.ts +26 -0
  67. package/src/styles/modal.css +90 -0
  68. package/src/types/BagelField.ts +57 -0
  69. package/src/types/BtnOptions.ts +14 -0
  70. package/src/types/Person.ts +51 -0
  71. package/src/types/file.ts +12 -0
  72. package/src/types/index.ts +4 -0
  73. package/src/types/materialIcons.d.ts +3005 -0
  74. package/src/utils/index.ts +62 -0
  75. package/src/utils/modal.ts +101 -0
  76. package/src/utils/objects.ts +81 -0
  77. package/src/utils/strings.ts +36 -0
  78. package/dist/index.cjs +0 -23
  79. package/dist/index.d.cts +0 -12
  80. package/dist/index.d.mts +0 -12
  81. package/dist/index.d.ts +0 -12
  82. package/dist/index.mjs +0 -19
@@ -0,0 +1,63 @@
1
+ <template>
2
+ <div
3
+ class="bagel-input"
4
+ :class="{ small }"
5
+ :title="field.description"
6
+ v-if="field.id"
7
+ >
8
+ <label :for="field.id">
9
+ {{ field.label }}
10
+ <input
11
+ :id="field.id"
12
+ v-model="inputVal"
13
+ type="text"
14
+ :placeholder="field.placeholder || field.label"
15
+ :class="{ 'no-edit': !editMode }"
16
+ :required="required"
17
+ :pattern="pattern"
18
+ v-bind="nativeInputAttrs"
19
+ >
20
+ </label>
21
+ </div>
22
+ </template>
23
+
24
+ <script setup lang="ts">
25
+ import { watch } from 'vue';
26
+ import { BagelField } from '@/types/BagelField';
27
+
28
+ const emit = defineEmits(['update:modelValue']);
29
+ const props = withDefaults(
30
+ defineProps<{
31
+ field: BagelField;
32
+ modelValue: any;
33
+ editMode?: boolean;
34
+ small?: boolean;
35
+ required?: boolean;
36
+ pattern?: string;
37
+ nativeInputAttrs?: Record<string, any>;
38
+ }>(),
39
+ {
40
+ editMode: true,
41
+ },
42
+ );
43
+ let inputVal = $ref<string>();
44
+
45
+ watch(
46
+ () => inputVal,
47
+ (newVal) => emit('update:modelValue', newVal),
48
+ );
49
+
50
+ watch(
51
+ () => props.modelValue,
52
+ (newVal) => {
53
+ if (newVal !== inputVal) inputVal = newVal;
54
+ },
55
+ { immediate: true },
56
+ );
57
+ </script>
58
+
59
+ <style scoped>
60
+ .no-edit {
61
+ cursor: not-allowed;
62
+ }
63
+ </style>
@@ -0,0 +1,28 @@
1
+ <template>
2
+ <div
3
+ class="bagel-input"
4
+ :title="field.description"
5
+ :class="{ small: small }"
6
+ >
7
+ <label v-if="field.label">
8
+ {{ field.label }}
9
+ </label>
10
+ {{ modelValue }}
11
+ </div>
12
+ </template>
13
+
14
+ <script setup lang="ts">
15
+ import { BagelField } from '@/types/BagelField';
16
+
17
+ defineProps<{
18
+ field: BagelField;
19
+ modelValue: any;
20
+ small?: boolean;
21
+ }>();
22
+ </script>
23
+
24
+ <style scoped>
25
+ .no-edit {
26
+ margin-bottom: 2px;
27
+ }
28
+ </style>
@@ -0,0 +1,56 @@
1
+ <template>
2
+ <div
3
+ class="bagel-input"
4
+ :title="description"
5
+ :class="{ small: small }"
6
+ >
7
+ <label v-if="label">
8
+ <LangText :input="label" />
9
+ </label>
10
+ <textarea
11
+ :value="modelValue"
12
+ @input="handleInput"
13
+ :placeholder="placeholder"
14
+ :class="{ 'no-edit': !editMode }"
15
+ />
16
+ </div>
17
+ </template>
18
+
19
+ <script setup lang="ts">
20
+ const emits = defineEmits(['update:modelValue']);
21
+
22
+ // const props =
23
+ withDefaults(
24
+ defineProps<{
25
+ description?: string;
26
+ label?: string;
27
+ modelValue: any;
28
+ placeholder?: string;
29
+ editMode?: boolean;
30
+ small?: boolean;
31
+ }>(),
32
+ {
33
+ description: '',
34
+ editMode: true,
35
+ placeholder: '',
36
+ label: '',
37
+ },
38
+ );
39
+ const handleInput = (e: Event) => {
40
+ const el = e.target as HTMLInputElement;
41
+ emits('update:modelValue', el.value);
42
+ };
43
+ </script>
44
+
45
+ <style scoped>
46
+ .bagel-input {
47
+ height: 100%;
48
+ margin: 0;
49
+ }
50
+
51
+ .bagel-input textarea {
52
+ height: 100%;
53
+ resize: none;
54
+ background: transparent;
55
+ }
56
+ </style>
@@ -0,0 +1,258 @@
1
+ <template>
2
+ <div
3
+ class="bagel-input"
4
+ :class="{ 'no-edit': !editMode, small: small }"
5
+ :title="description"
6
+ >
7
+ <label
8
+ v-if="label"
9
+ for="label"
10
+ :class="{ active: showList }"
11
+ >
12
+ <LangText :input="label" />
13
+ </label>
14
+
15
+ <div
16
+ class="custom-select"
17
+ ref="selectEl"
18
+ :class="{ 'open-select': showList && editMode }"
19
+ >
20
+ <div
21
+ @click.stop="toggleShowList"
22
+ class="input"
23
+ name="select-input"
24
+ :class="{ active: showList }"
25
+ >
26
+ <LangText :input="displayValue" />
27
+ </div>
28
+ <Teleport to="#app">
29
+ <div
30
+ ref="dropdown"
31
+ class="custom-select-drop"
32
+ :class="{ 'open-select': showList && editMode }"
33
+ >
34
+ <div
35
+ v-for="option in optionsRef"
36
+ :key="option.value"
37
+ @click="handleSelect(option)"
38
+ >
39
+ <LangText :input="option.label" />
40
+ </div>
41
+ </div>
42
+ </Teleport>
43
+ </div>
44
+ </div>
45
+ </template>
46
+
47
+ <script lang="ts" setup>
48
+ import {
49
+ onMounted, onUnmounted, ref, computed,
50
+ watch,
51
+ } from 'vue';
52
+ import { type SelectBagelField } from '@/types/BagelField';
53
+ import LangText from '@/components/LangText.vue';
54
+
55
+ const selectEl = ref<HTMLElement>();
56
+ const dropdown = ref<HTMLElement>();
57
+ const showList = ref(false);
58
+ const props = withDefaults(
59
+ defineProps<
60
+ Omit<SelectBagelField, 'key'> & {
61
+ editMode?: boolean;
62
+ field: SelectBagelField;
63
+ modelValue: any;
64
+ small?: boolean;
65
+ }
66
+ >(),
67
+ {
68
+ description: '',
69
+ editMode: true,
70
+ label: '',
71
+ placeholder: '',
72
+ },
73
+ );
74
+ const left = ref('0');
75
+ const top = ref(0);
76
+ const width = ref('0');
77
+ const selectedValue = ref('');
78
+ const optionsRef = ref<{ label: string; value: string | number }[]>([]);
79
+ const displayValue = computed(() => {
80
+ const option = optionsRef.value.find((o) => o.value === selectedValue.value);
81
+ return option?.label || '';
82
+ });
83
+ const emits = defineEmits(['update:modelValue', 'selected']);
84
+
85
+ function handleSelect(option: any) {
86
+ emits('update:modelValue', option.value);
87
+ selectedValue.value = option.value;
88
+ showList.value = false;
89
+ }
90
+
91
+ function handleClick(e: any) {
92
+ const { target } = e;
93
+ if (target.name !== 'select-input' && showList.value === true) {
94
+ showList.value = false;
95
+ emits('update:modelValue', selectedValue);
96
+ }
97
+ // showList.value = false
98
+ }
99
+
100
+ function setPosition(e?: WheelEvent) {
101
+ const elInfo = selectEl.value?.getBoundingClientRect() || {
102
+ top: 0,
103
+ left: 0,
104
+ width: 0,
105
+ bottom: 0,
106
+ };
107
+ if (e?.deltaY) {
108
+ // top.value = top.value + e.deltaY * -1
109
+ } else {
110
+ //
111
+ }
112
+ top.value = elInfo.bottom;
113
+
114
+ left.value = `${elInfo.left}px`;
115
+ width.value = `${elInfo.width}px`;
116
+ const dropRect = dropdown.value?.getBoundingClientRect?.() || {
117
+ height: 0,
118
+ };
119
+
120
+ if (window.innerHeight - elInfo.bottom < dropRect.height) {
121
+ top.value = elInfo.top - dropRect.height;
122
+ }
123
+ }
124
+
125
+ function hideDrop(e: WheelEvent) {
126
+ const dropRect = dropdown.value?.getBoundingClientRect() || {
127
+ left: 0,
128
+ right: 0,
129
+ };
130
+ if (e.clientX < dropRect.left || e.clientX > dropRect.right) {
131
+ showList.value = false;
132
+ }
133
+ }
134
+
135
+ watch(
136
+ () => props.modelValue,
137
+ () => {
138
+ if (selectedValue.value !== props.modelValue) selectedValue.value = props.modelValue;
139
+ },
140
+ { immediate: true },
141
+ );
142
+
143
+ onMounted(() => {
144
+ // scroll event listener
145
+ window.addEventListener('wheel', hideDrop);
146
+
147
+ selectedValue.value = props.modelValue;
148
+ if (typeof props.field.options === 'string') {
149
+ props.field.options.split('\n').forEach((option) => {
150
+ optionsRef.value?.push({ label: option, value: option });
151
+ });
152
+ } else {
153
+ props.field.options.forEach((option) => {
154
+ optionsRef.value?.push(option);
155
+ });
156
+ }
157
+ document.addEventListener('click', handleClick);
158
+ });
159
+
160
+ function toggleShowList() {
161
+ setPosition();
162
+ showList.value = !showList.value;
163
+ }
164
+
165
+ onUnmounted(() => {
166
+ document.removeEventListener('click', handleClick);
167
+ // window.removeEventListener('wheel', hideDrop);
168
+ });
169
+ </script>
170
+
171
+ <style scoped>
172
+ .custom-select {
173
+ position: relative;
174
+ font-size: var(--input-font-size);
175
+ }
176
+
177
+ .custom-select .input {
178
+ width: 100%;
179
+ cursor: pointer;
180
+ background: var(--input-bg);
181
+ min-height: var(--input-height);
182
+ border: none;
183
+ border-radius: var(--input-border-radius);
184
+ color: var(--input-color);
185
+ position: relative;
186
+ display: flex;
187
+ flex-direction: column;
188
+ text-align: start;
189
+ margin-inline-end: 20px;
190
+ justify-content: center;
191
+ margin-bottom: 2px;
192
+ }
193
+
194
+ .custom-select .input:after {
195
+ content: 'keyboard_arrow_down';
196
+ font-family: 'Material Symbols Outlined', serif;
197
+ position: absolute;
198
+ top: calc(var(--input-height) / 2 - 10px);
199
+ font-size: calc(var(--input-font-size) * 1.5);
200
+ right: calc(var(--input-height) / 4);
201
+ height: 100%;
202
+ }
203
+
204
+ [dir='rtl'] .custom-select .input:after {
205
+ right: unset;
206
+ left: calc(var(--input-font-size) / 2);
207
+ }
208
+
209
+ [dir='rtl'] .custom-select-drop {
210
+ inset-inline-end: v-bind(left);
211
+ inset-inline-start: unset;
212
+ }
213
+
214
+ .custom-select-drop {
215
+ position: fixed;
216
+
217
+ cursor: pointer;
218
+ font-size: 12px;
219
+ top: v-bind('`${top}px`');
220
+ inset-inline-start: v-bind(left);
221
+ box-sizing: border-box;
222
+ min-width: 220px;
223
+ width: v-bind(width);
224
+ background: var(--bgl-white);
225
+ box-shadow: 0 0 10px 0 var(--bgl-shadow);
226
+ border-radius: 10px;
227
+ z-index: 10000;
228
+ overflow-y: auto;
229
+ opacity: 0;
230
+ pointer-events: none;
231
+ max-height: 0;
232
+ /*transition: var(--bgl-transition);*/
233
+ }
234
+
235
+ .open-select.custom-select-drop {
236
+ opacity: 1;
237
+ max-height: 150px;
238
+ pointer-events: all;
239
+ /*transition: var(--bgl-transition);*/
240
+ }
241
+
242
+ .custom-select-drop>* {
243
+ /*transition: var(--bgl-transition); */
244
+ padding: 0.5rem 0.75rem;
245
+ }
246
+
247
+ .custom-select-drop>*:hover {
248
+ background: var(--bgl-blue-light);
249
+ }
250
+
251
+ .custom-select-drop>*:active {
252
+ filter: var(--bgl-hover-filter);
253
+ }
254
+
255
+ .bagel-input label {
256
+ margin-bottom: 0;
257
+ }
258
+ </style>
@@ -0,0 +1,319 @@
1
+ <template>
2
+ <div
3
+ class="table-field-wrap"
4
+ :title="description"
5
+ >
6
+ <div class="bagel-input">
7
+ <label>
8
+ {{ fieldMeta?.label }}
9
+ </label>
10
+ </div>
11
+ <div class="table-side-scroll">
12
+ <div class="table-header">
13
+ <div
14
+ class="header-col"
15
+ :class="formatString(field.fieldtype, 'pascal')"
16
+ v-for="field in entityMeta?.fields"
17
+ :key="`${field.fieldname}header`"
18
+ >
19
+ {{ field.label }}
20
+ </div>
21
+ </div>
22
+ <VueDraggableNext
23
+ v-model="listRef"
24
+ animation="150"
25
+ handle=".table-reorder"
26
+ group="mainGroup"
27
+ easing="cubic-bezier(1, 0, 0, 1)"
28
+ ghost-class="ghost"
29
+ @end="ended"
30
+ >
31
+ <TransitionGroup>
32
+ <div
33
+ v-for="(row, index) in modelValue"
34
+ class="flex table-row"
35
+ :key="row.id"
36
+ >
37
+ <div class="table-reorder">
38
+ <MaterialIcon icon="more_vert" />
39
+ </div>
40
+ <div
41
+ class="table-cell"
42
+ :class="formatString(field.fieldtype, 'pascal')"
43
+ v-for="field in entityMeta?.fields"
44
+ :key="`${field.fieldname}${row.id}`"
45
+ >
46
+ <BagelInput
47
+ no-label
48
+ :field-meta="field"
49
+ :bagel-app="bagel"
50
+ @update:modelValue="(value: any) => handleUpdateModelValue(value, index, field.fieldname)"
51
+ :model-value="row[field.fieldname]"
52
+ />
53
+ </div>
54
+
55
+ <div class="table-action">
56
+ <MaterialIcon
57
+ icon="delete"
58
+ @click="removeRow(index)"
59
+ />
60
+ </div>
61
+ </div>
62
+ </TransitionGroup>
63
+ </VueDraggableNext>
64
+ </div>
65
+ <Btn
66
+ thin
67
+ flat
68
+ icon="add"
69
+ color="light"
70
+ @click="addRow"
71
+ >
72
+ New
73
+ </Btn>
74
+ </div>
75
+ </template>
76
+
77
+ <script setup lang="ts">
78
+ import { VueDraggableNext } from 'vue-draggable-next';
79
+ // import { EntityMeta } from 'bagel-sdk/types';
80
+ import { onMounted, ref } from 'vue';
81
+ import { Btn } from '@/components';
82
+ // import { bagelApp as api } from '../../../index';
83
+ import MaterialIcon from '../MaterialIcon.vue';
84
+ import { formatString } from '@/utils/strings';
85
+ // import TransitionGroupPop from '../../transitions/TransitionGroupPop.vue';
86
+ // import { formatString } from '../../../composables';
87
+ // import { ButtonIcon } from 'src/components/buttons'
88
+ let bagel: any;
89
+ let api: any;
90
+ const props = withDefaults(
91
+ defineProps<{
92
+ description?: string;
93
+ meta: Record<string, any> /* EntityMeta */;
94
+ fieldname: string;
95
+ bagelApp?: any;
96
+ modelValue: any;
97
+ }>(),
98
+ {
99
+ description: '',
100
+ bagelApp: null,
101
+ },
102
+ );
103
+ const listRef = ref(props.modelValue);
104
+ const emits = defineEmits(['update:modelValue']);
105
+ const fieldMeta = props.meta.doc_meta.fields.find(
106
+ (field: Record<string, any>) => field.fieldname === props.fieldname,
107
+ );
108
+ const entityMeta = props.meta.links.find(
109
+ (link: Record<string, any>) => link.id === fieldMeta?.options,
110
+ );
111
+
112
+ function handleUpdateModelValue(value: any, index: number, fieldname: string) {
113
+ const rows = [...props.modelValue];
114
+ rows[index][fieldname] = value;
115
+ emits('update:modelValue', rows);
116
+ }
117
+
118
+ function addRow() {
119
+ const rows = [...props.modelValue];
120
+ const entry = {
121
+ idx: rows.length,
122
+ } as { [key: string]: any };
123
+ entityMeta?.fields.forEach((field: any) => {
124
+ if (field.default) {
125
+ if (field.fieldtype === 'Check') {
126
+ entry[field.fieldname] = parseInt(field.default);
127
+ } else {
128
+ entry[field.fieldname] = field.default;
129
+ }
130
+ }
131
+ });
132
+ rows.push(entry);
133
+ emits('update:modelValue', rows);
134
+ }
135
+
136
+ function removeRow(idx: number) {
137
+ const rows = [...props.modelValue];
138
+ rows.splice(idx, 1);
139
+ emits('update:modelValue', rows);
140
+ }
141
+
142
+ function ended() {
143
+ listRef.value.forEach((item: Record<string, any>, index: number) => {
144
+ item.idx = index + 1;
145
+ });
146
+ emits('update:modelValue', listRef.value);
147
+ }
148
+ onMounted(() => {
149
+ bagel = props.bagelApp || api;
150
+ });
151
+ </script>
152
+
153
+ <style scoped>
154
+ .table-side-scroll {
155
+ overflow: auto;
156
+ margin-inline-start: -1rem;
157
+ padding-inline-start: 1rem;
158
+ padding-bottom: 1rem;
159
+ }
160
+
161
+ .table-field-wrap {
162
+ margin-bottom: -1rem;
163
+ }
164
+
165
+ .table-cell {
166
+ border-inline-end: 1px solid var(--border-color);
167
+ border-bottom: 1px solid var(--border-color);
168
+ }
169
+
170
+ .table-row {
171
+ transition: var(--bgl-transition);
172
+ position: relative;
173
+ width: max-content;
174
+ }
175
+
176
+ .table-row:hover {
177
+ background: var(--bgl-gray-light);
178
+ }
179
+
180
+ .table-reorder {
181
+ opacity: 0;
182
+ width: 2rem;
183
+ text-align: center;
184
+ position: absolute;
185
+ margin-inline-start: -2rem;
186
+ }
187
+
188
+ .table-row:hover .table-reorder {
189
+ opacity: 1;
190
+ cursor: grab;
191
+ }
192
+
193
+ .table-reorder:active {
194
+ opacity: 1;
195
+ cursor: grab;
196
+ }
197
+
198
+ .btn.thin.btn-txt {
199
+ margin-inline-start: -1rem;
200
+ margin-top: 1rem;
201
+ }
202
+
203
+ .table-header {
204
+ display: flex;
205
+ width: max-content;
206
+ }
207
+
208
+ .header-col {
209
+ min-width: calc(var(--input-height) * 3);
210
+ font-size: 13px;
211
+ color: var(--input-color);
212
+ padding: 10px 0;
213
+ border-bottom: 1px solid var(--border-color);
214
+ }
215
+
216
+ .table-cell,
217
+ .header-col {
218
+ width: 160px;
219
+ }
220
+
221
+ .table-cell.check,
222
+ .header-col.check {
223
+ width: 100px;
224
+ }
225
+
226
+ .table-cell.date,
227
+ .header-col.date {
228
+ width: 140px;
229
+ }
230
+
231
+ .header-col.small-text,
232
+ .header-col.text,
233
+ .header-col.long-text,
234
+ .header-col.json,
235
+ .table-cell.small-text,
236
+ .table-cell.text,
237
+ .table-cell.long-text,
238
+ .table-cell.json {
239
+ width: 240px;
240
+ }
241
+
242
+ .table-cell.small-text .bagel-input,
243
+ .table-cell.text .bagel-input,
244
+ .table-cell.long-text .bagel-input,
245
+ .table-cell.json .bagel-input {
246
+ height: 40px;
247
+ overflow: auto;
248
+ }
249
+
250
+ .table-action {
251
+ text-align: center;
252
+ position: sticky;
253
+ opacity: 0;
254
+ transition: var(--bgl-transition);
255
+ inset-inline-end: 0;
256
+ height: 100%;
257
+ margin-top: -1px;
258
+ background: var(--border-color);
259
+ }
260
+
261
+ .table-action>.icon-font {
262
+ padding: 11.4px;
263
+ cursor: pointer;
264
+ transition: var(--bgl-transition);
265
+ }
266
+
267
+ .table-action:hover>.icon-font {
268
+ background: var(--bgl-red);
269
+ color: var(--bgl-white);
270
+ }
271
+
272
+ .table-action:active>.icon-font {
273
+ filter: brightness(90%);
274
+ }
275
+
276
+ .table-row:hover .table-action {
277
+ opacity: 1;
278
+ }
279
+ </style>
280
+ <style>
281
+ .table-row .bagel-input input,
282
+ .table-row .bagel-input textarea,
283
+ .table-row .bagel-input .input {
284
+ border-radius: 0;
285
+ background: transparent;
286
+ color: var(--bgl-black);
287
+ }
288
+
289
+ .table-row .bagel-input textarea {
290
+ resize: none;
291
+ min-height: 40px;
292
+ overflow: auto;
293
+ margin: 0px;
294
+ padding: 0.64rem 0.7rem 0;
295
+ }
296
+
297
+ .table-row .bagel-input {
298
+ margin: 0;
299
+ }
300
+
301
+ .table-row .bagel-input input:focus-visible,
302
+ .table-row .bagel-input textarea:focus-visible,
303
+ .table-row .bagel-input .input:focus-visible {
304
+ background: var(--border-color);
305
+ }
306
+
307
+ .ghost {
308
+ opacity: 0;
309
+ background: #c8ebfb;
310
+ }
311
+
312
+ .sortable-chosen {
313
+ cursor: grabbing !important;
314
+ border-color: transparent;
315
+ background: var(--bgl-white);
316
+ border-radius: 10px;
317
+ box-shadow: 0 0 10px 0 rgb(0 0 0 /20%);
318
+ }
319
+ </style>