# frozen_string_literal: true module Bulmacomp # Make an HTML [turbo Frame](https://turbo.hotwired.dev/handbook/frames) structure. # # @example empty turbo frame, on default when the compoent is have't yield content, is added a lod icon # = render Layout::TurboFrameComponent.new # # # # # # @example with id and src (to load remote content) # = render Layout::TurboFrameComponent.new(id: 'nav1', src: books_path ) # # # # # # @example with no icon # = render Layout::TurboFrameComponent.new(icon: nil, id: 'nav1', src: books_path ) # # # # @example with yield content # = render Layout::TurboFrameComponent.new do # some text # # some text class TurboFrameComponent < ViewComponent::Base # @param [Hash] opts # options to generate content # @param [String] icon # text to add whe yield content is empty # default: [default_icon] # @option opts [String] :* # each other key going as tag option # @yield [optional] turbo frame content def initialize(icon: default_icon, **opts) super @icon = icon @opts = opts end # @return [String] html turbo frame def call content_tag('turbo-frame', (content || @icon), **@opts) end # default value for icon def default_icon tag.span tag.i(class: 'fas fa-sync fa-spin fa-2x'), class: 'icon' end end end