@coreui/vue-pro 4.9.0-beta.2 → 5.0.0-alpha.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 (34) hide show
  1. package/README.md +1 -1
  2. package/dist/components/dropdown/CDropdown.d.ts +62 -4
  3. package/dist/components/dropdown/CDropdownToggle.d.ts +1 -1
  4. package/dist/components/form/CFormCheck.d.ts +26 -2
  5. package/dist/components/form/CFormInput.d.ts +6 -18
  6. package/dist/components/multi-select/CMultiSelect.d.ts +6 -6
  7. package/dist/components/popover/CPopover.d.ts +75 -6
  8. package/dist/components/toast/CToast.d.ts +1 -1
  9. package/dist/components/tooltip/CTooltip.d.ts +77 -8
  10. package/dist/composables/index.d.ts +2 -1
  11. package/dist/composables/useColorModes.d.ts +1 -1
  12. package/dist/composables/usePopper.d.ts +6 -0
  13. package/dist/index.es.js +384 -238
  14. package/dist/index.es.js.map +1 -1
  15. package/dist/index.js +383 -236
  16. package/dist/index.js.map +1 -1
  17. package/dist/types.d.ts +1 -1
  18. package/dist/utils/getRTLPlacement.d.ts +3 -0
  19. package/dist/utils/index.d.ts +2 -1
  20. package/package.json +11 -11
  21. package/src/components/date-range-picker/CDateRangePicker.ts +6 -4
  22. package/src/components/dropdown/CDropdown.ts +116 -61
  23. package/src/components/dropdown/CDropdownMenu.ts +2 -47
  24. package/src/components/dropdown/CDropdownToggle.ts +5 -5
  25. package/src/components/form/CFormCheck.ts +53 -4
  26. package/src/components/multi-select/CMultiSelect.ts +3 -3
  27. package/src/components/popover/CPopover.ts +96 -50
  28. package/src/components/tooltip/CTooltip.ts +97 -51
  29. package/src/composables/index.ts +2 -1
  30. package/src/composables/useColorModes.ts +2 -1
  31. package/src/composables/usePopper.ts +25 -0
  32. package/src/types.ts +1 -1
  33. package/src/utils/getRTLPlacement.ts +18 -0
  34. package/src/utils/index.ts +2 -1
package/dist/index.es.js CHANGED
@@ -1,4 +1,4 @@
1
- import { defineComponent, ref, provide, h as h$1, Transition, withDirectives, inject, watch, onBeforeMount, onMounted, onUpdated, toRefs, cloneVNode, onUnmounted, nextTick, computed, vShow, onBeforeUnmount, Teleport } from 'vue';
1
+ import { defineComponent, ref, provide, h as h$1, Transition, withDirectives, inject, watch, onBeforeMount, onMounted, onUpdated, toRefs, cloneVNode, nextTick, computed, vShow, onBeforeUnmount, Teleport } from 'vue';
2
2
 
3
3
  const CAccordion = defineComponent({
4
4
  name: 'CAccordion',
@@ -1827,6 +1827,20 @@ const CCardPlugin = {
1827
1827
  },
1828
1828
  };
1829
1829
 
1830
+ const getRTLPlacement = (placement, element) => {
1831
+ switch (placement) {
1832
+ case 'right': {
1833
+ return isRTL(element) ? 'left' : 'right';
1834
+ }
1835
+ case 'left': {
1836
+ return isRTL(element) ? 'right' : 'left';
1837
+ }
1838
+ default: {
1839
+ return placement;
1840
+ }
1841
+ }
1842
+ };
1843
+
1830
1844
  const getUID = (prefix) => {
1831
1845
  do {
1832
1846
  prefix += Math.floor(Math.random() * 1_000_000);
@@ -7704,14 +7718,16 @@ const CDateRangePicker = defineComponent({
7704
7718
  });
7705
7719
  watch(() => props.startDate, () => {
7706
7720
  if (props.startDate) {
7707
- calendarDate.value = new Date(props.startDate);
7708
- startDate.value = new Date(props.startDate);
7721
+ const date = new Date(props.startDate);
7722
+ calendarDate.value = date;
7723
+ startDate.value = date;
7709
7724
  }
7710
7725
  });
7711
7726
  watch(() => props.endDate, () => {
7712
7727
  if (props.endDate) {
7713
- calendarDate.value = new Date(props.endDate);
7714
- endDate.value = new Date(props.endDate);
7728
+ const date = new Date(props.endDate);
7729
+ calendarDate.value = date;
7730
+ endDate.value = date;
7715
7731
  }
7716
7732
  });
7717
7733
  watch(() => props.maxDate, () => {
@@ -8377,6 +8393,91 @@ const CDatePickerPlugin = {
8377
8393
  },
8378
8394
  };
8379
8395
 
8396
+ const getStoredTheme = (localStorageItemName) => typeof window !== 'undefined' && localStorage.getItem(localStorageItemName);
8397
+ const setStoredTheme = (localStorageItemName, colorMode) => localStorage.setItem(localStorageItemName, colorMode);
8398
+ const getPreferredColorScheme = (localStorageItemName) => {
8399
+ if (typeof window === 'undefined') {
8400
+ return;
8401
+ }
8402
+ const storedTheme = getStoredTheme(localStorageItemName);
8403
+ if (storedTheme) {
8404
+ return storedTheme;
8405
+ }
8406
+ return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
8407
+ };
8408
+ const setTheme = (colorMode) => {
8409
+ document.documentElement.dataset.coreuiTheme =
8410
+ colorMode === 'auto' && window.matchMedia('(prefers-color-scheme: dark)').matches
8411
+ ? 'dark'
8412
+ : colorMode;
8413
+ const event = new Event('ColorSchemeChange');
8414
+ document.documentElement.dispatchEvent(event);
8415
+ };
8416
+ const useColorModes = (localStorageItemName = 'coreui-vue-color-scheme') => {
8417
+ const colorMode = ref(getPreferredColorScheme(localStorageItemName));
8418
+ watch(colorMode, () => {
8419
+ if (colorMode.value) {
8420
+ setStoredTheme(localStorageItemName, colorMode.value);
8421
+ setTheme(colorMode.value);
8422
+ }
8423
+ });
8424
+ onBeforeMount(() => {
8425
+ if (typeof getStoredTheme(localStorageItemName) === 'string' && colorMode.value) {
8426
+ setTheme(colorMode.value);
8427
+ }
8428
+ window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
8429
+ const storedTheme = getStoredTheme(localStorageItemName);
8430
+ if (storedTheme !== 'light' && storedTheme !== 'dark' && colorMode.value) {
8431
+ setTheme(colorMode.value);
8432
+ }
8433
+ });
8434
+ });
8435
+ return {
8436
+ colorMode,
8437
+ isColorModeSet: () => Boolean(getStoredTheme(localStorageItemName)),
8438
+ setColorMode: (mode) => {
8439
+ colorMode.value = mode;
8440
+ },
8441
+ };
8442
+ };
8443
+
8444
+ const usePopper = () => {
8445
+ const _popper = ref();
8446
+ const initPopper = (reference, popper, options) => {
8447
+ _popper.value = createPopper(reference, popper, options);
8448
+ };
8449
+ const destroyPopper = () => {
8450
+ if (_popper.value) {
8451
+ _popper.value.destroy();
8452
+ }
8453
+ _popper.value = undefined;
8454
+ };
8455
+ return {
8456
+ popper: _popper.value,
8457
+ initPopper,
8458
+ destroyPopper,
8459
+ };
8460
+ };
8461
+
8462
+ const getPlacement = (placement, direction, alignment, isRTL) => {
8463
+ let _placement = placement;
8464
+ if (direction === 'dropup') {
8465
+ _placement = isRTL ? 'top-end' : 'top-start';
8466
+ }
8467
+ if (direction === 'dropup-center') {
8468
+ _placement = 'top';
8469
+ }
8470
+ if (direction === 'dropend') {
8471
+ _placement = isRTL ? 'left-start' : 'right-start';
8472
+ }
8473
+ if (direction === 'dropstart') {
8474
+ _placement = isRTL ? 'right-start' : 'left-start';
8475
+ }
8476
+ if (alignment === 'end') {
8477
+ _placement = isRTL ? 'bottom-start' : 'bottom-end';
8478
+ }
8479
+ return _placement;
8480
+ };
8380
8481
  const CDropdown = defineComponent({
8381
8482
  name: 'CDropdown',
8382
8483
  props: {
@@ -8448,6 +8549,15 @@ const CDropdown = defineComponent({
8448
8549
  * Toggle the disabled state for the component.
8449
8550
  */
8450
8551
  disabled: Boolean,
8552
+ /**
8553
+ * Offset of the dropdown menu relative to its target.
8554
+ *
8555
+ * @since 4.9.0
8556
+ */
8557
+ offset: {
8558
+ type: Array,
8559
+ default: () => [0, 2],
8560
+ },
8451
8561
  /**
8452
8562
  * Describes the placement of your component after Popper.js has applied all the modifiers that may have flipped or altered the originally provided placement property.
8453
8563
  *
@@ -8501,14 +8611,37 @@ const CDropdown = defineComponent({
8501
8611
  setup(props, { slots, emit }) {
8502
8612
  const dropdownToggleRef = ref();
8503
8613
  const dropdownMenuRef = ref();
8504
- const placement = ref(props.placement);
8505
- const popper = ref();
8614
+ const popper = ref(typeof props.alignment === 'object' ? false : props.popper);
8506
8615
  const visible = ref(props.visible);
8616
+ const { initPopper, destroyPopper } = usePopper();
8617
+ const popperConfig = {
8618
+ modifiers: [
8619
+ {
8620
+ name: 'offset',
8621
+ options: {
8622
+ offset: props.offset,
8623
+ },
8624
+ },
8625
+ ],
8626
+ placement: getPlacement(props.placement, props.direction, props.alignment, isRTL(dropdownMenuRef.value)),
8627
+ };
8507
8628
  watch(() => props.visible, () => {
8508
8629
  visible.value = props.visible;
8509
8630
  });
8631
+ watch(visible, () => {
8632
+ if (visible.value && dropdownToggleRef.value && dropdownMenuRef.value) {
8633
+ popper.value && initPopper(dropdownToggleRef.value, dropdownMenuRef.value, popperConfig);
8634
+ window.addEventListener('mouseup', handleMouseUp);
8635
+ window.addEventListener('keyup', handleKeyup);
8636
+ emit('show');
8637
+ return;
8638
+ }
8639
+ popper.value && destroyPopper();
8640
+ window.removeEventListener('mouseup', handleMouseUp);
8641
+ window.removeEventListener('keyup', handleKeyup);
8642
+ emit('hide');
8643
+ });
8510
8644
  provide('config', {
8511
- autoClose: props.autoClose,
8512
8645
  alignment: props.alignment,
8513
8646
  dark: props.dark,
8514
8647
  popper: props.popper,
@@ -8517,24 +8650,31 @@ const CDropdown = defineComponent({
8517
8650
  provide('visible', visible);
8518
8651
  provide('dropdownToggleRef', dropdownToggleRef);
8519
8652
  provide('dropdownMenuRef', dropdownMenuRef);
8520
- const initPopper = () => {
8521
- // Disable popper if responsive aligment is set.
8522
- if (typeof props.alignment === 'object') {
8653
+ const handleKeyup = (event) => {
8654
+ if (props.autoClose === false) {
8523
8655
  return;
8524
8656
  }
8525
- if (dropdownToggleRef.value) {
8526
- popper.value = createPopper(dropdownToggleRef.value, dropdownMenuRef.value, {
8527
- placement: placement.value,
8528
- });
8657
+ if (event.key === 'Escape') {
8658
+ setVisible(false);
8529
8659
  }
8530
8660
  };
8531
- const destroyPopper = () => {
8532
- if (popper.value) {
8533
- popper.value.destroy();
8661
+ const handleMouseUp = (event) => {
8662
+ if (!dropdownToggleRef.value || !dropdownMenuRef.value) {
8663
+ return;
8664
+ }
8665
+ if (dropdownToggleRef.value.contains(event.target)) {
8666
+ return;
8667
+ }
8668
+ if (props.autoClose === true ||
8669
+ (props.autoClose === 'inside' &&
8670
+ dropdownMenuRef.value.contains(event.target)) ||
8671
+ (props.autoClose === 'outside' &&
8672
+ !dropdownMenuRef.value.contains(event.target))) {
8673
+ setVisible(false);
8674
+ return;
8534
8675
  }
8535
- popper.value = undefined;
8536
8676
  };
8537
- const toggleMenu = (_visible) => {
8677
+ const setVisible = (_visible) => {
8538
8678
  if (props.disabled) {
8539
8679
  return;
8540
8680
  }
@@ -8548,38 +8688,7 @@ const CDropdown = defineComponent({
8548
8688
  }
8549
8689
  visible.value = true;
8550
8690
  };
8551
- provide('toggleMenu', toggleMenu);
8552
- const hideMenu = () => {
8553
- if (props.disabled) {
8554
- return;
8555
- }
8556
- visible.value = false;
8557
- };
8558
- provide('hideMenu', hideMenu);
8559
- watch(visible, () => {
8560
- props.popper && (visible.value ? initPopper() : destroyPopper());
8561
- visible.value ? emit('show') : emit('hide');
8562
- });
8563
- onMounted(() => {
8564
- if (props.direction === 'center') {
8565
- placement.value = 'bottom';
8566
- }
8567
- if (props.direction === 'dropup') {
8568
- placement.value = isRTL(dropdownMenuRef.value) ? 'top-end' : 'top-start';
8569
- }
8570
- if (props.direction === 'dropup-center') {
8571
- placement.value = 'top';
8572
- }
8573
- if (props.direction === 'dropend') {
8574
- placement.value = isRTL(dropdownMenuRef.value) ? 'left-start' : 'right-start';
8575
- }
8576
- if (props.direction === 'dropstart') {
8577
- placement.value = isRTL(dropdownMenuRef.value) ? 'right-start' : 'left-start';
8578
- }
8579
- if (props.alignment === 'end') {
8580
- placement.value = isRTL(dropdownMenuRef.value) ? 'bottom-start' : 'bottom-end';
8581
- }
8582
- });
8691
+ provide('setVisible', setVisible);
8583
8692
  return () => props.variant === 'input-group'
8584
8693
  ? [slots.default && slots.default()]
8585
8694
  : h$1('div', {
@@ -8672,12 +8781,10 @@ const CDropdownMenu = defineComponent({
8672
8781
  },
8673
8782
  },
8674
8783
  setup(props, { slots }) {
8675
- const dropdownToggleRef = inject('dropdownToggleRef');
8676
8784
  const dropdownMenuRef = inject('dropdownMenuRef');
8677
8785
  const config = inject('config'); // eslint-disable-line @typescript-eslint/no-explicit-any
8678
- const hideMenu = inject('hideMenu');
8679
8786
  const visible = inject('visible');
8680
- const { autoClose, alignment, dark, popper } = config;
8787
+ const { alignment, dark, popper } = config;
8681
8788
  // eslint-disable-next-line @typescript-eslint/ban-types, unicorn/consistent-function-scoping
8682
8789
  const alignmentClassNames = (alignment) => {
8683
8790
  const classNames = [];
@@ -8691,39 +8798,6 @@ const CDropdownMenu = defineComponent({
8691
8798
  }
8692
8799
  return classNames;
8693
8800
  };
8694
- const handleKeyup = (event) => {
8695
- if (autoClose === false) {
8696
- return;
8697
- }
8698
- if (event.key === 'Escape') {
8699
- hideMenu();
8700
- }
8701
- };
8702
- const handleMouseUp = (event) => {
8703
- if (dropdownToggleRef.value?.contains(event.target)) {
8704
- return;
8705
- }
8706
- if (autoClose === true) {
8707
- hideMenu();
8708
- return;
8709
- }
8710
- if (autoClose === 'inside' && dropdownMenuRef.value?.contains(event.target)) {
8711
- hideMenu();
8712
- return;
8713
- }
8714
- if (autoClose === 'outside' &&
8715
- !dropdownMenuRef.value?.contains(event.target)) {
8716
- hideMenu();
8717
- }
8718
- };
8719
- onUpdated(() => {
8720
- visible.value && window.addEventListener('mouseup', handleMouseUp);
8721
- visible.value && window.addEventListener('keyup', handleKeyup);
8722
- });
8723
- onUnmounted(() => {
8724
- window.removeEventListener('mouseup', handleMouseUp);
8725
- window.removeEventListener('keyup', handleKeyup);
8726
- });
8727
8801
  return () => h$1(props.component, {
8728
8802
  class: [
8729
8803
  'dropdown-menu',
@@ -8820,7 +8894,7 @@ const CDropdownToggle = defineComponent({
8820
8894
  const dropdownToggleRef = inject('dropdownToggleRef');
8821
8895
  const dropdownVariant = inject('variant');
8822
8896
  const visible = inject('visible');
8823
- const toggleMenu = inject('toggleMenu');
8897
+ const setVisible = inject('setVisible');
8824
8898
  const className = [
8825
8899
  {
8826
8900
  'dropdown-toggle': props.caret,
@@ -8835,7 +8909,7 @@ const CDropdownToggle = defineComponent({
8835
8909
  if (props.disabled) {
8836
8910
  return;
8837
8911
  }
8838
- toggleMenu();
8912
+ setVisible();
8839
8913
  },
8840
8914
  }),
8841
8915
  ...((props.trigger === 'focus' || props.trigger.includes('focus')) && {
@@ -8843,13 +8917,13 @@ const CDropdownToggle = defineComponent({
8843
8917
  if (props.disabled) {
8844
8918
  return;
8845
8919
  }
8846
- toggleMenu(true);
8920
+ setVisible(true);
8847
8921
  },
8848
8922
  onblur: () => {
8849
8923
  if (props.disabled) {
8850
8924
  return;
8851
8925
  }
8852
- toggleMenu(false);
8926
+ setVisible(false);
8853
8927
  },
8854
8928
  }),
8855
8929
  };
@@ -9140,6 +9214,12 @@ const CFormCheck = defineComponent({
9140
9214
  * @see http://coreui.io/vue/docs/components/button.html
9141
9215
  */
9142
9216
  button: Object,
9217
+ /**
9218
+ * Use in conjunction with the v-model directive to specify the value that should be assigned to the bound variable when the checkbox is in the `false` state.
9219
+ *
9220
+ * @since 4.9.0
9221
+ */
9222
+ falseValue: String,
9143
9223
  /**
9144
9224
  * Provide valuable, actionable feedback.
9145
9225
  *
@@ -9192,7 +9272,7 @@ const CFormCheck = defineComponent({
9192
9272
  * The default name for a value passed using v-model.
9193
9273
  */
9194
9274
  modelValue: {
9195
- type: [Boolean, String],
9275
+ type: [Array, Boolean, String],
9196
9276
  value: undefined,
9197
9277
  },
9198
9278
  /**
@@ -9207,6 +9287,12 @@ const CFormCheck = defineComponent({
9207
9287
  * @since 4.3.0
9208
9288
  */
9209
9289
  tooltipFeedback: Boolean,
9290
+ /**
9291
+ * Use in conjunction with the v-model directive to specify the value that should be assigned to the bound variable when the checkbox is in the `true` state.
9292
+ *
9293
+ * @since 4.9.0
9294
+ */
9295
+ trueValue: String,
9210
9296
  /**
9211
9297
  * Specifies the type of component.
9212
9298
  *
@@ -9237,8 +9323,28 @@ const CFormCheck = defineComponent({
9237
9323
  ],
9238
9324
  setup(props, { attrs, emit, slots }) {
9239
9325
  const handleChange = (event) => {
9326
+ const target = event.target;
9240
9327
  emit('change', event);
9241
- emit('update:modelValue', event.target.value);
9328
+ if (props.falseValue && props.trueValue) {
9329
+ emit('update:modelValue', target.checked ? props.trueValue : props.falseValue);
9330
+ return;
9331
+ }
9332
+ if (props.value && Array.isArray(props.modelValue)) {
9333
+ if (props.modelValue.includes(props.value)) {
9334
+ emit('update:modelValue', props.modelValue.filter((value) => value !== props.value));
9335
+ }
9336
+ else {
9337
+ emit('update:modelValue', [...props.modelValue, props.value]);
9338
+ }
9339
+ return;
9340
+ }
9341
+ if (props.value === undefined) {
9342
+ emit('update:modelValue', target.checked);
9343
+ return;
9344
+ }
9345
+ if (props.value && (props.modelValue === undefined || typeof props.modelValue === 'string')) {
9346
+ emit('update:modelValue', target.checked ? props.value : undefined);
9347
+ }
9242
9348
  };
9243
9349
  const className = [
9244
9350
  'form-check',
@@ -9258,11 +9364,19 @@ const CFormCheck = defineComponent({
9258
9364
  'me-2': props.hitArea,
9259
9365
  },
9260
9366
  ];
9261
- const isChecked = computed(() => props.modelValue == props.value);
9367
+ const isChecked = computed(() => {
9368
+ if (Array.isArray(props.modelValue)) {
9369
+ return props.modelValue.includes(props.value);
9370
+ }
9371
+ if (typeof props.modelValue === 'string') {
9372
+ return props.modelValue === props.value;
9373
+ }
9374
+ return props.modelValue;
9375
+ });
9262
9376
  const formControl = () => {
9263
9377
  return h$1('input', {
9264
9378
  ...attrs,
9265
- ...(props.modelValue && { checked: isChecked.value }),
9379
+ ...(props.modelValue && props.value && { checked: isChecked.value }),
9266
9380
  class: inputClassName,
9267
9381
  id: props.id,
9268
9382
  indeterminate: props.indeterminate,
@@ -11267,7 +11381,7 @@ const CMultiSelect = defineComponent({
11267
11381
  /**
11268
11382
  * Allow users to create options if they are not in the list of options.
11269
11383
  *
11270
- * @since 4.9.0-next.0
11384
+ * @since 4.9.0
11271
11385
  */
11272
11386
  allowCreateOptions: Boolean,
11273
11387
  /**
@@ -11282,7 +11396,7 @@ const CMultiSelect = defineComponent({
11282
11396
  /**
11283
11397
  * Clear current search on selecting an item.
11284
11398
  *
11285
- * @since 4.9.0-next.0
11399
+ * @since 4.9.0
11286
11400
  */
11287
11401
  clearSearchOnSelect: Boolean,
11288
11402
  /**
@@ -11326,7 +11440,7 @@ const CMultiSelect = defineComponent({
11326
11440
  /**
11327
11441
  * When set, the options list will have a loading style: loading spinner and reduced opacity.
11328
11442
  *
11329
- * @since 4.9.0-next.0
11443
+ * @since 4.9.0
11330
11444
  */
11331
11445
  loading: Boolean,
11332
11446
  /**
@@ -12716,26 +12830,49 @@ const CProgressPlugin = {
12716
12830
  },
12717
12831
  };
12718
12832
 
12719
- const getPlacement$1 = (placement, element) => {
12720
- switch (placement) {
12721
- case 'right': {
12722
- return isRTL(element) ? 'left' : 'right';
12723
- }
12724
- case 'left': {
12725
- return isRTL(element) ? 'right' : 'left';
12726
- }
12727
- default: {
12728
- return placement;
12729
- }
12730
- }
12731
- };
12732
12833
  const CPopover = defineComponent({
12733
12834
  name: 'CPopover',
12734
12835
  props: {
12836
+ /**
12837
+ * Apply a CSS fade transition to the popover.
12838
+ *
12839
+ * @since 4.9.0
12840
+ */
12841
+ animation: {
12842
+ type: Boolean,
12843
+ default: true,
12844
+ },
12735
12845
  /**
12736
12846
  * Content for your component. If you want to pass non-string value please use dedicated slot `<template #content>...</template>`
12737
12847
  */
12738
12848
  content: String,
12849
+ /**
12850
+ * The delay for displaying and hiding the popover (in milliseconds). When a numerical value is provided, the delay applies to both the hide and show actions. The object structure for specifying the delay is as follows: delay: `{ 'show': 500, 'hide': 100 }`.
12851
+ *
12852
+ * @since 4.9.0
12853
+ */
12854
+ delay: {
12855
+ type: [Number, Object],
12856
+ default: 0,
12857
+ },
12858
+ /**
12859
+ * Specify the desired order of fallback placements by providing a list of placements as an array. The placements should be prioritized based on preference.
12860
+ *
12861
+ * @since 4.9.0
12862
+ */
12863
+ fallbackPlacements: {
12864
+ type: [String, Array],
12865
+ default: () => ['top', 'right', 'bottom', 'left'],
12866
+ validator: (value) => {
12867
+ if (typeof value === 'string') {
12868
+ return ['top', 'right', 'bottom', 'left'].includes(value);
12869
+ }
12870
+ if (Array.isArray(value)) {
12871
+ return value.every((e) => ['top', 'right', 'bottom', 'left'].includes(e));
12872
+ }
12873
+ return false;
12874
+ },
12875
+ },
12739
12876
  /**
12740
12877
  * Offset of the popover relative to its target.
12741
12878
  */
@@ -12793,11 +12930,35 @@ const CPopover = defineComponent({
12793
12930
  setup(props, { attrs, slots, emit }) {
12794
12931
  const togglerRef = ref();
12795
12932
  const popoverRef = ref();
12796
- const popper = ref();
12797
12933
  const visible = ref(props.visible);
12934
+ const { initPopper, destroyPopper } = usePopper();
12935
+ const delay = typeof props.delay === 'number' ? { show: props.delay, hide: props.delay } : props.delay;
12936
+ const popperConfig = {
12937
+ modifiers: [
12938
+ {
12939
+ name: 'arrow',
12940
+ options: {
12941
+ element: '.popover-arrow',
12942
+ },
12943
+ },
12944
+ {
12945
+ name: 'flip',
12946
+ options: {
12947
+ fallbackPlacements: props.fallbackPlacements,
12948
+ },
12949
+ },
12950
+ {
12951
+ name: 'offset',
12952
+ options: {
12953
+ offset: props.offset,
12954
+ },
12955
+ },
12956
+ ],
12957
+ placement: getRTLPlacement(props.placement, togglerRef.value),
12958
+ };
12798
12959
  const handleEnter = (el, done) => {
12799
12960
  emit('show');
12800
- initPopper();
12961
+ initPopper(togglerRef.value, popoverRef.value, popperConfig);
12801
12962
  el.classList.add('show');
12802
12963
  executeAfterTransition(() => done(), el);
12803
12964
  };
@@ -12809,30 +12970,17 @@ const CPopover = defineComponent({
12809
12970
  destroyPopper();
12810
12971
  }, el);
12811
12972
  };
12812
- const handleToggle = (event) => {
12973
+ const toggleVisible = (event, _visible) => {
12813
12974
  togglerRef.value = event.target;
12814
- visible.value = !visible.value;
12815
- };
12816
- const initPopper = () => {
12817
- if (togglerRef.value) {
12818
- popper.value = createPopper(togglerRef.value, popoverRef.value, {
12819
- placement: getPlacement$1(props.placement, togglerRef.value),
12820
- modifiers: [
12821
- {
12822
- name: 'offset',
12823
- options: {
12824
- offset: props.offset,
12825
- },
12826
- },
12827
- ],
12828
- });
12829
- }
12830
- };
12831
- const destroyPopper = () => {
12832
- if (popper.value) {
12833
- popper.value.destroy();
12975
+ if (_visible) {
12976
+ setTimeout(() => {
12977
+ visible.value = true;
12978
+ }, delay.show);
12979
+ return;
12834
12980
  }
12835
- popper.value = undefined;
12981
+ setTimeout(() => {
12982
+ visible.value = false;
12983
+ }, delay.hide);
12836
12984
  };
12837
12985
  return () => [
12838
12986
  h$1(Teleport, {
@@ -12842,12 +12990,18 @@ const CPopover = defineComponent({
12842
12990
  onLeave: (el, done) => handleLeave(el, done),
12843
12991
  }, () => visible.value &&
12844
12992
  h$1('div', {
12845
- class: 'popover fade bs-popover-auto',
12993
+ class: [
12994
+ 'popover',
12995
+ 'bs-popover-auto',
12996
+ {
12997
+ fade: props.animation,
12998
+ },
12999
+ ],
12846
13000
  ref: popoverRef,
12847
13001
  role: 'tooltip',
12848
13002
  ...attrs,
12849
13003
  }, [
12850
- h$1('div', { class: 'popover-arrow', 'data-popper-arrow': '' }),
13004
+ h$1('div', { class: 'popover-arrow' }),
12851
13005
  (props.title || slots.title) &&
12852
13006
  h$1('div', { class: 'popover-header' }, {
12853
13007
  default: () => (slots.title && slots.title()) || props.title,
@@ -12860,11 +13014,11 @@ const CPopover = defineComponent({
12860
13014
  slots.toggler &&
12861
13015
  slots.toggler({
12862
13016
  on: {
12863
- click: (event) => props.trigger.includes('click') && handleToggle(event),
12864
- blur: (event) => props.trigger.includes('focus') && handleToggle(event),
12865
- focus: (event) => props.trigger.includes('focus') && handleToggle(event),
12866
- mouseenter: (event) => props.trigger.includes('hover') && handleToggle(event),
12867
- mouseleave: (event) => props.trigger.includes('hover') && handleToggle(event),
13017
+ click: (event) => props.trigger.includes('click') && toggleVisible(event, !visible.value),
13018
+ blur: (event) => props.trigger.includes('focus') && toggleVisible(event, false),
13019
+ focus: (event) => props.trigger.includes('focus') && toggleVisible(event, true),
13020
+ mouseenter: (event) => props.trigger.includes('hover') && toggleVisible(event, true),
13021
+ mouseleave: (event) => props.trigger.includes('hover') && toggleVisible(event, false),
12868
13022
  },
12869
13023
  }),
12870
13024
  ];
@@ -15424,26 +15578,49 @@ const CToastPlugin = {
15424
15578
  },
15425
15579
  };
15426
15580
 
15427
- const getPlacement = (placement, element) => {
15428
- switch (placement) {
15429
- case 'right': {
15430
- return isRTL(element) ? 'left' : 'right';
15431
- }
15432
- case 'left': {
15433
- return isRTL(element) ? 'right' : 'left';
15434
- }
15435
- default: {
15436
- return placement;
15437
- }
15438
- }
15439
- };
15440
15581
  const CTooltip = defineComponent({
15441
15582
  name: 'CTooltip',
15442
15583
  props: {
15584
+ /**
15585
+ * Apply a CSS fade transition to the tooltip.
15586
+ *
15587
+ * @since 4.9.0
15588
+ */
15589
+ animation: {
15590
+ type: Boolean,
15591
+ default: true,
15592
+ },
15443
15593
  /**
15444
15594
  * Content for your component. If you want to pass non-string value please use dedicated slot `<template #content>...</template>`
15445
15595
  */
15446
15596
  content: String,
15597
+ /**
15598
+ * The delay for displaying and hiding the popover (in milliseconds). When a numerical value is provided, the delay applies to both the hide and show actions. The object structure for specifying the delay is as follows: delay: `{ 'show': 500, 'hide': 100 }`.
15599
+ *
15600
+ * @since 4.9.0
15601
+ */
15602
+ delay: {
15603
+ type: [Number, Object],
15604
+ default: 0,
15605
+ },
15606
+ /**
15607
+ * Specify the desired order of fallback placements by providing a list of placements as an array. The placements should be prioritized based on preference.
15608
+ *
15609
+ * @since 4.9.0
15610
+ */
15611
+ fallbackPlacements: {
15612
+ type: [String, Array],
15613
+ default: () => ['top', 'right', 'bottom', 'left'],
15614
+ validator: (value) => {
15615
+ if (typeof value === 'string') {
15616
+ return ['top', 'right', 'bottom', 'left'].includes(value);
15617
+ }
15618
+ if (Array.isArray(value)) {
15619
+ return value.every((e) => ['top', 'right', 'bottom', 'left'].includes(e));
15620
+ }
15621
+ return false;
15622
+ },
15623
+ },
15447
15624
  /**
15448
15625
  * Offset of the tooltip relative to its target.
15449
15626
  */
@@ -15468,7 +15645,7 @@ const CTooltip = defineComponent({
15468
15645
  */
15469
15646
  trigger: {
15470
15647
  type: [String, Array],
15471
- default: 'hover',
15648
+ default: () => ['hover', 'focus'],
15472
15649
  validator: (value) => {
15473
15650
  if (typeof value === 'string') {
15474
15651
  return ['click', 'focus', 'hover'].includes(value);
@@ -15497,11 +15674,35 @@ const CTooltip = defineComponent({
15497
15674
  setup(props, { attrs, slots, emit }) {
15498
15675
  const togglerRef = ref();
15499
15676
  const tooltipRef = ref();
15500
- const popper = ref();
15501
15677
  const visible = ref(props.visible);
15678
+ const { initPopper, destroyPopper } = usePopper();
15679
+ const delay = typeof props.delay === 'number' ? { show: props.delay, hide: props.delay } : props.delay;
15680
+ const popperConfig = {
15681
+ modifiers: [
15682
+ {
15683
+ name: 'arrow',
15684
+ options: {
15685
+ element: '.tooltip-arrow',
15686
+ },
15687
+ },
15688
+ {
15689
+ name: 'flip',
15690
+ options: {
15691
+ fallbackPlacements: props.fallbackPlacements,
15692
+ },
15693
+ },
15694
+ {
15695
+ name: 'offset',
15696
+ options: {
15697
+ offset: props.offset,
15698
+ },
15699
+ },
15700
+ ],
15701
+ placement: getRTLPlacement(props.placement, togglerRef.value),
15702
+ };
15502
15703
  const handleEnter = (el, done) => {
15503
15704
  emit('show');
15504
- initPopper();
15705
+ initPopper(togglerRef.value, tooltipRef.value, popperConfig);
15505
15706
  el.classList.add('show');
15506
15707
  executeAfterTransition(() => done(), el);
15507
15708
  };
@@ -15513,30 +15714,17 @@ const CTooltip = defineComponent({
15513
15714
  destroyPopper();
15514
15715
  }, el);
15515
15716
  };
15516
- const handleToggle = (event) => {
15717
+ const toggleVisible = (event, _visible) => {
15517
15718
  togglerRef.value = event.target;
15518
- visible.value = !visible.value;
15519
- };
15520
- const initPopper = () => {
15521
- if (togglerRef.value) {
15522
- popper.value = createPopper(togglerRef.value, tooltipRef.value, {
15523
- placement: getPlacement(props.placement, togglerRef.value),
15524
- modifiers: [
15525
- {
15526
- name: 'offset',
15527
- options: {
15528
- offset: props.offset,
15529
- },
15530
- },
15531
- ],
15532
- });
15533
- }
15534
- };
15535
- const destroyPopper = () => {
15536
- if (popper.value) {
15537
- popper.value.destroy();
15719
+ if (_visible) {
15720
+ setTimeout(() => {
15721
+ visible.value = true;
15722
+ }, delay.show);
15723
+ return;
15538
15724
  }
15539
- popper.value = undefined;
15725
+ setTimeout(() => {
15726
+ visible.value = false;
15727
+ }, delay.hide);
15540
15728
  };
15541
15729
  return () => [
15542
15730
  h$1(Teleport, {
@@ -15546,12 +15734,18 @@ const CTooltip = defineComponent({
15546
15734
  onLeave: (el, done) => handleLeave(el, done),
15547
15735
  }, () => visible.value &&
15548
15736
  h$1('div', {
15549
- class: 'tooltip fade bs-tooltip-auto',
15737
+ class: [
15738
+ 'tooltip',
15739
+ 'bs-tooltip-auto',
15740
+ {
15741
+ fade: props.animation,
15742
+ },
15743
+ ],
15550
15744
  ref: tooltipRef,
15551
15745
  role: 'tooltip',
15552
15746
  ...attrs,
15553
15747
  }, [
15554
- h$1('div', { class: 'tooltip-arrow', 'data-popper-arrow': '' }),
15748
+ h$1('div', { class: 'tooltip-arrow' }),
15555
15749
  (props.content || slots.content) &&
15556
15750
  h$1('div', { class: 'tooltip-inner' }, {
15557
15751
  default: () => (slots.content && slots.content()) || props.content,
@@ -15560,11 +15754,11 @@ const CTooltip = defineComponent({
15560
15754
  slots.toggler &&
15561
15755
  slots.toggler({
15562
15756
  on: {
15563
- click: (event) => props.trigger.includes('click') && handleToggle(event),
15564
- blur: (event) => props.trigger.includes('focus') && handleToggle(event),
15565
- focus: (event) => props.trigger.includes('focus') && handleToggle(event),
15566
- mouseenter: (event) => props.trigger.includes('hover') && handleToggle(event),
15567
- mouseleave: (event) => props.trigger.includes('hover') && handleToggle(event),
15757
+ click: (event) => props.trigger.includes('click') && toggleVisible(event, !visible.value),
15758
+ blur: (event) => props.trigger.includes('focus') && toggleVisible(event, false),
15759
+ focus: (event) => props.trigger.includes('focus') && toggleVisible(event, true),
15760
+ mouseenter: (event) => props.trigger.includes('hover') && toggleVisible(event, true),
15761
+ mouseleave: (event) => props.trigger.includes('hover') && toggleVisible(event, false),
15568
15762
  },
15569
15763
  }),
15570
15764
  ];
@@ -15669,7 +15863,7 @@ function isPlainObject(o) {
15669
15863
  return true;
15670
15864
  }
15671
15865
 
15672
- function t(){return t=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r]);}return e},t.apply(this,arguments)}function n(e,t){if(null==e)return {};var n,r,i={},o=Object.keys(e);for(r=0;r<o.length;r++)t.indexOf(n=o[r])>=0||(i[n]=e[n]);return i}const r={silent:!1,logLevel:"warn"},i=["validator"],o=Object.prototype,a=o.toString,s=o.hasOwnProperty,u=/^\s*function (\w+)/;function l(e){var t;const n=null!==(t=null==e?void 0:e.type)&&void 0!==t?t:e;if(n){const e=n.toString().match(u);return e?e[1]:""}return ""}const c=isPlainObject,f=e=>e;let d=f;if("production"!==process.env.NODE_ENV){const e="undefined"!=typeof console;d=e?function(e,t=r.logLevel){!1===r.silent&&console[t](`[VueTypes warn]: ${e}`);}:f;}const p=(e,t)=>s.call(e,t),y=Number.isInteger||function(e){return "number"==typeof e&&isFinite(e)&&Math.floor(e)===e},v=Array.isArray||function(e){return "[object Array]"===a.call(e)},h=e=>"[object Function]"===a.call(e),b=(e,t)=>c(e)&&p(e,"_vueTypes_name")&&(!t||e._vueTypes_name===t),g=e=>c(e)&&(p(e,"type")||["_vueTypes_name","validator","default","required"].some(t=>p(e,t)));function O(e,t){return Object.defineProperty(e.bind(t),"__original",{value:e})}function m(e,t,n=!1){let r,i=!0,o="";r=c(e)?e:{type:e};const a=b(r)?r._vueTypes_name+" - ":"";if(g(r)&&null!==r.type){if(void 0===r.type||!0===r.type)return i;if(!r.required&&null==t)return i;v(r.type)?(i=r.type.some(e=>!0===m(e,t,!0)),o=r.type.map(e=>l(e)).join(" or ")):(o=l(r),i="Array"===o?v(t):"Object"===o?c(t):"String"===o||"Number"===o||"Boolean"===o||"Function"===o?function(e){if(null==e)return "";const t=e.constructor.toString().match(u);return t?t[1]:""}(t)===o:t instanceof r.type);}if(!i){const e=`${a}value "${t}" should be of type "${o}"`;return !1===n?(d(e),!1):e}if(p(r,"validator")&&h(r.validator)){const e=d,o=[];if(d=e=>{o.push(e);},i=r.validator(t),d=e,!i){const e=(o.length>1?"* ":"")+o.join("\n* ");return o.length=0,!1===n?(d(e),i):e}}return i}function j(e,t){const n=Object.defineProperties(t,{_vueTypes_name:{value:e,writable:!0},isRequired:{get(){return this.required=!0,this}},def:{value(e){return void 0===e?this.type===Boolean||Array.isArray(this.type)&&this.type.includes(Boolean)?void(this.default=void 0):(p(this,"default")&&delete this.default,this):h(e)||!0===m(this,e,!0)?(this.default=v(e)?()=>[...e]:c(e)?()=>Object.assign({},e):e,this):(d(`${this._vueTypes_name} - invalid default value: "${e}"`),this)}}}),{validator:r}=n;return h(r)&&(n.validator=O(r,n)),n}function _(e,t){const n=j(e,t);return Object.defineProperty(n,"validate",{value(e){return h(this.validator)&&d(`${this._vueTypes_name} - calling .validate() will overwrite the current custom validator function. Validator info:\n${JSON.stringify(this)}`),this.validator=O(e,this),this}})}function T(e,t,r){const o=function(e){const t={};return Object.getOwnPropertyNames(e).forEach(n=>{t[n]=Object.getOwnPropertyDescriptor(e,n);}),Object.defineProperties({},t)}(t);if(o._vueTypes_name=e,!c(r))return o;const{validator:a}=r,s=n(r,i);if(h(a)){let{validator:e}=o;e&&(e=null!==(l=(u=e).__original)&&void 0!==l?l:u),o.validator=O(e?function(t){return e.call(this,t)&&a.call(this,t)}:a,o);}var u,l;return Object.assign(o,s)}function $(e){return e.replace(/^(?!\s*$)/gm," ")}const w=()=>_("any",{}),x=()=>_("function",{type:Function}),P=()=>_("boolean",{type:Boolean}),A=()=>_("string",{type:String}),E=()=>_("number",{type:Number}),S=()=>_("array",{type:Array}),N=()=>_("object",{type:Object}),V=()=>j("integer",{type:Number,validator(e){const t=y(e);return !1===t&&d(`integer - "${e}" is not an integer`),t}}),q=()=>j("symbol",{validator(e){const t="symbol"==typeof e;return !1===t&&d(`symbol - invalid value "${e}"`),t}}),k=()=>Object.defineProperty({type:null,validator(e){const t=null===e;return !1===t&&d("nullable - value should be null"),t}},"_vueTypes_name",{value:"nullable"});function D(e,t="custom validation failed"){if("function"!=typeof e)throw new TypeError("[VueTypes error]: You must provide a function as argument");return j(e.name||"<<anonymous function>>",{type:null,validator(n){const r=e(n);return r||d(`${this._vueTypes_name} - ${t}`),r}})}function L(e){if(!v(e))throw new TypeError("[VueTypes error]: You must provide an array as argument.");const t=`oneOf - value should be one of "${e.map(e=>"symbol"==typeof e?e.toString():e).join('", "')}".`,n={validator(n){const r=-1!==e.indexOf(n);return r||d(t),r}};if(-1===e.indexOf(null)){const t=e.reduce((e,t)=>{if(null!=t){const n=t.constructor;-1===e.indexOf(n)&&e.push(n);}return e},[]);t.length>0&&(n.type=t);}return j("oneOf",n)}function B(e){if(!v(e))throw new TypeError("[VueTypes error]: You must provide an array as argument");let t=!1,n=!1,r=[];for(let i=0;i<e.length;i+=1){const o=e[i];if(g(o)){if(h(o.validator)&&(t=!0),b(o,"oneOf")&&o.type){r=r.concat(o.type);continue}if(b(o,"nullable")){n=!0;continue}if(!0===o.type||!o.type){d('oneOfType - invalid usage of "true" and "null" as types.');continue}r=r.concat(o.type);}else r.push(o);}r=r.filter((e,t)=>r.indexOf(e)===t);const i=!1===n&&r.length>0?r:null;return j("oneOfType",t?{type:i,validator(t){const n=[],r=e.some(e=>{const r=m(e,t,!0);return "string"==typeof r&&n.push(r),!0===r});return r||d(`oneOfType - provided value does not match any of the ${n.length} passed-in validators:\n${$(n.join("\n"))}`),r}}:{type:i})}function F(e){return j("arrayOf",{type:Array,validator(t){let n="";const r=t.every(t=>(n=m(e,t,!0),!0===n));return r||d(`arrayOf - value validation error:\n${$(n)}`),r}})}function Y(e){return j("instanceOf",{type:e})}function I(e){return j("objectOf",{type:Object,validator(t){let n="";const r=Object.keys(t).every(r=>(n=m(e,t[r],!0),!0===n));return r||d(`objectOf - value validation error:\n${$(n)}`),r}})}function J(e){const t=Object.keys(e),n=t.filter(t=>{var n;return !(null===(n=e[t])||void 0===n||!n.required)}),r=j("shape",{type:Object,validator(r){if(!c(r))return !1;const i=Object.keys(r);if(n.length>0&&n.some(e=>-1===i.indexOf(e))){const e=n.filter(e=>-1===i.indexOf(e));return d(1===e.length?`shape - required property "${e[0]}" is not defined.`:`shape - required properties "${e.join('", "')}" are not defined.`),!1}return i.every(n=>{if(-1===t.indexOf(n))return !0===this._vueTypes_isLoose||(d(`shape - shape definition does not include a "${n}" property. Allowed keys: "${t.join('", "')}".`),!1);const i=m(e[n],r[n],!0);return "string"==typeof i&&d(`shape - "${n}" property validation error:\n ${$(i)}`),!0===i})}});return Object.defineProperty(r,"_vueTypes_isLoose",{writable:!0,value:!1}),Object.defineProperty(r,"loose",{get(){return this._vueTypes_isLoose=!0,this}}),r}const M=["name","validate","getter"],R=/*#__PURE__*/(()=>{var e;return (e=class{static get any(){return w()}static get func(){return x().def(this.defaults.func)}static get bool(){return void 0===this.defaults.bool?P():P().def(this.defaults.bool)}static get string(){return A().def(this.defaults.string)}static get number(){return E().def(this.defaults.number)}static get array(){return S().def(this.defaults.array)}static get object(){return N().def(this.defaults.object)}static get integer(){return V().def(this.defaults.integer)}static get symbol(){return q()}static get nullable(){return k()}static extend(e){if(d("VueTypes.extend is deprecated. Use the ES6+ method instead. See https://dwightjack.github.io/vue-types/advanced/extending-vue-types.html#extending-namespaced-validators-in-es6 for details."),v(e))return e.forEach(e=>this.extend(e)),this;const{name:t,validate:r=!1,getter:i=!1}=e,o=n(e,M);if(p(this,t))throw new TypeError(`[VueTypes error]: Type "${t}" already defined`);const{type:a}=o;if(b(a))return delete o.type,Object.defineProperty(this,t,i?{get:()=>T(t,a,o)}:{value(...e){const n=T(t,a,o);return n.validator&&(n.validator=n.validator.bind(n,...e)),n}});let s;return s=i?{get(){const e=Object.assign({},o);return r?_(t,e):j(t,e)},enumerable:!0}:{value(...e){const n=Object.assign({},o);let i;return i=r?_(t,n):j(t,n),n.validator&&(i.validator=n.validator.bind(i,...e)),i},enumerable:!0},Object.defineProperty(this,t,s)}}).defaults={},e.sensibleDefaults=void 0,e.config=r,e.custom=D,e.oneOf=L,e.instanceOf=Y,e.oneOfType=B,e.arrayOf=F,e.objectOf=I,e.shape=J,e.utils={validate:(e,t)=>!0===m(t,e,!0),toType:(e,t,n=!1)=>n?_(e,t):j(e,t)},e})();function U(e={func:()=>{},bool:!0,string:"",number:0,array:()=>[],object:()=>({}),integer:0}){var n;return (n=class extends R{static get sensibleDefaults(){return t({},this.defaults)}static set sensibleDefaults(n){this.defaults=!1!==n?t({},!0!==n?n:e):{};}}).defaults=t({},e),n}class z extends(U()){}
15866
+ function t(){return t=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r]);}return e},t.apply(this,arguments)}function n(e,t){if(null==e)return {};var n,r,i={},o=Object.keys(e);for(r=0;r<o.length;r++)t.indexOf(n=o[r])>=0||(i[n]=e[n]);return i}const r={silent:!1,logLevel:"warn"},i=["validator"],o=Object.prototype,a=o.toString,s=o.hasOwnProperty,u=/^\s*function (\w+)/;function l(e){var t;const n=null!==(t=null==e?void 0:e.type)&&void 0!==t?t:e;if(n){const e=n.toString().match(u);return e?e[1]:""}return ""}const c=isPlainObject,f=e=>e;let d=f;if("production"!==process.env.NODE_ENV){const e="undefined"!=typeof console;d=e?function(e,t=r.logLevel){!1===r.silent&&console[t](`[VueTypes warn]: ${e}`);}:f;}const p=(e,t)=>s.call(e,t),y=Number.isInteger||function(e){return "number"==typeof e&&isFinite(e)&&Math.floor(e)===e},v=Array.isArray||function(e){return "[object Array]"===a.call(e)},h=e=>"[object Function]"===a.call(e),b=(e,t)=>c(e)&&p(e,"_vueTypes_name")&&(!t||e._vueTypes_name===t),g=e=>c(e)&&(p(e,"type")||["_vueTypes_name","validator","default","required"].some(t=>p(e,t)));function O(e,t){return Object.defineProperty(e.bind(t),"__original",{value:e})}function m(e,t,n=!1){let r,i=!0,o="";r=c(e)?e:{type:e};const a=b(r)?r._vueTypes_name+" - ":"";if(g(r)&&null!==r.type){if(void 0===r.type||!0===r.type)return i;if(!r.required&&null==t)return i;v(r.type)?(i=r.type.some(e=>!0===m(e,t,!0)),o=r.type.map(e=>l(e)).join(" or ")):(o=l(r),i="Array"===o?v(t):"Object"===o?c(t):"String"===o||"Number"===o||"Boolean"===o||"Function"===o?function(e){if(null==e)return "";const t=e.constructor.toString().match(u);return t?t[1].replace(/^Async/,""):""}(t)===o:t instanceof r.type);}if(!i){const e=`${a}value "${t}" should be of type "${o}"`;return !1===n?(d(e),!1):e}if(p(r,"validator")&&h(r.validator)){const e=d,o=[];if(d=e=>{o.push(e);},i=r.validator(t),d=e,!i){const e=(o.length>1?"* ":"")+o.join("\n* ");return o.length=0,!1===n?(d(e),i):e}}return i}function j(e,t){const n=Object.defineProperties(t,{_vueTypes_name:{value:e,writable:!0},isRequired:{get(){return this.required=!0,this}},def:{value(e){return void 0===e?this.type===Boolean||Array.isArray(this.type)&&this.type.includes(Boolean)?void(this.default=void 0):(p(this,"default")&&delete this.default,this):h(e)||!0===m(this,e,!0)?(this.default=v(e)?()=>[...e]:c(e)?()=>Object.assign({},e):e,this):(d(`${this._vueTypes_name} - invalid default value: "${e}"`),this)}}}),{validator:r}=n;return h(r)&&(n.validator=O(r,n)),n}function _(e,t){const n=j(e,t);return Object.defineProperty(n,"validate",{value(e){return h(this.validator)&&d(`${this._vueTypes_name} - calling .validate() will overwrite the current custom validator function. Validator info:\n${JSON.stringify(this)}`),this.validator=O(e,this),this}})}function T(e,t,r){const o=function(e){const t={};return Object.getOwnPropertyNames(e).forEach(n=>{t[n]=Object.getOwnPropertyDescriptor(e,n);}),Object.defineProperties({},t)}(t);if(o._vueTypes_name=e,!c(r))return o;const{validator:a}=r,s=n(r,i);if(h(a)){let{validator:e}=o;e&&(e=null!==(l=(u=e).__original)&&void 0!==l?l:u),o.validator=O(e?function(t){return e.call(this,t)&&a.call(this,t)}:a,o);}var u,l;return Object.assign(o,s)}function $(e){return e.replace(/^(?!\s*$)/gm," ")}const w=()=>_("any",{}),x=()=>_("function",{type:Function}),P=()=>_("boolean",{type:Boolean}),A=()=>_("string",{type:String}),E=()=>_("number",{type:Number}),S=()=>_("array",{type:Array}),N=()=>_("object",{type:Object}),V=()=>j("integer",{type:Number,validator(e){const t=y(e);return !1===t&&d(`integer - "${e}" is not an integer`),t}}),q=()=>j("symbol",{validator(e){const t="symbol"==typeof e;return !1===t&&d(`symbol - invalid value "${e}"`),t}}),k=()=>Object.defineProperty({type:null,validator(e){const t=null===e;return !1===t&&d("nullable - value should be null"),t}},"_vueTypes_name",{value:"nullable"});function D(e,t="custom validation failed"){if("function"!=typeof e)throw new TypeError("[VueTypes error]: You must provide a function as argument");return j(e.name||"<<anonymous function>>",{type:null,validator(n){const r=e(n);return r||d(`${this._vueTypes_name} - ${t}`),r}})}function L(e){if(!v(e))throw new TypeError("[VueTypes error]: You must provide an array as argument.");const t=`oneOf - value should be one of "${e.map(e=>"symbol"==typeof e?e.toString():e).join('", "')}".`,n={validator(n){const r=-1!==e.indexOf(n);return r||d(t),r}};if(-1===e.indexOf(null)){const t=e.reduce((e,t)=>{if(null!=t){const n=t.constructor;-1===e.indexOf(n)&&e.push(n);}return e},[]);t.length>0&&(n.type=t);}return j("oneOf",n)}function B(e){if(!v(e))throw new TypeError("[VueTypes error]: You must provide an array as argument");let t=!1,n=!1,r=[];for(let i=0;i<e.length;i+=1){const o=e[i];if(g(o)){if(h(o.validator)&&(t=!0),b(o,"oneOf")&&o.type){r=r.concat(o.type);continue}if(b(o,"nullable")){n=!0;continue}if(!0===o.type||!o.type){d('oneOfType - invalid usage of "true" and "null" as types.');continue}r=r.concat(o.type);}else r.push(o);}r=r.filter((e,t)=>r.indexOf(e)===t);const i=!1===n&&r.length>0?r:null;return j("oneOfType",t?{type:i,validator(t){const n=[],r=e.some(e=>{const r=m(e,t,!0);return "string"==typeof r&&n.push(r),!0===r});return r||d(`oneOfType - provided value does not match any of the ${n.length} passed-in validators:\n${$(n.join("\n"))}`),r}}:{type:i})}function F(e){return j("arrayOf",{type:Array,validator(t){let n="";const r=t.every(t=>(n=m(e,t,!0),!0===n));return r||d(`arrayOf - value validation error:\n${$(n)}`),r}})}function Y(e){return j("instanceOf",{type:e})}function I(e){return j("objectOf",{type:Object,validator(t){let n="";const r=Object.keys(t).every(r=>(n=m(e,t[r],!0),!0===n));return r||d(`objectOf - value validation error:\n${$(n)}`),r}})}function J(e){const t=Object.keys(e),n=t.filter(t=>{var n;return !(null===(n=e[t])||void 0===n||!n.required)}),r=j("shape",{type:Object,validator(r){if(!c(r))return !1;const i=Object.keys(r);if(n.length>0&&n.some(e=>-1===i.indexOf(e))){const e=n.filter(e=>-1===i.indexOf(e));return d(1===e.length?`shape - required property "${e[0]}" is not defined.`:`shape - required properties "${e.join('", "')}" are not defined.`),!1}return i.every(n=>{if(-1===t.indexOf(n))return !0===this._vueTypes_isLoose||(d(`shape - shape definition does not include a "${n}" property. Allowed keys: "${t.join('", "')}".`),!1);const i=m(e[n],r[n],!0);return "string"==typeof i&&d(`shape - "${n}" property validation error:\n ${$(i)}`),!0===i})}});return Object.defineProperty(r,"_vueTypes_isLoose",{writable:!0,value:!1}),Object.defineProperty(r,"loose",{get(){return this._vueTypes_isLoose=!0,this}}),r}const M=["name","validate","getter"],R=/*#__PURE__*/(()=>{var e;return (e=class{static get any(){return w()}static get func(){return x().def(this.defaults.func)}static get bool(){return void 0===this.defaults.bool?P():P().def(this.defaults.bool)}static get string(){return A().def(this.defaults.string)}static get number(){return E().def(this.defaults.number)}static get array(){return S().def(this.defaults.array)}static get object(){return N().def(this.defaults.object)}static get integer(){return V().def(this.defaults.integer)}static get symbol(){return q()}static get nullable(){return k()}static extend(e){if(d("VueTypes.extend is deprecated. Use the ES6+ method instead. See https://dwightjack.github.io/vue-types/advanced/extending-vue-types.html#extending-namespaced-validators-in-es6 for details."),v(e))return e.forEach(e=>this.extend(e)),this;const{name:t,validate:r=!1,getter:i=!1}=e,o=n(e,M);if(p(this,t))throw new TypeError(`[VueTypes error]: Type "${t}" already defined`);const{type:a}=o;if(b(a))return delete o.type,Object.defineProperty(this,t,i?{get:()=>T(t,a,o)}:{value(...e){const n=T(t,a,o);return n.validator&&(n.validator=n.validator.bind(n,...e)),n}});let s;return s=i?{get(){const e=Object.assign({},o);return r?_(t,e):j(t,e)},enumerable:!0}:{value(...e){const n=Object.assign({},o);let i;return i=r?_(t,n):j(t,n),n.validator&&(i.validator=n.validator.bind(i,...e)),i},enumerable:!0},Object.defineProperty(this,t,s)}}).defaults={},e.sensibleDefaults=void 0,e.config=r,e.custom=D,e.oneOf=L,e.instanceOf=Y,e.oneOfType=B,e.arrayOf=F,e.objectOf=I,e.shape=J,e.utils={validate:(e,t)=>!0===m(t,e,!0),toType:(e,t,n=!1)=>n?_(e,t):j(e,t)},e})();function U(e={func:()=>{},bool:!0,string:"",number:0,array:()=>[],object:()=>({}),integer:0}){var n;return (n=class extends R{static get sensibleDefaults(){return t({},this.defaults)}static set sensibleDefaults(n){this.defaults=!1!==n?t({},!0!==n?n:e):{};}}).defaults=t({},e),n}class z extends(U()){}
15673
15867
 
15674
15868
  const CWidgetStatsB = defineComponent({
15675
15869
  name: 'CWidgetStatsB',
@@ -16409,54 +16603,6 @@ var Directives = /*#__PURE__*/Object.freeze({
16409
16603
  vctooltip: vCTooltip
16410
16604
  });
16411
16605
 
16412
- const getStoredTheme = (localStorageItemName) => typeof window !== 'undefined' && localStorage.getItem(localStorageItemName);
16413
- const setStoredTheme = (localStorageItemName, colorMode) => localStorage.setItem(localStorageItemName, colorMode);
16414
- const getPreferredColorScheme = (localStorageItemName) => {
16415
- if (typeof window === 'undefined') {
16416
- return;
16417
- }
16418
- const storedTheme = getStoredTheme(localStorageItemName);
16419
- if (storedTheme) {
16420
- return storedTheme;
16421
- }
16422
- return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
16423
- };
16424
- const setTheme = (colorMode) => {
16425
- document.documentElement.dataset.coreuiTheme =
16426
- colorMode === 'auto' && window.matchMedia('(prefers-color-scheme: dark)').matches
16427
- ? 'dark'
16428
- : colorMode;
16429
- const event = new Event('ColorSchemeChange');
16430
- document.documentElement.dispatchEvent(event);
16431
- };
16432
- const useColorModes = (localStorageItemName = 'coreui-vue-color-scheme') => {
16433
- const colorMode = ref(getPreferredColorScheme(localStorageItemName));
16434
- watch(colorMode, () => {
16435
- if (colorMode.value) {
16436
- setStoredTheme(localStorageItemName, colorMode.value);
16437
- setTheme(colorMode.value);
16438
- }
16439
- });
16440
- onBeforeMount(() => {
16441
- if (typeof getStoredTheme(localStorageItemName) === 'string' && colorMode.value) {
16442
- setTheme(colorMode.value);
16443
- }
16444
- window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
16445
- const storedTheme = getStoredTheme(localStorageItemName);
16446
- if (storedTheme !== 'light' && storedTheme !== 'dark' && colorMode.value) {
16447
- setTheme(colorMode.value);
16448
- }
16449
- });
16450
- });
16451
- return {
16452
- getColorMode: () => colorMode.value,
16453
- isColorModeSet: () => Boolean(getStoredTheme(localStorageItemName)),
16454
- setColorMode: (mode) => {
16455
- colorMode.value = mode;
16456
- },
16457
- };
16458
- };
16459
-
16460
16606
  const CoreuiVue = {
16461
16607
  install: (app) => {
16462
16608
  for (const key in Components) {
@@ -16468,5 +16614,5 @@ const CoreuiVue = {
16468
16614
  },
16469
16615
  };
16470
16616
 
16471
- export { CAccordion, CAccordionBody, CAccordionButton, CAccordionHeader, CAccordionItem, CAccordionPlugin, CAlert, CAlertHeading, CAlertLink, CAlertPlugin, CAvatar, CAvatarPlugin, CBackdrop, CBackdropPlugin, CBadge, CBadgePlugin, CBreadcrumb, CBreadcrumbItem, CBreadcrumbPlugin, CButton, CButtonGroup, CButtonGroupPlugin, CButtonPlugin, CButtonToolbar, CCLinkPlugin, CCalendar, CCalendarPlugin, CCallout, CCalloutPlugin, CCard, CCardBody, CCardFooter, CCardGroup, CCardHeader, CCardImage, CCardImageOverlay, CCardLink, CCardPlugin, CCardSubtitle, CCardText, CCardTitle, CCarousel, CCarouselCaption, CCarouselItem, CCarouselPlugin, CCloseButton, CCloseButtonPlugin, CCol, CCollapse, CCollapsePlugin, CContainer, CDatePicker, CDatePickerPlugin, CDateRangePicker, CDateRangePickerPlugin, CDropdown, CDropdownDivider, CDropdownHeader, CDropdownItem, CDropdownMenu, CDropdownPlugin, CDropdownToggle, CElementCover, CElementCoverPlugin, CFooter, CFooterPlugin, CForm, CFormCheck, CFormFeedback, CFormFloating, CFormInput, CFormLabel, CFormPlugin, CFormRange, CFormSelect, CFormSwitch, CFormText, CFormTextarea, CGridPlugin, CHeader, CHeaderBrand, CHeaderDivider, CHeaderNav, CHeaderPlugin, CHeaderText, CHeaderToggler, CImage, CImagePlugin, CInputGroup, CInputGroupText, CLink, CListGroup, CListGroupItem, CListGroupPlugin, CLoadingButton, CLoadingButtonPlugin, CModal, CModalBody, CModalFooter, CModalHeader, CModalPlugin, CModalTitle, CMultiSelect, CMultiSelectPlugin, CNav, CNavGroup, CNavGroupItems, CNavItem, CNavLink, CNavPlugin, CNavTitle, CNavbar, CNavbarBrand, CNavbarNav, CNavbarPlugin, CNavbarText, CNavbarToggler, COffcanvas, COffcanvasBody, COffcanvasHeader, COffcanvasPlugin, COffcanvasTitle, CPagination, CPaginationItem, CPaginationPlugin, CPicker, CPickerPlugin, CPlaceholder, CPlaceholderPlugin, CPopover, CPopoverPlugin, CProgress, CProgressBar, CProgressPlugin, CRow, CSidebar, CSidebarBrand, CSidebarFooter, CSidebarHeader, CSidebarNav, CSidebarPlugin, CSidebarToggler, CSmartPagination, CSmartPaginationPlugin, CSmartTable, CSmartTablePlugin, CSpinner, CSpinnerPlugin, CTabContent, CTabPane, CTable, CTableBody, CTableCaption, CTableDataCell, CTableFoot, CTableHead, CTableHeaderCell, CTablePlugin, CTableRow, CTabsPlugin, CTimePicker, CTimePickerPlugin, CToast, CToastBody, CToastClose, CToastHeader, CToastPlugin, CToaster, CTooltip, CTooltipPlugin, CVirtualScroller, CVirtualScrollerPlugin, CWidgetStatsA, CWidgetStatsB, CWidgetStatsC, CWidgetStatsD, CWidgetStatsE, CWidgetStatsF, CWidgetsStatsPlugin, CoreuiVue as default, useColorModes, vCPlaceholder as vcplaceholder, vCPopover as vcpopover, vCTooltip as vctooltip };
16617
+ export { CAccordion, CAccordionBody, CAccordionButton, CAccordionHeader, CAccordionItem, CAccordionPlugin, CAlert, CAlertHeading, CAlertLink, CAlertPlugin, CAvatar, CAvatarPlugin, CBackdrop, CBackdropPlugin, CBadge, CBadgePlugin, CBreadcrumb, CBreadcrumbItem, CBreadcrumbPlugin, CButton, CButtonGroup, CButtonGroupPlugin, CButtonPlugin, CButtonToolbar, CCLinkPlugin, CCalendar, CCalendarPlugin, CCallout, CCalloutPlugin, CCard, CCardBody, CCardFooter, CCardGroup, CCardHeader, CCardImage, CCardImageOverlay, CCardLink, CCardPlugin, CCardSubtitle, CCardText, CCardTitle, CCarousel, CCarouselCaption, CCarouselItem, CCarouselPlugin, CCloseButton, CCloseButtonPlugin, CCol, CCollapse, CCollapsePlugin, CContainer, CDatePicker, CDatePickerPlugin, CDateRangePicker, CDateRangePickerPlugin, CDropdown, CDropdownDivider, CDropdownHeader, CDropdownItem, CDropdownMenu, CDropdownPlugin, CDropdownToggle, CElementCover, CElementCoverPlugin, CFooter, CFooterPlugin, CForm, CFormCheck, CFormFeedback, CFormFloating, CFormInput, CFormLabel, CFormPlugin, CFormRange, CFormSelect, CFormSwitch, CFormText, CFormTextarea, CGridPlugin, CHeader, CHeaderBrand, CHeaderDivider, CHeaderNav, CHeaderPlugin, CHeaderText, CHeaderToggler, CImage, CImagePlugin, CInputGroup, CInputGroupText, CLink, CListGroup, CListGroupItem, CListGroupPlugin, CLoadingButton, CLoadingButtonPlugin, CModal, CModalBody, CModalFooter, CModalHeader, CModalPlugin, CModalTitle, CMultiSelect, CMultiSelectPlugin, CNav, CNavGroup, CNavGroupItems, CNavItem, CNavLink, CNavPlugin, CNavTitle, CNavbar, CNavbarBrand, CNavbarNav, CNavbarPlugin, CNavbarText, CNavbarToggler, COffcanvas, COffcanvasBody, COffcanvasHeader, COffcanvasPlugin, COffcanvasTitle, CPagination, CPaginationItem, CPaginationPlugin, CPicker, CPickerPlugin, CPlaceholder, CPlaceholderPlugin, CPopover, CPopoverPlugin, CProgress, CProgressBar, CProgressPlugin, CRow, CSidebar, CSidebarBrand, CSidebarFooter, CSidebarHeader, CSidebarNav, CSidebarPlugin, CSidebarToggler, CSmartPagination, CSmartPaginationPlugin, CSmartTable, CSmartTablePlugin, CSpinner, CSpinnerPlugin, CTabContent, CTabPane, CTable, CTableBody, CTableCaption, CTableDataCell, CTableFoot, CTableHead, CTableHeaderCell, CTablePlugin, CTableRow, CTabsPlugin, CTimePicker, CTimePickerPlugin, CToast, CToastBody, CToastClose, CToastHeader, CToastPlugin, CToaster, CTooltip, CTooltipPlugin, CVirtualScroller, CVirtualScrollerPlugin, CWidgetStatsA, CWidgetStatsB, CWidgetStatsC, CWidgetStatsD, CWidgetStatsE, CWidgetStatsF, CWidgetsStatsPlugin, CoreuiVue as default, useColorModes, usePopper, vCPlaceholder as vcplaceholder, vCPopover as vcpopover, vCTooltip as vctooltip };
16472
16618
  //# sourceMappingURL=index.es.js.map