protos 0.3.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/.rubocop.yml +5 -5
- data/CHANGELOG.md +11 -0
- data/README.md +26 -7
- data/benchmarks/.keep +0 -0
- data/benchmarks/table.txt +12 -0
- data/examples/list.rb +2 -0
- data/lib/protos/accordion/item.rb +5 -6
- data/lib/protos/accordion.rb +6 -10
- data/lib/protos/alert/actions.rb +2 -2
- data/lib/protos/alert/icon.rb +2 -2
- data/lib/protos/alert.rb +4 -8
- data/lib/protos/attributes.rb +7 -8
- data/lib/protos/breadcrumbs/crumb.rb +2 -2
- data/lib/protos/breadcrumbs.rb +1 -3
- data/lib/protos/card/actions.rb +2 -2
- data/lib/protos/card/body.rb +2 -2
- data/lib/protos/card/image.rb +2 -2
- data/lib/protos/card/title.rb +2 -2
- data/lib/protos/card.rb +6 -14
- data/lib/protos/carousel/actions.rb +2 -2
- data/lib/protos/carousel/item.rb +2 -2
- data/lib/protos/carousel.rb +4 -8
- data/lib/protos/chat_bubble/content.rb +2 -2
- data/lib/protos/chat_bubble/footer.rb +2 -2
- data/lib/protos/chat_bubble/header.rb +2 -2
- data/lib/protos/chat_bubble/image.rb +2 -2
- data/lib/protos/chat_bubble.rb +6 -14
- data/lib/protos/collapse/content.rb +2 -2
- data/lib/protos/collapse/title.rb +3 -3
- data/lib/protos/collapse.rb +2 -6
- data/lib/protos/combobox.rb +8 -24
- data/lib/protos/command/empty.rb +2 -2
- data/lib/protos/command/item.rb +2 -2
- data/lib/protos/command/list.rb +2 -2
- data/lib/protos/command/title.rb +2 -2
- data/lib/protos/command/trigger.rb +2 -2
- data/lib/protos/command.rb +10 -26
- data/lib/protos/component.rb +21 -30
- data/lib/protos/drawer/content.rb +2 -2
- data/lib/protos/drawer/trigger.rb +2 -2
- data/lib/protos/drawer.rb +3 -9
- data/lib/protos/dropdown/item.rb +2 -2
- data/lib/protos/dropdown.rb +3 -9
- data/lib/protos/hero/content.rb +2 -2
- data/lib/protos/hero/overlay.rb +2 -2
- data/lib/protos/hero.rb +4 -8
- data/lib/protos/list/item.rb +2 -2
- data/lib/protos/list.rb +3 -5
- data/lib/protos/modal/trigger.rb +2 -2
- data/lib/protos/modal.rb +5 -11
- data/lib/protos/popover/content.rb +2 -0
- data/lib/protos/popover/trigger.rb +2 -2
- data/lib/protos/popover.rb +4 -8
- data/lib/protos/stats/actions.rb +2 -2
- data/lib/protos/stats/description.rb +2 -2
- data/lib/protos/stats/figure.rb +2 -2
- data/lib/protos/stats/stat.rb +2 -2
- data/lib/protos/stats/title.rb +2 -2
- data/lib/protos/stats/value.rb +2 -2
- data/lib/protos/stats.rb +8 -20
- data/lib/protos/swap/off.rb +2 -2
- data/lib/protos/swap/on.rb +2 -2
- data/lib/protos/swap.rb +2 -6
- data/lib/protos/table/body.rb +2 -2
- data/lib/protos/table/caption.rb +3 -3
- data/lib/protos/table/cell.rb +2 -2
- data/lib/protos/table/footer.rb +2 -2
- data/lib/protos/table/head.rb +2 -2
- data/lib/protos/table/header.rb +2 -2
- data/lib/protos/table/row.rb +2 -2
- data/lib/protos/table.rb +7 -21
- data/lib/protos/tabs/tab.rb +3 -3
- data/lib/protos/tabs.rb +3 -5
- data/lib/protos/theme.rb +38 -45
- data/lib/protos/timeline/center.rb +2 -2
- data/lib/protos/timeline/item.rb +2 -2
- data/lib/protos/timeline/left.rb +2 -2
- data/lib/protos/timeline/right.rb +2 -2
- data/lib/protos/timeline.rb +6 -14
- data/lib/protos/toast/close_button.rb +1 -0
- data/lib/protos/toast.rb +3 -5
- data/lib/protos/token_list.rb +18 -31
- data/lib/protos/typography/heading.rb +2 -2
- data/lib/protos/typography/inline_link.rb +3 -3
- data/lib/protos/typography/paragraph.rb +2 -2
- data/lib/protos/typography.rb +12 -12
- data/lib/protos/version.rb +1 -1
- data/protos.gemspec +14 -2
- metadata +6 -4
data/lib/protos/tabs/tab.rb
CHANGED
@@ -5,12 +5,12 @@ module Protos
|
|
5
5
|
class Tab < Component
|
6
6
|
# DOCS: A single tab in a tabs component
|
7
7
|
|
8
|
-
|
8
|
+
option :id
|
9
9
|
option :label
|
10
10
|
option :active, default: -> { false }
|
11
11
|
option :disabled, default: -> { false }
|
12
12
|
|
13
|
-
def view_template(&
|
13
|
+
def view_template(&)
|
14
14
|
input(
|
15
15
|
type: :radio,
|
16
16
|
class: css[:input],
|
@@ -19,7 +19,7 @@ module Protos
|
|
19
19
|
aria_label: label,
|
20
20
|
autocomplete: :off
|
21
21
|
)
|
22
|
-
div(**attrs, &
|
22
|
+
div(**attrs, &)
|
23
23
|
end
|
24
24
|
|
25
25
|
private
|
data/lib/protos/tabs.rb
CHANGED
data/lib/protos/theme.rb
CHANGED
@@ -13,13 +13,24 @@ module Protos
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
-
def initialize(theme = {}, **kwargs)
|
17
|
-
@
|
16
|
+
def initialize(theme = {}, tailwind_merge: true, **kwargs)
|
17
|
+
@tailwind_merge = tailwind_merge
|
18
|
+
|
19
|
+
@theme = Hash.new do |hash, key|
|
20
|
+
hash[key] = TokenList.new
|
21
|
+
end
|
22
|
+
|
23
|
+
theme.merge!(kwargs).each do |key, value|
|
24
|
+
@theme[key].add(value)
|
25
|
+
end
|
18
26
|
end
|
19
27
|
|
20
28
|
def [](key)
|
21
|
-
|
22
|
-
|
29
|
+
return nil unless key?(key)
|
30
|
+
|
31
|
+
value = @theme[key].to_s
|
32
|
+
return nil if value.empty?
|
33
|
+
return value unless @tailwind_merge
|
23
34
|
|
24
35
|
self.class.merger.merge(value)
|
25
36
|
end
|
@@ -29,66 +40,48 @@ module Protos
|
|
29
40
|
end
|
30
41
|
|
31
42
|
def add(key, value)
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
.to_s
|
36
|
-
.tap do |tokens|
|
37
|
-
@theme[key] = tokens
|
38
|
-
end
|
43
|
+
return if value.nil?
|
44
|
+
|
45
|
+
@theme[key].add(value)
|
39
46
|
end
|
40
47
|
|
41
48
|
def remove(key, value)
|
42
|
-
|
43
|
-
|
44
|
-
.remove(value)
|
45
|
-
.to_s
|
46
|
-
.tap do |tokens|
|
47
|
-
@theme[key] = tokens
|
48
|
-
end
|
49
|
+
@theme[key].remove(value)
|
50
|
+
@theme.delete(key) if @theme[key].empty?
|
49
51
|
end
|
50
52
|
|
51
53
|
def set(key, value)
|
52
|
-
if value.
|
53
|
-
|
54
|
-
|
55
|
-
TokenList
|
56
|
-
.parse(value)
|
57
|
-
.to_s
|
58
|
-
.tap do |tokens|
|
59
|
-
@theme[key] = tokens
|
60
|
-
end
|
61
|
-
end
|
54
|
+
return if value.nil?
|
55
|
+
|
56
|
+
@theme[key].clear.add(value)
|
62
57
|
end
|
63
58
|
|
64
59
|
def merge(hash)
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
set(no_bang, hash[key])
|
77
|
-
else
|
78
|
-
set(key, hash[key])
|
79
|
-
end
|
60
|
+
return self unless hash
|
61
|
+
|
62
|
+
hash.each do |key, value|
|
63
|
+
if key?(key)
|
64
|
+
add(key, value)
|
65
|
+
elsif negation?(key)
|
66
|
+
remove(key[1..].to_sym, value)
|
67
|
+
elsif override?(key)
|
68
|
+
set(key[..-2].to_sym, value)
|
69
|
+
else
|
70
|
+
set(key, value)
|
80
71
|
end
|
81
72
|
end
|
73
|
+
|
74
|
+
self
|
82
75
|
end
|
83
76
|
|
84
77
|
private
|
85
78
|
|
86
79
|
def negation?(key)
|
87
|
-
key.
|
80
|
+
key.start_with?("!")
|
88
81
|
end
|
89
82
|
|
90
83
|
def override?(key)
|
91
|
-
key.
|
84
|
+
key.end_with?("!")
|
92
85
|
end
|
93
86
|
end
|
94
87
|
end
|
data/lib/protos/timeline/item.rb
CHANGED
data/lib/protos/timeline/left.rb
CHANGED
@@ -6,8 +6,8 @@ module Protos
|
|
6
6
|
# DOCS: Content on the left (on daisyui "start") side of a timeline.
|
7
7
|
# We chose not to use start/end because of the keywork conflict with ruby.
|
8
8
|
|
9
|
-
def view_template(&
|
10
|
-
div(**attrs, &
|
9
|
+
def view_template(&)
|
10
|
+
div(**attrs, &)
|
11
11
|
end
|
12
12
|
|
13
13
|
private
|
@@ -6,8 +6,8 @@ module Protos
|
|
6
6
|
# DOCS: Content on the right (on daisyui "end") side of a timeline.
|
7
7
|
# We chose not to use start/end because of the keywork conflict with ruby.
|
8
8
|
|
9
|
-
def view_template(&
|
10
|
-
div(**attrs, &
|
9
|
+
def view_template(&)
|
10
|
+
div(**attrs, &)
|
11
11
|
end
|
12
12
|
|
13
13
|
private
|
data/lib/protos/timeline.rb
CHANGED
@@ -7,25 +7,17 @@ module Protos
|
|
7
7
|
|
8
8
|
option :vertical, type: Types::Bool, default: -> { false }
|
9
9
|
|
10
|
-
def view_template(&
|
11
|
-
ul(**attrs, &
|
10
|
+
def view_template(&)
|
11
|
+
ul(**attrs, &)
|
12
12
|
end
|
13
13
|
|
14
|
-
def item(...)
|
15
|
-
Item.new(...)
|
16
|
-
end
|
14
|
+
def item(...) = render Item.new(...)
|
17
15
|
|
18
|
-
def left(...)
|
19
|
-
Left.new(...)
|
20
|
-
end
|
16
|
+
def left(...) = render Left.new(...)
|
21
17
|
|
22
|
-
def center(...)
|
23
|
-
Center.new(...)
|
24
|
-
end
|
18
|
+
def center(...) = render Center.new(...)
|
25
19
|
|
26
|
-
def right(...)
|
27
|
-
Right.new(...)
|
28
|
-
end
|
20
|
+
def right(...) = render Right.new(...)
|
29
21
|
|
30
22
|
private
|
31
23
|
|
data/lib/protos/toast.rb
CHANGED
@@ -23,13 +23,11 @@ module Protos
|
|
23
23
|
default: -> { :bottom_end },
|
24
24
|
reader: false
|
25
25
|
|
26
|
-
def view_template(&
|
27
|
-
dialog(**attrs, &
|
26
|
+
def view_template(&)
|
27
|
+
dialog(**attrs, &)
|
28
28
|
end
|
29
29
|
|
30
|
-
def close_button(...)
|
31
|
-
CloseButton.new(...)
|
32
|
-
end
|
30
|
+
def close_button(...) = render CloseButton.new(...)
|
33
31
|
|
34
32
|
private
|
35
33
|
|
data/lib/protos/token_list.rb
CHANGED
@@ -3,19 +3,7 @@
|
|
3
3
|
module Protos
|
4
4
|
class TokenList
|
5
5
|
# DOCS: A list of utility tokens that can handle parsing and merging sets of
|
6
|
-
# tokens together safely.
|
7
|
-
# while accounting for their conflicts.
|
8
|
-
|
9
|
-
def self.parse(input)
|
10
|
-
case input
|
11
|
-
when String then new(input.split)
|
12
|
-
when Array then new(input)
|
13
|
-
when TokenList then input
|
14
|
-
when NilClass then new
|
15
|
-
else raise ArgumentError,
|
16
|
-
"Invalid input for #{self.class.name}: #{input.inspect}"
|
17
|
-
end
|
18
|
-
end
|
6
|
+
# tokens together safely.
|
19
7
|
|
20
8
|
attr_reader :tokens
|
21
9
|
|
@@ -23,34 +11,33 @@ module Protos
|
|
23
11
|
@tokens = Set.new(tokens)
|
24
12
|
end
|
25
13
|
|
14
|
+
def empty?
|
15
|
+
@tokens.empty?
|
16
|
+
end
|
17
|
+
|
26
18
|
def to_s
|
27
19
|
@tokens.join(" ")
|
28
20
|
end
|
29
21
|
|
30
|
-
def
|
31
|
-
|
32
|
-
self
|
22
|
+
def remove(tokens)
|
23
|
+
@tokens.subtract(parse(tokens))
|
24
|
+
self
|
33
25
|
end
|
34
26
|
|
35
|
-
def
|
36
|
-
|
37
|
-
self
|
27
|
+
def add(tokens)
|
28
|
+
@tokens.merge(parse(tokens))
|
29
|
+
self
|
38
30
|
end
|
39
31
|
|
40
|
-
def
|
41
|
-
|
42
|
-
|
43
|
-
@tokens.delete(token)
|
44
|
-
end
|
45
|
-
end
|
32
|
+
def clear
|
33
|
+
@tokens.clear
|
34
|
+
self
|
46
35
|
end
|
47
36
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
end
|
53
|
-
end
|
37
|
+
private
|
38
|
+
|
39
|
+
def parse(tokens)
|
40
|
+
tokens.split
|
54
41
|
end
|
55
42
|
end
|
56
43
|
end
|
@@ -12,8 +12,8 @@ module Protos
|
|
12
12
|
option :size, type: SizeTypes, default: -> { "md" }, reader: false
|
13
13
|
option :level, type: LevelTypes, default: -> { 1 }, reader: false
|
14
14
|
|
15
|
-
def view_template(&
|
16
|
-
send(element, **attrs, &
|
15
|
+
def view_template(&)
|
16
|
+
send(element, **attrs, &)
|
17
17
|
end
|
18
18
|
|
19
19
|
private
|
@@ -5,8 +5,8 @@ module Protos
|
|
5
5
|
class InlineLink < Component
|
6
6
|
# DOCS: A link that is styled to be inline with text
|
7
7
|
|
8
|
-
def view_template(&
|
9
|
-
a(**attrs, &
|
8
|
+
def view_template(&)
|
9
|
+
a(**attrs, &)
|
10
10
|
end
|
11
11
|
|
12
12
|
private
|
@@ -14,7 +14,7 @@ module Protos
|
|
14
14
|
def theme
|
15
15
|
{
|
16
16
|
container: tokens(
|
17
|
-
"font-
|
17
|
+
"font-semibold",
|
18
18
|
"hover:underline",
|
19
19
|
"underline-offset-4",
|
20
20
|
"cursor-pointer"
|
data/lib/protos/typography.rb
CHANGED
@@ -5,28 +5,28 @@ module Protos
|
|
5
5
|
# DOCS: The core typography module that can be mixedin to override the
|
6
6
|
# default elements with custom elements.
|
7
7
|
|
8
|
-
def h1(
|
9
|
-
render
|
8
|
+
def h1(**, &)
|
9
|
+
render Heading.new(level: 1, size: :xl, **, &)
|
10
10
|
end
|
11
11
|
|
12
|
-
def h2(
|
13
|
-
render
|
12
|
+
def h2(**, &)
|
13
|
+
render Heading.new(level: 2, size: :lg, **, &)
|
14
14
|
end
|
15
15
|
|
16
|
-
def h3(
|
17
|
-
render
|
16
|
+
def h3(**, &)
|
17
|
+
render Heading.new(level: 3, size: :md, **, &)
|
18
18
|
end
|
19
19
|
|
20
|
-
def h4(
|
21
|
-
render
|
20
|
+
def h4(**, &)
|
21
|
+
render Heading.new(level: 4, size: :sm, **, &)
|
22
22
|
end
|
23
23
|
|
24
|
-
def p(
|
25
|
-
render
|
24
|
+
def p(**, &)
|
25
|
+
render Paragraph.new(**, &)
|
26
26
|
end
|
27
27
|
|
28
|
-
def inline_a(
|
29
|
-
render
|
28
|
+
def inline_a(**, &)
|
29
|
+
render InlineLink.new(**, &)
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
data/lib/protos/version.rb
CHANGED
data/protos.gemspec
CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
|
|
12
12
|
spec.description = "A UI component library built with phlex and daisyui"
|
13
13
|
spec.homepage = "https://github.com/inhouse-work/protos"
|
14
14
|
spec.license = "MIT"
|
15
|
-
spec.required_ruby_version = ">= 3.
|
15
|
+
spec.required_ruby_version = ">= 3.2"
|
16
16
|
spec.requirements << "tailwindcss"
|
17
17
|
spec.requirements << "daisyui"
|
18
18
|
spec.requirements << "protos-stimulus"
|
@@ -26,7 +26,19 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.files = Dir.chdir(__dir__) do
|
27
27
|
`git ls-files -z`.split("\x0").reject do |f|
|
28
28
|
(File.expand_path(f) == __FILE__) ||
|
29
|
-
f.start_with?(
|
29
|
+
f.start_with?(
|
30
|
+
*%w[
|
31
|
+
bin/
|
32
|
+
test/
|
33
|
+
spec/
|
34
|
+
features/
|
35
|
+
rakelib/
|
36
|
+
benchmark/
|
37
|
+
.git
|
38
|
+
appveyor
|
39
|
+
Gemfile
|
40
|
+
]
|
41
|
+
)
|
30
42
|
end
|
31
43
|
end
|
32
44
|
spec.bindir = "exe"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: protos
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nolan J Tait
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-04-
|
11
|
+
date: 2024-04-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dry-core
|
@@ -93,6 +93,8 @@ files:
|
|
93
93
|
- LICENSE.txt
|
94
94
|
- README.md
|
95
95
|
- Rakefile
|
96
|
+
- benchmarks/.keep
|
97
|
+
- benchmarks/table.txt
|
96
98
|
- examples/list.rb
|
97
99
|
- examples/navbar.rb
|
98
100
|
- lib/protos.rb
|
@@ -205,7 +207,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
205
207
|
requirements:
|
206
208
|
- - ">="
|
207
209
|
- !ruby/object:Gem::Version
|
208
|
-
version: '3.
|
210
|
+
version: '3.2'
|
209
211
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
210
212
|
requirements:
|
211
213
|
- - ">="
|
@@ -215,7 +217,7 @@ requirements:
|
|
215
217
|
- tailwindcss
|
216
218
|
- daisyui
|
217
219
|
- protos-stimulus
|
218
|
-
rubygems_version: 3.5.
|
220
|
+
rubygems_version: 3.5.7
|
219
221
|
signing_key:
|
220
222
|
specification_version: 4
|
221
223
|
summary: A UI component library built with phlex and daisyui
|