protos 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -1
  3. data/README.md +34 -22
  4. data/examples/list.rb +2 -2
  5. data/examples/navbar.rb +3 -8
  6. data/lib/protos/accordion/item.rb +4 -2
  7. data/lib/protos/accordion.rb +10 -11
  8. data/lib/protos/alert.rb +3 -0
  9. data/lib/protos/avatar.rb +10 -10
  10. data/lib/protos/badge.rb +62 -0
  11. data/lib/protos/breadcrumbs.rb +2 -0
  12. data/lib/protos/card.rb +12 -7
  13. data/lib/protos/carousel.rb +13 -10
  14. data/lib/protos/chat_bubble/content.rb +12 -12
  15. data/lib/protos/chat_bubble.rb +11 -6
  16. data/lib/protos/collapse/title.rb +3 -3
  17. data/lib/protos/collapse.rb +10 -7
  18. data/lib/protos/combobox.rb +3 -3
  19. data/lib/protos/command/input.rb +4 -4
  20. data/lib/protos/command.rb +16 -2
  21. data/lib/protos/component.rb +1 -1
  22. data/lib/protos/drawer.rb +7 -3
  23. data/lib/protos/dropdown.rb +10 -6
  24. data/lib/protos/hero.rb +3 -0
  25. data/lib/protos/list.rb +2 -0
  26. data/lib/protos/modal/close_button.rb +8 -0
  27. data/lib/protos/modal/dialog.rb +4 -6
  28. data/lib/protos/modal.rb +6 -1
  29. data/lib/protos/popover.rb +24 -21
  30. data/lib/protos/stats.rb +7 -0
  31. data/lib/protos/steps.rb +5 -3
  32. data/lib/protos/swap.rb +3 -0
  33. data/lib/protos/table/caption.rb +3 -3
  34. data/lib/protos/table/cell.rb +3 -3
  35. data/lib/protos/table/head.rb +3 -3
  36. data/lib/protos/table.rb +21 -13
  37. data/lib/protos/tabs/tab.rb +4 -4
  38. data/lib/protos/tabs.rb +18 -16
  39. data/lib/protos/theme.rb +8 -7
  40. data/lib/protos/timeline.rb +8 -3
  41. data/lib/protos/toast.rb +5 -3
  42. data/lib/protos/typography/paragraph.rb +3 -3
  43. data/lib/protos/typography.rb +4 -0
  44. data/lib/protos/version.rb +1 -1
  45. data/lib/protos.rb +37 -121
  46. metadata +4 -7
  47. data/lib/protos/command/dialog.rb +0 -40
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '0796561a80e75fb39f8b35ec75257104adc90b21227ef1525876576d10415269'
4
- data.tar.gz: 394a8ee190d1d2647476db45d2d9b9edb156bc42a3935898d6f1deca35261326
3
+ metadata.gz: d7486060db2b247fab3e5d5caa33c6f8d35631772e267ae248d8929b71038fbb
4
+ data.tar.gz: ef414faf4cc381245bc9e7b609124858b4a1d1280dfcf5e21a139641d6877f0a
5
5
  SHA512:
6
- metadata.gz: 59e2288d2ae8adfc3b352838dda25c776edddf48d99b310181629e78f09831552be23e36adedaca7bf3601678cb08950500f4b72f2ed609324ccd72ddd32a92d
7
- data.tar.gz: e0e4beda7e4cbff4e3b669899b65df2ec7c37fe388e75b561418ce1cc65abd4cb1cfecabd743f964bf0dee98de1c4ccdbf9f7e76f77078f294a8bfb0a4272802
6
+ metadata.gz: 37c65c3a6be4bfc15fb70e31988a4624c56426e607796de03ae8be9b47be9f016ad27ee4fc508ec57442f6cb0ae8d5d2e27bad40b8b8178c61488935fcafbf9c
7
+ data.tar.gz: 56354393cb9425b3455bcf4baa568a7f23805a226a3b0de75264f505dc9c5f2deee503d77e4b3fd0d7e3ecdef6253daebc5262ba0cb5b7591b6582fec3f96adb
data/CHANGELOG.md CHANGED
@@ -1,12 +1,23 @@
1
1
  ## [Unreleased]
2
2
 
3
+ - Changes passing an `input_id` to accordions. Replaced with the more accurate
4
+ `input_name` (optional) parameter. There was no point in having different
5
+ name attributes for the different radio buttons
6
+ - Updates modal component to use newer modal controller from protos-stimulus
7
+ that uses `@stimulus-components/dialog`
8
+ - Adds the ability for `css` helper to take multiple values, including inline
9
+ values instead of theme keys.
10
+ - Adds new `Protos::Badge` component
11
+ - Removes deprecated tokens to prepare for phlex 2.0
12
+ - Removes `dry-initializer` undefined constant to improve performance
13
+ - Adds autoloading constants instead of hard requires
14
+
3
15
  ## [0.6.0] - 2024-09-04
4
16
 
5
17
  - Changes how merging attributes works to only mix on certain attributes,
6
18
  overriding on all others. This is opposite to how attributes used to be merged
7
19
  by default. This is a fix for attributes like `value` where you actually need
8
20
  to override them.
9
- - Adds tests for all Rails components
10
21
  - Adds a separate tested `Mix` class for handling attribute merging
11
22
 
12
23
  ## [0.5.0] - 2024-08-27
data/README.md CHANGED
@@ -88,9 +88,10 @@ class Navbar
88
88
  end
89
89
  ```
90
90
 
91
- Eventually everyone makes a kind of ad-hoc system for specifying styles. It gets
92
- more complicated when you have attributes like a data-controller. How do you
93
- give a good experience letting people using your components to add their own
91
+ Eventually everyone makes a kind of ad-hoc system for specifying styles.
92
+
93
+ It gets more complicated when you have attributes like a data-controller. How do
94
+ you give a good experience letting people using your components to add their own
94
95
  controllers while your component depends on one already?
95
96
 
96
97
  This library is an attempt to make this kind of developer experience while
@@ -136,7 +137,7 @@ class List < Protos::Component
136
137
 
137
138
  def theme
138
139
  {
139
- list: "space-y-4", # We can use `#tokens` from phlex (recommended)
140
+ list: ["space-y-4"], # We can use arrays
140
141
  item: "font-bold text-2xl" # Or just plain old strings
141
142
  }
142
143
  end
@@ -218,13 +219,25 @@ class List < Protos::Component
218
219
 
219
220
  def custom_theme
220
221
  {
221
- list: tokens("space-y-4"),
222
- item: tokens("font-bold", "text-2xl")
222
+ list: "space-y-4",
223
+ item: ["font-bold", "text-2xl"]
223
224
  }
224
225
  end
225
226
  end
226
227
  ```
227
228
 
229
+ Slots can also take multiple arguments, and even inline styles:
230
+
231
+ ```ruby
232
+ class ListItem < Protos::Component
233
+ def view_template
234
+ li(class: css[:item, :primary_item, "text-sm"])
235
+ end
236
+ end
237
+ ```
238
+
239
+ This combines the styles together, removing any duplicates.
240
+
228
241
  ### Attrs and default attrs
229
242
 
230
243
  By convention, all components spread in an `attrs` hash on their outermost
@@ -257,8 +270,8 @@ class List < Protos::Component
257
270
 
258
271
  def theme
259
272
  {
260
- container: tokens("space-y-4"),
261
- item: tokens("font-bold")
273
+ container: "space-y-4",
274
+ item: "font-bold"
262
275
  }
263
276
  end
264
277
  end
@@ -488,7 +501,7 @@ module Components
488
501
 
489
502
  def theme
490
503
  super.merge({
491
- input: tokens("block", "bg-red-500")
504
+ input: ["block", "bg-red-500"]
492
505
  })
493
506
  end
494
507
  end
@@ -561,11 +574,11 @@ module Ui
561
574
 
562
575
  def theme
563
576
  {
564
- container: tokens("space-y-xs"),
565
- header: tokens("flex", "justify-between", "items-end", "gap-sm"),
566
- list: tokens("divide-y", "border", "w-full"),
567
- actions: tokens("space-x-xs"),
568
- item: tokens("p-sm")
577
+ container: "space-y-xs",
578
+ header: "flex justify-between items-end gap-sm",
579
+ list: "divide-y border w-full",
580
+ actions: "space-x-xs",
581
+ item: "p-sm"
569
582
  }
570
583
  end
571
584
  end
@@ -676,10 +689,10 @@ module Ui
676
689
 
677
690
  def theme
678
691
  {
679
- container: tokens("space-y-sm"),
680
- header: tokens("flex", "justify-between", "items-end", "gap-sm"),
681
- table: tokens("border"),
682
- caption: tokens("text-muted")
692
+ container: "space-y-sm",
693
+ header: "flex justify-between items-end gap-sm",
694
+ table: "border",
695
+ caption: "text-muted"
683
696
  }
684
697
  end
685
698
  end
@@ -714,12 +727,11 @@ render Ui::Table.new(title: "A table", collection:) do |table|
714
727
  end
715
728
  ```
716
729
 
717
- ## No unnecessary components
730
+ ## Missing components
718
731
 
719
- This library avoids re-making Protos components for extremely simple daisyui
720
- components such as:
732
+ This library tries to avoid re-making Protos components for extremely simple
733
+ DaisyUI components. Here is a list that we don't yet have components for:
721
734
 
722
- - Badge
723
735
  - Buttons
724
736
  - Checkbox
725
737
  - File input
data/examples/list.rb CHANGED
@@ -20,8 +20,8 @@ class List < Protos::Component
20
20
 
21
21
  def theme
22
22
  {
23
- container: tokens("space-y-4"),
24
- item: tokens("font-bold")
23
+ container: "space-y-4",
24
+ item: "font-bold"
25
25
  }
26
26
  end
27
27
  end
data/examples/navbar.rb CHANGED
@@ -20,14 +20,9 @@ class Navbar < Protos::Component
20
20
 
21
21
  def theme
22
22
  {
23
- container: tokens(
24
- "flex",
25
- "justify-between",
26
- "items-center",
27
- "gap-sm"
28
- ),
29
- heading: tokens("text-2xl", "font-bold"),
30
- subtitle: tokens("text-base")
23
+ container: "flex justify-between items-center gap-sm",
24
+ heading: "text-2xl font-bold",
25
+ subtitle: "text-base"
31
26
  }
32
27
  end
33
28
  end
@@ -5,13 +5,15 @@ module Protos
5
5
  class Item < Component
6
6
  # DOCS: An accorion is just a collapse with radio buttons.
7
7
 
8
- option :input_id, type: Types::String | Types::Integer
8
+ option :input_name,
9
+ type: Types::String | Types::Integer | Types::Nil,
10
+ reader: false
9
11
 
10
12
  def view_template(&block)
11
13
  li(**attrs) do
12
14
  render Collapse.new(
13
15
  theme: collapse_theme,
14
- input_id: @input_id.to_s,
16
+ input_name: @input_name,
15
17
  input_type: :radio,
16
18
  &block
17
19
  )
@@ -7,30 +7,29 @@ module Protos
7
7
  # to be open at the same time, use the collapse component.
8
8
  # https://daisyui.com/components/accordion/
9
9
 
10
+ autoload :Item, "protos/accordion/item"
11
+
12
+ option :input_name,
13
+ default: -> { "accordion-#{SecureRandom.hex(4)}" },
14
+ reader: false,
15
+ type: Types::String
16
+
10
17
  def view_template(&)
11
18
  ul(**attrs, &)
12
19
  end
13
20
 
14
- def item(*, input_id: nil, **, &)
15
- self.current_input_id = input_id
16
-
17
- render Item.new(*, input_id: current_input_id, **, &)
21
+ def item(*, **, &)
22
+ render Item.new(*, input_name: @input_name, **, &)
18
23
  end
19
24
 
20
25
  def content(...) = render Collapse::Content.new(...)
21
26
 
22
27
  def title(*, **, &)
23
- render Collapse::Title.new(*, input_id: current_input_id, **, &)
28
+ render Collapse::Title.new(*, input_id: @input_name, **, &)
24
29
  end
25
30
 
26
31
  private
27
32
 
28
- attr_reader :current_input_id
29
-
30
- def current_input_id=(value)
31
- @current_input_id = value || "collapse-#{SecureRandom.hex(4)}"
32
- end
33
-
34
33
  def theme
35
34
  {
36
35
  container: "join join-vertical"
data/lib/protos/alert.rb CHANGED
@@ -6,6 +6,9 @@ module Protos
6
6
  # be used in combination with Protos::Toast to have popup notifications.
7
7
  # https://daisyui.com/components/alert/
8
8
 
9
+ autoload :Actions, "protos/alert/actions"
10
+ autoload :Icon, "protos/alert/icon"
11
+
9
12
  Styles = Types::Coercible::Symbol.enum(
10
13
  :info,
11
14
  :success,
data/lib/protos/avatar.rb CHANGED
@@ -64,13 +64,13 @@ module Protos
64
64
 
65
65
  option :placeholder, type: Types::Bool, default: -> { false }
66
66
  option :indicator,
67
- type: Indicators,
68
- default: -> { :none },
69
- reader: false
67
+ type: Indicators,
68
+ default: -> { :none },
69
+ reader: false
70
70
  option :shape,
71
- type: MaskShapes,
72
- default: -> { :none },
73
- reader: false
71
+ type: MaskShapes,
72
+ default: -> { :none },
73
+ reader: false
74
74
 
75
75
  def view_template(&block)
76
76
  div(**attrs) do
@@ -90,12 +90,12 @@ module Protos
90
90
 
91
91
  def theme
92
92
  {
93
- container: tokens(
93
+ container: [
94
94
  "avatar",
95
95
  indicator,
96
- placeholder: "placeholder"
97
- ),
98
- figure: tokens(shape)
96
+ ("placeholder" if placeholder)
97
+ ],
98
+ figure: shape
99
99
  }
100
100
  end
101
101
  end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Protos
4
+ class Badge < Component
5
+ Badges = Types::Coercible::Symbol.enum(
6
+ :default,
7
+ :neutral,
8
+ :success,
9
+ :primary,
10
+ :secondary,
11
+ :info,
12
+ :error,
13
+ :warning,
14
+ :ghost
15
+ )
16
+
17
+ Sizes = Types::Coercible::Symbol.enum(:default, :xs, :sm, :md, :lg)
18
+
19
+ option :type, type: Badges, default: -> { :default }
20
+ option :outline, default: -> { false }
21
+ option :size, type: Sizes, default: -> { :default }
22
+
23
+ def view_template(&)
24
+ span(**attrs, &)
25
+ end
26
+
27
+ private
28
+
29
+ def badge_style
30
+ {
31
+ neutral: "badge-neutral",
32
+ success: "badge-success",
33
+ primary: "badge-primary",
34
+ secondary: "badge-secondary",
35
+ info: "badge-info",
36
+ error: "badge-error",
37
+ warning: "badge-warning",
38
+ ghost: "badge-ghost"
39
+ }
40
+ end
41
+
42
+ def badge_size
43
+ {
44
+ xs: "badge-xs",
45
+ sm: "badge-sm",
46
+ md: "badge-md",
47
+ lg: "badge-lg"
48
+ }
49
+ end
50
+
51
+ def theme
52
+ {
53
+ container: [
54
+ "badge",
55
+ badge_style[type],
56
+ badge_size[size],
57
+ ("badge-outline" if outline)
58
+ ].compact
59
+ }
60
+ end
61
+ end
62
+ end
@@ -5,6 +5,8 @@ module Protos
5
5
  # DOCS: A list of breadcrumbs (e.g links) for navigation
6
6
  # https://daisyui.com/components/breadcrumbs/
7
7
 
8
+ autoload :Crumb, "protos/breadcrumbs/crumb"
9
+
8
10
  def view_template(&block)
9
11
  nav(**attrs) do
10
12
  ul(class: css[:list], &block)
data/lib/protos/card.rb CHANGED
@@ -5,6 +5,11 @@ module Protos
5
5
  # DOCS: A card component
6
6
  # https://daisyui.com/components/card/
7
7
 
8
+ autoload :Body, "protos/card/body"
9
+ autoload :Title, "protos/card/title"
10
+ autoload :Actions, "protos/card/actions"
11
+ autoload :Image, "protos/card/image"
12
+
8
13
  ImageDisplays = Types::Coercible::Symbol.enum(:default, :overlay, :side)
9
14
 
10
15
  IMAGE_DISPLAYS = {
@@ -16,9 +21,9 @@ module Protos
16
21
  option :border, type: Types::Bool, default: -> { true }, reader: :private
17
22
  option :compact, type: Types::Bool, default: -> { false }, reader: :private
18
23
  option :image_display,
19
- ImageDisplays,
20
- default: -> { :default },
21
- reader: false
24
+ ImageDisplays,
25
+ default: -> { :default },
26
+ reader: false
22
27
 
23
28
  def view_template(&)
24
29
  article(**attrs, &)
@@ -40,12 +45,12 @@ module Protos
40
45
 
41
46
  def theme
42
47
  {
43
- container: tokens(
48
+ container: [
44
49
  "card",
45
50
  image_display,
46
- border: "card-bordered",
47
- compact: "card-compact"
48
- )
51
+ ("card-bordered" if border),
52
+ ("card-compact" if compact)
53
+ ]
49
54
  }
50
55
  end
51
56
  end
@@ -6,6 +6,9 @@ module Protos
6
6
  # through in a mobile friendly manner.
7
7
  # https://daisyui.com/components/carousel/
8
8
 
9
+ autoload :Item, "protos/carousel/item"
10
+ autoload :Actions, "protos/carousel/actions"
11
+
9
12
  SNAP_POINTS = {
10
13
  none: "",
11
14
  center: "carousel-center",
@@ -14,13 +17,13 @@ module Protos
14
17
 
15
18
  option :vertical, type: Types::Bool, default: -> { false }
16
19
  option :snap_to,
17
- default: -> { :none },
18
- reader: false,
19
- type: Types::Coercible::Symbol.enum(
20
- :none,
21
- :center,
22
- :end
23
- )
20
+ default: -> { :none },
21
+ reader: false,
22
+ type: Types::Coercible::Symbol.enum(
23
+ :none,
24
+ :center,
25
+ :end
26
+ )
24
27
 
25
28
  def view_template(&)
26
29
  div(**attrs, &)
@@ -38,11 +41,11 @@ module Protos
38
41
 
39
42
  def theme
40
43
  {
41
- container: tokens(
44
+ container: [
42
45
  "carousel",
43
46
  snap_to,
44
- vertical: "carousel-vertical"
45
- )
47
+ ("carousel-vertical" if vertical)
48
+ ]
46
49
  }
47
50
  end
48
51
  end
@@ -18,18 +18,18 @@ module Protos
18
18
  }.freeze
19
19
 
20
20
  option :type,
21
- default: -> { :none },
22
- reader: false,
23
- type: Types::Coercible::Symbol.enum(
24
- :none,
25
- :primary,
26
- :secondary,
27
- :accent,
28
- :info,
29
- :success,
30
- :warning,
31
- :error
32
- )
21
+ default: -> { :none },
22
+ reader: false,
23
+ type: Types::Coercible::Symbol.enum(
24
+ :none,
25
+ :primary,
26
+ :secondary,
27
+ :accent,
28
+ :info,
29
+ :success,
30
+ :warning,
31
+ :error
32
+ )
33
33
 
34
34
  def view_template(&)
35
35
  div(**attrs, &)
@@ -7,18 +7,23 @@ module Protos
7
7
  # in a larger chat history.
8
8
  # https://daisyui.com/components/chat/
9
9
 
10
+ autoload :Content, "protos/chat_bubble/content"
11
+ autoload :Image, "protos/chat_bubble/image"
12
+ autoload :Header, "protos/chat_bubble/header"
13
+ autoload :Footer, "protos/chat_bubble/footer"
14
+
10
15
  ALIGNMENTS = {
11
16
  start: "chat-start",
12
17
  end: "chat-end"
13
18
  }.freeze
14
19
 
15
20
  option :align,
16
- default: -> { :start },
17
- reader: false,
18
- type: Types::Coercible::Symbol.enum(
19
- :start,
20
- :end
21
- )
21
+ default: -> { :start },
22
+ reader: false,
23
+ type: Types::Coercible::Symbol.enum(
24
+ :start,
25
+ :end
26
+ )
22
27
 
23
28
  def view_template(&)
24
29
  div(**attrs, &)
@@ -7,9 +7,9 @@ module Protos
7
7
  # visible and is used to toggle the collapse.
8
8
 
9
9
  option :input_id,
10
- type: Types::String | Types::Integer | Types::Nil,
11
- reader: false,
12
- default: -> { }
10
+ type: Types::String | Types::Integer | Types::Nil,
11
+ reader: false,
12
+ default: -> { }
13
13
 
14
14
  def view_template(&)
15
15
  if @input_id
@@ -6,19 +6,22 @@ module Protos
6
6
  # is visible at all times, and the content is only visible when expanded.
7
7
  # https://daisyui.com/components/collapse/
8
8
 
9
+ autoload :Title, "protos/collapse/title"
10
+ autoload :Content, "protos/collapse/content"
11
+
9
12
  option :input_type, default: -> { :checkbox }, reader: false
10
- option :input_id,
11
- reader: false,
12
- default: -> { "collapse-#{SecureRandom.hex(4)}" },
13
- type: Types::String
13
+ option :input_name,
14
+ reader: false,
15
+ default: -> { "collapse-#{SecureRandom.hex(4)}" },
16
+ type: Types::String | Types::Integer
14
17
 
15
18
  def view_template
16
19
  div(**attrs) do
17
20
  if @input_type
18
21
  input(
19
22
  type: @input_type,
20
- id: @input_id,
21
- name: @input_id,
23
+ id: @input_name,
24
+ name: @input_name,
22
25
  autocomplete: :off,
23
26
  # form: "" prevents the radio button from being submitted if its
24
27
  # within a form
@@ -29,7 +32,7 @@ module Protos
29
32
  end
30
33
  end
31
34
 
32
- def title(*, **, &) = render Title.new(*, input_id: @input_id, **, &)
35
+ def title(*, **, &) = render Title.new(*, input_id: @input_name, **, &)
33
36
 
34
37
  def content(...) = render Content.new(...)
35
38
 
@@ -7,9 +7,9 @@ module Protos
7
7
  # Comboboxes use popovers and command to create the list of options.
8
8
 
9
9
  option :trigger,
10
- default: -> { :click },
11
- reader: false,
12
- type: Popover::Triggers | Types::Array.of(Popover::Triggers)
10
+ default: -> { :click },
11
+ reader: false,
12
+ type: Popover::Triggers | Types::Array.of(Popover::Triggers)
13
13
 
14
14
  def trigger(...) = render Popover::Trigger.new(...)
15
15
 
@@ -6,10 +6,10 @@ module Protos
6
6
  # DOCS: The search input for the command palette
7
7
 
8
8
  option :placeholder,
9
- reader: :private,
10
- default: -> {
11
- "Type a command or search..."
12
- }
9
+ reader: :private,
10
+ default: -> {
11
+ "Type a command or search..."
12
+ }
13
13
 
14
14
  def view_template(&block)
15
15
  li(**attrs) do
@@ -6,6 +6,15 @@ module Protos
6
6
  # filterable list of commands. Command modals are by default closable by
7
7
  # clicking the overlay rather than a specific close button.
8
8
 
9
+ autoload :Input, "protos/command/input"
10
+ autoload :Dialog, "protos/command/dialog"
11
+ autoload :Group, "protos/command/group"
12
+ autoload :List, "protos/command/list"
13
+ autoload :Trigger, "protos/command/trigger"
14
+ autoload :Title, "protos/command/title"
15
+ autoload :Item, "protos/command/item"
16
+ autoload :Empty, "protos/command/empty"
17
+
9
18
  def view_template(&)
10
19
  div(**attrs, &)
11
20
  end
@@ -16,7 +25,9 @@ module Protos
16
25
 
17
26
  def trigger(...) = render Command::Trigger.new(...)
18
27
 
19
- def dialog(...) = render Command::Dialog.new(...)
28
+ def dialog(...) = render Modal::Dialog.new(...)
29
+
30
+ def close_button(...) = render Modal::CloseButton.new(...)
20
31
 
21
32
  def title(...) = render Command::Title.new(...)
22
33
 
@@ -30,7 +41,10 @@ module Protos
30
41
 
31
42
  def default_attrs
32
43
  {
33
- data: { controller: "protos--modal" }
44
+ data: {
45
+ controller: "protos--modal",
46
+ action: "click->protos--modal#backdropClose"
47
+ }
34
48
  }
35
49
  end
36
50
  end
@@ -10,7 +10,7 @@ module Protos
10
10
  # make configuring each class much easier. It also enables gathering up all
11
11
  # undefined options and adding them to the html_options hash.
12
12
 
13
- extend Dry::Initializer
13
+ extend Dry::Initializer[undefined: false]
14
14
  extend Dry::Core::ClassAttributes
15
15
 
16
16
  # Define methods for css and attrs. Each is expected to return a hash
data/lib/protos/drawer.rb CHANGED
@@ -7,10 +7,14 @@ module Protos
7
7
  # trigger is clicked.
8
8
  # https://daisyui.com/components/drawer/
9
9
 
10
+ autoload :Side, "protos/drawer/side"
11
+ autoload :Trigger, "protos/drawer/trigger"
12
+ autoload :Content, "protos/drawer/content"
13
+
10
14
  option :id,
11
- reader: false,
12
- type: Types::Coercible::String,
13
- default: -> { "drawer-#{SecureRandom.hex(4)}" }
15
+ reader: false,
16
+ type: Types::Coercible::String,
17
+ default: -> { "drawer-#{SecureRandom.hex(4)}" }
14
18
 
15
19
  def view_template
16
20
  div(**attrs) do