phlex_ui 0.0.4 → 0.1.6

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 (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 +17 -0
  11. data/lib/phlex_ui/alert/title.rb +17 -0
  12. data/lib/phlex_ui/alert.rb +36 -0
  13. data/lib/phlex_ui/alert_dialog/action.rb +17 -0
  14. data/lib/phlex_ui/alert_dialog/cancel.rb +21 -0
  15. data/lib/phlex_ui/alert_dialog/content.rb +45 -0
  16. data/lib/phlex_ui/alert_dialog/description.rb +17 -0
  17. data/lib/phlex_ui/alert_dialog/footer.rb +17 -0
  18. data/lib/phlex_ui/alert_dialog/header.rb +17 -0
  19. data/lib/phlex_ui/alert_dialog/title.rb +17 -0
  20. data/lib/phlex_ui/alert_dialog/trigger.rb +18 -0
  21. data/lib/phlex_ui/alert_dialog.rb +26 -0
  22. data/lib/phlex_ui/aspect_ratio.rb +33 -0
  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 +17 -0
  26. data/lib/phlex_ui/avatar/image.rb +26 -0
  27. data/lib/phlex_ui/avatar.rb +31 -0
  28. data/lib/phlex_ui/badge.rb +53 -69
  29. data/lib/phlex_ui/base.rb +16 -16
  30. data/lib/phlex_ui/button.rb +92 -69
  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 +17 -0
  40. data/lib/phlex_ui/card/description.rb +17 -0
  41. data/lib/phlex_ui/card/footer.rb +17 -0
  42. data/lib/phlex_ui/card/header.rb +17 -0
  43. data/lib/phlex_ui/card/title.rb +17 -0
  44. data/lib/phlex_ui/card.rb +17 -0
  45. data/lib/phlex_ui/chart.rb +23 -0
  46. data/lib/phlex_ui/checkbox.rb +18 -0
  47. data/lib/phlex_ui/clipboard/popover.rb +36 -0
  48. data/lib/phlex_ui/clipboard/source.rb +19 -0
  49. data/lib/phlex_ui/clipboard/trigger.rb +20 -0
  50. data/lib/phlex_ui/clipboard.rb +39 -0
  51. data/lib/phlex_ui/codeblock.rb +105 -0
  52. data/lib/phlex_ui/collapsible/content.rb +18 -0
  53. data/lib/phlex_ui/collapsible/trigger.rb +19 -0
  54. data/lib/phlex_ui/collapsible.rb +25 -0
  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 +25 -0
  65. data/lib/phlex_ui/context_menu/item.rb +66 -0
  66. data/lib/phlex_ui/context_menu/label.rb +24 -0
  67. data/lib/phlex_ui/context_menu/separator.rb +19 -0
  68. data/lib/phlex_ui/context_menu/trigger.rb +20 -0
  69. data/lib/phlex_ui/context_menu.rb +26 -0
  70. data/lib/phlex_ui/dialog/content.rb +78 -0
  71. data/lib/phlex_ui/dialog/description.rb +17 -0
  72. data/lib/phlex_ui/dialog/footer.rb +17 -0
  73. data/lib/phlex_ui/dialog/header.rb +17 -0
  74. data/lib/phlex_ui/dialog/middle.rb +17 -0
  75. data/lib/phlex_ui/dialog/title.rb +17 -0
  76. data/lib/phlex_ui/dialog/trigger.rb +20 -0
  77. data/lib/phlex_ui/dialog.rb +25 -0
  78. data/lib/phlex_ui/dropdown_menu/content.rb +22 -0
  79. data/lib/phlex_ui/dropdown_menu/item.rb +28 -0
  80. data/lib/phlex_ui/dropdown_menu/label.rb +17 -0
  81. data/lib/phlex_ui/dropdown_menu/separator.rb +19 -0
  82. data/lib/phlex_ui/dropdown_menu/trigger.rb +18 -0
  83. data/lib/phlex_ui/dropdown_menu.rb +26 -0
  84. data/lib/phlex_ui/form/builder.rb +38 -0
  85. data/lib/phlex_ui/form/item.rb +17 -0
  86. data/lib/phlex_ui/form/spacer.rb +17 -0
  87. data/lib/phlex_ui/form.rb +15 -0
  88. data/lib/phlex_ui/hint.rb +17 -0
  89. data/lib/phlex_ui/hover_card/content.rb +22 -0
  90. data/lib/phlex_ui/hover_card/trigger.rb +20 -0
  91. data/lib/phlex_ui/hover_card.rb +27 -0
  92. data/lib/phlex_ui/input.rb +29 -0
  93. data/lib/phlex_ui/input_error.rb +17 -0
  94. data/lib/phlex_ui/label.rb +17 -0
  95. data/lib/phlex_ui/link.rb +97 -0
  96. data/lib/phlex_ui/popover/content.rb +22 -0
  97. data/lib/phlex_ui/popover/trigger.rb +20 -0
  98. data/lib/phlex_ui/popover.rb +25 -0
  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 +17 -0
  117. data/lib/phlex_ui/table/body.rb +17 -0
  118. data/lib/phlex_ui/table/builder.rb +77 -0
  119. data/lib/phlex_ui/table/caption.rb +17 -0
  120. data/lib/phlex_ui/table/cell.rb +17 -0
  121. data/lib/phlex_ui/table/footer.rb +17 -0
  122. data/lib/phlex_ui/table/head.rb +17 -0
  123. data/lib/phlex_ui/table/header.rb +17 -0
  124. data/lib/phlex_ui/table/row.rb +17 -0
  125. data/lib/phlex_ui/table.rb +19 -0
  126. data/lib/phlex_ui/tabs/content.rb +26 -0
  127. data/lib/phlex_ui/tabs/list.rb +17 -0
  128. data/lib/phlex_ui/tabs/trigger.rb +28 -0
  129. data/lib/phlex_ui/tabs.rb +25 -0
  130. data/lib/phlex_ui/theme_toggle.rb +41 -0
  131. data/lib/phlex_ui/tooltip/content.rb +22 -0
  132. data/lib/phlex_ui/tooltip/trigger.rb +18 -0
  133. data/lib/phlex_ui/tooltip.rb +25 -0
  134. data/lib/phlex_ui/typography/blockquote.rb +17 -0
  135. data/lib/phlex_ui/typography/h1.rb +17 -0
  136. data/lib/phlex_ui/typography/h2.rb +17 -0
  137. data/lib/phlex_ui/typography/h3.rb +17 -0
  138. data/lib/phlex_ui/typography/h4.rb +17 -0
  139. data/lib/phlex_ui/typography/inline_code.rb +17 -0
  140. data/lib/phlex_ui/typography/inline_link.rb +22 -0
  141. data/lib/phlex_ui/typography/large.rb +17 -0
  142. data/lib/phlex_ui/typography/lead.rb +17 -0
  143. data/lib/phlex_ui/typography/list.rb +47 -0
  144. data/lib/phlex_ui/typography/list_item.rb +17 -0
  145. data/lib/phlex_ui/typography/muted.rb +17 -0
  146. data/lib/phlex_ui/typography/p.rb +17 -0
  147. data/lib/phlex_ui/typography/small.rb +17 -0
  148. data/lib/phlex_ui.rb +9 -4
  149. metadata +195 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2e94d694e97786f20a88cc28497e9fbda569229a4b60688745e1faef5bb6a794
4
- data.tar.gz: 3c06ca211012a28ad741ec3d66db56c7ecde93e637d07b24e2da5f987c759eef
3
+ metadata.gz: 443bba42189a98a9688d7218421e85da741c759ee3e9d7720817d4623ebbb85e
4
+ data.tar.gz: 92b24956dbcb18b4ba30be83a9f1fa736e9679fad74eb36522a1a8b97f085e0c
5
5
  SHA512:
6
- metadata.gz: e45505146ef033bef4bc13725b1abc4dd450ca5f9b0a76981a109570044f50c68523dc4cd48aa69b0e9731e6ce5a7497788a08341012e2ea583ae9eab1fdae2e
7
- data.tar.gz: 197a7019398397c7cff18c24c5e0a5822f183d98ef9ac6f7852f0ccb782f70653941ac3eda20eeb40015303d34b6291a171b9d1777ac68d8ce32a8e2774cff72
6
+ metadata.gz: 589b3e9cf3fdd3c09cb137d6dd8183d3ffed38a4ab87329337224e2320b9555b45b201df3006002c55f04011564be28719775fac8c12d459cc61601bf1553c76
7
+ data.tar.gz: e5fbd20b89c5a55f9aefe048f74d19f6241c0b7af7d047405a455b785d8d84251ce528dcd8a1198a6c5ed62a23cfa8e1908b2d8fbd4da5f70457b3135893b67f
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexUI
4
+ class Accordion::Builder < Base
5
+ def template(&block)
6
+ render PhlexUI::Accordion.new(**attrs) do
7
+ block.call
8
+ end
9
+ end
10
+
11
+ def add_item(title, content, open: false)
12
+ render Accordion::Item.new(open: open) do
13
+ render PhlexUI::Accordion::Trigger.new do
14
+ render PhlexUI::Accordion::DefaultTrigger.new { title }
15
+ end
16
+ render PhlexUI::Accordion::Content.new do
17
+ render PhlexUI::Accordion::DefaultContent.new { content }
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,21 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PhlexUI
4
- class Accordion::Content < Base
5
- def template(&)
6
- div(**attrs, &)
7
- end
4
+ class Accordion::Content < 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
- accordion_target: "content"
15
- },
16
- class: 'overflow-y-hidden',
17
- style: 'height: 0px;'
18
- }
19
- end
11
+ def default_attrs
12
+ {
13
+ data: {
14
+ accordion_target: "content"
15
+ },
16
+ class: "overflow-y-hidden",
17
+ style: "height: 0px;"
18
+ }
20
19
  end
21
- end
20
+ end
21
+ end
@@ -1,17 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PhlexUI
4
- class Accordion::DefaultContent < Base
5
- def template(&)
6
- div(**attrs, &)
7
- end
4
+ class Accordion::DefaultContent < 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: 'pb-4 pt-0 text-sm'
14
- }
15
- end
11
+ def default_attrs
12
+ {
13
+ class: "pb-4 pt-0 text-sm"
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 Accordion::DefaultTrigger < Base
5
- def template(&)
6
- div(class: "flex items-center justify-between w-full") do
7
- p(&)
8
- render ::PhlexUI::Accordion::Icon.new
9
- end
10
- end
4
+ class Accordion::DefaultTrigger < Base
5
+ def template(&block)
6
+ div(class: "flex items-center justify-between w-full") do
7
+ p(&block)
8
+ render ::PhlexUI::Accordion::Icon.new
9
+ end
10
+ end
11
11
 
12
- def default_attrs
13
- {
14
- data: { action: "click->accordion#toggle" },
15
- class: 'w-full flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all hover:underline'
16
- }
17
- end
12
+ def default_attrs
13
+ {
14
+ data: {action: "click->accordion#toggle"},
15
+ class: "w-full flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all hover:underline"
16
+ }
18
17
  end
19
- end
18
+ end
19
+ end
@@ -1,38 +1,38 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PhlexUI
4
- class Accordion::Icon < Base
5
- def template(&block)
6
- span(**attrs) do
7
- if block
8
- block.call
9
- else
10
- icon
11
- end
12
- end
4
+ class Accordion::Icon < Base
5
+ def template(&block)
6
+ span(**attrs) do
7
+ if block
8
+ block.call
9
+ else
10
+ icon
13
11
  end
12
+ end
13
+ end
14
14
 
15
- def icon
16
- svg(
17
- xmlns: "http://www.w3.org/2000/svg",
18
- viewbox: "0 0 20 20",
19
- fill: "currentColor",
20
- class: "w-4 h-4"
21
- ) do |s|
22
- s.path(
23
- fill_rule: "evenodd",
24
- d:
25
- "M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z",
26
- clip_rule: "evenodd"
27
- )
28
- end
29
- end
15
+ def icon
16
+ svg(
17
+ xmlns: "http://www.w3.org/2000/svg",
18
+ viewbox: "0 0 20 20",
19
+ fill: "currentColor",
20
+ class: "w-4 h-4"
21
+ ) do |s|
22
+ s.path(
23
+ fill_rule: "evenodd",
24
+ d:
25
+ "M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z",
26
+ clip_rule: "evenodd"
27
+ )
28
+ end
29
+ end
30
30
 
31
- def default_attrs
32
- {
33
- class: 'opacity-50',
34
- data: { accordion_target: "icon" },
35
- }
36
- end
31
+ def default_attrs
32
+ {
33
+ class: "opacity-50",
34
+ data: {accordion_target: "icon"}
35
+ }
37
36
  end
38
- end
37
+ end
38
+ end
@@ -1,28 +1,28 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PhlexUI
4
- class Accordion::Item < Base
5
- def initialize(open: false, rotate_icon: 180, **attrs)
6
- @open = open
7
- @rotate_icon = rotate_icon
8
- super(**attrs)
9
- end
4
+ class Accordion::Item < Base
5
+ def initialize(open: false, rotate_icon: 180, **attrs)
6
+ @open = open
7
+ @rotate_icon = rotate_icon
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: "accordion",
21
- accordion_open_value: @open,
22
- accordion_rotate_icon_value: @rotate_icon
23
- },
24
- class: 'border-b'
25
- }
26
- end
17
+ def default_attrs
18
+ {
19
+ data: {
20
+ controller: "accordion",
21
+ accordion_open_value: @open,
22
+ accordion_rotate_icon_value: @rotate_icon
23
+ },
24
+ class: "border-b"
25
+ }
27
26
  end
27
+ end
28
28
  end
@@ -1,16 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PhlexUI
4
- class Accordion::Trigger < Base
5
- def template(&)
6
- button(**attrs, &)
7
- end
4
+ class Accordion::Trigger < Base
5
+ def template(&block)
6
+ button(**attrs, &block)
7
+ end
8
8
 
9
- def default_attrs
10
- {
11
- data: { action: "click->accordion#toggle" },
12
- class: 'w-full flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all hover:underline'
13
- }
14
- end
9
+ def default_attrs
10
+ {
11
+ data: {action: "click->accordion#toggle"},
12
+ class: "w-full flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all hover:underline"
13
+ }
15
14
  end
16
- end
15
+ end
16
+ end
@@ -1,28 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PhlexUI
4
- class Accordion < Base
5
- def template(&)
6
- div(**attrs, &)
7
- end
8
-
9
- def add_item(title, content, open: false)
10
- render Accordion::Item.new(open: open) do
11
- render PhlexUI::Accordion::Trigger.new do
12
- render PhlexUI::Accordion::DefaultTrigger.new { title }
13
- end
14
- render PhlexUI::Accordion::Content.new do
15
- render PhlexUI::Accordion::DefaultContent.new { content }
16
- end
17
- end
18
- end
4
+ class Accordion < Base
5
+ def template(&block)
6
+ div(**attrs, &block)
7
+ end
19
8
 
20
- private
9
+ private
21
10
 
22
- def default_attrs
23
- {
24
- class: 'w-full'
25
- }
26
- end
11
+ def default_attrs
12
+ {
13
+ class: "w-full"
14
+ }
27
15
  end
16
+ end
28
17
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexUI
4
+ class Alert::Description < Base
5
+ def template(&block)
6
+ div(**attrs, &block)
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {
13
+ class: "text-sm [&_p]:leading-relaxed"
14
+ }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexUI
4
+ class Alert::Title < Base
5
+ def template(&block)
6
+ h5(**attrs, &block)
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {
13
+ class: "mb-1 font-medium leading-none tracking-tight"
14
+ }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexUI
4
+ class Alert < Base
5
+ def initialize(variant: nil, **attrs)
6
+ @variant = variant
7
+ super(**attrs) # must be called after variant is set
8
+ end
9
+
10
+ def template(&block)
11
+ div(**attrs, &block)
12
+ end
13
+
14
+ private
15
+
16
+ def colors
17
+ case @variant
18
+ when nil
19
+ "ring-border bg-muted/20 text-foreground [&>svg]:opacity-80"
20
+ when :warning
21
+ "ring-warning/20 bg-warning/5 text-warning [&>svg]:text-warning/80"
22
+ when :success
23
+ "ring-success/20 bg-success/5 text-success [&>svg]:text-success/80"
24
+ when :destructive
25
+ "ring-destructive/20 bg-destructive/5 text-destructive [&>svg]:text-destructive/80"
26
+ end
27
+ end
28
+
29
+ def default_attrs
30
+ base_classes = "backdrop-blur relative w-full ring-1 ring-inset rounded-lg px-4 py-4 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg~*]:pl-8"
31
+ {
32
+ class: tokens(base_classes, colors)
33
+ }
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexUI
4
+ class AlertDialog::Action < Base
5
+ def template(&block)
6
+ render PhlexUI::Button.new(**attrs, &block)
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {
13
+ variant: :primary
14
+ }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexUI
4
+ class AlertDialog::Cancel < Base
5
+ def template(&block)
6
+ render PhlexUI::Button.new(**attrs, &block)
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {
13
+ variant: :outline,
14
+ data: {
15
+ action: "click->dismissable#dismiss"
16
+ },
17
+ class: "mt-2 sm:mt-0"
18
+ }
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexUI
4
+ class AlertDialog::Content < Base
5
+ def template(&block)
6
+ template_tag(**attrs) do
7
+ div(data: {controller: "dismissable"}) do
8
+ background
9
+ container(&block)
10
+ end
11
+ end
12
+ end
13
+
14
+ def background
15
+ div(
16
+ data_state: "open",
17
+ class:
18
+ "fixed 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",
19
+ style: "pointer-events:auto",
20
+ data_aria_hidden: "true",
21
+ aria_hidden: "true"
22
+ )
23
+ end
24
+
25
+ def container(&block)
26
+ div(
27
+ role: "alertdialog",
28
+ data_state: "open",
29
+ class: "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg 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",
30
+ style: "pointer-events:auto",
31
+ &block
32
+ )
33
+ end
34
+
35
+ private
36
+
37
+ def default_attrs
38
+ {
39
+ data: {
40
+ alert_dialog_target: "content"
41
+ }
42
+ }
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexUI
4
+ class AlertDialog::Description < Base
5
+ def template(&block)
6
+ p(**attrs, &block)
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 PhlexUI
4
+ class AlertDialog::Footer < Base
5
+ def template(&block)
6
+ div(**attrs, &block)
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"
14
+ }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexUI
4
+ class AlertDialog::Header < Base
5
+ def template(&block)
6
+ div(**attrs, &block)
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {
13
+ class: "flex flex-col space-y-2 text-center sm:text-left"
14
+ }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexUI
4
+ class AlertDialog::Title < Base
5
+ def template(&block)
6
+ h2(**attrs, &block)
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {
13
+ class: "text-lg font-semibold"
14
+ }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexUI
4
+ class AlertDialog::Trigger < Base
5
+ def template(&block)
6
+ div(**attrs, &block)
7
+ end
8
+
9
+ private
10
+
11
+ def default_attrs
12
+ {
13
+ data: {action: "click->alert-dialog#open"},
14
+ class: "inline-block"
15
+ }
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexUI
4
+ class AlertDialog < Base
5
+ def initialize(open: false, **attrs)
6
+ @open = open
7
+ super(**attrs)
8
+ end
9
+
10
+ def template(&block)
11
+ div(**attrs, &block)
12
+ end
13
+
14
+ private
15
+
16
+ def default_attrs
17
+ {
18
+ data: {
19
+ controller: "alert-dialog",
20
+ alert_dialog_open_value: @open
21
+ },
22
+ class: "inline-block"
23
+ }
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PhlexUI
4
+ class AspectRatio < Base
5
+ def initialize(aspect_ratio: "16/9", **attrs)
6
+ raise "aspect_ratio must be in the format of a string with a slash in the middle (eg. '16/9', '1/1')" unless aspect_ratio.is_a?(String) && aspect_ratio.include?("/")
7
+
8
+ @aspect_ratio = aspect_ratio
9
+ super(**attrs)
10
+ end
11
+
12
+ def template(&block)
13
+ div(
14
+ class: "relative w-full",
15
+ style: "padding-bottom: #{padding_bottom}%;"
16
+ ) do
17
+ div(**attrs, &block)
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def padding_bottom
24
+ @aspect_ratio.split("/").map(&:to_i).reverse.reduce(&:fdiv) * 100
25
+ end
26
+
27
+ def default_attrs
28
+ {
29
+ class: "bg-muted absolute inset-0 [&>img]:object-cover [&>img]:absolute [&>img]:h-full [&>img]:w-full [&>img]:inset-0 [&>img]:text-transparent"
30
+ }
31
+ end
32
+ end
33
+ end