phlex_ui 0.0.5 → 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.
- 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/base.rb
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
module PhlexUI
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
class Base < Phlex::HTML
|
|
5
|
+
attr_reader :attrs
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
7
|
+
def initialize(**user_attrs)
|
|
8
|
+
@attrs = PhlexUI::AttributeMerger.new(default_attrs, user_attrs).call
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
if defined?(Rails) && Rails.env.development?
|
|
12
|
+
def before_template
|
|
13
|
+
comment { "Before #{self.class.name}" }
|
|
14
|
+
super
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
private
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
end
|
|
20
|
+
def default_attrs
|
|
21
|
+
{}
|
|
23
22
|
end
|
|
23
|
+
end
|
|
24
24
|
end
|
data/lib/phlex_ui/button.rb
CHANGED
|
@@ -1,96 +1,96 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
module PhlexUI
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
class Button < Base
|
|
5
|
+
def initialize(variant: :primary, size: :md, icon: false, **attrs)
|
|
6
|
+
@variant = variant.to_sym
|
|
7
|
+
@size = size.to_sym
|
|
8
|
+
@icon = icon
|
|
9
|
+
super(**attrs)
|
|
10
|
+
end
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
def template(&block)
|
|
13
|
+
button(**attrs, &block)
|
|
14
|
+
end
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
private
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
end
|
|
26
|
-
else
|
|
27
|
-
case @size
|
|
28
|
-
when :sm then "px-3 py-1.5 h-8 text-xs"
|
|
29
|
-
when :md then "px-4 py-2 h-9 text-sm"
|
|
30
|
-
when :lg then "px-4 py-2 h-10 text-base"
|
|
31
|
-
when :xl then "px-6 py-3 h-12 text-base"
|
|
32
|
-
end
|
|
33
|
-
end
|
|
18
|
+
def size_classes
|
|
19
|
+
if @icon
|
|
20
|
+
case @size
|
|
21
|
+
when :sm then "h-6 w-6"
|
|
22
|
+
when :md then "h-9 w-9"
|
|
23
|
+
when :lg then "h-10 w-10"
|
|
24
|
+
when :xl then "h-12 w-12"
|
|
34
25
|
end
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
26
|
+
else
|
|
27
|
+
case @size
|
|
28
|
+
when :sm then "px-3 py-1.5 h-8 text-xs"
|
|
29
|
+
when :md then "px-4 py-2 h-9 text-sm"
|
|
30
|
+
when :lg then "px-4 py-2 h-10 text-base"
|
|
31
|
+
when :xl then "px-6 py-3 h-12 text-base"
|
|
41
32
|
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
42
35
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
36
|
+
def primary_classes
|
|
37
|
+
tokens(
|
|
38
|
+
"whitespace-nowrap inline-flex items-center justify-center rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 bg-primary text-primary-foreground shadow hover:bg-primary/90",
|
|
39
|
+
size_classes
|
|
40
|
+
)
|
|
41
|
+
end
|
|
49
42
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
43
|
+
def link_classes
|
|
44
|
+
tokens(
|
|
45
|
+
"whitespace-nowrap inline-flex items-center justify-center rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 text-primary underline-offset-4 hover:underline",
|
|
46
|
+
size_classes
|
|
47
|
+
)
|
|
48
|
+
end
|
|
56
49
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
50
|
+
def secondary_classes
|
|
51
|
+
tokens(
|
|
52
|
+
"whitespace-nowrap inline-flex items-center justify-center rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 bg-secondary text-secondary-foreground hover:bg-opacity-80",
|
|
53
|
+
size_classes
|
|
54
|
+
)
|
|
55
|
+
end
|
|
63
56
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
57
|
+
def destructive_classes
|
|
58
|
+
tokens(
|
|
59
|
+
"whitespace-nowrap inline-flex items-center justify-center rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
|
|
60
|
+
size_classes
|
|
61
|
+
)
|
|
62
|
+
end
|
|
70
63
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
64
|
+
def outline_classes
|
|
65
|
+
tokens(
|
|
66
|
+
"whitespace-nowrap inline-flex items-center justify-center rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
|
|
67
|
+
size_classes
|
|
68
|
+
)
|
|
69
|
+
end
|
|
77
70
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
when :outline then outline_classes
|
|
85
|
-
when :ghost then ghost_classes
|
|
86
|
-
end
|
|
87
|
-
end
|
|
71
|
+
def ghost_classes
|
|
72
|
+
tokens(
|
|
73
|
+
"whitespace-nowrap inline-flex items-center justify-center rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 hover:bg-accent hover:text-accent-foreground",
|
|
74
|
+
size_classes
|
|
75
|
+
)
|
|
76
|
+
end
|
|
88
77
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
78
|
+
def default_classes
|
|
79
|
+
case @variant
|
|
80
|
+
when :primary then primary_classes
|
|
81
|
+
when :link then link_classes
|
|
82
|
+
when :secondary then secondary_classes
|
|
83
|
+
when :destructive then destructive_classes
|
|
84
|
+
when :outline then outline_classes
|
|
85
|
+
when :ghost then ghost_classes
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def default_attrs
|
|
90
|
+
{
|
|
91
|
+
type: "button",
|
|
92
|
+
class: default_classes
|
|
93
|
+
}
|
|
95
94
|
end
|
|
96
|
-
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module PhlexUI
|
|
4
|
+
class Calendar::Days < Base
|
|
5
|
+
BASE_CLASS = "inline-flex items-center justify-center rounded-md text-sm ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 h-8 w-8 p-0 font-normal aria-selected:opacity-100"
|
|
6
|
+
|
|
7
|
+
def template
|
|
8
|
+
render_selected_date_template
|
|
9
|
+
render_today_date_template
|
|
10
|
+
render_current_month_date_template
|
|
11
|
+
render_other_month_date_template
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
private
|
|
15
|
+
|
|
16
|
+
def render_selected_date_template
|
|
17
|
+
date_template("selectedDateTemplate") do
|
|
18
|
+
button(
|
|
19
|
+
data_day: "{{day}}",
|
|
20
|
+
data_action: " click->calendar#selectDay",
|
|
21
|
+
name: "day",
|
|
22
|
+
class:
|
|
23
|
+
tokens(
|
|
24
|
+
BASE_CLASS,
|
|
25
|
+
"bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground"
|
|
26
|
+
),
|
|
27
|
+
role: "gridcell",
|
|
28
|
+
tabindex: "0",
|
|
29
|
+
type: "button",
|
|
30
|
+
aria_selected: "true"
|
|
31
|
+
) { "{{dayDate}}" }
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def render_today_date_template
|
|
36
|
+
date_template("todayDateTemplate") do
|
|
37
|
+
button(
|
|
38
|
+
data_day: "{{day}}",
|
|
39
|
+
data_action: " click->calendar#selectDay",
|
|
40
|
+
name: "day",
|
|
41
|
+
class:
|
|
42
|
+
tokens(
|
|
43
|
+
BASE_CLASS,
|
|
44
|
+
"bg-accent text-accent-foreground hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground"
|
|
45
|
+
),
|
|
46
|
+
role: "gridcell",
|
|
47
|
+
tabindex: "-1",
|
|
48
|
+
type: "button"
|
|
49
|
+
) { "{{dayDate}}" }
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def render_current_month_date_template
|
|
54
|
+
date_template("currentMonthDateTemplate") do
|
|
55
|
+
button(
|
|
56
|
+
data_day: "{{day}}",
|
|
57
|
+
data_action: " click->calendar#selectDay",
|
|
58
|
+
name: "day",
|
|
59
|
+
class:
|
|
60
|
+
tokens(
|
|
61
|
+
BASE_CLASS,
|
|
62
|
+
"bg-background text-foreground hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground"
|
|
63
|
+
),
|
|
64
|
+
role: "gridcell",
|
|
65
|
+
tabindex: "-1",
|
|
66
|
+
type: "button"
|
|
67
|
+
) { "{{dayDate}}" }
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def render_other_month_date_template
|
|
72
|
+
date_template("otherMonthDateTemplate") do
|
|
73
|
+
button(
|
|
74
|
+
data_day: "{{day}}",
|
|
75
|
+
data_action: " click->calendar#selectDay",
|
|
76
|
+
name: "day",
|
|
77
|
+
class:
|
|
78
|
+
tokens(
|
|
79
|
+
BASE_CLASS,
|
|
80
|
+
"bg-background text-muted-foreground hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground"
|
|
81
|
+
),
|
|
82
|
+
role: "gridcell",
|
|
83
|
+
tabindex: "-1",
|
|
84
|
+
type: "button"
|
|
85
|
+
) { "{{dayDate}}" }
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def date_template(target, &block)
|
|
90
|
+
template_tag(data: { calendar_target: target }) do
|
|
91
|
+
td(
|
|
92
|
+
class:
|
|
93
|
+
"relative p-0 text-center text-sm focus-within:relative focus-within:z-20 [&:has([aria-selected])]:bg-accent [&:has([aria-selected])]:rounded-md",
|
|
94
|
+
role: "presentation",
|
|
95
|
+
&block
|
|
96
|
+
)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def default_attrs
|
|
101
|
+
{}
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module PhlexUI
|
|
4
|
+
class Calendar::Header < Base
|
|
5
|
+
def template(&block)
|
|
6
|
+
div(**attrs, &block)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
private
|
|
10
|
+
|
|
11
|
+
def default_attrs
|
|
12
|
+
{
|
|
13
|
+
class: "flex justify-center pt-1 relative items-center",
|
|
14
|
+
}
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module PhlexUI
|
|
4
|
+
class Calendar::Next < Base
|
|
5
|
+
def template(&block)
|
|
6
|
+
button(**attrs) do
|
|
7
|
+
icon
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
def icon
|
|
14
|
+
svg(
|
|
15
|
+
width: "15",
|
|
16
|
+
height: "15",
|
|
17
|
+
viewbox: "0 0 15 15",
|
|
18
|
+
fill: "none",
|
|
19
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
20
|
+
class: "h-4 w-4"
|
|
21
|
+
) do |s|
|
|
22
|
+
s.path(
|
|
23
|
+
d:
|
|
24
|
+
"M6.1584 3.13508C6.35985 2.94621 6.67627 2.95642 6.86514 3.15788L10.6151 7.15788C10.7954 7.3502 10.7954 7.64949 10.6151 7.84182L6.86514 11.8418C6.67627 12.0433 6.35985 12.0535 6.1584 11.8646C5.95694 11.6757 5.94673 11.3593 6.1356 11.1579L9.565 7.49985L6.1356 3.84182C5.94673 3.64036 5.95694 3.32394 6.1584 3.13508Z",
|
|
25
|
+
fill: "currentColor",
|
|
26
|
+
fill_rule: "evenodd",
|
|
27
|
+
clip_rule: "evenodd"
|
|
28
|
+
)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def default_attrs
|
|
33
|
+
{
|
|
34
|
+
name: "next-month",
|
|
35
|
+
aria_label: "Go to next month",
|
|
36
|
+
class:
|
|
37
|
+
"inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border border-input hover:bg-accent hover:text-accent-foreground h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100 absolute right-1",
|
|
38
|
+
type: "button",
|
|
39
|
+
data_action: "click->calendar#nextMonth"
|
|
40
|
+
}
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module PhlexUI
|
|
4
|
+
class Calendar::Prev < Base
|
|
5
|
+
def template(&block)
|
|
6
|
+
button(**attrs) do
|
|
7
|
+
icon
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
def icon
|
|
14
|
+
svg(
|
|
15
|
+
width: "15",
|
|
16
|
+
height: "15",
|
|
17
|
+
viewbox: "0 0 15 15",
|
|
18
|
+
fill: "none",
|
|
19
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
20
|
+
class: "h-4 w-4"
|
|
21
|
+
) do |s|
|
|
22
|
+
s.path(
|
|
23
|
+
d:
|
|
24
|
+
"M8.84182 3.13514C9.04327 3.32401 9.05348 3.64042 8.86462 3.84188L5.43521 7.49991L8.86462 11.1579C9.05348 11.3594 9.04327 11.6758 8.84182 11.8647C8.64036 12.0535 8.32394 12.0433 8.13508 11.8419L4.38508 7.84188C4.20477 7.64955 4.20477 7.35027 4.38508 7.15794L8.13508 3.15794C8.32394 2.95648 8.64036 2.94628 8.84182 3.13514Z",
|
|
25
|
+
fill: "currentColor",
|
|
26
|
+
fill_rule: "evenodd",
|
|
27
|
+
clip_rule: "evenodd"
|
|
28
|
+
)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def default_attrs
|
|
33
|
+
{
|
|
34
|
+
name: "previous-month",
|
|
35
|
+
aria_label: "Go to previous month",
|
|
36
|
+
class:
|
|
37
|
+
"rdp-button_reset rdp-button inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border border-input hover:bg-accent hover:text-accent-foreground h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100 absolute left-1",
|
|
38
|
+
type: "button",
|
|
39
|
+
data_action: "click->calendar#prevMonth"
|
|
40
|
+
}
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module PhlexUI
|
|
4
|
+
class Calendar::Title < Base
|
|
5
|
+
def initialize(default: "Month Year", **attrs)
|
|
6
|
+
@default = default
|
|
7
|
+
super(**attrs)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def template
|
|
11
|
+
div(**attrs) { @default }
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
private
|
|
15
|
+
|
|
16
|
+
def default_attrs
|
|
17
|
+
{
|
|
18
|
+
class: "text-sm font-medium",
|
|
19
|
+
aria_live: "polite",
|
|
20
|
+
role: "presentation",
|
|
21
|
+
data: {
|
|
22
|
+
calendar_target: "title"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module PhlexUI
|
|
4
|
+
class Calendar::Weekdays < Base
|
|
5
|
+
DAYS = %w[Monday Tuesday Wednesday Thursday Friday Saturday Sunday].freeze
|
|
6
|
+
|
|
7
|
+
def template
|
|
8
|
+
template_tag(data: { calendar_target: "weekdaysTemplate" }) do
|
|
9
|
+
thead(**attrs) do
|
|
10
|
+
tr(class: "flex") do
|
|
11
|
+
DAYS.each do |day|
|
|
12
|
+
render_day(day)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def render_day(day)
|
|
22
|
+
th(
|
|
23
|
+
scope: "col",
|
|
24
|
+
class: "text-muted-foreground rounded-md w-8 font-normal text-[0.8rem]",
|
|
25
|
+
aria_label: day
|
|
26
|
+
) { day[0..1] }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def default_attrs
|
|
30
|
+
{}
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module PhlexUI
|
|
4
|
+
class Calendar < Base
|
|
5
|
+
def initialize(selected_date: nil, input_id: nil, date_format: 'yyyy-MM-dd', **attrs)
|
|
6
|
+
@selected_date = selected_date
|
|
7
|
+
@input_id = input_id
|
|
8
|
+
@date_format = date_format
|
|
9
|
+
super(**attrs)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def template
|
|
13
|
+
div(**attrs) do
|
|
14
|
+
render PhlexUI::Calendar::Header.new do
|
|
15
|
+
render PhlexUI::Calendar::Title.new
|
|
16
|
+
render PhlexUI::Calendar::Prev.new
|
|
17
|
+
render PhlexUI::Calendar::Next.new
|
|
18
|
+
end
|
|
19
|
+
render PhlexUI::Calendar::Body.new # Where the calendar is rendered (Weekdays and Days)
|
|
20
|
+
render PhlexUI::Calendar::Weekdays.new # Template for the weekdays
|
|
21
|
+
render PhlexUI::Calendar::Days.new # Template for the days
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
def default_attrs
|
|
28
|
+
{
|
|
29
|
+
class: "p-3 space-y-4",
|
|
30
|
+
data: {
|
|
31
|
+
controller: "calendar",
|
|
32
|
+
calendar_selected_date_value: @selected_date&.to_s,
|
|
33
|
+
calendar_format_value: @date_format,
|
|
34
|
+
calendar_input_outlet: @input_id,
|
|
35
|
+
},
|
|
36
|
+
}
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
module PhlexUI
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
class Card::Content < Base
|
|
5
|
+
def template(&block)
|
|
6
|
+
div(**attrs, &block)
|
|
7
|
+
end
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
private
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
end
|
|
11
|
+
def default_attrs
|
|
12
|
+
{
|
|
13
|
+
class: "p-6 pt-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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
class Card::Description < Base
|
|
5
|
+
def template(&block)
|
|
6
|
+
p(**attrs, &block)
|
|
7
|
+
end
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
private
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
data/lib/phlex_ui/card/footer.rb
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
module PhlexUI
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
class Card::Footer < Base
|
|
5
|
+
def template(&block)
|
|
6
|
+
div(**attrs, &block)
|
|
7
|
+
end
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
private
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
end
|
|
11
|
+
def default_attrs
|
|
12
|
+
{
|
|
13
|
+
class: "items-center p-6 pt-0"
|
|
14
|
+
}
|
|
16
15
|
end
|
|
17
|
-
end
|
|
16
|
+
end
|
|
17
|
+
end
|
data/lib/phlex_ui/card/header.rb
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
module PhlexUI
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
class Card::Header < Base
|
|
5
|
+
def template(&block)
|
|
6
|
+
div(**attrs, &block)
|
|
7
|
+
end
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
private
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
end
|
|
11
|
+
def default_attrs
|
|
12
|
+
{
|
|
13
|
+
class: "flex flex-col space-y-1.5 p-6"
|
|
14
|
+
}
|
|
16
15
|
end
|
|
17
|
-
end
|
|
16
|
+
end
|
|
17
|
+
end
|