fleetio_spark 0.2.48 → 1.0.0.rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/spark/_icons.js +1 -1
  3. data/app/assets/javascripts/spark/components/app/sidebar/_fix.js +4 -4
  4. data/app/assets/javascripts/spark/components/app/sidebar/_toggle.js +1 -1
  5. data/app/assets/javascripts/spark/components/layout/_auto-grid.js +5 -5
  6. data/app/assets/javascripts/spark/components/nav/_toggle.js +16 -7
  7. data/app/assets/javascripts/spark/components/ui/_sticky_panel.js +2 -2
  8. data/app/assets/javascripts/spark/components/ui/_toast.js +3 -6
  9. data/app/assets/javascripts/spark/shims/_dataset.js +241 -0
  10. data/app/assets/javascripts/spark/spark.js +18 -16
  11. data/app/assets/stylesheets/spark/_index.scss +0 -1
  12. data/app/assets/stylesheets/spark/components/_index.scss +11 -5
  13. data/app/assets/stylesheets/spark/components/app/_header.scss +15 -28
  14. data/app/assets/stylesheets/spark/components/app/_layout.scss +2 -2
  15. data/app/assets/stylesheets/spark/components/app/_sidebar.scss +19 -47
  16. data/app/assets/stylesheets/spark/components/app/sidebar/_header.scss +44 -48
  17. data/app/assets/stylesheets/spark/components/app/sidebar/_toggle.scss +5 -2
  18. data/app/assets/stylesheets/spark/components/button/_button.scss +48 -53
  19. data/app/assets/stylesheets/spark/components/button/_button_group.scss +10 -16
  20. data/app/assets/stylesheets/spark/components/button/_size.scss +17 -8
  21. data/app/assets/stylesheets/spark/components/icon/_badge.scss +41 -0
  22. data/app/assets/stylesheets/spark/{_icons.scss → components/icon/_icon.scss} +0 -0
  23. data/app/assets/stylesheets/spark/components/{form → input}/_switch.scss +20 -20
  24. data/app/assets/stylesheets/spark/components/layout/_block.scss +44 -0
  25. data/app/assets/stylesheets/spark/components/layout/_grid.scss +26 -29
  26. data/app/assets/stylesheets/spark/components/layout/_media_block.scss +76 -0
  27. data/app/assets/stylesheets/spark/components/layout/_page.scss +54 -0
  28. data/app/assets/stylesheets/spark/components/{app → messaging}/_banner.scss +3 -3
  29. data/app/assets/stylesheets/spark/components/messaging/_trial-notice.scss +20 -0
  30. data/app/assets/stylesheets/spark/components/nav/_item.scss +6 -30
  31. data/app/assets/stylesheets/spark/components/nav/_sidebar.scss +11 -48
  32. data/app/assets/stylesheets/spark/components/nav/_tabs.scss +5 -5
  33. data/app/assets/stylesheets/spark/components/nav/sidebar/_theme-default.scss +59 -0
  34. data/app/assets/stylesheets/spark/components/nav/sidebar/_theme-primary.scss +69 -0
  35. data/app/assets/stylesheets/spark/components/nav/tree/_group.scss +1 -6
  36. data/app/assets/stylesheets/spark/components/ui/_card.scss +57 -0
  37. data/app/assets/stylesheets/spark/components/ui/_header.scss +55 -55
  38. data/app/assets/stylesheets/spark/components/ui/_placeholder.scss +8 -22
  39. data/app/assets/stylesheets/spark/components/ui/_toolbar.scss +1 -27
  40. data/app/assets/stylesheets/spark/components_old/_dropdown.scss +117 -114
  41. data/app/assets/stylesheets/spark/components_old/_index.scss +1 -1
  42. data/app/assets/stylesheets/spark/components_old/header/_index.scss +0 -1
  43. data/app/assets/stylesheets/spark/components_old/header/_search.scss +2 -0
  44. data/app/assets/stylesheets/spark/core/_vars.scss +6 -3
  45. data/app/components/spark/badge.html.slim +4 -0
  46. data/app/components/spark/badge.rb +15 -0
  47. data/app/components/spark/banner.html.slim +7 -0
  48. data/app/components/spark/banner.rb +28 -0
  49. data/app/components/spark/button.html.slim +9 -0
  50. data/app/components/spark/button.rb +68 -0
  51. data/app/components/spark/button/group.html.slim +4 -0
  52. data/app/components/spark/button/group.rb +22 -0
  53. data/app/components/spark/card.html.slim +7 -0
  54. data/app/components/spark/card.rb +13 -0
  55. data/app/components/spark/checklist.html.slim +14 -0
  56. data/app/components/spark/checklist.rb +49 -0
  57. data/app/components/spark/checklist/container.html.slim +14 -0
  58. data/app/components/spark/checklist/container.rb +51 -0
  59. data/app/components/spark/checklist/item.html.slim +9 -0
  60. data/app/components/spark/checklist/item.rb +24 -0
  61. data/app/components/spark/checklist/trigger.html.slim +6 -0
  62. data/app/components/spark/checklist/trigger.rb +13 -0
  63. data/app/components/spark/component/base.rb +27 -0
  64. data/app/components/spark/embed/wistia_media.html.slim +11 -0
  65. data/app/components/spark/embed/wistia_media.rb +22 -0
  66. data/app/components/spark/embed/wistia_media_component.rb +22 -36
  67. data/app/components/spark/grid.html.slim +4 -0
  68. data/app/components/spark/grid.rb +31 -0
  69. data/app/components/spark/grid/column.html.slim +1 -0
  70. data/app/components/spark/grid/column.rb +34 -0
  71. data/app/components/spark/icon.html.slim +1 -0
  72. data/app/components/spark/icon.rb +34 -0
  73. data/app/components/spark/icon/placeholder.html.slim +20 -0
  74. data/app/components/spark/icon/placeholder.rb +139 -0
  75. data/app/components/spark/input/base.html.slim +1 -0
  76. data/app/components/spark/input/base.rb +17 -0
  77. data/app/components/spark/input/checkbox.html.slim +2 -0
  78. data/app/components/spark/input/checkbox.rb +14 -0
  79. data/app/components/spark/input/label.html.slim +4 -0
  80. data/app/components/spark/input/label.rb +13 -0
  81. data/app/components/spark/input/switch.html.slim +5 -0
  82. data/app/components/spark/input/switch.rb +24 -0
  83. data/app/components/spark/layout/block.html.slim +13 -0
  84. data/app/components/spark/layout/block.rb +62 -0
  85. data/app/components/spark/layout/media_block.html.slim +11 -0
  86. data/app/components/spark/layout/media_block.rb +29 -0
  87. data/app/components/spark/layout/page.html.slim +15 -0
  88. data/app/components/spark/layout/page.rb +37 -0
  89. data/app/components/spark/nav/group.html.slim +5 -0
  90. data/app/components/spark/nav/group.rb +31 -0
  91. data/app/components/spark/nav/item.html.slim +12 -0
  92. data/app/components/spark/nav/item.rb +36 -0
  93. data/app/components/spark/nav/sidebar.html.slim +14 -0
  94. data/app/components/spark/nav/sidebar.rb +60 -0
  95. data/app/components/spark/nav/tab_panels.html.slim +6 -0
  96. data/app/components/spark/nav/tab_panels.rb +42 -0
  97. data/app/components/spark/nav/tabs.html.slim +8 -0
  98. data/app/components/spark/nav/tabs.rb +36 -0
  99. data/app/components/spark/nav/toggle.html.slim +9 -0
  100. data/app/components/spark/nav/toggle.rb +20 -0
  101. data/app/components/spark/nav/tree.html.slim +9 -0
  102. data/app/components/spark/nav/tree.rb +53 -0
  103. data/app/components/spark/nav/tree/group.html.slim +9 -0
  104. data/app/components/spark/nav/tree/group.rb +26 -0
  105. data/app/components/spark/sticky_panel.html.slim +2 -0
  106. data/app/components/spark/sticky_panel.rb +12 -0
  107. data/app/components/spark/toolbar.html.slim +7 -0
  108. data/app/components/spark/toolbar.rb +14 -0
  109. data/app/components/spark/tooltip.html.slim +3 -0
  110. data/app/components/spark/tooltip.rb +13 -0
  111. data/app/components/spark/trial_notice.html.slim +3 -0
  112. data/app/components/spark/trial_notice.rb +35 -0
  113. data/app/components/spark/widget_card.html.slim +5 -0
  114. data/app/components/spark/widget_card.rb +12 -0
  115. data/app/helpers/spark/application_helper.rb +9 -0
  116. data/lib/fleetio_spark.rb +6 -6
  117. data/lib/fleetio_spark/version.rb +1 -1
  118. data/public/code-1.0.0.rc.1.js +2 -0
  119. data/public/code-1.0.0.rc.1.js.gz +0 -0
  120. data/public/code-1.0.0.rc.1.js.map +1 -0
  121. data/public/spark-1.0.0.rc.1.css +1 -0
  122. data/public/spark-1.0.0.rc.1.css.gz +0 -0
  123. data/public/spark-1.0.0.rc.1.js +2 -0
  124. data/public/spark-1.0.0.rc.1.js.gz +0 -0
  125. data/public/spark-1.0.0.rc.1.js.map +1 -0
  126. metadata +110 -75
  127. data/app/assets/stylesheets/spark/components/layout/_base.scss +0 -0
  128. data/app/assets/stylesheets/spark/components/layout/_header.scss +0 -55
  129. data/app/assets/stylesheets/spark/components/page/_header.scss +0 -9
  130. data/app/assets/stylesheets/spark/components/page/_main.scss +0 -62
  131. data/app/assets/stylesheets/spark/components_old/header/_trial-status.scss +0 -61
  132. data/app/components/spark/app/banner_component.rb +0 -32
  133. data/app/components/spark/app/content_component.rb +0 -32
  134. data/app/components/spark/app/header_component.rb +0 -59
  135. data/app/components/spark/app/layout_component.rb +0 -92
  136. data/app/components/spark/app/modal_component.rb +0 -5
  137. data/app/components/spark/app/sidebar/header_component.rb +0 -39
  138. data/app/components/spark/app/sidebar_component.rb +0 -20
  139. data/app/components/spark/button/add_component.rb +0 -9
  140. data/app/components/spark/button/base_component.rb +0 -39
  141. data/app/components/spark/button/cancel_component.rb +0 -8
  142. data/app/components/spark/button/danger_component.rb +0 -8
  143. data/app/components/spark/button/group_component.rb +0 -24
  144. data/app/components/spark/button/icon_component.rb +0 -14
  145. data/app/components/spark/button/primary_component.rb +0 -8
  146. data/app/components/spark/button/text_component.rb +0 -8
  147. data/app/components/spark/form/checkbox_component.rb +0 -16
  148. data/app/components/spark/form/input_component.rb +0 -9
  149. data/app/components/spark/form/label_component.rb +0 -12
  150. data/app/components/spark/form/switch_component.rb +0 -32
  151. data/app/components/spark/layout/base_component.rb +0 -2
  152. data/app/components/spark/layout/grid/column_component.rb +0 -32
  153. data/app/components/spark/layout/grid_component.rb +0 -37
  154. data/app/components/spark/layout/header_component.rb +0 -26
  155. data/app/components/spark/layout/page_component.rb +0 -31
  156. data/app/components/spark/nav/breadcrumbs_component.rb +0 -2
  157. data/app/components/spark/nav/group_component.rb +0 -36
  158. data/app/components/spark/nav/item_component.rb +0 -44
  159. data/app/components/spark/nav/pills_component.rb +0 -28
  160. data/app/components/spark/nav/sidebar_component.rb +0 -59
  161. data/app/components/spark/nav/tab_panels/panel_component.rb +0 -37
  162. data/app/components/spark/nav/tab_panels/tab_component.rb +0 -13
  163. data/app/components/spark/nav/tab_panels_component.rb +0 -28
  164. data/app/components/spark/nav/tabs_component.rb +0 -59
  165. data/app/components/spark/nav/toggle_component.rb +0 -28
  166. data/app/components/spark/nav/tree/group_component.rb +0 -35
  167. data/app/components/spark/nav/tree_component.rb +0 -56
  168. data/app/components/spark/page/layout_component.rb +0 -32
  169. data/app/components/spark/page/main_component.rb +0 -39
  170. data/app/components/spark/ui/card_component.rb +0 -16
  171. data/app/components/spark/ui/checklist/container_component.rb +0 -56
  172. data/app/components/spark/ui/checklist/item_component.rb +0 -37
  173. data/app/components/spark/ui/checklist_trigger_component.rb +0 -20
  174. data/app/components/spark/ui/icon/_icon.html.erb +0 -0
  175. data/app/components/spark/ui/icon_component.rb +0 -30
  176. data/app/components/spark/ui/placeholder_component.rb +0 -105
  177. data/app/components/spark/ui/sticky_panel_component.rb +0 -9
  178. data/app/components/spark/ui/toolbar_component.rb +0 -17
  179. data/app/components/spark/ui/tooltip_component.rb +0 -13
  180. data/app/components/spark/ui/widget_card_component.rb +0 -13
  181. data/lib/fleetio_spark/component.rb +0 -36
  182. data/public/code-0.2.48.js +0 -2
  183. data/public/code-0.2.48.js.gz +0 -0
  184. data/public/code-0.2.48.js.map +0 -1
  185. data/public/spark-0.2.48.css +0 -1
  186. data/public/spark-0.2.48.css.gz +0 -0
  187. data/public/spark-0.2.48.js +0 -2
  188. data/public/spark-0.2.48.js.gz +0 -0
  189. data/public/spark-0.2.48.js.map +0 -1
@@ -0,0 +1,13 @@
1
+ div *tag_attrs
2
+ - if items.present? || @content.present?
3
+ .spark-layout-block-items
4
+ - if @content.present?
5
+ .spark-layout-block-item = @content
6
+ - items.each do |item|
7
+ .spark-layout-block-item *item.tag_attrs
8
+ = item.yield
9
+ - if actions.present?
10
+ .spark-layout-block-actions
11
+ - actions.each do |action|
12
+ .spark-layout-block-action *action.tag_attrs
13
+ = action.yield
@@ -0,0 +1,62 @@
1
+ module Spark
2
+ module Layout
3
+ class Block < Spark::Component::Base
4
+ GUTTER = %i[small base medium large xl].freeze
5
+ SPACER_SIZE = %i[base].freeze
6
+
7
+ attribute gutter: :small, action_gutter: :small
8
+
9
+ validates_attr :gutter, choices: GUTTER
10
+ validates_attr :action_gutter, choices: GUTTER
11
+
12
+ element :item, multiple: true do
13
+ attribute :expand
14
+
15
+ def initialize(*)
16
+ super
17
+
18
+ classname.add("expand") if @expand
19
+ end
20
+ end
21
+
22
+ element :spacer do
23
+ attribute :size
24
+ validates_attr :size, choices: SPACER_SIZE
25
+
26
+ def initialize(*)
27
+ super
28
+
29
+ # This is an attempt to determine if a spacer should be added to the list of items, or actions.
30
+ # If no actions have been added yet, add the spacer to the items.
31
+ if _parent.actions.empty?
32
+ _parent.items << self
33
+ else
34
+ _parent.actions << self
35
+ end
36
+
37
+ classname.add('block-spacer')
38
+ classname.add("size-#{@size}")
39
+ end
40
+ end
41
+
42
+ element :action, multiple: true do
43
+ attribute :expand
44
+
45
+ def initialize(*)
46
+ super
47
+
48
+ classname.add(:expand) if @expand
49
+ end
50
+ end
51
+
52
+ def initialize(*)
53
+ super
54
+
55
+ classname.base = "spark-layout-block"
56
+ classname.add("gutter-#{@gutter}") if @gutter
57
+ classname.add("action-gutter-#{@action_gutter}") if @action_gutter
58
+ tag_attrs.add(role: @role)
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,11 @@
1
+ div *tag_attrs
2
+ .spark-media-block-image *image.tag_attrs
3
+ = image.yield
4
+ - if title || body
5
+ .spark-media-block-content
6
+ - if title
7
+ .spark-media-block-title *title.tag_attrs
8
+ = title.yield
9
+ - if body
10
+ .spark-media-block-body *body.tag_attrs
11
+ = body.yield
@@ -0,0 +1,29 @@
1
+ module Spark
2
+ module Layout
3
+ class MediaBlock < Spark::Component::Base
4
+ LAYOUT = %i[default reverse]
5
+ ALIGN = %i[top middle bottom]
6
+ GUTTER = %i[small base medium large xl].freeze
7
+
8
+ attribute :align, :gutter, :expand, layout: :default
9
+
10
+ element :image
11
+ element :title
12
+ element :body
13
+
14
+ validates_attr :layout, choices: LAYOUT
15
+ validates_attr :align, choices: ALIGN, allow_nil: true
16
+ validates_attr :gutter, choices: GUTTER, allow_nil: true
17
+
18
+ def initialize(*)
19
+ super
20
+
21
+ classname.add("spark-media-block")
22
+ classname.add("layout-#{@layout}") if @layout
23
+ classname.add("align-#{@align}") if @align
24
+ classname.add("gutter-#{@gutter}") if @gutter
25
+ classname.add("expand") if @expand
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,15 @@
1
+ div *tag_attrs
2
+ - if headers.present?
3
+ .spark-page-header
4
+ - headers.each do |header|
5
+ div *header.tag_attrs = header.yield
6
+ .spark-page-wrapper
7
+ - if sidebar.present?
8
+ .spark-page-sidebar = sidebar.yield
9
+ - if main.present?
10
+ .spark-page-main
11
+ - if main.headers.present?
12
+ .spark-page-main-header
13
+ - main.headers.each do |header|
14
+ div *header.tag_attrs = header.yield
15
+ = main.yield
@@ -0,0 +1,37 @@
1
+ module Spark
2
+ module Layout
3
+ class Page < Spark::Component::Base
4
+
5
+ element :header, multiple: true do
6
+ attribute layout: :padded
7
+ validates_attr :layout, choices: [:padded, :flush]
8
+
9
+ def initialize(*)
10
+ super
11
+ classname.add("spark-page-header-block")
12
+ classname.add("layout-#{@layout}")
13
+ end
14
+ end
15
+
16
+ element :sidebar
17
+ element :main do
18
+ element :header, multiple: true do
19
+ def initialize(*)
20
+ super
21
+ classname.add("spark-page-main-header-block")
22
+ end
23
+ end
24
+
25
+ def initialize(*)
26
+ super
27
+ end
28
+ end
29
+
30
+ def initialize(*)
31
+ super
32
+
33
+ classname.add("spark-page")
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,5 @@
1
+ - unless items.empty?
2
+ ul.spark-nav-group role=@role
3
+ - items.each do |item|
4
+ li.nav-item-wrapper role=@item_role
5
+ = item.yield
@@ -0,0 +1,31 @@
1
+ module Spark
2
+ module Nav
3
+ class Group < Spark::Component::Base
4
+ attribute role: 'group', item_role: 'menuitem'
5
+
6
+ element :item, multiple: true, component: Spark::Nav::Item
7
+
8
+ def initialize(*)
9
+ super
10
+
11
+ classname.add("active") if active?
12
+ end
13
+
14
+ def new?
15
+ items.any?(&:new?)
16
+ end
17
+
18
+ def beta?
19
+ items.any?(&:beta?)
20
+ end
21
+
22
+ def active_item
23
+ items.find(&:active?)
24
+ end
25
+
26
+ def active?
27
+ items.any?(&:active?)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,12 @@
1
+ a *tag_attrs
2
+ = render(Spark::Icon, name: @icon, size: @icon_size, class: "nav-item-icon") if @icon
3
+ span.nav-item-content
4
+ span.nav-item-text = @text || content
5
+ - if label
6
+ = render(Spark::Badge, class: "nav-item-status", text: label, outline: true, color: (new? ? :yellow : :teal))
7
+ /span class="nav-item-label #{label}" = label.upcase
8
+ - if @detail
9
+ span.nav-item-detail = @detail
10
+ - if @badge
11
+ = render(Spark::Badge, text: @badge)
12
+ = content if @text
@@ -0,0 +1,36 @@
1
+ module Spark
2
+ module Nav
3
+ class Item < Spark::Component::Base
4
+ attribute :text, :icon, :detail, :badge, :active, :beta, :new, :href, :role, :id, :tabindex, :target, icon_size: :small
5
+
6
+ def initialize(*)
7
+ super
8
+
9
+ @href = @href || "#"
10
+ tag_attrs.add attr_hash(:href, :target, :tabindex, :role)
11
+ classname.base = "nav-item"
12
+ classname.add(:active) if active?
13
+ end
14
+
15
+ def label
16
+ if new?
17
+ "new"
18
+ elsif @beta
19
+ "beta"
20
+ end
21
+ end
22
+
23
+ def new?
24
+ if @new.is_a?(String)
25
+ 30.days.ago <= Time.zone.parse( @new )
26
+ else
27
+ @new
28
+ end
29
+ end
30
+
31
+ def active?
32
+ @href != "#" && @active || @view_context && @view_context.current_page?(@href)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,14 @@
1
+ nav *tag_attrs
2
+ = render(Spark::Nav::Toggle, target: selector(:data, :nav_id), class: classname.join_base(:toggle), text: sidebar_button_text) if @toggle
3
+ .spark-nav-sidebar-wrapper
4
+ - unless header.blank?
5
+ .spark-nav-sidebar-header *header.tag_attrs
6
+ = header.yield
7
+ .spark-nav-sidebar-main
8
+ - groups.each do |group|
9
+ - if group.attribute(:title)
10
+ h4.spark-nav-sidebar-title = group.attribute(:title)
11
+ = group.yield
12
+ - unless footer.blank?
13
+ .spark-nav-sidebar-footer *footer.tag_attrs
14
+ = footer.yield
@@ -0,0 +1,60 @@
1
+ module Spark
2
+ module Nav
3
+ class Sidebar < Spark::Component::Base
4
+ THEME = %i[default primary]
5
+ attribute :label, toggle: true
6
+ attribute theme: :default
7
+ validates_attr :label, presence: true
8
+ validates_attr :theme, choices: THEME
9
+
10
+ element :header
11
+ element :footer
12
+ element :group, component: Spark::Nav::Group, multiple: true do
13
+ attribute :title
14
+ end
15
+
16
+ element :tree, component: Spark::Nav::Tree, multiple: true do
17
+ attribute :title
18
+
19
+ def initialize(*)
20
+ super
21
+ # Add self to items to ensure groups are rendered
22
+ # in the correct order as items enumerate
23
+ _parent.groups << self
24
+ classname.add("spark-nav-group")
25
+ end
26
+ end
27
+
28
+ def initialize(*)
29
+ super
30
+
31
+ classname.base = "spark-nav-sidebar"
32
+ classname.add("theme-#{@theme}")
33
+ data.add(nav_id: unique_id)
34
+
35
+ if root_sidebar?
36
+ data.add(scroll: true)
37
+ @label ||= "Main Sidebar"
38
+ @toggle = false
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def root_sidebar?
45
+ @id && @id.to_sym == :sidebar
46
+ end
47
+
48
+ # Tries to find the text for the active nav item, otherwise shows sidebar label text
49
+ def sidebar_button_text
50
+ # Find any navs which have active items
51
+ active_nav = groups.find { |group|
52
+ group.active_item
53
+ }
54
+
55
+ # Use the active item text or the label for the sidebar
56
+ active_nav&.active_item&.attribute_text || @label
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,6 @@
1
+ .nav-tab-panels
2
+ = render file: "nav/tabs", object: self
3
+
4
+ - items.each_with_index do |item, index|
5
+ div id="panel-#{item.tab_id}" role="tabpanel" aria-labeledby=item.tag_attrs[:id]
6
+ = item.panel.yield
@@ -0,0 +1,42 @@
1
+ module Spark
2
+ module Nav
3
+ class TabPanels < Nav::Tabs
4
+ element :item, multiple: true, component: Spark::Nav::Item do
5
+ element :panel
6
+
7
+ def initialize(*)
8
+ super
9
+
10
+ tag_attrs.add(role: :tab, id: "tab-#{tab_id}")
11
+ data.add(anchor: @href, add_class: :active)
12
+ aria.add(controls: "panel-#{tab_id}", selected: !!@active)
13
+
14
+ # Set to active if this is the first tab
15
+ classname.add(:active) if _parent.items.empty?
16
+ end
17
+
18
+ def tab_id
19
+ @tab_id ||= unique_id
20
+ end
21
+
22
+ private
23
+ end
24
+
25
+ def initialize(*)
26
+ super
27
+ @nav_group_attrs.add(role: "tablist")
28
+ end
29
+
30
+ def active_item_text
31
+ items.first.attribute(:text)
32
+ end
33
+
34
+ private
35
+
36
+ def item_group(options={}, &block)
37
+ options.merge!({ role: "tablist" })
38
+ super(options, &block)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,8 @@
1
+ - unless items.empty?
2
+ nav *tag_attrs
3
+ - if @theme == :tabs
4
+ = render(Spark::Nav::Toggle, target: selector(:data, :nav_id), class: "spark-nav-tabs-toggle", text: active_item_text)
5
+ div class="nav-#{@theme}-wrapper"
6
+ ul.spark-nav-group *@nav_group_attrs
7
+ - items.each do |item|
8
+ li class="nav-item-wrapper" = item.yield
@@ -0,0 +1,36 @@
1
+ module Spark
2
+ module Nav
3
+ class Tabs < Spark::Component::Base
4
+ LAYOUT = %i[flush padded]
5
+ THEME = %i[tabs pills]
6
+
7
+ attribute :label, role: "navigation", layout: :flush
8
+ attribute theme: :tabs
9
+
10
+ validates_attr :label, presence: true
11
+ validates_attr :layout, choices: LAYOUT
12
+ validates_attr :theme, choices: THEME
13
+
14
+ element :item, multiple: true, component: Spark::Nav::Item
15
+
16
+ def initialize(*)
17
+ super
18
+
19
+ classname.base = "spark-nav-#{@theme}"
20
+ classname.add %(layout-#{@layout})
21
+ data.add nav_id: unique_id
22
+ @nav_group_attrs = TagAttr.new
23
+ end
24
+
25
+ private
26
+
27
+ def active_item_text
28
+ if active_item = items.find(&:active?)
29
+ active_item.attribute(:text)
30
+ else
31
+ "Menu"
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end