ruby_ui 1.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/generators/ruby_ui/component_generator.rb +130 -0
- data/lib/generators/ruby_ui/install/install_generator.rb +90 -0
- data/lib/generators/ruby_ui/javascript_utils.rb +36 -0
- data/lib/ruby_ui/accordion/accordion.rb +17 -0
- data/lib/ruby_ui/accordion/accordion_content.rb +21 -0
- data/lib/ruby_ui/accordion/accordion_default_content.rb +17 -0
- data/lib/ruby_ui/accordion/accordion_default_trigger.rb +19 -0
- data/lib/ruby_ui/accordion/accordion_icon.rb +38 -0
- data/lib/ruby_ui/accordion/accordion_item.rb +28 -0
- data/lib/ruby_ui/accordion/accordion_trigger.rb +17 -0
- data/lib/ruby_ui/alert/alert.rb +36 -0
- data/lib/ruby_ui/alert/alert_description.rb +17 -0
- data/lib/ruby_ui/alert/alert_title.rb +17 -0
- data/lib/ruby_ui/alert_dialog/alert_dialog.rb +26 -0
- data/lib/ruby_ui/alert_dialog/alert_dialog_action.rb +17 -0
- data/lib/ruby_ui/alert_dialog/alert_dialog_cancel.rb +21 -0
- data/lib/ruby_ui/alert_dialog/alert_dialog_content.rb +45 -0
- data/lib/ruby_ui/alert_dialog/alert_dialog_description.rb +17 -0
- data/lib/ruby_ui/alert_dialog/alert_dialog_footer.rb +17 -0
- data/lib/ruby_ui/alert_dialog/alert_dialog_header.rb +17 -0
- data/lib/ruby_ui/alert_dialog/alert_dialog_title.rb +17 -0
- data/lib/ruby_ui/alert_dialog/alert_dialog_trigger.rb +18 -0
- data/lib/ruby_ui/aspect_ratio/aspect_ratio.rb +33 -0
- data/lib/ruby_ui/avatar/avatar.rb +31 -0
- data/lib/ruby_ui/avatar/avatar_fallback.rb +17 -0
- data/lib/ruby_ui/avatar/avatar_image.rb +26 -0
- data/lib/ruby_ui/badge/badge.rb +60 -0
- data/lib/ruby_ui/base.rb +22 -0
- data/lib/ruby_ui/button/button.rb +97 -0
- data/lib/ruby_ui/calendar/calendar.rb +39 -0
- data/lib/ruby_ui/calendar/calendar_body.rb +19 -0
- data/lib/ruby_ui/calendar/calendar_days.rb +104 -0
- data/lib/ruby_ui/calendar/calendar_header.rb +17 -0
- data/lib/ruby_ui/calendar/calendar_next.rb +43 -0
- data/lib/ruby_ui/calendar/calendar_prev.rb +43 -0
- data/lib/ruby_ui/calendar/calendar_title.rb +27 -0
- data/lib/ruby_ui/calendar/calendar_weekdays.rb +33 -0
- data/lib/ruby_ui/card/card.rb +17 -0
- data/lib/ruby_ui/card/card_content.rb +17 -0
- data/lib/ruby_ui/card/card_description.rb +17 -0
- data/lib/ruby_ui/card/card_footer.rb +17 -0
- data/lib/ruby_ui/card/card_header.rb +17 -0
- data/lib/ruby_ui/card/card_title.rb +17 -0
- data/lib/ruby_ui/chart/chart.rb +23 -0
- data/lib/ruby_ui/checkbox/checkbox.rb +23 -0
- data/lib/ruby_ui/checkbox/checkbox_group.rb +20 -0
- data/lib/ruby_ui/clipboard/clipboard.rb +42 -0
- data/lib/ruby_ui/clipboard/clipboard_popover.rb +40 -0
- data/lib/ruby_ui/clipboard/clipboard_source.rb +19 -0
- data/lib/ruby_ui/clipboard/clipboard_trigger.rb +20 -0
- data/lib/ruby_ui/codeblock/codeblock.rb +102 -0
- data/lib/ruby_ui/collapsible/collapsible.rb +25 -0
- data/lib/ruby_ui/collapsible/collapsible_content.rb +18 -0
- data/lib/ruby_ui/collapsible/collapsible_trigger.rb +19 -0
- data/lib/ruby_ui/combobox/combobox.rb +24 -0
- data/lib/ruby_ui/combobox/combobox_content.rb +31 -0
- data/lib/ruby_ui/combobox/combobox_empty.rb +21 -0
- data/lib/ruby_ui/combobox/combobox_group.rb +38 -0
- data/lib/ruby_ui/combobox/combobox_input.rb +22 -0
- data/lib/ruby_ui/combobox/combobox_item.rb +53 -0
- data/lib/ruby_ui/combobox/combobox_list.rb +27 -0
- data/lib/ruby_ui/combobox/combobox_search_input.rb +56 -0
- data/lib/ruby_ui/combobox/combobox_separator.rb +15 -0
- data/lib/ruby_ui/combobox/combobox_trigger.rb +52 -0
- data/lib/ruby_ui/combobox/combobox_value.rb +27 -0
- data/lib/ruby_ui/command/command.rb +9 -0
- data/lib/ruby_ui/command/command_dialog.rb +17 -0
- data/lib/ruby_ui/command/command_dialog_content.rb +48 -0
- data/lib/ruby_ui/command/command_dialog_trigger.rb +29 -0
- data/lib/ruby_ui/command/command_empty.rb +19 -0
- data/lib/ruby_ui/command/command_group.rb +40 -0
- data/lib/ruby_ui/command/command_input.rb +56 -0
- data/lib/ruby_ui/command/command_item.rb +32 -0
- data/lib/ruby_ui/command/command_list.rb +17 -0
- data/lib/ruby_ui/context_menu/context_menu.rb +26 -0
- data/lib/ruby_ui/context_menu/context_menu_content.rb +25 -0
- data/lib/ruby_ui/context_menu/context_menu_item.rb +66 -0
- data/lib/ruby_ui/context_menu/context_menu_label.rb +24 -0
- data/lib/ruby_ui/context_menu/context_menu_separator.rb +19 -0
- data/lib/ruby_ui/context_menu/context_menu_trigger.rb +20 -0
- data/lib/ruby_ui/dialog/dialog.rb +25 -0
- data/lib/ruby_ui/dialog/dialog_content.rb +78 -0
- data/lib/ruby_ui/dialog/dialog_description.rb +17 -0
- data/lib/ruby_ui/dialog/dialog_footer.rb +17 -0
- data/lib/ruby_ui/dialog/dialog_header.rb +17 -0
- data/lib/ruby_ui/dialog/dialog_middle.rb +17 -0
- data/lib/ruby_ui/dialog/dialog_title.rb +17 -0
- data/lib/ruby_ui/dialog/dialog_trigger.rb +20 -0
- data/lib/ruby_ui/dropdown_menu/dropdown_menu.rb +26 -0
- data/lib/ruby_ui/dropdown_menu/dropdown_menu_content.rb +22 -0
- data/lib/ruby_ui/dropdown_menu/dropdown_menu_item.rb +28 -0
- data/lib/ruby_ui/dropdown_menu/dropdown_menu_label.rb +17 -0
- data/lib/ruby_ui/dropdown_menu/dropdown_menu_separator.rb +19 -0
- data/lib/ruby_ui/dropdown_menu/dropdown_menu_trigger.rb +18 -0
- data/lib/ruby_ui/form/form.rb +15 -0
- data/lib/ruby_ui/form/form_field.rb +20 -0
- data/lib/ruby_ui/form/form_field_error.rb +20 -0
- data/lib/ruby_ui/form/form_field_hint.rb +15 -0
- data/lib/ruby_ui/form/form_field_label.rb +15 -0
- data/lib/ruby_ui/hover_card/hover_card.rb +27 -0
- data/lib/ruby_ui/hover_card/hover_card_content.rb +22 -0
- data/lib/ruby_ui/hover_card/hover_card_trigger.rb +20 -0
- data/lib/ruby_ui/input/input.rb +26 -0
- data/lib/ruby_ui/link/link.rb +97 -0
- data/lib/ruby_ui/masked_input/masked_input.rb +15 -0
- data/lib/ruby_ui/pagination/pagination.rb +19 -0
- data/lib/ruby_ui/pagination/pagination_content.rb +17 -0
- data/lib/ruby_ui/pagination/pagination_ellipsis.rb +42 -0
- data/lib/ruby_ui/pagination/pagination_item.rb +28 -0
- data/lib/ruby_ui/popover/popover.rb +26 -0
- data/lib/ruby_ui/popover/popover_content.rb +27 -0
- data/lib/ruby_ui/popover/popover_trigger.rb +20 -0
- data/lib/ruby_ui/radio_button/radio_button.rb +22 -0
- data/lib/ruby_ui/select/select.rb +23 -0
- data/lib/ruby_ui/select/select_content.rb +32 -0
- data/lib/ruby_ui/select/select_group.rb +15 -0
- data/lib/ruby_ui/select/select_input.rb +22 -0
- data/lib/ruby_ui/select/select_item.rb +52 -0
- data/lib/ruby_ui/select/select_label.rb +17 -0
- data/lib/ruby_ui/select/select_trigger.rb +54 -0
- data/lib/ruby_ui/select/select_value.rb +27 -0
- data/lib/ruby_ui/sheet/sheet.rb +17 -0
- data/lib/ruby_ui/sheet/sheet_content.rb +77 -0
- data/lib/ruby_ui/sheet/sheet_description.rb +17 -0
- data/lib/ruby_ui/sheet/sheet_footer.rb +17 -0
- data/lib/ruby_ui/sheet/sheet_header.rb +17 -0
- data/lib/ruby_ui/sheet/sheet_middle.rb +17 -0
- data/lib/ruby_ui/sheet/sheet_title.rb +17 -0
- data/lib/ruby_ui/sheet/sheet_trigger.rb +17 -0
- data/lib/ruby_ui/shortcut_key/shortcut_key.rb +17 -0
- data/lib/ruby_ui/table/table.rb +19 -0
- data/lib/ruby_ui/table/table_body.rb +17 -0
- data/lib/ruby_ui/table/table_caption.rb +17 -0
- data/lib/ruby_ui/table/table_cell.rb +17 -0
- data/lib/ruby_ui/table/table_footer.rb +17 -0
- data/lib/ruby_ui/table/table_head.rb +17 -0
- data/lib/ruby_ui/table/table_header.rb +17 -0
- data/lib/ruby_ui/table/table_row.rb +17 -0
- data/lib/ruby_ui/tabs/tabs.rb +25 -0
- data/lib/ruby_ui/tabs/tabs_content.rb +26 -0
- data/lib/ruby_ui/tabs/tabs_list.rb +17 -0
- data/lib/ruby_ui/tabs/tabs_trigger.rb +28 -0
- data/lib/ruby_ui/textarea/textarea.rb +26 -0
- data/lib/ruby_ui/theme_toggle/theme_toggle.rb +41 -0
- data/lib/ruby_ui/tooltip/tooltip.rb +26 -0
- data/lib/ruby_ui/tooltip/tooltip_content.rb +26 -0
- data/lib/ruby_ui/tooltip/tooltip_trigger.rb +19 -0
- data/lib/ruby_ui/typography/heading.rb +60 -0
- data/lib/ruby_ui/typography/inline_code.rb +17 -0
- data/lib/ruby_ui/typography/inline_link.rb +22 -0
- data/lib/ruby_ui/typography/text.rb +53 -0
- data/lib/ruby_ui/typography/typography_blockquote.rb +17 -0
- data/lib/ruby_ui.rb +5 -0
- metadata +280 -0
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubyUI
|
4
|
+
class ComboboxSearchInput < Base
|
5
|
+
def initialize(placeholder:, **attrs)
|
6
|
+
@placeholder = placeholder
|
7
|
+
super(**attrs)
|
8
|
+
end
|
9
|
+
|
10
|
+
def view_template
|
11
|
+
input_container do
|
12
|
+
search_icon
|
13
|
+
input(**attrs)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def search_icon
|
20
|
+
svg(
|
21
|
+
xmlns: "http://www.w3.org/2000/svg",
|
22
|
+
viewbox: "0 0 24 24",
|
23
|
+
fill: "none",
|
24
|
+
stroke: "currentColor",
|
25
|
+
class: "mr-2 h-4 w-4 shrink-0 opacity-50",
|
26
|
+
stroke_width: "2",
|
27
|
+
stroke_linecap: "round",
|
28
|
+
stroke_linejoin: "round"
|
29
|
+
) do |s|
|
30
|
+
s.circle(cx: "11", cy: "11", r: "8")
|
31
|
+
s.path(
|
32
|
+
d: "m21 21-4.3-4.3"
|
33
|
+
)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def input_container(&)
|
38
|
+
div(class: "flex items-center border-b px-3", &)
|
39
|
+
end
|
40
|
+
|
41
|
+
def default_attrs
|
42
|
+
{
|
43
|
+
class:
|
44
|
+
"flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
|
45
|
+
placeholder: @placeholder,
|
46
|
+
data: {
|
47
|
+
action: "input->ruby-ui--combobox#onSearchInput",
|
48
|
+
ruby_ui__combobox_target: "search"
|
49
|
+
},
|
50
|
+
autocomplete: "off",
|
51
|
+
autocorrect: "off",
|
52
|
+
spellcheck: false
|
53
|
+
}
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubyUI
|
4
|
+
class ComboboxTrigger < Base
|
5
|
+
def view_template(&block)
|
6
|
+
button(**attrs) do
|
7
|
+
block&.call
|
8
|
+
icon
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def icon
|
15
|
+
svg(
|
16
|
+
xmlns: "http://www.w3.org/2000/svg",
|
17
|
+
viewbox: "0 0 24 24",
|
18
|
+
fill: "none",
|
19
|
+
stroke: "currentColor",
|
20
|
+
class: "ml-2 h-4 w-4 shrink-0 opacity-50",
|
21
|
+
stroke_width: "2",
|
22
|
+
stroke_linecap: "round",
|
23
|
+
stroke_linejoin: "round"
|
24
|
+
) do |s|
|
25
|
+
s.path(
|
26
|
+
d: "m7 15 5 5 5-5"
|
27
|
+
)
|
28
|
+
s.path(
|
29
|
+
d: "m7 9 5-5 5 5"
|
30
|
+
)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def default_attrs
|
35
|
+
{
|
36
|
+
data: {
|
37
|
+
action: "ruby-ui--combobox#onTriggerClick",
|
38
|
+
ruby_ui__combobox_target: "trigger"
|
39
|
+
},
|
40
|
+
type: "button",
|
41
|
+
role: "combobox",
|
42
|
+
aria: {
|
43
|
+
expanded: "false",
|
44
|
+
haspopup: "listbox",
|
45
|
+
autocomplete: "none",
|
46
|
+
activedescendant: true
|
47
|
+
},
|
48
|
+
class: "flex h-full w-full items-center whitespace-nowrap 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 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-10 px-4 py-2 w-[200px] justify-between"
|
49
|
+
}
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubyUI
|
4
|
+
class ComboboxValue < Base
|
5
|
+
def initialize(placeholder: nil, **attrs)
|
6
|
+
@placeholder = placeholder
|
7
|
+
super(**attrs)
|
8
|
+
end
|
9
|
+
|
10
|
+
def view_template(&block)
|
11
|
+
span(**attrs) do
|
12
|
+
block ? block.call : @placeholder
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def default_attrs
|
19
|
+
{
|
20
|
+
data: {
|
21
|
+
ruby_ui__combobox_target: "value"
|
22
|
+
},
|
23
|
+
class: "pointer-events-none"
|
24
|
+
}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubyUI
|
4
|
+
class CommandDialogContent < 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
|
+
|
19
|
+
def view_template(&block)
|
20
|
+
template(data: {ruby_ui__command_target: "content"}) do
|
21
|
+
div(data: {controller: "ruby-ui--command"}) do
|
22
|
+
backdrop
|
23
|
+
div(**attrs, &block)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def default_attrs
|
31
|
+
{
|
32
|
+
data_state: "open",
|
33
|
+
class: [
|
34
|
+
"fixed pointer-events-auto left-[50%] top-[50%] z-50 grid w-full translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background 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",
|
35
|
+
SIZES[@size]
|
36
|
+
]
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
def backdrop
|
41
|
+
div(
|
42
|
+
data_state: "open",
|
43
|
+
data_action: "click->ruby-ui--command#dismiss esc->ruby-ui--command#dismiss",
|
44
|
+
class: "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"
|
45
|
+
)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubyUI
|
4
|
+
class CommandDialogTrigger < Base
|
5
|
+
DEFAULT_KEYBINDINGS = [
|
6
|
+
"keydown.ctrl+k@window",
|
7
|
+
"keydown.meta+k@window"
|
8
|
+
].freeze
|
9
|
+
|
10
|
+
def initialize(keybindings: DEFAULT_KEYBINDINGS, **attrs)
|
11
|
+
@keybindings = keybindings.map { |kb| "#{kb}->ruby-ui--command#open" }
|
12
|
+
super(**attrs)
|
13
|
+
end
|
14
|
+
|
15
|
+
def view_template(&)
|
16
|
+
div(**attrs, &)
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def default_attrs
|
22
|
+
{
|
23
|
+
data: {
|
24
|
+
action: ["click->ruby-ui--command#open", @keybindings.join(" ")]
|
25
|
+
}
|
26
|
+
}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubyUI
|
4
|
+
class CommandEmpty < Base
|
5
|
+
def view_template(&)
|
6
|
+
div(**attrs, &)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def default_attrs
|
12
|
+
{
|
13
|
+
class: "py-6 text-center text-sm",
|
14
|
+
role: "presentation",
|
15
|
+
data: {ruby_ui__command_target: "empty"}
|
16
|
+
}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubyUI
|
4
|
+
class CommandGroup < Base
|
5
|
+
def initialize(title: nil, **attrs)
|
6
|
+
@title = title
|
7
|
+
super(**attrs)
|
8
|
+
end
|
9
|
+
|
10
|
+
def view_template(&block)
|
11
|
+
div(**attrs) do
|
12
|
+
render_header if @title
|
13
|
+
render_items(&block)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def render_header
|
20
|
+
div(group_heading: @title) do
|
21
|
+
@title
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def render_items(&)
|
26
|
+
div(group_items: "", role: "group", &)
|
27
|
+
end
|
28
|
+
|
29
|
+
def default_attrs
|
30
|
+
{
|
31
|
+
class: "overflow-hidden p-1 text-foreground [&_[group-heading]]:px-2 [&_[group-heading]]:py-1.5 [&_[group-heading]]:text-xs [&_[group-heading]]:font-medium [&_[group-heading]]:text-muted-foreground",
|
32
|
+
role: "presentation",
|
33
|
+
data: {
|
34
|
+
value: @title,
|
35
|
+
ruby_ui__command_target: "group"
|
36
|
+
}
|
37
|
+
}
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubyUI
|
4
|
+
class CommandInput < Base
|
5
|
+
def initialize(placeholder: "Type a command or search...", **attrs)
|
6
|
+
@placeholder = placeholder
|
7
|
+
super(**attrs)
|
8
|
+
end
|
9
|
+
|
10
|
+
def view_template
|
11
|
+
input_container do
|
12
|
+
search_icon
|
13
|
+
input(**attrs)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def search_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 mr-1.5"
|
25
|
+
) do |s|
|
26
|
+
s.path(
|
27
|
+
fill_rule: "evenodd",
|
28
|
+
d:
|
29
|
+
"M9 3.5a5.5 5.5 0 100 11 5.5 5.5 0 000-11zM2 9a7 7 0 1112.452 4.391l3.328 3.329a.75.75 0 11-1.06 1.06l-3.329-3.328A7 7 0 012 9z",
|
30
|
+
clip_rule: "evenodd"
|
31
|
+
)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def input_container(&)
|
36
|
+
div(class: "flex items-center border-b px-3", &)
|
37
|
+
end
|
38
|
+
|
39
|
+
def default_attrs
|
40
|
+
{
|
41
|
+
class: "flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
|
42
|
+
placeholder: @placeholder,
|
43
|
+
data_action: "input->ruby-ui--command#filter keydown.down->ruby-ui--command#handleKeydown keydown.up->ruby-ui--command#handleKeydown keydown.enter->ruby-ui--command#handleKeydown keydown.esc->ruby-ui--command#dismiss",
|
44
|
+
data_ruby_ui__command_target: "input",
|
45
|
+
autocomplete: "off",
|
46
|
+
autocorrect: "off",
|
47
|
+
spellcheck: false,
|
48
|
+
autofocus: true,
|
49
|
+
aria_autocomplete: "list",
|
50
|
+
role: "combobox",
|
51
|
+
aria_expanded: true,
|
52
|
+
value: ""
|
53
|
+
}
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubyUI
|
4
|
+
class CommandItem < Base
|
5
|
+
def initialize(value:, text: "", href: "#", **attrs)
|
6
|
+
@value = value
|
7
|
+
@text = text
|
8
|
+
@href = href
|
9
|
+
super(**attrs)
|
10
|
+
end
|
11
|
+
|
12
|
+
def view_template(&)
|
13
|
+
a(**attrs, &)
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def default_attrs
|
19
|
+
{
|
20
|
+
class: "relative flex cursor-pointer select-none items-center gap-x-2 rounded-sm px-2 py-1.5 text-sm outline-none hover:bg-accent hover:text-accent-foreground aria-selected:bg-accent aria-selected:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
21
|
+
href: @href,
|
22
|
+
role: "option",
|
23
|
+
data: {
|
24
|
+
ruby_ui__command_target: "item",
|
25
|
+
value: @value,
|
26
|
+
text: @text
|
27
|
+
}
|
28
|
+
# aria_selected: "true", # Toggles aria-selected="true" on keydown
|
29
|
+
}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubyUI
|
4
|
+
class ContextMenu < Base
|
5
|
+
def initialize(options: {}, **attrs)
|
6
|
+
@options = options
|
7
|
+
@options[:trigger] ||= "manual"
|
8
|
+
super(**attrs)
|
9
|
+
end
|
10
|
+
|
11
|
+
def view_template(&)
|
12
|
+
div(**attrs, &)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def default_attrs
|
18
|
+
{
|
19
|
+
data: {
|
20
|
+
controller: "ruby-ui--context-menu",
|
21
|
+
popover_options_value: @options.to_json
|
22
|
+
}
|
23
|
+
}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubyUI
|
4
|
+
class ContextMenuContent < Base
|
5
|
+
def view_template(&block)
|
6
|
+
template(data: {ruby_ui__context_menu_target: "content"}) do
|
7
|
+
div(**attrs, &block)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def default_attrs
|
14
|
+
{
|
15
|
+
role: "menu",
|
16
|
+
aria_orientation: "vertical",
|
17
|
+
data_state: "open",
|
18
|
+
class:
|
19
|
+
"z-50 min-w-[8rem] outline-none pointer-events-auto 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",
|
20
|
+
tabindex: "-1",
|
21
|
+
data_orientation: "vertical"
|
22
|
+
}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubyUI
|
4
|
+
class ContextMenuItem < Base
|
5
|
+
def initialize(href: "#", checked: false, shortcut: nil, disabled: false, **attrs)
|
6
|
+
@href = href
|
7
|
+
@checked = checked
|
8
|
+
@shortcut = shortcut
|
9
|
+
@disabled = disabled
|
10
|
+
|
11
|
+
super(**attrs)
|
12
|
+
end
|
13
|
+
|
14
|
+
def view_template(&block)
|
15
|
+
a(**attrs) do
|
16
|
+
render_checkmark if @checked
|
17
|
+
yield
|
18
|
+
render_shortcut if @shortcut
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def render_checkmark
|
25
|
+
span(class: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center") do
|
26
|
+
span(data_state: "checked") do
|
27
|
+
svg(
|
28
|
+
width: "15",
|
29
|
+
height: "15",
|
30
|
+
viewbox: "0 0 15 15",
|
31
|
+
fill: "none",
|
32
|
+
xmlns: "http://www.w3.org/2000/svg",
|
33
|
+
class: "h-4 w-4"
|
34
|
+
) do |s|
|
35
|
+
s.path(
|
36
|
+
d:
|
37
|
+
"M11.4669 3.72684C11.7558 3.91574 11.8369 4.30308 11.648 4.59198L7.39799 11.092C7.29783 11.2452 7.13556 11.3467 6.95402 11.3699C6.77247 11.3931 6.58989 11.3355 6.45446 11.2124L3.70446 8.71241C3.44905 8.48022 3.43023 8.08494 3.66242 7.82953C3.89461 7.57412 4.28989 7.55529 4.5453 7.78749L6.75292 9.79441L10.6018 3.90792C10.7907 3.61902 11.178 3.53795 11.4669 3.72684Z",
|
38
|
+
fill: "currentColor",
|
39
|
+
fill_rule: "evenodd",
|
40
|
+
clip_rule: "evenodd"
|
41
|
+
)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def render_shortcut
|
48
|
+
span(class: "ml-auto text-xs tracking-widest text-muted-foreground") { @shortcut }
|
49
|
+
end
|
50
|
+
|
51
|
+
def default_attrs
|
52
|
+
{
|
53
|
+
href: @href,
|
54
|
+
role: "menuitem",
|
55
|
+
class:
|
56
|
+
"relative flex cursor-pointer select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none 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 pl-8",
|
57
|
+
tabindex: "-1",
|
58
|
+
data_orientation: "vertical",
|
59
|
+
data_action: "click->ruby-ui--context-menu#close",
|
60
|
+
data_ruby_ui__context_menu_target: "menuItem",
|
61
|
+
data_disabled: @disabled,
|
62
|
+
disabled: @disabled
|
63
|
+
}
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubyUI
|
4
|
+
class ContextMenuLabel < Base
|
5
|
+
def initialize(inset: false, **attrs)
|
6
|
+
@inset = inset
|
7
|
+
super(**attrs)
|
8
|
+
end
|
9
|
+
|
10
|
+
def view_template(&)
|
11
|
+
div(**attrs, &)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def inset? = @inset
|
17
|
+
|
18
|
+
def default_attrs
|
19
|
+
{
|
20
|
+
class: ["px-2 py-1.5 text-sm font-semibold text-foreground", inset?: "pl-8"]
|
21
|
+
}
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubyUI
|
4
|
+
class ContextMenuSeparator < Base
|
5
|
+
def view_template
|
6
|
+
div(**attrs)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def default_attrs
|
12
|
+
{
|
13
|
+
role: "separator",
|
14
|
+
aria_orientation: "horizontal",
|
15
|
+
class: "-mx-1 my-1 h-px bg-border"
|
16
|
+
}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubyUI
|
4
|
+
class ContextMenuTrigger < Base
|
5
|
+
def view_template(&)
|
6
|
+
div(**attrs, &)
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def default_attrs
|
12
|
+
{
|
13
|
+
data: {
|
14
|
+
ruby_ui__context_menu_target: "trigger",
|
15
|
+
action: "contextmenu->ruby-ui--context-menu#handleContextMenu"
|
16
|
+
}
|
17
|
+
}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubyUI
|
4
|
+
class Dialog < Base
|
5
|
+
def initialize(open: false, **attrs)
|
6
|
+
@open = open
|
7
|
+
super(**attrs)
|
8
|
+
end
|
9
|
+
|
10
|
+
def view_template(&)
|
11
|
+
div(**attrs, &)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def default_attrs
|
17
|
+
{
|
18
|
+
data: {
|
19
|
+
controller: "ruby-ui--dialog",
|
20
|
+
ruby_ui__dialog_open_value: @open
|
21
|
+
}
|
22
|
+
}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|