shadcn_view_component 0.3.3
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 +7 -0
- data/CHANGELOG.md +255 -0
- data/MIT-LICENSE +20 -0
- data/README.md +604 -0
- data/app/assets/stylesheets/shadcn-themes.css +1075 -0
- data/app/assets/stylesheets/shadcn.css +853 -0
- data/app/components/shadcn/accordion/component.rb +44 -0
- data/app/components/shadcn/accordion/content/component.rb +44 -0
- data/app/components/shadcn/accordion/item/component.rb +41 -0
- data/app/components/shadcn/accordion/preview.rb +16 -0
- data/app/components/shadcn/accordion/previews/default.html.erb +10 -0
- data/app/components/shadcn/accordion/previews/multiple.html.erb +13 -0
- data/app/components/shadcn/accordion/trigger/component.rb +52 -0
- data/app/components/shadcn/alert/component.rb +52 -0
- data/app/components/shadcn/alert/preview.rb +11 -0
- data/app/components/shadcn/alert/previews/default.html.erb +8 -0
- data/app/components/shadcn/alert.rb +17 -0
- data/app/components/shadcn/alert_dialog/action/component.rb +35 -0
- data/app/components/shadcn/alert_dialog/cancel/component.rb +16 -0
- data/app/components/shadcn/alert_dialog/component.rb +20 -0
- data/app/components/shadcn/alert_dialog/content/component.rb +55 -0
- data/app/components/shadcn/alert_dialog/header/component.rb +33 -0
- data/app/components/shadcn/alert_dialog/preview.rb +16 -0
- data/app/components/shadcn/alert_dialog/previews/default.html.erb +13 -0
- data/app/components/shadcn/alert_dialog/previews/small_with_media.html.erb +38 -0
- data/app/components/shadcn/alert_dialog.rb +32 -0
- data/app/components/shadcn/application_view_component.rb +225 -0
- data/app/components/shadcn/application_view_component_preview.rb +8 -0
- data/app/components/shadcn/aspect_ratio/component.rb +34 -0
- data/app/components/shadcn/aspect_ratio/preview.rb +16 -0
- data/app/components/shadcn/aspect_ratio/previews/default.html.erb +5 -0
- data/app/components/shadcn/aspect_ratio/previews/ratios.html.erb +12 -0
- data/app/components/shadcn/attachment/action/component.rb +19 -0
- data/app/components/shadcn/attachment/component.rb +76 -0
- data/app/components/shadcn/attachment/media/component.rb +56 -0
- data/app/components/shadcn/attachment/preview.rb +11 -0
- data/app/components/shadcn/attachment/previews/default.html.erb +80 -0
- data/app/components/shadcn/attachment/trigger/component.rb +31 -0
- data/app/components/shadcn/attachment.rb +42 -0
- data/app/components/shadcn/avatar/component.rb +43 -0
- data/app/components/shadcn/avatar/fallback/component.rb +23 -0
- data/app/components/shadcn/avatar/image/component.rb +20 -0
- data/app/components/shadcn/avatar/preview.rb +11 -0
- data/app/components/shadcn/avatar/previews/default.html.erb +13 -0
- data/app/components/shadcn/avatar.rb +32 -0
- data/app/components/shadcn/badge/component.rb +57 -0
- data/app/components/shadcn/badge/preview.rb +11 -0
- data/app/components/shadcn/badge/previews/default.html.erb +5 -0
- data/app/components/shadcn/breadcrumb/component.rb +15 -0
- data/app/components/shadcn/breadcrumb/ellipsis/component.rb +28 -0
- data/app/components/shadcn/breadcrumb/page/component.rb +25 -0
- data/app/components/shadcn/breadcrumb/preview.rb +16 -0
- data/app/components/shadcn/breadcrumb/previews/custom_separator.html.erb +17 -0
- data/app/components/shadcn/breadcrumb/previews/default.html.erb +15 -0
- data/app/components/shadcn/breadcrumb/separator/component.rb +31 -0
- data/app/components/shadcn/breadcrumb.rb +18 -0
- data/app/components/shadcn/bubble/component.rb +90 -0
- data/app/components/shadcn/bubble/preview.rb +16 -0
- data/app/components/shadcn/bubble/previews/alignment.html.erb +33 -0
- data/app/components/shadcn/bubble/previews/default.html.erb +22 -0
- data/app/components/shadcn/bubble/reactions/component.rb +54 -0
- data/app/components/shadcn/bubble.rb +24 -0
- data/app/components/shadcn/button/component.rb +85 -0
- data/app/components/shadcn/button/preview.rb +31 -0
- data/app/components/shadcn/button/previews/default.html.erb +8 -0
- data/app/components/shadcn/button/previews/sizes.html.erb +5 -0
- data/app/components/shadcn/button/previews/variants.html.erb +5 -0
- data/app/components/shadcn/button_group/component.rb +53 -0
- data/app/components/shadcn/button_group/preview.rb +15 -0
- data/app/components/shadcn/button_group/previews/default.html.erb +18 -0
- data/app/components/shadcn/button_group/previews/vertical.html.erb +5 -0
- data/app/components/shadcn/button_group/separator/component.rb +30 -0
- data/app/components/shadcn/button_group/text/component.rb +20 -0
- data/app/components/shadcn/calendar/component.rb +558 -0
- data/app/components/shadcn/calendar/month.rb +74 -0
- data/app/components/shadcn/calendar/preview.rb +64 -0
- data/app/components/shadcn/calendar/previews/booked.html.erb +18 -0
- data/app/components/shadcn/calendar/previews/custom_cell_size.html.erb +11 -0
- data/app/components/shadcn/calendar/previews/date_and_time.html.erb +31 -0
- data/app/components/shadcn/calendar/previews/default.html.erb +8 -0
- data/app/components/shadcn/calendar/previews/dropdown_caption.html.erb +11 -0
- data/app/components/shadcn/calendar/previews/in_a_form.html.erb +8 -0
- data/app/components/shadcn/calendar/previews/presets.html.erb +20 -0
- data/app/components/shadcn/calendar/previews/range.html.erb +10 -0
- data/app/components/shadcn/calendar/previews/week_numbers.html.erb +8 -0
- data/app/components/shadcn/card/component.rb +24 -0
- data/app/components/shadcn/card/header/component.rb +26 -0
- data/app/components/shadcn/card/preview.rb +16 -0
- data/app/components/shadcn/card/previews/default.html.erb +18 -0
- data/app/components/shadcn/card/previews/image.html.erb +37 -0
- data/app/components/shadcn/card.rb +21 -0
- data/app/components/shadcn/carousel/component.rb +61 -0
- data/app/components/shadcn/carousel/content/component.rb +86 -0
- data/app/components/shadcn/carousel/item/component.rb +42 -0
- data/app/components/shadcn/carousel/next/component.rb +59 -0
- data/app/components/shadcn/carousel/preview.rb +22 -0
- data/app/components/shadcn/carousel/previews/default.html.erb +22 -0
- data/app/components/shadcn/carousel/previews/sizes.html.erb +42 -0
- data/app/components/shadcn/carousel/previews/vertical.html.erb +27 -0
- data/app/components/shadcn/carousel/previous/component.rb +59 -0
- data/app/components/shadcn/chart/area/component.rb +43 -0
- data/app/components/shadcn/chart/bar/component.rb +75 -0
- data/app/components/shadcn/chart/cartesian/component.rb +152 -0
- data/app/components/shadcn/chart/component.rb +124 -0
- data/app/components/shadcn/chart/focusable.rb +38 -0
- data/app/components/shadcn/chart/legend/component.rb +55 -0
- data/app/components/shadcn/chart/line/component.rb +50 -0
- data/app/components/shadcn/chart/pie/component.rb +169 -0
- data/app/components/shadcn/chart/plot.rb +147 -0
- data/app/components/shadcn/chart/preview.rb +45 -0
- data/app/components/shadcn/chart/previews/area.html.erb +31 -0
- data/app/components/shadcn/chart/previews/bar.html.erb +32 -0
- data/app/components/shadcn/chart/previews/bar_stacked.html.erb +30 -0
- data/app/components/shadcn/chart/previews/default.html.erb +30 -0
- data/app/components/shadcn/chart/previews/donut.html.erb +16 -0
- data/app/components/shadcn/chart/previews/line.html.erb +30 -0
- data/app/components/shadcn/chart/previews/percentages.html.erb +17 -0
- data/app/components/shadcn/chart/table/component.rb +75 -0
- data/app/components/shadcn/chart/tooltip/component.rb +111 -0
- data/app/components/shadcn/checkbox/component.rb +109 -0
- data/app/components/shadcn/checkbox/preview.rb +16 -0
- data/app/components/shadcn/checkbox/previews/default.html.erb +14 -0
- data/app/components/shadcn/checkbox/previews/states.html.erb +23 -0
- data/app/components/shadcn/collapsible/component.rb +35 -0
- data/app/components/shadcn/collapsible/content/component.rb +20 -0
- data/app/components/shadcn/collapsible/preview.rb +11 -0
- data/app/components/shadcn/collapsible/previews/default.html.erb +9 -0
- data/app/components/shadcn/collapsible/trigger/component.rb +23 -0
- data/app/components/shadcn/combobox/chip/component.rb +60 -0
- data/app/components/shadcn/combobox/chip_input/component.rb +43 -0
- data/app/components/shadcn/combobox/chips/component.rb +54 -0
- data/app/components/shadcn/combobox/clear/component.rb +32 -0
- data/app/components/shadcn/combobox/component.rb +113 -0
- data/app/components/shadcn/combobox/content/component.rb +59 -0
- data/app/components/shadcn/combobox/empty/component.rb +23 -0
- data/app/components/shadcn/combobox/input/component.rb +85 -0
- data/app/components/shadcn/combobox/item/component.rb +69 -0
- data/app/components/shadcn/combobox/list/component.rb +27 -0
- data/app/components/shadcn/combobox/preview.rb +31 -0
- data/app/components/shadcn/combobox/previews/default.html.erb +20 -0
- data/app/components/shadcn/combobox/previews/grouped.html.erb +25 -0
- data/app/components/shadcn/combobox/previews/multiple.html.erb +28 -0
- data/app/components/shadcn/combobox/previews/with_clear.html.erb +16 -0
- data/app/components/shadcn/combobox/trigger/component.rb +54 -0
- data/app/components/shadcn/combobox.rb +16 -0
- data/app/components/shadcn/command/component.rb +67 -0
- data/app/components/shadcn/command/dialog/component.rb +72 -0
- data/app/components/shadcn/command/empty/component.rb +29 -0
- data/app/components/shadcn/command/group/component.rb +63 -0
- data/app/components/shadcn/command/input/component.rb +66 -0
- data/app/components/shadcn/command/item/component.rb +62 -0
- data/app/components/shadcn/command/list/component.rb +36 -0
- data/app/components/shadcn/command/preview.rb +26 -0
- data/app/components/shadcn/command/previews/default.html.erb +41 -0
- data/app/components/shadcn/command/previews/dialog.html.erb +33 -0
- data/app/components/shadcn/command/previews/ranking.html.erb +16 -0
- data/app/components/shadcn/command/separator/component.rb +33 -0
- data/app/components/shadcn/command.rb +14 -0
- data/app/components/shadcn/concerns/modal_root.rb +43 -0
- data/app/components/shadcn/concerns/submits_value.rb +81 -0
- data/app/components/shadcn/context_menu/component.rb +45 -0
- data/app/components/shadcn/context_menu/content/component.rb +40 -0
- data/app/components/shadcn/context_menu/preview.rb +16 -0
- data/app/components/shadcn/context_menu/previews/default.html.erb +34 -0
- data/app/components/shadcn/context_menu/previews/items.html.erb +35 -0
- data/app/components/shadcn/context_menu/sub/component.rb +47 -0
- data/app/components/shadcn/context_menu/sub_content/component.rb +31 -0
- data/app/components/shadcn/context_menu/trigger/component.rb +50 -0
- data/app/components/shadcn/context_menu.rb +43 -0
- data/app/components/shadcn/dialog/close/component.rb +20 -0
- data/app/components/shadcn/dialog/component.rb +20 -0
- data/app/components/shadcn/dialog/content/component.rb +78 -0
- data/app/components/shadcn/dialog/header/component.rb +23 -0
- data/app/components/shadcn/dialog/overlay/component.rb +28 -0
- data/app/components/shadcn/dialog/preview.rb +28 -0
- data/app/components/shadcn/dialog/previews/default.html.erb +17 -0
- data/app/components/shadcn/dialog/previews/inside_stacking_context.html.erb +25 -0
- data/app/components/shadcn/dialog/previews/no_close_button.html.erb +15 -0
- data/app/components/shadcn/dialog/previews/scrollable_content.html.erb +29 -0
- data/app/components/shadcn/dialog/trigger/component.rb +24 -0
- data/app/components/shadcn/dialog.rb +17 -0
- data/app/components/shadcn/drawer/component.rb +33 -0
- data/app/components/shadcn/drawer/content/component.rb +95 -0
- data/app/components/shadcn/drawer/header/component.rb +34 -0
- data/app/components/shadcn/drawer/preview.rb +29 -0
- data/app/components/shadcn/drawer/previews/default.html.erb +21 -0
- data/app/components/shadcn/drawer/previews/scrollable.html.erb +20 -0
- data/app/components/shadcn/drawer/previews/scrollable_side.html.erb +21 -0
- data/app/components/shadcn/drawer/previews/sides.html.erb +17 -0
- data/app/components/shadcn/drawer.rb +27 -0
- data/app/components/shadcn/dropdown_menu/checkbox_item/component.rb +61 -0
- data/app/components/shadcn/dropdown_menu/component.rb +48 -0
- data/app/components/shadcn/dropdown_menu/content/component.rb +49 -0
- data/app/components/shadcn/dropdown_menu/group/component.rb +16 -0
- data/app/components/shadcn/dropdown_menu/item/component.rb +50 -0
- data/app/components/shadcn/dropdown_menu/preview.rb +16 -0
- data/app/components/shadcn/dropdown_menu/previews/checkboxes_and_radio.html.erb +34 -0
- data/app/components/shadcn/dropdown_menu/previews/default.html.erb +23 -0
- data/app/components/shadcn/dropdown_menu/radio_group/component.rb +16 -0
- data/app/components/shadcn/dropdown_menu/radio_item/component.rb +63 -0
- data/app/components/shadcn/dropdown_menu/sub/component.rb +44 -0
- data/app/components/shadcn/dropdown_menu/sub_content/component.rb +45 -0
- data/app/components/shadcn/dropdown_menu/sub_trigger/component.rb +58 -0
- data/app/components/shadcn/dropdown_menu/trigger/component.rb +25 -0
- data/app/components/shadcn/dropdown_menu.rb +18 -0
- data/app/components/shadcn/empty/component.rb +17 -0
- data/app/components/shadcn/empty/media/component.rb +48 -0
- data/app/components/shadcn/empty/preview.rb +16 -0
- data/app/components/shadcn/empty/previews/default.html.erb +15 -0
- data/app/components/shadcn/empty/previews/media.html.erb +32 -0
- data/app/components/shadcn/empty.rb +26 -0
- data/app/components/shadcn/field/component.rb +61 -0
- data/app/components/shadcn/field/error/component.rb +49 -0
- data/app/components/shadcn/field/legend/component.rb +30 -0
- data/app/components/shadcn/field/preview.rb +17 -0
- data/app/components/shadcn/field/previews/default.html.erb +29 -0
- data/app/components/shadcn/field/previews/form_builder.html.erb +38 -0
- data/app/components/shadcn/field/separator/component.rb +35 -0
- data/app/components/shadcn/field.rb +44 -0
- data/app/components/shadcn/hover_card/component.rb +51 -0
- data/app/components/shadcn/hover_card/content/component.rb +45 -0
- data/app/components/shadcn/hover_card/preview.rb +16 -0
- data/app/components/shadcn/hover_card/previews/default.html.erb +36 -0
- data/app/components/shadcn/hover_card/previews/sides.html.erb +15 -0
- data/app/components/shadcn/hover_card/trigger/component.rb +33 -0
- data/app/components/shadcn/icon/component.rb +76 -0
- data/app/components/shadcn/icon.rb +43 -0
- data/app/components/shadcn/input/component.rb +26 -0
- data/app/components/shadcn/input/preview.rb +16 -0
- data/app/components/shadcn/input/previews/default.html.erb +5 -0
- data/app/components/shadcn/input/previews/states.html.erb +20 -0
- data/app/components/shadcn/input_group/addon/component.rb +65 -0
- data/app/components/shadcn/input_group/button/component.rb +40 -0
- data/app/components/shadcn/input_group/component.rb +43 -0
- data/app/components/shadcn/input_group/input/component.rb +25 -0
- data/app/components/shadcn/input_group/preview.rb +17 -0
- data/app/components/shadcn/input_group/previews/addons.html.erb +53 -0
- data/app/components/shadcn/input_group/previews/default.html.erb +25 -0
- data/app/components/shadcn/input_group/text/component.rb +20 -0
- data/app/components/shadcn/input_group/textarea/component.rb +21 -0
- data/app/components/shadcn/input_otp/component.rb +95 -0
- data/app/components/shadcn/input_otp/preview.rb +17 -0
- data/app/components/shadcn/input_otp/previews/default.html.erb +19 -0
- data/app/components/shadcn/input_otp/previews/variations.html.erb +33 -0
- data/app/components/shadcn/input_otp/separator/component.rb +21 -0
- data/app/components/shadcn/input_otp/slot/component.rb +60 -0
- data/app/components/shadcn/input_otp.rb +11 -0
- data/app/components/shadcn/item/component.rb +56 -0
- data/app/components/shadcn/item/group/component.rb +53 -0
- data/app/components/shadcn/item/media/component.rb +53 -0
- data/app/components/shadcn/item/preview.rb +20 -0
- data/app/components/shadcn/item/previews/default.html.erb +32 -0
- data/app/components/shadcn/item/previews/link.html.erb +39 -0
- data/app/components/shadcn/item/previews/outline.html.erb +8 -0
- data/app/components/shadcn/item/separator/component.rb +24 -0
- data/app/components/shadcn/item.rb +34 -0
- data/app/components/shadcn/kbd/component.rb +23 -0
- data/app/components/shadcn/kbd/group/component.rb +17 -0
- data/app/components/shadcn/kbd/preview.rb +11 -0
- data/app/components/shadcn/kbd/previews/default.html.erb +4 -0
- data/app/components/shadcn/label/component.rb +20 -0
- data/app/components/shadcn/label/preview.rb +11 -0
- data/app/components/shadcn/label/previews/default.html.erb +4 -0
- data/app/components/shadcn/marker/component.rb +46 -0
- data/app/components/shadcn/marker/icon/component.rb +23 -0
- data/app/components/shadcn/marker/preview.rb +17 -0
- data/app/components/shadcn/marker/previews/default.html.erb +18 -0
- data/app/components/shadcn/marker/previews/status.html.erb +32 -0
- data/app/components/shadcn/marker.rb +17 -0
- data/app/components/shadcn/menubar/component.rb +36 -0
- data/app/components/shadcn/menubar/content/component.rb +49 -0
- data/app/components/shadcn/menubar/menu/component.rb +39 -0
- data/app/components/shadcn/menubar/preview.rb +16 -0
- data/app/components/shadcn/menubar/previews/default.html.erb +52 -0
- data/app/components/shadcn/menubar/previews/items.html.erb +38 -0
- data/app/components/shadcn/menubar/sub/component.rb +43 -0
- data/app/components/shadcn/menubar/sub_content/component.rb +31 -0
- data/app/components/shadcn/menubar/sub_trigger/component.rb +31 -0
- data/app/components/shadcn/menubar/trigger/component.rb +41 -0
- data/app/components/shadcn/menubar.rb +47 -0
- data/app/components/shadcn/message/component.rb +33 -0
- data/app/components/shadcn/message/preview.rb +16 -0
- data/app/components/shadcn/message/previews/actions.html.erb +51 -0
- data/app/components/shadcn/message/previews/default.html.erb +35 -0
- data/app/components/shadcn/message.rb +35 -0
- data/app/components/shadcn/message_scroller/button/component.rb +78 -0
- data/app/components/shadcn/message_scroller/component.rb +59 -0
- data/app/components/shadcn/message_scroller/content/component.rb +50 -0
- data/app/components/shadcn/message_scroller/item/component.rb +45 -0
- data/app/components/shadcn/message_scroller/preview.rb +11 -0
- data/app/components/shadcn/message_scroller/previews/default.html.erb +72 -0
- data/app/components/shadcn/message_scroller/viewport/component.rb +41 -0
- data/app/components/shadcn/mode_switcher/component.rb +67 -0
- data/app/components/shadcn/mode_switcher/preview.rb +11 -0
- data/app/components/shadcn/mode_switcher/previews/default.html.erb +5 -0
- data/app/components/shadcn/mode_toggle/component.rb +75 -0
- data/app/components/shadcn/mode_toggle/preview.rb +11 -0
- data/app/components/shadcn/mode_toggle/previews/default.html.erb +20 -0
- data/app/components/shadcn/native_select/component.rb +59 -0
- data/app/components/shadcn/native_select/preview.rb +16 -0
- data/app/components/shadcn/native_select/previews/default.html.erb +9 -0
- data/app/components/shadcn/native_select/previews/groups.html.erb +26 -0
- data/app/components/shadcn/native_select.rb +16 -0
- data/app/components/shadcn/navigation_menu/component.rb +51 -0
- data/app/components/shadcn/navigation_menu/content/component.rb +58 -0
- data/app/components/shadcn/navigation_menu/preview.rb +11 -0
- data/app/components/shadcn/navigation_menu/previews/default.html.erb +49 -0
- data/app/components/shadcn/navigation_menu/trigger/component.rb +59 -0
- data/app/components/shadcn/navigation_menu.rb +28 -0
- data/app/components/shadcn/pagination/component.rb +19 -0
- data/app/components/shadcn/pagination/ellipsis/component.rb +28 -0
- data/app/components/shadcn/pagination/link/component.rb +37 -0
- data/app/components/shadcn/pagination/next/component.rb +31 -0
- data/app/components/shadcn/pagination/preview.rb +16 -0
- data/app/components/shadcn/pagination/previews/default.html.erb +18 -0
- data/app/components/shadcn/pagination/previews/simple.html.erb +39 -0
- data/app/components/shadcn/pagination/previous/component.rb +31 -0
- data/app/components/shadcn/pagination.rb +14 -0
- data/app/components/shadcn/parts.rb +38 -0
- data/app/components/shadcn/popover/anchor/component.rb +17 -0
- data/app/components/shadcn/popover/component.rb +42 -0
- data/app/components/shadcn/popover/content/component.rb +40 -0
- data/app/components/shadcn/popover/preview.rb +28 -0
- data/app/components/shadcn/popover/previews/align.html.erb +13 -0
- data/app/components/shadcn/popover/previews/default.html.erb +9 -0
- data/app/components/shadcn/popover/previews/inside_containing_block.html.erb +41 -0
- data/app/components/shadcn/popover/previews/inside_stacking_context.html.erb +30 -0
- data/app/components/shadcn/popover/trigger/component.rb +24 -0
- data/app/components/shadcn/popover.rb +16 -0
- data/app/components/shadcn/progress/component.rb +62 -0
- data/app/components/shadcn/progress/preview.rb +11 -0
- data/app/components/shadcn/progress/previews/default.html.erb +5 -0
- data/app/components/shadcn/radio_group/component.rb +51 -0
- data/app/components/shadcn/radio_group/item/component.rb +74 -0
- data/app/components/shadcn/radio_group/preview.rb +16 -0
- data/app/components/shadcn/radio_group/previews/default.html.erb +15 -0
- data/app/components/shadcn/radio_group/previews/states.html.erb +41 -0
- data/app/components/shadcn/resizable/component.rb +59 -0
- data/app/components/shadcn/resizable/handle/component.rb +70 -0
- data/app/components/shadcn/resizable/panel/component.rb +53 -0
- data/app/components/shadcn/resizable/preview.rb +23 -0
- data/app/components/shadcn/resizable/previews/default.html.erb +25 -0
- data/app/components/shadcn/resizable/previews/vertical.html.erb +19 -0
- data/app/components/shadcn/resizable/previews/with_handle.html.erb +17 -0
- data/app/components/shadcn/scroll_area/component.rb +84 -0
- data/app/components/shadcn/scroll_area/preview.rb +11 -0
- data/app/components/shadcn/scroll_area/previews/default.html.erb +36 -0
- data/app/components/shadcn/scroll_area/scrollbar/component.rb +72 -0
- data/app/components/shadcn/scroll_area/viewport/component.rb +70 -0
- data/app/components/shadcn/scroll_area.rb +14 -0
- data/app/components/shadcn/select/component.rb +67 -0
- data/app/components/shadcn/select/content/component.rb +157 -0
- data/app/components/shadcn/select/empty/component.rb +38 -0
- data/app/components/shadcn/select/group/component.rb +16 -0
- data/app/components/shadcn/select/item/component.rb +71 -0
- data/app/components/shadcn/select/list/component.rb +41 -0
- data/app/components/shadcn/select/preview.rb +24 -0
- data/app/components/shadcn/select/previews/default.html.erb +17 -0
- data/app/components/shadcn/select/previews/scrollable.html.erb +19 -0
- data/app/components/shadcn/select/previews/searchable.html.erb +18 -0
- data/app/components/shadcn/select/previews/states.html.erb +25 -0
- data/app/components/shadcn/select/search/component.rb +54 -0
- data/app/components/shadcn/select/trigger/component.rb +78 -0
- data/app/components/shadcn/select/value/component.rb +28 -0
- data/app/components/shadcn/select.rb +15 -0
- data/app/components/shadcn/separator/component.rb +41 -0
- data/app/components/shadcn/separator/preview.rb +11 -0
- data/app/components/shadcn/separator/previews/default.html.erb +9 -0
- data/app/components/shadcn/sheet/component.rb +16 -0
- data/app/components/shadcn/sheet/content/component.rb +98 -0
- data/app/components/shadcn/sheet/header/component.rb +23 -0
- data/app/components/shadcn/sheet/preview.rb +16 -0
- data/app/components/shadcn/sheet/previews/default.html.erb +16 -0
- data/app/components/shadcn/sheet/previews/no_close_button.html.erb +14 -0
- data/app/components/shadcn/sheet.rb +22 -0
- data/app/components/shadcn/sidebar/component.rb +232 -0
- data/app/components/shadcn/sidebar/input/component.rb +25 -0
- data/app/components/shadcn/sidebar/menu_action/component.rb +58 -0
- data/app/components/shadcn/sidebar/menu_button/component.rb +100 -0
- data/app/components/shadcn/sidebar/menu_skeleton/component.rb +51 -0
- data/app/components/shadcn/sidebar/menu_sub_button/component.rb +60 -0
- data/app/components/shadcn/sidebar/preview.rb +22 -0
- data/app/components/shadcn/sidebar/previews/default.html.erb +189 -0
- data/app/components/shadcn/sidebar/previews/floating.html.erb +39 -0
- data/app/components/shadcn/sidebar/previews/inset.html.erb +48 -0
- data/app/components/shadcn/sidebar/provider/component.rb +53 -0
- data/app/components/shadcn/sidebar/rail/component.rb +43 -0
- data/app/components/shadcn/sidebar/separator/component.rb +23 -0
- data/app/components/shadcn/sidebar/trigger/component.rb +39 -0
- data/app/components/shadcn/sidebar.rb +98 -0
- data/app/components/shadcn/skeleton/component.rb +14 -0
- data/app/components/shadcn/skeleton/preview.rb +11 -0
- data/app/components/shadcn/skeleton/previews/default.html.erb +7 -0
- data/app/components/shadcn/slider/component.rb +145 -0
- data/app/components/shadcn/slider/preview.rb +16 -0
- data/app/components/shadcn/slider/previews/default.html.erb +17 -0
- data/app/components/shadcn/slider/previews/vertical.html.erb +7 -0
- data/app/components/shadcn/slider/range/component.rb +51 -0
- data/app/components/shadcn/slider/thumb/component.rb +58 -0
- data/app/components/shadcn/slider/track/component.rb +32 -0
- data/app/components/shadcn/spinner/component.rb +21 -0
- data/app/components/shadcn/spinner/preview.rb +11 -0
- data/app/components/shadcn/spinner/previews/default.html.erb +7 -0
- data/app/components/shadcn/switch/component.rb +104 -0
- data/app/components/shadcn/switch/preview.rb +11 -0
- data/app/components/shadcn/switch/previews/default.html.erb +24 -0
- data/app/components/shadcn/table/component.rb +26 -0
- data/app/components/shadcn/table/preview.rb +16 -0
- data/app/components/shadcn/table/previews/default.html.erb +19 -0
- data/app/components/shadcn/table/previews/footer.html.erb +25 -0
- data/app/components/shadcn/table.rb +33 -0
- data/app/components/shadcn/tabs/component.rb +40 -0
- data/app/components/shadcn/tabs/content/component.rb +34 -0
- data/app/components/shadcn/tabs/list/component.rb +51 -0
- data/app/components/shadcn/tabs/preview.rb +16 -0
- data/app/components/shadcn/tabs/previews/default.html.erb +21 -0
- data/app/components/shadcn/tabs/previews/line.html.erb +23 -0
- data/app/components/shadcn/tabs/trigger/component.rb +66 -0
- data/app/components/shadcn/textarea/component.rb +24 -0
- data/app/components/shadcn/textarea/preview.rb +16 -0
- data/app/components/shadcn/textarea/previews/default.html.erb +3 -0
- data/app/components/shadcn/textarea/previews/states.html.erb +18 -0
- data/app/components/shadcn/theme_selector/component.rb +88 -0
- data/app/components/shadcn/theme_selector/preview.rb +17 -0
- data/app/components/shadcn/theme_selector/previews/all_themes.html.erb +20 -0
- data/app/components/shadcn/theme_selector/previews/default.html.erb +18 -0
- data/app/components/shadcn/toaster/component.rb +139 -0
- data/app/components/shadcn/toaster/preview.rb +16 -0
- data/app/components/shadcn/toaster/previews/default.html.erb +19 -0
- data/app/components/shadcn/toaster/previews/from_the_server.html.erb +15 -0
- data/app/components/shadcn/toaster/toast/component.rb +134 -0
- data/app/components/shadcn/toggle/component.rb +81 -0
- data/app/components/shadcn/toggle/preview.rb +11 -0
- data/app/components/shadcn/toggle/previews/default.html.erb +6 -0
- data/app/components/shadcn/toggle_group/component.rb +62 -0
- data/app/components/shadcn/toggle_group/item/component.rb +59 -0
- data/app/components/shadcn/toggle_group/preview.rb +16 -0
- data/app/components/shadcn/toggle_group/previews/default.html.erb +12 -0
- data/app/components/shadcn/toggle_group/previews/sizes.html.erb +37 -0
- data/app/components/shadcn/tooltip/component.rb +38 -0
- data/app/components/shadcn/tooltip/content/component.rb +62 -0
- data/app/components/shadcn/tooltip/preview.rb +21 -0
- data/app/components/shadcn/tooltip/previews/default.html.erb +4 -0
- data/app/components/shadcn/tooltip/previews/sides.html.erb +19 -0
- data/app/components/shadcn/tooltip/previews/with_keyboard_shortcut.html.erb +11 -0
- data/app/components/shadcn/tooltip/provider/component.rb +28 -0
- data/app/components/shadcn/tooltip/trigger/component.rb +25 -0
- data/app/helpers/shadcn_view_component/form_helper.rb +25 -0
- data/app/helpers/shadcn_view_component/theme_helper.rb +61 -0
- data/app/javascript/shadcn/animation.js +180 -0
- data/app/javascript/shadcn/command_score.js +110 -0
- data/app/javascript/shadcn/controllers/accordion_controller.js +127 -0
- data/app/javascript/shadcn/controllers/avatar_controller.js +32 -0
- data/app/javascript/shadcn/controllers/calendar_controller.js +633 -0
- data/app/javascript/shadcn/controllers/carousel_controller.js +139 -0
- data/app/javascript/shadcn/controllers/chart_controller.js +110 -0
- data/app/javascript/shadcn/controllers/checkbox_controller.js +61 -0
- data/app/javascript/shadcn/controllers/collapsible_controller.js +55 -0
- data/app/javascript/shadcn/controllers/combobox_controller.js +360 -0
- data/app/javascript/shadcn/controllers/command_controller.js +199 -0
- data/app/javascript/shadcn/controllers/dialog_controller.js +154 -0
- data/app/javascript/shadcn/controllers/drawer_controller.js +265 -0
- data/app/javascript/shadcn/controllers/dropdown_menu_controller.js +259 -0
- data/app/javascript/shadcn/controllers/hover_card_controller.js +85 -0
- data/app/javascript/shadcn/controllers/input_group_controller.js +17 -0
- data/app/javascript/shadcn/controllers/input_otp_controller.js +80 -0
- data/app/javascript/shadcn/controllers/menubar_controller.js +151 -0
- data/app/javascript/shadcn/controllers/message_scroller_controller.js +456 -0
- data/app/javascript/shadcn/controllers/navigation_menu_controller.js +211 -0
- data/app/javascript/shadcn/controllers/popover_controller.js +66 -0
- data/app/javascript/shadcn/controllers/radio_group_controller.js +69 -0
- data/app/javascript/shadcn/controllers/resizable_controller.js +167 -0
- data/app/javascript/shadcn/controllers/scroll_area_controller.js +253 -0
- data/app/javascript/shadcn/controllers/select_controller.js +320 -0
- data/app/javascript/shadcn/controllers/sidebar_controller.js +273 -0
- data/app/javascript/shadcn/controllers/slider_controller.js +230 -0
- data/app/javascript/shadcn/controllers/switch_controller.js +39 -0
- data/app/javascript/shadcn/controllers/tabs_controller.js +81 -0
- data/app/javascript/shadcn/controllers/theme_controller.js +67 -0
- data/app/javascript/shadcn/controllers/toaster_controller.js +281 -0
- data/app/javascript/shadcn/controllers/toggle_controller.js +24 -0
- data/app/javascript/shadcn/controllers/toggle_group_controller.js +73 -0
- data/app/javascript/shadcn/controllers/tooltip_controller.js +58 -0
- data/app/javascript/shadcn/direction.js +41 -0
- data/app/javascript/shadcn/dismiss.js +73 -0
- data/app/javascript/shadcn/floating.js +207 -0
- data/app/javascript/shadcn/focus.js +86 -0
- data/app/javascript/shadcn/id.js +14 -0
- data/app/javascript/shadcn/index.js +110 -0
- data/app/javascript/shadcn/popper.js +262 -0
- data/app/javascript/shadcn/scroll_geometry.js +267 -0
- data/app/javascript/shadcn/theme.js +161 -0
- data/app/javascript/shadcn/top_layer.js +59 -0
- data/app/javascript/shadcn/typeahead.js +99 -0
- data/config/importmap.rb +6 -0
- data/config/locales/en.yml +62 -0
- data/lib/generators/shadcn_view_component/install/install_generator.rb +149 -0
- data/lib/shadcn_view_component/engine.rb +73 -0
- data/lib/shadcn_view_component/form_builder.rb +264 -0
- data/lib/shadcn_view_component/icon_registry.rb +66 -0
- data/lib/shadcn_view_component/icons.rb +32 -0
- data/lib/shadcn_view_component/themes.rb +1065 -0
- data/lib/shadcn_view_component/version.rb +3 -0
- data/lib/shadcn_view_component.rb +82 -0
- data/lib/tasks/icons.rake +53 -0
- data/lib/tasks/themes.rake +171 -0
- metadata +608 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Shadcn
|
|
4
|
+
module Switch
|
|
5
|
+
# Port of registry/new-york-v4/ui/switch.tsx
|
|
6
|
+
class Component < ApplicationViewComponent
|
|
7
|
+
THUMB_CLASSES = "pointer-events-none block rounded-full bg-background ring-0 " \
|
|
8
|
+
"transition-transform group-data-[size=default]/switch:size-4 " \
|
|
9
|
+
"group-data-[size=sm]/switch:size-3 " \
|
|
10
|
+
"data-[state=checked]:translate-x-[calc(100%-2px)] " \
|
|
11
|
+
"data-[state=unchecked]:translate-x-0 " \
|
|
12
|
+
"dark:data-[state=checked]:bg-primary-foreground " \
|
|
13
|
+
"dark:data-[state=unchecked]:bg-foreground"
|
|
14
|
+
|
|
15
|
+
HIDDEN_INPUT_STYLE = "transform:translateX(-100%);position:absolute;" \
|
|
16
|
+
"pointer-events:none;opacity:0;margin:0"
|
|
17
|
+
|
|
18
|
+
default_tag :button
|
|
19
|
+
slot_name :switch
|
|
20
|
+
|
|
21
|
+
style do
|
|
22
|
+
base {
|
|
23
|
+
"peer group/switch inline-flex shrink-0 items-center rounded-full " \
|
|
24
|
+
"border border-transparent shadow-xs transition-all outline-none " \
|
|
25
|
+
"focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 " \
|
|
26
|
+
"disabled:cursor-not-allowed disabled:opacity-50 " \
|
|
27
|
+
"data-[size=default]:h-[1.15rem] data-[size=default]:w-8 " \
|
|
28
|
+
"data-[size=sm]:h-3.5 data-[size=sm]:w-6 " \
|
|
29
|
+
"data-[state=checked]:bg-primary data-[state=unchecked]:bg-input " \
|
|
30
|
+
"dark:data-[state=unchecked]:bg-input/80"
|
|
31
|
+
}
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
attr_reader :size, :name, :value, :checked, :disabled
|
|
35
|
+
|
|
36
|
+
def initialize(size: :default, name: nil, value: "on", checked: false, disabled: false,
|
|
37
|
+
**attributes)
|
|
38
|
+
@size = size&.to_sym || :default
|
|
39
|
+
@name = name
|
|
40
|
+
@value = value
|
|
41
|
+
@checked = checked
|
|
42
|
+
@disabled = disabled
|
|
43
|
+
super(**attributes)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def state
|
|
47
|
+
checked ? "checked" : "unchecked"
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def input_id
|
|
51
|
+
@input_id ||= "shadcn-switch-#{SecureRandom.hex(4)}" if name
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def element_attributes(**defaults)
|
|
55
|
+
super(**{
|
|
56
|
+
type: "button",
|
|
57
|
+
role: "switch",
|
|
58
|
+
value: value,
|
|
59
|
+
disabled: (true if disabled),
|
|
60
|
+
"aria-checked" => checked.to_s,
|
|
61
|
+
"data-state" => state,
|
|
62
|
+
"data-size" => size,
|
|
63
|
+
"data-disabled" => (true if disabled),
|
|
64
|
+
"data-controller" => "shadcn--switch",
|
|
65
|
+
"data-shadcn--switch-checked-value" => checked,
|
|
66
|
+
"data-shadcn--switch-disabled-value" => disabled,
|
|
67
|
+
"data-shadcn--switch-input-id-value" => input_id,
|
|
68
|
+
"data-action" => "click->shadcn--switch#toggle keydown->shadcn--switch#keydown"
|
|
69
|
+
}.merge(defaults))
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def call
|
|
73
|
+
safe_join([ render_element(body: thumb), hidden_input ].compact)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
private
|
|
77
|
+
|
|
78
|
+
def thumb
|
|
79
|
+
tag.span(
|
|
80
|
+
"data-slot": "switch-thumb",
|
|
81
|
+
"data-state": state,
|
|
82
|
+
"data-shadcn--switch-target": "thumb",
|
|
83
|
+
class: THUMB_CLASSES
|
|
84
|
+
)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def hidden_input
|
|
88
|
+
return unless name
|
|
89
|
+
|
|
90
|
+
tag.input(
|
|
91
|
+
type: "checkbox",
|
|
92
|
+
id: input_id,
|
|
93
|
+
name: name,
|
|
94
|
+
value: value,
|
|
95
|
+
checked: checked,
|
|
96
|
+
disabled: (true if disabled),
|
|
97
|
+
"aria-hidden": "true",
|
|
98
|
+
tabindex: "-1",
|
|
99
|
+
style: HIDDEN_INPUT_STYLE
|
|
100
|
+
)
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<%# A `<label for>` *does* name a `<button>` — button is a labelable element,
|
|
2
|
+
and Chrome's accessibility tree gives this switch the name "Airplane mode"
|
|
3
|
+
from the label alone (`relatedElement`, measured). This preview said the
|
|
4
|
+
opposite for as long as it existed, which is the misconception
|
|
5
|
+
decisions/04-bugs-fixed.md exists to correct.
|
|
6
|
+
|
|
7
|
+
So the first two follow upstream's own example and use `<label for>`. The
|
|
8
|
+
third and fourth have no visible label at all, which is what `aria-label`
|
|
9
|
+
is for; the FormBuilder wires `aria-labelledby` instead, because it already
|
|
10
|
+
renders the label and knows its id. All three name the control. %>
|
|
11
|
+
<div class="flex items-center gap-6">
|
|
12
|
+
<div class="flex items-center gap-2">
|
|
13
|
+
<%= render(Shadcn::Switch::Component.new(name: "airplane", id: "switch-airplane")) %>
|
|
14
|
+
<%= render(Shadcn::Label::Component.new(for: "switch-airplane")) { "Airplane mode" } %>
|
|
15
|
+
</div>
|
|
16
|
+
<div class="flex items-center gap-2">
|
|
17
|
+
<%= render(Shadcn::Switch::Component.new(size: :sm, checked: true, id: "switch-small")) %>
|
|
18
|
+
<%= render(Shadcn::Label::Component.new(for: "switch-small")) { "Small, on" } %>
|
|
19
|
+
</div>
|
|
20
|
+
<%= render(Shadcn::Switch::Component.new(disabled: true, "aria-label": "Disabled")) %>
|
|
21
|
+
<%# Upstream's "Invalid". Added here rather than to a page of its own: it is
|
|
22
|
+
one attribute, and it says more beside the states it is not. %>
|
|
23
|
+
<%= render(Shadcn::Switch::Component.new("aria-invalid": "true", "aria-label": "Invalid")) %>
|
|
24
|
+
</div>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Shadcn
|
|
4
|
+
module Table
|
|
5
|
+
# Port of registry/new-york-v4/ui/table.tsx
|
|
6
|
+
#
|
|
7
|
+
# shadcn always wraps the table in a scroll container carrying
|
|
8
|
+
# `data-slot="table-container"`.
|
|
9
|
+
class Component < ApplicationViewComponent
|
|
10
|
+
CONTAINER_CLASSES = "relative w-full overflow-x-auto"
|
|
11
|
+
|
|
12
|
+
default_tag :table
|
|
13
|
+
slot_name :table
|
|
14
|
+
|
|
15
|
+
style do
|
|
16
|
+
base { "w-full caption-bottom text-sm" }
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def call
|
|
20
|
+
tag.div("data-slot": "table-container", class: CONTAINER_CLASSES) do
|
|
21
|
+
render_element(body: content)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Shadcn
|
|
4
|
+
module Table
|
|
5
|
+
class Preview < ApplicationViewComponentPreview
|
|
6
|
+
def default
|
|
7
|
+
render_with_template
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# Upstream's "Footer": a `<tfoot>` totalling the rows above it.
|
|
11
|
+
def footer
|
|
12
|
+
render_with_template
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<%= render(Shadcn::Table::Component.new) do %>
|
|
2
|
+
<%= render(Shadcn::Table::Caption::Component.new) { "A list of your recent invoices." } %>
|
|
3
|
+
<%= render(Shadcn::Table::Header::Component.new) do %>
|
|
4
|
+
<%= render(Shadcn::Table::Row::Component.new) do %>
|
|
5
|
+
<% ["Invoice", "Status", "Method", "Amount"].each do |head| %>
|
|
6
|
+
<%= render(Shadcn::Table::Head::Component.new) { head } %>
|
|
7
|
+
<% end %>
|
|
8
|
+
<% end %>
|
|
9
|
+
<% end %>
|
|
10
|
+
<%= render(Shadcn::Table::Body::Component.new) do %>
|
|
11
|
+
<% [["INV001", "Paid", "Credit Card", "$250.00"], ["INV002", "Pending", "PayPal", "$150.00"]].each do |row| %>
|
|
12
|
+
<%= render(Shadcn::Table::Row::Component.new) do %>
|
|
13
|
+
<% row.each do |cell| %>
|
|
14
|
+
<%= render(Shadcn::Table::Cell::Component.new) { cell } %>
|
|
15
|
+
<% end %>
|
|
16
|
+
<% end %>
|
|
17
|
+
<% end %>
|
|
18
|
+
<% end %>
|
|
19
|
+
<% end %>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<%# Upstream's "Footer": a `<tfoot>` totalling the rows above it. %>
|
|
2
|
+
<%= render(Shadcn::Table::Component.new) do %>
|
|
3
|
+
<%= render(Shadcn::Table::Header::Component.new) do %>
|
|
4
|
+
<%= render(Shadcn::Table::Row::Component.new) do %>
|
|
5
|
+
<% ["Invoice", "Status", "Method", "Amount"].each do |head| %>
|
|
6
|
+
<%= render(Shadcn::Table::Head::Component.new) { head } %>
|
|
7
|
+
<% end %>
|
|
8
|
+
<% end %>
|
|
9
|
+
<% end %>
|
|
10
|
+
<%= render(Shadcn::Table::Body::Component.new) do %>
|
|
11
|
+
<% [["INV001", "Paid", "Credit Card", "$250.00"],
|
|
12
|
+
["INV002", "Pending", "PayPal", "$150.00"],
|
|
13
|
+
["INV003", "Unpaid", "Bank Transfer", "$350.00"]].each do |row| %>
|
|
14
|
+
<%= render(Shadcn::Table::Row::Component.new) do %>
|
|
15
|
+
<% row.each { |cell| %><%= render(Shadcn::Table::Cell::Component.new) { cell } %><% } %>
|
|
16
|
+
<% end %>
|
|
17
|
+
<% end %>
|
|
18
|
+
<% end %>
|
|
19
|
+
<%= render(Shadcn::Table::Footer::Component.new) do %>
|
|
20
|
+
<%= render(Shadcn::Table::Row::Component.new) do %>
|
|
21
|
+
<%= render(Shadcn::Table::Cell::Component.new(colspan: 3)) { "Total" } %>
|
|
22
|
+
<%= render(Shadcn::Table::Cell::Component.new) { "$750.00" } %>
|
|
23
|
+
<% end %>
|
|
24
|
+
<% end %>
|
|
25
|
+
<% end %>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Shadcn
|
|
4
|
+
# The parts of the Table family that are just an element with a
|
|
5
|
+
# `data-slot` and a fixed set of classes. Anything with variants, slots or
|
|
6
|
+
# markup of its own keeps its own `component.rb`.
|
|
7
|
+
module Table
|
|
8
|
+
extend Parts
|
|
9
|
+
|
|
10
|
+
part :body, tag: :tbody, slot: "table-body", classes: "[&_tr:last-child]:border-0"
|
|
11
|
+
|
|
12
|
+
part :caption, tag: :caption, slot: "table-caption",
|
|
13
|
+
classes: "mt-4 text-sm text-muted-foreground"
|
|
14
|
+
|
|
15
|
+
part :cell, tag: :td, slot: "table-cell",
|
|
16
|
+
classes: "p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 " \
|
|
17
|
+
"[&>[role=checkbox]]:translate-y-[2px]"
|
|
18
|
+
|
|
19
|
+
part :footer, tag: :tfoot, slot: "table-footer",
|
|
20
|
+
classes: "border-t bg-muted/50 font-medium [&>tr]:last:border-b-0"
|
|
21
|
+
|
|
22
|
+
part :head, tag: :th, slot: "table-head",
|
|
23
|
+
classes: "h-10 px-2 text-left align-middle font-medium whitespace-nowrap " \
|
|
24
|
+
"text-foreground [&:has([role=checkbox])]:pr-0 " \
|
|
25
|
+
"[&>[role=checkbox]]:translate-y-[2px]"
|
|
26
|
+
|
|
27
|
+
part :header, tag: :thead, slot: "table-header", classes: "[&_tr]:border-b"
|
|
28
|
+
|
|
29
|
+
part :row, tag: :tr, slot: "table-row",
|
|
30
|
+
classes: "border-b transition-colors hover:bg-muted/50 " \
|
|
31
|
+
"has-aria-expanded:bg-muted/50 data-[state=selected]:bg-muted"
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Shadcn
|
|
4
|
+
module Tabs
|
|
5
|
+
# Port of registry/new-york-v4/ui/tabs.tsx
|
|
6
|
+
class Component < ApplicationViewComponent
|
|
7
|
+
renders_one :list, "Shadcn::Tabs::List::Component"
|
|
8
|
+
renders_many :panels, "Shadcn::Tabs::Content::Component"
|
|
9
|
+
|
|
10
|
+
slot_name :tabs
|
|
11
|
+
|
|
12
|
+
style do
|
|
13
|
+
base { "group/tabs flex gap-2 data-[orientation=horizontal]:flex-col" }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
attr_reader :orientation, :value, :activation
|
|
17
|
+
|
|
18
|
+
def initialize(value: nil, orientation: :horizontal, activation: :automatic, **attributes)
|
|
19
|
+
@value = value.to_s
|
|
20
|
+
@orientation = orientation&.to_sym || :horizontal
|
|
21
|
+
@activation = activation&.to_sym || :automatic
|
|
22
|
+
super(**attributes)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def element_attributes(**defaults)
|
|
26
|
+
super(**{
|
|
27
|
+
"data-orientation" => orientation,
|
|
28
|
+
"data-controller" => "shadcn--tabs",
|
|
29
|
+
"data-shadcn--tabs-value-value" => value,
|
|
30
|
+
"data-shadcn--tabs-orientation-value" => orientation,
|
|
31
|
+
"data-shadcn--tabs-activation-value" => activation
|
|
32
|
+
}.merge(defaults))
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def call
|
|
36
|
+
render_element(body: safe_join([ list, panels, content ].flatten.compact))
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Shadcn
|
|
4
|
+
module Tabs
|
|
5
|
+
module Content
|
|
6
|
+
# TabsContent
|
|
7
|
+
class Component < ApplicationViewComponent
|
|
8
|
+
slot_name :"tabs-content"
|
|
9
|
+
|
|
10
|
+
style do
|
|
11
|
+
base { "flex-1 outline-none" }
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
attr_reader :value
|
|
15
|
+
|
|
16
|
+
def initialize(value:, **attributes)
|
|
17
|
+
@value = value.to_s
|
|
18
|
+
super(**attributes)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def element_attributes(**defaults)
|
|
22
|
+
super(**{
|
|
23
|
+
role: "tabpanel",
|
|
24
|
+
tabindex: "0",
|
|
25
|
+
hidden: true,
|
|
26
|
+
"data-state" => "inactive",
|
|
27
|
+
"data-value" => value,
|
|
28
|
+
"data-shadcn--tabs-target" => "content"
|
|
29
|
+
}.merge(defaults))
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Shadcn
|
|
4
|
+
module Tabs
|
|
5
|
+
module List
|
|
6
|
+
# TabsList
|
|
7
|
+
class Component < ApplicationViewComponent
|
|
8
|
+
renders_many :triggers, "Shadcn::Tabs::Trigger::Component"
|
|
9
|
+
|
|
10
|
+
slot_name :"tabs-list"
|
|
11
|
+
|
|
12
|
+
style do
|
|
13
|
+
base {
|
|
14
|
+
"group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] " \
|
|
15
|
+
"text-muted-foreground group-data-[orientation=horizontal]/tabs:h-9 " \
|
|
16
|
+
"group-data-[orientation=vertical]/tabs:h-fit " \
|
|
17
|
+
"group-data-[orientation=vertical]/tabs:flex-col data-[variant=line]:rounded-none"
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
variants {
|
|
21
|
+
variant {
|
|
22
|
+
default { "bg-muted" }
|
|
23
|
+
line { "gap-1 bg-transparent" }
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
defaults { { variant: :default } }
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
attr_reader :variant
|
|
31
|
+
|
|
32
|
+
def initialize(variant: :default, **attributes)
|
|
33
|
+
@variant = variant&.to_sym || :default
|
|
34
|
+
super(**attributes)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def style_variants
|
|
38
|
+
{ variant: }
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def element_attributes(**defaults)
|
|
42
|
+
super(**{ role: "tablist", "data-variant" => variant }.merge(defaults))
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def call
|
|
46
|
+
render_element(body: safe_join([ triggers, content ].flatten.compact))
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Shadcn
|
|
4
|
+
module Tabs
|
|
5
|
+
class Preview < ApplicationViewComponentPreview
|
|
6
|
+
def default
|
|
7
|
+
render_with_template
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# Upstream's "Line" variant and its "Vertical" orientation.
|
|
11
|
+
def line
|
|
12
|
+
render_with_template
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<%# Three tabs rather than upstream's two, and the count is load-bearing. Arrow
|
|
2
|
+
navigation wraps, so with two triggers "forward" and "backward" both land on
|
|
3
|
+
the other one — which made every reading-direction assertion in
|
|
4
|
+
`spec/system/direction_spec.rb` pass without the code under test. Three is
|
|
5
|
+
the smallest number at which the two are distinguishable. %>
|
|
6
|
+
<%= render(Shadcn::Tabs::Component.new(value: "account", class: "w-[420px]")) do |t| %>
|
|
7
|
+
<% t.with_list do |l| %>
|
|
8
|
+
<% l.with_trigger(value: "account") { "Account" } %>
|
|
9
|
+
<% l.with_trigger(value: "password") { "Password" } %>
|
|
10
|
+
<% l.with_trigger(value: "sessions") { "Sessions" } %>
|
|
11
|
+
<% end %>
|
|
12
|
+
<% t.with_panel(value: "account") do %>
|
|
13
|
+
<div class="rounded-lg border p-4 text-sm">Make changes to your account here.</div>
|
|
14
|
+
<% end %>
|
|
15
|
+
<% t.with_panel(value: "password") do %>
|
|
16
|
+
<div class="rounded-lg border p-4 text-sm">Change your password here.</div>
|
|
17
|
+
<% end %>
|
|
18
|
+
<% t.with_panel(value: "sessions") do %>
|
|
19
|
+
<div class="rounded-lg border p-4 text-sm">Sign out of other devices.</div>
|
|
20
|
+
<% end %>
|
|
21
|
+
<% end %>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<%# Upstream's "Line" variant of the list, and its "Vertical" orientation —
|
|
2
|
+
both of which the list and the root take as their own arguments. %>
|
|
3
|
+
<div class="flex flex-col gap-8">
|
|
4
|
+
<%= render(Shadcn::Tabs::Component.new(value: "overview", class: "w-[420px]")) do |t| %>
|
|
5
|
+
<% t.with_list(variant: :line) do |l| %>
|
|
6
|
+
<% l.with_trigger(value: "overview") { "Overview" } %>
|
|
7
|
+
<% l.with_trigger(value: "activity") { "Activity" } %>
|
|
8
|
+
<% l.with_trigger(value: "settings", disabled: true) { "Settings" } %>
|
|
9
|
+
<% end %>
|
|
10
|
+
<% t.with_panel(value: "overview") { "What happened this week." } %>
|
|
11
|
+
<% t.with_panel(value: "activity") { "Everything, in order." } %>
|
|
12
|
+
<% t.with_panel(value: "settings") { "Not reachable — the trigger is disabled." } %>
|
|
13
|
+
<% end %>
|
|
14
|
+
|
|
15
|
+
<%= render(Shadcn::Tabs::Component.new(value: "account", orientation: :vertical, class: "w-[420px]")) do |t| %>
|
|
16
|
+
<% t.with_list do |l| %>
|
|
17
|
+
<% l.with_trigger(value: "account") { "Account" } %>
|
|
18
|
+
<% l.with_trigger(value: "billing") { "Billing" } %>
|
|
19
|
+
<% end %>
|
|
20
|
+
<% t.with_panel(value: "account") { "Names and addresses." } %>
|
|
21
|
+
<% t.with_panel(value: "billing") { "Cards and invoices." } %>
|
|
22
|
+
<% end %>
|
|
23
|
+
</div>
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Shadcn
|
|
4
|
+
module Tabs
|
|
5
|
+
module Trigger
|
|
6
|
+
# TabsTrigger
|
|
7
|
+
class Component < ApplicationViewComponent
|
|
8
|
+
default_tag :button
|
|
9
|
+
slot_name :"tabs-trigger"
|
|
10
|
+
|
|
11
|
+
style do
|
|
12
|
+
base {
|
|
13
|
+
"relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 " \
|
|
14
|
+
"rounded-md border border-transparent px-2 py-1 text-sm font-medium " \
|
|
15
|
+
"whitespace-nowrap text-foreground/60 transition-all " \
|
|
16
|
+
"group-data-[orientation=vertical]/tabs:w-full " \
|
|
17
|
+
"group-data-[orientation=vertical]/tabs:justify-start hover:text-foreground " \
|
|
18
|
+
"focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 " \
|
|
19
|
+
"focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none " \
|
|
20
|
+
"disabled:opacity-50 " \
|
|
21
|
+
"group-data-[variant=default]/tabs-list:data-[state=active]:shadow-sm " \
|
|
22
|
+
"group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none " \
|
|
23
|
+
"dark:text-muted-foreground dark:hover:text-foreground " \
|
|
24
|
+
"[&_svg]:pointer-events-none [&_svg]:shrink-0 " \
|
|
25
|
+
"[&_svg:not([class*='size-'])]:size-4 " \
|
|
26
|
+
"group-data-[variant=line]/tabs-list:bg-transparent " \
|
|
27
|
+
"group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent " \
|
|
28
|
+
"dark:group-data-[variant=line]/tabs-list:data-[state=active]:border-transparent " \
|
|
29
|
+
"dark:group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent " \
|
|
30
|
+
"data-[state=active]:bg-background data-[state=active]:text-foreground " \
|
|
31
|
+
"dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 " \
|
|
32
|
+
"dark:data-[state=active]:text-foreground " \
|
|
33
|
+
"after:absolute after:bg-foreground after:opacity-0 after:transition-opacity " \
|
|
34
|
+
"group-data-[orientation=horizontal]/tabs:after:inset-x-0 " \
|
|
35
|
+
"group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] " \
|
|
36
|
+
"group-data-[orientation=horizontal]/tabs:after:h-0.5 " \
|
|
37
|
+
"group-data-[orientation=vertical]/tabs:after:inset-y-0 " \
|
|
38
|
+
"group-data-[orientation=vertical]/tabs:after:-right-1 " \
|
|
39
|
+
"group-data-[orientation=vertical]/tabs:after:w-0.5 " \
|
|
40
|
+
"group-data-[variant=line]/tabs-list:data-[state=active]:after:opacity-100"
|
|
41
|
+
}
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
attr_reader :value
|
|
45
|
+
|
|
46
|
+
def initialize(value:, **attributes)
|
|
47
|
+
@value = value.to_s
|
|
48
|
+
super(**attributes)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def element_attributes(**defaults)
|
|
52
|
+
super(**{
|
|
53
|
+
type: "button",
|
|
54
|
+
role: "tab",
|
|
55
|
+
"aria-selected" => "false",
|
|
56
|
+
tabindex: "-1",
|
|
57
|
+
"data-state" => "inactive",
|
|
58
|
+
"data-value" => value,
|
|
59
|
+
"data-shadcn--tabs-target" => "trigger",
|
|
60
|
+
"data-action" => "click->shadcn--tabs#select keydown->shadcn--tabs#keydown"
|
|
61
|
+
}.merge(defaults))
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Shadcn
|
|
4
|
+
module Textarea
|
|
5
|
+
# Port of registry/new-york-v4/ui/textarea.tsx
|
|
6
|
+
class Component < ApplicationViewComponent
|
|
7
|
+
default_tag :textarea
|
|
8
|
+
slot_name :textarea
|
|
9
|
+
|
|
10
|
+
style do
|
|
11
|
+
base {
|
|
12
|
+
"flex field-sizing-content min-h-16 w-full rounded-md border border-input " \
|
|
13
|
+
"bg-transparent px-3 py-2 text-base shadow-xs " \
|
|
14
|
+
"transition-[color,box-shadow] outline-none " \
|
|
15
|
+
"placeholder:text-muted-foreground focus-visible:border-ring " \
|
|
16
|
+
"focus-visible:ring-[3px] focus-visible:ring-ring/50 " \
|
|
17
|
+
"disabled:cursor-not-allowed disabled:opacity-50 " \
|
|
18
|
+
"aria-invalid:border-destructive aria-invalid:ring-destructive/20 " \
|
|
19
|
+
"md:text-sm dark:bg-input/30 dark:aria-invalid:ring-destructive/40"
|
|
20
|
+
}
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Shadcn
|
|
4
|
+
module Textarea
|
|
5
|
+
class Preview < ApplicationViewComponentPreview
|
|
6
|
+
def default
|
|
7
|
+
render_with_template
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# Upstream's "Disabled" and "Invalid".
|
|
11
|
+
def states
|
|
12
|
+
render_with_template
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<%# Upstream's "Disabled" and "Invalid", together for the same reason as the
|
|
2
|
+
input's: they are attributes rather than variants. Labelled for the same
|
|
3
|
+
reason too — axe counts a placeholder as a name, and the invalid one has a
|
|
4
|
+
value instead of a placeholder. %>
|
|
5
|
+
<div class="flex w-[320px] flex-col gap-4">
|
|
6
|
+
<div class="flex flex-col gap-2">
|
|
7
|
+
<%= render(Shadcn::Label::Component.new(for: "ta-ordinary")) { "Ordinary" } %>
|
|
8
|
+
<%= render(Shadcn::Textarea::Component.new(id: "ta-ordinary", placeholder: "Tell us about it")) %>
|
|
9
|
+
</div>
|
|
10
|
+
<div class="flex flex-col gap-2">
|
|
11
|
+
<%= render(Shadcn::Label::Component.new(for: "ta-disabled")) { "Disabled" } %>
|
|
12
|
+
<%= render(Shadcn::Textarea::Component.new(id: "ta-disabled", disabled: true)) %>
|
|
13
|
+
</div>
|
|
14
|
+
<div class="flex flex-col gap-2">
|
|
15
|
+
<%= render(Shadcn::Label::Component.new(for: "ta-invalid")) { "Invalid" } %>
|
|
16
|
+
<%= render(Shadcn::Textarea::Component.new(id: "ta-invalid", "aria-invalid": "true")) { "Too short" } %>
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|