tera-system-ui 0.0.12 → 0.0.13

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 (71) hide show
  1. package/dist/components/brand-logo/BrandLogo.svelte +31 -31
  2. package/dist/components/button/Button.svelte +49 -49
  3. package/dist/components/combobox/Combobox.svelte +8 -8
  4. package/dist/components/command/command.scss +72 -72
  5. package/dist/components/command/components/Command.svelte +120 -120
  6. package/dist/components/command/components/CommandEmpty.svelte +30 -30
  7. package/dist/components/command/components/CommandGroup.svelte +110 -110
  8. package/dist/components/command/components/CommandInput.svelte +92 -92
  9. package/dist/components/command/components/CommandItem.svelte +110 -110
  10. package/dist/components/command/components/CommandList.svelte +56 -56
  11. package/dist/components/command/components/CommandLoading.svelte +28 -28
  12. package/dist/components/command/components/CommandSeparator.svelte +21 -21
  13. package/dist/components/dialog/Dialog.js +4 -4
  14. package/dist/components/dialog/Dialog.svelte +106 -106
  15. package/dist/components/dialog/dialog.scss +85 -81
  16. package/dist/components/header/Header.svelte +36 -36
  17. package/dist/components/header/header.scss +19 -19
  18. package/dist/components/icons/IconArrowBigRightFilled.svelte +10 -10
  19. package/dist/components/icons/IconBook.svelte +10 -10
  20. package/dist/components/icons/IconBookmarkPlus.svelte +10 -10
  21. package/dist/components/icons/IconCalculator.svelte +10 -10
  22. package/dist/components/icons/IconCheck.svelte +10 -10
  23. package/dist/components/icons/IconChevronDown.svelte +10 -10
  24. package/dist/components/icons/IconCopy.svelte +10 -10
  25. package/dist/components/icons/IconCopyCheckFilled.svelte +10 -10
  26. package/dist/components/icons/IconHamburger.svelte +10 -10
  27. package/dist/components/icons/IconLanguage.svelte +10 -10
  28. package/dist/components/icons/IconLoader2.svelte +10 -10
  29. package/dist/components/icons/IconMoon.svelte +10 -10
  30. package/dist/components/icons/IconPointFilled.svelte +10 -10
  31. package/dist/components/icons/IconSearch.svelte +10 -10
  32. package/dist/components/icons/IconSun.svelte +10 -10
  33. package/dist/components/icons/IconSwitchHorizontal.svelte +10 -10
  34. package/dist/components/icons/IconSwitchVertical.svelte +10 -10
  35. package/dist/components/icons/IconTransform.svelte +10 -10
  36. package/dist/components/icons/IconX.svelte +10 -10
  37. package/dist/components/input/Input.svelte +24 -24
  38. package/dist/components/language-picker-button/LanguagePickerButton.svelte +109 -109
  39. package/dist/components/light-dark-toggle/LightDarkToggle.svelte +36 -36
  40. package/dist/components/popover/Popover.svelte +136 -136
  41. package/dist/components/popover-responsive/PopoverResponsive.svelte +87 -87
  42. package/dist/components/side-navigation/SideNavigation.svelte +113 -113
  43. package/dist/components/side-navigation/SideNavigationItem.svelte +17 -17
  44. package/dist/components/side-navigation/SideNavigationLayout.svelte +19 -19
  45. package/dist/components/side-navigation/sidenav.scss +149 -149
  46. package/dist/components/tera-ui-context/TeraUiContext.svelte +28 -28
  47. package/dist/themes/scrollbar.scss +37 -37
  48. package/package.json +1 -1
  49. package/scripts/add-component-template.js +120 -120
  50. package/scripts/generate-ts-index.js +136 -136
  51. package/dist/paraglide/.prettierignore +0 -3
  52. package/dist/paraglide/messages/de.d.ts +0 -1
  53. package/dist/paraglide/messages/de.js +0 -18
  54. package/dist/paraglide/messages/en.d.ts +0 -1
  55. package/dist/paraglide/messages/en.js +0 -18
  56. package/dist/paraglide/messages/es.d.ts +0 -1
  57. package/dist/paraglide/messages/es.js +0 -18
  58. package/dist/paraglide/messages/fr.d.ts +0 -1
  59. package/dist/paraglide/messages/fr.js +0 -18
  60. package/dist/paraglide/messages/it.d.ts +0 -1
  61. package/dist/paraglide/messages/it.js +0 -18
  62. package/dist/paraglide/messages/pt.d.ts +0 -1
  63. package/dist/paraglide/messages/pt.js +0 -18
  64. package/dist/paraglide/messages/ru.d.ts +0 -1
  65. package/dist/paraglide/messages/ru.js +0 -18
  66. package/dist/paraglide/messages/vi.d.ts +0 -1
  67. package/dist/paraglide/messages/vi.js +0 -18
  68. package/dist/paraglide/messages.d.ts +0 -3
  69. package/dist/paraglide/messages.js +0 -38
  70. package/dist/paraglide/runtime.d.ts +0 -52
  71. package/dist/paraglide/runtime.js +0 -141
@@ -1,10 +1,10 @@
1
- <script lang="ts">
2
- import {type IconsProps, styles} from "./Icons";
3
- import {IconTransform} from "@tabler/icons-svelte";
4
-
5
- let {children, ...props}: IconsProps = $props();
6
-
7
- </script>
8
-
9
- <IconTransform class={styles({...props})}/>
10
-
1
+ <script lang="ts">
2
+ import {type IconsProps, styles} from "./Icons";
3
+ import {IconTransform} from "@tabler/icons-svelte";
4
+
5
+ let {children, ...props}: IconsProps = $props();
6
+
7
+ </script>
8
+
9
+ <IconTransform class={styles({...props})}/>
10
+
@@ -1,10 +1,10 @@
1
- <script lang="ts">
2
- import {type IconsProps, styles} from "./Icons";
3
- import {IconX} from "@tabler/icons-svelte";
4
-
5
- let {children, ...props}: IconsProps = $props();
6
-
7
- </script>
8
-
9
- <IconX class={styles({...props})}/>
10
-
1
+ <script lang="ts">
2
+ import {type IconsProps, styles} from "./Icons";
3
+ import {IconX} from "@tabler/icons-svelte";
4
+
5
+ let {children, ...props}: IconsProps = $props();
6
+
7
+ </script>
8
+
9
+ <IconX class={styles({...props})}/>
10
+
@@ -1,25 +1,25 @@
1
- <script lang="ts">
2
- import {type InputProps, styles} from "./Input";
3
-
4
- let {
5
- children,
6
- class: className,
7
- value = $bindable(),
8
- ref = $bindable(),
9
- size,
10
- disabled,
11
- variant = 'outlined',
12
- prefix,
13
- ...props
14
- }: InputProps = $props();
15
-
16
- </script>
17
-
18
- <input
19
- type="text"
20
- bind:this={ref}
21
- class={styles({ variant, disabled , size, className})}
22
- {disabled}
23
- {...props}
24
- bind:value
1
+ <script lang="ts">
2
+ import {type InputProps, styles} from "./Input";
3
+
4
+ let {
5
+ children,
6
+ class: className,
7
+ value = $bindable(),
8
+ ref = $bindable(),
9
+ size,
10
+ disabled,
11
+ variant = 'outlined',
12
+ prefix,
13
+ ...props
14
+ }: InputProps = $props();
15
+
16
+ </script>
17
+
18
+ <input
19
+ type="text"
20
+ bind:this={ref}
21
+ class={styles({ variant, disabled , size, className})}
22
+ {disabled}
23
+ {...props}
24
+ bind:value
25
25
  />
@@ -1,112 +1,112 @@
1
- <script lang="ts">
2
- import {type LanguagePickerButtonProps} from "./LanguagePickerButton";
3
- import {IconLanguage} from "../icons";
4
- import {Dialog} from "../dialog";
5
- import IconCheck from "../icons/IconCheck.svelte";
6
- import {getGlobalContext} from "../tera-ui-context/global-context";
7
- import * as m from '../../paraglide/messages.js'
8
-
9
- let {
10
- children,
11
- onLangSelect,
12
- ...props
13
- }: LanguagePickerButtonProps & {
14
- onLangSelect: (langCode: string) => void
15
- } = $props();
16
-
17
- let context = getGlobalContext()
18
-
19
-
20
- const LANGUAGE_LIST = [
21
- {
22
- code: "en",
23
- label: "English (US)",
24
- flag: 'united states'
25
- },
26
- {
27
- code: "de",
28
- label: "Deutsch",
29
- flag: 'germany'
30
- },
31
- {
32
- code: "es",
33
- label: "Español",
34
- flag: 'spain'
35
- },
36
- {
37
- code: "fr",
38
- label: "Français",
39
- flag: 'france'
40
- },
41
- {
42
- code: "it",
43
- label: "Italiano",
44
- flag: 'italy'
45
- },
46
- {
47
- code: "pt",
48
- label: "Português",
49
- flag: 'portugal'
50
- },
51
- {
52
- code: "ru",
53
- label: "Русский",
54
- flag: 'russia'
55
- },
56
- {
57
- code: "vi",
58
- label: "Tiếng Việt",
59
- flag: 'vietnam'
60
- }
61
- // @ts-ignore
62
- ].filter(lang => context.supportLanguages!.includes(lang.code))
63
-
64
-
65
- let currentLangItem = $derived(LANGUAGE_LIST.find(l => l.code === context.language)!)
66
-
67
-
68
- function getFlagUrl(flag: string) {
69
- if (flag === 'spain') {
70
- return `${context.basePath ?? ''}/world-flags/${flag}.png`
71
- }
72
- return `${context.basePath ?? ''}/world-flags/${flag}.svg`
73
- }
74
-
75
- let openDialog = $state(false)
76
- </script>
77
-
78
- <!--add component here-->
79
- <button onclick={() => {openDialog = true}}
80
- class="h-8 flex items-center bg-neutral-token-4 text-neutral-token-9 rounded-full ps-2 pe-1 hover:bg-neutral-token-5 transition-all duration-element-react">
81
- <IconLanguage class="size-icon-xs"/>
82
- <img class="size-6 flag-img" src={getFlagUrl(currentLangItem.flag)} alt={currentLangItem.flag}>
83
- </button>
84
-
85
- <Dialog bind:open={openDialog} class="text-neutral-token-13" size="xs" staticRender>
86
- {#snippet header()}
87
- {m.text_select_language()}
88
- {/snippet}
89
- <div class="grid grid-cols-1 mx-auto gap-2">
90
- {#each LANGUAGE_LIST as lang}
91
- <button class="w-full flex gap-1 items-center justify-between text-start px-1 py-1 pe-2 rounded-full bg-neutral-token-3"
92
- onclick={() => {
93
- onLangSelect?.(lang.code)
94
- openDialog = false
95
- }}
96
- data-selected={lang.code === context.language ? '' : undefined}>
97
- <div class="flex items-center gap-2">
98
- <img class="size-8 flag-img" src={getFlagUrl(lang.flag)} alt={currentLangItem.flag} loading="lazy">
99
- {lang.label}
100
- </div>
101
- <div class="check">
102
- <IconCheck class="check size-icon-sm"/>
103
- </div>
104
- </button>
105
- {/each}
106
- </div>
107
- </Dialog>
108
-
109
-
1
+ <script lang="ts">
2
+ import {type LanguagePickerButtonProps} from "./LanguagePickerButton";
3
+ import {IconLanguage} from "../icons";
4
+ import {Dialog} from "../dialog";
5
+ import IconCheck from "../icons/IconCheck.svelte";
6
+ import {getGlobalContext} from "../tera-ui-context/global-context";
7
+ import * as m from '../../paraglide/messages.js'
8
+
9
+ let {
10
+ children,
11
+ onLangSelect,
12
+ ...props
13
+ }: LanguagePickerButtonProps & {
14
+ onLangSelect: (langCode: string) => void
15
+ } = $props();
16
+
17
+ let context = getGlobalContext()
18
+
19
+
20
+ const LANGUAGE_LIST = [
21
+ {
22
+ code: "en",
23
+ label: "English (US)",
24
+ flag: 'united states'
25
+ },
26
+ {
27
+ code: "de",
28
+ label: "Deutsch",
29
+ flag: 'germany'
30
+ },
31
+ {
32
+ code: "es",
33
+ label: "Español",
34
+ flag: 'spain'
35
+ },
36
+ {
37
+ code: "fr",
38
+ label: "Français",
39
+ flag: 'france'
40
+ },
41
+ {
42
+ code: "it",
43
+ label: "Italiano",
44
+ flag: 'italy'
45
+ },
46
+ {
47
+ code: "pt",
48
+ label: "Português",
49
+ flag: 'portugal'
50
+ },
51
+ {
52
+ code: "ru",
53
+ label: "Русский",
54
+ flag: 'russia'
55
+ },
56
+ {
57
+ code: "vi",
58
+ label: "Tiếng Việt",
59
+ flag: 'vietnam'
60
+ }
61
+ // @ts-ignore
62
+ ].filter(lang => context.supportLanguages!.includes(lang.code))
63
+
64
+
65
+ let currentLangItem = $derived(LANGUAGE_LIST.find(l => l.code === context.language)!)
66
+
67
+
68
+ function getFlagUrl(flag: string) {
69
+ if (flag === 'spain') {
70
+ return `${context.basePath ?? ''}/world-flags/${flag}.png`
71
+ }
72
+ return `${context.basePath ?? ''}/world-flags/${flag}.svg`
73
+ }
74
+
75
+ let openDialog = $state(false)
76
+ </script>
77
+
78
+ <!--add component here-->
79
+ <button onclick={() => {openDialog = true}}
80
+ class="h-8 flex items-center bg-neutral-token-4 text-neutral-token-9 rounded-full ps-2 pe-1 hover:bg-neutral-token-5 transition-all duration-element-react">
81
+ <IconLanguage class="size-icon-xs"/>
82
+ <img class="size-6 flag-img" src={getFlagUrl(currentLangItem.flag)} alt={currentLangItem.flag}>
83
+ </button>
84
+
85
+ <Dialog bind:open={openDialog} class="text-neutral-token-13" size="xs" staticRender>
86
+ {#snippet header()}
87
+ {m.text_select_language()}
88
+ {/snippet}
89
+ <div class="grid grid-cols-1 mx-auto gap-2">
90
+ {#each LANGUAGE_LIST as lang}
91
+ <button class="w-full flex gap-1 items-center justify-between text-start px-1 py-1 pe-2 rounded-full bg-neutral-token-3"
92
+ onclick={() => {
93
+ onLangSelect?.(lang.code)
94
+ openDialog = false
95
+ }}
96
+ data-selected={lang.code === context.language ? '' : undefined}>
97
+ <div class="flex items-center gap-2">
98
+ <img class="size-8 flag-img" src={getFlagUrl(lang.flag)} alt={currentLangItem.flag} loading="lazy">
99
+ {lang.label}
100
+ </div>
101
+ <div class="check">
102
+ <IconCheck class="check size-icon-sm"/>
103
+ </div>
104
+ </button>
105
+ {/each}
106
+ </div>
107
+ </Dialog>
108
+
109
+
110
110
  <style>button .check {
111
111
  opacity: 0;
112
112
  }
@@ -1,36 +1,36 @@
1
- <script lang="ts">
2
- import {type LightDarkToggleProps} from "./LightDarkToggle";
3
- import {Button} from "../button";
4
- import IconSun from "../icons/IconSun.svelte";
5
- import IconMoon from "../icons/IconMoon.svelte";
6
-
7
- let {children, ...props}: LightDarkToggleProps = $props();
8
-
9
- // $effect(() => {
10
- // const htmlElement = document.documentElement;
11
- // // Check for saved theme preference
12
- // const currentTheme = localStorage.getItem('theme');
13
- // if (currentTheme === 'dark') {
14
- // htmlElement.classList.add('dark');
15
- // } else {
16
- // htmlElement.classList.remove('dark');
17
- // }
18
- // })
19
-
20
- function toggleLightDarkTheme() {
21
- const htmlElement = document.documentElement;
22
-
23
- htmlElement.classList.toggle('dark');
24
- const theme = htmlElement.classList.contains('dark') ? 'dark' : 'light';
25
- localStorage.setItem('theme', theme);
26
- }
27
- </script>
28
-
29
- <!--add component here-->
30
- <Button variant="ghost" icon
31
- onclick={toggleLightDarkTheme}>
32
- <!-- Sun icon, animates out when in dark mode -->
33
- <IconSun class="icon-sun dark:hidden"/>
34
- <!-- Moon icon, animates in when in dark mode -->
35
- <IconMoon class="icon-moon hidden dark:block"/>
36
- </Button>
1
+ <script lang="ts">
2
+ import {type LightDarkToggleProps} from "./LightDarkToggle";
3
+ import {Button} from "../button";
4
+ import IconSun from "../icons/IconSun.svelte";
5
+ import IconMoon from "../icons/IconMoon.svelte";
6
+
7
+ let {children, ...props}: LightDarkToggleProps = $props();
8
+
9
+ // $effect(() => {
10
+ // const htmlElement = document.documentElement;
11
+ // // Check for saved theme preference
12
+ // const currentTheme = localStorage.getItem('theme');
13
+ // if (currentTheme === 'dark') {
14
+ // htmlElement.classList.add('dark');
15
+ // } else {
16
+ // htmlElement.classList.remove('dark');
17
+ // }
18
+ // })
19
+
20
+ function toggleLightDarkTheme() {
21
+ const htmlElement = document.documentElement;
22
+
23
+ htmlElement.classList.toggle('dark');
24
+ const theme = htmlElement.classList.contains('dark') ? 'dark' : 'light';
25
+ localStorage.setItem('theme', theme);
26
+ }
27
+ </script>
28
+
29
+ <!--add component here-->
30
+ <Button variant="ghost" icon
31
+ onclick={toggleLightDarkTheme}>
32
+ <!-- Sun icon, animates out when in dark mode -->
33
+ <IconSun class="icon-sun dark:hidden"/>
34
+ <!-- Moon icon, animates in when in dark mode -->
35
+ <IconMoon class="icon-moon hidden dark:block"/>
36
+ </Button>
@@ -1,137 +1,137 @@
1
- <script lang="ts">
2
- import {type PopoverProps} from "./Popover";
3
- import {arrow, autoUpdate, computePosition, flip, offset, shift, size} from "@floating-ui/dom";
4
- import {cn} from "../../utils/utils";
5
-
6
- import {clickOutside} from "../../actions/clickOutside"
7
- import {onDestroy, onMount} from "svelte";
8
-
9
- let {
10
- children,
11
- triggerRef,
12
- class: className,
13
- open = $bindable(),
14
- offset: offsetAmount = 3,
15
- padding: paddingAmount = 12,
16
- focusTriggerAfterClose = true,
17
- flip: enableFlip = false,
18
- autoTrigger = true,
19
- ...props
20
- }: PopoverProps = $props();
21
-
22
- let hasOpenedYet = $state(false)
23
-
24
- function togglePopover() {
25
- open = !open;
26
- }
27
-
28
-
29
- function handleClickOutside(e) {
30
- open = false
31
- }
32
-
33
- let popover = $state();
34
- let arrowElement = $state();
35
-
36
-
37
- function updatePosition() {
38
- computePosition(triggerRef, popover, {
39
- placement: 'bottom',
40
- middleware: [
41
- offset(offsetAmount),
42
- size({
43
- apply({rects, elements}) {
44
- Object.assign(elements.floating.style, {
45
- minWidth: `${rects.reference.width}px`,
46
- });
47
- },
48
- }),
49
- enableFlip ? flip() : undefined,
50
- shift({padding: paddingAmount}),
51
- arrow({element: arrowElement}),
52
- ],
53
- }).then(({x, y, placement, middlewareData}) => {
54
- Object.assign(popover.style, {
55
- left: `${x}px`,
56
- top: `${y}px`,
57
- });
58
- //
59
- // // Accessing the data
60
- // const {x: arrowX, y: arrowY} = middlewareData.arrow;
61
- //
62
- // const staticSide = {
63
- // top: 'bottom',
64
- // right: 'left',
65
- // bottom: 'top',
66
- // left: 'right',
67
- // }[placement.split('-')[0]];
68
- //
69
- // Object.assign(arrowElement.style, {
70
- // left: arrowX != null ? `${arrowX}px` : '',
71
- // top: arrowY != null ? `${arrowY}px` : '',
72
- // right: '',
73
- // bottom: '',
74
- // [staticSide]: '-4px',
75
- // });
76
- });
77
- }
78
-
79
- onMount(() => {
80
- if (autoTrigger)
81
- triggerRef?.addEventListener("click", togglePopover);
82
-
83
- })
84
-
85
- onDestroy(() => {
86
- if (autoTrigger)
87
- triggerRef?.removeEventListener("click", togglePopover);
88
-
89
- })
90
-
91
- $effect(() => {
92
- let cleanup: any
93
-
94
- if (open) {
95
- hasOpenedYet = true
96
- updatePosition()
97
-
98
- // Start auto updates.
99
- cleanup = autoUpdate(
100
- triggerRef,
101
- popover,
102
- updatePosition,
103
- );
104
- } else {
105
- cleanup?.()
106
- if (focusTriggerAfterClose && hasOpenedYet) {
107
- try {
108
- triggerRef.focus()
109
- } catch (e) {
110
- console.warn('Trigger element focus after close Popover error', e)
111
- }
112
- }
113
- }
114
-
115
- return () => {
116
- cleanup?.()
117
- }
118
- })
119
- </script>
120
-
121
- <!-- Popover Content -->
122
- {#if open}
123
- <div bind:this={popover}
124
- class={cn("overflow-hidden absolute z-10 bg-neutral-token-1 shadow-2xl rounded-container border border-neutral-token-5", className)}
125
- use:clickOutside={{exceptElement: triggerRef}}
126
- onclick_outside={handleClickOutside}
127
- {...props}
128
- >
129
- <!-- <div bind:this={arrowElement} class="size-2 absolute rotate-45 bg-inherit"></div>-->
130
- {@render children?.()}
131
- </div>
132
- {/if}
133
-
134
-
135
- <style>
136
-
1
+ <script lang="ts">
2
+ import {type PopoverProps} from "./Popover";
3
+ import {arrow, autoUpdate, computePosition, flip, offset, shift, size} from "@floating-ui/dom";
4
+ import {cn} from "../../utils/utils";
5
+
6
+ import {clickOutside} from "../../actions/clickOutside"
7
+ import {onDestroy, onMount} from "svelte";
8
+
9
+ let {
10
+ children,
11
+ triggerRef,
12
+ class: className,
13
+ open = $bindable(),
14
+ offset: offsetAmount = 3,
15
+ padding: paddingAmount = 12,
16
+ focusTriggerAfterClose = true,
17
+ flip: enableFlip = false,
18
+ autoTrigger = true,
19
+ ...props
20
+ }: PopoverProps = $props();
21
+
22
+ let hasOpenedYet = $state(false)
23
+
24
+ function togglePopover() {
25
+ open = !open;
26
+ }
27
+
28
+
29
+ function handleClickOutside(e) {
30
+ open = false
31
+ }
32
+
33
+ let popover = $state();
34
+ let arrowElement = $state();
35
+
36
+
37
+ function updatePosition() {
38
+ computePosition(triggerRef, popover, {
39
+ placement: 'bottom',
40
+ middleware: [
41
+ offset(offsetAmount),
42
+ size({
43
+ apply({rects, elements}) {
44
+ Object.assign(elements.floating.style, {
45
+ minWidth: `${rects.reference.width}px`,
46
+ });
47
+ },
48
+ }),
49
+ enableFlip ? flip() : undefined,
50
+ shift({padding: paddingAmount}),
51
+ arrow({element: arrowElement}),
52
+ ],
53
+ }).then(({x, y, placement, middlewareData}) => {
54
+ Object.assign(popover.style, {
55
+ left: `${x}px`,
56
+ top: `${y}px`,
57
+ });
58
+ //
59
+ // // Accessing the data
60
+ // const {x: arrowX, y: arrowY} = middlewareData.arrow;
61
+ //
62
+ // const staticSide = {
63
+ // top: 'bottom',
64
+ // right: 'left',
65
+ // bottom: 'top',
66
+ // left: 'right',
67
+ // }[placement.split('-')[0]];
68
+ //
69
+ // Object.assign(arrowElement.style, {
70
+ // left: arrowX != null ? `${arrowX}px` : '',
71
+ // top: arrowY != null ? `${arrowY}px` : '',
72
+ // right: '',
73
+ // bottom: '',
74
+ // [staticSide]: '-4px',
75
+ // });
76
+ });
77
+ }
78
+
79
+ onMount(() => {
80
+ if (autoTrigger)
81
+ triggerRef?.addEventListener("click", togglePopover);
82
+
83
+ })
84
+
85
+ onDestroy(() => {
86
+ if (autoTrigger)
87
+ triggerRef?.removeEventListener("click", togglePopover);
88
+
89
+ })
90
+
91
+ $effect(() => {
92
+ let cleanup: any
93
+
94
+ if (open) {
95
+ hasOpenedYet = true
96
+ updatePosition()
97
+
98
+ // Start auto updates.
99
+ cleanup = autoUpdate(
100
+ triggerRef,
101
+ popover,
102
+ updatePosition,
103
+ );
104
+ } else {
105
+ cleanup?.()
106
+ if (focusTriggerAfterClose && hasOpenedYet) {
107
+ try {
108
+ triggerRef.focus()
109
+ } catch (e) {
110
+ console.warn('Trigger element focus after close Popover error', e)
111
+ }
112
+ }
113
+ }
114
+
115
+ return () => {
116
+ cleanup?.()
117
+ }
118
+ })
119
+ </script>
120
+
121
+ <!-- Popover Content -->
122
+ {#if open}
123
+ <div bind:this={popover}
124
+ class={cn("overflow-hidden absolute z-10 bg-neutral-token-1 shadow-2xl rounded-container border border-neutral-token-5", className)}
125
+ use:clickOutside={{exceptElement: triggerRef}}
126
+ onclick_outside={handleClickOutside}
127
+ {...props}
128
+ >
129
+ <!-- <div bind:this={arrowElement} class="size-2 absolute rotate-45 bg-inherit"></div>-->
130
+ {@render children?.()}
131
+ </div>
132
+ {/if}
133
+
134
+
135
+ <style>
136
+
137
137
  </style>