rbui 0.0.0 → 1.0.0.pre.alpha.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (160) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rbui/accordion/accordion.rb +17 -0
  3. data/lib/rbui/accordion/accordion_content.rb +21 -0
  4. data/lib/rbui/accordion/accordion_default_content.rb +17 -0
  5. data/lib/rbui/accordion/accordion_default_trigger.rb +19 -0
  6. data/lib/rbui/accordion/accordion_icon.rb +38 -0
  7. data/lib/rbui/accordion/accordion_item.rb +28 -0
  8. data/lib/rbui/accordion/accordion_trigger.rb +16 -0
  9. data/lib/rbui/alert/alert.rb +36 -0
  10. data/lib/rbui/alert/alert_description.rb +17 -0
  11. data/lib/rbui/alert/alert_title.rb +17 -0
  12. data/lib/rbui/alert_dialog/alert_dialog.rb +26 -0
  13. data/lib/rbui/alert_dialog/alert_dialog_action.rb +17 -0
  14. data/lib/rbui/alert_dialog/alert_dialog_cancel.rb +21 -0
  15. data/lib/rbui/alert_dialog/alert_dialog_content.rb +45 -0
  16. data/lib/rbui/alert_dialog/alert_dialog_description.rb +17 -0
  17. data/lib/rbui/alert_dialog/alert_dialog_footer.rb +17 -0
  18. data/lib/rbui/alert_dialog/alert_dialog_header.rb +17 -0
  19. data/lib/rbui/alert_dialog/alert_dialog_title.rb +17 -0
  20. data/lib/rbui/alert_dialog/alert_dialog_trigger.rb +18 -0
  21. data/lib/rbui/aspect_ratio/aspect_ratio.rb +33 -0
  22. data/lib/rbui/avatar/avatar.rb +31 -0
  23. data/lib/rbui/avatar/avatar_fallback.rb +17 -0
  24. data/lib/rbui/avatar/avatar_image.rb +26 -0
  25. data/lib/rbui/badge/badge.rb +60 -0
  26. data/lib/rbui/base.rb +27 -0
  27. data/lib/rbui/button/button.rb +97 -0
  28. data/lib/rbui/calendar/calendar.rb +39 -0
  29. data/lib/rbui/calendar/calendar_body.rb +19 -0
  30. data/lib/rbui/calendar/calendar_days.rb +104 -0
  31. data/lib/rbui/calendar/calendar_header.rb +17 -0
  32. data/lib/rbui/calendar/calendar_next.rb +43 -0
  33. data/lib/rbui/calendar/calendar_prev.rb +43 -0
  34. data/lib/rbui/calendar/calendar_title.rb +27 -0
  35. data/lib/rbui/calendar/calendar_weekdays.rb +33 -0
  36. data/lib/rbui/card/card.rb +17 -0
  37. data/lib/rbui/card/card_content.rb +17 -0
  38. data/lib/rbui/card/card_description.rb +17 -0
  39. data/lib/rbui/card/card_footer.rb +17 -0
  40. data/lib/rbui/card/card_header.rb +17 -0
  41. data/lib/rbui/card/card_title.rb +17 -0
  42. data/lib/rbui/chart/chart.rb +23 -0
  43. data/lib/rbui/checkbox/checkbox.rb +23 -0
  44. data/lib/rbui/checkbox/checkbox_group.rb +20 -0
  45. data/lib/rbui/clipboard/clipboard.rb +42 -0
  46. data/lib/rbui/clipboard/clipboard_popover.rb +40 -0
  47. data/lib/rbui/clipboard/clipboard_source.rb +19 -0
  48. data/lib/rbui/clipboard/clipboard_trigger.rb +20 -0
  49. data/lib/rbui/codeblock/codeblock.rb +105 -0
  50. data/lib/rbui/collapsible/collapsible.rb +25 -0
  51. data/lib/rbui/collapsible/collapsible_content.rb +18 -0
  52. data/lib/rbui/collapsible/collapsible_trigger.rb +19 -0
  53. data/lib/rbui/combobox/combobox.rb +24 -0
  54. data/lib/rbui/combobox/combobox_content.rb +31 -0
  55. data/lib/rbui/combobox/combobox_empty.rb +21 -0
  56. data/lib/rbui/combobox/combobox_group.rb +38 -0
  57. data/lib/rbui/combobox/combobox_input.rb +22 -0
  58. data/lib/rbui/combobox/combobox_item.rb +53 -0
  59. data/lib/rbui/combobox/combobox_list.rb +29 -0
  60. data/lib/rbui/combobox/combobox_search_input.rb +56 -0
  61. data/lib/rbui/combobox/combobox_separator.rb +15 -0
  62. data/lib/rbui/combobox/combobox_trigger.rb +52 -0
  63. data/lib/rbui/combobox/combobox_value.rb +27 -0
  64. data/lib/rbui/command/command.rb +9 -0
  65. data/lib/rbui/command/command_dialog.rb +17 -0
  66. data/lib/rbui/command/command_dialog_content.rb +48 -0
  67. data/lib/rbui/command/command_dialog_trigger.rb +29 -0
  68. data/lib/rbui/command/command_empty.rb +19 -0
  69. data/lib/rbui/command/command_group.rb +40 -0
  70. data/lib/rbui/command/command_input.rb +56 -0
  71. data/lib/rbui/command/command_item.rb +32 -0
  72. data/lib/rbui/command/command_list.rb +17 -0
  73. data/lib/rbui/context_menu/context_menu.rb +26 -0
  74. data/lib/rbui/context_menu/context_menu_content.rb +25 -0
  75. data/lib/rbui/context_menu/context_menu_item.rb +66 -0
  76. data/lib/rbui/context_menu/context_menu_label.rb +24 -0
  77. data/lib/rbui/context_menu/context_menu_separator.rb +19 -0
  78. data/lib/rbui/context_menu/context_menu_trigger.rb +20 -0
  79. data/lib/rbui/dialog/dialog.rb +25 -0
  80. data/lib/rbui/dialog/dialog_content.rb +78 -0
  81. data/lib/rbui/dialog/dialog_description.rb +17 -0
  82. data/lib/rbui/dialog/dialog_footer.rb +17 -0
  83. data/lib/rbui/dialog/dialog_header.rb +17 -0
  84. data/lib/rbui/dialog/dialog_middle.rb +17 -0
  85. data/lib/rbui/dialog/dialog_title.rb +17 -0
  86. data/lib/rbui/dialog/dialog_trigger.rb +20 -0
  87. data/lib/rbui/dropdown_menu/dropdown_menu.rb +26 -0
  88. data/lib/rbui/dropdown_menu/dropdown_menu_content.rb +22 -0
  89. data/lib/rbui/dropdown_menu/dropdown_menu_item.rb +28 -0
  90. data/lib/rbui/dropdown_menu/dropdown_menu_label.rb +17 -0
  91. data/lib/rbui/dropdown_menu/dropdown_menu_separator.rb +19 -0
  92. data/lib/rbui/dropdown_menu/dropdown_menu_trigger.rb +18 -0
  93. data/lib/rbui/form/form.rb +15 -0
  94. data/lib/rbui/form/form_field.rb +20 -0
  95. data/lib/rbui/form/form_field_error.rb +20 -0
  96. data/lib/rbui/form/form_field_hint.rb +15 -0
  97. data/lib/rbui/form/form_field_label.rb +15 -0
  98. data/lib/rbui/hover_card/hover_card.rb +27 -0
  99. data/lib/rbui/hover_card/hover_card_content.rb +22 -0
  100. data/lib/rbui/hover_card/hover_card_trigger.rb +20 -0
  101. data/lib/rbui/input/input.rb +26 -0
  102. data/lib/rbui/link/link.rb +97 -0
  103. data/lib/rbui/pagination/pagination.rb +19 -0
  104. data/lib/rbui/pagination/pagination_content.rb +17 -0
  105. data/lib/rbui/pagination/pagination_ellipsis.rb +42 -0
  106. data/lib/rbui/pagination/pagination_item.rb +28 -0
  107. data/lib/rbui/popover/popover.rb +25 -0
  108. data/lib/rbui/popover/popover_content.rb +22 -0
  109. data/lib/rbui/popover/popover_trigger.rb +20 -0
  110. data/lib/rbui/radio_button/radio_button.rb +22 -0
  111. data/lib/rbui/select/select.rb +23 -0
  112. data/lib/rbui/select/select_content.rb +32 -0
  113. data/lib/rbui/select/select_group.rb +15 -0
  114. data/lib/rbui/select/select_input.rb +22 -0
  115. data/lib/rbui/select/select_item.rb +52 -0
  116. data/lib/rbui/select/select_label.rb +17 -0
  117. data/lib/rbui/select/select_trigger.rb +54 -0
  118. data/lib/rbui/select/select_value.rb +27 -0
  119. data/lib/rbui/sheet/sheet.rb +17 -0
  120. data/lib/rbui/sheet/sheet_content.rb +77 -0
  121. data/lib/rbui/sheet/sheet_description.rb +17 -0
  122. data/lib/rbui/sheet/sheet_footer.rb +17 -0
  123. data/lib/rbui/sheet/sheet_header.rb +17 -0
  124. data/lib/rbui/sheet/sheet_middle.rb +17 -0
  125. data/lib/rbui/sheet/sheet_title.rb +17 -0
  126. data/lib/rbui/sheet/sheet_trigger.rb +17 -0
  127. data/lib/rbui/shortcut_key/shortcut_key.rb +17 -0
  128. data/lib/rbui/table/table.rb +19 -0
  129. data/lib/rbui/table/table_body.rb +17 -0
  130. data/lib/rbui/table/table_caption.rb +17 -0
  131. data/lib/rbui/table/table_cell.rb +17 -0
  132. data/lib/rbui/table/table_footer.rb +17 -0
  133. data/lib/rbui/table/table_head.rb +17 -0
  134. data/lib/rbui/table/table_header.rb +17 -0
  135. data/lib/rbui/table/table_row.rb +17 -0
  136. data/lib/rbui/tabs/tabs.rb +25 -0
  137. data/lib/rbui/tabs/tabs_content.rb +26 -0
  138. data/lib/rbui/tabs/tabs_list.rb +17 -0
  139. data/lib/rbui/tabs/tabs_trigger.rb +28 -0
  140. data/lib/rbui/theme_toggle/theme_toggle.rb +41 -0
  141. data/lib/rbui/tooltip/tooltip.rb +26 -0
  142. data/lib/rbui/tooltip/tooltip_content.rb +26 -0
  143. data/lib/rbui/tooltip/tooltip_trigger.rb +19 -0
  144. data/lib/rbui/typography/typography_blockquote.rb +17 -0
  145. data/lib/rbui/typography/typography_h1.rb +17 -0
  146. data/lib/rbui/typography/typography_h2.rb +17 -0
  147. data/lib/rbui/typography/typography_h3.rb +17 -0
  148. data/lib/rbui/typography/typography_h4.rb +17 -0
  149. data/lib/rbui/typography/typography_inline_code.rb +17 -0
  150. data/lib/rbui/typography/typography_inline_link.rb +22 -0
  151. data/lib/rbui/typography/typography_large.rb +17 -0
  152. data/lib/rbui/typography/typography_lead.rb +17 -0
  153. data/lib/rbui/typography/typography_list.rb +47 -0
  154. data/lib/rbui/typography/typography_list_item.rb +17 -0
  155. data/lib/rbui/typography/typography_muted.rb +17 -0
  156. data/lib/rbui/typography/typography_p.rb +17 -0
  157. data/lib/rbui/typography/typography_small.rb +17 -0
  158. data/lib/rbui/version.rb +5 -0
  159. data/lib/rbui.rb +42 -3
  160. metadata +254 -12
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBUI
4
+ class SelectItem < Base
5
+ def initialize(value: nil, **attrs)
6
+ @value = value
7
+ super(**attrs)
8
+ end
9
+
10
+ def view_template(&block)
11
+ div(**attrs) do
12
+ selected_icon
13
+ block&.call
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def selected_icon
20
+ svg(
21
+ xmlns: "http://www.w3.org/2000/svg",
22
+ viewbox: "0 0 24 24",
23
+ fill: "none",
24
+ stroke: "currentColor",
25
+ class: "invisible group-aria-selected:visible mr-2 h-4 w-4 flex-none",
26
+ stroke_width: "2",
27
+ stroke_linecap: "round",
28
+ stroke_linejoin: "round"
29
+ ) do |s|
30
+ s.path(
31
+ d: "M20 6 9 17l-5-5"
32
+ )
33
+ end
34
+ end
35
+
36
+ def default_attrs
37
+ {
38
+ role: "option",
39
+ tabindex: "0",
40
+ class: "item group relative flex cursor-pointer select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground aria-selected:bg-accent aria-selected:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
41
+ data: {
42
+ controller: "rbui--select-item",
43
+ action: "click->rbui--select#selectItem keydown.enter->rbui--select#selectItem keydown.down->rbui--select#handleKeyDown keydown.up->rbui--select#handleKeyUp keydown.esc->rbui--select#handleEsc",
44
+ rbui__select_target: "item"
45
+ },
46
+ data_value: @value,
47
+ data_orientation: "vertical",
48
+ aria_selected: "false"
49
+ }
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBUI
4
+ class SelectLabel < Base
5
+ def view_template(&)
6
+ h3(**attrs, &)
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {
13
+ class: "px-2 py-1.5 text-sm font-semibold"
14
+ }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBUI
4
+ class SelectTrigger < Base
5
+ def view_template(&block)
6
+ button(**attrs) do
7
+ block&.call
8
+ icon
9
+ end
10
+ end
11
+
12
+ private
13
+
14
+ def icon
15
+ svg(
16
+ xmlns: "http://www.w3.org/2000/svg",
17
+ viewbox: "0 0 24 24",
18
+ fill: "none",
19
+ stroke: "currentColor",
20
+ class: "ml-2 h-4 w-4 shrink-0 opacity-50",
21
+ stroke_width: "2",
22
+ stroke_linecap: "round",
23
+ stroke_linejoin: "round"
24
+ ) do |s|
25
+ s.path(
26
+ d: "m7 15 5 5 5-5"
27
+ )
28
+ s.path(
29
+ d: "m7 9 5-5 5 5"
30
+ )
31
+ end
32
+ end
33
+
34
+ def default_attrs
35
+ {
36
+ data: {
37
+ action: "rbui--select#onClick",
38
+ rbui__select_target: "trigger"
39
+ },
40
+ type: "button",
41
+ role: "combobox",
42
+ aria: {
43
+ controls: "radix-:r0:",
44
+ expanded: "false",
45
+ autocomplete: "none",
46
+ haspopup: "listbox",
47
+ activedescendant: true
48
+ },
49
+ class:
50
+ "truncate w-full flex h-9 items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50"
51
+ }
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBUI
4
+ class SelectValue < Base
5
+ def initialize(placeholder: nil, **attrs)
6
+ @placeholder = placeholder
7
+ super(**attrs)
8
+ end
9
+
10
+ def view_template(&block)
11
+ span(**attrs) do
12
+ block ? block.call : @placeholder
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def default_attrs
19
+ {
20
+ data: {
21
+ rbui__select_target: "value"
22
+ },
23
+ class: "pointer-events-none"
24
+ }
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBUI
4
+ class Sheet < Base
5
+ def view_template(&)
6
+ div(**attrs, &)
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {
13
+ data: {controller: "rbui--sheet"}
14
+ }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBUI
4
+ class SheetContent < Base
5
+ SIDE_CLASS = {
6
+ top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
7
+ right: "inset-y-0 right-0 h-full border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right",
8
+ bottom: "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
9
+ left: "inset-y-0 left-0 h-full border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left"
10
+ }
11
+
12
+ def initialize(side: :right, **attrs)
13
+ @side = side
14
+ @side_classes = SIDE_CLASS[side]
15
+ super(**attrs)
16
+ end
17
+
18
+ def view_template(&block)
19
+ template_tag(data: {rbui__sheet_target: "content"}) do
20
+ div(data: {controller: "rbui--sheet-content"}) do
21
+ backdrop
22
+ div(**attrs) do
23
+ block&.call
24
+ close_button
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ def default_attrs
33
+ {
34
+ data_state: "open", # For animate in
35
+ class: tokens(
36
+ "fixed pointer-events-auto z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500",
37
+ @side_classes
38
+ )
39
+ }
40
+ end
41
+
42
+ def close_button
43
+ button(
44
+ type: "button",
45
+ class: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground",
46
+ data_action: "click->rbui--sheet-content#close"
47
+ ) do
48
+ svg(
49
+ width: "15",
50
+ height: "15",
51
+ viewbox: "0 0 15 15",
52
+ fill: "none",
53
+ xmlns: "http://www.w3.org/2000/svg",
54
+ class: "h-4 w-4"
55
+ ) do |s|
56
+ s.path(
57
+ d:
58
+ "M11.7816 4.03157C12.0062 3.80702 12.0062 3.44295 11.7816 3.2184C11.5571 2.99385 11.193 2.99385 10.9685 3.2184L7.50005 6.68682L4.03164 3.2184C3.80708 2.99385 3.44301 2.99385 3.21846 3.2184C2.99391 3.44295 2.99391 3.80702 3.21846 4.03157L6.68688 7.49999L3.21846 10.9684C2.99391 11.193 2.99391 11.557 3.21846 11.7816C3.44301 12.0061 3.80708 12.0061 4.03164 11.7816L7.50005 8.31316L10.9685 11.7816C11.193 12.0061 11.5571 12.0061 11.7816 11.7816C12.0062 11.557 12.0062 11.193 11.7816 10.9684L8.31322 7.49999L11.7816 4.03157Z",
59
+ fill: "currentColor",
60
+ fill_rule: "evenodd",
61
+ clip_rule: "evenodd"
62
+ )
63
+ end
64
+ span(class: "sr-only") { "Close" }
65
+ end
66
+ end
67
+
68
+ def backdrop
69
+ div(
70
+ data_state: "open",
71
+ data_action: "click->rbui--sheet-content#close",
72
+ class:
73
+ "fixed pointer-events-auto inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0"
74
+ )
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBUI
4
+ class SheetDescription < Base
5
+ def view_template(&)
6
+ p(**attrs, &)
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {
13
+ class: "text-sm text-muted-foreground"
14
+ }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBUI
4
+ class SheetFooter < Base
5
+ def view_template(&)
6
+ div(**attrs, &)
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {
13
+ class: "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2 gap-y-2 sm:gap-y-0"
14
+ }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBUI
4
+ class SheetHeader < Base
5
+ def view_template(&)
6
+ div(**attrs, &)
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {
13
+ class: "flex flex-col space-y-1.5 text-center sm:text-left"
14
+ }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBUI
4
+ class SheetMiddle < Base
5
+ def view_template(&)
6
+ div(**attrs, &)
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {
13
+ class: "py-4"
14
+ }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBUI
4
+ class SheetTitle < Base
5
+ def view_template(&)
6
+ h3(**attrs, &)
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {
13
+ class: "text-lg font-semibold leading-none tracking-tight"
14
+ }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBUI
4
+ class SheetTrigger < Base
5
+ def view_template(&)
6
+ div(**attrs, &)
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {
13
+ data: {action: "click->rbui--sheet#open"}
14
+ }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBUI
4
+ class ShortcutKey < Base
5
+ def view_template(&)
6
+ kbd(**attrs, &)
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {
13
+ class: "pointer-events-none inline-flex h-5 select-none items-center gap-1 rounded border bg-muted px-1.5 font-mono text-[10px] font-medium text-muted-foreground opacity-100"
14
+ }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBUI
4
+ class Table < Base
5
+ def view_template(&block)
6
+ div(class: "relative w-full overflow-auto") do
7
+ table(**attrs, &block)
8
+ end
9
+ end
10
+
11
+ private
12
+
13
+ def default_attrs
14
+ {
15
+ class: "w-full caption-bottom text-sm"
16
+ }
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBUI
4
+ class TableBody < Base
5
+ def view_template(&)
6
+ tbody(**attrs, &)
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {
13
+ class: "[&_tr:last-child]:border-0"
14
+ }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBUI
4
+ class TableCaption < Base
5
+ def view_template(&)
6
+ caption(**attrs, &)
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {
13
+ class: "mt-4 text-sm text-muted-foreground"
14
+ }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBUI
4
+ class TableCell < Base
5
+ def view_template(&)
6
+ td(**attrs, &)
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {
13
+ class: "p-2 align-middle [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]"
14
+ }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBUI
4
+ class TableFooter < Base
5
+ def view_template(&)
6
+ tfoot(**attrs, &)
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {
13
+ class: "border-t bg-muted bg-opacity-50 font-medium[& amp;>tr]:last:border-b-0"
14
+ }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBUI
4
+ class TableHead < Base
5
+ def view_template(&)
6
+ th(**attrs, &)
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {
13
+ class: "h-10 px-2 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]"
14
+ }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBUI
4
+ class TableHeader < Base
5
+ def view_template(&)
6
+ thead(**attrs, &)
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {
13
+ class: "[&_tr]:border-b"
14
+ }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBUI
4
+ class TableRow < Base
5
+ def view_template(&)
6
+ tr(**attrs, &)
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {
13
+ class: "border-b transition-colors hover:bg-muted hover:bg-opacity-50 data-[state=selected]:bg-muted"
14
+ }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBUI
4
+ class Tabs < Base
5
+ def initialize(default: nil, **attrs)
6
+ @default = default
7
+ super(**attrs)
8
+ end
9
+
10
+ def view_template(&)
11
+ div(**attrs, &)
12
+ end
13
+
14
+ private
15
+
16
+ def default_attrs
17
+ {
18
+ data: {
19
+ controller: "rbui--tabs",
20
+ rbui__tabs_active_value: @default
21
+ }
22
+ }
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBUI
4
+ class TabsContent < Base
5
+ def initialize(value:, **attrs)
6
+ @value = value
7
+ super(**attrs)
8
+ end
9
+
10
+ def view_template(&)
11
+ div(**attrs, &)
12
+ end
13
+
14
+ private
15
+
16
+ def default_attrs
17
+ {
18
+ data: {
19
+ rbui__tabs_target: :content,
20
+ value: @value
21
+ },
22
+ class: "mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 hidden"
23
+ }
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBUI
4
+ class TabsList < Base
5
+ def view_template(&)
6
+ div(**attrs, &)
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {
13
+ class: "inline-flex h-9 items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground"
14
+ }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBUI
4
+ class TabsTrigger < Base
5
+ def initialize(value:, **attrs)
6
+ @value = value
7
+ super(**attrs)
8
+ end
9
+
10
+ def view_template(&)
11
+ button(**attrs, &)
12
+ end
13
+
14
+ private
15
+
16
+ def default_attrs
17
+ {
18
+ type: :button,
19
+ data: {
20
+ rbui__tabs_target: "trigger",
21
+ action: "click->rbui--tabs#show",
22
+ value: @value
23
+ },
24
+ class: "inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow"
25
+ }
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RBUI
4
+ class ThemeToggle < Base
5
+ def view_template(&)
6
+ div(**attrs, &)
7
+ end
8
+
9
+ def light_mode(**user_attrs, &)
10
+ light_attrs = mix(default_light_attrs, user_attrs)
11
+ div(**light_attrs, &)
12
+ end
13
+
14
+ def dark_mode(**user_attrs, &)
15
+ dark_attrs = mix(default_dark_attrs, user_attrs)
16
+ div(**dark_attrs, &)
17
+ end
18
+
19
+ private
20
+
21
+ def default_attrs
22
+ {
23
+ data: {controller: "rbui--theme-toggle"}
24
+ }
25
+ end
26
+
27
+ def default_light_attrs
28
+ {
29
+ class: "dark:hidden",
30
+ data: {action: "click->rbui--theme-toggle#setDarkTheme"}
31
+ }
32
+ end
33
+
34
+ def default_dark_attrs
35
+ {
36
+ class: "hidden dark:inline-block",
37
+ data: {action: "click->rbui--theme-toggle#setLightTheme"}
38
+ }
39
+ end
40
+ end
41
+ end