tera-system-ui 0.0.20 → 0.0.22

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 (91) hide show
  1. package/dist/components/avatar/Avatar.d.ts +82 -0
  2. package/dist/components/avatar/Avatar.js +35 -0
  3. package/dist/components/avatar/Avatar.svelte +43 -0
  4. package/dist/components/avatar/Avatar.svelte.d.ts +3 -0
  5. package/dist/components/avatar/index.d.ts +1 -0
  6. package/dist/components/avatar/index.js +1 -0
  7. package/dist/components/brand-logo/BrandLogo.svelte +31 -31
  8. package/dist/components/button/Button.svelte +49 -49
  9. package/dist/components/combobox/Combobox.svelte +8 -8
  10. package/dist/components/command/command.scss +72 -72
  11. package/dist/components/command/components/Command.svelte +120 -120
  12. package/dist/components/command/components/CommandEmpty.svelte +30 -30
  13. package/dist/components/command/components/CommandGroup.svelte +110 -110
  14. package/dist/components/command/components/CommandInput.svelte +92 -92
  15. package/dist/components/command/components/CommandItem.svelte +110 -110
  16. package/dist/components/command/components/CommandList.svelte +56 -56
  17. package/dist/components/command/components/CommandLoading.svelte +28 -28
  18. package/dist/components/command/components/CommandSeparator.svelte +21 -21
  19. package/dist/components/dialog/Dialog.astro +63 -63
  20. package/dist/components/dialog/Dialog.svelte +109 -109
  21. package/dist/components/dialog/dialog.scss +115 -115
  22. package/dist/components/dropdown-menu/DropdownMenu.d.ts +22 -0
  23. package/dist/components/dropdown-menu/DropdownMenu.js +15 -0
  24. package/dist/components/dropdown-menu/components/DropdownMenu.svelte +34 -0
  25. package/dist/components/dropdown-menu/components/DropdownMenu.svelte.d.ts +3 -0
  26. package/dist/components/dropdown-menu/components/DropdownMenuGroup.svelte +12 -0
  27. package/dist/components/dropdown-menu/components/DropdownMenuGroup.svelte.d.ts +5 -0
  28. package/dist/components/dropdown-menu/components/DropdownMenuHeader.svelte +12 -0
  29. package/dist/components/dropdown-menu/components/DropdownMenuHeader.svelte.d.ts +5 -0
  30. package/dist/components/dropdown-menu/components/DropdownMenuItem.svelte +30 -0
  31. package/dist/components/dropdown-menu/components/DropdownMenuItem.svelte.d.ts +3 -0
  32. package/dist/components/dropdown-menu/components/DropdownMenuSeparator.svelte +11 -0
  33. package/dist/components/dropdown-menu/components/DropdownMenuSeparator.svelte.d.ts +5 -0
  34. package/dist/components/dropdown-menu/index.d.ts +5 -0
  35. package/dist/components/dropdown-menu/index.js +5 -0
  36. package/dist/components/header/Header.svelte +36 -36
  37. package/dist/components/header/header.scss +19 -19
  38. package/dist/components/icons/IconArrowBigRightFilled.svelte +10 -10
  39. package/dist/components/icons/IconBook.svelte +10 -10
  40. package/dist/components/icons/IconBookmarkPlus.svelte +10 -10
  41. package/dist/components/icons/IconCalculator.svelte +10 -10
  42. package/dist/components/icons/IconCheck.svelte +10 -10
  43. package/dist/components/icons/IconChevronDown.svelte +10 -10
  44. package/dist/components/icons/IconCopy.svelte +10 -10
  45. package/dist/components/icons/IconCopyCheckFilled.svelte +10 -10
  46. package/dist/components/icons/IconHamburger.svelte +10 -10
  47. package/dist/components/icons/IconLanguage.svelte +10 -10
  48. package/dist/components/icons/IconLoader2.svelte +10 -10
  49. package/dist/components/icons/IconLogout.svelte +10 -0
  50. package/dist/components/icons/IconLogout.svelte.d.ts +4 -0
  51. package/dist/components/icons/IconMoon.svelte +10 -10
  52. package/dist/components/icons/IconPointFilled.svelte +10 -10
  53. package/dist/components/icons/IconSearch.svelte +10 -10
  54. package/dist/components/icons/IconSettings.svelte +10 -0
  55. package/dist/components/icons/IconSettings.svelte.d.ts +4 -0
  56. package/dist/components/icons/IconSun.svelte +10 -10
  57. package/dist/components/icons/IconSwitchHorizontal.svelte +10 -10
  58. package/dist/components/icons/IconSwitchVertical.svelte +10 -10
  59. package/dist/components/icons/IconTransform.svelte +10 -10
  60. package/dist/components/icons/IconX.svelte +10 -10
  61. package/dist/components/icons/index.d.ts +2 -0
  62. package/dist/components/icons/index.js +2 -0
  63. package/dist/components/input/Input.svelte +24 -24
  64. package/dist/components/language-picker-button/LanguagePickerButton.svelte +109 -109
  65. package/dist/components/light-dark-toggle/LightDarkToggle.svelte +36 -36
  66. package/dist/components/popover/Popover.svelte +159 -137
  67. package/dist/components/popover-responsive/PopoverResponsive.svelte +87 -87
  68. package/dist/components/side-navigation/SideNavigation.svelte +114 -114
  69. package/dist/components/side-navigation/SideNavigationItem.svelte +17 -17
  70. package/dist/components/side-navigation/SideNavigationLayout.svelte +19 -19
  71. package/dist/components/side-navigation/sidenav.scss +149 -149
  72. package/dist/components/tera-ui-context/TeraUiContext.d.ts +1 -0
  73. package/dist/components/tera-ui-context/TeraUiContext.svelte +28 -28
  74. package/dist/components/user-avatar-with-menu/UserAvatarWithMenu.d.ts +11 -0
  75. package/dist/components/user-avatar-with-menu/UserAvatarWithMenu.js +7 -0
  76. package/dist/components/user-avatar-with-menu/UserAvatarWithMenu.svelte +68 -0
  77. package/dist/components/user-avatar-with-menu/UserAvatarWithMenu.svelte.d.ts +3 -0
  78. package/dist/components/user-avatar-with-menu/index.d.ts +1 -0
  79. package/dist/components/user-avatar-with-menu/index.js +1 -0
  80. package/dist/index.d.ts +4 -1
  81. package/dist/index.js +4 -1
  82. package/dist/internal/service/user.service.d.ts +2 -0
  83. package/dist/internal/service/user.service.js +20 -0
  84. package/dist/themes/scrollbar.scss +37 -37
  85. package/dist/themes/tera-ui-base.css +210 -210
  86. package/dist/themes/tw-preset.cjs +153 -153
  87. package/dist/types/user-data.d.ts +31 -0
  88. package/dist/types/user-data.js +1 -0
  89. package/package.json +98 -96
  90. package/scripts/add-component-template.js +120 -120
  91. package/scripts/generate-ts-index.js +138 -136
@@ -1,63 +1,63 @@
1
- ---
2
- import {type DialogPropsAstro, styles} from "./Dialog";
3
- import IconX from "../icons/IconX.svelte";
4
- import {Button} from "../button";
5
- import './dialog.scss'
6
-
7
- const {
8
- closeOnClickOutside = true,
9
- closeButton = true,
10
- size = 'sm',
11
- class: className,
12
- position = 'center',
13
- padding,
14
- focusTriggerAfterClose,
15
- ...props
16
- }: DialogPropsAstro = Astro.props
17
-
18
- const {base, dialog: dialogStyle, dialogContainer, header: headerStyle, body, footer: footerStyle} = styles({
19
- size,
20
- padding
21
- })
22
-
23
- const hasHeaderSlot = !!Astro.slots["header"];
24
- const hasFooterSlot = !!Astro.slots["footer"];
25
- ---
26
-
27
- <dialog class={dialogStyle() + ` ${className}`}
28
- data-position={position}
29
- onmousedown={closeOnClickOutside ? 'event.target==this && this.close()' : ''}
30
- size={size}
31
- {...props}
32
- >
33
- <button class=""></button>
34
-
35
- {closeButton &&
36
- <form method="dialog">
37
- <Button class="absolute right-1 top-1 [&>svg]:opacity-45 [&>svg]:hover:opacity-90 z-10"
38
- icon={true}
39
- client:idle
40
- variant="ghost"
41
- size="sm">
42
- <IconX/>
43
- </Button>
44
- </form>
45
- }
46
-
47
- <div class={"dialog-box " + dialogContainer()}>
48
- {hasHeaderSlot &&
49
- <header class={headerStyle()}>
50
- <slot name="header"/>
51
- </header>
52
- }
53
-
54
- <main class={body()}>
55
- <slot/>
56
- </main>
57
- {hasFooterSlot &&
58
- <footer class={footerStyle()}>
59
- <slot name="footer"/>
60
- </footer>
61
- }
62
- </div>
63
- </dialog>
1
+ ---
2
+ import {type DialogPropsAstro, styles} from "./Dialog";
3
+ import IconX from "../icons/IconX.svelte";
4
+ import {Button} from "../button";
5
+ import './dialog.scss'
6
+
7
+ const {
8
+ closeOnClickOutside = true,
9
+ closeButton = true,
10
+ size = 'sm',
11
+ class: className,
12
+ position = 'center',
13
+ padding,
14
+ focusTriggerAfterClose,
15
+ ...props
16
+ }: DialogPropsAstro = Astro.props
17
+
18
+ const {base, dialog: dialogStyle, dialogContainer, header: headerStyle, body, footer: footerStyle} = styles({
19
+ size,
20
+ padding
21
+ })
22
+
23
+ const hasHeaderSlot = !!Astro.slots["header"];
24
+ const hasFooterSlot = !!Astro.slots["footer"];
25
+ ---
26
+
27
+ <dialog class={dialogStyle() + ` ${className}`}
28
+ data-position={position}
29
+ onmousedown={closeOnClickOutside ? 'event.target==this && this.close()' : ''}
30
+ size={size}
31
+ {...props}
32
+ >
33
+ <button class=""></button>
34
+
35
+ {closeButton &&
36
+ <form method="dialog">
37
+ <Button class="absolute right-1 top-1 [&>svg]:opacity-45 [&>svg]:hover:opacity-90 z-10"
38
+ icon={true}
39
+ client:idle
40
+ variant="ghost"
41
+ size="sm">
42
+ <IconX/>
43
+ </Button>
44
+ </form>
45
+ }
46
+
47
+ <div class={"dialog-box " + dialogContainer()}>
48
+ {hasHeaderSlot &&
49
+ <header class={headerStyle()}>
50
+ <slot name="header"/>
51
+ </header>
52
+ }
53
+
54
+ <main class={body()}>
55
+ <slot/>
56
+ </main>
57
+ {hasFooterSlot &&
58
+ <footer class={footerStyle()}>
59
+ <slot name="footer"/>
60
+ </footer>
61
+ }
62
+ </div>
63
+ </dialog>
@@ -1,110 +1,110 @@
1
- <script lang="ts">
2
- import {type DialogProps, styles} from "./Dialog";
3
- import IconX from "../icons/IconX.svelte";
4
- import {Button} from "../button";
5
- import './dialog.scss'
6
- import {sleep} from "../../internal/helpers/sleep";
7
-
8
- let {
9
- children, open = $bindable(),
10
- closeOnClickOutside = true,
11
- closeButton = true,
12
- size = 'sm',
13
- header,
14
- footer,
15
- class: className,
16
- position = 'center',
17
- padding,
18
- staticRender = false,
19
- triggerRef,
20
- focusTriggerAfterClose,
21
- ...props
22
- }: DialogProps = $props();
23
-
24
- let dialog;
25
-
26
- let hasOpened = $state(false);
27
-
28
- // Watch for prop changes to open/close the dialog
29
- $effect(() => {
30
- if (open) {
31
- stillAnimating = open
32
- dialog?.showModal();
33
-
34
- if (!hasOpened)
35
- hasOpened = true
36
- } else {
37
- dialog?.close()
38
- sleep(200).then(() => {
39
- stillAnimating = open
40
- console.log('stillAnimating', stillAnimating)
41
- })
42
-
43
- if (focusTriggerAfterClose && hasOpened && triggerRef) {
44
- triggerRef.focus()
45
- }
46
- }
47
- })
48
-
49
- // Close dialog on clicking outside (optional)
50
- function handleClickOutside(e) {
51
- if (closeOnClickOutside && e.target === dialog) {
52
- dialog?.close();
53
- }
54
- }
55
-
56
- // Emit close event when dialog is closed
57
- function handleClose() {
58
- open = false;
59
- }
60
-
61
- // onmousedown={closeOnClickOutside ? 'event.target==this && this.close()' : ''}
62
-
63
- const {base, dialog: dialogStyle, dialogContainer, header: headerStyle, body, footer: footerStyle} = styles({
64
- size,
65
- padding
66
- })
67
-
68
- let stillAnimating = $state()
69
-
70
- </script>
71
-
72
- {#if staticRender || (!staticRender && (open || stillAnimating))}
73
- <dialog class={dialogStyle() + ` ${className}`}
74
- data-position={position}
75
- bind:this={dialog}
76
- onclose={handleClose}
77
- onmousedown={handleClickOutside}
78
- size={size}
79
-
80
- {...props}
81
- >
82
- <button class=""></button>
83
- {#if (closeButton)}
84
- <form method="dialog">
85
- <Button class="absolute right-1 top-1 [&>svg]:opacity-45 [&>svg]:hover:opacity-90 z-10" icon
86
- variant="ghost"
87
- size="sm">
88
- <IconX/>
89
- </Button>
90
- </form>
91
- {/if}
92
-
93
- <div class={"dialog-box " + dialogContainer()}>
94
- {#if header}
95
- <header class={headerStyle()}>
96
- {@render header?.()}
97
- </header>
98
- {/if}
99
-
100
- <main class={body()}>
101
- {@render children?.()}
102
- </main>
103
- {#if footer}
104
- <footer class={footerStyle()}>
105
- {@render footer?.()}
106
- </footer>
107
- {/if}
108
- </div>
109
- </dialog>
1
+ <script lang="ts">
2
+ import {type DialogProps, styles} from "./Dialog";
3
+ import IconX from "../icons/IconX.svelte";
4
+ import {Button} from "../button";
5
+ import './dialog.scss'
6
+ import {sleep} from "../../internal/helpers/sleep";
7
+
8
+ let {
9
+ children, open = $bindable(),
10
+ closeOnClickOutside = true,
11
+ closeButton = true,
12
+ size = 'sm',
13
+ header,
14
+ footer,
15
+ class: className,
16
+ position = 'center',
17
+ padding,
18
+ staticRender = false,
19
+ triggerRef,
20
+ focusTriggerAfterClose,
21
+ ...props
22
+ }: DialogProps = $props();
23
+
24
+ let dialog;
25
+
26
+ let hasOpened = $state(false);
27
+
28
+ // Watch for prop changes to open/close the dialog
29
+ $effect(() => {
30
+ if (open) {
31
+ stillAnimating = open
32
+ dialog?.showModal();
33
+
34
+ if (!hasOpened)
35
+ hasOpened = true
36
+ } else {
37
+ dialog?.close()
38
+ sleep(200).then(() => {
39
+ stillAnimating = open
40
+ console.log('stillAnimating', stillAnimating)
41
+ })
42
+
43
+ if (focusTriggerAfterClose && hasOpened && triggerRef) {
44
+ triggerRef.focus()
45
+ }
46
+ }
47
+ })
48
+
49
+ // Close dialog on clicking outside (optional)
50
+ function handleClickOutside(e) {
51
+ if (closeOnClickOutside && e.target === dialog) {
52
+ dialog?.close();
53
+ }
54
+ }
55
+
56
+ // Emit close event when dialog is closed
57
+ function handleClose() {
58
+ open = false;
59
+ }
60
+
61
+ // onmousedown={closeOnClickOutside ? 'event.target==this && this.close()' : ''}
62
+
63
+ const {base, dialog: dialogStyle, dialogContainer, header: headerStyle, body, footer: footerStyle} = styles({
64
+ size,
65
+ padding
66
+ })
67
+
68
+ let stillAnimating = $state()
69
+
70
+ </script>
71
+
72
+ {#if staticRender || (!staticRender && (open || stillAnimating))}
73
+ <dialog class={dialogStyle() + ` ${className}`}
74
+ data-position={position}
75
+ bind:this={dialog}
76
+ onclose={handleClose}
77
+ onmousedown={handleClickOutside}
78
+ size={size}
79
+
80
+ {...props}
81
+ >
82
+ <button class=""></button>
83
+ {#if (closeButton)}
84
+ <form method="dialog">
85
+ <Button class="absolute right-1 top-1 [&>svg]:opacity-45 [&>svg]:hover:opacity-90 z-10" icon
86
+ variant="ghost"
87
+ size="sm">
88
+ <IconX/>
89
+ </Button>
90
+ </form>
91
+ {/if}
92
+
93
+ <div class={"dialog-box " + dialogContainer()}>
94
+ {#if header}
95
+ <header class={headerStyle()}>
96
+ {@render header?.()}
97
+ </header>
98
+ {/if}
99
+
100
+ <main class={body()}>
101
+ {@render children?.()}
102
+ </main>
103
+ {#if footer}
104
+ <footer class={footerStyle()}>
105
+ {@render footer?.()}
106
+ </footer>
107
+ {/if}
108
+ </div>
109
+ </dialog>
110
110
  {/if}
@@ -1,116 +1,116 @@
1
- .dialog-box {
2
- max-height: min(calc(100svh - 1rem), 55rem);
3
- overflow-y: auto;
4
- overscroll-behavior: contain;
5
- display: grid;
6
- grid-template-rows: auto 1fr auto;
7
- width: 100%;
8
- @apply bg-neutral-token-1 relative top-0 left-0 bottom-0;
9
-
10
- main {
11
- overflow: auto;
12
- }
13
- }
14
-
15
- dialog, dialog:modal {
16
- max-height: 100svh;
17
- width: 100%;
18
- height: fit-content;
19
- }
20
-
21
- dialog {
22
- &[size="xs"] {
23
- width: 24rem;
24
- max-width: min(calc(100vw - 1rem), 24rem);
25
- }
26
- &[size="sm"] {
27
- width: 30rem;
28
- max-width: min(calc(100vw - 1rem), 30rem);
29
- }
30
-
31
- &[size="md"] {
32
- width: 40rem;
33
- max-width: min(calc(100vw - 1rem), 40rem);
34
- }
35
-
36
- &[size="lg"] {
37
- width: 50rem;
38
- max-width: min(calc(100vw - 1rem), 50rem);
39
- }
40
-
41
- &[size="full"] {
42
- width: 100vw;
43
- max-width: 100vw;
44
- @apply rounded-none;
45
- }
46
-
47
- }
48
-
49
- dialog[open] {
50
- //@apply grid place-content-center grid-cols-1;
51
- @apply inline-flex;
52
- }
53
-
54
- dialog {
55
- &[data-position="top"] {
56
- position: fixed;
57
- top: 0;
58
- left: 50%;
59
- transform: translateX(-50%) translateY(0.5rem);
60
- margin: 0;
61
- }
62
-
63
-
64
- --transition-duration: 0.2s;
65
- transform: translateY(0px);
66
-
67
- &, &::backdrop {
68
- transition: display var(--transition-duration) allow-discrete, overlay var(--transition-duration) allow-discrete, opacity var(--transition-duration), transform var(--transition-duration) allow-discrete,;
69
- opacity: 0;
70
- }
71
-
72
- &[open] {
73
- opacity: 1;
74
- &::backdrop {
75
- opacity: 1;
76
- }
77
- }
78
-
79
- &:not([open]) {
80
- transform: translateX(0) translateY(-40px);
81
-
82
- &[data-position="top"] {
83
- top: 0;
84
- left: 50%;
85
- transform: translateX(-50%) translateY(-40px);
86
- }
87
-
88
- opacity: 0;
89
-
90
- &::backdrop {
91
- opacity: 0; /* Fade-out backdrop */
92
- }
93
- }
94
-
95
- @starting-style {
96
- &[open] {
97
- transform: translateX(0) translateY(-40px);
98
-
99
- &[data-position="top"] {
100
- top: 0;
101
- left: 50%;
102
- transform: translateX(-50%) translateY(-40px);
103
- }
104
- }
105
-
106
- &[open],
107
- &[open]::backdrop {
108
- opacity: 0;
109
- }
110
- }
111
- }
112
-
113
-
114
- dialog::backdrop {
115
- @apply backdrop-blur-[0.2rem] bg-neutral-token-13/20;
1
+ .dialog-box {
2
+ max-height: min(calc(100svh - 1rem), 55rem);
3
+ overflow-y: auto;
4
+ overscroll-behavior: contain;
5
+ display: grid;
6
+ grid-template-rows: auto 1fr auto;
7
+ width: 100%;
8
+ @apply bg-neutral-token-1 relative top-0 left-0 bottom-0;
9
+
10
+ main {
11
+ overflow: auto;
12
+ }
13
+ }
14
+
15
+ dialog, dialog:modal {
16
+ max-height: 100svh;
17
+ width: 100%;
18
+ height: fit-content;
19
+ }
20
+
21
+ dialog {
22
+ &[size="xs"] {
23
+ width: 24rem;
24
+ max-width: min(calc(100vw - 1rem), 24rem);
25
+ }
26
+ &[size="sm"] {
27
+ width: 30rem;
28
+ max-width: min(calc(100vw - 1rem), 30rem);
29
+ }
30
+
31
+ &[size="md"] {
32
+ width: 40rem;
33
+ max-width: min(calc(100vw - 1rem), 40rem);
34
+ }
35
+
36
+ &[size="lg"] {
37
+ width: 50rem;
38
+ max-width: min(calc(100vw - 1rem), 50rem);
39
+ }
40
+
41
+ &[size="full"] {
42
+ width: 100vw;
43
+ max-width: 100vw;
44
+ @apply rounded-none;
45
+ }
46
+
47
+ }
48
+
49
+ dialog[open] {
50
+ //@apply grid place-content-center grid-cols-1;
51
+ @apply inline-flex;
52
+ }
53
+
54
+ dialog {
55
+ &[data-position="top"] {
56
+ position: fixed;
57
+ top: 0;
58
+ left: 50%;
59
+ transform: translateX(-50%) translateY(0.5rem);
60
+ margin: 0;
61
+ }
62
+
63
+
64
+ --transition-duration: 0.2s;
65
+ transform: translateY(0px);
66
+
67
+ &, &::backdrop {
68
+ transition: display var(--transition-duration) allow-discrete, overlay var(--transition-duration) allow-discrete, opacity var(--transition-duration), transform var(--transition-duration) allow-discrete,;
69
+ opacity: 0;
70
+ }
71
+
72
+ &[open] {
73
+ opacity: 1;
74
+ &::backdrop {
75
+ opacity: 1;
76
+ }
77
+ }
78
+
79
+ &:not([open]) {
80
+ transform: translateX(0) translateY(-40px);
81
+
82
+ &[data-position="top"] {
83
+ top: 0;
84
+ left: 50%;
85
+ transform: translateX(-50%) translateY(-40px);
86
+ }
87
+
88
+ opacity: 0;
89
+
90
+ &::backdrop {
91
+ opacity: 0; /* Fade-out backdrop */
92
+ }
93
+ }
94
+
95
+ @starting-style {
96
+ &[open] {
97
+ transform: translateX(0) translateY(-40px);
98
+
99
+ &[data-position="top"] {
100
+ top: 0;
101
+ left: 50%;
102
+ transform: translateX(-50%) translateY(-40px);
103
+ }
104
+ }
105
+
106
+ &[open],
107
+ &[open]::backdrop {
108
+ opacity: 0;
109
+ }
110
+ }
111
+ }
112
+
113
+
114
+ dialog::backdrop {
115
+ @apply backdrop-blur-[0.2rem] bg-neutral-token-13/20;
116
116
  }
@@ -0,0 +1,22 @@
1
+ import { type VariantProps } from "tailwind-variants";
2
+ export declare const styles: import("tailwind-variants").TVReturnType<{}, undefined, "", import("tailwind-variants/dist/config").TVConfig<{}, {}>, {}, undefined, import("tailwind-variants").TVReturnType<{}, undefined, "", import("tailwind-variants/dist/config").TVConfig<{}, {}>, unknown, unknown, undefined>>;
3
+ type DropdownMenuVariants = VariantProps<typeof styles>;
4
+ export interface DropdownMenuProps extends DropdownMenuVariants {
5
+ children?: any;
6
+ class?: string;
7
+ triggerRef: any;
8
+ open?: boolean;
9
+ }
10
+ export type DropdownMenuContext = {
11
+ setOpen: (open: boolean) => void;
12
+ getOpen: () => boolean;
13
+ };
14
+ export declare function getCtx(): DropdownMenuContext;
15
+ export declare function setCtx(context: DropdownMenuContext): void;
16
+ export type DropdownMenuItemProps = {
17
+ children?: any;
18
+ class?: string;
19
+ onclick?: (e: any) => void;
20
+ href?: string;
21
+ };
22
+ export {};
@@ -0,0 +1,15 @@
1
+ import { tv } from "tailwind-variants";
2
+ import { getContext, setContext } from "svelte";
3
+ export const styles = tv({
4
+ base: '',
5
+ variants: {},
6
+ compoundVariants: [],
7
+ defaultVariants: {},
8
+ });
9
+ const CONTEXT_NAME = 'DropdownMenu';
10
+ export function getCtx() {
11
+ return getContext(CONTEXT_NAME);
12
+ }
13
+ export function setCtx(context) {
14
+ setContext(CONTEXT_NAME, context);
15
+ }
@@ -0,0 +1,34 @@
1
+ <script lang="ts">
2
+ import {type DropdownMenuProps, setCtx} from "../DropdownMenu";
3
+ import {Popover} from "../../popover";
4
+
5
+ let {
6
+ children,
7
+ open = $bindable(),
8
+ triggerRef,
9
+
10
+ ...props
11
+ }: DropdownMenuProps = $props();
12
+
13
+ function setOpen(o: boolean) {
14
+ open = o;
15
+ }
16
+
17
+ setCtx({
18
+ setOpen,
19
+ getOpen: () => !!open
20
+ })
21
+
22
+ </script>
23
+
24
+ <Popover
25
+ triggerRef={triggerRef}
26
+ offset={4}
27
+ bind:open
28
+ class=""
29
+ flip="true"
30
+ role="menu"
31
+ {...props}
32
+ >
33
+ {@render children?.()}
34
+ </Popover>
@@ -0,0 +1,3 @@
1
+ import { type DropdownMenuProps } from "../DropdownMenu";
2
+ declare const DropdownMenu: import("svelte").Component<DropdownMenuProps, {}, "open">;
3
+ export default DropdownMenu;
@@ -0,0 +1,12 @@
1
+ <script lang="ts">
2
+ import {cn} from "../../../utils/utils";
3
+
4
+ let {children, class: className, ...props} = $props()
5
+ </script>
6
+
7
+ <div class={cn('p-1', className)}
8
+ data-dropdown-menu-group
9
+ role="group"
10
+ {...props}>
11
+ {@render children?.()}
12
+ </div>
@@ -0,0 +1,5 @@
1
+ declare const DropdownMenuGroup: import("svelte").Component<{
2
+ children: unknown;
3
+ class: unknown;
4
+ } & Record<string, unknown>, {}, "">;
5
+ export default DropdownMenuGroup;