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,139 @@
|
|
|
1
|
+
import { Controller } from "@hotwired/stimulus"
|
|
2
|
+
import { directionAwareKey, readDirection } from "shadcn/direction"
|
|
3
|
+
|
|
4
|
+
// The six things `carousel.tsx` asks embla for — `scrollPrev`, `scrollNext`,
|
|
5
|
+
// `canScrollPrev`, `canScrollNext`, and the `select`/`reInit` events — asked of
|
|
6
|
+
// a scroll container instead. The viewport snaps, so the browser owns the
|
|
7
|
+
// dragging, the momentum and where a release lands; this reads one number to
|
|
8
|
+
// answer the two questions and writes one to move.
|
|
9
|
+
//
|
|
10
|
+
// What that leaves out is real and is in features/carousel.md: no `loop`, no
|
|
11
|
+
// `align`, no `slidesToScroll`, no plugins, and no mouse-drag — a finger drags
|
|
12
|
+
// a scroller, a cursor does not, and embla implements that itself.
|
|
13
|
+
export default class extends Controller {
|
|
14
|
+
static targets = [ "viewport", "previous", "next" ]
|
|
15
|
+
static values = { orientation: { type: String, default: "horizontal" } }
|
|
16
|
+
|
|
17
|
+
connect() {
|
|
18
|
+
this.update = this.update.bind(this)
|
|
19
|
+
this.viewportTarget.addEventListener("scroll", this.update, { passive: true })
|
|
20
|
+
|
|
21
|
+
this.alignSnapPoints()
|
|
22
|
+
|
|
23
|
+
// A slide is as wide as the viewport until a caller says otherwise, so both
|
|
24
|
+
// answers change when the box does.
|
|
25
|
+
this.resizes = new ResizeObserver(this.update)
|
|
26
|
+
this.resizes.observe(this.viewportTarget)
|
|
27
|
+
|
|
28
|
+
this.update()
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
disconnect() {
|
|
32
|
+
this.viewportTarget.removeEventListener("scroll", this.update)
|
|
33
|
+
this.resizes.disconnect()
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
get vertical() {
|
|
37
|
+
return this.orientationValue === "vertical"
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
get position() {
|
|
41
|
+
return this.vertical ? this.viewportTarget.scrollTop : this.viewportTarget.scrollLeft
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
get extent() {
|
|
45
|
+
const el = this.viewportTarget
|
|
46
|
+
|
|
47
|
+
return this.vertical ? el.scrollHeight - el.clientHeight : el.scrollWidth - el.clientWidth
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
get items() {
|
|
51
|
+
return [ ...this.viewportTarget.querySelectorAll("[data-slot=carousel-item]") ]
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// A slide begins where its *content* begins, and `scroll-snap-align: start`
|
|
55
|
+
// aligns a box. The track carries a negative margin against each item's
|
|
56
|
+
// padding — upstream's gutter, `-ml-4` against `pl-4` — so an item's box
|
|
57
|
+
// starts a gutter before what it holds, and snapping the box to the window
|
|
58
|
+
// pushes a gutter of the card past the far edge. One border's worth, which is
|
|
59
|
+
// how this was reported twice.
|
|
60
|
+
//
|
|
61
|
+
// A negative `scroll-margin` moves each item's snap area onto its content.
|
|
62
|
+
// Read from the item rather than fixed at `1rem`, because the gutter is the
|
|
63
|
+
// caller's: upstream's "Spacing" example halves it.
|
|
64
|
+
alignSnapPoints() {
|
|
65
|
+
for (const item of this.items) {
|
|
66
|
+
const style = getComputedStyle(item)
|
|
67
|
+
const gutter = parseFloat(this.vertical ? style.paddingTop : style.paddingLeft) || 0
|
|
68
|
+
|
|
69
|
+
item.style[this.vertical ? "scrollMarginTop" : "scrollMarginLeft"] = `${-gutter}px`
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Which slide is at the window's start. Asked of the page rather than worked
|
|
74
|
+
// out: every version of this that did arithmetic got it wrong — once by a
|
|
75
|
+
// gutter, once by landing between the browser's own snap points — and the
|
|
76
|
+
// page always knows.
|
|
77
|
+
get leadingIndex() {
|
|
78
|
+
const box = this.viewportTarget.getBoundingClientRect()
|
|
79
|
+
const start = this.vertical ? box.top : box.left
|
|
80
|
+
const distances = this.items.map((item) => {
|
|
81
|
+
const rect = item.getBoundingClientRect()
|
|
82
|
+
|
|
83
|
+
return Math.abs((this.vertical ? rect.top : rect.left) - start)
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
return distances.indexOf(Math.min(...distances))
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
previous() {
|
|
90
|
+
this.go(-1)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
next() {
|
|
94
|
+
this.go(1)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
keydown(event) {
|
|
98
|
+
const key = directionAwareKey(event.key, readDirection(this.element))
|
|
99
|
+
|
|
100
|
+
if (key === "ArrowLeft") {
|
|
101
|
+
event.preventDefault()
|
|
102
|
+
this.previous()
|
|
103
|
+
} else if (key === "ArrowRight") {
|
|
104
|
+
event.preventDefault()
|
|
105
|
+
this.next()
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// The slide next to the one in front, placed by the browser rather than by a
|
|
110
|
+
// number of this controller's own. `scrollIntoView` uses the same alignment a
|
|
111
|
+
// released drag settles on, so a finger and a button cannot disagree.
|
|
112
|
+
//
|
|
113
|
+
// `nearest` on the other axis so the page does not move under a horizontal
|
|
114
|
+
// carousel. No `behavior`: `scroll-behavior` is declared in CSS under a
|
|
115
|
+
// reduced-motion guard, and a context that has decided not to animate can
|
|
116
|
+
// leave a `behavior: "smooth"` scroll unstarted rather than instant.
|
|
117
|
+
go(direction) {
|
|
118
|
+
const item = this.items[this.leadingIndex + direction]
|
|
119
|
+
if (!item) return
|
|
120
|
+
|
|
121
|
+
item.scrollIntoView(this.vertical
|
|
122
|
+
? { block: "start", inline: "nearest" }
|
|
123
|
+
: { inline: "start", block: "nearest" })
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// A pixel of slack at each end: a smooth scroll settles on a fractional
|
|
127
|
+
// position often enough that an exact comparison leaves the button that just
|
|
128
|
+
// worked looking broken.
|
|
129
|
+
update() {
|
|
130
|
+
const at = this.position
|
|
131
|
+
|
|
132
|
+
this.toggle(this.hasPreviousTarget && this.previousTarget, at > 1)
|
|
133
|
+
this.toggle(this.hasNextTarget && this.nextTarget, at < this.extent - 1)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
toggle(button, enabled) {
|
|
137
|
+
if (button) button.disabled = !enabled
|
|
138
|
+
}
|
|
139
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { Controller } from "@hotwired/stimulus"
|
|
2
|
+
|
|
3
|
+
// The chart is drawn by the server — every mark is already in the document,
|
|
4
|
+
// with its label and the value it should show. This is the half a static SVG
|
|
5
|
+
// cannot do: move the tooltip, for a pointer and for the arrow keys.
|
|
6
|
+
//
|
|
7
|
+
// Nothing here computes anything about the data. It reads what the mark
|
|
8
|
+
// carries and moves a panel, which is why a chart of a hundred marks costs the
|
|
9
|
+
// same as a chart of three.
|
|
10
|
+
export default class extends Controller {
|
|
11
|
+
static targets = [ "mark", "tooltip", "label", "name", "value", "indicator" ]
|
|
12
|
+
|
|
13
|
+
// Far enough that the tooltip does not sit under the pointer that summoned
|
|
14
|
+
// it, which is what makes it flicker.
|
|
15
|
+
static OFFSET = 12
|
|
16
|
+
|
|
17
|
+
static STEPS = { ArrowRight: 1, ArrowDown: 1, ArrowLeft: -1, ArrowUp: -1 }
|
|
18
|
+
|
|
19
|
+
show(event) {
|
|
20
|
+
this.fill(event.currentTarget)
|
|
21
|
+
this.tooltipTarget.hidden = false
|
|
22
|
+
this.place(event)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
move(event) {
|
|
26
|
+
if (!this.tooltipTarget.hidden) this.place(event)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
hide() {
|
|
30
|
+
this.tooltipTarget.hidden = true
|
|
31
|
+
this.cursor = null
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// The other way to the tooltip, for someone who sees the chart and has no
|
|
35
|
+
// pointer. The graphic carries `role="application"`, which is what keeps a
|
|
36
|
+
// screen reader from taking the arrow keys before they arrive here; the
|
|
37
|
+
// numbers themselves are in the table beside it, so nothing is announced
|
|
38
|
+
// from this — it moves a panel, and that is all it claims to do.
|
|
39
|
+
navigate(event) {
|
|
40
|
+
if (event.key === "Escape") return this.hide()
|
|
41
|
+
|
|
42
|
+
const marks = this.markTargets
|
|
43
|
+
const step = this.constructor.STEPS[event.key]
|
|
44
|
+
if (!marks.length) return
|
|
45
|
+
if (step === undefined && !["Home", "End"].includes(event.key)) return
|
|
46
|
+
|
|
47
|
+
event.preventDefault()
|
|
48
|
+
this.cursor = this.next(event.key, step, marks.length)
|
|
49
|
+
|
|
50
|
+
const mark = marks[this.cursor]
|
|
51
|
+
this.fill(mark)
|
|
52
|
+
this.tooltipTarget.hidden = false
|
|
53
|
+
this.placeOn(mark)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Clamped rather than wrapped: an edge you can feel is how you know the
|
|
57
|
+
// series ended, where wrapping reads as a chart that starts over.
|
|
58
|
+
next(key, step, count) {
|
|
59
|
+
if (key === "Home") return 0
|
|
60
|
+
if (key === "End") return count - 1
|
|
61
|
+
if (this.cursor == null) return step > 0 ? 0 : count - 1
|
|
62
|
+
|
|
63
|
+
return Math.min(Math.max(this.cursor + step, 0), count - 1)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// A pie's label and its series name are the same word, so the pie sends one
|
|
67
|
+
// and both cells take it. A bar's are not: the label is the category it
|
|
68
|
+
// stands in and the name is the series it belongs to.
|
|
69
|
+
fill(mark) {
|
|
70
|
+
const { label, name = label, display, key } = mark.dataset
|
|
71
|
+
|
|
72
|
+
if (this.hasLabelTarget) this.labelTarget.textContent = label
|
|
73
|
+
if (this.hasNameTarget) this.nameTarget.textContent = name
|
|
74
|
+
if (this.hasValueTarget) this.valueTarget.textContent = display
|
|
75
|
+
// The swatch takes the mark's own fill rather than a colour repeated in
|
|
76
|
+
// JavaScript: `--color-<key>` is published on the container, so the two can
|
|
77
|
+
// never disagree.
|
|
78
|
+
if (this.hasIndicatorTarget) {
|
|
79
|
+
this.indicatorTarget.style.setProperty("--color-bg", `var(--color-${key})`)
|
|
80
|
+
this.indicatorTarget.style.setProperty("--color-border", `var(--color-${key})`)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
place(event) {
|
|
85
|
+
this.moveTo(event.clientX, event.clientY)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// A keyboard has no pointer to follow, so the mark itself is the anchor —
|
|
89
|
+
// the top of the bar, the top of the slice's box.
|
|
90
|
+
placeOn(mark) {
|
|
91
|
+
const box = mark.getBoundingClientRect()
|
|
92
|
+
|
|
93
|
+
this.moveTo(box.left + box.width / 2, box.top)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Positioned against the container, so a scrolled page or a chart inside a
|
|
97
|
+
// card needs no measuring of its own — and kept inside it, because a tooltip
|
|
98
|
+
// that hangs off the edge is what a caller's `overflow-hidden` clips.
|
|
99
|
+
moveTo(clientX, clientY) {
|
|
100
|
+
const box = this.element.getBoundingClientRect()
|
|
101
|
+
const tooltip = this.tooltipTarget.getBoundingClientRect()
|
|
102
|
+
const offset = this.constructor.OFFSET
|
|
103
|
+
|
|
104
|
+
const x = clientX - box.left + offset
|
|
105
|
+
const y = clientY - box.top + offset
|
|
106
|
+
|
|
107
|
+
this.tooltipTarget.style.left = `${Math.min(Math.max(0, x), Math.max(0, box.width - tooltip.width))}px`
|
|
108
|
+
this.tooltipTarget.style.top = `${Math.min(Math.max(0, y), Math.max(0, box.height - tooltip.height))}px`
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Controller } from "@hotwired/stimulus"
|
|
2
|
+
|
|
3
|
+
// Radix's Checkbox: a `role="checkbox"` button plus a hidden native input that
|
|
4
|
+
// carries the value into the form. The indicator is mounted only while checked,
|
|
5
|
+
// so it is detached rather than hidden.
|
|
6
|
+
export default class extends Controller {
|
|
7
|
+
static targets = [ "indicator" ]
|
|
8
|
+
static values = { checked: Boolean, indeterminate: Boolean, disabled: Boolean, inputId: String }
|
|
9
|
+
|
|
10
|
+
connect() {
|
|
11
|
+
this.indicator = this.hasIndicatorTarget ? this.indicatorTarget : null
|
|
12
|
+
// Radix renders the hidden input as a *sibling* of the button, so it lives
|
|
13
|
+
// outside this controller's scope and is looked up by id instead.
|
|
14
|
+
this.input = this.inputIdValue ? document.getElementById(this.inputIdValue) : null
|
|
15
|
+
this.render()
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
toggle(event) {
|
|
19
|
+
if (this.disabledValue) return
|
|
20
|
+
event?.preventDefault()
|
|
21
|
+
|
|
22
|
+
this.indeterminateValue = false
|
|
23
|
+
this.checkedValue = !this.checkedValue
|
|
24
|
+
this.render()
|
|
25
|
+
this.dispatch("change", { detail: { checked: this.checkedValue } })
|
|
26
|
+
|
|
27
|
+
if (this.input) this.input.dispatchEvent(new Event("change", { bubbles: true }))
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
keydown(event) {
|
|
31
|
+
// Enter must not submit the surrounding form, matching Radix.
|
|
32
|
+
if (event.key === "Enter") event.preventDefault()
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
get state() {
|
|
36
|
+
if (this.indeterminateValue) return "indeterminate"
|
|
37
|
+
return this.checkedValue ? "checked" : "unchecked"
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
render() {
|
|
41
|
+
const state = this.state
|
|
42
|
+
|
|
43
|
+
this.element.dataset.state = state
|
|
44
|
+
this.element.setAttribute(
|
|
45
|
+
"aria-checked",
|
|
46
|
+
state === "indeterminate" ? "mixed" : String(this.checkedValue)
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
if (this.input) this.input.checked = this.checkedValue
|
|
50
|
+
|
|
51
|
+
if (!this.indicator) return
|
|
52
|
+
|
|
53
|
+
if (state === "unchecked") {
|
|
54
|
+
this.indicator.remove()
|
|
55
|
+
} else {
|
|
56
|
+
this.indicator.dataset.state = state
|
|
57
|
+
this.indicator.hidden = false
|
|
58
|
+
if (!this.indicator.isConnected) this.element.appendChild(this.indicator)
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Controller } from "@hotwired/stimulus"
|
|
2
|
+
import { uniqueId } from "shadcn/id"
|
|
3
|
+
|
|
4
|
+
// Radix's Collapsible. `--radix-collapsible-content-height` is published so
|
|
5
|
+
// height transitions have something to animate towards.
|
|
6
|
+
export default class extends Controller {
|
|
7
|
+
static targets = [ "trigger", "content" ]
|
|
8
|
+
static values = { open: Boolean, disabled: Boolean }
|
|
9
|
+
|
|
10
|
+
connect() {
|
|
11
|
+
this.render()
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
toggle() {
|
|
15
|
+
if (this.disabledValue) return
|
|
16
|
+
|
|
17
|
+
this.openValue = !this.openValue
|
|
18
|
+
this.render()
|
|
19
|
+
this.dispatch("toggle", { detail: { open: this.openValue } })
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
render() {
|
|
23
|
+
const state = this.openValue ? "open" : "closed"
|
|
24
|
+
|
|
25
|
+
this.element.dataset.state = state
|
|
26
|
+
if (this.disabledValue) this.element.dataset.disabled = ""
|
|
27
|
+
|
|
28
|
+
if (this.hasTriggerTarget) {
|
|
29
|
+
this.triggerTarget.dataset.state = state
|
|
30
|
+
this.triggerTarget.setAttribute("aria-expanded", String(this.openValue))
|
|
31
|
+
if (this.hasContentTarget) {
|
|
32
|
+
this.triggerTarget.setAttribute("aria-controls", this.contentId)
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (!this.hasContentTarget) return
|
|
37
|
+
|
|
38
|
+
const content = this.contentTarget
|
|
39
|
+
content.id = this.contentId
|
|
40
|
+
content.dataset.state = state
|
|
41
|
+
content.hidden = !this.openValue
|
|
42
|
+
|
|
43
|
+
if (this.openValue) {
|
|
44
|
+
content.style.setProperty(
|
|
45
|
+
"--radix-collapsible-content-height",
|
|
46
|
+
`${content.scrollHeight}px`
|
|
47
|
+
)
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
get contentId() {
|
|
52
|
+
this._contentId ||= this.contentTarget.id || uniqueId("shadcn-collapsible")
|
|
53
|
+
return this._contentId
|
|
54
|
+
}
|
|
55
|
+
}
|