backpack 0.4.0 → 0.4.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.
- checksums.yaml +4 -4
- data/demo/.yarnrc.yml +4 -0
- data/demo/Gemfile.lock +1 -2
- data/demo/app/views/layouts/backpack.html.erb +2 -4
- data/demo/config/initializers/phlex.rb +9 -0
- data/demo/yarn.lock +1101 -1101
- data/lib/backpack/{components/concerns/classes.rb → classes.rb} +1 -1
- data/lib/backpack/components/badge.rb +1 -1
- data/lib/backpack/components/base.rb +1 -1
- data/lib/backpack/components/breadcrumb.rb +2 -2
- data/lib/backpack/components/button.rb +1 -1
- data/lib/backpack/components/favicon.rb +1 -1
- data/lib/backpack/components/heading.rb +1 -1
- data/lib/backpack/components/icon.rb +1 -1
- data/lib/backpack/components/icon_button/icon_button.css +183 -0
- data/lib/backpack/components/icon_button/icon_button.js +1 -0
- data/lib/backpack/components/icon_button.rb +32 -0
- data/lib/backpack/components/icon_sprite.rb +1 -1
- data/lib/backpack/components/quotation.rb +1 -1
- data/lib/backpack/components/rich_text.rb +1 -1
- data/lib/backpack/components/skip_links.rb +1 -1
- data/lib/backpack/components.rb +2 -4
- data/lib/backpack/{components/concerns/identifier.rb → identifier.rb} +5 -1
- data/lib/backpack/version.rb +1 -1
- data/lib/backpack.rb +5 -4
- data/spec/components/badge_spec.rb +1 -1
- data/spec/components/breadcrumb_spec.rb +1 -1
- data/spec/components/button_spec.rb +3 -3
- data/spec/components/favicon_spec.rb +1 -1
- data/spec/components/heading_spec.rb +1 -1
- data/spec/components/icon_button_spec.rb +58 -0
- data/spec/components/icon_spec.rb +1 -1
- data/spec/components/icon_sprite_spec.rb +1 -1
- data/spec/components/previews/badge_preview/overview.html.erb +8 -5
- data/spec/components/previews/badge_preview.rb +3 -1
- data/spec/components/previews/breadcrumb_preview.rb +3 -1
- data/spec/components/previews/button_preview/overview.html.erb +12 -7
- data/spec/components/previews/button_preview.rb +2 -1
- data/spec/components/previews/heading_preview.rb +3 -1
- data/spec/components/previews/icon_button_preview/overview.html.erb +48 -0
- data/spec/components/previews/icon_button_preview.rb +14 -0
- data/spec/components/previews/icon_preview.rb +3 -1
- data/spec/components/previews/quotation_preview/overview.html.erb +5 -4
- data/spec/components/previews/quotation_preview.rb +3 -1
- data/spec/components/previews/rich_text_preview.rb +3 -1
- data/spec/components/previews/skip_links_preview.rb +3 -1
- data/spec/components/quotation_spec.rb +1 -1
- data/spec/components/rich_text_spec.rb +1 -1
- data/spec/components/skip_links_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -1
- data/spec/support/components.rb +8 -0
- data/{lib/backpack → spec/support}/spec_helpers.rb +1 -1
- metadata +13 -20
- data/spec/components/previews/backpack/preview.rb +0 -3
- /data/lib/backpack/{components/concerns/attributes.rb → attributes.rb} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
class
|
|
3
|
+
class Components::Badge < Components::Base
|
|
4
4
|
prop :variant, _Union(:solid, :soft, :surface, :outline), default: :solid
|
|
5
5
|
prop :color, Backpack::Tokens::OptionalColor
|
|
6
6
|
prop :size, Backpack::Tokens::Size, default: 2
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
class
|
|
4
|
-
class Item <
|
|
3
|
+
class Components::Breadcrumb < Components::Base
|
|
4
|
+
class Item < Components::Base
|
|
5
5
|
prop :href, HTMLAttribute, default: ""
|
|
6
6
|
prop :breadcrumb, Breadcrumb
|
|
7
7
|
prop :last, _Boolean, default: false
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
class
|
|
3
|
+
class Components::Heading < Components::Base
|
|
4
4
|
prop :level, _Union(1, 2, 3, 4, 5), default: 1
|
|
5
5
|
prop :tag, _Union(:h1, :h2, :h3, :h4, :h5, :h6), default: -> { :"h#{@level}" }
|
|
6
6
|
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
.root {
|
|
2
|
+
appearance: none;
|
|
3
|
+
border: none;
|
|
4
|
+
border-radius: var(--radius-full);
|
|
5
|
+
cursor: pointer;
|
|
6
|
+
display: inline-flex;
|
|
7
|
+
justify-content: center;
|
|
8
|
+
text-decoration: none;
|
|
9
|
+
transition:
|
|
10
|
+
background-color 0.2s ease-in-out,
|
|
11
|
+
color 0.2s ease-in-out;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* solid */
|
|
15
|
+
.variant-solid {
|
|
16
|
+
background-color: var(--accent-9);
|
|
17
|
+
color: var(--accent-1);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
@media (hover: hover) {
|
|
21
|
+
.variant-solid:hover {
|
|
22
|
+
background-color: var(--accent-10);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.variant-solid:active {
|
|
27
|
+
background-color: var(--accent-12);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.variant-solid:focus {
|
|
31
|
+
outline: 0.3rem solid var(--accent-8);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.variant-solid:disabled {
|
|
35
|
+
background-color: var(--slate-5);
|
|
36
|
+
border: none;
|
|
37
|
+
color: var(--slate-9);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/* soft */
|
|
41
|
+
.variant-soft {
|
|
42
|
+
background-color: var(--accent-5);
|
|
43
|
+
color: var(--accent-9);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
@media (hover: hover) {
|
|
47
|
+
.variant-soft:hover {
|
|
48
|
+
background-color: var(--accent-6);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.variant-soft:active {
|
|
53
|
+
background-color: var(--accent-7);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.variant-soft:focus {
|
|
57
|
+
background-color: var(--accent-5);
|
|
58
|
+
outline: 0.2rem solid var(--accent-9);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.variant-soft:disabled {
|
|
62
|
+
background-color: var(--slate-4);
|
|
63
|
+
border: none;
|
|
64
|
+
color: var(--slate-9);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/* surface */
|
|
68
|
+
.variant-surface {
|
|
69
|
+
background-color: var(--accent-3);
|
|
70
|
+
box-shadow: inset 0 0 0 1px var(--accent-9);
|
|
71
|
+
color: var(--accent-9);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
@media (hover: hover) {
|
|
75
|
+
.variant-surface:hover {
|
|
76
|
+
background-color: var(--accent-4);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.variant-surface:active {
|
|
81
|
+
background-color: var(--accent-5);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.variant-surface:focus {
|
|
85
|
+
outline: 0.2rem solid var(--accent-9);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.variant-surface:disabled {
|
|
89
|
+
background-color: var(--slate-3);
|
|
90
|
+
box-shadow: inset 0 0 0 1px var(--slate-8);
|
|
91
|
+
color: var(--slate-9);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/* outline */
|
|
95
|
+
.variant-outline {
|
|
96
|
+
background-color: transparent;
|
|
97
|
+
box-shadow: inset 0 0 0 1px var(--accent-9);
|
|
98
|
+
color: var(--accent-9);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
@media (hover: hover) {
|
|
102
|
+
.variant-outline:hover {
|
|
103
|
+
background-color: var(--accent-3);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.variant-outline:active {
|
|
108
|
+
background-color: var(--accent-4);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.variant-outline:focus {
|
|
112
|
+
outline: 0.2rem solid var(--accent-9);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.variant-outline:disabled {
|
|
116
|
+
background-color: transparent;
|
|
117
|
+
box-shadow: inset 0 0 0 1px var(--slate-8);
|
|
118
|
+
color: var(--slate-8);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/* ghost */
|
|
122
|
+
.variant-ghost {
|
|
123
|
+
color: var(--accent-9);
|
|
124
|
+
background-color: transparent;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
@media (hover: hover) {
|
|
128
|
+
.variant-ghost:hover {
|
|
129
|
+
background-color: var(--accent-4);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.variant-ghost:active {
|
|
134
|
+
background-color: var(--accent-5);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.variant-ghost:focus {
|
|
138
|
+
outline: 0.2rem solid var(--accent-9);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.variant-ghost:disabled {
|
|
142
|
+
background-color: transparent;
|
|
143
|
+
color: var(--slate-8);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/* size */
|
|
147
|
+
.size-1 {
|
|
148
|
+
--icon-size: 1.8rem;
|
|
149
|
+
padding: var(--space-4);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.size-2 {
|
|
153
|
+
--icon-size: 2rem;
|
|
154
|
+
padding: var(--space-5);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.size-3 {
|
|
158
|
+
--icon-size: 2.4rem;
|
|
159
|
+
padding: var(--space-5);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/* States */
|
|
163
|
+
.root:disabled {
|
|
164
|
+
cursor: not-allowed;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
@media (max-width: 576px) {
|
|
168
|
+
.root {
|
|
169
|
+
line-height: 1;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.size-1 {
|
|
173
|
+
--icon-size: 1.6rem;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.size-2 {
|
|
177
|
+
--icon-size: 1.8rem;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.size-3 {
|
|
181
|
+
--icon-size: 2rem;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "./icon_button.css";
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Components::IconButton < Components::Base
|
|
4
|
+
prop :href, HTMLAttribute, predicate: :private
|
|
5
|
+
prop :label, MandatoryHTMLAttribute
|
|
6
|
+
prop :icon, _Union(Symbol, String)
|
|
7
|
+
prop :variant, Backpack::Tokens::Variant, default: :solid
|
|
8
|
+
prop :color, Backpack::Tokens::OptionalColor
|
|
9
|
+
prop :size, Backpack::Tokens::Size, default: 2
|
|
10
|
+
|
|
11
|
+
def view_template
|
|
12
|
+
if href?
|
|
13
|
+
a(href: @href, **root_attributes) { render_icon }
|
|
14
|
+
else
|
|
15
|
+
button(**root_attributes) { render_icon }
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def render_icon
|
|
22
|
+
Icon(@icon, class: "#{root_class}-icon", label: @label)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def variant_props
|
|
26
|
+
%i[variant size]
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def extra_root_attributes
|
|
30
|
+
{ data_accent_color: @color }
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require 'rails-html-sanitizer'
|
|
4
4
|
|
|
5
|
-
class
|
|
5
|
+
class Components::IconSprite < Components::Base
|
|
6
6
|
ICON_PATHS = [
|
|
7
7
|
Rails.root&.join("app/assets/icons"),
|
|
8
8
|
Rails.root&.join("node_modules/lucide-static/icons"),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
class
|
|
3
|
+
class Components::Quotation < Components::Base
|
|
4
4
|
prop :cite, _String?, predicate: :private
|
|
5
5
|
prop :size, _Union(1, 2, 3, 4, 5, 6), default: 2
|
|
6
6
|
prop :weight, Backpack::Tokens::Weight, default: :regular
|
data/lib/backpack/components.rb
CHANGED
|
@@ -5,9 +5,13 @@ module Backpack::Identifier
|
|
|
5
5
|
|
|
6
6
|
class_methods do
|
|
7
7
|
def identifier
|
|
8
|
-
|
|
8
|
+
(name.split("::") - %w[Components Backpack]).join("/")
|
|
9
9
|
end
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
+
def identifier
|
|
13
|
+
self.class.identifier.parameterize
|
|
14
|
+
end
|
|
15
|
+
|
|
12
16
|
delegate :identifier, to: :class
|
|
13
17
|
end
|
data/lib/backpack/version.rb
CHANGED
data/lib/backpack.rb
CHANGED
|
@@ -6,11 +6,12 @@ require 'date'
|
|
|
6
6
|
require 'literal'
|
|
7
7
|
require 'phlex-rails'
|
|
8
8
|
require 'rails'
|
|
9
|
-
require 'zeitwerk'
|
|
10
9
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
require 'backpack/attributes'
|
|
11
|
+
require 'backpack/classes'
|
|
12
|
+
require 'backpack/identifier'
|
|
13
|
+
require 'backpack/tokens'
|
|
14
|
+
require 'backpack/components'
|
|
14
15
|
|
|
15
16
|
module Backpack
|
|
16
17
|
class Error < StandardError; end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
2
|
|
|
3
|
-
describe
|
|
3
|
+
describe Components::Button, type: :component do
|
|
4
4
|
let(:component) { described_class.new(**params) { text } }
|
|
5
5
|
let(:params) { {} }
|
|
6
6
|
let(:text) { "Label" }
|
|
@@ -54,7 +54,7 @@ describe Backpack::Components::Button, type: :component do
|
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
context "with an icon before the text" do
|
|
57
|
-
let(:icon) { render(
|
|
57
|
+
let(:icon) { render(Components::Icon.new("user")) }
|
|
58
58
|
let(:component) do
|
|
59
59
|
described_class.new(**params) do
|
|
60
60
|
icon
|
|
@@ -74,7 +74,7 @@ describe Backpack::Components::Button, type: :component do
|
|
|
74
74
|
end
|
|
75
75
|
|
|
76
76
|
context "with an icon after the text" do
|
|
77
|
-
let(:icon) { render(
|
|
77
|
+
let(:icon) { render(Components::Icon.new("user")) }
|
|
78
78
|
let(:component) do
|
|
79
79
|
described_class.new(**params) do
|
|
80
80
|
text
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Components::IconButton, type: :component do
|
|
4
|
+
let(:component) { described_class.new(**params) }
|
|
5
|
+
let(:params) { { icon: :user, label: "User" } }
|
|
6
|
+
|
|
7
|
+
subject(:output) { render_fragment(component) }
|
|
8
|
+
|
|
9
|
+
it "renders a button element with the default styling" do
|
|
10
|
+
expect(output).to have_css(
|
|
11
|
+
"button.IconButton.IconButton-variant-solid.IconButton-size-2"
|
|
12
|
+
)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "renders the icon" do
|
|
16
|
+
expect(output).to have_css("button.IconButton svg.Icon.IconButton-icon[data-icon-key='user']")
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
context "with a href" do
|
|
20
|
+
let(:params) { { icon: :user, label: "User", href: "/path" } }
|
|
21
|
+
|
|
22
|
+
it "renders a link element using the same styling classes" do
|
|
23
|
+
expect(output).to have_css(
|
|
24
|
+
"a.IconButton.IconButton-variant-solid.IconButton-size-2[href='/path']"
|
|
25
|
+
)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
context "with variant options" do
|
|
30
|
+
let(:params) { { icon: :user, label: "User", variant: :outline, color: :red, size: 1 } }
|
|
31
|
+
|
|
32
|
+
it "updates the variant modifiers in the class list" do
|
|
33
|
+
expect(output).to have_css(
|
|
34
|
+
"button.IconButton.IconButton-variant-outline.IconButton-size-1"
|
|
35
|
+
)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
context "with HTML attributes" do
|
|
40
|
+
let(:params) do
|
|
41
|
+
{ icon: :user, label: "User", class: "custom", data: { test: "value" }, aria: { label: "Open menu" } }
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "merges custom attributes with the generated ones" do
|
|
45
|
+
expect(output).to have_css(
|
|
46
|
+
"button.IconButton.IconButton-variant-solid.IconButton-size-2.custom[data-test='value'][aria-label='Open menu']"
|
|
47
|
+
)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
context "with a color option" do
|
|
52
|
+
let(:params) { { icon: :user, label: "User", color: :red } }
|
|
53
|
+
|
|
54
|
+
it "sets the data-accent-color attribute" do
|
|
55
|
+
expect(output).to have_css("button.IconButton[data-accent-color='red']")
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
<%
|
|
2
|
-
|
|
3
|
-
%>
|
|
1
|
+
<% props = Components::Badge.literal_properties %>
|
|
2
|
+
|
|
4
3
|
<table class="lookbook-table">
|
|
5
4
|
<thead>
|
|
6
5
|
<tr>
|
|
7
6
|
<th>Color</th>
|
|
8
7
|
<% props[:color].type.each do |color| %>
|
|
9
|
-
<th colspan="<%= props[:size].type.to_a.size %>"
|
|
8
|
+
<th colspan="<%= props[:size].type.to_a.size %>">
|
|
9
|
+
<code><%= color || :default %></code>
|
|
10
|
+
</th>
|
|
10
11
|
<% end %>
|
|
11
12
|
</tr>
|
|
12
13
|
<tr>
|
|
@@ -24,7 +25,9 @@ props = Backpack::Components::Badge.literal_properties
|
|
|
24
25
|
<th><code><%= variant %></code></th>
|
|
25
26
|
<% props[:color].type.each do |color| %>
|
|
26
27
|
<% props[:size].type.each do |size| %>
|
|
27
|
-
<td
|
|
28
|
+
<td>
|
|
29
|
+
<%= render Components::Badge.new(variant:, size:, color:) { "Badge" } %>
|
|
30
|
+
</td>
|
|
28
31
|
<% end %>
|
|
29
32
|
<% end %>
|
|
30
33
|
</tr>
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
class BreadcrumbPreview <
|
|
1
|
+
class BreadcrumbPreview < Lookbook::Preview
|
|
2
|
+
include Components
|
|
3
|
+
|
|
2
4
|
# Markup and style based on [ARIA Breadcrumb Pattern Example](https://www.w3.org/WAI/ARIA/apg/patterns/breadcrumb/examples/breadcrumb/)
|
|
3
5
|
def default
|
|
4
6
|
Breadcrumb() do |c|
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
<%
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
%>
|
|
1
|
+
<% props = Components::Button.literal_properties
|
|
2
|
+
icon = "arrow-right" %>
|
|
3
|
+
|
|
5
4
|
<table class="lookbook-table">
|
|
6
5
|
<thead>
|
|
7
6
|
<tr>
|
|
8
7
|
<th>Color</th>
|
|
9
8
|
<% props[:color].type.each do |color| %>
|
|
10
|
-
<th colspan="<%= props[:size].type.to_a.size %>"
|
|
9
|
+
<th colspan="<%= props[:size].type.to_a.size %>">
|
|
10
|
+
<code><%= color || :default %></code>
|
|
11
|
+
</th>
|
|
11
12
|
<% end %>
|
|
12
13
|
</tr>
|
|
13
14
|
<tr>
|
|
@@ -25,7 +26,9 @@ icon = "arrow-right"
|
|
|
25
26
|
<th><code><%= variant %></code></th>
|
|
26
27
|
<% props[:color].type.each do |color| %>
|
|
27
28
|
<% props[:size].type.each do |size| %>
|
|
28
|
-
<td
|
|
29
|
+
<td>
|
|
30
|
+
<%= render Components::Button.new(variant:, size:, color:, icon:) { "Button" } %>
|
|
31
|
+
</td>
|
|
29
32
|
<% end %>
|
|
30
33
|
<% end %>
|
|
31
34
|
</tr>
|
|
@@ -33,7 +36,9 @@ icon = "arrow-right"
|
|
|
33
36
|
<th><code><%= variant %></code>, <code>disabled</code></th>
|
|
34
37
|
<% props[:color].type.each do |color| %>
|
|
35
38
|
<% props[:size].type.each do |size| %>
|
|
36
|
-
<td
|
|
39
|
+
<td>
|
|
40
|
+
<%= render Components::Button.new(variant:, size:, color:, icon:, disabled: true) { "Button" } %>
|
|
41
|
+
</td>
|
|
37
42
|
<% end %>
|
|
38
43
|
<% end %>
|
|
39
44
|
</tr>
|