mirror of
https://github.com/maybe-finance/maybe.git
synced 2025-07-19 05:09:38 +02:00
* Add lookbook + viewcomponent, organize design system file * Build menu component * Button updates * More button fixes * Replace all menus with new ViewComponent * Checkpoint: fix tests, all buttons and menus converted * Split into Link and Button components for clarity * Button cleanup * Simplify custom confirmation configuration in views * Finalize button, link component API * Add toggle field to custom form builder + Component * Basic tabs component * Custom tabs, convert all menu / tab instances in app * Gem updates * Centralized icon helper * Update all icon usage to central helper * Lint fixes * Centralize all disclosure instances * Dialog replacements * Consolidation of all dialog styles * Test fixes * Fix app layout issues, move to component with slots * Layout simplification * Flakey test fix * Fix dashboard mobile issues * Finalize homepage * Lint fixes * Fix shadows and borders in dark mode * Fix tests * Remove stale class * Fix filled icon logic * Move transparent? to public interface
65 lines
1.9 KiB
Ruby
65 lines
1.9 KiB
Ruby
class TabsComponent < ViewComponent::Base
|
|
renders_one :nav, ->(classes: nil) do
|
|
Tabs::NavComponent.new(
|
|
active_tab: active_tab,
|
|
active_btn_classes: active_btn_classes,
|
|
inactive_btn_classes: inactive_btn_classes,
|
|
btn_classes: base_btn_classes,
|
|
classes: unstyled? ? classes : class_names(nav_container_classes, classes)
|
|
)
|
|
end
|
|
|
|
renders_many :panels, ->(tab_id:, &block) do
|
|
content_tag(
|
|
:div,
|
|
class: ("hidden" unless tab_id == active_tab),
|
|
data: { id: tab_id, tabs_target: "panel" },
|
|
&block
|
|
)
|
|
end
|
|
|
|
VARIANTS = {
|
|
default: {
|
|
active_btn_classes: "bg-white theme-dark:bg-gray-700 text-primary shadow-sm",
|
|
inactive_btn_classes: "text-secondary hover:bg-surface-inset-hover",
|
|
base_btn_classes: "w-full inline-flex justify-center items-center text-sm font-medium px-2 py-1 rounded-md transition-colors duration-200",
|
|
nav_container_classes: "flex bg-surface-inset p-1 rounded-lg mb-4"
|
|
}
|
|
}
|
|
|
|
attr_reader :active_tab, :url_param_key, :variant, :testid
|
|
|
|
def initialize(active_tab:, url_param_key: nil, variant: :default, active_btn_classes: "", inactive_btn_classes: "", testid: nil)
|
|
@active_tab = active_tab
|
|
@url_param_key = url_param_key
|
|
@variant = variant.to_sym
|
|
@active_btn_classes = active_btn_classes
|
|
@inactive_btn_classes = inactive_btn_classes
|
|
@testid = testid
|
|
end
|
|
|
|
def active_btn_classes
|
|
unstyled? ? @active_btn_classes : VARIANTS.dig(variant, :active_btn_classes)
|
|
end
|
|
|
|
def inactive_btn_classes
|
|
unstyled? ? @inactive_btn_classes : VARIANTS.dig(variant, :inactive_btn_classes)
|
|
end
|
|
|
|
private
|
|
def unstyled?
|
|
variant == :unstyled
|
|
end
|
|
|
|
def base_btn_classes
|
|
unless unstyled?
|
|
VARIANTS.dig(variant, :base_btn_classes)
|
|
end
|
|
end
|
|
|
|
def nav_container_classes
|
|
unless unstyled?
|
|
VARIANTS.dig(variant, :nav_container_classes)
|
|
end
|
|
end
|
|
end
|