@bagelink/vue 0.0.823 → 0.0.827

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.
package/dist/style.css CHANGED
@@ -1188,10 +1188,10 @@ p {
1188
1188
  }
1189
1189
  .resize-observer[data-v-b329ee4c]{position:absolute;top:0;left:0;z-index:-1;width:100%;height:100%;border:none;background-color:transparent;pointer-events:none;display:block;overflow:hidden;opacity:0}.resize-observer[data-v-b329ee4c] object{display:block;position:absolute;top:0;left:0;height:100%;width:100%;overflow:hidden;pointer-events:none;z-index:-1}.v-popper__popper{z-index:10000;top:0;left:0;outline:none}.v-popper__popper.v-popper__popper--hidden{visibility:hidden;opacity:0;transition:opacity .15s,visibility .15s;pointer-events:none}.v-popper__popper.v-popper__popper--shown{visibility:visible;opacity:1;transition:opacity .15s}.v-popper__popper.v-popper__popper--skip-transition,.v-popper__popper.v-popper__popper--skip-transition>.v-popper__wrapper{transition:none!important}.v-popper__backdrop{position:absolute;top:0;left:0;width:100%;height:100%;display:none}.v-popper__inner{position:relative;box-sizing:border-box;overflow-y:auto}.v-popper__inner>div{position:relative;z-index:1;max-width:inherit;max-height:inherit}.v-popper__arrow-container{position:absolute;width:10px;height:10px}.v-popper__popper--arrow-overflow .v-popper__arrow-container,.v-popper__popper--no-positioning .v-popper__arrow-container{display:none}.v-popper__arrow-inner,.v-popper__arrow-outer{border-style:solid;position:absolute;top:0;left:0;width:0;height:0}.v-popper__arrow-inner{visibility:hidden;border-width:7px}.v-popper__arrow-outer{border-width:6px}.v-popper__popper[data-popper-placement^=top] .v-popper__arrow-inner,.v-popper__popper[data-popper-placement^=bottom] .v-popper__arrow-inner{left:-2px}.v-popper__popper[data-popper-placement^=top] .v-popper__arrow-outer,.v-popper__popper[data-popper-placement^=bottom] .v-popper__arrow-outer{left:-1px}.v-popper__popper[data-popper-placement^=top] .v-popper__arrow-inner,.v-popper__popper[data-popper-placement^=top] .v-popper__arrow-outer{border-bottom-width:0;border-left-color:transparent!important;border-right-color:transparent!important;border-bottom-color:transparent!important}.v-popper__popper[data-popper-placement^=top] .v-popper__arrow-inner{top:-2px}.v-popper__popper[data-popper-placement^=bottom] .v-popper__arrow-container{top:0}.v-popper__popper[data-popper-placement^=bottom] .v-popper__arrow-inner,.v-popper__popper[data-popper-placement^=bottom] .v-popper__arrow-outer{border-top-width:0;border-left-color:transparent!important;border-right-color:transparent!important;border-top-color:transparent!important}.v-popper__popper[data-popper-placement^=bottom] .v-popper__arrow-inner{top:-4px}.v-popper__popper[data-popper-placement^=bottom] .v-popper__arrow-outer{top:-6px}.v-popper__popper[data-popper-placement^=left] .v-popper__arrow-inner,.v-popper__popper[data-popper-placement^=right] .v-popper__arrow-inner{top:-2px}.v-popper__popper[data-popper-placement^=left] .v-popper__arrow-outer,.v-popper__popper[data-popper-placement^=right] .v-popper__arrow-outer{top:-1px}.v-popper__popper[data-popper-placement^=right] .v-popper__arrow-inner,.v-popper__popper[data-popper-placement^=right] .v-popper__arrow-outer{border-left-width:0;border-left-color:transparent!important;border-top-color:transparent!important;border-bottom-color:transparent!important}.v-popper__popper[data-popper-placement^=right] .v-popper__arrow-inner{left:-4px}.v-popper__popper[data-popper-placement^=right] .v-popper__arrow-outer{left:-6px}.v-popper__popper[data-popper-placement^=left] .v-popper__arrow-container{right:-10px}.v-popper__popper[data-popper-placement^=left] .v-popper__arrow-inner,.v-popper__popper[data-popper-placement^=left] .v-popper__arrow-outer{border-right-width:0;border-top-color:transparent!important;border-right-color:transparent!important;border-bottom-color:transparent!important}.v-popper__popper[data-popper-placement^=left] .v-popper__arrow-inner{left:-2px}.v-popper--theme-tooltip .v-popper__inner{background:rgba(0,0,0,.8);color:#fff;border-radius:6px;padding:7px 12px 6px}.v-popper--theme-tooltip .v-popper__arrow-outer{border-color:#000c}.v-popper--theme-dropdown .v-popper__inner{background:#fff;color:#000;border-radius:6px;border:1px solid #ddd;box-shadow:0 6px 30px #0000001a}.v-popper--theme-dropdown .v-popper__arrow-inner{visibility:visible;border-color:#fff}.v-popper--theme-dropdown .v-popper__arrow-outer{border-color:#ddd}
1190
1190
 
1191
- .selectinput[data-v-94b45d29] {
1191
+ .selectinput[data-v-e3164caf] {
1192
1192
  width: 100%;
1193
1193
  }
1194
- .selectinput-option[data-v-94b45d29] {
1194
+ .selectinput-option[data-v-e3164caf] {
1195
1195
  padding: 6px 12px;
1196
1196
  cursor: pointer;
1197
1197
  border-radius: 5px;
@@ -1203,23 +1203,23 @@ p {
1203
1203
  font-size: var(--input-font-size);
1204
1204
  margin-block: 0.15rem;
1205
1205
  }
1206
- .selectinput-option .bgl_icon-font[data-v-94b45d29]{
1206
+ .selectinput-option .bgl_icon-font[data-v-e3164caf]{
1207
1207
  line-height: normal;
1208
1208
  }
1209
- .selectinput-options.multiselect .selectinput-option[data-v-94b45d29] {
1209
+ .selectinput-options.multiselect .selectinput-option[data-v-e3164caf] {
1210
1210
  grid-template-columns: 10px 1fr;
1211
1211
  }
1212
- .selectinput-options[data-v-94b45d29] {
1212
+ .selectinput-options[data-v-e3164caf] {
1213
1213
  max-height: 300px;
1214
1214
  overflow-y: auto;
1215
1215
  }
1216
- .selectinput-option[data-v-94b45d29]:hover {
1216
+ .selectinput-option[data-v-e3164caf]:hover {
1217
1217
  background: var(--bgl-gray-20);
1218
1218
  }
1219
- .isEmpty p[data-v-94b45d29] {
1219
+ .isEmpty p[data-v-e3164caf] {
1220
1220
  opacity: 0.3;
1221
1221
  }
1222
- .selected[data-v-94b45d29]{
1222
+ .selected[data-v-e3164caf]{
1223
1223
  /* background: var(--bgl-primary-tint); */
1224
1224
  background: var(--bgl-selected);
1225
1225
  }
@@ -1814,27 +1814,27 @@ p {
1814
1814
  transform: translateX(-20px);
1815
1815
  }
1816
1816
 
1817
- .skeleton-wrap[data-v-a06bec19] {
1818
- --skeleton-radius: 0.25rem;
1819
- --skeleton-bg: #f0f0f0;
1820
- --skeleton-margin: 1rem;
1817
+ .skeleton-wrap[data-v-9a44f23a] {
1821
1818
  margin-bottom: var(--skeleton-margin);
1822
1819
  }
1823
- .skeleton[data-v-a06bec19] {
1824
- animation: skeleton-a06bec19 2s infinite;
1820
+ .skeleton[data-v-9a44f23a] {
1825
1821
  background-color: var(--skeleton-bg);
1826
1822
  border-radius: var(--bg-card-radius);
1827
1823
  margin-bottom: 0.25em;
1824
+ position: relative;
1825
+ overflow: hidden;
1828
1826
  }
1829
- @keyframes skeleton-a06bec19 {
1830
- 0% {
1831
- opacity: 0.5;
1832
- }
1833
- 50% {
1834
- opacity: 1;
1827
+ .skeleton[data-v-9a44f23a]::before {
1828
+ content: "";
1829
+ background: linear-gradient(90deg, transparent 20%, var(--skeleton-pulse) 50%, transparent 80%);
1830
+ animation: loadingAnimation-9a44f23a 1s ease-in-out infinite;
1831
+ position: absolute;
1832
+ inset: 0px;
1833
+ transform: translateX(-100%);
1835
1834
  }
1836
- 100% {
1837
- opacity: 0.5;
1835
+ @keyframes loadingAnimation-9a44f23a {
1836
+ to {
1837
+ transform: translateX(100%);
1838
1838
  }
1839
1839
  }
1840
1840
 
@@ -13225,7 +13225,9 @@ body:has([class*="slide-fade"])::-webkit-scrollbar {
13225
13225
  --bgl-scrollbar-thumb: var(--bgl-gray);
13226
13226
  --pill-btn-color: var(--bgl-white);
13227
13227
  --pill-btn-bg: var(--placeholder-color);
13228
- --bgl-selected: var(--bgl-gray-light)
13228
+ --bgl-selected: var(--bgl-gray-light);
13229
+ --skeleton-bg: #f0f0f0;
13230
+ --skeleton-pulse: var(--bgl-bg);
13229
13231
  }
13230
13232
  /* TYPE */
13231
13233
  :root {
@@ -13244,6 +13246,8 @@ body:has([class*="slide-fade"])::-webkit-scrollbar {
13244
13246
  --btn-height: 40px;
13245
13247
  --pill-border-radius: 8px;
13246
13248
  --pill-height: 30px;
13249
+ --skeleton-radius: 0.25rem;
13250
+ --skeleton-margin: 1rem;
13247
13251
  }
13248
13252
  /* MISC */
13249
13253
  :root {
@@ -16,6 +16,7 @@ interface TextInputOptions extends InputOptions {
16
16
  interface SlctInputOptions extends InputOptions {
17
17
  searchable?: boolean;
18
18
  multiselect?: boolean;
19
+ onSearch?: (search: string) => any;
19
20
  }
20
21
  interface NumFieldOptions extends InputOptions {
21
22
  max?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"BagelFormUtils.d.ts","sourceRoot":"","sources":["../../src/utils/BagelFormUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BagelFormUtils.d.ts","sourceRoot":"","sources":["../../src/utils/BagelFormUtils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bagelink/vue",
3
3
  "type": "module",
4
- "version": "0.0.823",
4
+ "version": "0.0.827",
5
5
  "description": "Bagel core sdk packages",
6
6
  "author": {
7
7
  "name": "Neveh Allon",
@@ -2,6 +2,7 @@
2
2
  import {
3
3
  Btn,
4
4
  Card,
5
+ Skeleton,
5
6
  Dropdown,
6
7
  Icon,
7
8
  type MaterialIcons,
@@ -26,9 +27,10 @@ const props = defineProps<{
26
27
  defaultValue?: Option
27
28
  clearable?: boolean
28
29
  searchPlaceholder?: string
30
+ onSearch?: (search: string) => Promise<Option[]>
29
31
  }>()
30
32
 
31
- const emit = defineEmits(['update:modelValue'])
33
+ const emit = defineEmits(['update:modelValue']) // Add 'search' event
32
34
 
33
35
  const searchPlaceholder = $computed(() => props.searchPlaceholder || 'Search')
34
36
 
@@ -60,17 +62,35 @@ const selectedLabel = $computed((): string => {
60
62
  return selectedItems.map(item => getLabel(item)).join(', ')
61
63
  })
62
64
 
63
- const filteredOptions = $computed(() => props.options.filter((option) => {
64
- const searchTerm = search
65
- .split(/\s+/)
66
- .filter(Boolean)
67
- .map(t => new RegExp(t.replaceAll(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gi'))
68
- return (
69
- Boolean(option)
70
- && (searchTerm.every(s => getLabel(option).match(s))
65
+ let serverOptions: Option[] = $ref([])
66
+ let isSearching = $ref(false)
67
+
68
+ async function runServerSearch() {
69
+ if (props.onSearch !== undefined) {
70
+ isSearching = true
71
+ serverOptions = await props.onSearch(search)
72
+ isSearching = false
73
+ }
74
+ }
75
+
76
+ const filteredOptions = $computed(() => {
77
+ if (props.onSearch !== undefined) {
78
+ if (isSearching) return []
79
+ if (search.trim().length) return serverOptions
80
+ return props.options
81
+ }
82
+ return props.options.filter((option) => {
83
+ const searchTerm = search
84
+ .split(/\s+/)
85
+ .filter(Boolean)
86
+ .map(t => new RegExp(t.replaceAll(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'gi'))
87
+ return (
88
+ Boolean(option)
89
+ && (searchTerm.every(s => getLabel(option).match(s))
90
+ )
71
91
  )
72
- )
73
- }))
92
+ })
93
+ })
74
94
 
75
95
  const isSelected = (option: Option) => selectedItems.find(item => getValue(option) === getValue(item)) !== undefined
76
96
 
@@ -87,7 +107,7 @@ function updateOpen(visible: boolean) {
87
107
  if (props.searchable && !props.multiselect && selectedItemCount) search = selectedLabel as string
88
108
  setTimeout(
89
109
  () => (searchInput as any)?.$el?.querySelector('input')?.focus(),
90
- 350,
110
+ 100,
91
111
  )
92
112
  }
93
113
  }
@@ -176,6 +196,7 @@ watch(
176
196
  )
177
197
 
178
198
  onMounted(() => {
199
+ console.log('mounted')
179
200
  if (props.defaultValue !== undefined) {
180
201
  const defaultOption = props.options.find(
181
202
  o => getValue(o) === getValue(props.defaultValue),
@@ -193,6 +214,7 @@ onMounted(() => {
193
214
  ref="dropdown"
194
215
  placement="bottom-start"
195
216
  class="bagel-input selectinput"
217
+ noAutoFocus
196
218
  @hide="updateOpen(false)"
197
219
  >
198
220
  <template #trigger>
@@ -207,6 +229,7 @@ onMounted(() => {
207
229
  dense
208
230
  :placeholder="searchPlaceholder"
209
231
  icon="search"
232
+ @debounce="runServerSearch"
210
233
  @input="selected = false"
211
234
  />
212
235
  <button
@@ -249,6 +272,7 @@ onMounted(() => {
249
272
  </div>
250
273
  </label>
251
274
  </template>
275
+ <Skeleton v-if="isSearching" :count="3" width="230px" height="30px" class="mx-1 my-05" />
252
276
  <Card
253
277
  class="p-05"
254
278
  :style="{ width: fullWidth ? '100%' : 'auto' }"
@@ -4,11 +4,15 @@ const {
4
4
  height = '50px',
5
5
  width = 'auto',
6
6
  borderRadius = 'var(--skeleton-radius)',
7
+ round = false,
8
+ class: className = '',
7
9
  } = defineProps<{
8
- count?: number
10
+ count?: number | string
9
11
  height?: string
10
12
  width?: string
13
+ round?: boolean
11
14
  borderRadius?: string
15
+ class?: string
12
16
  }>()
13
17
  import { useSlots } from 'vue'
14
18
 
@@ -16,37 +20,39 @@ const slots = useSlots()
16
20
  </script>
17
21
 
18
22
  <template>
19
- <template v-for="i in count" :key="i">
20
- <div v-if="slots.default" class="skeleton-wrap">
23
+ <template v-for="i in +count" :key="i">
24
+ <div v-if="slots.default" class="skeleton-wrap" :class="className">
21
25
  <slot />
22
26
  </div>
23
- <div v-else class="skeleton" :style="{ height, width, borderRadius }" />
27
+ <div v-else class="skeleton" :style="{ height, width, borderRadius }" :class="{ round, [className as string]: true }" />
24
28
  </template>
25
29
  </template>
26
30
 
27
31
  <style scoped>
28
32
  .skeleton-wrap {
29
- --skeleton-radius: 0.25rem;
30
- --skeleton-bg: #f0f0f0;
31
- --skeleton-margin: 1rem;
32
33
  margin-bottom: var(--skeleton-margin);
33
34
  }
35
+
34
36
  .skeleton {
35
- animation: skeleton 2s infinite;
36
37
  background-color: var(--skeleton-bg);
37
38
  border-radius: var(--bg-card-radius);
38
39
  margin-bottom: 0.25em;
40
+ position: relative;
41
+ overflow: hidden;
42
+ }
43
+
44
+ .skeleton::before {
45
+ content: "";
46
+ background: linear-gradient(90deg, transparent 20%, var(--skeleton-pulse) 50%, transparent 80%);
47
+ animation: loadingAnimation 1s ease-in-out infinite;
48
+ position: absolute;
49
+ inset: 0px;
50
+ transform: translateX(-100%);
39
51
  }
40
52
 
41
- @keyframes skeleton {
42
- 0% {
43
- opacity: 0.5;
44
- }
45
- 50% {
46
- opacity: 1;
47
- }
48
- 100% {
49
- opacity: 0.5;
50
- }
53
+ @keyframes loadingAnimation {
54
+ to {
55
+ transform: translateX(100%);
56
+ }
51
57
  }
52
58
  </style>
@@ -36,7 +36,9 @@
36
36
  --bgl-scrollbar-thumb: var(--bgl-gray);
37
37
  --pill-btn-color: var(--bgl-white);
38
38
  --pill-btn-bg: var(--placeholder-color);
39
- --bgl-selected: var(--bgl-gray-light)
39
+ --bgl-selected: var(--bgl-gray-light);
40
+ --skeleton-bg: #f0f0f0;
41
+ --skeleton-pulse: var(--bgl-bg);
40
42
  }
41
43
 
42
44
  /* TYPE */
@@ -57,6 +59,8 @@
57
59
  --btn-height: 40px;
58
60
  --pill-border-radius: 8px;
59
61
  --pill-height: 30px;
62
+ --skeleton-radius: 0.25rem;
63
+ --skeleton-margin: 1rem;
60
64
  }
61
65
 
62
66
  /* MISC */
@@ -21,6 +21,7 @@ interface TextInputOptions extends InputOptions {
21
21
  interface SlctInputOptions extends InputOptions {
22
22
  searchable?: boolean
23
23
  multiselect?: boolean
24
+ onSearch?: (search: string) => any
24
25
  }
25
26
 
26
27
  interface NumFieldOptions extends InputOptions {
@@ -80,6 +81,7 @@ export function slctField(
80
81
  label?: string,
81
82
  options?: Option[] | (() => Option[]),
82
83
  config?: SlctInputOptions,
84
+
83
85
  ): Field {
84
86
  return {
85
87
  $el: 'select',
@@ -94,6 +96,7 @@ export function slctField(
94
96
  disabled: config?.disabled,
95
97
  searchable: config?.searchable,
96
98
  multiselect: config?.multiselect,
99
+ onSearch: config?.onSearch,
97
100
  },
98
101
  }
99
102
  }