shadcn_phlexcomponents 0.1.17 → 0.1.19

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.
Files changed (130) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +321 -23
  3. data/app/javascript/controllers/accordion_controller.js +1 -0
  4. data/app/javascript/controllers/alert_dialog_controller.js +1 -0
  5. data/app/javascript/controllers/avatar_controller.js +1 -0
  6. data/app/javascript/controllers/checkbox_controller.js +1 -0
  7. data/app/javascript/controllers/collapsible_controller.js +1 -0
  8. data/app/javascript/controllers/combobox_controller.js +1 -1
  9. data/app/javascript/controllers/command_controller.js +1 -0
  10. data/app/javascript/controllers/date_picker_controller.js +21 -5
  11. data/app/javascript/controllers/date_range_picker_controller.js +1 -0
  12. data/app/javascript/controllers/dialog_controller.js +1 -0
  13. data/app/javascript/controllers/dropdown_menu_controller.js +1 -0
  14. data/app/javascript/controllers/dropdown_menu_sub_controller.js +1 -0
  15. data/app/javascript/controllers/form_field_controller.js +1 -0
  16. data/app/javascript/controllers/hover_card_controller.js +1 -0
  17. data/app/javascript/controllers/loading_button_controller.js +1 -0
  18. data/app/javascript/controllers/popover_controller.js +1 -0
  19. data/app/javascript/controllers/progress_controller.js +1 -0
  20. data/app/javascript/controllers/radio_group_controller.js +1 -0
  21. data/app/javascript/controllers/select_controller.js +1 -0
  22. data/app/javascript/controllers/slider_controller.js +1 -0
  23. data/app/javascript/controllers/switch_controller.js +1 -0
  24. data/app/javascript/controllers/tabs_controller.js +1 -0
  25. data/app/javascript/controllers/theme_switcher_controller.js +1 -0
  26. data/app/javascript/controllers/toast_container_controller.js +1 -0
  27. data/app/javascript/controllers/toast_controller.js +1 -0
  28. data/app/javascript/controllers/toggle_controller.js +1 -0
  29. data/app/javascript/controllers/toggle_group_controller.js +1 -0
  30. data/app/javascript/controllers/tooltip_controller.js +2 -1
  31. data/app/javascript/shadcn_phlexcomponents.js +27 -60
  32. data/app/javascript/utils/command.js +0 -2
  33. data/app/javascript/utils/floating_ui.js +10 -17
  34. data/app/stylesheets/date_picker.css +1 -1
  35. data/app/stylesheets/shadcn_phlexcomponents.css +173 -0
  36. data/app/typescript/controllers/accordion_controller.ts +2 -0
  37. data/app/typescript/controllers/alert_dialog_controller.ts +2 -0
  38. data/app/typescript/controllers/avatar_controller.ts +2 -0
  39. data/app/typescript/controllers/checkbox_controller.ts +2 -0
  40. data/app/typescript/controllers/collapsible_controller.ts +2 -0
  41. data/app/typescript/controllers/combobox_controller.ts +2 -1
  42. data/app/typescript/controllers/command_controller.ts +2 -0
  43. data/app/typescript/controllers/date_picker_controller.ts +27 -7
  44. data/app/typescript/controllers/date_range_picker_controller.ts +2 -0
  45. data/app/typescript/controllers/dialog_controller.ts +2 -0
  46. data/app/typescript/controllers/dropdown_menu_controller.ts +2 -0
  47. data/app/typescript/controllers/dropdown_menu_sub_controller.ts +2 -0
  48. data/app/typescript/controllers/form_field_controller.ts +2 -0
  49. data/app/typescript/controllers/hover_card_controller.ts +2 -0
  50. data/app/typescript/controllers/loading_button_controller.ts +2 -0
  51. data/app/typescript/controllers/popover_controller.ts +2 -0
  52. data/app/typescript/controllers/progress_controller.ts +2 -0
  53. data/app/typescript/controllers/radio_group_controller.ts +2 -0
  54. data/app/typescript/controllers/select_controller.ts +2 -0
  55. data/app/typescript/controllers/slider_controller.ts +2 -0
  56. data/app/typescript/controllers/switch_controller.ts +2 -0
  57. data/app/typescript/controllers/tabs_controller.ts +2 -0
  58. data/app/typescript/controllers/theme_switcher_controller.ts +2 -0
  59. data/app/typescript/controllers/toast_container_controller.ts +2 -0
  60. data/app/typescript/controllers/toast_controller.ts +2 -0
  61. data/app/typescript/controllers/toggle_controller.ts +2 -0
  62. data/app/typescript/controllers/toggle_group_controller.ts +2 -0
  63. data/app/typescript/controllers/tooltip_controller.ts +3 -1
  64. data/app/typescript/shadcn_phlexcomponents.ts +27 -61
  65. data/app/typescript/utils/command.ts +0 -2
  66. data/app/typescript/utils/floating_ui.ts +11 -20
  67. data/app/typescript/utils/index.ts +1 -1
  68. data/lib/install/upgrade_shadcn_phlexcomponents.rb +28 -0
  69. data/lib/shadcn_phlexcomponents/components/accordion.rb +56 -13
  70. data/lib/shadcn_phlexcomponents/components/alert.rb +35 -16
  71. data/lib/shadcn_phlexcomponents/components/alert_dialog.rb +58 -18
  72. data/lib/shadcn_phlexcomponents/components/aspect_ratio.rb +33 -2
  73. data/lib/shadcn_phlexcomponents/components/avatar.rb +24 -7
  74. data/lib/shadcn_phlexcomponents/components/badge.rb +23 -18
  75. data/lib/shadcn_phlexcomponents/components/base.rb +2 -2
  76. data/lib/shadcn_phlexcomponents/components/breadcrumb.rb +46 -6
  77. data/lib/shadcn_phlexcomponents/components/button.rb +32 -27
  78. data/lib/shadcn_phlexcomponents/components/card.rb +59 -10
  79. data/lib/shadcn_phlexcomponents/components/checkbox.rb +51 -30
  80. data/lib/shadcn_phlexcomponents/components/checkbox_group.rb +24 -4
  81. data/lib/shadcn_phlexcomponents/components/combobox.rb +224 -81
  82. data/lib/shadcn_phlexcomponents/components/command.rb +167 -63
  83. data/lib/shadcn_phlexcomponents/components/date_picker.rb +140 -48
  84. data/lib/shadcn_phlexcomponents/components/date_range_picker.rb +26 -44
  85. data/lib/shadcn_phlexcomponents/components/dialog.rb +86 -32
  86. data/lib/shadcn_phlexcomponents/components/dropdown_menu.rb +74 -25
  87. data/lib/shadcn_phlexcomponents/components/dropdown_menu_sub.rb +52 -24
  88. data/lib/shadcn_phlexcomponents/components/form/form_checkbox.rb +1 -1
  89. data/lib/shadcn_phlexcomponents/components/form/form_checkbox_group.rb +1 -1
  90. data/lib/shadcn_phlexcomponents/components/form/form_combobox.rb +1 -1
  91. data/lib/shadcn_phlexcomponents/components/form/form_date_picker.rb +1 -1
  92. data/lib/shadcn_phlexcomponents/components/form/form_date_range_picker.rb +1 -1
  93. data/lib/shadcn_phlexcomponents/components/form/form_error.rb +8 -1
  94. data/lib/shadcn_phlexcomponents/components/form/form_helpers.rb +3 -2
  95. data/lib/shadcn_phlexcomponents/components/form/form_hint.rb +8 -1
  96. data/lib/shadcn_phlexcomponents/components/form/form_input.rb +1 -1
  97. data/lib/shadcn_phlexcomponents/components/form/form_radio_group.rb +1 -1
  98. data/lib/shadcn_phlexcomponents/components/form/form_select.rb +1 -1
  99. data/lib/shadcn_phlexcomponents/components/form/form_slider.rb +1 -1
  100. data/lib/shadcn_phlexcomponents/components/form/form_switch.rb +1 -1
  101. data/lib/shadcn_phlexcomponents/components/form/form_textarea.rb +1 -1
  102. data/lib/shadcn_phlexcomponents/components/form.rb +22 -6
  103. data/lib/shadcn_phlexcomponents/components/hover_card.rb +48 -18
  104. data/lib/shadcn_phlexcomponents/components/input.rb +13 -8
  105. data/lib/shadcn_phlexcomponents/components/label.rb +9 -4
  106. data/lib/shadcn_phlexcomponents/components/link.rb +8 -1
  107. data/lib/shadcn_phlexcomponents/components/pagination.rb +34 -6
  108. data/lib/shadcn_phlexcomponents/components/popover.rb +43 -13
  109. data/lib/shadcn_phlexcomponents/components/progress.rb +37 -6
  110. data/lib/shadcn_phlexcomponents/components/radio_group.rb +41 -15
  111. data/lib/shadcn_phlexcomponents/components/select.rb +99 -42
  112. data/lib/shadcn_phlexcomponents/components/separator.rb +9 -4
  113. data/lib/shadcn_phlexcomponents/components/sheet.rb +94 -28
  114. data/lib/shadcn_phlexcomponents/components/skeleton.rb +8 -1
  115. data/lib/shadcn_phlexcomponents/components/switch.rb +45 -17
  116. data/lib/shadcn_phlexcomponents/components/table.rb +84 -17
  117. data/lib/shadcn_phlexcomponents/components/tabs.rb +36 -12
  118. data/lib/shadcn_phlexcomponents/components/textarea.rb +12 -7
  119. data/lib/shadcn_phlexcomponents/components/toast.rb +46 -20
  120. data/lib/shadcn_phlexcomponents/components/toast_container.rb +19 -14
  121. data/lib/shadcn_phlexcomponents/components/toggle.rb +29 -24
  122. data/lib/shadcn_phlexcomponents/components/tooltip.rb +49 -14
  123. data/lib/shadcn_phlexcomponents/configuration.rb +46 -0
  124. data/lib/shadcn_phlexcomponents/initializers/shadcn_phlexcomponents.rb +28 -0
  125. data/lib/shadcn_phlexcomponents/version.rb +1 -1
  126. data/lib/shadcn_phlexcomponents.rb +12 -1
  127. data/lib/tasks/upgrade.rake +10 -0
  128. metadata +16 -14
  129. data/app/typescript/controllers/sidebar_controller.ts +0 -39
  130. data/app/typescript/controllers/sidebar_trigger_controller.ts +0 -21
@@ -2,11 +2,14 @@
2
2
 
3
3
  module ShadcnPhlexcomponents
4
4
  class Avatar < Base
5
- class_variants(base: "relative flex size-8 shrink-0 overflow-hidden rounded-full")
6
-
7
- def initialize(**attributes)
8
- super(**attributes)
9
- end
5
+ class_variants(
6
+ **(
7
+ ShadcnPhlexcomponents.configuration.avatar&.dig(:root) ||
8
+ {
9
+ base: "relative flex size-8 shrink-0 overflow-hidden rounded-full",
10
+ }
11
+ ),
12
+ )
10
13
 
11
14
  def image(**attributes, &)
12
15
  AvatarImage(**attributes, &)
@@ -30,7 +33,14 @@ module ShadcnPhlexcomponents
30
33
  end
31
34
 
32
35
  class AvatarImage < Base
33
- class_variants(base: "aspect-square size-full")
36
+ class_variants(
37
+ **(
38
+ ShadcnPhlexcomponents.configuration.avatar&.dig(:image) ||
39
+ {
40
+ base: "aspect-square size-full",
41
+ }
42
+ ),
43
+ )
34
44
 
35
45
  def default_attributes
36
46
  {
@@ -46,7 +56,14 @@ module ShadcnPhlexcomponents
46
56
  end
47
57
 
48
58
  class AvatarFallback < Base
49
- class_variants(base: "bg-muted flex size-full items-center justify-center rounded-full")
59
+ class_variants(
60
+ **(
61
+ ShadcnPhlexcomponents.configuration.avatar&.dig(:fallback) ||
62
+ {
63
+ base: "bg-muted flex size-full items-center justify-center rounded-full",
64
+ }
65
+ ),
66
+ )
50
67
 
51
68
  def default_attributes
52
69
  {
@@ -3,24 +3,29 @@
3
3
  module ShadcnPhlexcomponents
4
4
  class Badge < Base
5
5
  class_variants(
6
- base: <<~HEREDOC,
7
- inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium
8
- w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none
9
- focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]
10
- aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive
11
- transition-[color,box-shadow] overflow-hidden
12
- HEREDOC
13
- variants: {
14
- variant: {
15
- default: "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
16
- secondary: "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
17
- destructive: "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
18
- outline: "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
19
- },
20
- },
21
- defaults: {
22
- variant: :default,
23
- },
6
+ **(
7
+ ShadcnPhlexcomponents.configuration.badge ||
8
+ {
9
+ base: <<~HEREDOC,
10
+ inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium
11
+ w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none
12
+ focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]
13
+ aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive
14
+ transition-[color,box-shadow] overflow-hidden
15
+ HEREDOC
16
+ variants: {
17
+ variant: {
18
+ default: "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
19
+ secondary: "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
20
+ destructive: "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
21
+ outline: "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
22
+ },
23
+ },
24
+ defaults: {
25
+ variant: :default,
26
+ },
27
+ }
28
+ ),
24
29
  )
25
30
 
26
31
  def initialize(variant: :default, **attributes)
@@ -151,8 +151,8 @@ module ShadcnPhlexcomponents
151
151
  },
152
152
  data: {
153
153
  state: "closed",
154
- "#{component}-target" => "overlay"
155
- }
154
+ "#{component}-target" => "overlay",
155
+ },
156
156
  )
157
157
  end
158
158
  end
@@ -3,7 +3,12 @@
3
3
  module ShadcnPhlexcomponents
4
4
  class Breadcrumb < Base
5
5
  class_variants(
6
- base: "text-muted-foreground flex flex-wrap items-center gap-1.5 text-sm break-words sm:gap-2.5",
6
+ **(
7
+ ShadcnPhlexcomponents.configuration.breadcrumb&.dig(:root) ||
8
+ {
9
+ base: "text-muted-foreground flex flex-wrap items-center gap-1.5 text-sm break-words sm:gap-2.5",
10
+ }
11
+ ),
7
12
  )
8
13
 
9
14
  def item(**attributes, &)
@@ -54,7 +59,14 @@ module ShadcnPhlexcomponents
54
59
  end
55
60
 
56
61
  class BreadcrumbItem < Base
57
- class_variants(base: "inline-flex items-center gap-1.5")
62
+ class_variants(
63
+ **(
64
+ ShadcnPhlexcomponents.configuration.breadcrumb&.dig(:item) ||
65
+ {
66
+ base: "inline-flex items-center gap-1.5",
67
+ }
68
+ ),
69
+ )
58
70
 
59
71
  def view_template(&)
60
72
  li(**@attributes, &)
@@ -62,7 +74,14 @@ module ShadcnPhlexcomponents
62
74
  end
63
75
 
64
76
  class BreadcrumbLink < Base
65
- class_variants(base: "transition-colors hover:text-foreground")
77
+ class_variants(
78
+ **(
79
+ ShadcnPhlexcomponents.configuration.breadcrumb&.dig(:link) ||
80
+ {
81
+ base: "transition-colors hover:text-foreground",
82
+ }
83
+ ),
84
+ )
66
85
 
67
86
  def initialize(name = nil, options = nil, html_options = nil)
68
87
  @name = name
@@ -88,7 +107,14 @@ module ShadcnPhlexcomponents
88
107
  end
89
108
 
90
109
  class BreadcrumbSeparator < Base
91
- class_variants(base: "[&>svg]:size-3.5")
110
+ class_variants(
111
+ **(
112
+ ShadcnPhlexcomponents.configuration.breadcrumb&.dig(:separator) ||
113
+ {
114
+ base: "[&>svg]:size-3.5",
115
+ }
116
+ ),
117
+ )
92
118
 
93
119
  def default_attributes
94
120
  {
@@ -111,7 +137,14 @@ module ShadcnPhlexcomponents
111
137
  end
112
138
 
113
139
  class BreadcrumbPage < Base
114
- class_variants(base: "font-normal text-foreground")
140
+ class_variants(
141
+ **(
142
+ ShadcnPhlexcomponents.configuration.breadcrumb&.dig(:page) ||
143
+ {
144
+ base: "font-normal text-foreground",
145
+ }
146
+ ),
147
+ )
115
148
 
116
149
  def default_attributes
117
150
  {
@@ -129,7 +162,14 @@ module ShadcnPhlexcomponents
129
162
  end
130
163
 
131
164
  class BreadcrumbEllipsis < Base
132
- class_variants(base: "flex size-9 items-center justify-center")
165
+ class_variants(
166
+ **(
167
+ ShadcnPhlexcomponents.configuration.breadcrumb&.dig(:ellipsis) ||
168
+ {
169
+ base: "flex size-9 items-center justify-center",
170
+ }
171
+ ),
172
+ )
133
173
 
134
174
  def default_attributes
135
175
  {
@@ -3,33 +3,38 @@
3
3
  module ShadcnPhlexcomponents
4
4
  class Button < Base
5
5
  class_variants(
6
- base: <<~HEREDOC,
7
- inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium
8
- transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none
9
- [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring
10
- focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20
11
- dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive
12
- HEREDOC
13
- variants: {
14
- variant: {
15
- default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
16
- destructive: "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
17
- outline: "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
18
- secondary: "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",
19
- ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
20
- link: "text-primary underline-offset-4 hover:underline",
21
- },
22
- size: {
23
- default: "h-9 px-4 py-2 has-[>svg]:px-3",
24
- sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
25
- lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
26
- icon: "size-9",
27
- },
28
- },
29
- defaults: {
30
- variant: :default,
31
- size: :default,
32
- },
6
+ **(
7
+ ShadcnPhlexcomponents.configuration.button ||
8
+ {
9
+ base: <<~HEREDOC,
10
+ inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium
11
+ transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none
12
+ [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring
13
+ focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20
14
+ dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive
15
+ HEREDOC
16
+ variants: {
17
+ variant: {
18
+ default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
19
+ destructive: "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
20
+ outline: "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
21
+ secondary: "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",
22
+ ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
23
+ link: "text-primary underline-offset-4 hover:underline",
24
+ },
25
+ size: {
26
+ default: "h-9 px-4 py-2 has-[>svg]:px-3",
27
+ sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
28
+ lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
29
+ icon: "size-9",
30
+ },
31
+ },
32
+ defaults: {
33
+ variant: :default,
34
+ size: :default,
35
+ },
36
+ }
37
+ ),
33
38
  )
34
39
 
35
40
  def initialize(variant: :default, size: :default, type: :button, **attributes)
@@ -2,7 +2,14 @@
2
2
 
3
3
  module ShadcnPhlexcomponents
4
4
  class Card < Base
5
- class_variants(base: "bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm")
5
+ class_variants(
6
+ **(
7
+ ShadcnPhlexcomponents.configuration.card&.dig(:root) ||
8
+ {
9
+ base: "bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",
10
+ }
11
+ ),
12
+ )
6
13
 
7
14
  def header(**attributes, &)
8
15
  CardHeader(**attributes, &)
@@ -35,10 +42,15 @@ module ShadcnPhlexcomponents
35
42
 
36
43
  class CardHeader < Base
37
44
  class_variants(
38
- base: <<~HEREDOC,
39
- @container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5
40
- px-6 has-data-[shadcn-phlexcomponents=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6
41
- HEREDOC
45
+ **(
46
+ ShadcnPhlexcomponents.configuration.card&.dig(:header) ||
47
+ {
48
+ base: <<~HEREDOC,
49
+ @container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5
50
+ px-6 has-data-[shadcn-phlexcomponents=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6
51
+ HEREDOC
52
+ }
53
+ ),
42
54
  )
43
55
 
44
56
  def view_template(&)
@@ -47,7 +59,14 @@ module ShadcnPhlexcomponents
47
59
  end
48
60
 
49
61
  class CardTitle < Base
50
- class_variants(base: "leading-none font-semibold")
62
+ class_variants(
63
+ **(
64
+ ShadcnPhlexcomponents.configuration.card&.dig(:title) ||
65
+ {
66
+ base: "leading-none font-semibold",
67
+ }
68
+ ),
69
+ )
51
70
 
52
71
  def view_template(&)
53
72
  div(**@attributes, &)
@@ -55,7 +74,14 @@ module ShadcnPhlexcomponents
55
74
  end
56
75
 
57
76
  class CardDescription < Base
58
- class_variants(base: "text-muted-foreground text-sm")
77
+ class_variants(
78
+ **(
79
+ ShadcnPhlexcomponents.configuration.card&.dig(:description) ||
80
+ {
81
+ base: "text-muted-foreground text-sm",
82
+ }
83
+ ),
84
+ )
59
85
 
60
86
  def view_template(&)
61
87
  div(**@attributes, &)
@@ -63,7 +89,14 @@ module ShadcnPhlexcomponents
63
89
  end
64
90
 
65
91
  class CardAction < Base
66
- class_variants(base: "col-start-2 row-span-2 row-start-1 self-start justify-self-end")
92
+ class_variants(
93
+ **(
94
+ ShadcnPhlexcomponents.configuration.card&.dig(:action) ||
95
+ {
96
+ base: "col-start-2 row-span-2 row-start-1 self-start justify-self-end",
97
+ }
98
+ ),
99
+ )
67
100
 
68
101
  def view_template(&)
69
102
  div(**@attributes, &)
@@ -71,7 +104,16 @@ module ShadcnPhlexcomponents
71
104
  end
72
105
 
73
106
  class CardContent < Base
74
- class_variants(base: "px-6")
107
+ class_variants(
108
+ **(
109
+ ShadcnPhlexcomponents.configuration.card&.dig(:content) ||
110
+ {
111
+ base: "px-6",
112
+ }
113
+ ),
114
+ )
115
+
116
+ class_variants(base: "")
75
117
 
76
118
  def view_template(&)
77
119
  div(**@attributes, &)
@@ -79,7 +121,14 @@ module ShadcnPhlexcomponents
79
121
  end
80
122
 
81
123
  class CardFooter < Base
82
- class_variants(base: "flex items-center px-6 [.border-t]:pt-6")
124
+ class_variants(
125
+ **(
126
+ ShadcnPhlexcomponents.configuration.card&.dig(:footer) ||
127
+ {
128
+ base: "flex items-center px-6 [.border-t]:pt-6",
129
+ }
130
+ ),
131
+ )
83
132
 
84
133
  def view_template(&)
85
134
  div(**@attributes, &)
@@ -3,14 +3,19 @@
3
3
  module ShadcnPhlexcomponents
4
4
  class Checkbox < Base
5
5
  class_variants(
6
- base: <<~HEREDOC,
7
- peer border-input dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground
8
- dark:data-[state=checked]:bg-primary data-[state=checked]:border-primary focus-visible:border-ring
9
- focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40
10
- aria-invalid:border-destructive size-4 shrink-0 rounded-[4px] border shadow-xs transition-shadow
11
- outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50
12
- relative
13
- HEREDOC
6
+ **(
7
+ ShadcnPhlexcomponents.configuration.checkbox&.dig(:root) ||
8
+ {
9
+ base: <<~HEREDOC,
10
+ peer border-input dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground
11
+ dark:data-[state=checked]:bg-primary data-[state=checked]:border-primary focus-visible:border-ring
12
+ focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40
13
+ aria-invalid:border-destructive size-4 shrink-0 rounded-[4px] border shadow-xs transition-shadow
14
+ outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50
15
+ relative
16
+ HEREDOC
17
+ }
18
+ ),
14
19
  )
15
20
 
16
21
  def initialize(name: nil, value: "1", unchecked_value: "0", checked: false, include_hidden: true,
@@ -23,14 +28,28 @@ module ShadcnPhlexcomponents
23
28
  super(**attributes)
24
29
  end
25
30
 
31
+ def default_attributes
32
+ {
33
+ type: "button",
34
+ role: "checkbox",
35
+ aria: {
36
+ checked: @checked.to_s,
37
+ },
38
+ data: {
39
+ checked: @checked.to_s,
40
+ controller: "checkbox",
41
+ action: <<~HEREDOC,
42
+ click->checkbox#toggle
43
+ keydown.enter->checkbox#preventDefault
44
+ HEREDOC
45
+ checkbox_is_checked_value: @checked,
46
+ },
47
+ }
48
+ end
49
+
26
50
  def view_template(&)
27
51
  button(**@attributes) do
28
- span(
29
- class: "flex items-center justify-center text-current transition-none",
30
- data: { checkbox_target: "indicator" },
31
- ) do
32
- icon("check", class: "size-3.5")
33
- end
52
+ CheckboxIndicator()
34
53
 
35
54
  if @include_hidden
36
55
  input(name: @name, type: "hidden", value: @unchecked_value, autocomplete: "off")
@@ -50,24 +69,26 @@ module ShadcnPhlexcomponents
50
69
  )
51
70
  end
52
71
  end
72
+ end
73
+
74
+ class CheckboxIndicator < Base
75
+ class_variants(
76
+ **(
77
+ ShadcnPhlexcomponents.configuration.checkbox&.dig(:indicator) ||
78
+ {
79
+ base: "flex items-center justify-center text-current transition-none",
80
+ }
81
+ ),
82
+ )
53
83
 
54
84
  def default_attributes
55
- {
56
- type: "button",
57
- role: "checkbox",
58
- aria: {
59
- checked: @checked.to_s,
60
- },
61
- data: {
62
- checked: @checked.to_s,
63
- controller: "checkbox",
64
- action: <<~HEREDOC,
65
- click->checkbox#toggle
66
- keydown.enter->checkbox#preventDefault
67
- HEREDOC
68
- checkbox_is_checked_value: @checked,
69
- },
70
- }
85
+ { data: { checkbox_target: "indicator" } }
86
+ end
87
+
88
+ def view_template(&)
89
+ span(**@attributes) do
90
+ icon("check", class: "size-3.5")
91
+ end
71
92
  end
72
93
  end
73
94
  end
@@ -2,7 +2,14 @@
2
2
 
3
3
  module ShadcnPhlexcomponents
4
4
  class CheckboxGroup < Base
5
- class_variants(base: "space-y-1.5")
5
+ class_variants(
6
+ **(
7
+ ShadcnPhlexcomponents.configuration.checkbox_group&.dig(:root) ||
8
+ {
9
+ base: "space-y-1.5",
10
+ }
11
+ ),
12
+ )
6
13
 
7
14
  def initialize(name:, value: [], include_hidden: true, **attributes)
8
15
  @name = name
@@ -24,8 +31,6 @@ module ShadcnPhlexcomponents
24
31
  def items(collection, value_method:, text_method:, container_class: nil, disabled_items: nil, id_prefix: nil, &)
25
32
  vanish(&)
26
33
 
27
- container_class = TAILWIND_MERGER.merge("flex flex-row items-center gap-2 #{container_class}")
28
-
29
34
  if collection.first&.is_a?(Hash)
30
35
  collection = convert_collection_hash_to_struct(collection, value_method: value_method, text_method: text_method)
31
36
  end
@@ -40,7 +45,7 @@ module ShadcnPhlexcomponents
40
45
  "#{@name.parameterize.underscore}_#{value}"
41
46
  end
42
47
 
43
- div(class: container_class) do
48
+ CheckboxGroupItemContainer(class: container_class) do
44
49
  Checkbox(
45
50
  name: "#{@name}[]",
46
51
  id: id,
@@ -73,4 +78,19 @@ module ShadcnPhlexcomponents
73
78
  end
74
79
  end
75
80
  end
81
+
82
+ class CheckboxGroupItemContainer < Base
83
+ class_variants(
84
+ **(
85
+ ShadcnPhlexcomponents.configuration.checkbox_group&.dig(:item_container) ||
86
+ {
87
+ base: "flex flex-row items-center gap-2",
88
+ }
89
+ ),
90
+ )
91
+
92
+ def view_template(&)
93
+ div(**@attributes, &)
94
+ end
95
+ end
76
96
  end