diff --git a/components/sidebar.templ b/components/sidebar.templ
new file mode 100644
index 0000000..db4f4aa
--- /dev/null
+++ b/components/sidebar.templ
@@ -0,0 +1,181 @@
+package components
+
+// SidebarItem represents a navigation item in the sidebar
+type SidebarItem struct {
+ ID string
+ Icon string
+ Label string
+ Href string
+ Active bool
+ Badge string
+}
+
+// DefaultSidebarItems returns the main navigation items
+func DefaultSidebarItems(activeTab string) []SidebarItem {
+ return []SidebarItem{
+ {ID: "overview", Icon: "house", Label: "Overview", Href: "/dashboard?tab=overview", Active: activeTab == "overview" || activeTab == ""},
+ {ID: "transactions", Icon: "right-left", Label: "Transactions", Href: "/dashboard?tab=transactions", Active: activeTab == "transactions"},
+ {ID: "tokens", Icon: "wallet", Label: "Tokens", Href: "/dashboard?tab=tokens", Active: activeTab == "tokens"},
+ {ID: "nfts", Icon: "images", Label: "NFTs", Href: "/dashboard?tab=nfts", Active: activeTab == "nfts"},
+ {ID: "activity", Icon: "clock-rotate-left", Label: "Activity", Href: "/dashboard?tab=activity", Active: activeTab == "activity"},
+ }
+}
+
+// SecondarySidebarItems returns the bottom navigation items
+func SecondarySidebarItems() []SidebarItem {
+ return []SidebarItem{
+ {ID: "settings", Icon: "gear", Label: "Settings", Href: "/settings", Active: false},
+ }
+}
+
+// Sidebar renders the Supabase-style icon sidebar
+templ Sidebar(items []SidebarItem, secondaryItems []SidebarItem) {
+
+}
+
+// SidebarStyles renders the CSS for the sidebar
+templ SidebarStyles() {
+
+}
diff --git a/components/sidebar_templ.go b/components/sidebar_templ.go
new file mode 100644
index 0000000..2540f3d
--- /dev/null
+++ b/components/sidebar_templ.go
@@ -0,0 +1,277 @@
+// Code generated by templ - DO NOT EDIT.
+
+// templ: version: v0.3.977
+package components
+
+//lint:file-ignore SA4006 This context is only used if a nested component is present.
+
+import "github.com/a-h/templ"
+import templruntime "github.com/a-h/templ/runtime"
+
+// SidebarItem represents a navigation item in the sidebar
+type SidebarItem struct {
+ ID string
+ Icon string
+ Label string
+ Href string
+ Active bool
+ Badge string
+}
+
+// DefaultSidebarItems returns the main navigation items
+func DefaultSidebarItems(activeTab string) []SidebarItem {
+ return []SidebarItem{
+ {ID: "overview", Icon: "house", Label: "Overview", Href: "/dashboard?tab=overview", Active: activeTab == "overview" || activeTab == ""},
+ {ID: "transactions", Icon: "right-left", Label: "Transactions", Href: "/dashboard?tab=transactions", Active: activeTab == "transactions"},
+ {ID: "tokens", Icon: "wallet", Label: "Tokens", Href: "/dashboard?tab=tokens", Active: activeTab == "tokens"},
+ {ID: "nfts", Icon: "images", Label: "NFTs", Href: "/dashboard?tab=nfts", Active: activeTab == "nfts"},
+ {ID: "activity", Icon: "clock-rotate-left", Label: "Activity", Href: "/dashboard?tab=activity", Active: activeTab == "activity"},
+ }
+}
+
+// SecondarySidebarItems returns the bottom navigation items
+func SecondarySidebarItems() []SidebarItem {
+ return []SidebarItem{
+ {ID: "settings", Icon: "gear", Label: "Settings", Href: "/settings", Active: false},
+ }
+}
+
+// Sidebar renders the Supabase-style icon sidebar
+func Sidebar(items []SidebarItem, secondaryItems []SidebarItem) templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var1 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var1 == nil {
+ templ_7745c5c3_Var1 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 1, "")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return nil
+ })
+}
+
+// SidebarStyles renders the CSS for the sidebar
+func SidebarStyles() templ.Component {
+ return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) {
+ templ_7745c5c3_W, ctx := templ_7745c5c3_Input.Writer, templ_7745c5c3_Input.Context
+ if templ_7745c5c3_CtxErr := ctx.Err(); templ_7745c5c3_CtxErr != nil {
+ return templ_7745c5c3_CtxErr
+ }
+ templ_7745c5c3_Buffer, templ_7745c5c3_IsBuffer := templruntime.GetBuffer(templ_7745c5c3_W)
+ if !templ_7745c5c3_IsBuffer {
+ defer func() {
+ templ_7745c5c3_BufErr := templruntime.ReleaseBuffer(templ_7745c5c3_Buffer)
+ if templ_7745c5c3_Err == nil {
+ templ_7745c5c3_Err = templ_7745c5c3_BufErr
+ }
+ }()
+ }
+ ctx = templ.InitializeContext(ctx)
+ templ_7745c5c3_Var14 := templ.GetChildren(ctx)
+ if templ_7745c5c3_Var14 == nil {
+ templ_7745c5c3_Var14 = templ.NopComponent
+ }
+ ctx = templ.ClearChildren(ctx)
+ templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 20, "")
+ if templ_7745c5c3_Err != nil {
+ return templ_7745c5c3_Err
+ }
+ return nil
+ })
+}
+
+var _ = templruntime.GeneratedTemplate