flowbite-svelte 0.25.21 → 0.25.24

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 (40) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/alerts/Alert.svelte +3 -5
  3. package/alerts/Alert.svelte.d.ts +2 -4
  4. package/avatar/Avatar.svelte +4 -4
  5. package/dropdowns/Dropdown.svelte +25 -18
  6. package/dropdowns/Dropdown.svelte.d.ts +2 -3
  7. package/dropdowns/DropdownItem.svelte +1 -0
  8. package/index.d.ts +4 -0
  9. package/index.js +4 -0
  10. package/navbar/Menu.svelte +36 -0
  11. package/navbar/Menu.svelte.d.ts +22 -0
  12. package/navbar/NavHamburger.svelte +2 -3
  13. package/package.json +7 -1
  14. package/popover/Popover.svelte +3 -3
  15. package/popover/Popover.svelte.d.ts +1 -0
  16. package/ratings/Rating.svelte +1 -1
  17. package/ratings/RatingComment.svelte +4 -6
  18. package/ratings/Star.svelte +36 -0
  19. package/ratings/Star.svelte.d.ts +22 -0
  20. package/sidebars/SidebarDropdownWrapper.svelte +4 -7
  21. package/timelines/Timeline.svelte +13 -2
  22. package/timelines/Timeline.svelte.d.ts +2 -1
  23. package/timelines/TimelineItem.svelte +123 -35
  24. package/timelines/TimelineItem.svelte.d.ts +8 -3
  25. package/timelines/TimelineItemHorizontal.svelte +52 -21
  26. package/timelines/TimelineItemHorizontal.svelte.d.ts +6 -2
  27. package/timelines/TimelineItemVertical.svelte +30 -25
  28. package/timelines/TimelineItemVertical.svelte.d.ts +6 -3
  29. package/tooltips/Tooltip.svelte +12 -2
  30. package/tooltips/Tooltip.svelte.d.ts +2 -3
  31. package/utils/ChevronDown.svelte +36 -0
  32. package/utils/ChevronDown.svelte.d.ts +22 -0
  33. package/utils/ChevronLeft.svelte +36 -0
  34. package/utils/ChevronLeft.svelte.d.ts +22 -0
  35. package/utils/ChevronRight.svelte +36 -0
  36. package/utils/ChevronRight.svelte.d.ts +22 -0
  37. package/utils/ChevronUp.svelte +36 -0
  38. package/utils/ChevronUp.svelte.d.ts +22 -0
  39. package/utils/Popper.svelte +94 -66
  40. package/utils/Popper.svelte.d.ts +5 -6
@@ -1,84 +1,112 @@
1
- <script>import { createEventDispatcher } from 'svelte';
1
+ <script>import { createEventDispatcher, onMount } from 'svelte';
2
+ import { fade } from 'svelte/transition';
2
3
  import { createPopper } from '@popperjs/core';
3
4
  import classNames from 'classnames';
4
- const dispatch = createEventDispatcher();
5
- export let open = false;
6
- export let placement = 'top';
5
+ export let activeContent = false;
6
+ export let animation = 100;
7
+ export let arrow = true;
7
8
  export let offset = 8;
9
+ export let placement = 'top';
8
10
  export let trigger = 'hover';
9
- export let arrow = true;
10
- export let animation = 'duration-300';
11
- export let activeContent;
11
+ export let triggeredBy;
12
+ const dispatch = createEventDispatcher();
13
+ let open = false;
12
14
  let clickable;
13
15
  $: clickable = trigger === 'click';
14
- let triggerEl, contentEl, popper;
16
+ $: dispatch('show', open);
17
+ let triggerEl;
18
+ let triggerEls = [];
19
+ let popper;
15
20
  let _blocked = false; // managment of the race condition between focusin and click events
16
- const block = () => ((_blocked = true), setTimeout(() => (_blocked = false), 500));
21
+ const block = () => ((_blocked = true), setTimeout(() => (_blocked = false), 250));
17
22
  const showHandler = (ev) => {
23
+ if (triggerEl === undefined)
24
+ triggerEl = ev.target;
25
+ else if (triggerEls.includes(ev.target) && triggerEl !== ev.target) {
26
+ popper.state.elements.reference = ev.target;
27
+ popper.setOptions({ placement });
28
+ triggerEl = ev.target;
29
+ block();
30
+ }
18
31
  if (clickable && ev.type === 'focusin' && !open)
19
32
  block();
20
- open = ev.type === 'click' && !_blocked ? !open : true;
33
+ open = clickable && ev.type === 'click' && !_blocked ? !open : true;
21
34
  };
35
+ // typescript typeguards - poper.state.element.reference: Element|HTMLElement|VirtualElement
36
+ const hasHover = (el) => el.matches && el.matches(':hover');
37
+ const hasFocus = (el) => el.contains && el.contains(document.activeElement);
22
38
  const hideHandler = (ev) => {
23
- if (activeContent)
24
- setTimeout(() => (!clickable && (triggerEl.matches(':hover') || contentEl.matches(':hover'))) ||
25
- contentEl.contains(document.activeElement) ||
26
- (open = false), 100);
39
+ if (activeContent) {
40
+ setTimeout(() => {
41
+ const elements = Object.values(popper?.state.elements ?? {});
42
+ if (ev.type === 'mouseleave' && elements.some(hasHover))
43
+ return;
44
+ if (ev.type === 'focusout' && elements.some(hasFocus))
45
+ return;
46
+ open = false;
47
+ }, 100);
48
+ }
27
49
  else
28
50
  open = false;
29
51
  };
30
- $: {
31
- if (triggerEl && contentEl) {
32
- popper = createPopper(triggerEl, contentEl, {
33
- placement,
34
- modifiers: [{ name: 'offset', options: { offset: [0, offset] } }]
35
- });
36
- }
37
- }
38
- function enableListeners(modifiers) {
39
- const modifier = modifiers.find((x) => x.name === 'eventListeners');
40
- if (!modifier)
41
- return [...modifiers, { name: 'eventListeners', enabled: open }];
42
- modifier.enabled = open;
43
- return modifiers;
52
+ function init(node, _open) {
53
+ popper = createPopper(triggerEl, node, {
54
+ placement,
55
+ modifiers: [
56
+ { name: 'offset', options: { offset: [0, offset] } },
57
+ { name: 'eventListeners', enabled: open }
58
+ ]
59
+ });
60
+ return {
61
+ destroy() {
62
+ popper.destroy();
63
+ }
64
+ };
44
65
  }
45
- $: {
46
- if (popper) {
47
- // Enable the event listeners
48
- popper.setOptions(({ modifiers, ...options }) => ({
49
- ...options,
50
- modifiers: enableListeners(modifiers)
51
- }));
52
- open && popper.update(); // Update the position
53
- dispatch('show', open);
54
- }
55
- }
56
- let divClass;
57
- $: divClass = classNames('z-10', animation && `transition-opacity ${animation}`, open ? 'visible opacity-100' : 'invisible opacity-0', $$props.class);
66
+ onMount(() => {
67
+ const events = [
68
+ ['focusin', showHandler, true],
69
+ ['focusout', hideHandler, true],
70
+ ['click', showHandler, clickable],
71
+ ['mouseenter', showHandler, !clickable],
72
+ ['mouseleave', hideHandler, !clickable]
73
+ ];
74
+ triggerEls = [...document.querySelectorAll(triggeredBy)];
75
+ if (!triggerEls.length)
76
+ console.error('no triggers given');
77
+ triggerEls.forEach((element) => {
78
+ // trigger must be focusable
79
+ if (element.tabIndex < 0)
80
+ element.tabIndex = 0;
81
+ for (const [name, handler, cond] of events)
82
+ if (cond)
83
+ element.addEventListener(name, handler);
84
+ });
85
+ return () => {
86
+ triggerEl = undefined;
87
+ triggerEls.forEach((element) => {
88
+ if (element) {
89
+ for (const [name, handler, cond] of events)
90
+ element.removeEventListener(name, handler);
91
+ }
92
+ });
93
+ };
94
+ });
58
95
  </script>
59
96
 
60
- <div
61
- bind:this={triggerEl}
62
- on:focusin={showHandler}
63
- on:focusout={hideHandler}
64
- on:click={clickable ? showHandler : undefined}
65
- on:mouseenter={clickable ? undefined : showHandler}
66
- on:mouseleave={clickable ? undefined : hideHandler}
67
- class="inline-block"
68
- >
69
- <slot name="trigger" />
70
- </div>
71
- <div
72
- bind:this={contentEl}
73
- role="tooltip"
74
- tabindex={activeContent ? -1 : undefined}
75
- class={divClass}
76
- on:focusin={activeContent ? showHandler : undefined}
77
- on:focusout={activeContent ? hideHandler : undefined}
78
- on:mouseenter={activeContent && !clickable ? showHandler : undefined}
79
- on:mouseleave={activeContent && !clickable ? hideHandler : undefined}
80
- style="position: absolute;"
81
- >
82
- <slot />
83
- {#if arrow}<div data-popper-arrow />{/if}
84
- </div>
97
+ {#if open}
98
+ <div
99
+ use:init={open}
100
+ transition:fade={{ duration: animation ? animation : 0 }}
101
+ role="tooltip"
102
+ tabIndex={activeContent ? -1 : undefined}
103
+ class={classNames('z-10', $$props.class)}
104
+ on:focusin={activeContent ? showHandler : undefined}
105
+ on:focusout={activeContent ? hideHandler : undefined}
106
+ on:mouseenter={activeContent && !clickable ? showHandler : undefined}
107
+ on:mouseleave={activeContent && !clickable ? hideHandler : undefined}
108
+ style="position: absolute;">
109
+ <slot />
110
+ {#if arrow}<div data-popper-arrow />{/if}
111
+ </div>
112
+ {/if}
@@ -3,13 +3,13 @@ import type { Placement } from '@popperjs/core';
3
3
  declare const __propDef: {
4
4
  props: {
5
5
  [x: string]: any;
6
- open?: boolean;
7
- placement?: Placement;
6
+ activeContent?: boolean;
7
+ animation?: false | number;
8
+ arrow?: boolean;
8
9
  offset?: number;
10
+ placement?: Placement;
9
11
  trigger?: 'hover' | 'click';
10
- arrow?: boolean;
11
- animation?: false | `duration-${number}`;
12
- activeContent: boolean;
12
+ triggeredBy: string;
13
13
  };
14
14
  events: {
15
15
  show: CustomEvent<any>;
@@ -17,7 +17,6 @@ declare const __propDef: {
17
17
  [evt: string]: CustomEvent<any>;
18
18
  };
19
19
  slots: {
20
- trigger: {};
21
20
  default: {};
22
21
  };
23
22
  };