loco_motion-rails 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +95 -67
  3. data/app/components/daisy/actions/button_component.rb +5 -2
  4. data/app/components/daisy/actions/dropdown_component.rb +1 -1
  5. data/app/components/daisy/actions/modal_component.rb +56 -14
  6. data/app/components/daisy/actions/swap_component.rb +3 -1
  7. data/app/components/daisy/actions/theme_controller_component.rb +1 -1
  8. data/app/components/daisy/data_display/accordion_component.rb +2 -1
  9. data/app/components/daisy/data_display/avatar_component.rb +3 -1
  10. data/app/components/daisy/data_display/badge_component.rb +16 -2
  11. data/app/components/daisy/data_display/card_component.rb +2 -1
  12. data/app/components/daisy/data_display/carousel_component.rb +1 -1
  13. data/app/components/daisy/data_display/chat_component.rb +5 -8
  14. data/app/components/daisy/data_display/collapse_component.rb +3 -1
  15. data/app/components/daisy/data_display/countdown_component.rb +2 -1
  16. data/app/components/daisy/data_display/diff_component.rb +1 -1
  17. data/app/components/daisy/data_display/kbd_component.rb +14 -1
  18. data/app/components/daisy/data_display/stat_component.rb +3 -1
  19. data/app/components/daisy/data_display/table_component.rb +1 -1
  20. data/app/components/daisy/data_display/timeline_component.rb +1 -1
  21. data/app/components/daisy/data_display/timeline_event_component.rb +1 -1
  22. data/app/components/daisy/feedback/alert_component.rb +1 -1
  23. data/app/components/daisy/feedback/loading_component.rb +11 -0
  24. data/app/components/daisy/feedback/progress_component.rb +20 -0
  25. data/app/components/daisy/feedback/radial_progress_component.rb +29 -0
  26. data/app/components/daisy/feedback/skeleton_component.rb +9 -0
  27. data/app/components/daisy/feedback/toast_component.rb +9 -0
  28. data/app/components/daisy/feedback/tooltip_component.rb +41 -0
  29. data/app/components/daisy/layout/artboard_component.rb +11 -0
  30. data/app/components/daisy/layout/divider_component.rb +32 -0
  31. data/app/components/daisy/layout/drawer_component.html.haml +9 -0
  32. data/app/components/daisy/layout/drawer_component.rb +110 -0
  33. data/app/components/daisy/layout/footer_component.rb +29 -0
  34. data/app/components/daisy/layout/hero_component.html.haml +5 -0
  35. data/app/components/daisy/layout/hero_component.rb +21 -0
  36. data/app/components/daisy/layout/indicator_component.rb +36 -0
  37. data/app/components/daisy/layout/join_component.rb +1 -1
  38. data/app/components/daisy/layout/stack_component.rb +9 -0
  39. data/app/components/daisy/navigation/bottom_nav_component.rb +2 -2
  40. data/app/components/daisy/navigation/breadcrumbs_component.rb +1 -1
  41. data/app/components/daisy/navigation/link_component.rb +38 -10
  42. data/app/components/daisy/navigation/menu_component.rb +45 -5
  43. data/app/components/daisy/navigation/navbar_component.rb +1 -1
  44. data/app/components/daisy/navigation/steps_component.rb +2 -2
  45. data/app/components/daisy/navigation/tabs_component.rb +1 -1
  46. data/app/components/hero/icon_component.rb +10 -1
  47. data/lib/daisy.rb +13 -3
  48. data/lib/hero.rb +7 -0
  49. data/lib/loco_motion/basic_component.rb +1 -1
  50. data/lib/loco_motion/concerns/tippable_component.rb +26 -0
  51. data/lib/loco_motion/configuration.rb +35 -0
  52. data/lib/loco_motion/helpers.rb +89 -0
  53. data/lib/loco_motion.rb +6 -36
  54. metadata +35 -6
  55. data/app/components/daisy/data_display/badge_component.html.haml +0 -2
  56. data/app/components/daisy/data_display/kbd_component.html.haml +0 -2
  57. data/app/components/daisy/navigation/link_component.html.haml +0 -4
  58. data/lib/daisy/helpers.rb +0 -61
@@ -0,0 +1,29 @@
1
+ class Daisy::Feedback::RadialProgressComponent < LocoMotion::BaseComponent
2
+
3
+ def initialize(*args, **kws, &block)
4
+ super
5
+
6
+ @value = config_option(:value)
7
+ @size = config_option(:size)
8
+ @thickness = config_option(:thickness)
9
+ end
10
+
11
+ def before_render
12
+ add_css(:component, "radial-progress")
13
+
14
+ styles = []
15
+
16
+ styles << "--value: #{@value}" if @value != nil
17
+ styles << "--size: #{@size}" if @size != nil
18
+ styles << "--thickness: #{@thickness}" if @thickness != nil
19
+
20
+ add_html(:component, { role: "progressbar" })
21
+ add_html(:component, { style: styles.join(";") }) if styles.present?
22
+ end
23
+
24
+ def call
25
+ part(:component) { content }
26
+ end
27
+
28
+ end
29
+
@@ -0,0 +1,9 @@
1
+ class Daisy::Feedback::SkeletonComponent < LocoMotion::BaseComponent
2
+ def before_render
3
+ add_css(:component, "skeleton")
4
+ end
5
+
6
+ def call
7
+ part(:component) { content }
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ class Daisy::Feedback::ToastComponent < LocoMotion::BaseComponent
2
+ def before_render
3
+ add_css(:component, "toast")
4
+ end
5
+
6
+ def call
7
+ part(:component) { content }
8
+ end
9
+ end
@@ -0,0 +1,41 @@
1
+ #
2
+ # A component that displays a tooltip when the user hovers over it.
3
+ #
4
+ # @loco_example Basic Usage
5
+ # = daisy_tooltip "This is a tooltip" do
6
+ # %span Hover over me
7
+ #
8
+ class Daisy::Feedback::TooltipComponent < LocoMotion::BaseComponent
9
+
10
+ #
11
+ # Create a new instance of the Tooltip.
12
+ #
13
+ # @param args [Array] If provided, the first argument is considered the `tip`.
14
+ # @param kws [Hash] The keyword arguments for the component.
15
+ #
16
+ # @option kws tip [String] The text to display in the tooltip. Can be passed
17
+ # as the first positional argument, or as a keyword argument.
18
+ #
19
+ def initialize(*args, **kws, &block)
20
+ super
21
+
22
+ # Accept a `tip` keyword argument, or the first positional argument
23
+ @tip = config_option(:tip, args[0])
24
+ end
25
+
26
+ #
27
+ # Sets up the components CSS and HTML attributes.
28
+ #
29
+ def before_render
30
+ add_css(:component, "tooltip")
31
+ add_html(:component, { data: { tip: @tip } }) if @tip
32
+ end
33
+
34
+ #
35
+ # Renders the component and it's content (inline).
36
+ #
37
+ def call
38
+ part(:component) { content }
39
+ end
40
+
41
+ end
@@ -0,0 +1,11 @@
1
+ class Daisy::Layout::ArtboardComponent < LocoMotion::BaseComponent
2
+
3
+ def before_render
4
+ add_css(:component, "artboard")
5
+ end
6
+
7
+ def call
8
+ part(:component) { content }
9
+ end
10
+
11
+ end
@@ -0,0 +1,32 @@
1
+ #
2
+ # The divider component is a simple horizontal or vertical line that separates
3
+ # content. It can be colored and have a label.
4
+ #
5
+ # @loco_example Basic Usage
6
+ # = daisy_divider
7
+ #
8
+ # @loco_example With Text
9
+ # = daisy_divider do
10
+ # Hello Dividers!
11
+ #
12
+ # @loco_example Horizontal Accented With Text
13
+ # = daisy_divider(css: "divider-horizontal divider-accent") do
14
+ # Accent Divider
15
+ #
16
+ class Daisy::Layout::DividerComponent < LocoMotion::BaseComponent
17
+
18
+ #
19
+ # Add the `divider` CSS class to the component.
20
+ #
21
+ def before_render
22
+ add_css(:component, "divider")
23
+ end
24
+
25
+ #
26
+ # Render the component and it's content.
27
+ #
28
+ def call
29
+ part(:component) { content }
30
+ end
31
+
32
+ end
@@ -0,0 +1,9 @@
1
+ = part(:component) do
2
+ = part(:input)
3
+
4
+ = part(:content_wrapper) do
5
+ = content
6
+
7
+ - if sidebar?
8
+ - sidebar.set_loco_parent(component_ref)
9
+ = sidebar
@@ -0,0 +1,110 @@
1
+ #
2
+ # The DrawerComponent shows a sidebar that can be toggled open and closed.
3
+ #
4
+ # @part input [LocoMotion::BaseComponent] The input checkbox that toggles the
5
+ # sidebar.
6
+ # @part content_wrapper [LocoMotion::BaseComponent] The wrapper for the page
7
+ # content.
8
+ # @part overlay [LocoMotion::BaseComponent] The overlay that covers the page
9
+ # when the sidebar is open.
10
+ #
11
+ # @slot sidebar [Daisy::Layout::DrawerSidebarComponent] The sidebar that is
12
+ # shown when the drawer is toggled open. Renders the overlay inside of itself.
13
+ #
14
+ # @loco_example Basic Usage
15
+ # = daisy_drawer do |drawer|
16
+ # - drawer.with_sidebar do
17
+ # .bg-base-100.p-4.w-40
18
+ # Hello sidebar!
19
+ #
20
+ # = daisy_button(tag_name: "label", css: "btn btn-primary", title: "Open Drawer", html: { for: drawer.id })
21
+ #
22
+ class Daisy::Layout::DrawerComponent < LocoMotion::BaseComponent
23
+ #
24
+ # The DrawerSidebarComponent is a child of the {DrawerComponent} and renders
25
+ # the drawer sidebar and the overlay.
26
+ #
27
+ class Daisy::Layout::DrawerSidebarComponent < LocoMotion::BaseComponent
28
+ #
29
+ # Add the `drawer-side` CSS class to the component.
30
+ #
31
+ def before_render
32
+ add_css(:component, "drawer-side")
33
+ end
34
+
35
+ #
36
+ # Render the sidebar, the overlay, and the content.
37
+ #
38
+ def call
39
+ part(:component) do
40
+ # We need to render the parent component's overlay inside of the sidebar
41
+ concat(loco_parent.part(:overlay))
42
+ concat(content)
43
+ end
44
+ end
45
+ end
46
+
47
+ define_parts :input, :content_wrapper, :overlay
48
+
49
+ renders_one :sidebar, Daisy::Layout::DrawerSidebarComponent
50
+
51
+ #
52
+ # The ID of the drawer. Can be passed in as a configuration option, but
53
+ # defaults to a random UUID.
54
+ #
55
+ attr_reader :id
56
+
57
+ #
58
+ # Create a new instance of the DrawerComponent.
59
+ #
60
+ # @param kws [Hash] The keyword arguments passed to the component.
61
+ # @option kws [String] :id The ID of the drawer. Defaults to a random UUID.
62
+ #
63
+ def initialize(**kws)
64
+ super
65
+
66
+ @id = config_option(:id, SecureRandom.uuid)
67
+ end
68
+
69
+ #
70
+ # Sets up the various parts of the component.
71
+ #
72
+ def before_render
73
+ setup_component
74
+ setup_input
75
+ setup_content_wrapper
76
+ setup_overlay
77
+ end
78
+
79
+ #
80
+ # Adds the `drawer` class to the component itself.
81
+ #
82
+ def setup_component
83
+ add_css(:component, "drawer")
84
+ end
85
+
86
+ #
87
+ # Sets up the input checkbox that toggles the sidebar.
88
+ #
89
+ def setup_input
90
+ set_tag_name(:input, :input)
91
+ add_css(:input, "drawer-toggle")
92
+ add_html(:input, { type: "checkbox", id: @id })
93
+ end
94
+
95
+ #
96
+ # Adds the `drawer-content` class to the content wrapper.
97
+ #
98
+ def setup_content_wrapper
99
+ add_css(:content_wrapper, "drawer-content")
100
+ end
101
+
102
+ #
103
+ # Sets up the overlay that covers the page when the sidebar is open.
104
+ #
105
+ def setup_overlay
106
+ set_tag_name(:overlay, :label)
107
+ add_css(:overlay, "drawer-overlay")
108
+ add_html(:overlay, { for: @id, "aria-label": "close sidebar" })
109
+ end
110
+ end
@@ -0,0 +1,29 @@
1
+ #
2
+ # The footer component is a simple container for the footer of a page. It can be
3
+ # used to hold copyright information, links to other pages, or any other
4
+ # information that should be displayed at the bottom of a page.
5
+ #
6
+ # @loco_example Basic Usage
7
+ # = daisy_footer(css: "bg-neutral text-neutral-content") do
8
+ # %nav
9
+ # = link_to "Home", root_path
10
+ #
11
+ # @loco_example With Text
12
+ # = daisy_footer(css: "bg-neutral text-neutral-content p-10 text-center text-sm") do
13
+ # Copyright &copy; 2024
14
+ #
15
+ class Daisy::Layout::FooterComponent < LocoMotion::BaseComponent
16
+ #
17
+ # Add the `footer` CSS class to the component.
18
+ #
19
+ def before_render
20
+ add_css(:component, "footer")
21
+ end
22
+
23
+ #
24
+ # Render the component and it's content (inline).
25
+ #
26
+ def call
27
+ part(:component) { content }
28
+ end
29
+ end
@@ -0,0 +1,5 @@
1
+ = part(:component) do
2
+ = overlay if overlay?
3
+
4
+ = part(:content_wrapper) do
5
+ = content
@@ -0,0 +1,21 @@
1
+ #
2
+ # The HeroComponent is a layout component that is used to create a hero section.
3
+ #
4
+ # @part content_wrapper The wrapper for the content of the hero.
5
+ #
6
+ # @slot overlay [LocoMotion::BasicComponent] An optional `<div>` positioned to
7
+ # overlay underneath the hero and allow for styling behind it.
8
+ #
9
+ class Daisy::Layout::HeroComponent < LocoMotion::BaseComponent
10
+ define_part :content_wrapper
11
+
12
+ renders_one :overlay, LocoMotion::BasicComponent.build(css: "hero-overlay")
13
+
14
+ #
15
+ # Adds the necessary CSS classes to the component.
16
+ #
17
+ def before_render
18
+ add_css(:component, "hero")
19
+ add_css(:content_wrapper, "hero-content")
20
+ end
21
+ end
@@ -0,0 +1,36 @@
1
+ #
2
+ # The IndicatorComponent provides items positioned around it's content with the
3
+ # intention of indicating a callout or something needing attention.
4
+ #
5
+ # @slot item The items to be rendered around the content. Allows multiple.
6
+ #
7
+ # @loco_example Basic Usage
8
+ # = daisy_indicator do |indicator|
9
+ # - indicator.with_item do
10
+ # = daisy_badge(title: "New!", css: "badge-accent")
11
+ #
12
+ # = daisy_button(title: "Checkout", left_icon: "shopping-cart")
13
+ #
14
+ class Daisy::Layout::IndicatorComponent < LocoMotion::BaseComponent
15
+ renders_many :items, LocoMotion::BasicComponent.build(css: "indicator-item")
16
+
17
+ #
18
+ # Adds the `indicator` CSS to the component
19
+ #
20
+ def before_render
21
+ add_css(:component, "indicator")
22
+ end
23
+
24
+ #
25
+ # Renders the component, all of the items, and any user-provided content.
26
+ #
27
+ def call
28
+ part(:component) do
29
+ items.each do |item|
30
+ concat(item)
31
+ end
32
+
33
+ concat(content) if content?
34
+ end
35
+ end
36
+ end
@@ -1,4 +1,4 @@
1
- class Daisy::Layout::JoinComponent < LocoMotion.configuration.base_component_class
1
+ class Daisy::Layout::JoinComponent < LocoMotion::BaseComponent
2
2
  renders_many :items
3
3
 
4
4
  def before_render
@@ -0,0 +1,9 @@
1
+ class Daisy::Layout::StackComponent < LocoMotion::BaseComponent
2
+ def before_render
3
+ add_css(:component, "stack")
4
+ end
5
+
6
+ def call
7
+ part(:component) { content }
8
+ end
9
+ end
@@ -1,6 +1,6 @@
1
- class Daisy::Navigation::BottomNavComponent < LocoMotion.configuration.base_component_class
1
+ class Daisy::Navigation::BottomNavComponent < LocoMotion::BaseComponent
2
2
 
3
- class Daisy::Navigation::BottomNavSectionComponent < LocoMotion.configuration.base_component_class
3
+ class Daisy::Navigation::BottomNavSectionComponent < LocoMotion::BaseComponent
4
4
 
5
5
  define_parts :icon, :title
6
6
 
@@ -1,4 +1,4 @@
1
- class Daisy::Navigation::BreadcrumbsComponent < LocoMotion.configuration.base_component_class
1
+ class Daisy::Navigation::BreadcrumbsComponent < LocoMotion::BaseComponent
2
2
  define_parts :list_wrapper
3
3
 
4
4
  renders_many :items, LocoMotion::BasicComponent.build(tag_name: :li)
@@ -2,23 +2,40 @@
2
2
  # The Daisy::Navigation::LinkComponent is a simple component that renders an
3
3
  # anchor tag.
4
4
  #
5
- class Daisy::Navigation::LinkComponent < LocoMotion.configuration.base_component_class
5
+ class Daisy::Navigation::LinkComponent < LocoMotion::BaseComponent
6
+ prepend LocoMotion::Concerns::TippableComponent
6
7
 
7
8
  # Create a new instance of the LinkComponent.
8
9
  #
9
- # If passed **two** positional arguments, the first is considered the `text`
10
- # and the second is considered the `href`. If passed only **one** positional
11
- # argument, it is treated as the `href` and we assume the `text` will be
12
- # provided in the block. `target` is always a keyword argument.
10
+ # @param args [Array] Looks for **one** or **two** positional arguments.
11
+ # - If passed **two** positional arguments, the first is considered the `title`
12
+ # and the second is considered the `href`.
13
+ # - If passed only **one** positional argument, it is treated as the `href`
14
+ # and we assume the `title` will be provided in the block.
15
+ # - If no text is passed in the block, we will use the `href` as the title
16
+ # @param kws [Hash] The keyword arguments for the component.
13
17
  #
14
- # @param text [String] The text to display in the link.
15
- # @param href [String] The URL to visit when the link is clicked.
16
- # @param target [String] The target attribute for the anchor tag.
18
+ # @option kws title [String] The text to display in the link.
19
+ # @option kws href [String] The URL to visit when the link is clicked.
20
+ # @option kws target [String] The target attribute for the anchor tag.
17
21
  def initialize(*args, **kws, &block)
18
22
  super
19
23
 
20
- @text = config_option(:text, args.size == 2 ? args[0] : nil)
21
- @href = config_option(:href, args.size == 2 ? args[1] : args[0])
24
+ if args.size == 1
25
+ # If given one arg, assume it's the href and / or the title (if no block is given)
26
+ @title = args[0]
27
+ @href = args[0]
28
+ elsif args.size == 2
29
+ # If given two args, assume the first is the title and the second is the href
30
+ @title = args[0]
31
+ @href = args[1]
32
+ else
33
+ # Otherwise, assume they pass everything as keyword arguments
34
+ @title = config_option(:title)
35
+ @href = config_option(:href)
36
+ end
37
+
38
+ @target = config_option(:target)
22
39
  end
23
40
 
24
41
  #
@@ -31,4 +48,15 @@ class Daisy::Navigation::LinkComponent < LocoMotion.configuration.base_component
31
48
  add_html(:component, { href: @href }) if @href
32
49
  add_html(:component, { target: @target }) if @target
33
50
  end
51
+
52
+ #
53
+ # Renders the link component.
54
+ #
55
+ # Because this is an inline component which might be utlized alongside text,
56
+ # we utilize the `call` method instead of a template to ensure that no
57
+ # additional whitespace gets added to the output.
58
+ #
59
+ def call
60
+ part(:component) { content || @title }
61
+ end
34
62
  end
@@ -1,25 +1,55 @@
1
- class Daisy::Navigation::MenuComponent < LocoMotion.configuration.base_component_class
1
+ #
2
+ # A component that renders a menu with items.
3
+ #
4
+ # @slot item [Daisy::Navigation::MenuItemComponent] Renders one or more menu
5
+ # items.
6
+ #
7
+ # @loco_example Basic Usage
8
+ # = daisy_menu do |menu|
9
+ # - # Menu Item with a grouping title via keyword argument
10
+ # - menu.with_item(title: "Group 1") do
11
+ # = link_to "Item 1 - 1", "#"
12
+ #
13
+ # - # Menu Item with a grouping title as the first positional argument
14
+ # - menu.with_item("Group 2") do
15
+ # = link_to "Item 2 - 1", "#"
16
+ #
17
+ # - # Menu Item with no grouping title
18
+ # - menu.with_item do
19
+ # = link_to "Item 2 - 2", "#"
20
+ #
21
+ class Daisy::Navigation::MenuComponent < LocoMotion::BaseComponent
2
22
 
3
23
  #
4
24
  # The items for the MenuComponent.
5
25
  #
26
+ # @part title Wrapper for the title of the menu item.
6
27
  #
7
- class Daisy::Navigation::MenuItemComponent < LocoMotion.configuration.base_component_class
28
+ class Daisy::Navigation::MenuItemComponent < LocoMotion::BaseComponent
8
29
  define_part :title
9
30
 
10
31
  #
11
32
  # Create a new instance of the MenuItemComponent.
12
33
  #
13
- # @param title [String] (Optional) Shows an additional title above the item.
14
- # @param disabled [Boolean] (Optional) Sets the item in a disabled state.
34
+ # @param args [Array] If provided, the first argument is considered the
35
+ # `title`.
36
+ #
37
+ # @param kws [Hash] The keyword arguments for the component.
38
+ #
39
+ # @option kws title [String] Shows an additional title above the item.
40
+ # @option kws disabled [Boolean] Sets the item in a disabled state.
15
41
  #
16
42
  def initialize(*args, **kws, &block)
17
43
  super
18
44
 
19
- @simple_title = config_option(:title)
45
+ @simple_title = config_option(:title, args[0])
20
46
  @disabled = config_option(:disabled)
21
47
  end
22
48
 
49
+ #
50
+ # Adds the relevant Daisy classes and applies the disabled state if
51
+ # provided (utilizes Tailwind pointer-events-none).
52
+ #
23
53
  def before_render
24
54
  set_tag_name(:component, :li)
25
55
  add_css(:component, "disabled pointer-events-none") if @disabled
@@ -28,6 +58,9 @@ class Daisy::Navigation::MenuComponent < LocoMotion.configuration.base_component
28
58
  add_css(:title, "menu-title")
29
59
  end
30
60
 
61
+ #
62
+ # Renders the menu item component including a title if present.
63
+ #
31
64
  def call
32
65
  part(:component) do
33
66
  concat(part(:title) { @simple_title }) if @simple_title
@@ -38,10 +71,17 @@ class Daisy::Navigation::MenuComponent < LocoMotion.configuration.base_component
38
71
 
39
72
  renders_many :items, Daisy::Navigation::MenuItemComponent
40
73
 
74
+ #
75
+ # Create a new instance of the MenuComponent. Passes any arguments to the
76
+ # BaseComponent.
77
+ #
41
78
  def initialize(*args, **kws, &block)
42
79
  super
43
80
  end
44
81
 
82
+ #
83
+ # Sets the tag name to `<ul>` and adds the relevant Daisy classes.
84
+ #
45
85
  def before_render
46
86
  set_tag_name(:component, :ul)
47
87
  add_css(:component, "menu")
@@ -1,4 +1,4 @@
1
- class Daisy::Navigation::NavbarComponent < LocoMotion.configuration.base_component_class
1
+ class Daisy::Navigation::NavbarComponent < LocoMotion::BaseComponent
2
2
  renders_one :start, LocoMotion::BasicComponent.build(css: "navbar-start")
3
3
 
4
4
  renders_one :center, LocoMotion::BasicComponent.build(css: "navbar-center")
@@ -1,6 +1,6 @@
1
- class Daisy::Navigation::StepsComponent < LocoMotion.configuration.base_component_class
1
+ class Daisy::Navigation::StepsComponent < LocoMotion::BaseComponent
2
2
 
3
- class Daisy::Navigation::StepComponent < LocoMotion.configuration.base_component_class
3
+ class Daisy::Navigation::StepComponent < LocoMotion::BaseComponent
4
4
  attr_reader :simple
5
5
  def initialize(*args, **kws, &block)
6
6
  super
@@ -1,5 +1,5 @@
1
1
  # This is the Tabs component.
2
- class Daisy::Navigation::TabsComponent < LocoMotion.configuration.base_component_class
2
+ class Daisy::Navigation::TabsComponent < LocoMotion::BaseComponent
3
3
 
4
4
  class TabComponent < LocoMotion::BasicComponent
5
5
  define_parts :content_wrapper
@@ -1,4 +1,6 @@
1
- class Hero::IconComponent < LocoMotion.configuration.base_component_class
1
+ class Hero::IconComponent < LocoMotion::BaseComponent
2
+ prepend LocoMotion::Concerns::TippableComponent
3
+
2
4
  def initialize(*args, **kws, &block)
3
5
  super
4
6
 
@@ -12,6 +14,13 @@ class Hero::IconComponent < LocoMotion.configuration.base_component_class
12
14
  add_css(:component, "[:where(&)]:size-5")
13
15
  end
14
16
 
17
+ #
18
+ # Renders the icon component.
19
+ #
20
+ # Because this is an inline component which might be utlized alongside text,
21
+ # we utilize the `call` method instead of a template to ensure that no
22
+ # additional whitespace gets added to the output.
23
+ #
15
24
  def call
16
25
  heroicon_tag(@icon, **rendered_html(:component))
17
26
  end
data/lib/daisy.rb CHANGED
@@ -1,6 +1,6 @@
1
- require "daisy/helpers"
2
- require "heroicons-rails"
3
-
1
+ #
2
+ # Parent module for all Daisy components.
3
+ #
4
4
  module Daisy
5
5
  #
6
6
  # Holds all Action-type components.
@@ -16,4 +16,14 @@ module Daisy
16
16
  # Holds all Navigation-type components.
17
17
  #
18
18
  module Navigation; end
19
+
20
+ #
21
+ # Holds all Feedback-type components.
22
+ #
23
+ module Feedback; end
24
+
25
+ #
26
+ # Holds all Layout-type components.
27
+ #
28
+ module Layout; end
19
29
  end
data/lib/hero.rb ADDED
@@ -0,0 +1,7 @@
1
+ require "heroicons-rails"
2
+
3
+ #
4
+ # Parent module for all Hero components.
5
+ #
6
+ module Hero
7
+ end
@@ -3,7 +3,7 @@
3
3
  # so that users can pass in all of the same CSS and HTML options that a standard
4
4
  # component would have.
5
5
  #
6
- class LocoMotion::BasicComponent < LocoMotion.configuration.base_component_class
6
+ class LocoMotion::BasicComponent < LocoMotion::BaseComponent
7
7
 
8
8
  def call
9
9
  part(:component) do
@@ -0,0 +1,26 @@
1
+ module LocoMotion
2
+ module Concerns
3
+ #
4
+ # Can be included in relevant components to allow a new `tip` attibute that
5
+ # automatically adds the `tooltip` CSS class and the `data-tip` attribute
6
+ # to the component.
7
+ #
8
+ module TippableComponent
9
+ #
10
+ # Calls the parent `before_render`. Then adds the `tooltip` CSS class and
11
+ # the `data-tip` attribute to the component if the `tip` attribute is
12
+ # present.
13
+ #
14
+ def before_render
15
+ super
16
+
17
+ tip = config_option(:tip)
18
+
19
+ if tip
20
+ add_css(:component, "tooltip")
21
+ add_html(:component, { data: { tip: tip } })
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end