phlex_ui 0.0.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (149) hide show
  1. checksums.yaml +4 -4
  2. data/lib/phlex_ui/accordion/builder.rb +22 -0
  3. data/lib/phlex_ui/accordion/content.rb +15 -15
  4. data/lib/phlex_ui/accordion/default_content.rb +11 -11
  5. data/lib/phlex_ui/accordion/default_trigger.rb +14 -14
  6. data/lib/phlex_ui/accordion/icon.rb +31 -31
  7. data/lib/phlex_ui/accordion/item.rb +20 -20
  8. data/lib/phlex_ui/accordion/trigger.rb +11 -11
  9. data/lib/phlex_ui/accordion.rb +10 -21
  10. data/lib/phlex_ui/alert/description.rb +10 -10
  11. data/lib/phlex_ui/alert/title.rb +10 -10
  12. data/lib/phlex_ui/alert.rb +27 -27
  13. data/lib/phlex_ui/alert_dialog/action.rb +11 -11
  14. data/lib/phlex_ui/alert_dialog/cancel.rb +15 -15
  15. data/lib/phlex_ui/alert_dialog/content.rb +36 -36
  16. data/lib/phlex_ui/alert_dialog/description.rb +11 -11
  17. data/lib/phlex_ui/alert_dialog/footer.rb +11 -11
  18. data/lib/phlex_ui/alert_dialog/header.rb +11 -11
  19. data/lib/phlex_ui/alert_dialog/title.rb +11 -11
  20. data/lib/phlex_ui/alert_dialog/trigger.rb +12 -12
  21. data/lib/phlex_ui/alert_dialog.rb +18 -18
  22. data/lib/phlex_ui/aspect_ratio.rb +24 -24
  23. data/lib/phlex_ui/attribute_merger.rb +59 -61
  24. data/lib/phlex_ui/avatar/builder.rb +36 -0
  25. data/lib/phlex_ui/avatar/fallback.rb +11 -11
  26. data/lib/phlex_ui/avatar/image.rb +19 -19
  27. data/lib/phlex_ui/avatar.rb +23 -41
  28. data/lib/phlex_ui/badge.rb +50 -50
  29. data/lib/phlex_ui/base.rb +16 -16
  30. data/lib/phlex_ui/button.rb +80 -80
  31. data/lib/phlex_ui/calendar/body.rb +19 -0
  32. data/lib/phlex_ui/calendar/days.rb +104 -0
  33. data/lib/phlex_ui/calendar/header.rb +17 -0
  34. data/lib/phlex_ui/calendar/next.rb +43 -0
  35. data/lib/phlex_ui/calendar/prev.rb +43 -0
  36. data/lib/phlex_ui/calendar/title.rb +27 -0
  37. data/lib/phlex_ui/calendar/weekdays.rb +33 -0
  38. data/lib/phlex_ui/calendar.rb +39 -0
  39. data/lib/phlex_ui/card/content.rb +11 -11
  40. data/lib/phlex_ui/card/description.rb +11 -11
  41. data/lib/phlex_ui/card/footer.rb +11 -11
  42. data/lib/phlex_ui/card/header.rb +11 -11
  43. data/lib/phlex_ui/card/title.rb +11 -11
  44. data/lib/phlex_ui/card.rb +11 -11
  45. data/lib/phlex_ui/chart.rb +23 -0
  46. data/lib/phlex_ui/checkbox.rb +12 -12
  47. data/lib/phlex_ui/clipboard/popover.rb +28 -28
  48. data/lib/phlex_ui/clipboard/source.rb +13 -13
  49. data/lib/phlex_ui/clipboard/trigger.rb +14 -14
  50. data/lib/phlex_ui/clipboard.rb +30 -30
  51. data/lib/phlex_ui/codeblock.rb +86 -86
  52. data/lib/phlex_ui/collapsible/content.rb +12 -12
  53. data/lib/phlex_ui/collapsible/trigger.rb +13 -13
  54. data/lib/phlex_ui/collapsible.rb +18 -18
  55. data/lib/phlex_ui/command/dialog.rb +17 -0
  56. data/lib/phlex_ui/command/dialog_content.rb +49 -0
  57. data/lib/phlex_ui/command/dialog_trigger.rb +29 -0
  58. data/lib/phlex_ui/command/empty.rb +19 -0
  59. data/lib/phlex_ui/command/group.rb +41 -0
  60. data/lib/phlex_ui/command/input.rb +56 -0
  61. data/lib/phlex_ui/command/item.rb +31 -0
  62. data/lib/phlex_ui/command/list.rb +17 -0
  63. data/lib/phlex_ui/command.rb +17 -0
  64. data/lib/phlex_ui/context_menu/content.rb +19 -19
  65. data/lib/phlex_ui/context_menu/item.rb +55 -55
  66. data/lib/phlex_ui/context_menu/label.rb +16 -16
  67. data/lib/phlex_ui/context_menu/separator.rb +13 -13
  68. data/lib/phlex_ui/context_menu/trigger.rb +14 -14
  69. data/lib/phlex_ui/context_menu.rb +19 -19
  70. data/lib/phlex_ui/dialog/content.rb +67 -67
  71. data/lib/phlex_ui/dialog/description.rb +11 -11
  72. data/lib/phlex_ui/dialog/footer.rb +11 -11
  73. data/lib/phlex_ui/dialog/header.rb +11 -11
  74. data/lib/phlex_ui/dialog/middle.rb +11 -11
  75. data/lib/phlex_ui/dialog/title.rb +11 -11
  76. data/lib/phlex_ui/dialog/trigger.rb +14 -13
  77. data/lib/phlex_ui/dialog.rb +18 -18
  78. data/lib/phlex_ui/dropdown_menu/content.rb +16 -16
  79. data/lib/phlex_ui/dropdown_menu/item.rb +21 -21
  80. data/lib/phlex_ui/dropdown_menu/label.rb +11 -11
  81. data/lib/phlex_ui/dropdown_menu/separator.rb +13 -13
  82. data/lib/phlex_ui/dropdown_menu/trigger.rb +12 -11
  83. data/lib/phlex_ui/dropdown_menu.rb +19 -19
  84. data/lib/phlex_ui/form/builder.rb +38 -0
  85. data/lib/phlex_ui/form/item.rb +11 -11
  86. data/lib/phlex_ui/form/spacer.rb +11 -11
  87. data/lib/phlex_ui/form.rb +9 -28
  88. data/lib/phlex_ui/hint.rb +11 -11
  89. data/lib/phlex_ui/hover_card/content.rb +16 -16
  90. data/lib/phlex_ui/hover_card/trigger.rb +14 -13
  91. data/lib/phlex_ui/hover_card.rb +20 -20
  92. data/lib/phlex_ui/input.rb +22 -22
  93. data/lib/phlex_ui/input_error.rb +11 -11
  94. data/lib/phlex_ui/label.rb +11 -11
  95. data/lib/phlex_ui/link.rb +81 -81
  96. data/lib/phlex_ui/popover/content.rb +16 -16
  97. data/lib/phlex_ui/popover/trigger.rb +14 -13
  98. data/lib/phlex_ui/popover.rb +18 -18
  99. data/lib/phlex_ui/select/builder.rb +67 -0
  100. data/lib/phlex_ui/select/content.rb +30 -0
  101. data/lib/phlex_ui/select/group.rb +15 -0
  102. data/lib/phlex_ui/select/input.rb +20 -0
  103. data/lib/phlex_ui/select/item.rb +48 -0
  104. data/lib/phlex_ui/select/label.rb +17 -0
  105. data/lib/phlex_ui/select/trigger.rb +45 -0
  106. data/lib/phlex_ui/select/value.rb +27 -0
  107. data/lib/phlex_ui/select.rb +30 -0
  108. data/lib/phlex_ui/sheet/content.rb +77 -0
  109. data/lib/phlex_ui/sheet/description.rb +17 -0
  110. data/lib/phlex_ui/sheet/footer.rb +17 -0
  111. data/lib/phlex_ui/sheet/header.rb +17 -0
  112. data/lib/phlex_ui/sheet/middle.rb +17 -0
  113. data/lib/phlex_ui/sheet/title.rb +17 -0
  114. data/lib/phlex_ui/sheet/trigger.rb +17 -0
  115. data/lib/phlex_ui/sheet.rb +17 -0
  116. data/lib/phlex_ui/shortcut_key.rb +11 -11
  117. data/lib/phlex_ui/table/body.rb +11 -11
  118. data/lib/phlex_ui/table/builder.rb +59 -59
  119. data/lib/phlex_ui/table/caption.rb +11 -11
  120. data/lib/phlex_ui/table/cell.rb +11 -11
  121. data/lib/phlex_ui/table/footer.rb +11 -11
  122. data/lib/phlex_ui/table/head.rb +11 -11
  123. data/lib/phlex_ui/table/header.rb +11 -11
  124. data/lib/phlex_ui/table/row.rb +11 -11
  125. data/lib/phlex_ui/table.rb +13 -13
  126. data/lib/phlex_ui/tabs/content.rb +18 -18
  127. data/lib/phlex_ui/tabs/list.rb +11 -11
  128. data/lib/phlex_ui/tabs/trigger.rb +20 -20
  129. data/lib/phlex_ui/tabs.rb +17 -17
  130. data/lib/phlex_ui/theme_toggle.rb +31 -31
  131. data/lib/phlex_ui/tooltip/content.rb +16 -16
  132. data/lib/phlex_ui/tooltip/trigger.rb +12 -11
  133. data/lib/phlex_ui/tooltip.rb +18 -18
  134. data/lib/phlex_ui/typography/blockquote.rb +11 -11
  135. data/lib/phlex_ui/typography/h1.rb +10 -10
  136. data/lib/phlex_ui/typography/h2.rb +10 -10
  137. data/lib/phlex_ui/typography/h3.rb +11 -11
  138. data/lib/phlex_ui/typography/h4.rb +11 -11
  139. data/lib/phlex_ui/typography/inline_code.rb +11 -11
  140. data/lib/phlex_ui/typography/inline_link.rb +22 -0
  141. data/lib/phlex_ui/typography/large.rb +11 -11
  142. data/lib/phlex_ui/typography/lead.rb +11 -11
  143. data/lib/phlex_ui/typography/list.rb +36 -36
  144. data/lib/phlex_ui/typography/list_item.rb +11 -11
  145. data/lib/phlex_ui/typography/muted.rb +11 -11
  146. data/lib/phlex_ui/typography/p.rb +11 -11
  147. data/lib/phlex_ui/typography/small.rb +11 -11
  148. data/lib/phlex_ui.rb +9 -4
  149. metadata +88 -7
@@ -1,78 +1,78 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PhlexUI
4
- class Dialog::Content < Base
5
- SIZES = {
6
- xs: "max-w-sm",
7
- sm: "max-w-md",
8
- md: "max-w-lg",
9
- lg: "max-w-2xl",
10
- xl: "max-w-4xl",
11
- full: "max-w-full",
12
- }
13
-
14
- def initialize(size: :md, **attrs)
15
- @size = size
16
- super(**attrs)
17
- end
4
+ class Dialog::Content < Base
5
+ SIZES = {
6
+ xs: "max-w-sm",
7
+ sm: "max-w-md",
8
+ md: "max-w-lg",
9
+ lg: "max-w-2xl",
10
+ xl: "max-w-4xl",
11
+ full: "max-w-full"
12
+ }
13
+
14
+ def initialize(size: :md, **attrs)
15
+ @size = size
16
+ super(**attrs)
17
+ end
18
18
 
19
- def template
20
- template_tag(data: { dialog_target: "content" }) do
21
- div(data: { controller: 'dismissable' }) do
22
- backdrop
23
- div(**attrs) do
24
- yield
25
- close_button
26
- end
27
- end
28
- end
19
+ def template
20
+ template_tag(data: {dialog_target: "content"}) do
21
+ div(data: {controller: "dismissable"}) do
22
+ backdrop
23
+ div(**attrs) do
24
+ yield
25
+ close_button
26
+ end
29
27
  end
28
+ end
29
+ end
30
30
 
31
- private
31
+ private
32
32
 
33
- def default_attrs
34
- {
35
- data_state: "open",
36
- class: tokens(
37
- "fixed pointer-events-auto left-[50%] top-[50%] z-50 grid w-full translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg md:w-full",
38
- SIZES[@size]
39
- ),
40
- }
41
- end
33
+ def default_attrs
34
+ {
35
+ data_state: "open",
36
+ class: tokens(
37
+ "fixed pointer-events-auto left-[50%] top-[50%] z-50 grid w-full translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg md:w-full",
38
+ SIZES[@size]
39
+ )
40
+ }
41
+ end
42
42
 
43
- def close_button
44
- button(
45
- type: "button",
46
- 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-background data-[state=open]:text-muted-text",
47
- data_action: "click->dismissable#dismiss"
48
- ) do
49
- svg(
50
- width: "15",
51
- height: "15",
52
- viewbox: "0 0 15 15",
53
- fill: "none",
54
- xmlns: "http://www.w3.org/2000/svg",
55
- class: "h-4 w-4"
56
- ) do |s|
57
- s.path(
58
- d:
59
- "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",
60
- fill: "currentColor",
61
- fill_rule: "evenodd",
62
- clip_rule: "evenodd"
63
- )
64
- end
65
- span(class: "sr-only") { "Close" }
66
- end
43
+ def close_button
44
+ button(
45
+ type: "button",
46
+ 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",
47
+ data_action: "click->dismissable#dismiss"
48
+ ) do
49
+ svg(
50
+ width: "15",
51
+ height: "15",
52
+ viewbox: "0 0 15 15",
53
+ fill: "none",
54
+ xmlns: "http://www.w3.org/2000/svg",
55
+ class: "h-4 w-4"
56
+ ) do |s|
57
+ s.path(
58
+ d:
59
+ "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",
60
+ fill: "currentColor",
61
+ fill_rule: "evenodd",
62
+ clip_rule: "evenodd"
63
+ )
67
64
  end
65
+ span(class: "sr-only") { "Close" }
66
+ end
67
+ end
68
68
 
69
- def backdrop
70
- div(
71
- data_state: "open",
72
- data_action: "click->dismissable#dismiss esc->dismissable#dismiss",
73
- class:
74
- "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",
75
- )
76
- end
69
+ def backdrop
70
+ div(
71
+ data_state: "open",
72
+ data_action: "click->dismissable#dismiss esc->dismissable#dismiss",
73
+ class:
74
+ "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"
75
+ )
77
76
  end
78
- end
77
+ end
78
+ end
@@ -1,17 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PhlexUI
4
- class Dialog::Description < Base
5
- def template(&)
6
- p(**attrs, &)
7
- end
4
+ class Dialog::Description < Base
5
+ def template(&block)
6
+ p(**attrs, &block)
7
+ end
8
8
 
9
- private
9
+ private
10
10
 
11
- def default_attrs
12
- {
13
- class: "text-sm text-muted-text"
14
- }
15
- end
11
+ def default_attrs
12
+ {
13
+ class: "text-sm text-muted-foreground"
14
+ }
16
15
  end
17
- end
16
+ end
17
+ end
@@ -1,17 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PhlexUI
4
- class Dialog::Footer < Base
5
- def template(&)
6
- div(**attrs, &)
7
- end
4
+ class Dialog::Footer < Base
5
+ def template(&block)
6
+ div(**attrs, &block)
7
+ end
8
8
 
9
- private
9
+ private
10
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
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
+ }
16
15
  end
17
- end
16
+ end
17
+ end
@@ -1,17 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PhlexUI
4
- class Dialog::Header < Base
5
- def template(&)
6
- div(**attrs, &)
7
- end
4
+ class Dialog::Header < Base
5
+ def template(&block)
6
+ div(**attrs, &block)
7
+ end
8
8
 
9
- private
9
+ private
10
10
 
11
- def default_attrs
12
- {
13
- class: "flex flex-col space-y-1.5 text-center sm:text-left"
14
- }
15
- end
11
+ def default_attrs
12
+ {
13
+ class: "flex flex-col space-y-1.5 text-center sm:text-left"
14
+ }
16
15
  end
17
- end
16
+ end
17
+ end
@@ -1,17 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PhlexUI
4
- class Dialog::Middle < Base
5
- def template(&)
6
- div(**attrs, &)
7
- end
4
+ class Dialog::Middle < Base
5
+ def template(&block)
6
+ div(**attrs, &block)
7
+ end
8
8
 
9
- private
9
+ private
10
10
 
11
- def default_attrs
12
- {
13
- class: "py-4"
14
- }
15
- end
11
+ def default_attrs
12
+ {
13
+ class: "py-4"
14
+ }
16
15
  end
17
- end
16
+ end
17
+ end
@@ -1,17 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PhlexUI
4
- class Dialog::Title < Base
5
- def template(&)
6
- h3(**attrs, &)
7
- end
4
+ class Dialog::Title < Base
5
+ def template(&block)
6
+ h3(**attrs, &block)
7
+ end
8
8
 
9
- private
9
+ private
10
10
 
11
- def default_attrs
12
- {
13
- class: "text-lg font-semibold leading-none tracking-tight"
14
- }
15
- end
11
+ def default_attrs
12
+ {
13
+ class: "text-lg font-semibold leading-none tracking-tight"
14
+ }
16
15
  end
17
- end
16
+ end
17
+ end
@@ -1,19 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PhlexUI
4
- class Dialog::Trigger < Base
5
- def template(&)
6
- div(**attrs, &)
7
- end
4
+ class Dialog::Trigger < Base
5
+ def template(&block)
6
+ div(**attrs, &block)
7
+ end
8
8
 
9
- private
9
+ private
10
10
 
11
- def default_attrs
12
- {
13
- data: {
14
- action: "click->dialog#open"
15
- }
16
- }
17
- end
11
+ def default_attrs
12
+ {
13
+ data: {
14
+ action: "click->dialog#open"
15
+ },
16
+ class: "inline-block"
17
+ }
18
18
  end
19
- end
19
+ end
20
+ end
@@ -1,25 +1,25 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PhlexUI
4
- class Dialog < Base
5
- def initialize(open: false, **attrs)
6
- @open = open
7
- super(**attrs)
8
- end
4
+ class Dialog < Base
5
+ def initialize(open: false, **attrs)
6
+ @open = open
7
+ super(**attrs)
8
+ end
9
9
 
10
- def template(&)
11
- div(**attrs, &)
12
- end
10
+ def template(&block)
11
+ div(**attrs, &block)
12
+ end
13
13
 
14
- private
14
+ private
15
15
 
16
- def default_attrs
17
- {
18
- data: {
19
- controller: "dialog",
20
- dialog_open_value: @open
21
- }
22
- }
23
- end
16
+ def default_attrs
17
+ {
18
+ data: {
19
+ controller: "dialog",
20
+ dialog_open_value: @open
21
+ }
22
+ }
24
23
  end
25
- end
24
+ end
25
+ end
@@ -1,22 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PhlexUI
4
- class DropdownMenu::Content < Base
5
- def template(&)
6
- template_tag(data: { popover_target: "content" }) do
7
- div(**attrs, &)
8
- end
9
- end
4
+ class DropdownMenu::Content < Base
5
+ def template(&block)
6
+ template_tag(data: {popover_target: "content"}) do
7
+ div(**attrs, &block)
8
+ end
9
+ end
10
10
 
11
- private
11
+ private
12
12
 
13
- def default_attrs
14
- {
15
- data: {
16
- state: :open
17
- },
18
- class: "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-background p-1 text-text shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 w-56"
19
- }
20
- end
13
+ def default_attrs
14
+ {
15
+ data: {
16
+ state: :open
17
+ },
18
+ class: "z-50 min-w-[8rem] overflow-hidden rounded-md border bg-background p-1 text-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 w-56"
19
+ }
21
20
  end
22
- end
21
+ end
22
+ end
@@ -1,28 +1,28 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PhlexUI
4
- class DropdownMenu::Item < Base
5
- def initialize(href: "#", **attrs)
6
- @href = href
7
- super(**attrs)
8
- end
4
+ class DropdownMenu::Item < Base
5
+ def initialize(href: "#", **attrs)
6
+ @href = href
7
+ super(**attrs)
8
+ end
9
9
 
10
- def template(&)
11
- a(**attrs, &)
12
- end
10
+ def template(&block)
11
+ a(**attrs, &block)
12
+ end
13
13
 
14
- private
14
+ private
15
15
 
16
- def default_attrs
17
- {
18
- href: @href,
19
- role: "menuitem",
20
- class: "relative flex cursor-pointer select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent-background hover:text-accent-text focus:bg-accent-background focus:text-accent-text aria-selected:bg-accent-background aria-selected:text-accent-text data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
21
- data_action: "click->popover#close",
22
- data_popover_target: "menuItem",
23
- tabindex: "-1",
24
- data_orientation: "vertical",
25
- }
26
- end
16
+ def default_attrs
17
+ {
18
+ href: @href,
19
+ role: "menuitem",
20
+ class: "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",
21
+ data_action: "click->popover#close",
22
+ data_popover_target: "menuItem",
23
+ tabindex: "-1",
24
+ data_orientation: "vertical"
25
+ }
27
26
  end
28
- end
27
+ end
28
+ end
@@ -1,17 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PhlexUI
4
- class DropdownMenu::Label < Base
5
- def template(&)
6
- h3(**attrs, &)
7
- end
4
+ class DropdownMenu::Label < Base
5
+ def template(&block)
6
+ h3(**attrs, &block)
7
+ end
8
8
 
9
- private
9
+ private
10
10
 
11
- def default_attrs
12
- {
13
- class: "px-2 py-1.5 text-sm font-semibold"
14
- }
15
- end
11
+ def default_attrs
12
+ {
13
+ class: "px-2 py-1.5 text-sm font-semibold"
14
+ }
16
15
  end
17
- end
16
+ end
17
+ end
@@ -1,19 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PhlexUI
4
- class DropdownMenu::Separator < Base
5
- def template
6
- div(**attrs)
7
- end
4
+ class DropdownMenu::Separator < Base
5
+ def template
6
+ div(**attrs)
7
+ end
8
8
 
9
- private
9
+ private
10
10
 
11
- def default_attrs
12
- {
13
- role: "separator",
14
- aria_orientation: "horizontal",
15
- class: "-mx-1 my-1 h-px bg-muted-background"
16
- }
17
- end
11
+ def default_attrs
12
+ {
13
+ role: "separator",
14
+ aria_orientation: "horizontal",
15
+ class: "-mx-1 my-1 h-px bg-muted"
16
+ }
18
17
  end
19
- end
18
+ end
19
+ end
@@ -1,17 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PhlexUI
4
- class DropdownMenu::Trigger < Base
5
- def template(&)
6
- div(**attrs, &)
7
- end
4
+ class DropdownMenu::Trigger < Base
5
+ def template(&block)
6
+ div(**attrs, &block)
7
+ end
8
8
 
9
- private
9
+ private
10
10
 
11
- def default_attrs
12
- {
13
- data: { popover_target: 'trigger' }
14
- }
15
- end
11
+ def default_attrs
12
+ {
13
+ data: {popover_target: "trigger"},
14
+ class: "inline-block"
15
+ }
16
16
  end
17
- end
17
+ end
18
+ end
@@ -1,26 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PhlexUI
4
- class DropdownMenu < Base
5
- def initialize(options: {}, **attrs)
6
- @options = options
7
- @options[:trigger] ||= "click"
8
- super(**attrs)
9
- end
4
+ class DropdownMenu < Base
5
+ def initialize(options: {}, **attrs)
6
+ @options = options
7
+ @options[:trigger] ||= "click"
8
+ super(**attrs)
9
+ end
10
10
 
11
- def template(&)
12
- div(**attrs, &)
13
- end
11
+ def template(&block)
12
+ div(**attrs, &block)
13
+ end
14
14
 
15
- private
15
+ private
16
16
 
17
- def default_attrs
18
- {
19
- data: {
20
- controller: "popover",
21
- popover_options_value: @options.to_json
22
- }
23
- }
24
- end
17
+ def default_attrs
18
+ {
19
+ data: {
20
+ controller: "popover",
21
+ popover_options_value: @options.to_json
22
+ }
23
+ }
25
24
  end
26
- end
25
+ end
26
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexUI
4
+ class Form::Builder < Base
5
+ def template(&block)
6
+ render PhlexUI::Form.new(**attrs) do
7
+ render PhlexUI::Form::Spacer.new do
8
+ block.call
9
+ end
10
+ end
11
+ end
12
+
13
+ def input(name, label: nil, hint: false, error: nil, **input_attrs)
14
+ name = name.to_s
15
+ label ||= convert_name_to_label(name)
16
+
17
+ render PhlexUI::Form::Item.new do
18
+ render PhlexUI::Label.new(for: name) { label } if label
19
+ render PhlexUI::Input.new(name: name, id: name, **input_attrs)
20
+ render PhlexUI::Hint.new { hint } if hint
21
+ end
22
+ end
23
+
24
+ def button(**button_attrs, &block)
25
+ render PhlexUI::Button.new(**button_attrs, &block)
26
+ end
27
+
28
+ private
29
+
30
+ def convert_name_to_label(name)
31
+ name.to_s.split("_").map(&:capitalize).join(" ")
32
+ end
33
+
34
+ def default_attrs
35
+ {}
36
+ end
37
+ end
38
+ end