11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
# File 'lib/klods/components/tabs.rb', line 11
def tabs(a = nil, b = nil)
props, children = Core.normalize_args(a, b)
props = props.transform_keys(&:to_s)
panels = Array(children).flatten.select { |c| c.is_a?(Node) }
ns = props["id"] ? Core.slug_id("klods-tabs", props["id"].to_s) : "klods-tabs"
items = panels.each_with_index.map do |panel, i|
label = panel.attrs["data-tab-label"] || "Tab #{i + 1}"
tab_id = Core.slug_id("#{ns}-tab", "#{label}-#{i + 1}")
panel_id = Core.slug_id("#{ns}-panel", "#{label}-#{i + 1}")
{panel: panel, label: label, tab_id: tab_id, panel_id: panel_id, active: i == 0}
end
tab_list = Core.el(
"div",
{"class" => "klods-tabs__list", "role" => "tablist"},
items.map do |item|
tab_attrs = {
"type" => "button",
"role" => "tab",
"id" => item[:tab_id],
"aria-selected" => item[:active].to_s,
"aria-controls" => item[:panel_id],
"class" => item[:active] ? "klods-tabs__tab klods-tabs__tab--active" : "klods-tabs__tab"
}
tab_attrs["tabindex"] = "-1" unless item[:active]
Core.el("button", tab_attrs, item[:label])
end
)
panel_nodes = items.map do |item|
panel = item[:panel]
panel_attrs = panel.attrs.except("data-tab-label")
= panel_attrs.delete("class")
cls = Core.class_names("klods-tabs__panel", Core.resolve_class())
attrs = panel_attrs.merge(
"class" => cls.empty? ? nil : cls,
"role" => "tabpanel",
"id" => item[:panel_id],
"aria-labelledby" => item[:tab_id]
).compact
attrs["hidden"] = true unless item[:active]
Node.new("div", attrs, panel.children)
end
= props.delete("class")
cls = Core.class_names("klods-tabs", Core.resolve_class())
Core.el("div", props.merge("class" => cls.empty? ? nil : cls).compact, [tab_list, *panel_nodes])
end
|