@aspect-ops/exon-ui 0.0.1

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 (106) hide show
  1. package/dist/components/Badge/Badge.svelte +60 -0
  2. package/dist/components/Badge/Badge.svelte.d.ts +9 -0
  3. package/dist/components/Badge/index.d.ts +2 -0
  4. package/dist/components/Badge/index.js +1 -0
  5. package/dist/components/BottomNav/BottomNav.svelte +128 -0
  6. package/dist/components/BottomNav/BottomNav.svelte.d.ts +8 -0
  7. package/dist/components/BottomNav/BottomNavItem.svelte +133 -0
  8. package/dist/components/BottomNav/BottomNavItem.svelte.d.ts +8 -0
  9. package/dist/components/Breadcrumbs/BreadcrumbItem.svelte +65 -0
  10. package/dist/components/Breadcrumbs/BreadcrumbItem.svelte.d.ts +7 -0
  11. package/dist/components/Breadcrumbs/BreadcrumbSeparator.svelte +27 -0
  12. package/dist/components/Breadcrumbs/BreadcrumbSeparator.svelte.d.ts +7 -0
  13. package/dist/components/Breadcrumbs/Breadcrumbs.svelte +114 -0
  14. package/dist/components/Breadcrumbs/Breadcrumbs.svelte.d.ts +8 -0
  15. package/dist/components/Button/Button.svelte +209 -0
  16. package/dist/components/Button/Button.svelte.d.ts +14 -0
  17. package/dist/components/Button/index.d.ts +2 -0
  18. package/dist/components/Button/index.js +1 -0
  19. package/dist/components/Checkbox/Checkbox.svelte +166 -0
  20. package/dist/components/Checkbox/Checkbox.svelte.d.ts +16 -0
  21. package/dist/components/Checkbox/CheckboxGroup.svelte +55 -0
  22. package/dist/components/Checkbox/CheckboxGroup.svelte.d.ts +12 -0
  23. package/dist/components/Checkbox/index.d.ts +2 -0
  24. package/dist/components/Checkbox/index.js +2 -0
  25. package/dist/components/FormField/FormField.svelte +101 -0
  26. package/dist/components/FormField/FormField.svelte.d.ts +13 -0
  27. package/dist/components/FormField/index.d.ts +1 -0
  28. package/dist/components/FormField/index.js +1 -0
  29. package/dist/components/Icon/Icon.svelte +47 -0
  30. package/dist/components/Icon/Icon.svelte.d.ts +11 -0
  31. package/dist/components/Icon/index.d.ts +2 -0
  32. package/dist/components/Icon/index.js +1 -0
  33. package/dist/components/Link/Link.svelte +56 -0
  34. package/dist/components/Link/Link.svelte.d.ts +9 -0
  35. package/dist/components/Link/index.d.ts +2 -0
  36. package/dist/components/Link/index.js +1 -0
  37. package/dist/components/Menu/Menu.svelte +14 -0
  38. package/dist/components/Menu/Menu.svelte.d.ts +7 -0
  39. package/dist/components/Menu/MenuContent.svelte +71 -0
  40. package/dist/components/Menu/MenuContent.svelte.d.ts +10 -0
  41. package/dist/components/Menu/MenuItem.svelte +73 -0
  42. package/dist/components/Menu/MenuItem.svelte.d.ts +7 -0
  43. package/dist/components/Menu/MenuSeparator.svelte +19 -0
  44. package/dist/components/Menu/MenuSeparator.svelte.d.ts +6 -0
  45. package/dist/components/Menu/MenuSub.svelte +14 -0
  46. package/dist/components/Menu/MenuSub.svelte.d.ts +7 -0
  47. package/dist/components/Menu/MenuSubContent.svelte +60 -0
  48. package/dist/components/Menu/MenuSubContent.svelte.d.ts +7 -0
  49. package/dist/components/Menu/MenuSubTrigger.svelte +84 -0
  50. package/dist/components/Menu/MenuSubTrigger.svelte.d.ts +7 -0
  51. package/dist/components/Menu/MenuTrigger.svelte +32 -0
  52. package/dist/components/Menu/MenuTrigger.svelte.d.ts +7 -0
  53. package/dist/components/Navbar/NavItem.svelte +99 -0
  54. package/dist/components/Navbar/NavItem.svelte.d.ts +8 -0
  55. package/dist/components/Navbar/Navbar.svelte +243 -0
  56. package/dist/components/Navbar/Navbar.svelte.d.ts +10 -0
  57. package/dist/components/Radio/Radio.svelte +93 -0
  58. package/dist/components/Radio/Radio.svelte.d.ts +10 -0
  59. package/dist/components/Radio/RadioGroup.svelte +72 -0
  60. package/dist/components/Radio/RadioGroup.svelte.d.ts +14 -0
  61. package/dist/components/Radio/index.d.ts +2 -0
  62. package/dist/components/Radio/index.js +2 -0
  63. package/dist/components/Select/Select.svelte +251 -0
  64. package/dist/components/Select/Select.svelte.d.ts +17 -0
  65. package/dist/components/Select/index.d.ts +1 -0
  66. package/dist/components/Select/index.js +1 -0
  67. package/dist/components/Sidebar/Sidebar.svelte +48 -0
  68. package/dist/components/Sidebar/Sidebar.svelte.d.ts +7 -0
  69. package/dist/components/Sidebar/SidebarGroup.svelte +141 -0
  70. package/dist/components/Sidebar/SidebarGroup.svelte.d.ts +7 -0
  71. package/dist/components/Sidebar/SidebarItem.svelte +151 -0
  72. package/dist/components/Sidebar/SidebarItem.svelte.d.ts +8 -0
  73. package/dist/components/Switch/Switch.svelte +120 -0
  74. package/dist/components/Switch/Switch.svelte.d.ts +13 -0
  75. package/dist/components/Switch/index.d.ts +1 -0
  76. package/dist/components/Switch/index.js +1 -0
  77. package/dist/components/Tabs/TabContent.svelte +91 -0
  78. package/dist/components/Tabs/TabContent.svelte.d.ts +7 -0
  79. package/dist/components/Tabs/TabList.svelte +46 -0
  80. package/dist/components/Tabs/TabList.svelte.d.ts +7 -0
  81. package/dist/components/Tabs/TabTrigger.svelte +68 -0
  82. package/dist/components/Tabs/TabTrigger.svelte.d.ts +7 -0
  83. package/dist/components/Tabs/Tabs.svelte +69 -0
  84. package/dist/components/Tabs/Tabs.svelte.d.ts +7 -0
  85. package/dist/components/TextInput/TextInput.svelte +200 -0
  86. package/dist/components/TextInput/TextInput.svelte.d.ts +35 -0
  87. package/dist/components/TextInput/index.d.ts +1 -0
  88. package/dist/components/TextInput/index.js +1 -0
  89. package/dist/components/Textarea/Textarea.svelte +198 -0
  90. package/dist/components/Textarea/Textarea.svelte.d.ts +33 -0
  91. package/dist/components/Textarea/index.d.ts +1 -0
  92. package/dist/components/Textarea/index.js +1 -0
  93. package/dist/components/Typography/Typography.svelte +99 -0
  94. package/dist/components/Typography/Typography.svelte.d.ts +10 -0
  95. package/dist/components/Typography/index.d.ts +2 -0
  96. package/dist/components/Typography/index.js +1 -0
  97. package/dist/index.d.ts +37 -0
  98. package/dist/index.js +41 -0
  99. package/dist/styles/tokens.css +431 -0
  100. package/dist/test-setup.d.ts +1 -0
  101. package/dist/test-setup.js +1 -0
  102. package/dist/types/index.d.ts +129 -0
  103. package/dist/types/index.js +1 -0
  104. package/dist/types/navigation.d.ts +118 -0
  105. package/dist/types/navigation.js +1 -0
  106. package/package.json +130 -0
@@ -0,0 +1,56 @@
1
+ <script lang="ts">
2
+ interface Props {
3
+ href: string;
4
+ external?: boolean;
5
+ class?: string;
6
+ children?: import('svelte').Snippet;
7
+ }
8
+
9
+ let { href, external, class: className = '', children }: Props = $props();
10
+
11
+ const isExternal = $derived(external ?? href.startsWith('http'));
12
+ </script>
13
+
14
+ {#if isExternal}
15
+ <a {href} class="link {className}" target="_blank" rel="noopener noreferrer">
16
+ {#if children}
17
+ {@render children()}
18
+ {/if}
19
+ <span class="link__icon" aria-hidden="true">�</span>
20
+ </a>
21
+ {:else}
22
+ <a {href} class="link {className}">
23
+ {#if children}
24
+ {@render children()}
25
+ {/if}
26
+ </a>
27
+ {/if}
28
+
29
+ <style>
30
+ .link {
31
+ display: inline-flex;
32
+ align-items: center;
33
+ gap: var(--space-xs, 0.25rem);
34
+ color: var(--color-primary, #3b82f6);
35
+ text-decoration: none;
36
+ font-family: inherit;
37
+ font-weight: 500;
38
+ transition: color var(--transition-fast, 150ms ease);
39
+ }
40
+
41
+ .link:hover {
42
+ color: var(--color-primary-hover, #2563eb);
43
+ text-decoration: underline;
44
+ }
45
+
46
+ .link:focus-visible {
47
+ outline: 2px solid var(--color-primary, #3b82f6);
48
+ outline-offset: 2px;
49
+ border-radius: var(--radius-sm, 0.25rem);
50
+ }
51
+
52
+ .link__icon {
53
+ font-size: 0.75em;
54
+ opacity: 0.7;
55
+ }
56
+ </style>
@@ -0,0 +1,9 @@
1
+ interface Props {
2
+ href: string;
3
+ external?: boolean;
4
+ class?: string;
5
+ children?: import('svelte').Snippet;
6
+ }
7
+ declare const Link: import("svelte").Component<Props, {}, "">;
8
+ type Link = ReturnType<typeof Link>;
9
+ export default Link;
@@ -0,0 +1,2 @@
1
+ export { default as Link } from './Link.svelte';
2
+ export type { LinkProps } from '../../types/index.js';
@@ -0,0 +1 @@
1
+ export { default as Link } from './Link.svelte';
@@ -0,0 +1,14 @@
1
+ <script lang="ts">
2
+ import type { MenuProps } from '../../types/index.js';
3
+ import { DropdownMenu } from 'bits-ui';
4
+
5
+ interface Props extends MenuProps {
6
+ children?: import('svelte').Snippet;
7
+ }
8
+
9
+ let { class: className = '', children }: Props = $props();
10
+ </script>
11
+
12
+ <DropdownMenu.Root>
13
+ {@render children?.()}
14
+ </DropdownMenu.Root>
@@ -0,0 +1,7 @@
1
+ import type { MenuProps } from '../../types/index.js';
2
+ interface Props extends MenuProps {
3
+ children?: import('svelte').Snippet;
4
+ }
5
+ declare const Menu: import("svelte").Component<Props, {}, "">;
6
+ type Menu = ReturnType<typeof Menu>;
7
+ export default Menu;
@@ -0,0 +1,71 @@
1
+ <script lang="ts">
2
+ import type { MenuContentProps } from '../../types/index.js';
3
+ import { DropdownMenu } from 'bits-ui';
4
+
5
+ interface Props extends MenuContentProps {
6
+ side?: 'top' | 'right' | 'bottom' | 'left';
7
+ align?: 'start' | 'center' | 'end';
8
+ sideOffset?: number;
9
+ children?: import('svelte').Snippet;
10
+ }
11
+
12
+ let {
13
+ class: className = '',
14
+ side = 'bottom',
15
+ align = 'start',
16
+ sideOffset = 4,
17
+ children
18
+ }: Props = $props();
19
+ </script>
20
+
21
+ <DropdownMenu.Portal>
22
+ <DropdownMenu.Content class="menu-content {className}" {side} {align} {sideOffset}>
23
+ {@render children?.()}
24
+ </DropdownMenu.Content>
25
+ </DropdownMenu.Portal>
26
+
27
+ <style>
28
+ :global(.menu-content) {
29
+ /* MUST set font-family explicitly - portal doesn't inherit (F33) */
30
+ font-family: var(--font-family, system-ui, -apple-system, sans-serif);
31
+ background: var(--color-bg, #ffffff);
32
+ border: 1px solid var(--color-border, #e5e7eb);
33
+ border-radius: var(--radius-md, 0.375rem);
34
+ padding: var(--space-xs, 0.25rem);
35
+ box-shadow: var(--shadow-md, 0 4px 6px rgba(0, 0, 0, 0.1));
36
+ z-index: 50;
37
+ min-width: 8rem;
38
+ max-width: 20rem;
39
+ }
40
+
41
+ /* Animation states */
42
+ :global(.menu-content[data-state='open']) {
43
+ animation: menu-fade-in 150ms ease-out;
44
+ }
45
+
46
+ :global(.menu-content[data-state='closed']) {
47
+ animation: menu-fade-out 100ms ease-in;
48
+ }
49
+
50
+ @keyframes -global-menu-fade-in {
51
+ from {
52
+ opacity: 0;
53
+ transform: scale(0.95);
54
+ }
55
+ to {
56
+ opacity: 1;
57
+ transform: scale(1);
58
+ }
59
+ }
60
+
61
+ @keyframes -global-menu-fade-out {
62
+ from {
63
+ opacity: 1;
64
+ transform: scale(1);
65
+ }
66
+ to {
67
+ opacity: 0;
68
+ transform: scale(0.95);
69
+ }
70
+ }
71
+ </style>
@@ -0,0 +1,10 @@
1
+ import type { MenuContentProps } from '../../types/index.js';
2
+ interface Props extends MenuContentProps {
3
+ side?: 'top' | 'right' | 'bottom' | 'left';
4
+ align?: 'start' | 'center' | 'end';
5
+ sideOffset?: number;
6
+ children?: import('svelte').Snippet;
7
+ }
8
+ declare const MenuContent: import("svelte").Component<Props, {}, "">;
9
+ type MenuContent = ReturnType<typeof MenuContent>;
10
+ export default MenuContent;
@@ -0,0 +1,73 @@
1
+ <script lang="ts">
2
+ import type { MenuItemProps } from '../../types/index.js';
3
+ import { DropdownMenu } from 'bits-ui';
4
+
5
+ interface Props extends MenuItemProps {
6
+ children?: import('svelte').Snippet;
7
+ }
8
+
9
+ let { class: className = '', disabled = false, icon = '', children }: Props = $props();
10
+ </script>
11
+
12
+ <DropdownMenu.Item class="menu-item {className}" {disabled}>
13
+ {#if icon}
14
+ <span class="menu-item-icon">{icon}</span>
15
+ {/if}
16
+ <span class="menu-item-label">
17
+ {@render children?.()}
18
+ </span>
19
+ </DropdownMenu.Item>
20
+
21
+ <style>
22
+ :global(.menu-item) {
23
+ font-family: inherit;
24
+ /* Touch target minimum (F20) */
25
+ min-height: var(--touch-target-min, 44px);
26
+ padding: var(--space-sm, 0.5rem) var(--space-md, 1rem);
27
+ display: flex;
28
+ align-items: center;
29
+ gap: var(--space-sm, 0.5rem);
30
+ border-radius: var(--radius-sm, 0.25rem);
31
+ cursor: pointer;
32
+ user-select: none;
33
+ color: var(--color-text, #1f2937);
34
+ transition: background-color 100ms ease-out;
35
+ border: none;
36
+ background: transparent;
37
+ width: 100%;
38
+ text-align: left;
39
+ font-size: 1rem;
40
+ }
41
+
42
+ :global(.menu-item[data-highlighted]) {
43
+ background: var(--color-bg-muted, #f3f4f6);
44
+ outline: none;
45
+ }
46
+
47
+ :global(.menu-item:focus-visible) {
48
+ background: var(--color-bg-muted, #f3f4f6);
49
+ outline: 2px solid var(--color-focus, #3b82f6);
50
+ outline-offset: -2px;
51
+ }
52
+
53
+ :global(.menu-item[data-disabled]) {
54
+ opacity: 0.5;
55
+ cursor: not-allowed;
56
+ pointer-events: none;
57
+ }
58
+
59
+ :global(.menu-item-icon) {
60
+ display: inline-flex;
61
+ align-items: center;
62
+ justify-content: center;
63
+ flex-shrink: 0;
64
+ font-size: 1.25rem;
65
+ }
66
+
67
+ :global(.menu-item-label) {
68
+ flex: 1;
69
+ white-space: nowrap;
70
+ overflow: hidden;
71
+ text-overflow: ellipsis;
72
+ }
73
+ </style>
@@ -0,0 +1,7 @@
1
+ import type { MenuItemProps } from '../../types/index.js';
2
+ interface Props extends MenuItemProps {
3
+ children?: import('svelte').Snippet;
4
+ }
5
+ declare const MenuItem: import("svelte").Component<Props, {}, "">;
6
+ type MenuItem = ReturnType<typeof MenuItem>;
7
+ export default MenuItem;
@@ -0,0 +1,19 @@
1
+ <script lang="ts">
2
+ import type { MenuSeparatorProps } from '../../types/index.js';
3
+ import { DropdownMenu } from 'bits-ui';
4
+
5
+ interface Props extends MenuSeparatorProps {}
6
+
7
+ let { class: className = '' }: Props = $props();
8
+ </script>
9
+
10
+ <DropdownMenu.Separator class="menu-separator {className}" />
11
+
12
+ <style>
13
+ :global(.menu-separator) {
14
+ height: 1px;
15
+ background: var(--color-border, #e5e7eb);
16
+ margin: var(--space-xs, 0.25rem) 0;
17
+ border: none;
18
+ }
19
+ </style>
@@ -0,0 +1,6 @@
1
+ import type { MenuSeparatorProps } from '../../types/index.js';
2
+ interface Props extends MenuSeparatorProps {
3
+ }
4
+ declare const MenuSeparator: import("svelte").Component<Props, {}, "">;
5
+ type MenuSeparator = ReturnType<typeof MenuSeparator>;
6
+ export default MenuSeparator;
@@ -0,0 +1,14 @@
1
+ <script lang="ts">
2
+ import type { MenuSubProps } from '../../types/index.js';
3
+ import { DropdownMenu } from 'bits-ui';
4
+
5
+ interface Props extends MenuSubProps {
6
+ children?: import('svelte').Snippet;
7
+ }
8
+
9
+ let { class: className = '', children }: Props = $props();
10
+ </script>
11
+
12
+ <DropdownMenu.Sub>
13
+ {@render children?.()}
14
+ </DropdownMenu.Sub>
@@ -0,0 +1,7 @@
1
+ import type { MenuSubProps } from '../../types/index.js';
2
+ interface Props extends MenuSubProps {
3
+ children?: import('svelte').Snippet;
4
+ }
5
+ declare const MenuSub: import("svelte").Component<Props, {}, "">;
6
+ type MenuSub = ReturnType<typeof MenuSub>;
7
+ export default MenuSub;
@@ -0,0 +1,60 @@
1
+ <script lang="ts">
2
+ import type { MenuSubContentProps } from '../../types/index.js';
3
+ import { DropdownMenu } from 'bits-ui';
4
+
5
+ interface Props extends MenuSubContentProps {
6
+ children?: import('svelte').Snippet;
7
+ }
8
+
9
+ let { class: className = '', children }: Props = $props();
10
+ </script>
11
+
12
+ <DropdownMenu.SubContent class="menu-sub-content {className}">
13
+ {@render children?.()}
14
+ </DropdownMenu.SubContent>
15
+
16
+ <style>
17
+ :global(.menu-sub-content) {
18
+ /* MUST set font-family explicitly - portal doesn't inherit (F33) */
19
+ font-family: var(--font-family, system-ui, -apple-system, sans-serif);
20
+ background: var(--color-bg, #ffffff);
21
+ border: 1px solid var(--color-border, #e5e7eb);
22
+ border-radius: var(--radius-md, 0.375rem);
23
+ padding: var(--space-xs, 0.25rem);
24
+ box-shadow: var(--shadow-md, 0 4px 6px rgba(0, 0, 0, 0.1));
25
+ z-index: 51;
26
+ min-width: 8rem;
27
+ max-width: 20rem;
28
+ }
29
+
30
+ /* Animation states */
31
+ :global(.menu-sub-content[data-state='open']) {
32
+ animation: menu-sub-fade-in 150ms ease-out;
33
+ }
34
+
35
+ :global(.menu-sub-content[data-state='closed']) {
36
+ animation: menu-sub-fade-out 100ms ease-in;
37
+ }
38
+
39
+ @keyframes -global-menu-sub-fade-in {
40
+ from {
41
+ opacity: 0;
42
+ transform: translateX(-4px);
43
+ }
44
+ to {
45
+ opacity: 1;
46
+ transform: translateX(0);
47
+ }
48
+ }
49
+
50
+ @keyframes -global-menu-sub-fade-out {
51
+ from {
52
+ opacity: 1;
53
+ transform: translateX(0);
54
+ }
55
+ to {
56
+ opacity: 0;
57
+ transform: translateX(-4px);
58
+ }
59
+ }
60
+ </style>
@@ -0,0 +1,7 @@
1
+ import type { MenuSubContentProps } from '../../types/index.js';
2
+ interface Props extends MenuSubContentProps {
3
+ children?: import('svelte').Snippet;
4
+ }
5
+ declare const MenuSubContent: import("svelte").Component<Props, {}, "">;
6
+ type MenuSubContent = ReturnType<typeof MenuSubContent>;
7
+ export default MenuSubContent;
@@ -0,0 +1,84 @@
1
+ <script lang="ts">
2
+ import type { MenuSubTriggerProps } from '../../types/index.js';
3
+ import { DropdownMenu } from 'bits-ui';
4
+
5
+ interface Props extends MenuSubTriggerProps {
6
+ children?: import('svelte').Snippet;
7
+ }
8
+
9
+ let { class: className = '', disabled = false, icon = '', children }: Props = $props();
10
+ </script>
11
+
12
+ <DropdownMenu.SubTrigger class="menu-sub-trigger {className}" {disabled}>
13
+ {#if icon}
14
+ <span class="menu-sub-trigger-icon">{icon}</span>
15
+ {/if}
16
+ <span class="menu-sub-trigger-label">
17
+ {@render children?.()}
18
+ </span>
19
+ <span class="menu-sub-trigger-chevron" aria-hidden="true">›</span>
20
+ </DropdownMenu.SubTrigger>
21
+
22
+ <style>
23
+ :global(.menu-sub-trigger) {
24
+ font-family: inherit;
25
+ /* Touch target minimum (F20) */
26
+ min-height: var(--touch-target-min, 44px);
27
+ padding: var(--space-sm, 0.5rem) var(--space-md, 1rem);
28
+ display: flex;
29
+ align-items: center;
30
+ gap: var(--space-sm, 0.5rem);
31
+ border-radius: var(--radius-sm, 0.25rem);
32
+ cursor: pointer;
33
+ user-select: none;
34
+ color: var(--color-text, #1f2937);
35
+ transition: background-color 100ms ease-out;
36
+ border: none;
37
+ background: transparent;
38
+ width: 100%;
39
+ text-align: left;
40
+ font-size: 1rem;
41
+ }
42
+
43
+ :global(.menu-sub-trigger[data-highlighted]) {
44
+ background: var(--color-bg-muted, #f3f4f6);
45
+ outline: none;
46
+ }
47
+
48
+ :global(.menu-sub-trigger:focus-visible) {
49
+ background: var(--color-bg-muted, #f3f4f6);
50
+ outline: 2px solid var(--color-focus, #3b82f6);
51
+ outline-offset: -2px;
52
+ }
53
+
54
+ :global(.menu-sub-trigger[data-disabled]) {
55
+ opacity: 0.5;
56
+ cursor: not-allowed;
57
+ pointer-events: none;
58
+ }
59
+
60
+ :global(.menu-sub-trigger[data-state='open']) {
61
+ background: var(--color-bg-muted, #f3f4f6);
62
+ }
63
+
64
+ :global(.menu-sub-trigger-icon) {
65
+ display: inline-flex;
66
+ align-items: center;
67
+ justify-content: center;
68
+ flex-shrink: 0;
69
+ font-size: 1.25rem;
70
+ }
71
+
72
+ :global(.menu-sub-trigger-label) {
73
+ flex: 1;
74
+ white-space: nowrap;
75
+ overflow: hidden;
76
+ text-overflow: ellipsis;
77
+ }
78
+
79
+ :global(.menu-sub-trigger-chevron) {
80
+ margin-left: auto;
81
+ font-size: 1rem;
82
+ color: var(--color-text-muted, #6b7280);
83
+ }
84
+ </style>
@@ -0,0 +1,7 @@
1
+ import type { MenuSubTriggerProps } from '../../types/index.js';
2
+ interface Props extends MenuSubTriggerProps {
3
+ children?: import('svelte').Snippet;
4
+ }
5
+ declare const MenuSubTrigger: import("svelte").Component<Props, {}, "">;
6
+ type MenuSubTrigger = ReturnType<typeof MenuSubTrigger>;
7
+ export default MenuSubTrigger;
@@ -0,0 +1,32 @@
1
+ <script lang="ts">
2
+ import type { MenuTriggerProps } from '../../types/index.js';
3
+ import { DropdownMenu } from 'bits-ui';
4
+
5
+ interface Props extends MenuTriggerProps {
6
+ children?: import('svelte').Snippet;
7
+ }
8
+
9
+ let { class: className = '', children }: Props = $props();
10
+ </script>
11
+
12
+ <DropdownMenu.Trigger class="menu-trigger {className}">
13
+ {@render children?.()}
14
+ </DropdownMenu.Trigger>
15
+
16
+ <style>
17
+ :global(.menu-trigger) {
18
+ font-family: inherit;
19
+ background: transparent;
20
+ border: none;
21
+ padding: 0;
22
+ cursor: pointer;
23
+ display: inline-flex;
24
+ align-items: center;
25
+ justify-content: center;
26
+ }
27
+
28
+ :global(.menu-trigger:focus-visible) {
29
+ outline: 2px solid var(--color-focus, #3b82f6);
30
+ outline-offset: 2px;
31
+ }
32
+ </style>
@@ -0,0 +1,7 @@
1
+ import type { MenuTriggerProps } from '../../types/index.js';
2
+ interface Props extends MenuTriggerProps {
3
+ children?: import('svelte').Snippet;
4
+ }
5
+ declare const MenuTrigger: import("svelte").Component<Props, {}, "">;
6
+ type MenuTrigger = ReturnType<typeof MenuTrigger>;
7
+ export default MenuTrigger;
@@ -0,0 +1,99 @@
1
+ <script lang="ts">
2
+ import type { NavItemProps } from '../../types/index.js';
3
+
4
+ interface Props extends NavItemProps {
5
+ onclick?: () => void;
6
+ children?: import('svelte').Snippet;
7
+ }
8
+
9
+ let {
10
+ label,
11
+ href,
12
+ active = false,
13
+ icon,
14
+ class: className = '',
15
+ onclick,
16
+ children
17
+ }: Props = $props();
18
+ </script>
19
+
20
+ {#if href}
21
+ <a
22
+ {href}
23
+ class="nav-item {className}"
24
+ class:nav-item--active={active}
25
+ aria-current={active ? 'page' : undefined}
26
+ >
27
+ {#if icon}
28
+ <span class="nav-item__icon">{icon}</span>
29
+ {/if}
30
+ {#if children}
31
+ {@render children()}
32
+ {:else}
33
+ {label}
34
+ {/if}
35
+ </a>
36
+ {:else}
37
+ <button
38
+ type="button"
39
+ class="nav-item {className}"
40
+ class:nav-item--active={active}
41
+ aria-current={active ? 'page' : undefined}
42
+ {onclick}
43
+ >
44
+ {#if icon}
45
+ <span class="nav-item__icon">{icon}</span>
46
+ {/if}
47
+ {#if children}
48
+ {@render children()}
49
+ {:else}
50
+ {label}
51
+ {/if}
52
+ </button>
53
+ {/if}
54
+
55
+ <style>
56
+ .nav-item {
57
+ display: inline-flex;
58
+ align-items: center;
59
+ gap: var(--space-xs, 0.25rem);
60
+ /* Touch target minimum (F20) */
61
+ min-height: var(--touch-target-min, 44px);
62
+ padding: var(--space-sm, 0.5rem) var(--space-md, 1rem);
63
+ background: transparent;
64
+ border: none;
65
+ border-radius: var(--radius-sm, 0.25rem);
66
+ color: var(--color-text-muted, #6b7280);
67
+ font-size: var(--text-sm, 0.875rem);
68
+ font-weight: 500;
69
+ text-decoration: none;
70
+ cursor: pointer;
71
+ transition: all var(--transition-fast, 150ms ease);
72
+ -webkit-tap-highlight-color: transparent;
73
+ }
74
+
75
+ .nav-item:hover {
76
+ color: var(--color-text, #1f2937);
77
+ background: var(--color-bg-muted, #f3f4f6);
78
+ }
79
+
80
+ .nav-item:focus-visible {
81
+ outline: 2px solid var(--color-primary, #3b82f6);
82
+ outline-offset: 2px;
83
+ }
84
+
85
+ .nav-item--active {
86
+ color: var(--color-primary, #3b82f6);
87
+ }
88
+
89
+ .nav-item--active:hover {
90
+ color: var(--color-primary, #3b82f6);
91
+ }
92
+
93
+ .nav-item__icon {
94
+ display: inline-flex;
95
+ align-items: center;
96
+ justify-content: center;
97
+ flex-shrink: 0;
98
+ }
99
+ </style>
@@ -0,0 +1,8 @@
1
+ import type { NavItemProps } from '../../types/index.js';
2
+ interface Props extends NavItemProps {
3
+ onclick?: () => void;
4
+ children?: import('svelte').Snippet;
5
+ }
6
+ declare const NavItem: import("svelte").Component<Props, {}, "">;
7
+ type NavItem = ReturnType<typeof NavItem>;
8
+ export default NavItem;