<% mobile_nav_items = [ { name: t(".nav.home"), path: root_path, icon: "pie-chart", icon_custom: false, active: page_active?(root_path) }, { name: t(".nav.transactions"), path: transactions_path, icon: "credit-card", icon_custom: false, active: page_active?(transactions_path) }, { name: t(".nav.reports"), path: reports_path, icon: "chart-bar", icon_custom: false, active: page_active?(reports_path) }, { name: t(".nav.budgets"), path: budgets_path, icon: "map", icon_custom: false, active: page_active?(budgets_path) }, { name: t(".nav.assistant"), path: chats_path, icon: "icon-assistant", icon_custom: true, active: page_active?(chats_path), mobile_only: true } ] %> <% desktop_nav_items = mobile_nav_items.reject { |item| item[:mobile_only] } %> <% expanded_sidebar_class = "w-full" %> <% collapsed_sidebar_class = "w-0" %> <%= render "layouts/shared/htmldoc" do %>
<%# MOBILE - Top nav %> <%# DESKTOP - Left navbar %> <%# DESKTOP - Left sidebar %> <%= tag.div class: class_names( "hidden lg:block py-4 overflow-y-auto shrink-0 max-w-[320px] transition-all duration-300", Current.user.show_sidebar? ? expanded_sidebar_class : collapsed_sidebar_class, ), data: { app_layout_target: "leftSidebar", print: "hide" } do %> <% if content_for?(:sidebar) %> <%= yield :sidebar %> <% else %>
<%= render "accounts/account_sidebar_tabs", family: Current.family, active_tab: @account_group_tab %>
<% if Current.family.trialing? && !self_hosted? %>

Free trial

<%= Current.family.days_left_in_trial %> days remaining

<%= render DS::Link.new( text: "Upgrade", href: upgrade_subscription_path, ) %>
<% end %>
<% end %> <% end %> <%# SHARED - Main content %> <%= tag.main class: class_names("grow overflow-y-auto px-3 lg:px-10 py-4 pb-20 lg:pb-4 w-full mx-auto max-w-5xl"), data: { app_layout_target: "content" } do %> <% if content_for?(:page_header) %> <%= yield :page_header %> <% end %> <%= yield %> <% end %> <%# DESKTOP - Right sidebar %> <%= tag.div class: class_names( "hidden lg:block h-full overflow-y-auto shrink-0 max-w-[400px] transition-all duration-300", Current.user.show_ai_sidebar? ? expanded_sidebar_class : collapsed_sidebar_class, ), data: { app_layout_target: "rightSidebar", print: "hide" } do %> <%= tag.div id: "chat-container", class: "relative h-full", data: { controller: "chat hotkey", turbo_permanent: true } do %>
<%= turbo_frame_tag chat_frame, src: chat_view_path(@chat), loading: "lazy", class: "h-full" do %>
<%= icon("loader-circle", class: "animate-spin") %>
<% end %>
<% unless Current.user.ai_enabled? %>
<%= render "chats/ai_consent" %>
<% end %> <% end %> <% end %> <%# MOBILE - Bottom Nav %> <%= tag.nav class: "lg:hidden fixed bottom-0 left-0 right-0 bg-surface z-10 pb-[env(safe-area-inset-bottom)] border-t border-tertiary flex justify-around", data: { print: "hide" } do %> <% mobile_nav_items.each do |nav_item| %> <%= render "layouts/shared/nav_item", **nav_item %> <% end %> <% end %>
<% end %>