@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,205 @@
1
+ <template>
2
+ <div
3
+ @click="onClick"
4
+ class="person-card"
5
+ v-if="person"
6
+ >
7
+ <div
8
+ class="person-card-edit flex gap-2"
9
+ v-if="!onClick"
10
+ >
11
+ <Btn
12
+ @click="hideModal"
13
+ round
14
+ thin
15
+ icon.end="arrow_outward"
16
+ value="Profile"
17
+ v-if="!$route.path.match('/search')"
18
+ is="router-link"
19
+ :to="`/search/${person.id}`"
20
+ />
21
+ <Btn
22
+ thin
23
+ flat
24
+ @click="showEditForm"
25
+ icon="edit"
26
+ />
27
+ </div>
28
+ <div class="person-card-icon-wrap">
29
+ <p class="person-card-icon">
30
+ {{ initials(person.first_name, person.last_name) }}
31
+ </p>
32
+ <p class="person-card-name txt20">
33
+ {{ person.first_name }} {{ person.last_name }}
34
+ </p>
35
+ </div>
36
+
37
+ <div class="person-card-details-wrap">
38
+ <div
39
+ class="person-card-details"
40
+ v-if="person.phone?.length"
41
+ >
42
+ <MaterialIcon icon="phone" />
43
+ <p
44
+ v-for="phone in person.phone"
45
+ :key="phone.id"
46
+ >
47
+ {{ phone.phone }}
48
+ </p>
49
+ </div>
50
+ <div
51
+ class="person-card-details"
52
+ v-if="person.email?.length"
53
+ >
54
+ <MaterialIcon icon="email" />
55
+ <p
56
+ v-for="email in person.email"
57
+ :key="email.id"
58
+ >
59
+ {{ email.email }}
60
+ </p>
61
+ </div>
62
+ <div
63
+ class="person-card-details badge"
64
+ v-if="person.date_of_birth || person.gender"
65
+ >
66
+ <MaterialIcon icon="badge" />
67
+ <p v-if="person.date_of_birth">
68
+ {{ person.date_of_birth }}
69
+ </p>
70
+ <p v-if="person.gender">
71
+ {{ person.gender }}
72
+ </p>
73
+ </div>
74
+ </div>
75
+ </div>
76
+ </template>
77
+
78
+ <script lang="ts" setup>
79
+ import { useBagel } from 'src/plugins/bagel';
80
+ import type { FormKitSchemaDefinition } from '@formkit/core';
81
+ import type { Person } from '@/types';
82
+ import {
83
+ useModal, initials,
84
+ } from '@/utils';
85
+ import { Btn, MaterialIcon } from '@/components';
86
+
87
+ // const toast = useToast(); // TODO: use toast
88
+ const bagel = useBagel();
89
+ const { modalForm, hideModal } = useModal();
90
+
91
+ const props = defineProps<{
92
+ context: Record<string, any>;
93
+ // eslint-disable-next-line no-unused-vars
94
+ onClick?: ((event: MouseEvent) => void);
95
+ personSchema: () => FormKitSchemaDefinition;
96
+ }>();
97
+
98
+ const person = $computed<Person>(() => props.context.value);
99
+
100
+ const showEditForm = async () => {
101
+ const { first_name, last_name } = person;
102
+ modalForm({
103
+ side: true,
104
+ title: `${first_name} ${last_name}`,
105
+ schema: props.personSchema,
106
+ modelValue: person,
107
+ onSubmit: (newPerson) => bagel.put('/person', newPerson),
108
+ // .then(() => toast.success($t('updatedSuccessfully'))), // TODO: use toast
109
+ });
110
+ };
111
+ </script>
112
+ <style>
113
+ .person-card {
114
+ border: 1.1px solid var(--border-color);
115
+ /* background: var(--input-bg); */
116
+ border-radius: var(--card-border-radius);
117
+ padding: 1rem;
118
+ margin-bottom: 0.5rem;
119
+ font-size: 1rem;
120
+ position: relative;
121
+ }
122
+
123
+ .person-card p {
124
+ margin: 0;
125
+ }
126
+
127
+ .person-card-details {
128
+ font-size: 14px;
129
+ margin-bottom: 2px;
130
+ line-height: 1.3;
131
+ display: flex;
132
+ }
133
+
134
+ .person-card-details p {
135
+ color: var(--input-color);
136
+ opacity: 0.6;
137
+ }
138
+
139
+ .person-card-details.badge p {
140
+ opacity: 1;
141
+ }
142
+
143
+ .person-card-details p:nth-child(2) {
144
+ opacity: 1;
145
+ padding-inline-end: 0.5rem;
146
+ }
147
+
148
+ .person-card-details .icon-font {
149
+ color: var(--bgl-blue);
150
+ padding-inline-end: 0.25rem;
151
+ }
152
+
153
+ .person-card-edit {
154
+ position: absolute;
155
+ inset-inline-end: 1rem;
156
+ }
157
+
158
+ .person-card-details-wrap {
159
+ display: flex;
160
+ gap: 0.5rem;
161
+ flex-wrap: wrap;
162
+ }
163
+
164
+ .person-card-icon {
165
+ background: var(--bgl-gray);
166
+ height: 30px;
167
+ width: 30px;
168
+ border-radius: 100%;
169
+ text-transform: uppercase;
170
+ display: flex;
171
+ justify-content: center;
172
+ align-items: center;
173
+ color: white;
174
+ font-size: 12px;
175
+ }
176
+
177
+ .person-card-icon-wrap {
178
+ display: flex;
179
+ gap: 0.5rem;
180
+ align-items: center;
181
+ padding-bottom: 0.75rem;
182
+ }
183
+
184
+ @media screen and (max-width: 910px) {
185
+ .person-card-icon-wrap {
186
+ padding-bottom: 0.5rem;
187
+ }
188
+
189
+ .person-card {
190
+ padding: 0.75rem;
191
+ position: relative;
192
+ }
193
+
194
+ .person-card-edit {
195
+ /* position: relative; */
196
+ inset-inline-end: 0.5rem;
197
+ margin-bottom: 1rem;
198
+ justify-content: flex-end;
199
+ }
200
+
201
+ .person-card-name {
202
+ max-width: calc(100% - 170px);
203
+ }
204
+ }
205
+ </style>
@@ -0,0 +1,151 @@
1
+ <template>
2
+ <!-- :class="{ editable: editable }" -->
3
+ <div
4
+ @click="focusEditor"
5
+ :id="`canvas-${elementId}`"
6
+ @keydown.meta.enter="$emit('keydown.meta.enter')"
7
+ />
8
+ </template>
9
+
10
+ <script setup lang="ts">
11
+ import { ref, onMounted, watch } from 'vue';
12
+ import { DOMParser, DOMSerializer } from 'prosemirror-model';
13
+ import { EditorState } from 'prosemirror-state';
14
+ import { EditorView } from 'prosemirror-view';
15
+ import { keymap } from 'prosemirror-keymap';
16
+ import { baseKeymap } from 'prosemirror-commands';
17
+ import { undo, redo, history } from 'prosemirror-history';
18
+ import { schema } from 'prosemirror-schema-basic';
19
+
20
+ const props = withDefaults(
21
+ defineProps<{
22
+ elementId?: string;
23
+ modelValue: string;
24
+ }>(),
25
+ {
26
+ elementId: Math.random().toString(36).substr(2, 9),
27
+ modelValue: '',
28
+ },
29
+ );
30
+
31
+ const emit = defineEmits(['update:modelValue', 'keydown.meta.enter']);
32
+
33
+ const html = ref<string>(props.modelValue);
34
+ let view: EditorView;
35
+
36
+ const createEditorStateFromHTML = (htmlContent: string) => {
37
+ let content = { type: 'doc', content: [] };
38
+ try {
39
+ const dom = document.createElement('div');
40
+ dom.innerHTML = htmlContent || '';
41
+ content = DOMParser.fromSchema(schema)
42
+ .parse(dom, { preserveWhitespace: true })
43
+ .toJSON();
44
+ } catch (err) {
45
+ content = { type: 'doc', content: [] };
46
+ }
47
+
48
+ const state = EditorState.create({
49
+ doc: DOMParser.fromSchema(schema).schema.nodeFromJSON(content),
50
+ plugins: [
51
+ history(),
52
+ keymap({ 'Mod-z': undo, 'Mod-y': redo }),
53
+ keymap(baseKeymap),
54
+ ],
55
+ });
56
+
57
+ return state;
58
+ };
59
+
60
+ function handleChange(newState: any) {
61
+ const dom = document.createElement('div');
62
+ const node = DOMSerializer.fromSchema(schema).serializeFragment(newState);
63
+ dom.appendChild(node);
64
+ html.value = dom?.innerHTML || '';
65
+ emit('update:modelValue', html.value);
66
+ }
67
+
68
+ const createEditorView = (state: EditorState) => {
69
+ const editorDiv = document.getElementById(`canvas-${props.elementId}`);
70
+ view = new EditorView(editorDiv, {
71
+ state,
72
+ // editable: () => props.editable,
73
+ dispatchTransaction(transaction) {
74
+ const newState = view.state.apply(transaction);
75
+ handleChange(newState.doc);
76
+ view.updateState(newState);
77
+ },
78
+ });
79
+ view.setProps({
80
+ // editable: () => props.editable,
81
+ });
82
+ };
83
+
84
+ function loadContent() {
85
+ const state = createEditorStateFromHTML(props.modelValue);
86
+ createEditorView(state);
87
+ }
88
+
89
+ watch(
90
+ () => props.modelValue,
91
+ (val: string) => {
92
+ if (val === html.value) return;
93
+ const el = document.getElementById(`canvas-${props.elementId}`);
94
+ if (el) el.innerHTML = '';
95
+ loadContent();
96
+ },
97
+ );
98
+
99
+ onMounted(loadContent);
100
+
101
+ function focusEditor() {
102
+ view.focus();
103
+ }
104
+ </script>
105
+
106
+ <style>
107
+ .new-comment .ProseMirror {
108
+ width: 100%;
109
+ height: 100%;
110
+ border-radius: 3px;
111
+ padding: 0.55rem;
112
+ min-height: 40px;
113
+ }
114
+
115
+ .new-comment .ProseMirror p {
116
+ margin: 0;
117
+ }
118
+
119
+ .comment-input .ProseMirror {
120
+ background-color: var(--bgl-bg);
121
+ margin-inline-start: 0;
122
+ }
123
+
124
+ .new-comment .editable {
125
+ background-color: var(--bgl-bg);
126
+ }
127
+
128
+ .ProseMirror-focused {
129
+ outline: none;
130
+ border: none;
131
+ box-shadow: inset 0 0 10px #00000012;
132
+ }
133
+
134
+ .ProseMirror,
135
+ .editor-wrapper {
136
+ height: 100%;
137
+ border-radius: 3px;
138
+ padding: 0.55rem;
139
+ border-radius: var(--btn-border-radius);
140
+ margin-inline-start: 1rem;
141
+ }
142
+
143
+ .ProseMirror p,
144
+ .editor-wrapper p {
145
+ margin: 0;
146
+ }
147
+
148
+ .editable .ProseMirror {
149
+ background-color: var(--bgl-bg);
150
+ }
151
+ </style>
@@ -0,0 +1,17 @@
1
+ <template>
2
+ <router-view v-slot="{ Component, route }">
3
+ <transition
4
+ :duration="300"
5
+ name="slide-fade"
6
+ mode="out-in"
7
+ appear
8
+ >
9
+ <component
10
+ :is="Component"
11
+ :key="route?.params.itemID"
12
+ />
13
+ </transition>
14
+ </router-view>
15
+ </template>
16
+
17
+ <script lang="ts" setup></script>
@@ -0,0 +1,83 @@
1
+ <template>
2
+ <div class="h-100 grid list-view gap-3">
3
+ <div class="card tabs-top">
4
+ <slot name="top-section" />
5
+ <div class="tabs grid auto-flow-columns fit-content">
6
+ <div
7
+ v-for="tab in tabs"
8
+ :class="{
9
+ active:
10
+ tab === activeTab ||
11
+ tab === router.currentRoute.value.path.split('/').slice(-1)[0],
12
+ }"
13
+ class="tab"
14
+ :key="tab"
15
+ @click="changeTab(tab)"
16
+ >
17
+ {{ tab }}
18
+ </div>
19
+ </div>
20
+ </div>
21
+ <!-- <TransitionRouterView v-if="baseRoute" /> -->
22
+ <div
23
+ class="list-content"
24
+ v-for="tab in tabs.filter((item) => item === activeTab)"
25
+ :key="tab"
26
+ >
27
+ <slot
28
+ :name="tab"
29
+ :key="tab"
30
+ />
31
+ </div>
32
+ </div>
33
+ </template>
34
+
35
+ <script setup lang="ts">
36
+ import { onMounted } from 'vue';
37
+ import type { Router } from 'vue-router';
38
+
39
+ const emit = defineEmits(['update:modelValue']);
40
+
41
+ let activeTab = $ref<string>();
42
+ const props = defineProps<{
43
+ title?: string;
44
+ tabs: string[];
45
+ modelValue?: string;
46
+ router: Router
47
+ }>();
48
+
49
+ function changeTab(tab: string) {
50
+ const { router } = props;
51
+ activeTab = tab;
52
+ void router.push({
53
+ path: router.currentRoute.value.path,
54
+ query: { ...router.currentRoute.value.query, t: tab },
55
+ hash: router.currentRoute.value.hash,
56
+ });
57
+ emit('update:modelValue', activeTab);
58
+ }
59
+
60
+ onMounted(() => {
61
+ const firstTab = props.modelValue || props.router.currentRoute.value.query.t || props.tabs[0];
62
+ activeTab = firstTab as string;
63
+ });
64
+ </script>
65
+
66
+ <style scoped>
67
+ .tab {
68
+ text-transform: capitalize;
69
+ }
70
+
71
+ /* .top-section {
72
+ grid-area: top-section;
73
+ font-size: 10px;
74
+ }
75
+
76
+ .detail-section {
77
+ grid-area: detail-section;
78
+ } */
79
+ .card.tabs-top {
80
+ width: 99%;
81
+
82
+ }
83
+ </style>
@@ -0,0 +1,248 @@
1
+ <template>
2
+ <div class="table-list-wrap h-100">
3
+ <!-- <div v-for="field in schema" :key="field.id">{{ parseLocale(field.label) }}</div> -->
4
+ <table class="infinite-wrapper">
5
+ <thead class="row first-row">
6
+ <th
7
+ class="col"
8
+ v-for="field in columns"
9
+ :key="field.id"
10
+ @click="sort(field.id)"
11
+ >
12
+ <div class="flex">
13
+ {{ parseLocale(field.label || field.id) }}
14
+ <div
15
+ class="list-arrows"
16
+ :class="{ sorted: sortField === field.id }"
17
+ >
18
+ <MaterialIcon
19
+ :class="{ desc: sortDirection === 'DESC' }"
20
+ icon="keyboard_arrow_up"
21
+ />
22
+ </div>
23
+ </div>
24
+ </th>
25
+ </thead>
26
+ <tbody
27
+ ref="infinite"
28
+ class="rows infinite"
29
+ :class="{ loading }"
30
+ >
31
+ <tr
32
+ @click="selectElement(row)"
33
+ class="row row-item position-relative"
34
+ v-for="row in data"
35
+ :key="row.id"
36
+ >
37
+ <td
38
+ class="col"
39
+ v-for="field in columns"
40
+ :key="`${field.id}-${row.id}`"
41
+ >
42
+ <slot
43
+ v-if="slots[field.id]"
44
+ :name="field.id"
45
+ :row="row"
46
+ :field="field"
47
+ />
48
+ <div v-else>
49
+ <component
50
+ :is="field.$el || field.$cmp || 'div'"
51
+ v-if="field['v-if'] ? field['v-if'](row[field.id], row) : true"
52
+ v-bind="bindAttrs(field.attrs, row[field.id], row)"
53
+ :src="field.$el === 'img' ? row[field.id]?.url : ''"
54
+ >
55
+ {{ field?.transform?.(row[field.id], row) || row[field.id] || '' }}
56
+ </component>
57
+ </div>
58
+ </td>
59
+ </tr>
60
+ </tbody>
61
+ </table>
62
+ <!-- </Transition> -->
63
+ </div>
64
+ </template>
65
+
66
+ <script setup lang="ts">
67
+ import { useSlots } from 'vue';
68
+ import { MaterialIcon } from '@/components';
69
+ import { parseLocale } from '@/utils';
70
+
71
+ const slots = useSlots();
72
+ const loading = $ref(true);
73
+
74
+ const props = defineProps<{
75
+ data: any[];
76
+ schema?: any[];
77
+ }>();
78
+
79
+ const emit = defineEmits(['select']);
80
+
81
+ const selectElement = (data: Record<string, any>) => {
82
+ emit('select', data);
83
+ };
84
+
85
+ const bindAttrs = (attrs: Record<string, any>, field: any, row: any) => {
86
+ const arr = Object.entries(
87
+ attrs || {},
88
+ )
89
+ .map(
90
+ ([key, value]) => [
91
+ key, typeof value === 'function' ? value(field, row) : value,
92
+ ],
93
+ );
94
+ const resolvedAttrs = Object.fromEntries(arr);
95
+ return resolvedAttrs;
96
+ };
97
+
98
+ // const sortList = () => {};
99
+ let sortDirection = $ref('');
100
+ let sortField = $ref('');
101
+
102
+ const sort = (fieldname: string) => {
103
+ if (sortField === fieldname) {
104
+ if (sortDirection === 'ASC') sortDirection = 'DESC';
105
+ else sortField = '';
106
+ } else {
107
+ sortField = fieldname;
108
+ sortDirection = 'ASC';
109
+ }
110
+ };
111
+
112
+ const columns = $computed(
113
+ () => (
114
+ props.schema ||
115
+ Object.keys(props.data[0]).map((k: string) => ({
116
+ id: k,
117
+ inputType: 'PlainText',
118
+ }))),
119
+ );
120
+ </script>
121
+
122
+ <style scoped>
123
+ .list-arrows {
124
+ opacity: 0;
125
+ }
126
+
127
+ .list-arrows .icon-font {
128
+ transition: all ease-in-out 0.2s;
129
+ }
130
+
131
+ .list-arrows.sorted {
132
+ opacity: 1;
133
+ }
134
+
135
+ .col img {
136
+ height: 35px;
137
+ margin-top: -14px;
138
+ margin-bottom: -14px;
139
+ border-radius: 5px;
140
+ }
141
+
142
+ .list-arrows.sorted .desc {
143
+ transform: rotate(180deg);
144
+ }
145
+
146
+ table {
147
+ border-collapse: separate;
148
+ border-spacing: 0 15px;
149
+ border-collapse: collapse;
150
+ }
151
+
152
+ th {
153
+ font-weight: 400;
154
+ }
155
+
156
+ .row {
157
+ border-bottom: 1px solid var(--border-color);
158
+ cursor: pointer;
159
+ }
160
+
161
+ .row.first-row {
162
+ font-size: 0.8rem;
163
+ color: var(--bgl-black-tint);
164
+ position: sticky;
165
+ top: 0;
166
+ z-index: 2;
167
+ background: var(--bgl-white);
168
+ height: 50px;
169
+ vertical-align: bottom;
170
+ }
171
+
172
+ .row.first-row::after {
173
+ content: '';
174
+ border-bottom: 1px solid var(--border-color);
175
+ position: absolute;
176
+ left: 0;
177
+ right: 0;
178
+ bottom: -1px;
179
+ }
180
+
181
+ .first-row .col {
182
+ cursor: pointer;
183
+ background: var(--bgl-white);
184
+ }
185
+
186
+ .col {
187
+ white-space: nowrap;
188
+ padding: 14px;
189
+ transition: var(--bgl-transition);
190
+ line-height: 1;
191
+ padding-left: 1rem;
192
+ padding-right: 1rem;
193
+ align-items: center;
194
+ }
195
+
196
+ .col>div {
197
+ display: flex;
198
+ gap: 0.5rem;
199
+ }
200
+
201
+ .max-col-width {
202
+ max-width: 30vw;
203
+ overflow: hidden;
204
+ text-overflow: ellipsis;
205
+ }
206
+
207
+ .col.check .icon-font {
208
+ border-radius: 100%;
209
+ background: var(--bgl-blue-20);
210
+ color: var(--bgl-blue);
211
+ width: 20px;
212
+ height: 20px;
213
+ display: flex;
214
+ align-items: center;
215
+ justify-content: center;
216
+ margin-top: -2px;
217
+ }
218
+
219
+ .rows {
220
+ font-size: 0.8125em;
221
+ }
222
+
223
+ .table-list {
224
+ height: 100%;
225
+ position: relative;
226
+ padding-left: 0 !important;
227
+ padding-right: 0 !important;
228
+ overflow: auto;
229
+ }
230
+
231
+ .BagelTable .table-list {
232
+ overflow: unset;
233
+ }
234
+
235
+ .row-item {
236
+ height: 50px;
237
+ transition: all 200ms ease;
238
+ }
239
+
240
+ .row-item:hover {
241
+ background: var(--bgl-gray-light);
242
+ }
243
+
244
+ .infinite-wrapper {
245
+ overflow-y: auto;
246
+ width: 100%;
247
+ }
248
+ </style>
@@ -0,0 +1,5 @@
1
+ <template>
2
+ <div class="flex space-between">
3
+ <slot />
4
+ </div>
5
+ </template>