negodesign 0.0.1 → 0.0.3

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 (115) hide show
  1. package/dist/components/core/breadcrumb/breadcrumb-list.svelte +31 -31
  2. package/dist/components/core/button/ButtonBack.svelte +18 -18
  3. package/dist/components/core/button/ButtonLogin.svelte +15 -15
  4. package/dist/components/core/button/ButtonLoginWith.svelte +57 -57
  5. package/dist/components/core/carousel/data/CarouselModel.d.ts +2 -1
  6. package/dist/components/core/datatable/ui/DataTableActions.svelte +28 -28
  7. package/dist/components/core/datatable/ui/DataTableCheckbox.svelte +22 -22
  8. package/dist/components/core/datatable/ui/DataTableContent.svelte +59 -59
  9. package/dist/components/core/datatable/ui/DataTableCore.svelte +151 -144
  10. package/dist/components/core/datatable/ui/DataTableDragHandle.svelte +8 -8
  11. package/dist/components/core/datatable/ui/DataTableListFilter.svelte +59 -59
  12. package/dist/components/core/datatable/ui/DataTableListPagination.svelte +35 -35
  13. package/dist/components/core/form/ui/input-base.svelte +81 -81
  14. package/dist/components/core/form/ui/input-email.svelte +23 -22
  15. package/dist/components/core/form/ui/input-password-confirm.svelte +23 -22
  16. package/dist/components/core/form/ui/input-password.svelte +23 -22
  17. package/dist/components/core/form/ui/input-phone.svelte +23 -0
  18. package/dist/components/core/form/ui/input-phone.svelte.d.ts +4 -0
  19. package/dist/components/core/form/ui/input-username.svelte +22 -21
  20. package/dist/components/core/label/LabelOr.svelte +25 -25
  21. package/dist/components/core/link/link-forget-password.svelte +12 -12
  22. package/dist/components/core/link/link-privacy-polity.svelte +12 -12
  23. package/dist/components/core/link/link-terms-of-service.svelte +12 -12
  24. package/dist/components/core/nav/ui/nav-menu-bar.svelte +97 -97
  25. package/dist/components/core/nav/ui/nav-menu-bottom-bar.svelte +33 -33
  26. package/dist/components/core/nav/ui/nav-menu-top-bar.svelte +103 -103
  27. package/dist/components/core/sidebar/{menu-bar-sidebar.svelte → MenuBarSidebar.svelte} +70 -62
  28. package/dist/components/core/sidebar/{menu-bar-sidebar.svelte.d.ts → MenuBarSidebar.svelte.d.ts} +8 -0
  29. package/dist/components/core/tabs/ui/tab-underline.svelte +41 -41
  30. package/dist/components/pages/admin/ui/{admin-content.svelte → AdminContent.svelte} +14 -13
  31. package/dist/components/pages/admin/ui/{admin-content.svelte.d.ts → AdminContent.svelte.d.ts} +1 -0
  32. package/dist/components/pages/admin/ui/{admin-panel.svelte → AdminPanel.svelte} +46 -40
  33. package/dist/components/pages/admin/ui/{admin-panel.svelte.d.ts → AdminPanel.svelte.d.ts} +6 -0
  34. package/dist/components/pages/login/01/data/page-props.d.ts +21 -0
  35. package/dist/components/pages/login/01/data/page-props.js +1 -0
  36. package/dist/components/pages/login/01/ui/AuthCard.svelte +91 -0
  37. package/dist/components/pages/login/01/ui/AuthCard.svelte.d.ts +20 -0
  38. package/dist/components/pages/login/01/ui/FormLogin.svelte +56 -0
  39. package/dist/components/pages/login/01/ui/FormLogin.svelte.d.ts +13 -0
  40. package/dist/components/pages/login/01/ui/FormLoginEmailPassword.svelte +13 -0
  41. package/dist/components/pages/login/01/ui/FormLoginEmailPassword.svelte.d.ts +8 -0
  42. package/dist/components/pages/login/01/ui/FormLoginPhonePassword.svelte +13 -0
  43. package/dist/components/pages/login/01/ui/FormLoginPhonePassword.svelte.d.ts +8 -0
  44. package/dist/components/pages/login/01/ui/FormLoginUsernamePassword.svelte +13 -0
  45. package/dist/components/pages/login/01/ui/FormLoginUsernamePassword.svelte.d.ts +8 -0
  46. package/dist/components/pages/login/{admin/01 → 01}/ui/FormRegister.svelte +28 -28
  47. package/dist/components/pages/login/{admin/01 → 01}/ui/LeftHero.svelte +105 -105
  48. package/dist/components/pages/login/{admin/01 → 01}/ui/LeftHero.svelte.d.ts +1 -1
  49. package/dist/components/pages/login/01/ui/PageLogin01.svelte +49 -0
  50. package/dist/components/pages/login/01/ui/PageLogin01.svelte.d.ts +4 -0
  51. package/dist/components/pages/login/PageLogin.svelte +21 -0
  52. package/dist/components/pages/login/PageLogin.svelte.d.ts +17 -0
  53. package/dist/components/ui/badge/badge.svelte +49 -49
  54. package/dist/components/ui/chart/chart-container.svelte +80 -80
  55. package/dist/components/ui/chart/chart-style.svelte +37 -37
  56. package/dist/components/ui/chart/chart-tooltip.svelte +184 -184
  57. package/dist/components/ui/checkbox/checkbox.svelte +40 -40
  58. package/dist/components/ui/checkbox/checkbox.svelte.d.ts +1 -1
  59. package/dist/components/ui/data-table/flex-render.svelte +40 -40
  60. package/dist/components/ui/drawer/drawer-close.svelte +7 -7
  61. package/dist/components/ui/drawer/drawer-content.svelte +33 -33
  62. package/dist/components/ui/drawer/drawer-description.svelte +17 -17
  63. package/dist/components/ui/drawer/drawer-footer.svelte +20 -20
  64. package/dist/components/ui/drawer/drawer-header.svelte +20 -20
  65. package/dist/components/ui/drawer/drawer-nested.svelte +12 -12
  66. package/dist/components/ui/drawer/drawer-overlay.svelte +17 -17
  67. package/dist/components/ui/drawer/drawer-portal.svelte +7 -7
  68. package/dist/components/ui/drawer/drawer-title.svelte +17 -17
  69. package/dist/components/ui/drawer/drawer-trigger.svelte +7 -7
  70. package/dist/components/ui/drawer/drawer.svelte +12 -12
  71. package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-group.svelte.d.ts +1 -1
  72. package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte.d.ts +1 -1
  73. package/dist/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte.d.ts +1 -1
  74. package/dist/components/ui/input/input.svelte.d.ts +1 -1
  75. package/dist/components/ui/select/select-content.svelte +45 -45
  76. package/dist/components/ui/select/select-group-heading.svelte +21 -21
  77. package/dist/components/ui/select/select-group.svelte +17 -17
  78. package/dist/components/ui/select/select-item.svelte +41 -41
  79. package/dist/components/ui/select/select-label.svelte +20 -20
  80. package/dist/components/ui/select/select-portal.svelte +7 -7
  81. package/dist/components/ui/select/select-scroll-down-button.svelte +21 -21
  82. package/dist/components/ui/select/select-scroll-up-button.svelte +21 -21
  83. package/dist/components/ui/select/select-separator.svelte +18 -18
  84. package/dist/components/ui/select/select-trigger.svelte +30 -30
  85. package/dist/components/ui/select/select.svelte +11 -11
  86. package/dist/components/ui/sidebar/sidebar-input.svelte.d.ts +2 -2
  87. package/dist/components/ui/sidebar/sidebar-menu-sub-button.svelte +39 -39
  88. package/dist/components/ui/table/table-body.svelte +15 -15
  89. package/dist/components/ui/table/table-caption.svelte +20 -20
  90. package/dist/components/ui/table/table-cell.svelte +15 -15
  91. package/dist/components/ui/table/table-footer.svelte +20 -20
  92. package/dist/components/ui/table/table-head.svelte +15 -15
  93. package/dist/components/ui/table/table-header.svelte +20 -20
  94. package/dist/components/ui/table/table-row.svelte +15 -15
  95. package/dist/components/ui/table/table.svelte +17 -17
  96. package/dist/components/ui/tabs/tabs-content.svelte +17 -17
  97. package/dist/components/ui/tabs/tabs-list.svelte +40 -40
  98. package/dist/components/ui/tabs/tabs-trigger.svelte +23 -23
  99. package/dist/components/ui/tabs/tabs.svelte +19 -19
  100. package/dist/components/ui/tabs/tabs.svelte.d.ts +1 -1
  101. package/dist/components/ui/underline-tabs/underline-tabs.svelte.d.ts +1 -1
  102. package/dist/index.d.ts +30 -0
  103. package/dist/index.js +30 -2
  104. package/package.json +94 -88
  105. package/dist/components/pages/login/admin/01/ui/AuthCard.svelte +0 -58
  106. package/dist/components/pages/login/admin/01/ui/AuthCard.svelte.d.ts +0 -18
  107. package/dist/components/pages/login/admin/01/ui/FormLogin.svelte +0 -31
  108. package/dist/components/pages/login/admin/01/ui/FormLogin.svelte.d.ts +0 -3
  109. package/dist/components/pages/login/admin/01/ui/PageLogin.svelte +0 -49
  110. package/dist/components/pages/login/admin/01/ui/PageLogin.svelte.d.ts +0 -18
  111. package/dist/components/pages/login/admin/index.d.ts +0 -0
  112. package/dist/components/pages/login/admin/index.js +0 -1
  113. package/dist/components/pages/login/index.d.ts +0 -0
  114. package/dist/components/pages/login/index.js +0 -1
  115. /package/dist/components/pages/login/{admin/01 → 01}/ui/FormRegister.svelte.d.ts +0 -0
@@ -1,97 +1,97 @@
1
- <script lang="ts">
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
3
- import * as Collapsible from "../../../ui/collapsible/index.js";
4
- import * as Sidebar from "../../../ui/sidebar/index.js";
5
- import ChevronRightIcon from "@lucide/svelte/icons/chevron-right";
6
- import { HugeiconsIcon } from "@hugeicons/svelte";
7
- import type {
8
- NavMenuAndSubmenuSidebar,
9
- NavMenuItem,
10
- NavMenuSidebar,
11
- } from "../data/nav-menu-sidebar";
12
-
13
- let {
14
- items,
15
- }: {
16
- items: NavMenuItem[];
17
- } = $props();
18
-
19
- // Chave interna para itens sem group; nunca colide com um nome real
20
- // porque não é uma string acessível a quem define os itens.
21
- const UNGROUPED = Symbol("ungrouped");
22
-
23
- function hasSubmenus(
24
- item: NavMenuSidebar | NavMenuAndSubmenuSidebar,
25
- ): item is NavMenuAndSubmenuSidebar {
26
- return "submenus" in item && Array.isArray(item.submenus);
27
- }
28
-
29
- let groupedItems = $derived(
30
- Map.groupBy(items, (item) => item.group?.name ?? UNGROUPED),
31
- );
32
- </script>
33
-
34
- {#snippet menuItem(item: NavMenuItem)}
35
- {#if hasSubmenus(item)}
36
- <Collapsible.Root open={item.isActive} class="group/collapsible">
37
- {#snippet child({ props })}
38
- <Sidebar.MenuItem {...props}>
39
- <Collapsible.Trigger>
40
- {#snippet child({ props })}
41
- <Sidebar.MenuButton {...props} tooltipContent={item.title}>
42
- {#if item.icon}
43
- <HugeiconsIcon icon={item.icon} />
44
- {/if}
45
- <span>{item.title}</span>
46
- <ChevronRightIcon
47
- class="ms-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90"
48
- />
49
- </Sidebar.MenuButton>
50
- {/snippet}
51
- </Collapsible.Trigger>
52
- <Collapsible.Content>
53
- <Sidebar.MenuSub>
54
- {#each item.submenus ?? [] as subItem (subItem.title)}
55
- <Sidebar.MenuSubItem>
56
- <Sidebar.MenuSubButton>
57
- {#snippet child({ props })}
58
- <a href={subItem.url} {...props}>
59
- <span>{subItem.title}</span>
60
- </a>
61
- {/snippet}
62
- </Sidebar.MenuSubButton>
63
- </Sidebar.MenuSubItem>
64
- {/each}
65
- </Sidebar.MenuSub>
66
- </Collapsible.Content>
67
- </Sidebar.MenuItem>
68
- {/snippet}
69
- </Collapsible.Root>
70
- {:else}
71
- <Sidebar.MenuItem>
72
- <Sidebar.MenuButton>
73
- {#snippet child({ props })}
74
- <a href={item.url} {...props}>
75
- {#if item.icon}
76
- <HugeiconsIcon icon={item.icon} />
77
- {/if}
78
- <span>{item.title}</span>
79
- </a>
80
- {/snippet}
81
- </Sidebar.MenuButton>
82
- </Sidebar.MenuItem>
83
- {/if}
84
- {/snippet}
85
-
86
- {#each groupedItems as [groupLabel, groupItems] (typeof groupLabel === "string" ? groupLabel : "ungrouped")}
87
- <Sidebar.Group>
88
- {#if typeof groupLabel === "string"}
89
- <Sidebar.GroupLabel>{groupLabel}</Sidebar.GroupLabel>
90
- {/if}
91
- <Sidebar.Menu>
92
- {#each groupItems as item (item.title)}
93
- {@render menuItem(item)}
94
- {/each}
95
- </Sidebar.Menu>
96
- </Sidebar.Group>
97
- {/each}
1
+ <script lang="ts">
2
+ /* eslint-disable @typescript-eslint/no-explicit-any */
3
+ import * as Collapsible from "../../../ui/collapsible/index.js";
4
+ import * as Sidebar from "../../../ui/sidebar/index.js";
5
+ import ChevronRightIcon from "@lucide/svelte/icons/chevron-right";
6
+ import { HugeiconsIcon } from "@hugeicons/svelte";
7
+ import type {
8
+ NavMenuAndSubmenuSidebar,
9
+ NavMenuItem,
10
+ NavMenuSidebar,
11
+ } from "../data/nav-menu-sidebar";
12
+
13
+ let {
14
+ items,
15
+ }: {
16
+ items: NavMenuItem[];
17
+ } = $props();
18
+
19
+ // Chave interna para itens sem group; nunca colide com um nome real
20
+ // porque não é uma string acessível a quem define os itens.
21
+ const UNGROUPED = Symbol("ungrouped");
22
+
23
+ function hasSubmenus(
24
+ item: NavMenuSidebar | NavMenuAndSubmenuSidebar,
25
+ ): item is NavMenuAndSubmenuSidebar {
26
+ return "submenus" in item && Array.isArray(item.submenus);
27
+ }
28
+
29
+ let groupedItems = $derived(
30
+ Map.groupBy(items, (item) => item.group?.name ?? UNGROUPED),
31
+ );
32
+ </script>
33
+
34
+ {#snippet menuItem(item: NavMenuItem)}
35
+ {#if hasSubmenus(item)}
36
+ <Collapsible.Root open={item.isActive} class="group/collapsible">
37
+ {#snippet child({ props })}
38
+ <Sidebar.MenuItem {...props}>
39
+ <Collapsible.Trigger>
40
+ {#snippet child({ props })}
41
+ <Sidebar.MenuButton {...props} tooltipContent={item.title}>
42
+ {#if item.icon}
43
+ <HugeiconsIcon icon={item.icon} />
44
+ {/if}
45
+ <span>{item.title}</span>
46
+ <ChevronRightIcon
47
+ class="ms-auto transition-transform duration-200 group-data-[state=open]/collapsible:rotate-90"
48
+ />
49
+ </Sidebar.MenuButton>
50
+ {/snippet}
51
+ </Collapsible.Trigger>
52
+ <Collapsible.Content>
53
+ <Sidebar.MenuSub>
54
+ {#each item.submenus ?? [] as subItem (subItem.title)}
55
+ <Sidebar.MenuSubItem>
56
+ <Sidebar.MenuSubButton>
57
+ {#snippet child({ props })}
58
+ <a href={subItem.url} {...props}>
59
+ <span>{subItem.title}</span>
60
+ </a>
61
+ {/snippet}
62
+ </Sidebar.MenuSubButton>
63
+ </Sidebar.MenuSubItem>
64
+ {/each}
65
+ </Sidebar.MenuSub>
66
+ </Collapsible.Content>
67
+ </Sidebar.MenuItem>
68
+ {/snippet}
69
+ </Collapsible.Root>
70
+ {:else}
71
+ <Sidebar.MenuItem>
72
+ <Sidebar.MenuButton>
73
+ {#snippet child({ props })}
74
+ <a href={item.url} {...props}>
75
+ {#if item.icon}
76
+ <HugeiconsIcon icon={item.icon} />
77
+ {/if}
78
+ <span>{item.title}</span>
79
+ </a>
80
+ {/snippet}
81
+ </Sidebar.MenuButton>
82
+ </Sidebar.MenuItem>
83
+ {/if}
84
+ {/snippet}
85
+
86
+ {#each groupedItems as [groupLabel, groupItems] (typeof groupLabel === "string" ? groupLabel : "ungrouped")}
87
+ <Sidebar.Group>
88
+ {#if typeof groupLabel === "string"}
89
+ <Sidebar.GroupLabel>{groupLabel}</Sidebar.GroupLabel>
90
+ {/if}
91
+ <Sidebar.Menu>
92
+ {#each groupItems as item (item.title)}
93
+ {@render menuItem(item)}
94
+ {/each}
95
+ </Sidebar.Menu>
96
+ </Sidebar.Group>
97
+ {/each}
@@ -1,33 +1,33 @@
1
- <script lang="ts">
2
- import * as Sidebar from "../../../ui/sidebar/index.js";
3
- import type { WithoutChildren } from "../../../../utils.js";
4
- import type { ComponentProps } from "svelte";
5
- import type { NavMenuSidebar } from "../data/nav-menu-sidebar";
6
- import { HugeiconsIcon } from "@hugeicons/svelte";
7
-
8
- let {
9
- items,
10
- ...restProps
11
- }: { items?: NavMenuSidebar[] } & WithoutChildren<
12
- ComponentProps<typeof Sidebar.Group>
13
- > = $props();
14
- </script>
15
-
16
- <Sidebar.Group {...restProps}>
17
- <Sidebar.GroupContent>
18
- <Sidebar.Menu>
19
- {#each items as item (item.title)}
20
- <Sidebar.MenuItem>
21
- <Sidebar.MenuButton>
22
- {#snippet child({ props })}
23
- <a href={item.url} {...props}>
24
- <HugeiconsIcon icon={item.icon} size={16} />
25
- <span>{item.title}</span>
26
- </a>
27
- {/snippet}
28
- </Sidebar.MenuButton>
29
- </Sidebar.MenuItem>
30
- {/each}
31
- </Sidebar.Menu>
32
- </Sidebar.GroupContent>
33
- </Sidebar.Group>
1
+ <script lang="ts">
2
+ import * as Sidebar from "../../../ui/sidebar/index.js";
3
+ import type { WithoutChildren } from "../../../../utils.js";
4
+ import type { ComponentProps } from "svelte";
5
+ import type { NavMenuSidebar } from "../data/nav-menu-sidebar";
6
+ import { HugeiconsIcon } from "@hugeicons/svelte";
7
+
8
+ let {
9
+ items,
10
+ ...restProps
11
+ }: { items?: NavMenuSidebar[] } & WithoutChildren<
12
+ ComponentProps<typeof Sidebar.Group>
13
+ > = $props();
14
+ </script>
15
+
16
+ <Sidebar.Group {...restProps}>
17
+ <Sidebar.GroupContent>
18
+ <Sidebar.Menu>
19
+ {#each items as item (item.title)}
20
+ <Sidebar.MenuItem>
21
+ <Sidebar.MenuButton>
22
+ {#snippet child({ props })}
23
+ <a href={item.url} {...props}>
24
+ <HugeiconsIcon icon={item.icon} size={16} />
25
+ <span>{item.title}</span>
26
+ </a>
27
+ {/snippet}
28
+ </Sidebar.MenuButton>
29
+ </Sidebar.MenuItem>
30
+ {/each}
31
+ </Sidebar.Menu>
32
+ </Sidebar.GroupContent>
33
+ </Sidebar.Group>
@@ -1,103 +1,103 @@
1
- <script lang="ts">
2
- import * as DropdownMenu from "../../../ui/dropdown-menu/index.js";
3
- import * as Sidebar from "../../../ui/sidebar/index.js";
4
- import { useSidebar } from "../../../ui/sidebar/index.js";
5
- import type { NavTopBarSidebarItem } from "../data/nav-top-bar-sidebar";
6
- import { HugeiconsIcon } from "@hugeicons/svelte";
7
- import { UnfoldMoreIcon } from "@hugeicons/core-free-icons";
8
-
9
- // This should be `Component` after @lucide/svelte updates types
10
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
11
- let { content, dropdownMenu }: NavTopBarSidebarItem = $props();
12
- const sidebar = useSidebar();
13
- </script>
14
-
15
- <Sidebar.Menu>
16
- <Sidebar.MenuItem>
17
- <DropdownMenu.Root>
18
- <DropdownMenu.Trigger>
19
- {#snippet child({ props })}
20
- <Sidebar.MenuButton
21
- {...props}
22
- size="lg"
23
- class="data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground"
24
- >
25
- <div
26
- class="bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg"
27
- >
28
- <content.logo class="size-4" />
29
- </div>
30
- <div
31
- class="grid flex-1 text-start text-sm leading-tight"
32
- >
33
- <span class="truncate font-medium">
34
- {content.title}
35
- </span>
36
- <span class="truncate text-xs"
37
- >{content.subtitle}</span
38
- >
39
- </div>
40
- {#if dropdownMenu}
41
- <HugeiconsIcon
42
- icon={UnfoldMoreIcon}
43
- class="ms-auto"
44
- />
45
- {/if}
46
- </Sidebar.MenuButton>
47
- {/snippet}
48
- </DropdownMenu.Trigger>
49
- {#if dropdownMenu}
50
- <DropdownMenu.Content
51
- class="w-(--bits-dropdown-menu-anchor-width) min-w-56 rounded-lg"
52
- align="start"
53
- side={sidebar.isMobile ? "bottom" : "right"}
54
- sideOffset={4}
55
- >
56
- {#if dropdownMenu.header}
57
- <DropdownMenu.Label
58
- class="text-muted-foreground text-xs"
59
- >
60
- {#if dropdownMenu.header.icon}
61
- <dropdownMenu.header.icon
62
- class="size-3.5 shrink-0"
63
- />
64
- {/if}
65
- {dropdownMenu.header.text}
66
- </DropdownMenu.Label>
67
- {/if}
68
- {#each dropdownMenu.items as it, index (index)}
69
- <DropdownMenu.Item
70
- onSelect={it.onclick}
71
- class="gap-2 p-2"
72
- >
73
- <div
74
- class="flex size-6 items-center justify-center rounded-md border"
75
- >
76
- <it.icon class="size-3.5 shrink-0" />
77
- </div>
78
- {it.text}
79
- <DropdownMenu.Shortcut>
80
- ⌘{index + 1}
81
- </DropdownMenu.Shortcut>
82
- </DropdownMenu.Item>
83
- {/each}
84
- {#if dropdownMenu.footer}
85
- <DropdownMenu.Separator />
86
- <DropdownMenu.Item class="gap-2 p-2">
87
- <div
88
- class="flex size-6 items-center justify-center rounded-md border bg-transparent"
89
- >
90
- {#if dropdownMenu.footer.icon}
91
- <dropdownMenu.footer.icon class="size-4" />
92
- {/if}
93
- </div>
94
- <div class="text-muted-foreground font-medium">
95
- {dropdownMenu.footer.text}
96
- </div>
97
- </DropdownMenu.Item>
98
- {/if}
99
- </DropdownMenu.Content>
100
- {/if}
101
- </DropdownMenu.Root>
102
- </Sidebar.MenuItem>
103
- </Sidebar.Menu>
1
+ <script lang="ts">
2
+ import * as DropdownMenu from "../../../ui/dropdown-menu/index.js";
3
+ import * as Sidebar from "../../../ui/sidebar/index.js";
4
+ import { useSidebar } from "../../../ui/sidebar/index.js";
5
+ import type { NavTopBarSidebarItem } from "../data/nav-top-bar-sidebar";
6
+ import { HugeiconsIcon } from "@hugeicons/svelte";
7
+ import { UnfoldMoreIcon } from "@hugeicons/core-free-icons";
8
+
9
+ // This should be `Component` after @lucide/svelte updates types
10
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
11
+ let { content, dropdownMenu }: NavTopBarSidebarItem = $props();
12
+ const sidebar = useSidebar();
13
+ </script>
14
+
15
+ <Sidebar.Menu>
16
+ <Sidebar.MenuItem>
17
+ <DropdownMenu.Root>
18
+ <DropdownMenu.Trigger>
19
+ {#snippet child({ props })}
20
+ <Sidebar.MenuButton
21
+ {...props}
22
+ size="lg"
23
+ class="data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground"
24
+ >
25
+ <div
26
+ class="bg-sidebar-primary text-sidebar-primary-foreground flex aspect-square size-8 items-center justify-center rounded-lg"
27
+ >
28
+ <content.logo class="size-4" />
29
+ </div>
30
+ <div
31
+ class="grid flex-1 text-start text-sm leading-tight"
32
+ >
33
+ <span class="truncate font-medium">
34
+ {content.title}
35
+ </span>
36
+ <span class="truncate text-xs"
37
+ >{content.subtitle}</span
38
+ >
39
+ </div>
40
+ {#if dropdownMenu}
41
+ <HugeiconsIcon
42
+ icon={UnfoldMoreIcon}
43
+ class="ms-auto"
44
+ />
45
+ {/if}
46
+ </Sidebar.MenuButton>
47
+ {/snippet}
48
+ </DropdownMenu.Trigger>
49
+ {#if dropdownMenu}
50
+ <DropdownMenu.Content
51
+ class="w-(--bits-dropdown-menu-anchor-width) min-w-56 rounded-lg"
52
+ align="start"
53
+ side={sidebar.isMobile ? "bottom" : "right"}
54
+ sideOffset={4}
55
+ >
56
+ {#if dropdownMenu.header}
57
+ <DropdownMenu.Label
58
+ class="text-muted-foreground text-xs"
59
+ >
60
+ {#if dropdownMenu.header.icon}
61
+ <dropdownMenu.header.icon
62
+ class="size-3.5 shrink-0"
63
+ />
64
+ {/if}
65
+ {dropdownMenu.header.text}
66
+ </DropdownMenu.Label>
67
+ {/if}
68
+ {#each dropdownMenu.items as it, index (index)}
69
+ <DropdownMenu.Item
70
+ onSelect={it.onclick}
71
+ class="gap-2 p-2"
72
+ >
73
+ <div
74
+ class="flex size-6 items-center justify-center rounded-md border"
75
+ >
76
+ <it.icon class="size-3.5 shrink-0" />
77
+ </div>
78
+ {it.text}
79
+ <DropdownMenu.Shortcut>
80
+ ⌘{index + 1}
81
+ </DropdownMenu.Shortcut>
82
+ </DropdownMenu.Item>
83
+ {/each}
84
+ {#if dropdownMenu.footer}
85
+ <DropdownMenu.Separator />
86
+ <DropdownMenu.Item class="gap-2 p-2">
87
+ <div
88
+ class="flex size-6 items-center justify-center rounded-md border bg-transparent"
89
+ >
90
+ {#if dropdownMenu.footer.icon}
91
+ <dropdownMenu.footer.icon class="size-4" />
92
+ {/if}
93
+ </div>
94
+ <div class="text-muted-foreground font-medium">
95
+ {dropdownMenu.footer.text}
96
+ </div>
97
+ </DropdownMenu.Item>
98
+ {/if}
99
+ </DropdownMenu.Content>
100
+ {/if}
101
+ </DropdownMenu.Root>
102
+ </Sidebar.MenuItem>
103
+ </Sidebar.Menu>
@@ -1,62 +1,70 @@
1
- <script lang="ts">
2
- import * as Sidebar from "../../ui/sidebar/index.js";
3
- import type { ComponentProps } from "svelte";
4
-
5
- import type { NavUserSidebarItem } from "../nav/data/nav-user-sidebar";
6
- import type {
7
- NavMenuItem,
8
- NavMenuSidebar,
9
- } from "../nav/data/nav-menu-sidebar";
10
- import type { Snippet } from "svelte";
11
- import NavUserSidebar from "../nav/ui/nav-user-sidebar.svelte";
12
- import NavMenuBar from "../nav/ui/nav-menu-bar.svelte";
13
- import NavMenuBottomBar from "../nav/ui/nav-menu-bottom-bar.svelte";
14
- import NavMenuTopBar from "../nav/ui/nav-menu-top-bar.svelte";
15
- import { t } from "../../../i18n";
16
-
17
- type Props = {
18
- menusButtons?: NavMenuSidebar[];
19
- menus: NavMenuItem[];
20
- user: NavUserSidebarItem;
21
- footer?: Snippet;
22
- header?: Snippet;
23
- };
24
-
25
- let {
26
- ref = $bindable(null),
27
- collapsible = "icon",
28
- menusButtons,
29
- menus,
30
- user,
31
- footer,
32
- header,
33
- ...restProps
34
- }: ComponentProps<typeof Sidebar.Root> & Props = $props();
35
- </script>
36
-
37
- <Sidebar.Root bind:ref {collapsible} {...restProps}>
38
- <Sidebar.Header>
39
- {#if header}
40
- {@render header?.()}
41
- {:else}
42
- <NavMenuTopBar
43
- content={{
44
- title: $t("label.panel"),
45
- subtitle: $t("label.administrative"),
46
- }}
47
- />
48
- {/if}
49
- </Sidebar.Header>
50
- <Sidebar.Content>
51
- <NavMenuBar items={menus} />
52
- </Sidebar.Content>
53
- <Sidebar.Footer>
54
- {#if footer}
55
- {@render footer?.()}
56
- {:else if menusButtons && menusButtons.length > 0}
57
- <NavMenuBottomBar items={menusButtons} class="mt-auto" />
58
- {/if}
59
- <NavUserSidebar {user} />
60
- </Sidebar.Footer>
61
- <Sidebar.Rail />
62
- </Sidebar.Root>
1
+ <script lang="ts">
2
+ import * as Sidebar from "../../ui/sidebar/index.js";
3
+ import type { ComponentProps } from "svelte";
4
+
5
+ import type { NavUserSidebarItem } from "../nav/data/nav-user-sidebar";
6
+ import type {
7
+ NavMenuItem,
8
+ NavMenuSidebar,
9
+ } from "../nav/data/nav-menu-sidebar";
10
+ import type { Snippet } from "svelte";
11
+ import NavUserSidebar from "../nav/ui/nav-user-sidebar.svelte";
12
+ import NavMenuBar from "../nav/ui/nav-menu-bar.svelte";
13
+ import NavMenuBottomBar from "../nav/ui/nav-menu-bottom-bar.svelte";
14
+ import NavMenuTopBar from "../nav/ui/nav-menu-top-bar.svelte";
15
+ import { t } from "../../../i18n";
16
+
17
+ /**
18
+ * Sidebar de navegação com menus, usuário e botões.
19
+ * @property {NavMenuSidebar[]} menusButtons - Botões do footer (ex: logout)
20
+ * @property {NavMenuItem[]} menus - Itens de navegação principal
21
+ * @property {NavUserSidebarItem} user - Dados do usuário logado
22
+ * @property {Snippet} footer - Snippet customizado do footer
23
+ * @property {Snippet} header - Snippet customizado do header
24
+ */
25
+ type Props = {
26
+ menusButtons?: NavMenuSidebar[];
27
+ menus: NavMenuItem[];
28
+ user: NavUserSidebarItem;
29
+ footer?: Snippet;
30
+ header?: Snippet;
31
+ };
32
+
33
+ let {
34
+ ref = $bindable(null),
35
+ collapsible = "icon",
36
+ menusButtons,
37
+ menus,
38
+ user,
39
+ footer,
40
+ header,
41
+ ...restProps
42
+ }: ComponentProps<typeof Sidebar.Root> & Props = $props();
43
+ </script>
44
+
45
+ <Sidebar.Root bind:ref {collapsible} {...restProps}>
46
+ <Sidebar.Header>
47
+ {#if header}
48
+ {@render header?.()}
49
+ {:else}
50
+ <NavMenuTopBar
51
+ content={{
52
+ title: $t("label.panel"),
53
+ subtitle: $t("label.administrative"),
54
+ }}
55
+ />
56
+ {/if}
57
+ </Sidebar.Header>
58
+ <Sidebar.Content>
59
+ <NavMenuBar items={menus} />
60
+ </Sidebar.Content>
61
+ <Sidebar.Footer>
62
+ {#if footer}
63
+ {@render footer?.()}
64
+ {:else if menusButtons && menusButtons.length > 0}
65
+ <NavMenuBottomBar items={menusButtons} class="mt-auto" />
66
+ {/if}
67
+ <NavUserSidebar {user} />
68
+ </Sidebar.Footer>
69
+ <Sidebar.Rail />
70
+ </Sidebar.Root>
@@ -3,6 +3,14 @@ import type { ComponentProps } from "svelte";
3
3
  import type { NavUserSidebarItem } from "../nav/data/nav-user-sidebar";
4
4
  import type { NavMenuItem, NavMenuSidebar } from "../nav/data/nav-menu-sidebar";
5
5
  import type { Snippet } from "svelte";
6
+ /**
7
+ * Sidebar de navegação com menus, usuário e botões.
8
+ * @property {NavMenuSidebar[]} menusButtons - Botões do footer (ex: logout)
9
+ * @property {NavMenuItem[]} menus - Itens de navegação principal
10
+ * @property {NavUserSidebarItem} user - Dados do usuário logado
11
+ * @property {Snippet} footer - Snippet customizado do footer
12
+ * @property {Snippet} header - Snippet customizado do header
13
+ */
6
14
  type Props = {
7
15
  menusButtons?: NavMenuSidebar[];
8
16
  menus: NavMenuItem[];