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.
- checksums.yaml +4 -4
- data/lib/phlex_ui/accordion/builder.rb +22 -0
- data/lib/phlex_ui/accordion/content.rb +15 -15
- data/lib/phlex_ui/accordion/default_content.rb +11 -11
- data/lib/phlex_ui/accordion/default_trigger.rb +14 -14
- data/lib/phlex_ui/accordion/icon.rb +31 -31
- data/lib/phlex_ui/accordion/item.rb +20 -20
- data/lib/phlex_ui/accordion/trigger.rb +11 -11
- data/lib/phlex_ui/accordion.rb +10 -21
- data/lib/phlex_ui/alert/description.rb +10 -10
- data/lib/phlex_ui/alert/title.rb +10 -10
- data/lib/phlex_ui/alert.rb +27 -27
- data/lib/phlex_ui/alert_dialog/action.rb +11 -11
- data/lib/phlex_ui/alert_dialog/cancel.rb +15 -15
- data/lib/phlex_ui/alert_dialog/content.rb +36 -36
- data/lib/phlex_ui/alert_dialog/description.rb +11 -11
- data/lib/phlex_ui/alert_dialog/footer.rb +11 -11
- data/lib/phlex_ui/alert_dialog/header.rb +11 -11
- data/lib/phlex_ui/alert_dialog/title.rb +11 -11
- data/lib/phlex_ui/alert_dialog/trigger.rb +12 -12
- data/lib/phlex_ui/alert_dialog.rb +18 -18
- data/lib/phlex_ui/aspect_ratio.rb +24 -24
- data/lib/phlex_ui/attribute_merger.rb +59 -61
- data/lib/phlex_ui/avatar/builder.rb +36 -0
- data/lib/phlex_ui/avatar/fallback.rb +11 -11
- data/lib/phlex_ui/avatar/image.rb +19 -19
- data/lib/phlex_ui/avatar.rb +23 -41
- data/lib/phlex_ui/badge.rb +50 -50
- data/lib/phlex_ui/base.rb +16 -16
- data/lib/phlex_ui/button.rb +80 -80
- data/lib/phlex_ui/calendar/body.rb +19 -0
- data/lib/phlex_ui/calendar/days.rb +104 -0
- data/lib/phlex_ui/calendar/header.rb +17 -0
- data/lib/phlex_ui/calendar/next.rb +43 -0
- data/lib/phlex_ui/calendar/prev.rb +43 -0
- data/lib/phlex_ui/calendar/title.rb +27 -0
- data/lib/phlex_ui/calendar/weekdays.rb +33 -0
- data/lib/phlex_ui/calendar.rb +39 -0
- data/lib/phlex_ui/card/content.rb +11 -11
- data/lib/phlex_ui/card/description.rb +11 -11
- data/lib/phlex_ui/card/footer.rb +11 -11
- data/lib/phlex_ui/card/header.rb +11 -11
- data/lib/phlex_ui/card/title.rb +11 -11
- data/lib/phlex_ui/card.rb +11 -11
- data/lib/phlex_ui/chart.rb +23 -0
- data/lib/phlex_ui/checkbox.rb +12 -12
- data/lib/phlex_ui/clipboard/popover.rb +28 -28
- data/lib/phlex_ui/clipboard/source.rb +13 -13
- data/lib/phlex_ui/clipboard/trigger.rb +14 -14
- data/lib/phlex_ui/clipboard.rb +30 -30
- data/lib/phlex_ui/codeblock.rb +86 -86
- data/lib/phlex_ui/collapsible/content.rb +12 -12
- data/lib/phlex_ui/collapsible/trigger.rb +13 -13
- data/lib/phlex_ui/collapsible.rb +18 -18
- data/lib/phlex_ui/command/dialog.rb +17 -0
- data/lib/phlex_ui/command/dialog_content.rb +49 -0
- data/lib/phlex_ui/command/dialog_trigger.rb +29 -0
- data/lib/phlex_ui/command/empty.rb +19 -0
- data/lib/phlex_ui/command/group.rb +41 -0
- data/lib/phlex_ui/command/input.rb +56 -0
- data/lib/phlex_ui/command/item.rb +31 -0
- data/lib/phlex_ui/command/list.rb +17 -0
- data/lib/phlex_ui/command.rb +17 -0
- data/lib/phlex_ui/context_menu/content.rb +19 -19
- data/lib/phlex_ui/context_menu/item.rb +55 -55
- data/lib/phlex_ui/context_menu/label.rb +16 -16
- data/lib/phlex_ui/context_menu/separator.rb +13 -13
- data/lib/phlex_ui/context_menu/trigger.rb +14 -14
- data/lib/phlex_ui/context_menu.rb +19 -19
- data/lib/phlex_ui/dialog/content.rb +67 -67
- data/lib/phlex_ui/dialog/description.rb +11 -11
- data/lib/phlex_ui/dialog/footer.rb +11 -11
- data/lib/phlex_ui/dialog/header.rb +11 -11
- data/lib/phlex_ui/dialog/middle.rb +11 -11
- data/lib/phlex_ui/dialog/title.rb +11 -11
- data/lib/phlex_ui/dialog/trigger.rb +14 -13
- data/lib/phlex_ui/dialog.rb +18 -18
- data/lib/phlex_ui/dropdown_menu/content.rb +16 -16
- data/lib/phlex_ui/dropdown_menu/item.rb +21 -21
- data/lib/phlex_ui/dropdown_menu/label.rb +11 -11
- data/lib/phlex_ui/dropdown_menu/separator.rb +13 -13
- data/lib/phlex_ui/dropdown_menu/trigger.rb +12 -11
- data/lib/phlex_ui/dropdown_menu.rb +19 -19
- data/lib/phlex_ui/form/builder.rb +38 -0
- data/lib/phlex_ui/form/item.rb +11 -11
- data/lib/phlex_ui/form/spacer.rb +11 -11
- data/lib/phlex_ui/form.rb +9 -28
- data/lib/phlex_ui/hint.rb +11 -11
- data/lib/phlex_ui/hover_card/content.rb +16 -16
- data/lib/phlex_ui/hover_card/trigger.rb +14 -13
- data/lib/phlex_ui/hover_card.rb +20 -20
- data/lib/phlex_ui/input.rb +22 -22
- data/lib/phlex_ui/input_error.rb +11 -11
- data/lib/phlex_ui/label.rb +11 -11
- data/lib/phlex_ui/link.rb +81 -81
- data/lib/phlex_ui/popover/content.rb +16 -16
- data/lib/phlex_ui/popover/trigger.rb +14 -13
- data/lib/phlex_ui/popover.rb +18 -18
- data/lib/phlex_ui/select/builder.rb +67 -0
- data/lib/phlex_ui/select/content.rb +30 -0
- data/lib/phlex_ui/select/group.rb +15 -0
- data/lib/phlex_ui/select/input.rb +20 -0
- data/lib/phlex_ui/select/item.rb +48 -0
- data/lib/phlex_ui/select/label.rb +17 -0
- data/lib/phlex_ui/select/trigger.rb +45 -0
- data/lib/phlex_ui/select/value.rb +27 -0
- data/lib/phlex_ui/select.rb +30 -0
- data/lib/phlex_ui/sheet/content.rb +77 -0
- data/lib/phlex_ui/sheet/description.rb +17 -0
- data/lib/phlex_ui/sheet/footer.rb +17 -0
- data/lib/phlex_ui/sheet/header.rb +17 -0
- data/lib/phlex_ui/sheet/middle.rb +17 -0
- data/lib/phlex_ui/sheet/title.rb +17 -0
- data/lib/phlex_ui/sheet/trigger.rb +17 -0
- data/lib/phlex_ui/sheet.rb +17 -0
- data/lib/phlex_ui/shortcut_key.rb +11 -11
- data/lib/phlex_ui/table/body.rb +11 -11
- data/lib/phlex_ui/table/builder.rb +59 -59
- data/lib/phlex_ui/table/caption.rb +11 -11
- data/lib/phlex_ui/table/cell.rb +11 -11
- data/lib/phlex_ui/table/footer.rb +11 -11
- data/lib/phlex_ui/table/head.rb +11 -11
- data/lib/phlex_ui/table/header.rb +11 -11
- data/lib/phlex_ui/table/row.rb +11 -11
- data/lib/phlex_ui/table.rb +13 -13
- data/lib/phlex_ui/tabs/content.rb +18 -18
- data/lib/phlex_ui/tabs/list.rb +11 -11
- data/lib/phlex_ui/tabs/trigger.rb +20 -20
- data/lib/phlex_ui/tabs.rb +17 -17
- data/lib/phlex_ui/theme_toggle.rb +31 -31
- data/lib/phlex_ui/tooltip/content.rb +16 -16
- data/lib/phlex_ui/tooltip/trigger.rb +12 -11
- data/lib/phlex_ui/tooltip.rb +18 -18
- data/lib/phlex_ui/typography/blockquote.rb +11 -11
- data/lib/phlex_ui/typography/h1.rb +10 -10
- data/lib/phlex_ui/typography/h2.rb +10 -10
- data/lib/phlex_ui/typography/h3.rb +11 -11
- data/lib/phlex_ui/typography/h4.rb +11 -11
- data/lib/phlex_ui/typography/inline_code.rb +11 -11
- data/lib/phlex_ui/typography/inline_link.rb +22 -0
- data/lib/phlex_ui/typography/large.rb +11 -11
- data/lib/phlex_ui/typography/lead.rb +11 -11
- data/lib/phlex_ui/typography/list.rb +36 -36
- data/lib/phlex_ui/typography/list_item.rb +11 -11
- data/lib/phlex_ui/typography/muted.rb +11 -11
- data/lib/phlex_ui/typography/p.rb +11 -11
- data/lib/phlex_ui/typography/small.rb +11 -11
- data/lib/phlex_ui.rb +9 -4
- metadata +88 -7
data/lib/phlex_ui/popover.rb
CHANGED
@@ -1,25 +1,25 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module PhlexUI
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
class Popover < Base
|
5
|
+
def initialize(options: {}, **attrs)
|
6
|
+
@options = options
|
7
|
+
super(**attrs)
|
8
|
+
end
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
def template(&block)
|
11
|
+
div(**attrs, &block)
|
12
|
+
end
|
13
13
|
|
14
|
-
|
14
|
+
private
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
16
|
+
def default_attrs
|
17
|
+
{
|
18
|
+
data: {
|
19
|
+
controller: "popover",
|
20
|
+
popover_options_value: @options.to_json
|
21
|
+
}
|
22
|
+
}
|
24
23
|
end
|
25
|
-
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PhlexUI
|
4
|
+
class Select::Builder < Base
|
5
|
+
def initialize(object, method, collection: [], placeholder: "", value: nil, input_attrs: {}, trigger_attrs: {}, value_attrs: {}, content_attrs: {}, group_attrs: {}, item_attrs: {}, **attrs)
|
6
|
+
@object = set_object(object)
|
7
|
+
@method = method
|
8
|
+
@collection = collection
|
9
|
+
@placeholder = placeholder
|
10
|
+
@value = value || @object.send(@method)
|
11
|
+
@input_attrs = input_attrs
|
12
|
+
@trigger_attrs = trigger_attrs
|
13
|
+
@value_attrs = value_attrs
|
14
|
+
@content_attrs = content_attrs
|
15
|
+
@group_attrs = group_attrs
|
16
|
+
@item_attrs = item_attrs
|
17
|
+
super(**attrs)
|
18
|
+
end
|
19
|
+
|
20
|
+
def template
|
21
|
+
render PhlexUI::Select.new(**attrs) do
|
22
|
+
render PhlexUI::Select::Input.new(value: @object.send(@method), id: select_id, name: input_name, type: "hidden", **@input_attrs)
|
23
|
+
render PhlexUI::Select::Trigger.new(**@trigger_attrs) do
|
24
|
+
if @value
|
25
|
+
render PhlexUI::Select::Value.new(id: select_id, **@value_attrs) { @collection.find { |choice| choice[1] == @value }[0] }
|
26
|
+
else
|
27
|
+
render PhlexUI::Select::Value.new(placeholder: @placeholder, id: select_id, **@value_attrs)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
render PhlexUI::Select::Content.new(outlet_id: select_id, **@content_attrs) do
|
31
|
+
render PhlexUI::Select::Group.new(**@group_attrs) do
|
32
|
+
@collection.each do |choice|
|
33
|
+
render PhlexUI::Select::Item.new(value: choice[1], selected: @object&.send(@method) == choice[1], **@item_attrs) { choice[0] }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def select_id
|
43
|
+
"#{object_name}_#{@method}"
|
44
|
+
end
|
45
|
+
|
46
|
+
def input_name
|
47
|
+
"#{object_name}[#{@method}]"
|
48
|
+
end
|
49
|
+
|
50
|
+
def object_name
|
51
|
+
@object.class.name.underscore
|
52
|
+
end
|
53
|
+
|
54
|
+
def set_object(object)
|
55
|
+
# if string convert to new instance of object
|
56
|
+
if object.is_a?(String)
|
57
|
+
object.classify.constantize.new
|
58
|
+
else
|
59
|
+
object
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def default_attrs
|
64
|
+
{}
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PhlexUI
|
4
|
+
class Select::Content < Base
|
5
|
+
def initialize(outlet_id: nil, **attrs)
|
6
|
+
@outlet_id = outlet_id
|
7
|
+
super(**attrs)
|
8
|
+
end
|
9
|
+
|
10
|
+
def template(&block)
|
11
|
+
template_tag(data: {popover_target: "content"}) do
|
12
|
+
div(**attrs, &block)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def default_attrs
|
19
|
+
{
|
20
|
+
data: {
|
21
|
+
state: :open,
|
22
|
+
controller: "select",
|
23
|
+
select_input_outlet: "#" + @outlet_id,
|
24
|
+
select_text_outlet: "#" + @outlet_id
|
25
|
+
},
|
26
|
+
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"
|
27
|
+
}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PhlexUI
|
4
|
+
class Select::Input < Base
|
5
|
+
def template
|
6
|
+
render PhlexUI::Input.new(**attrs)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def default_attrs
|
12
|
+
{
|
13
|
+
class: "hidden",
|
14
|
+
data: {
|
15
|
+
controller: "input"
|
16
|
+
}
|
17
|
+
}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PhlexUI
|
4
|
+
class Select::Item < Base
|
5
|
+
def initialize(value: nil, **attrs)
|
6
|
+
@value = value
|
7
|
+
super(**attrs)
|
8
|
+
end
|
9
|
+
|
10
|
+
def template(&block)
|
11
|
+
div(**attrs) do
|
12
|
+
block&.call
|
13
|
+
selected_icon
|
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 20 20",
|
23
|
+
fill: "currentColor",
|
24
|
+
class: "w-4 h-4 absolute right-2 top-1/2 transform -translate-y-1/2 hidden group-data-[selected=true]/selectitem:block"
|
25
|
+
) do |s|
|
26
|
+
s.path(
|
27
|
+
fill_rule: "evenodd",
|
28
|
+
d:
|
29
|
+
"M16.704 4.153a.75.75 0 0 1 .143 1.052l-8 10.5a.75.75 0 0 1-1.127.075l-4.5-4.5a.75.75 0 0 1 1.06-1.06l3.894 3.893 7.48-9.817a.75.75 0 0 1 1.05-.143Z",
|
30
|
+
clip_rule: "evenodd"
|
31
|
+
)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def default_attrs
|
36
|
+
{
|
37
|
+
role: "menuitem",
|
38
|
+
class: "group/selectitem 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",
|
39
|
+
data_action: "click->popover#close click->select#selectItem",
|
40
|
+
data_popover_target: "menuItem",
|
41
|
+
data_select_target: "item",
|
42
|
+
data_value: @value,
|
43
|
+
data_orientation: "vertical",
|
44
|
+
tabindex: "-1"
|
45
|
+
}
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PhlexUI
|
4
|
+
class Select::Trigger < Base
|
5
|
+
def 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
|
+
width: "15",
|
17
|
+
height: "15",
|
18
|
+
viewbox: "0 0 15 15",
|
19
|
+
fill: "none",
|
20
|
+
xmlns: "http://www.w3.org/2000/svg",
|
21
|
+
class: "h-4 w-4 opacity-50 shrink-0 ml-2 -mr-1",
|
22
|
+
aria_hidden: "true"
|
23
|
+
) do |s|
|
24
|
+
s.path(
|
25
|
+
d:
|
26
|
+
"M4.93179 5.43179C4.75605 5.60753 4.75605 5.89245 4.93179 6.06819C5.10753 6.24392 5.39245 6.24392 5.56819 6.06819L7.49999 4.13638L9.43179 6.06819C9.60753 6.24392 9.89245 6.24392 10.0682 6.06819C10.2439 5.89245 10.2439 5.60753 10.0682 5.43179L7.81819 3.18179C7.73379 3.0974 7.61933 3.04999 7.49999 3.04999C7.38064 3.04999 7.26618 3.0974 7.18179 3.18179L4.93179 5.43179ZM10.0682 9.56819C10.2439 9.39245 10.2439 9.10753 10.0682 8.93179C9.89245 8.75606 9.60753 8.75606 9.43179 8.93179L7.49999 10.8636L5.56819 8.93179C5.39245 8.75606 5.10753 8.75606 4.93179 8.93179C4.75605 9.10753 4.75605 9.39245 4.93179 9.56819L7.18179 11.8182C7.35753 11.9939 7.64245 11.9939 7.81819 11.8182L10.0682 9.56819Z",
|
27
|
+
fill: "currentColor",
|
28
|
+
fill_rule: "evenodd",
|
29
|
+
clip_rule: "evenodd"
|
30
|
+
)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def default_attrs
|
35
|
+
{
|
36
|
+
data: {
|
37
|
+
popover_target: "trigger"
|
38
|
+
},
|
39
|
+
type: "button",
|
40
|
+
class:
|
41
|
+
"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 [& amp;>span]:line-clamp-1"
|
42
|
+
}
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PhlexUI
|
4
|
+
class Select::Value < Base
|
5
|
+
def initialize(placeholder: nil, **attrs)
|
6
|
+
@placeholder = placeholder
|
7
|
+
super(**attrs)
|
8
|
+
end
|
9
|
+
|
10
|
+
def 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
|
+
controller: "text"
|
22
|
+
},
|
23
|
+
class: "pointer-events-none"
|
24
|
+
}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PhlexUI
|
4
|
+
class Select < Base
|
5
|
+
def initialize(options: {}, **attrs)
|
6
|
+
@options = options
|
7
|
+
@options[:trigger] ||= "click"
|
8
|
+
@options[:duration] ||= [500, 0]
|
9
|
+
@options[:placement] ||= "bottom-start"
|
10
|
+
super(**attrs)
|
11
|
+
end
|
12
|
+
|
13
|
+
def template(&block)
|
14
|
+
div(**attrs, &block)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def default_attrs
|
20
|
+
{
|
21
|
+
data: {
|
22
|
+
controller: "popover",
|
23
|
+
popover_match_width_value: "true",
|
24
|
+
popover_options_value: @options.to_json
|
25
|
+
},
|
26
|
+
class: "w-full"
|
27
|
+
}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PhlexUI
|
4
|
+
class Sheet::Content < 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 template(&block)
|
19
|
+
template_tag(data: { sheet_target: "content" }) do
|
20
|
+
div(data: { controller: 'dismissable' }) do
|
21
|
+
backdrop
|
22
|
+
div(**attrs) do
|
23
|
+
block.call if block_given?
|
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->dismissable#dismiss"
|
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->dismissable#dismiss",
|
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 PhlexUI
|
4
|
+
class Sheet::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 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 PhlexUI
|
4
|
+
class Sheet::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-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 PhlexUI
|
4
|
+
class Sheet::Title < Base
|
5
|
+
def template(&block)
|
6
|
+
h3(**attrs, &block)
|
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
|
@@ -1,17 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module PhlexUI
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
class ShortcutKey < Base
|
5
|
+
def template(&block)
|
6
|
+
kbd(**attrs, &block)
|
7
|
+
end
|
8
8
|
|
9
|
-
|
9
|
+
private
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
end
|
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
|
+
}
|
16
15
|
end
|
17
|
-
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/phlex_ui/table/body.rb
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module PhlexUI
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
class Table::Body < Base
|
5
|
+
def template(&block)
|
6
|
+
tbody(**attrs, &block)
|
7
|
+
end
|
8
8
|
|
9
|
-
|
9
|
+
private
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
end
|
11
|
+
def default_attrs
|
12
|
+
{
|
13
|
+
class: "[&_tr:last-child]:border-0"
|
14
|
+
}
|
16
15
|
end
|
17
|
-
end
|
16
|
+
end
|
17
|
+
end
|