@bagelink/vue 1.14.13 → 1.15.0

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 (238) hide show
  1. package/dist/components/AddressSearch.vue.d.ts +6 -7
  2. package/dist/components/Alert.vue.d.ts.map +1 -1
  3. package/dist/components/Avatar.vue.d.ts.map +1 -1
  4. package/dist/components/Badge.vue.d.ts.map +1 -1
  5. package/dist/components/Btn.vue.d.ts +1 -1
  6. package/dist/components/Btn.vue.d.ts.map +1 -1
  7. package/dist/components/Card.vue.d.ts.map +1 -1
  8. package/dist/components/Carousel.vue.d.ts +0 -11
  9. package/dist/components/Dropdown.vue.d.ts +0 -2
  10. package/dist/components/Dropdown.vue.d.ts.map +1 -1
  11. package/dist/components/Filter.vue.d.ts +30 -0
  12. package/dist/components/Filter.vue.d.ts.map +1 -0
  13. package/dist/components/FilterQuery.vue.d.ts +8 -3
  14. package/dist/components/Image.vue.d.ts.map +1 -1
  15. package/dist/components/ImportData.vue.d.ts.map +1 -1
  16. package/dist/components/ListItem.vue.d.ts.map +1 -1
  17. package/dist/components/MapEmbed/Index.vue.d.ts.map +1 -1
  18. package/dist/components/Modal.vue.d.ts +0 -1
  19. package/dist/components/Pagination.vue.d.ts.map +1 -1
  20. package/dist/components/Pill.vue.d.ts.map +1 -1
  21. package/dist/components/QueryFilter.vue.d.ts +30 -0
  22. package/dist/components/QueryFilter.vue.d.ts.map +1 -0
  23. package/dist/components/Swiper.vue.d.ts +6 -12
  24. package/dist/components/Swiper.vue.d.ts.map +1 -1
  25. package/dist/components/Toast.vue.d.ts.map +1 -1
  26. package/dist/components/analytics/PieChart.vue.d.ts +2 -2
  27. package/dist/components/calendar/CalendarPopover.vue.d.ts +8 -4
  28. package/dist/components/calendar/CalendarPopover.vue.d.ts.map +1 -1
  29. package/dist/components/calendar/CalendarTypes.d.ts +0 -10
  30. package/dist/components/calendar/Index.vue.d.ts +4 -20
  31. package/dist/components/calendar/views/WeekView.vue.d.ts +1 -9
  32. package/dist/components/dataTable/DataTable.vue.d.ts.map +1 -1
  33. package/dist/components/form/index.d.ts.map +1 -1
  34. package/dist/components/form/inputs/ArrayInput.vue.d.ts +2 -4
  35. package/dist/components/form/inputs/CheckInput.vue.d.ts +1 -2
  36. package/dist/components/form/inputs/Checkbox.vue.d.ts.map +1 -1
  37. package/dist/components/form/inputs/CodeEditor/Index.vue.d.ts +0 -54
  38. package/dist/components/form/inputs/ColorInput.vue.d.ts +1 -3
  39. package/dist/components/form/inputs/DateInput.vue.d.ts +1 -2
  40. package/dist/components/form/inputs/DatePicker.vue.d.ts +0 -1
  41. package/dist/components/form/inputs/EmailInput.vue.d.ts +2 -5
  42. package/dist/components/form/inputs/JSONInput.vue.d.ts +1 -2
  43. package/dist/components/form/inputs/MarkdownEditor.vue.d.ts +2 -7
  44. package/dist/components/form/inputs/NumberInput.vue.d.ts +1 -2
  45. package/dist/components/form/inputs/OTP.vue.d.ts +1 -2
  46. package/dist/components/form/inputs/PasswordInput.vue.d.ts +10 -16
  47. package/dist/components/form/inputs/RadioGroup.vue.d.ts +1 -3
  48. package/dist/components/form/inputs/RangeInput.vue.d.ts +1 -6
  49. package/dist/components/form/inputs/RichText/index.vue.d.ts +1 -2
  50. package/dist/components/form/inputs/RichText/index.vue.d.ts.map +1 -1
  51. package/dist/components/form/inputs/RichText/utils/media.d.ts.map +1 -1
  52. package/dist/components/form/inputs/SelectBtn.vue.d.ts +2 -2
  53. package/dist/components/form/inputs/SelectInput.vue.d.ts +13 -20
  54. package/dist/components/form/inputs/SelectInput.vue.d.ts.map +1 -1
  55. package/dist/components/form/inputs/SignaturePad.vue.d.ts +1 -6
  56. package/dist/components/form/inputs/TableField.vue.d.ts +1 -2
  57. package/dist/components/form/inputs/TelInput.vue.d.ts +1 -2
  58. package/dist/components/form/inputs/TextInput.vue.d.ts +2 -3
  59. package/dist/components/form/inputs/ToggleInput.vue.d.ts +1 -2
  60. package/dist/components/form/inputs/Upload/UploadInput.vue.d.ts +6 -27
  61. package/dist/components/form/inputs/Upload/upload.d.ts +1 -1
  62. package/dist/components/form/inputs/index.d.ts +0 -1
  63. package/dist/components/index.d.ts +1 -3
  64. package/dist/components/index.d.ts.map +1 -1
  65. package/dist/components/layout/AppContent.vue.d.ts +1 -1
  66. package/dist/components/layout/AppContent.vue.d.ts.map +1 -1
  67. package/dist/components/layout/AppLayout.vue.d.ts +0 -2
  68. package/dist/components/layout/AppLayout.vue.d.ts.map +1 -1
  69. package/dist/components/layout/AppSidebar.vue.d.ts +1 -5
  70. package/dist/components/layout/AppSidebar.vue.d.ts.map +1 -1
  71. package/dist/components/layout/Panel.vue.d.ts.map +1 -1
  72. package/dist/components/layout/Resizable.vue.d.ts.map +1 -1
  73. package/dist/components/layout/Skeleton.vue.d.ts.map +1 -1
  74. package/dist/components/layout/TabsNav.vue.d.ts +1 -12
  75. package/dist/components/layout/TabsNav.vue.d.ts.map +1 -1
  76. package/dist/components/layout/appLayoutContext.d.ts +24 -0
  77. package/dist/components/layout/appLayoutContext.d.ts.map +1 -0
  78. package/dist/components/layout/index.d.ts.map +1 -1
  79. package/dist/components/lightbox/Lightbox.vue.d.ts.map +1 -1
  80. package/dist/composables/index.d.ts.map +1 -1
  81. package/dist/composables/useDevice.d.ts.map +1 -1
  82. package/dist/composables/useEscapeKey.d.ts +12 -0
  83. package/dist/composables/useEscapeKey.d.ts.map +1 -0
  84. package/dist/composables/useSchemaField.d.ts.map +1 -1
  85. package/dist/composables/useTheme.d.ts.map +1 -1
  86. package/dist/dialog/Dialog.vue.d.ts.map +1 -1
  87. package/dist/dialog/DialogConfirm.vue.d.ts.map +1 -1
  88. package/dist/form-flow/FormFlow.vue.d.ts.map +1 -1
  89. package/dist/form-flow/MultiStepForm.vue.d.ts +1 -6
  90. package/dist/form-flow/form-flow.d.ts +1 -24
  91. package/dist/form-flow/form-flow.d.ts.map +1 -1
  92. package/dist/i18n/index.d.ts +0 -838
  93. package/dist/index.cjs +245 -222
  94. package/dist/index.d.ts +0 -2
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.mjs +42201 -51162
  97. package/dist/plugins/bagel.d.ts.map +1 -1
  98. package/dist/style.css +1 -2
  99. package/dist/types/BagelForm.d.ts +1 -10
  100. package/dist/types/BagelForm.d.ts.map +1 -1
  101. package/dist/types/BtnOptions.d.ts.map +1 -1
  102. package/dist/types/NavLink.d.ts +1 -2
  103. package/dist/types/TableSchema.d.ts.map +1 -1
  104. package/dist/types/index.d.ts +1 -2
  105. package/dist/types/index.d.ts.map +1 -1
  106. package/dist/utils/BagelFormUtils.d.ts +0 -1
  107. package/dist/utils/calendar/dateUtils.d.ts +2 -2
  108. package/dist/utils/calendar/dateUtils.d.ts.map +1 -1
  109. package/dist/utils/constants.d.ts.map +1 -1
  110. package/dist/utils/date.d.ts +116 -0
  111. package/dist/utils/date.d.ts.map +1 -0
  112. package/dist/utils/fetch.d.ts +29 -0
  113. package/dist/utils/fetch.d.ts.map +1 -0
  114. package/dist/utils/index.d.ts +1 -1
  115. package/dist/utils/index.d.ts.map +1 -1
  116. package/dist/utils/string.d.ts +7 -0
  117. package/dist/utils/string.d.ts.map +1 -0
  118. package/dist/utils/useSearch.d.ts +1 -1
  119. package/package.json +3 -10
  120. package/src/components/AccordionItem.vue +5 -5
  121. package/src/components/Alert.vue +37 -16
  122. package/src/components/Avatar.vue +2 -1
  123. package/src/components/Badge.vue +145 -22
  124. package/src/components/BglVideo.vue +4 -4
  125. package/src/components/Btn.vue +81 -69
  126. package/src/components/Card.vue +7 -6
  127. package/src/components/Dropdown.vue +7 -14
  128. package/src/components/FieldSetVue.vue +2 -2
  129. package/src/components/FilterQuery.vue +3 -3
  130. package/src/components/Image.vue +5 -3
  131. package/src/components/JSONSchema.vue +4 -4
  132. package/src/components/JsonBuilder.vue +3 -3
  133. package/src/components/ListItem.vue +2 -4
  134. package/src/components/MapEmbed/Index.vue +18 -17
  135. package/src/components/NavBar.vue +2 -2
  136. package/src/components/Spreadsheet/Index.vue +4 -4
  137. package/src/components/Spreadsheet/SpreadsheetTable.vue +10 -10
  138. package/src/components/Swiper.vue +3 -1
  139. package/src/components/Toast.vue +57 -36
  140. package/src/components/calendar/CalendarPopover.vue +1 -1
  141. package/src/components/calendar/Index.vue +5 -5
  142. package/src/components/calendar/views/AgendaView.vue +2 -2
  143. package/src/components/calendar/views/DayView.vue +1 -1
  144. package/src/components/calendar/views/MonthView.vue +8 -8
  145. package/src/components/dataTable/DataTable.vue +68 -10
  146. package/src/components/form/index.ts +0 -4
  147. package/src/components/form/inputs/ArrayInput.vue +1 -1
  148. package/src/components/form/inputs/CheckInput.vue +6 -6
  149. package/src/components/form/inputs/Checkbox.vue +5 -4
  150. package/src/components/form/inputs/CodeEditor/Index.vue +1 -1
  151. package/src/components/form/inputs/ColorInput.vue +5 -5
  152. package/src/components/form/inputs/DatePicker.vue +3 -3
  153. package/src/components/form/inputs/EmailInput.vue +15 -15
  154. package/src/components/form/inputs/NumberInput.vue +11 -11
  155. package/src/components/form/inputs/OTP.vue +4 -4
  156. package/src/components/form/inputs/PasswordInput.vue +3 -3
  157. package/src/components/form/inputs/RadioGroup.vue +1 -1
  158. package/src/components/form/inputs/RichText/editor.css +4 -4
  159. package/src/components/form/inputs/RichText/index.vue +39 -39
  160. package/src/components/form/inputs/RichText/utils/media.ts +1 -92
  161. package/src/components/form/inputs/RichText/utils/table.ts +4 -4
  162. package/src/components/form/inputs/SelectBtn.vue +1 -1
  163. package/src/components/form/inputs/SelectInput.vue +16 -16
  164. package/src/components/form/inputs/SignaturePad.vue +6 -6
  165. package/src/components/form/inputs/TableField.vue +7 -7
  166. package/src/components/form/inputs/TelInput.vue +12 -12
  167. package/src/components/form/inputs/TextInput.vue +11 -11
  168. package/src/components/form/inputs/ToggleInput.vue +11 -11
  169. package/src/components/form/inputs/Upload/upload.css +16 -16
  170. package/src/components/index.ts +2 -9
  171. package/src/components/layout/AppContent.vue +5 -19
  172. package/src/components/layout/AppLayout.vue +47 -18
  173. package/src/components/layout/AppSidebar.vue +19 -36
  174. package/src/components/layout/BottomMenu.vue +1 -1
  175. package/src/components/layout/Resizable.vue +5 -2
  176. package/src/components/layout/Skeleton.vue +5 -4
  177. package/src/components/layout/TabsNav.vue +23 -23
  178. package/src/components/layout/appLayoutContext.ts +44 -0
  179. package/src/components/layout/index.ts +2 -0
  180. package/src/components/lightbox/Lightbox.vue +3 -9
  181. package/src/composables/index.ts +1 -0
  182. package/src/composables/useDevice.ts +2 -1
  183. package/src/composables/useEscapeKey.ts +56 -0
  184. package/src/composables/useSchemaField.ts +2 -17
  185. package/src/composables/useTheme.ts +23 -19
  186. package/src/form-flow/FormFlow.vue +2 -0
  187. package/src/form-flow/form-flow.ts +7 -0
  188. package/src/index.ts +0 -3
  189. package/src/plugins/bagel.ts +0 -15
  190. package/src/styles/app-layout.css +231 -0
  191. package/src/styles/appearance.css +179 -21
  192. package/src/styles/bagel.css +103 -97
  193. package/src/styles/buttons.css +8 -8
  194. package/src/styles/colors.css +0 -103
  195. package/src/styles/dark.css +25 -26
  196. package/src/styles/input-variants.css +11 -11
  197. package/src/styles/inputs.css +44 -61
  198. package/src/styles/layout.css +445 -1258
  199. package/src/styles/loginCard.css +1 -1
  200. package/src/styles/mobilLayout.css +153 -28
  201. package/src/styles/text.css +500 -1508
  202. package/src/styles/theme.css +199 -435
  203. package/src/styles/transitions.css +4 -4
  204. package/src/types/BagelForm.ts +46 -151
  205. package/src/types/BtnOptions.ts +5 -3
  206. package/src/types/TableSchema.ts +1 -0
  207. package/src/types/index.ts +0 -5
  208. package/src/utils/calendar/dateUtils.ts +2 -3
  209. package/src/utils/constants.ts +7 -0
  210. package/src/utils/date.ts +482 -0
  211. package/src/utils/fetch.ts +128 -0
  212. package/src/utils/index.ts +54 -3
  213. package/src/utils/sizeParsing.ts +5 -5
  214. package/src/utils/string.ts +56 -0
  215. package/vite.config.ts +5 -1
  216. package/bin/generateFormSchema.ts +0 -1035
  217. package/bin/utils.ts +0 -223
  218. package/src/components/Carousel.vue +0 -724
  219. package/src/components/ImportData.vue +0 -1749
  220. package/src/components/Modal.vue +0 -184
  221. package/src/components/ModalConfirm.vue +0 -42
  222. package/src/components/ModalForm.vue +0 -102
  223. package/src/components/Pill.vue +0 -149
  224. package/src/components/Slider.vue +0 -1446
  225. package/src/components/Title.vue +0 -23
  226. package/src/components/ToolBar.vue +0 -9
  227. package/src/components/form/BagelForm.vue +0 -219
  228. package/src/components/form/BglFieldSet.vue +0 -14
  229. package/src/components/form/BglMultiStepForm.vue +0 -469
  230. package/src/components/form/FieldArray.vue +0 -422
  231. package/src/components/form/useBagelFormState.ts +0 -76
  232. package/src/composables/useFormField.ts +0 -38
  233. package/src/dialog/DialogOLD.vue +0 -358
  234. package/src/plugins/modalTypes.ts +0 -61
  235. package/src/plugins/useModal.ts +0 -225
  236. package/src/styles/modal.css +0 -120
  237. package/src/styles/pillColors.css +0 -0
  238. package/src/utils/BagelFormUtils.ts +0 -684
@@ -1,184 +0,0 @@
1
- <!-- eslint-disable vue/multi-word-component-names -->
2
- <script lang="ts" setup>
3
- import type { BtnOptions } from '@bagelink/vue'
4
- import type { SetupContext } from 'vue'
5
- import {
6
- Btn,
7
- Card,
8
- Title
9
- } from '@bagelink/vue'
10
- import {
11
- computed,
12
- ref,
13
- useSlots,
14
- watch
15
- } from 'vue'
16
- import '../styles/modal.css'
17
-
18
- interface ModalProps {
19
- thin?: boolean
20
- mobileThin?: boolean
21
- side?: boolean
22
- title?: string
23
- width?: string
24
- dismissable?: boolean
25
- actions?: BtnOptions[]
26
- visible?: boolean
27
- zIndex?: number
28
- closePlacement?: 'header' | 'header-end' | 'overlay' | 'overlay-end' | 'none' | 'footer'
29
- }
30
- const props = withDefaults(defineProps<ModalProps>(), {
31
- thin: false,
32
- side: false,
33
- dismissable: true,
34
- visible: false,
35
- zIndex: 100,
36
- closePlacement: 'header'
37
- })
38
-
39
- const emit = defineEmits(['update:visible'])
40
-
41
- const slots: SetupContext['slots'] = useSlots()
42
-
43
- const isVisible = ref<boolean>(false)
44
-
45
- watch(
46
- () => props.visible,
47
- (val) => {
48
- if (val === isVisible.value || val === undefined) { return }
49
- if (val) { openModal() }
50
- else { closeModal() }
51
- },
52
- { immediate: true },
53
- )
54
-
55
- const maxWidth = computed(() => {
56
- const { width } = props
57
- if (width?.match(/px|em|rem|vw|vh|%/)) { return { 'max-width': width } }
58
- if (width?.match(/\d+/)) { return { 'max-width': `${width}px` } }
59
- return { 'max-width': '720px' }
60
- })
61
-
62
- // Computed properties for close button placement
63
- const isOverlay = computed(() => props.closePlacement === 'overlay' || props.closePlacement === 'overlay-end')
64
- const isHeader = computed(() => props.closePlacement === 'header' || props.closePlacement === 'header-end')
65
- const isFooter = computed(() => props.closePlacement === 'footer')
66
-
67
- const overlayCloseClass = computed(() => {
68
- if (props.closePlacement === 'overlay-end') { return 'top-1 end-1' }
69
- return 'top-1 start-1'
70
- })
71
-
72
- function closeModal() {
73
- isVisible.value = false
74
- setTimeout(() => { emit('update:visible', false) }, 200)
75
- }
76
-
77
- defineExpose({ closeModal })
78
-
79
- function openModal() {
80
- setTimeout(() => (isVisible.value = true), 1)
81
- }
82
-
83
- // Note: ESC key handling is now done centrally in ModalPlugin for proper stacking behavior
84
- </script>
85
-
86
- <template>
87
- <div
88
- class="bg-dark" :style="{ zIndex }" :class="{ 'is-side': side, 'is-active': isVisible, 'bg-lignt': false }"
89
- @click="() => (dismissable ? closeModal() : '')" @keydown.esc="closeModal"
90
- >
91
- <!-- Overlay close button -->
92
- <Btn
93
- v-if="dismissable && isOverlay" icon="close" icon-mobile-size="1.4" class="fixed"
94
- :class="overlayCloseClass" @click="closeModal"
95
- />
96
-
97
- <Card
98
- class="modal m_pt-0" :style="{ ...maxWidth, '--bgl-box-bg': 'var(--bgl-popup-bg)' }" :thin="thin"
99
- :class="{ 'pt-0': thin, 'pt-1': !thin, 'm_mt-5': isOverlay, 'display-flex column': side, 'm_px-1 m_pb-1': mobileThin }" @click.stop
100
- >
101
- <header v-if="slots.toolbar || title" class="tool-bar w-100p flex space-between sticky z-3 py-1">
102
- <!-- Header close button -->
103
- <Btn
104
- v-if="dismissable && isHeader && closePlacement === 'header'" :style="{ float: side ? '' : '' }"
105
- flat icon="close" thin icon-mobile-size="1.4" @click="closeModal"
106
- />
107
- <slot name="toolbar" />
108
- <Title
109
- v-if="title" class="modal-title txt-center txt20 medium my-0 w-100p ellipsis-1" tag="h3"
110
- :label="title"
111
- :class="{ 'me-1-5': isHeader && dismissable && closePlacement === 'header', 'ms-1-5': isHeader && dismissable && closePlacement === 'header-end' }"
112
- />
113
- <!-- Header-end close button -->
114
- <Btn
115
- v-if="dismissable && isHeader && closePlacement === 'header-end'"
116
- :style="{ float: side ? '' : '' }" flat icon="close" thin icon-mobile-size="1.4"
117
- @click="closeModal"
118
- />
119
- </header>
120
-
121
- <header
122
- v-else class="tool-bar w-100p flex space-between sticky z-3"
123
- :class="{ 'py-1': !isOverlay, 'pt-1': isOverlay }"
124
- >
125
- <!-- Header close button (no title) -->
126
- <Btn
127
- v-if="dismissable && isHeader && closePlacement === 'header'" :style="{ float: side ? '' : '' }"
128
- flat icon="close" thin icon-mobile-size="1.4" @click="closeModal"
129
- />
130
- <slot name="toolbar" />
131
- <!-- Header-end close button (no title) -->
132
- <Btn
133
- v-if="dismissable && isHeader && closePlacement === 'header-end'"
134
- :style="{ float: side ? '' : '' }" flat icon="close" thin icon-mobile-size="1.4" class="ms-auto"
135
- @click="closeModal"
136
- />
137
- </header>
138
-
139
- <slot />
140
- <footer
141
- v-if="slots.footer || actions?.length" class="modal-footer gap-1 flex space-between"
142
- :class="{ 'mt-1': !side, 'mt-auto': side }"
143
- >
144
- <Btn v-for="(action, i) in actions" :key="i" color="gray" v-bind="action" @click="closeModal" />
145
- <slot name="footer" />
146
- <!-- Footer close button -->
147
- </footer>
148
- <Btn
149
- v-if="dismissable && isFooter" icon="close" label="Close"
150
- class="mx-auto absolute start-0 end-0 modalFooterBtn" @click="closeModal"
151
- />
152
- </Card>
153
- </div>
154
- </template>
155
-
156
- <style>
157
- .modal {
158
- color: var(--bgl-popup-text);
159
- }
160
-
161
- .modal .bgl_btn.bgl_btn_flat {
162
- color: var(--bgl-popup-text) !important;
163
- }
164
-
165
- .modal .rich-text-editor .bgl_btn.bgl_btn_flat.active {
166
- color: var(--bgl-white) !important;
167
- }
168
- .modal-footer>div {
169
- gap: 1rem;
170
- display: flex;
171
- justify-content: space-between;
172
- align-items: center;
173
- }
174
-
175
- .modal-no-title {
176
- width: calc(100% + 2rem);
177
- border-radius: var(--card-border-radius);
178
- }
179
-
180
- .modalFooterBtn {
181
- bottom: calc(var(--btn-height) / 2 * -1);
182
-
183
- }
184
- </style>
@@ -1,42 +0,0 @@
1
- <script lang="ts" setup>
2
- import type { ThemeType } from '@bagelink/vue'
3
- import { Btn, Modal, useI18n } from '@bagelink/vue'
4
- import { computed } from 'vue'
5
-
6
- const props = defineProps<{
7
- title?: string
8
- message?: string
9
- confirmText?: string
10
- confirmBtnColor?: ThemeType
11
- cancelBtnColor?: ThemeType
12
- cancelText?: string
13
- resolve: (value: boolean) => void
14
- }>()
15
-
16
- const emit = defineEmits(['update:visible'])
17
- const { $t } = useI18n()
18
-
19
- function select(val: boolean) {
20
- props.resolve(val)
21
- emit('update:visible')
22
- }
23
-
24
- const title = computed(() => props.title || $t('modalConfirm.title'))
25
- const message = computed(() => props.message || $t('modalConfirm.message'))
26
- const confirmText = computed(() => props.confirmText || $t('modalConfirm.confirm'))
27
- const cancelText = computed(() => props.cancelText || $t('modalConfirm.cancel'))
28
- const confirmBtnColor = computed((): ThemeType => props.confirmBtnColor || 'green')
29
- const cancelBtnColor = computed((): ThemeType => props.cancelBtnColor || 'gray')
30
- </script>
31
-
32
- <template>
33
- <Modal :title="title" width="380px" :dismissable="false" class="txt-center" :zIndex="9999">
34
- <p class="pb-05 pretty">
35
- {{ message }}
36
- </p>
37
- <template #footer>
38
- <Btn :color="cancelBtnColor" :value="cancelText" @click="select(false)" />
39
- <Btn :color="confirmBtnColor" :value="confirmText" @click="select(true)" />
40
- </template>
41
- </Modal>
42
- </template>
@@ -1,102 +0,0 @@
1
- <script lang="ts" setup generic="T extends {[key:string]:any}, P extends Path<T>">
2
- import type { Path } from '@bagelink/vue'
3
- import type { ComponentExposed } from 'vue-component-type-helpers'
4
- import type { ModalFormOptions } from '../plugins/modalTypes'
5
- import { Btn, Modal, BagelForm } from '@bagelink/vue'
6
- import { ref } from 'vue'
7
-
8
- // eslint-disable-next-line vue/prop-name-casing
9
- const props = withDefaults(defineProps<ModalFormOptions<T>>(), {
10
- visible: true,
11
- dismissable: true,
12
- })
13
-
14
- const emit = defineEmits<{
15
- 'update:modelValue': [value: T]
16
- 'update:visible': [value: boolean]
17
- }>()
18
-
19
- const modal = ref<ComponentExposed<typeof Modal>>()
20
-
21
- const formData = defineModel<T>('modelValue', {
22
- default: {} as Partial<T>,
23
- })
24
-
25
- type BagelFormT = ComponentExposed<typeof BagelForm<T, P>>
26
-
27
- const form = ref<BagelFormT>()
28
- const closeModal = () => modal.value?.closeModal()
29
-
30
- const submitting = ref(false)
31
-
32
- async function runSubmit() {
33
- if (submitting.value) { return }
34
- if (form.value?.validateForm() === false) { return }
35
- submitting.value = true
36
- try {
37
- await props.onSubmit?.(formData.value)
38
- closeModal()
39
- } catch (err: any) {
40
- submitting.value = false
41
- if (props.onError) {
42
- props.onError(err)
43
- } else {
44
- console.error('[ModalForm] Submit error:', err)
45
- }
46
- }
47
- }
48
-
49
- function runDelete() {
50
- props.onDelete?.(formData.value)
51
- closeModal()
52
- }
53
-
54
- function setFormValues(values: { [key: string]: any }) {
55
- Object.assign(formData, values)
56
- }
57
-
58
- defineExpose({ setFormValues })
59
- </script>
60
-
61
- <template>
62
- <Modal
63
- ref="modal" :side :width :visible="visible" :dismissable :title
64
- @update:visible="($event: boolean) => emit('update:visible', $event)"
65
- >
66
- <template #toolbar>
67
- <slot name="toolbar" />
68
- </template>
69
- <BagelForm
70
- v-if="visible" ref="form" v-model="formData" :schema="schema"
71
- @update:modelValue="emit('update:modelValue', $event)" @submit="runSubmit"
72
- />
73
- <template v-if="onDelete || onSubmit" #footer>
74
- <div class="flex gap-0">
75
- <Btn thin flat :value="cancelText || 'Cancel'" @click="closeModal" />
76
- <Btn
77
- v-if="onDelete" thin icon="delete" flat :value="deleteText || 'Delete'" color="red"
78
- @click="runDelete"
79
- />
80
- </div>
81
- <div class="flex gap-05">
82
- <Btn
83
- v-if="onDuplicate" outline class="px-1" icon="copy_all" flat :value="duplicateText || 'Duplicate'"
84
- @click="onDuplicate?.(formData)"
85
- />
86
- <Btn v-if="onSubmit" :value="submitText || 'Submit'" @click="runSubmit" />
87
- </div>
88
- </template>
89
- </Modal>
90
- </template>
91
-
92
- <style scoped>
93
- .modal-title {
94
- margin-top: 0.5rem;
95
- }
96
-
97
- @media screen and (max-width: 910px) {
98
- .modal-title {
99
- margin-top: 1rem;
100
- }
101
- }
102
- </style>
@@ -1,149 +0,0 @@
1
- <script setup lang="ts">
2
- import type { IconType, ThemeType } from '@bagelink/vue'
3
- import type { SetupContext } from 'vue'
4
- import { Btn, Icon } from '@bagelink/vue'
5
- import { computed, useSlots } from 'vue'
6
- import '../styles/base-colors.css'
7
-
8
- interface BtnProp {
9
- icon?: IconType
10
- onClick: () => void
11
- value?: string
12
- }
13
-
14
- const props = defineProps<{
15
- disabled?: boolean
16
- icon?: IconType
17
- iconEnd?: IconType
18
- color?: ThemeType
19
- theme?: ThemeType
20
- flat?: boolean
21
- border?: boolean
22
- outline?: boolean
23
- loading?: boolean
24
- value?: string
25
- modelValue?: string
26
- round?: boolean
27
- btn?: BtnProp
28
- btnEnd?: BtnProp
29
- large?: boolean
30
- small?: boolean
31
- uppercase?: boolean
32
- }>()
33
-
34
- const slots: SetupContext['slots'] = useSlots()
35
-
36
- const computedTheme = computed(
37
- () => {
38
- if (props.disabled) { return 'gray-light' }
39
- return (props.color || props.theme) as ThemeType
40
- },
41
- )
42
-
43
- const computedPairClass = computed(() => {
44
- const theme = computedTheme.value
45
- if (!theme) return 'pair-primary'
46
- return `pair-${theme}`
47
- })
48
-
49
- const computedClasses = computed(() => {
50
- const classes: Record<string, boolean> = {
51
- 'bgl_pill': !props.icon || !!slots.default || !!props.value,
52
- 'round': props.round,
53
- 'bgl_flatPill': props.flat,
54
- 'bgl_pill-border': props.border || props.outline,
55
- 'pillLarge': props.large,
56
- 'pillSmall': props.small,
57
- }
58
-
59
- // Add the pair class
60
- classes[computedPairClass.value] = true
61
-
62
- return classes
63
- })
64
- </script>
65
-
66
- <template>
67
- <div
68
- class="bgl_pill"
69
- style="height: var(--pill-height);"
70
- :disabled="disabled"
71
- :class="computedClasses"
72
- >
73
- <div class="flex h-100 justify-content-center relative ">
74
- <div v-if="loading" class="loading absolute inset-0 mx-auto" />
75
- <div class="px-025 flex gap-025 justify-content-center" :class="{ 'opacity-0': loading }">
76
- <Btn v-if="btn" class="bgl_pill-btn -ms-025" icon-size="0.8" round v-bind="btn" />
77
- <Icon v-if="icon" class="line-height-0" :icon="icon" style="font-size: var(--pill-font-size)" />
78
- <slot :class="{ uppercase }" />
79
- <template v-if="!slots.default">
80
- <p class="pillText inline" :class="{ uppercase }">
81
- {{ slots.default ? slots.default : value || modelValue }}
82
- </p>
83
- </template>
84
- <Icon v-if="iconEnd" class="line-height-0" :icon="iconEnd" style="font-size: var(--pill-font-size)" />
85
- <Btn v-if="btnEnd" class="bgl_pill-btn -me-025" icon-size="0.8" round v-bind="btnEnd" />
86
- </div>
87
- </div>
88
- </div>
89
- </template>
90
-
91
- <style scoped>
92
- .pillLarge{
93
- --pill-font-size: var(--bgl-font-size);
94
- --pill-height:auto;
95
- }
96
- .pillSmall{
97
- --pill-font-size: 9px;
98
- --pill-height:15px;
99
- }
100
- .pillText{
101
- font-size: var(--pill-font-size);
102
- }
103
- .bgl_pill-btn{
104
- color: var(--pill-btn-color);
105
- background: var(--pill-btn-bg);
106
- width: calc(var(--pill-height) / 1.25)!important;
107
- height: calc(var(--pill-height) / 1.25)!important;
108
- }
109
- .loading {
110
- border: 1px solid var(--bgl-light-text);
111
- border-bottom: 2px solid var(--bgl-light-text);
112
- animation: spin 1s linear infinite;
113
- border-radius: 100px;
114
- width: 1rem;
115
- height: 1rem;
116
- margin: auto;
117
- }
118
- .bgl_flatPill .loading {
119
- border-bottom: 2px solid var(--bgl-text-color);
120
- }
121
-
122
- @keyframes spin {
123
- 0% {
124
- transform: rotate(0deg);
125
- }
126
- 100% {
127
- transform: rotate(360deg);
128
- }
129
- }
130
-
131
- .bgl_pill {
132
- padding-inline: calc(var(--pill-font-size) / 6);
133
- padding-block: calc(var(--pill-font-size) / 24);
134
- transition: var(--bgl-transition);
135
- display: inline-block;
136
- margin-inline-end: 0.25rem;
137
- border-radius: var(--pill-border-radius);
138
- min-height: var(--pill-height);
139
- vertical-align: middle;
140
- }
141
-
142
- .bgl_pill[disabled="true"] {
143
- opacity: 0.5;
144
- cursor: not-allowed;
145
- }
146
- .bgl_pill.round {
147
- border-radius: 1000px;
148
- }
149
- </style>