@icij/murmur-next 4.0.1 → 4.0.3

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 (62) hide show
  1. package/lib/components/AccordionStep.vue +53 -42
  2. package/lib/components/AccordionWrapper.vue +25 -24
  3. package/lib/components/ActiveTextTruncate.vue +44 -22
  4. package/lib/components/AdvancedLinkForm.vue +96 -46
  5. package/lib/components/Brand.vue +30 -23
  6. package/lib/components/BrandExpansion.vue +12 -3
  7. package/lib/components/ConfirmButton.vue +30 -26
  8. package/lib/components/ContentPlaceholder.vue +11 -7
  9. package/lib/components/CustomPagination.vue +50 -32
  10. package/lib/components/DigitsInput.vue +64 -60
  11. package/lib/components/DonateForm.vue +112 -83
  12. package/lib/components/EmbedForm.vue +37 -21
  13. package/lib/components/EmbeddableFooter.vue +14 -10
  14. package/lib/components/FollowUsPopover.vue +42 -40
  15. package/lib/components/GenericFooter.vue +98 -23
  16. package/lib/components/GenericHeader.vue +66 -29
  17. package/lib/components/HapticCopy.vue +41 -29
  18. package/lib/components/ImddbHeader.vue +113 -92
  19. package/lib/components/OrdinalLegend.vue +43 -20
  20. package/lib/components/RangePicker.vue +63 -42
  21. package/lib/components/ResponsiveIframe.vue +9 -2
  22. package/lib/components/ScaleLegend.vue +56 -18
  23. package/lib/components/SecretInput.vue +7 -8
  24. package/lib/components/SelectableDropdown.vue +119 -74
  25. package/lib/components/SharingOptions.vue +93 -36
  26. package/lib/components/SharingOptionsLink.vue +11 -5
  27. package/lib/components/SignUpForm.vue +44 -23
  28. package/lib/components/SlideUpDown.vue +7 -2
  29. package/lib/components/TexturedDeck.vue +24 -14
  30. package/lib/components/TinyPagination.vue +35 -22
  31. package/lib/composables/chart.ts +174 -157
  32. package/lib/composables/resizeObserver.ts +29 -29
  33. package/lib/composables/sendEmail.ts +53 -42
  34. package/lib/config.default.ts +17 -10
  35. package/lib/config.ts +34 -27
  36. package/lib/datavisualisations/BarChart.vue +48 -42
  37. package/lib/datavisualisations/ColumnChart.vue +133 -89
  38. package/lib/datavisualisations/LineChart.vue +79 -57
  39. package/lib/datavisualisations/StackedBarChart.vue +116 -68
  40. package/lib/datavisualisations/StackedColumnChart.vue +196 -115
  41. package/lib/enums.ts +25 -15
  42. package/lib/i18n.ts +3 -3
  43. package/lib/keys.ts +2 -2
  44. package/lib/main.ts +14 -10
  45. package/lib/maps/ChoroplethMap.vue +299 -160
  46. package/lib/maps/ChoroplethMapAnnotation.vue +29 -18
  47. package/lib/maps/SymbolMap.vue +194 -123
  48. package/lib/shims-bootstrap-vue.d.ts +1 -1
  49. package/lib/shims-vue.d.ts +3 -3
  50. package/lib/styles/functions.scss +10 -6
  51. package/lib/styles/lib.scss +2 -4
  52. package/lib/styles/mixins.scss +8 -8
  53. package/lib/styles/utilities.scss +1 -1
  54. package/lib/styles/variables.scss +24 -18
  55. package/lib/types.ts +26 -10
  56. package/lib/utils/animation.ts +4 -4
  57. package/lib/utils/assets.ts +31 -28
  58. package/lib/utils/clipboard.ts +16 -10
  59. package/lib/utils/iframe-resizer.ts +18 -13
  60. package/lib/utils/placeholder.ts +54 -23
  61. package/lib/utils/placeholderTypes.ts +3 -3
  62. package/package.json +7 -2
@@ -1,8 +1,17 @@
1
1
  <script lang="ts">
2
- import {isFunction, isString} from 'lodash'
2
+ import { isFunction, isString } from 'lodash'
3
3
  import * as d3 from 'd3'
4
4
  import * as scaleFunctions from 'd3-scale'
5
- import {defineComponent, PropType, ref, computed, onMounted, watch, nextTick, toRef} from 'vue'
5
+ import {
6
+ defineComponent,
7
+ PropType,
8
+ ref,
9
+ computed,
10
+ onMounted,
11
+ watch,
12
+ nextTick,
13
+ toRef
14
+ } from 'vue'
6
15
 
7
16
  type ClassListLegend = { 'scale-legend--has-cursor': boolean }
8
17
  // eslint-disable-next-line no-unused-vars
@@ -39,7 +48,9 @@ export default defineComponent({
39
48
  type: [Function, String] as PropType<ColorScaleFn | string>,
40
49
  default: 'scaleLinear',
41
50
  validator(colorScale: ColorScale) {
42
- return isFunction(colorScale) || (colorScale as string) in scaleFunctions
51
+ return (
52
+ isFunction(colorScale) || (colorScale as string) in scaleFunctions
53
+ )
43
54
  }
44
55
  },
45
56
  colorScaleEnd: {
@@ -76,7 +87,11 @@ export default defineComponent({
76
87
  return isNaN(left) ? '0%' : `${left}%`
77
88
  })
78
89
  const colorScaleBaseCanvas = computed((): HTMLCanvasElement | null => {
79
- return d3.create('canvas').attr('width', props.width).attr('height', props.height).node()
90
+ return d3
91
+ .create('canvas')
92
+ .attr('width', props.width)
93
+ .attr('height', props.height)
94
+ .node()
80
95
  })
81
96
  const colorScaleContext = computed((): CanvasRenderingContext2D | null => {
82
97
  return colorScaleBaseCanvas.value?.getContext('2d') ?? null
@@ -97,12 +112,18 @@ export default defineComponent({
97
112
  if (isString(props.colorScale)) {
98
113
  // @ts-ignore
99
114
  const fn: () => any = scaleFunctions[props.colorScale]
100
- return fn().domain([props.min, props.max]).range([props.colorScaleStart, props.colorScaleEnd])
115
+ return fn()
116
+ .domain([props.min, props.max])
117
+ .range([props.colorScaleStart, props.colorScaleEnd])
101
118
  }
102
119
  return props.colorScale
103
120
  })
104
121
  const cursorLeftScale = computed((): d3.ScaleLinear<number, number> => {
105
- return d3.scaleLinear().domain([props.min, props.max]).range([0, 100]).interpolate(d3.interpolateRound)
122
+ return d3
123
+ .scaleLinear()
124
+ .domain([props.min, props.max])
125
+ .range([0, 100])
126
+ .interpolate(d3.interpolateRound)
106
127
  })
107
128
  const widthScaleColor = computed((): WidthScaleFn => {
108
129
  return (x: number) => {
@@ -111,7 +132,10 @@ export default defineComponent({
111
132
  }
112
133
  })
113
134
  const widthScale = computed((): d3.ScaleLinear<number, number> => {
114
- return d3.scaleLinear().domain([0, props.width]).range([props.min, props.max])
135
+ return d3
136
+ .scaleLinear()
137
+ .domain([0, props.width])
138
+ .range([props.min, props.max])
115
139
  })
116
140
 
117
141
  const formatNumber = d3.format(',')
@@ -119,8 +143,10 @@ export default defineComponent({
119
143
  function setCursorWrapperOffset(): void {
120
144
  const cursor = el.value?.querySelector('.scale-legend__cursor')
121
145
  if (cursor && el.value) {
122
- const {x: cursorX, width: cursorWidth} = cursor.getBoundingClientRect()
123
- const {x: legendX, width: legendWidth} = el.value.getBoundingClientRect()
146
+ const { x: cursorX, width: cursorWidth } =
147
+ cursor.getBoundingClientRect()
148
+ const { x: legendX, width: legendWidth } =
149
+ el.value.getBoundingClientRect()
124
150
  const left = legendX - cursorX - 6
125
151
  const right = legendX + legendWidth - (cursorX + cursorWidth) + 6
126
152
  cursorWrapperOffset.value = Math.max(0, left) || Math.min(0, right)
@@ -139,11 +165,10 @@ export default defineComponent({
139
165
  }
140
166
  }
141
167
 
142
- watch(cursorValue,
143
- async () => {
144
- await nextTick()
145
- setCursorWrapperOffset()
146
- })
168
+ watch(cursorValue, async () => {
169
+ await nextTick()
170
+ setCursorWrapperOffset()
171
+ })
147
172
 
148
173
  return {
149
174
  classList,
@@ -155,7 +180,7 @@ export default defineComponent({
155
180
  //CD: function below are only uses in unit tests. use callable?
156
181
  widthScale,
157
182
  colorScaleFunction,
158
- widthScaleColor,
183
+ widthScaleColor
159
184
  }
160
185
  }
161
186
  })
@@ -168,14 +193,27 @@ export default defineComponent({
168
193
  {{ formatNumber(min) }}
169
194
  </slot>
170
195
  </div>
171
- <img :height="height" :src="colorScaleBase64" :width="width" class="scale-legend__scale" alt="legend scale"/>
196
+ <img
197
+ :height="height"
198
+ :src="colorScaleBase64"
199
+ :width="width"
200
+ class="scale-legend__scale"
201
+ alt="legend scale"
202
+ />
172
203
  <div class="scale-legend__bound scale-legend__bound--max">
173
204
  <slot name="legend-cursor-max" v-bind="{ max }">
174
205
  {{ formatNumber(max) }}
175
206
  </slot>
176
207
  </div>
177
- <div v-if="hasCursor" :style="{ left: cursorLeft }" class="scale-legend__cursor">
178
- <div :style="{ transform: `translateX(${cursorWrapperOffset}px)` }" class="scale-legend__cursor__wrapper">
208
+ <div
209
+ v-if="hasCursor"
210
+ :style="{ left: cursorLeft }"
211
+ class="scale-legend__cursor"
212
+ >
213
+ <div
214
+ :style="{ transform: `translateX(${cursorWrapperOffset}px)` }"
215
+ class="scale-legend__cursor__wrapper"
216
+ >
179
217
  <slot name="cursor" v-bind="{ value: cursorValue }">
180
218
  {{ formatNumber(cursorValue) }}
181
219
  </slot>
@@ -1,7 +1,7 @@
1
1
  <script lang="ts">
2
2
  import { faEye, faEyeSlash } from '@fortawesome/free-regular-svg-icons'
3
3
 
4
- import { computed,ref,onBeforeMount, watch,defineComponent} from 'vue'
4
+ import { computed, ref, onBeforeMount, watch, defineComponent } from 'vue'
5
5
  import { library, default as Fa } from './Fa'
6
6
  import HapticCopy from './HapticCopy.vue'
7
7
 
@@ -49,12 +49,12 @@ export default defineComponent({
49
49
  type: Boolean
50
50
  }
51
51
  },
52
- emits:['update:visible'],
53
- setup(props,{emit}){
54
- onBeforeMount(() =>{
52
+ emits: ['update:visible'],
53
+ setup(props, { emit }) {
54
+ onBeforeMount(() => {
55
55
  library.add(faEye, faEyeSlash)
56
56
  })
57
- const secretInput = ref<HTMLInputElement|null>(null)
57
+ const secretInput = ref<HTMLInputElement | null>(null)
58
58
  const inputType = computed(() => {
59
59
  return props.visible ? 'text' : 'password'
60
60
  })
@@ -62,10 +62,9 @@ export default defineComponent({
62
62
  return props.visible ? ['far', 'eye-slash'] : ['far', 'eye']
63
63
  })
64
64
  const hapticCopyClassList = computed(() => {
65
- return `btn-${props.hapticCopyVariant}`
65
+ return `btn-${props.hapticCopyVariant}`
66
66
  })
67
67
 
68
-
69
68
  function toggle() {
70
69
  /**
71
70
  * Emitted when the visibility of the input changes.
@@ -73,7 +72,7 @@ export default defineComponent({
73
72
  * @event update:visible
74
73
  * @type {Boolean}
75
74
  */
76
- emit("update:visible", !props.visible)
75
+ emit('update:visible', !props.visible)
77
76
  }
78
77
  function selectInput() {
79
78
  if (props.visible) {
@@ -10,12 +10,20 @@ import { faCheckSquare, faSquare } from '@fortawesome/free-regular-svg-icons'
10
10
  import { RecycleScroller } from 'vue-virtual-scroller'
11
11
 
12
12
  import Fa from './Fa'
13
- import {defineComponent, ref, computed, watch, onMounted, onUnmounted,PropType } from 'vue'
13
+ import {
14
+ defineComponent,
15
+ ref,
16
+ computed,
17
+ watch,
18
+ onMounted,
19
+ onUnmounted,
20
+ PropType
21
+ } from 'vue'
14
22
 
15
23
  const KEY_ESC_CODE = 27
16
24
  const KEY_UP_CODE = 38
17
25
  const KEY_DOWN_CODE = 40
18
- type Item = any;
26
+ type Item = any
19
27
  export default defineComponent({
20
28
  name: 'SelectableDropdown',
21
29
  components: {
@@ -108,74 +116,90 @@ export default defineComponent({
108
116
  default: 'inherit'
109
117
  }
110
118
  },
111
- emits:['click','update:modelValue', 'deactivate'],
112
- setup(props,{emit}){
113
- onMounted(()=> {
119
+ emits: ['click', 'update:modelValue', 'deactivate'],
120
+ setup(props, { emit }) {
121
+ onMounted(() => {
114
122
  activateItemOrItems()
115
123
  toggleKeys()
116
124
  })
117
125
  onUnmounted(() => {
118
126
  unbindKeys()
119
127
  })
120
- const scroller=ref(null)
121
- const activeItems = ref<Item[]>([])
122
- const cssProps = computed(()=>{
128
+ const scroller = ref(null)
129
+ const activeItems = ref<Item[]>([])
130
+ const cssProps = computed(() => {
123
131
  return {
124
132
  '--scroller-height': props.scrollerHeight
125
133
  }
126
134
  })
127
- const keyField = computed(()=>{
135
+ const keyField = computed(() => {
128
136
  return typeof items_.value[0] === 'string' ? null : 'recycle_scroller_id'
129
137
  })
130
- const items_ = computed(():Item[]=>{
138
+ const items_ = computed((): Item[] => {
131
139
  if (typeof props.items[0] === 'string') {
132
140
  return props.items
133
141
  }
134
- return props.items.map((item:Item) => ({ ...item, recycle_scroller_id: `id-${uniqueId()}` }))
142
+ return props.items.map((item: Item) => ({
143
+ ...item,
144
+ recycle_scroller_id: `id-${uniqueId()}`
145
+ }))
135
146
  })
136
- const firstActiveItemIndex = computed(()=>{
137
- return activeItems.value.length ? items_.value.indexOf(activeItems.value[0]) : -1
147
+ const firstActiveItemIndex = computed(() => {
148
+ return activeItems.value.length
149
+ ? items_.value.indexOf(activeItems.value[0])
150
+ : -1
138
151
  })
139
- const lastActiveItemIndex = computed(()=>{
140
- return activeItems.value.length ? items_.value.indexOf(activeItems.value.slice(-1)) : -1
152
+ const lastActiveItemIndex = computed(() => {
153
+ return activeItems.value.length
154
+ ? items_.value.indexOf(activeItems.value.slice(-1))
155
+ : -1
141
156
  })
142
- const keysMap = computed(():{[key:string]:Function }=>{
143
- return {
144
- [KEY_UP_CODE]: activatePreviousItem,
145
- [KEY_DOWN_CODE]: activateNextItem,
146
- [KEY_ESC_CODE]: deactivateItems
147
- }
148
- }
149
- )
150
- watch(()=>props.hide,()=> {
151
- toggleKeys()
152
- })
153
- watch(()=>activeItems.value,
154
- ()=> {
155
- /**
156
- * Fired when the selected value change. It will pass a canonical value
157
- * or an array of values if the property `multiple` is set to true.
158
- *
159
- * @event input
160
- * @type {String, Object, Array, Number}
161
- */
162
- emit('update:modelValue', props.multiple ? activeItems.value : activeItems.value[0])
157
+ const keysMap = computed((): { [key: string]: Function } => {
158
+ return {
159
+ [KEY_UP_CODE]: activatePreviousItem,
160
+ [KEY_DOWN_CODE]: activateNextItem,
161
+ [KEY_ESC_CODE]: deactivateItems
162
+ }
163
163
  })
164
- watch(()=>props.modelValue,
165
- (itemOrItems)=>{
166
- const items = castArray(itemOrItems)
167
- if (!isEqual(activeItems.value, items)) {
168
- activateItemOrItems(items)
164
+ watch(
165
+ () => props.hide,
166
+ () => {
167
+ toggleKeys()
168
+ }
169
+ )
170
+ watch(
171
+ () => activeItems.value,
172
+ () => {
173
+ /**
174
+ * Fired when the selected value change. It will pass a canonical value
175
+ * or an array of values if the property `multiple` is set to true.
176
+ *
177
+ * @event input
178
+ * @type {String, Object, Array, Number}
179
+ */
180
+ emit(
181
+ 'update:modelValue',
182
+ props.multiple ? activeItems.value : activeItems.value[0]
183
+ )
169
184
  }
185
+ )
186
+ watch(
187
+ () => props.modelValue,
188
+ (itemOrItems) => {
189
+ const items = castArray(itemOrItems)
190
+ if (!isEqual(activeItems.value, items)) {
191
+ activateItemOrItems(items)
192
+ }
170
193
  },
171
- {deep: true})
172
- function indexIcon(item:Item){
194
+ { deep: true }
195
+ )
196
+ function indexIcon(item: Item) {
173
197
  return itemActivated(item) ? faCheckSquare : faSquare
174
198
  }
175
- function itemActivated(item:Item) {
199
+ function itemActivated(item: Item) {
176
200
  return findIndex(activeItems.value, (i) => props.eq(item, i)) > -1
177
201
  }
178
- function clickToSelectItem(item:Item) {
202
+ function clickToSelectItem(item: Item) {
179
203
  /**
180
204
  * Fired when user click on an item
181
205
  *
@@ -189,7 +213,7 @@ export default defineComponent({
189
213
  selectItem(item)
190
214
  }
191
215
  }
192
- function clickToAddItem(item:Item) {
216
+ function clickToAddItem(item: Item) {
193
217
  /**
194
218
  * Fired when user click on an item
195
219
  *
@@ -199,7 +223,7 @@ export default defineComponent({
199
223
  emit('click', item)
200
224
  addItem(item)
201
225
  }
202
- function clickToSelectRangeToItem(item:Item) {
226
+ function clickToSelectRangeToItem(item: Item) {
203
227
  /**
204
228
  * Fired when user click on an item
205
229
  *
@@ -209,33 +233,42 @@ export default defineComponent({
209
233
  emit('click', item)
210
234
  selectRangeToItem(item)
211
235
  }
212
- function emitEventOnItem(name:"click" | "update:modelValue" | "deactivate", item:Item) {
236
+ function emitEventOnItem(
237
+ name: 'click' | 'update:modelValue' | 'deactivate',
238
+ item: Item
239
+ ) {
213
240
  emit(name, item)
214
241
  }
215
- function selectItem(item:Item) {
242
+ function selectItem(item: Item) {
216
243
  if (itemActivated(item) && activeItems.value.length === 1) {
217
244
  activeItems.value = filter(activeItems.value, (i) => !props.eq(item, i))
218
245
  } else {
219
246
  activeItems.value = [item]
220
247
  }
221
248
  }
222
- function addItem(item:Item) {
249
+ function addItem(item: Item) {
223
250
  if (itemActivated(item)) {
224
251
  activeItems.value = filter(activeItems.value, (i) => !props.eq(item, i))
225
252
  } else {
226
253
  activeItems.value.push(item)
227
254
  }
228
255
  }
229
- function selectRangeToItem(item:Item) {
256
+ function selectRangeToItem(item: Item) {
230
257
  // No activated items
231
258
  if (!activeItems.value.length || !props.multiple) {
232
259
  selectItem(item)
233
260
  } else {
234
261
  const index = items_.value.indexOf(item)
235
262
  if (index > firstActiveItemIndex.value) {
236
- activeItems.value = items_.value.slice(firstActiveItemIndex.value, index + 1)
263
+ activeItems.value = items_.value.slice(
264
+ firstActiveItemIndex.value,
265
+ index + 1
266
+ )
237
267
  } else {
238
- activeItems.value = items_.value.slice(index, firstActiveItemIndex.value + 1)
268
+ activeItems.value = items_.value.slice(
269
+ index,
270
+ firstActiveItemIndex.value + 1
271
+ )
239
272
  }
240
273
  }
241
274
  }
@@ -244,10 +277,16 @@ export default defineComponent({
244
277
  activeItems.value = [...items]
245
278
  }
246
279
  function activatePreviousItem() {
247
- activeItems.value = [items_.value[Math.max(firstActiveItemIndex.value - 1, -1)]]
280
+ activeItems.value = [
281
+ items_.value[Math.max(firstActiveItemIndex.value - 1, -1)]
282
+ ]
248
283
  }
249
284
  function activateNextItem() {
250
- activeItems.value = [items_.value[Math.min(firstActiveItemIndex.value + 1, items_.value.length - 1)]]
285
+ activeItems.value = [
286
+ items_.value[
287
+ Math.min(firstActiveItemIndex.value + 1, items_.value.length - 1)
288
+ ]
289
+ ]
251
290
  }
252
291
  function deactivateItems() {
253
292
  activeItems.value = []
@@ -258,7 +297,7 @@ export default defineComponent({
258
297
  */
259
298
  emit('deactivate')
260
299
  }
261
- function keyDown(event:KeyboardEvent) {
300
+ function keyDown(event: KeyboardEvent) {
262
301
  const keyCode = event.keyCode || event.which
263
302
  // The dropdown must be active
264
303
  if (props.deactivateKeys || props.hide || !isKnownKey(keyCode)) return
@@ -270,7 +309,7 @@ export default defineComponent({
270
309
  // Then call the right method
271
310
  keysMap.value[keyCode]()
272
311
  }
273
- function isKnownKey(keycode:number) {
312
+ function isKnownKey(keycode: number) {
274
313
  return Object.keys(keysMap.value).map(Number).indexOf(keycode) > -1
275
314
  }
276
315
  function unbindKeys() {
@@ -286,7 +325,7 @@ export default defineComponent({
286
325
  bindKeys()
287
326
  }
288
327
  }
289
- function itemId(item:Item){
328
+ function itemId(item: Item) {
290
329
  return `dropdown-item-${item.recycle_scroller_id ?? item.toLowerCase()}`
291
330
  }
292
331
 
@@ -310,32 +349,38 @@ export default defineComponent({
310
349
 
311
350
  <template>
312
351
  <div
313
- v-if="!hide"
314
- class="selectable-dropdown show"
315
- :class="{ 'selectable-dropdown--multiple': multiple, [listClass]: true }"
352
+ v-if="!hide"
353
+ class="selectable-dropdown show"
354
+ :class="{ 'selectable-dropdown--multiple': multiple, [listClass]: true }"
316
355
  >
317
356
  <recycle-scroller
318
- v-slot="{ item, active }"
319
- :style="cssProps"
320
- class="scroller"
321
- :items="items_"
322
- :key-field="keyField"
323
- :item-size="itemSize"
357
+ v-slot="{ item, active }"
358
+ :style="cssProps"
359
+ class="scroller"
360
+ :items="items_"
361
+ :key-field="keyField"
362
+ :item-size="itemSize"
324
363
  >
325
364
  <span
326
- :id="itemId(item)"
327
- :class="{ 'recycle_scroller-item--active': active, active: itemActivated(item), [itemClass]: true }"
328
- class="selectable-dropdown__item px-3 d-flex"
329
- @click.exact="clickToSelectItem(item)"
330
- @click.ctrl="clickToAddItem(item)"
331
- @click.shift="clickToSelectRangeToItem(item)"
365
+ :id="itemId(item)"
366
+ :class="{
367
+ 'recycle_scroller-item--active': active,
368
+ active: itemActivated(item),
369
+ [itemClass]: true
370
+ }"
371
+ class="selectable-dropdown__item px-3 d-flex"
372
+ @click.exact="clickToSelectItem(item)"
373
+ @click.ctrl="clickToAddItem(item)"
374
+ @click.shift="clickToSelectRangeToItem(item)"
332
375
  >
333
376
  <!-- @slot Item content -->
334
377
  <slot name="item" :item="item">
335
378
  <div v-if="multiple" class="selectable-dropdown__item__check">
336
379
  <fa :icon="indexIcon(item)" class="me-2" />
337
380
  </div>
338
- <div class="flex-grow-1 text-truncate selectable-dropdown__item__label">
381
+ <div
382
+ class="flex-grow-1 text-truncate selectable-dropdown__item__label"
383
+ >
339
384
  <!-- @slot Item's label content -->
340
385
  <slot name="item-label" :item="item">
341
386
  {{ serializer(item) }}