protos 0.1.2 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d640442007a4c04a5706286fb3073495ba0bcea036f543c112865d4b8f96646f
4
- data.tar.gz: 03ee33c002aee6e033ecebda12bab9db1fe74ac2d989213da013a96e79598ceb
3
+ metadata.gz: c5001f5f332c249597cb0f0c40cb8ff83429d7843db7c2f3f6cfc3b3ad6e9b50
4
+ data.tar.gz: 4e0426a89a66cd600cafe5411b02f6b3c5088dcc12bf64148d238bc542878459
5
5
  SHA512:
6
- metadata.gz: 496fc272a6606ab50281cab0cc434bd8c8e8607b6efa976ce2a671b9fdc2ed818c19d41b97c0d9831a835473d37e1846d56ffa0d85791c35d698dedd2521400b
7
- data.tar.gz: 18a8d1f2f496c47a85a41b84a54c108a889d954c9bead99b1547819b813538d9c8d124ca3e4b4f94bb8ac05ca3121cd56adaf63e79e132c59656bea31473190d
6
+ metadata.gz: eab1e457a004e0501c698f22a3c1aefb389a28a7970f864762320d4a4628e3b502d4a70080f05cdafc112d4dedd3d8a79637428ecef2194ccdf98d93111f2312
7
+ data.tar.gz: 3b1325007d6ad4c99bc478213aebf31bc03463308f591de7051d5542a95f1d9fd76d176d8e2a6d1396887b7f997e8bb19f14bde22d8544036144d2633317b98b
data/CHANGELOG.md CHANGED
@@ -3,3 +3,9 @@
3
3
  ## [0.1.0] - 2024-03-01
4
4
 
5
5
  - Initial release
6
+
7
+ ## [0.2.0] - 2024-03-06
8
+
9
+ - Chose to move away from daisyUI dropdown defaults as they have problems
10
+ displaying properly in too many situations
11
+ - Opted for using a protos-stimulus controller that uses tippy.js
data/README.md CHANGED
@@ -4,6 +4,19 @@ A UI component library for [Phlex](https://www.phlex.fun/) using
4
4
  [tailwindcss](https://tailwindcss.com/) and
5
5
  [daisyUI](https://daisyui.com/).
6
6
 
7
+ You can see a full list of the components at
8
+ [https://protos.inhouse.work/](https://protos.inhouse.work/).
9
+
10
+ - Tailwindcss classes are merged using
11
+ [tailwind\_merge](https://github.com/gjtorikian/tailwind_merge).
12
+ - Uses [tippy.js](https://atomiks.github.io/tippyjs/v6/getting-started/) for
13
+ dropdowns, combobox, and popovers
14
+
15
+ Other Phlex based UI libraries worth checking out:
16
+
17
+ - [PhlexUI](https://phlexui.com/)
18
+ - [ZestUI](https://zestui.com/)
19
+
7
20
  This library avoids re-making Protos components for extremely simple daisyui
8
21
  components such as:
9
22
 
@@ -11,7 +11,7 @@ module Protos
11
11
 
12
12
  def theme
13
13
  {
14
- container: tokens("flex", "gap-xs")
14
+ container: tokens("flex", "gap-xs", "items-center")
15
15
  }
16
16
  end
17
17
  end
@@ -14,20 +14,20 @@ module Protos
14
14
  div(**attrs, &block)
15
15
  end
16
16
 
17
- def image(...)
18
- Image.new(...)
19
- end
20
-
21
- def header(...)
22
- Header.new(...)
17
+ def content(...)
18
+ Content.new(...)
23
19
  end
24
20
 
25
21
  def footer(...)
26
22
  Footer.new(...)
27
23
  end
28
24
 
29
- def content(...)
30
- Content.new(...)
25
+ def header(...)
26
+ Header.new(...)
27
+ end
28
+
29
+ def image(...)
30
+ Image.new(...)
31
31
  end
32
32
 
33
33
  private
@@ -1,14 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Protos
4
- class Combobox < Component
5
- def template
6
- div(**attrs) do
7
- render Popover.new do
8
- yield if block_given?
9
- end
10
- end
11
- end
4
+ class Combobox < Popover
5
+ option :trigger,
6
+ default: -> { :click },
7
+ reader: false,
8
+ type: TriggerTypes | Types::Array.of(TriggerTypes)
12
9
 
13
10
  def trigger(...)
14
11
  Popover::Trigger.new(...)
@@ -46,7 +43,10 @@ module Protos
46
43
 
47
44
  def default_attrs
48
45
  {
49
- data: { controller: "protos--command" }
46
+ data: {
47
+ controller: "protos--popover",
48
+ "protos--popover-options-value": JSON.generate(options)
49
+ }
50
50
  }
51
51
  end
52
52
  end
@@ -9,6 +9,12 @@ module Protos
9
9
 
10
10
  private
11
11
 
12
+ def default_attrs
13
+ {
14
+ data: { controller: "protos--command" }
15
+ }
16
+ end
17
+
12
18
  def theme
13
19
  {
14
20
  container: tokens("menu")
@@ -42,7 +42,7 @@ module Protos
42
42
 
43
43
  def default_attrs
44
44
  {
45
- data: { controller: "protos--command protos--modal" }
45
+ data: { controller: "protos--modal" }
46
46
  }
47
47
  end
48
48
  end
@@ -2,9 +2,11 @@
2
2
 
3
3
  module Protos
4
4
  class Dropdown
5
- class Menu < Component
5
+ class Menu < Popover::Content
6
6
  def template(&block)
7
- ul(**attrs, &block)
7
+ template_tag(**template_attrs) do
8
+ ul(**attrs, &block)
9
+ end
8
10
  end
9
11
 
10
12
  private
@@ -2,10 +2,7 @@
2
2
 
3
3
  module Protos
4
4
  class Dropdown
5
- class Trigger < Component
6
- def template(&block)
7
- summary(**attrs, &block)
8
- end
5
+ class Trigger < Popover::Trigger
9
6
  end
10
7
  end
11
8
  end
@@ -1,25 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Protos
4
- class Dropdown < Component
5
- PositionTypes = Types::Coercible::Symbol.enum(
6
- :top,
7
- :bottom,
8
- :left,
9
- :right,
10
- :start,
11
- :end
12
- )
13
-
4
+ class Dropdown < Popover
14
5
  option :position,
15
6
  type: PositionTypes,
16
7
  default: -> { :bottom },
17
8
  reader: false
18
- option :hover, type: Types::Bool, default: -> { false }
19
-
20
- def template(&block)
21
- details(**attrs, &block)
22
- end
9
+ option :trigger,
10
+ default: -> { :click },
11
+ reader: false,
12
+ type: TriggerTypes | Types::Array.of(TriggerTypes)
23
13
 
24
14
  def item(...)
25
15
  Item.new(...)
@@ -32,28 +22,5 @@ module Protos
32
22
  def trigger(...)
33
23
  Trigger.new(...)
34
24
  end
35
-
36
- private
37
-
38
- def position
39
- {
40
- bottom: "dropdown-bottom",
41
- top: "dropdown-top",
42
- left: "dropdown-left",
43
- right: "dropdown-right",
44
- end: "dropdown-end",
45
- start: "dropdown-start"
46
- }.fetch(@position)
47
- end
48
-
49
- def theme
50
- {
51
- container: tokens(
52
- "dropdown",
53
- position,
54
- hover: "dropdown-hover"
55
- )
56
- }
57
- end
58
25
  end
59
26
  end
@@ -4,14 +4,18 @@ module Protos
4
4
  class Popover
5
5
  class Content < Component
6
6
  def template(&block)
7
- div(**attrs, &block)
7
+ template_tag(**template_attrs) do
8
+ div(**attrs, &block)
9
+ end
8
10
  end
9
11
 
10
12
  private
11
13
 
12
- def theme
14
+ def template_attrs
13
15
  {
14
- container: tokens("dropdown-content", "z-10")
16
+ data: {
17
+ "protos--popover-target": "template"
18
+ }
15
19
  }
16
20
  end
17
21
  end
@@ -4,7 +4,16 @@ module Protos
4
4
  class Popover
5
5
  class Trigger < Component
6
6
  def template(&block)
7
- summary(**attrs, &block)
7
+ div(**attrs, &block)
8
+ end
9
+
10
+ private
11
+
12
+ def default_attrs
13
+ {
14
+ data: { "protos--popover-target": "trigger" },
15
+ tabindex: 0
16
+ }
8
17
  end
9
18
  end
10
19
  end
@@ -7,21 +7,74 @@ module Protos
7
7
 
8
8
  PositionTypes = Types::Coercible::Symbol.enum(
9
9
  :top,
10
+ :top_start,
11
+ :top_end,
12
+ :right,
13
+ :right_start,
14
+ :right_end,
10
15
  :bottom,
16
+ :bottom_start,
17
+ :bottom_end,
11
18
  :left,
12
- :right,
13
- :start,
14
- :end
19
+ :left_start,
20
+ :left_end
21
+ )
22
+
23
+ AnimationTypes = Types::Coercible::Symbol.enum(
24
+ :fade,
25
+ :shift_away,
26
+ :shift_away_subtle,
27
+ :shift_away_extreme,
28
+ :shift_towards,
29
+ :shift_towards_subtle,
30
+ :shift_towards_extreme,
31
+ :scale,
32
+ :scale_subtle,
33
+ :scale_extreme,
34
+ :perspective,
35
+ :perspective_subtle,
36
+ :perspective_extreme
37
+ )
38
+
39
+ TriggerTypes = Types::Coercible::Symbol.enum(
40
+ :focus,
41
+ :mouseenter,
42
+ :click,
43
+ :focusin,
44
+ :manual
15
45
  )
16
46
 
17
47
  option :position,
18
48
  type: PositionTypes,
19
- default: -> { :bottom },
49
+ default: -> { :top },
50
+ reader: false
51
+ option :animation,
52
+ type: AnimationTypes,
53
+ default: -> { :fade },
20
54
  reader: false
21
- option :hover, type: Types::Bool, default: -> { false }
55
+ option :duration,
56
+ type: Types::Integer | Types::Array.of(Types::Integer),
57
+ default: -> { [300, 250] },
58
+ reader: false
59
+ option :hide_on_click,
60
+ type: Types::Bool | Types.Value(:toggle),
61
+ default: -> { true },
62
+ reader: false
63
+ option :z_index,
64
+ type: Types::Integer,
65
+ default: -> { 9999 },
66
+ reader: false
67
+ option :options,
68
+ default: -> { {} },
69
+ reader: false,
70
+ type: Types::Hash
71
+ option :trigger,
72
+ default: -> { %i[mouseenter focus] },
73
+ reader: false,
74
+ type: TriggerTypes | Types::Array.of(TriggerTypes)
22
75
 
23
76
  def template(&block)
24
- details(**attrs, &block)
77
+ div(**attrs, &block)
25
78
  end
26
79
 
27
80
  def content(...)
@@ -34,20 +87,27 @@ module Protos
34
87
 
35
88
  private
36
89
 
37
- def position
38
- {
39
- bottom: "dropdown-bottom",
40
- top: "dropdown-top",
41
- left: "dropdown-left",
42
- right: "dropdown-right",
43
- end: "dropdown-end",
44
- start: "dropdown-start"
45
- }.fetch(@position)
90
+ def dasherize(string)
91
+ string.to_s.tr("_", "-")
92
+ end
93
+
94
+ def options
95
+ opts = {}
96
+ opts[:animation] = dasherize(@animation)
97
+ opts[:placement] = dasherize(@position)
98
+ opts[:duration] = @duration
99
+ opts[:hideOnClick] = @hide_on_click
100
+ opts[:zIndex] = @z_index
101
+ opts[:trigger] = Array(@trigger).flatten.map(&:to_s).join(" ")
102
+ opts.merge(@options)
46
103
  end
47
104
 
48
- def theme
105
+ def default_attrs
49
106
  {
50
- container: tokens("dropdown", position)
107
+ data: {
108
+ controller: "protos--popover",
109
+ "protos--popover-options-value": JSON.generate(options)
110
+ }
51
111
  }
52
112
  end
53
113
  end
data/lib/protos/stats.rb CHANGED
@@ -6,6 +6,30 @@ module Protos
6
6
  div(**attrs, &block)
7
7
  end
8
8
 
9
+ def actions(...)
10
+ Actions.new(...)
11
+ end
12
+
13
+ def description(...)
14
+ Description.new(...)
15
+ end
16
+
17
+ def figure(...)
18
+ Figure.new(...)
19
+ end
20
+
21
+ def stat(...)
22
+ Stat.new(...)
23
+ end
24
+
25
+ def title(...)
26
+ Title.new(...)
27
+ end
28
+
29
+ def value(...)
30
+ Value.new(...)
31
+ end
32
+
9
33
  private
10
34
 
11
35
  def theme
data/lib/protos/swap.rb CHANGED
@@ -4,7 +4,7 @@ module Protos
4
4
  class Swap < Component
5
5
  def template
6
6
  label(**attrs) do
7
- input(type: :checkbox)
7
+ input(type: :checkbox, class: css[:input])
8
8
  yield if block_given?
9
9
  end
10
10
  end
@@ -21,7 +21,8 @@ module Protos
21
21
 
22
22
  def theme
23
23
  {
24
- container: tokens("swap")
24
+ container: tokens("swap"),
25
+ input: tokens("hidden")
25
26
  }
26
27
  end
27
28
  end
data/lib/protos/table.rb CHANGED
@@ -2,6 +2,19 @@
2
2
 
3
3
  module Protos
4
4
  class Table < Component
5
+ option :pin_rows, default: -> { false }, type: Types::Bool
6
+ option :pin_columns, default: -> { false }, type: Types::Bool
7
+ option :striped, default: -> { false }, type: Types::Bool
8
+ option :size,
9
+ default: -> { :md },
10
+ reader: false,
11
+ type: Types::Coercible::Symbol.enum(
12
+ :xs,
13
+ :sm,
14
+ :md,
15
+ :lg
16
+ )
17
+
5
18
  def template(&block)
6
19
  div(**attrs) do
7
20
  table(class: css[:table], &block)
@@ -38,10 +51,25 @@ module Protos
38
51
 
39
52
  private
40
53
 
54
+ def size
55
+ {
56
+ xs: "table-xs",
57
+ sm: "table-sm",
58
+ md: "table-md",
59
+ lg: "table-lg"
60
+ }.fetch(@size)
61
+ end
62
+
41
63
  def theme
42
64
  {
43
65
  container: tokens("w-full", "overflow-x-auto"),
44
- table: tokens("table")
66
+ table: tokens(
67
+ "table",
68
+ size,
69
+ pin_rows: "table-pin-rows",
70
+ pin_columns: "table-pin-columns",
71
+ striped: "table-striped"
72
+ )
45
73
  }
46
74
  end
47
75
  end
@@ -5,8 +5,8 @@ module Protos
5
5
  class Tab < Component
6
6
  param :id
7
7
  option :label
8
- option :active, default: false
9
- option :disabled, default: false
8
+ option :active, default: -> { false }
9
+ option :disabled, default: -> { false }
10
10
 
11
11
  def template(&block)
12
12
  input(
data/lib/protos/tabs.rb CHANGED
@@ -3,23 +3,23 @@
3
3
  module Protos
4
4
  class Tabs < Component
5
5
  option :type,
6
+ default: -> { :default },
7
+ reader: false,
6
8
  type: Types::Coercible::Symbol.enum(
7
9
  :default,
8
10
  :boxed,
9
11
  :bordered,
10
12
  :lifted
11
- ),
12
- default: -> { :default },
13
- reader: false
13
+ )
14
14
  option :size,
15
+ default: -> { :md },
16
+ reader: false,
15
17
  type: Types::Coercible::Symbol.enum(
16
18
  :xs,
17
19
  :sm,
18
20
  :md,
19
21
  :lg
20
- ),
21
- default: -> { :md },
22
- reader: false
22
+ )
23
23
 
24
24
  def template(&block)
25
25
  div(**attrs, &block)
data/lib/protos/theme.rb CHANGED
@@ -15,27 +15,35 @@ module Protos
15
15
  end
16
16
 
17
17
  def add(key, value)
18
- current_tokens = parse(@theme.fetch(key, ""))
19
- new_tokens = parse(value)
20
- tokens = current_tokens + new_tokens
21
-
22
- @theme[key] = tokens.to_s
18
+ TokenList.new
19
+ .add(@theme.fetch(key, ""))
20
+ .add(value)
21
+ .to_s
22
+ .tap do |tokens|
23
+ @theme[key] = tokens
24
+ end
23
25
  end
24
26
 
25
27
  def remove(key, value)
26
- current_tokens = parse(@theme.fetch(key, ""))
27
- removable_tokens = parse(value)
28
- tokens = current_tokens - removable_tokens
29
-
30
- @theme[key] = tokens.to_s
28
+ TokenList.new
29
+ .add(@theme.fetch(key, ""))
30
+ .remove(value)
31
+ .to_s
32
+ .tap do |tokens|
33
+ @theme[key] = tokens
34
+ end
31
35
  end
32
36
 
33
37
  def set(key, value)
34
38
  if value.is_a?(Hash)
35
39
  @theme[key] = value
36
40
  else
37
- tokens = parse(value)
38
- @theme[key] = tokens.to_s
41
+ TokenList
42
+ .parse(value)
43
+ .to_s
44
+ .tap do |tokens|
45
+ @theme[key] = tokens
46
+ end
39
47
  end
40
48
  end
41
49
 
@@ -61,10 +69,6 @@ module Protos
61
69
 
62
70
  private
63
71
 
64
- def parse(value)
65
- TokenList.parse(value)
66
- end
67
-
68
72
  def negation?(key)
69
73
  key.to_s.start_with?("!")
70
74
  end
@@ -13,6 +13,16 @@ module Protos
13
13
  )
14
14
  end
15
15
  end
16
+
17
+ private
18
+
19
+ def theme
20
+ {
21
+ # NOTE: Added this because I'm noticing the form having a margin
22
+ # with a default setup. Not sure if this is really needed.
23
+ form: tokens("m-0")
24
+ }
25
+ end
16
26
  end
17
27
  end
18
28
  end
data/lib/protos/toast.rb CHANGED
@@ -3,15 +3,21 @@
3
3
  module Protos
4
4
  class Toast < Component
5
5
  Positions = Types::Symbol.enum(
6
- :start,
7
- :center,
8
- :end,
9
- :top,
10
- :middle,
11
- :bottom
6
+ :top_start,
7
+ :top_center,
8
+ :top_end,
9
+ :middle_start,
10
+ :middle_center,
11
+ :middle_end,
12
+ :bottom_start,
13
+ :bottom_center,
14
+ :bottom_end
12
15
  )
13
16
 
14
- option :position, type: Positions, default: -> { :end }
17
+ option :position,
18
+ type: Positions,
19
+ default: -> { :bottom_end },
20
+ reader: false
15
21
 
16
22
  def template(&block)
17
23
  dialog(**attrs, &block)
@@ -29,12 +35,27 @@ module Protos
29
35
  }
30
36
  end
31
37
 
38
+ def position
39
+ {
40
+ top_start: "toast-start toast-top",
41
+ top_center: "toast-center toast-top",
42
+ top_end: "toast-end toast-top",
43
+ middle_start: "toast-start toast-middle",
44
+ middle_center: "toast-center toast-middle",
45
+ middle_end: "toast-end toast-middle",
46
+ bottom_start: "toast-start toast-bottom",
47
+ bottom_center: "toast-center toast-bottom",
48
+ bottom_end: "toast-end toast-bottom"
49
+ }.fetch(@position)
50
+ end
51
+
32
52
  def theme
33
53
  {
34
54
  container: tokens(
35
55
  "toast",
36
- "toast-end",
37
- "[&:not([open])]:hidden"
56
+ position,
57
+ "[&:not([open])]:hidden",
58
+ "bg-transparent"
38
59
  )
39
60
  }
40
61
  end
@@ -6,36 +6,61 @@ module Protos
6
6
  case input
7
7
  when String then new(input.split)
8
8
  when Array then new(input)
9
+ when TokenList then input
9
10
  else raise ArgumentError, "Invalid input: #{input.inspect}"
10
11
  end
11
12
  end
12
13
 
13
14
  attr_reader :tokens
14
15
 
15
- def initialize(tokens)
16
+ def initialize(tokens = [])
16
17
  @tokens = Set.new(tokens)
17
18
  end
18
19
 
19
20
  def to_s
20
- @tokens.to_a.join(" ")
21
+ merge(@tokens.to_a.join(" "))
21
22
  end
22
23
 
23
24
  def -(other)
24
- other = TokenList.parse(other) unless other.is_a?(TokenList)
25
+ other = TokenList.parse(other)
25
26
  self.class.new(@tokens - other.tokens)
26
27
  end
27
28
 
28
29
  def +(other)
29
- other = TokenList.parse(other) unless other.is_a?(TokenList)
30
+ other = TokenList.parse(other)
30
31
  self.class.new(@tokens + other.tokens)
31
32
  end
32
33
 
33
34
  def remove(token)
34
- @tokens.delete(token)
35
+ tap do
36
+ self.class.parse(token).tokens.each do |token|
37
+ @tokens.delete(token)
38
+ end
39
+ end
35
40
  end
36
41
 
37
- def add(token)
38
- @tokens.add(token)
42
+ def add(input)
43
+ tap do
44
+ self.class.parse(input).tokens.each do |token|
45
+ @tokens.add(token)
46
+ end
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def merge(tokens)
53
+ TailwindMerge::Merger.new(
54
+ config: {
55
+ theme: {
56
+ # Not currently working in the gem.
57
+ # "spacing" => %w[xs sm md lg xl],
58
+ # "padding" => %w[xs sm md lg xl],
59
+ # "margin" => %w[xs sm md lg xl]
60
+ }
61
+ }
62
+ )
63
+ .merge(tokens)
39
64
  end
40
65
  end
41
66
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Protos
4
- VERSION = "0.1.2"
4
+ VERSION = "0.2.1"
5
5
  end
data/lib/protos.rb CHANGED
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "json"
3
4
  require "dry-types"
4
5
  require "dry-initializer"
5
6
  require "phlex"
7
+ require "tailwind_merge"
6
8
 
7
9
  module Protos
8
10
  class Error < StandardError; end
@@ -50,8 +52,6 @@ module Protos
50
52
  require_relative "protos/collapse/title"
51
53
  require_relative "protos/collapse/content"
52
54
 
53
- require_relative "protos/combobox"
54
-
55
55
  require_relative "protos/command"
56
56
  require_relative "protos/command/input"
57
57
  require_relative "protos/command/dialog"
@@ -67,11 +67,6 @@ module Protos
67
67
  require_relative "protos/drawer/trigger"
68
68
  require_relative "protos/drawer/content"
69
69
 
70
- require_relative "protos/dropdown"
71
- require_relative "protos/dropdown/item"
72
- require_relative "protos/dropdown/menu"
73
- require_relative "protos/dropdown/trigger"
74
-
75
70
  require_relative "protos/hero"
76
71
  require_relative "protos/hero/content"
77
72
  require_relative "protos/hero/overlay"
@@ -125,5 +120,13 @@ module Protos
125
120
  require_relative "protos/typography/heading"
126
121
  require_relative "protos/typography/paragraph"
127
122
  require_relative "protos/typography/inline_link"
123
+
124
+ # Dependent
125
+ require_relative "protos/dropdown"
126
+ require_relative "protos/dropdown/item"
127
+ require_relative "protos/dropdown/menu"
128
+ require_relative "protos/dropdown/trigger"
129
+
130
+ require_relative "protos/combobox"
128
131
  end
129
132
  end
data/protos.gemspec CHANGED
@@ -38,6 +38,7 @@ Gem::Specification.new do |spec|
38
38
  spec.add_dependency "dry-initializer", "~> 3.1"
39
39
  spec.add_dependency "dry-types", "~> 1.7"
40
40
  spec.add_dependency "phlex", "~> 1.9"
41
+ spec.add_dependency "tailwind_merge", "~> 0.10"
41
42
 
42
43
  # For more information and examples about making a new gem, check out our
43
44
  # guide at: https://bundler.io/guides/creating_gem.html
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.1.2
4
+ version: 0.2.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-03-05 00:00:00.000000000 Z
11
+ date: 2024-03-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-core
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.9'
69
+ - !ruby/object:Gem::Dependency
70
+ name: tailwind_merge
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.10'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.10'
69
83
  description: A UI component library built with phlex and daisyui
70
84
  email:
71
85
  - nolanjtait@gmail.com