uikit_rails 0.1.1
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/README.md +301 -0
- data/Rakefile +12 -0
- data/app/controllers/uikit_rails/styleguide_controller.rb +72 -0
- data/app/views/layouts/uikit_rails/application.html.erb +412 -0
- data/app/views/uikit_rails/styleguide/index.html.erb +27 -0
- data/app/views/uikit_rails/styleguide/show.html.erb +56 -0
- data/config/routes.rb +6 -0
- data/lib/uikit_rails/engine.rb +13 -0
- data/lib/uikit_rails/generators/add_generator.rb +110 -0
- data/lib/uikit_rails/generators/install_generator.rb +62 -0
- data/lib/uikit_rails/generators/templates/base_component.rb.tt +32 -0
- data/lib/uikit_rails/generators/templates/uikit_rails.css.tt +69 -0
- data/lib/uikit_rails/templates/components/accordion/USAGE +30 -0
- data/lib/uikit_rails/templates/components/accordion/accordion.css +74 -0
- data/lib/uikit_rails/templates/components/accordion/component.html.erb +13 -0
- data/lib/uikit_rails/templates/components/accordion/component.rb +35 -0
- data/lib/uikit_rails/templates/components/accordion/preview.yml +81 -0
- data/lib/uikit_rails/templates/components/alert/USAGE +25 -0
- data/lib/uikit_rails/templates/components/alert/alert.css +60 -0
- data/lib/uikit_rails/templates/components/alert/component.html.erb +9 -0
- data/lib/uikit_rails/templates/components/alert/component.rb +27 -0
- data/lib/uikit_rails/templates/components/alert/preview.yml +53 -0
- data/lib/uikit_rails/templates/components/alert_dialog/USAGE +38 -0
- data/lib/uikit_rails/templates/components/alert_dialog/alert_dialog.css +108 -0
- data/lib/uikit_rails/templates/components/alert_dialog/component.html.erb +27 -0
- data/lib/uikit_rails/templates/components/alert_dialog/component.rb +23 -0
- data/lib/uikit_rails/templates/components/alert_dialog/preview.yml +94 -0
- data/lib/uikit_rails/templates/components/avatar/USAGE +20 -0
- data/lib/uikit_rails/templates/components/avatar/avatar.css +53 -0
- data/lib/uikit_rails/templates/components/avatar/component.html.erb +7 -0
- data/lib/uikit_rails/templates/components/avatar/component.rb +31 -0
- data/lib/uikit_rails/templates/components/avatar/preview.yml +42 -0
- data/lib/uikit_rails/templates/components/badge/USAGE +13 -0
- data/lib/uikit_rails/templates/components/badge/badge.css +61 -0
- data/lib/uikit_rails/templates/components/badge/component.rb +28 -0
- data/lib/uikit_rails/templates/components/badge/preview.yml +38 -0
- data/lib/uikit_rails/templates/components/breadcrumb/USAGE +23 -0
- data/lib/uikit_rails/templates/components/breadcrumb/breadcrumb.css +55 -0
- data/lib/uikit_rails/templates/components/breadcrumb/component.html.erb +14 -0
- data/lib/uikit_rails/templates/components/breadcrumb/component.rb +40 -0
- data/lib/uikit_rails/templates/components/breadcrumb/preview.yml +42 -0
- data/lib/uikit_rails/templates/components/button/USAGE +21 -0
- data/lib/uikit_rails/templates/components/button/button.css +125 -0
- data/lib/uikit_rails/templates/components/button/component.rb +44 -0
- data/lib/uikit_rails/templates/components/button/preview.yml +106 -0
- data/lib/uikit_rails/templates/components/card/USAGE +33 -0
- data/lib/uikit_rails/templates/components/card/card.css +63 -0
- data/lib/uikit_rails/templates/components/card/component.html.erb +16 -0
- data/lib/uikit_rails/templates/components/card/component.rb +26 -0
- data/lib/uikit_rails/templates/components/card/preview.yml +57 -0
- data/lib/uikit_rails/templates/components/checkbox/USAGE +19 -0
- data/lib/uikit_rails/templates/components/checkbox/checkbox.css +67 -0
- data/lib/uikit_rails/templates/components/checkbox/component.html.erb +6 -0
- data/lib/uikit_rails/templates/components/checkbox/component.rb +26 -0
- data/lib/uikit_rails/templates/components/checkbox/preview.yml +43 -0
- data/lib/uikit_rails/templates/components/collapsible/USAGE +31 -0
- data/lib/uikit_rails/templates/components/collapsible/collapsible.css +55 -0
- data/lib/uikit_rails/templates/components/collapsible/component.html.erb +8 -0
- data/lib/uikit_rails/templates/components/collapsible/component.rb +18 -0
- data/lib/uikit_rails/templates/components/collapsible/preview.yml +65 -0
- data/lib/uikit_rails/templates/components/dialog/USAGE +41 -0
- data/lib/uikit_rails/templates/components/dialog/component.html.erb +23 -0
- data/lib/uikit_rails/templates/components/dialog/component.rb +20 -0
- data/lib/uikit_rails/templates/components/dialog/dialog.css +133 -0
- data/lib/uikit_rails/templates/components/dialog/preview.yml +77 -0
- data/lib/uikit_rails/templates/components/dropdown/USAGE +40 -0
- data/lib/uikit_rails/templates/components/dropdown/component.html.erb +14 -0
- data/lib/uikit_rails/templates/components/dropdown/component.rb +62 -0
- data/lib/uikit_rails/templates/components/dropdown/dropdown.css +104 -0
- data/lib/uikit_rails/templates/components/dropdown/preview.yml +75 -0
- data/lib/uikit_rails/templates/components/form/USAGE +51 -0
- data/lib/uikit_rails/templates/components/form/builder.rb +233 -0
- data/lib/uikit_rails/templates/components/form/form.css +48 -0
- data/lib/uikit_rails/templates/components/form/preview.yml +95 -0
- data/lib/uikit_rails/templates/components/input/USAGE +21 -0
- data/lib/uikit_rails/templates/components/input/component.rb +25 -0
- data/lib/uikit_rails/templates/components/input/input.css +43 -0
- data/lib/uikit_rails/templates/components/input/preview.yml +58 -0
- data/lib/uikit_rails/templates/components/label/USAGE +16 -0
- data/lib/uikit_rails/templates/components/label/component.rb +25 -0
- data/lib/uikit_rails/templates/components/label/label.css +25 -0
- data/lib/uikit_rails/templates/components/label/preview.yml +34 -0
- data/lib/uikit_rails/templates/components/pagination/USAGE +45 -0
- data/lib/uikit_rails/templates/components/pagination/component.html.erb +7 -0
- data/lib/uikit_rails/templates/components/pagination/component.rb +90 -0
- data/lib/uikit_rails/templates/components/pagination/pagination.css +89 -0
- data/lib/uikit_rails/templates/components/pagination/preview.yml +61 -0
- data/lib/uikit_rails/templates/components/popover/USAGE +44 -0
- data/lib/uikit_rails/templates/components/popover/component.html.erb +8 -0
- data/lib/uikit_rails/templates/components/popover/component.rb +19 -0
- data/lib/uikit_rails/templates/components/popover/popover.css +94 -0
- data/lib/uikit_rails/templates/components/popover/preview.yml +102 -0
- data/lib/uikit_rails/templates/components/progress/USAGE +15 -0
- data/lib/uikit_rails/templates/components/progress/component.html.erb +3 -0
- data/lib/uikit_rails/templates/components/progress/component.rb +38 -0
- data/lib/uikit_rails/templates/components/progress/preview.yml +44 -0
- data/lib/uikit_rails/templates/components/progress/progress.css +20 -0
- data/lib/uikit_rails/templates/components/select/USAGE +19 -0
- data/lib/uikit_rails/templates/components/select/component.rb +38 -0
- data/lib/uikit_rails/templates/components/select/preview.yml +61 -0
- data/lib/uikit_rails/templates/components/select/select.css +46 -0
- data/lib/uikit_rails/templates/components/separator/USAGE +15 -0
- data/lib/uikit_rails/templates/components/separator/component.rb +34 -0
- data/lib/uikit_rails/templates/components/separator/preview.yml +32 -0
- data/lib/uikit_rails/templates/components/separator/separator.css +21 -0
- data/lib/uikit_rails/templates/components/sheet/USAGE +44 -0
- data/lib/uikit_rails/templates/components/sheet/component.html.erb +23 -0
- data/lib/uikit_rails/templates/components/sheet/component.rb +23 -0
- data/lib/uikit_rails/templates/components/sheet/preview.yml +105 -0
- data/lib/uikit_rails/templates/components/sheet/sheet.css +193 -0
- data/lib/uikit_rails/templates/components/skeleton/USAGE +19 -0
- data/lib/uikit_rails/templates/components/skeleton/component.rb +38 -0
- data/lib/uikit_rails/templates/components/skeleton/preview.yml +44 -0
- data/lib/uikit_rails/templates/components/skeleton/skeleton.css +25 -0
- data/lib/uikit_rails/templates/components/switch/USAGE +19 -0
- data/lib/uikit_rails/templates/components/switch/component.html.erb +19 -0
- data/lib/uikit_rails/templates/components/switch/component.rb +23 -0
- data/lib/uikit_rails/templates/components/switch/preview.yml +43 -0
- data/lib/uikit_rails/templates/components/switch/switch.css +81 -0
- data/lib/uikit_rails/templates/components/table/USAGE +40 -0
- data/lib/uikit_rails/templates/components/table/component.html.erb +14 -0
- data/lib/uikit_rails/templates/components/table/component.rb +25 -0
- data/lib/uikit_rails/templates/components/table/preview.yml +109 -0
- data/lib/uikit_rails/templates/components/table/table.css +86 -0
- data/lib/uikit_rails/templates/components/tabs/USAGE +24 -0
- data/lib/uikit_rails/templates/components/tabs/component.html.erb +10 -0
- data/lib/uikit_rails/templates/components/tabs/component.rb +35 -0
- data/lib/uikit_rails/templates/components/tabs/preview.yml +60 -0
- data/lib/uikit_rails/templates/components/tabs/tabs.css +72 -0
- data/lib/uikit_rails/templates/components/textarea/USAGE +19 -0
- data/lib/uikit_rails/templates/components/textarea/component.rb +25 -0
- data/lib/uikit_rails/templates/components/textarea/preview.yml +47 -0
- data/lib/uikit_rails/templates/components/textarea/textarea.css +39 -0
- data/lib/uikit_rails/templates/components/toggle/USAGE +25 -0
- data/lib/uikit_rails/templates/components/toggle/component.rb +39 -0
- data/lib/uikit_rails/templates/components/toggle/preview.yml +81 -0
- data/lib/uikit_rails/templates/components/toggle/toggle.css +89 -0
- data/lib/uikit_rails/templates/components/tooltip/USAGE +23 -0
- data/lib/uikit_rails/templates/components/tooltip/component.html.erb +8 -0
- data/lib/uikit_rails/templates/components/tooltip/component.rb +19 -0
- data/lib/uikit_rails/templates/components/tooltip/preview.yml +52 -0
- data/lib/uikit_rails/templates/components/tooltip/tooltip.css +78 -0
- data/lib/uikit_rails/templates/stimulus/accordion_controller.js +19 -0
- data/lib/uikit_rails/templates/stimulus/alert_dialog_controller.js +25 -0
- data/lib/uikit_rails/templates/stimulus/collapsible_controller.js +9 -0
- data/lib/uikit_rails/templates/stimulus/dialog_controller.js +19 -0
- data/lib/uikit_rails/templates/stimulus/dropdown_controller.js +47 -0
- data/lib/uikit_rails/templates/stimulus/popover_controller.js +47 -0
- data/lib/uikit_rails/templates/stimulus/sheet_controller.js +19 -0
- data/lib/uikit_rails/templates/stimulus/tabs_controller.js +24 -0
- data/lib/uikit_rails/templates/stimulus/tooltip_controller.js +13 -0
- data/lib/uikit_rails/version.rb +5 -0
- data/lib/uikit_rails.rb +59 -0
- data/sig/uikit_rails.rbs +4 -0
- data/test_app/.dockerignore +51 -0
- data/test_app/.gitattributes +9 -0
- data/test_app/.github/dependabot.yml +12 -0
- data/test_app/.github/workflows/ci.yml +124 -0
- data/test_app/.gitignore +35 -0
- data/test_app/.kamal/hooks/docker-setup.sample +3 -0
- data/test_app/.kamal/hooks/post-app-boot.sample +3 -0
- data/test_app/.kamal/hooks/post-deploy.sample +14 -0
- data/test_app/.kamal/hooks/post-proxy-reboot.sample +3 -0
- data/test_app/.kamal/hooks/pre-app-boot.sample +3 -0
- data/test_app/.kamal/hooks/pre-build.sample +51 -0
- data/test_app/.kamal/hooks/pre-connect.sample +47 -0
- data/test_app/.kamal/hooks/pre-deploy.sample +122 -0
- data/test_app/.kamal/hooks/pre-proxy-reboot.sample +3 -0
- data/test_app/.kamal/secrets +20 -0
- data/test_app/.rubocop.yml +8 -0
- data/test_app/.ruby-version +1 -0
- data/test_app/Dockerfile +77 -0
- data/test_app/Gemfile +68 -0
- data/test_app/Gemfile.lock +587 -0
- data/test_app/README.md +24 -0
- data/test_app/Rakefile +6 -0
- data/test_app/app/assets/images/.keep +0 -0
- data/test_app/app/assets/stylesheets/application.css +10 -0
- data/test_app/app/assets/stylesheets/ui/accordion.css +74 -0
- data/test_app/app/assets/stylesheets/ui/alert.css +60 -0
- data/test_app/app/assets/stylesheets/ui/alert_dialog.css +108 -0
- data/test_app/app/assets/stylesheets/ui/avatar.css +53 -0
- data/test_app/app/assets/stylesheets/ui/badge.css +61 -0
- data/test_app/app/assets/stylesheets/ui/breadcrumb.css +55 -0
- data/test_app/app/assets/stylesheets/ui/button.css +125 -0
- data/test_app/app/assets/stylesheets/ui/card.css +63 -0
- data/test_app/app/assets/stylesheets/ui/checkbox.css +67 -0
- data/test_app/app/assets/stylesheets/ui/collapsible.css +55 -0
- data/test_app/app/assets/stylesheets/ui/dialog.css +133 -0
- data/test_app/app/assets/stylesheets/ui/dropdown.css +104 -0
- data/test_app/app/assets/stylesheets/ui/form.css +48 -0
- data/test_app/app/assets/stylesheets/ui/input.css +43 -0
- data/test_app/app/assets/stylesheets/ui/label.css +25 -0
- data/test_app/app/assets/stylesheets/ui/pagination.css +89 -0
- data/test_app/app/assets/stylesheets/ui/popover.css +94 -0
- data/test_app/app/assets/stylesheets/ui/progress.css +20 -0
- data/test_app/app/assets/stylesheets/ui/select.css +46 -0
- data/test_app/app/assets/stylesheets/ui/separator.css +21 -0
- data/test_app/app/assets/stylesheets/ui/sheet.css +193 -0
- data/test_app/app/assets/stylesheets/ui/skeleton.css +25 -0
- data/test_app/app/assets/stylesheets/ui/switch.css +81 -0
- data/test_app/app/assets/stylesheets/ui/table.css +86 -0
- data/test_app/app/assets/stylesheets/ui/tabs.css +72 -0
- data/test_app/app/assets/stylesheets/ui/textarea.css +39 -0
- data/test_app/app/assets/stylesheets/ui/toggle.css +89 -0
- data/test_app/app/assets/stylesheets/ui/tooltip.css +78 -0
- data/test_app/app/assets/stylesheets/uikit_rails.css +69 -0
- data/test_app/app/components/ui/accordion/component.html.erb +13 -0
- data/test_app/app/components/ui/accordion/component.rb +35 -0
- data/test_app/app/components/ui/accordion/preview.yml +81 -0
- data/test_app/app/components/ui/alert/component.html.erb +9 -0
- data/test_app/app/components/ui/alert/component.rb +27 -0
- data/test_app/app/components/ui/alert/preview.yml +53 -0
- data/test_app/app/components/ui/alert_dialog/component.html.erb +27 -0
- data/test_app/app/components/ui/alert_dialog/component.rb +23 -0
- data/test_app/app/components/ui/alert_dialog/preview.yml +94 -0
- data/test_app/app/components/ui/avatar/component.html.erb +7 -0
- data/test_app/app/components/ui/avatar/component.rb +31 -0
- data/test_app/app/components/ui/avatar/preview.yml +42 -0
- data/test_app/app/components/ui/badge/component.rb +28 -0
- data/test_app/app/components/ui/badge/preview.yml +38 -0
- data/test_app/app/components/ui/base_component.rb +32 -0
- data/test_app/app/components/ui/breadcrumb/component.html.erb +14 -0
- data/test_app/app/components/ui/breadcrumb/component.rb +40 -0
- data/test_app/app/components/ui/breadcrumb/preview.yml +42 -0
- data/test_app/app/components/ui/button/component.rb +44 -0
- data/test_app/app/components/ui/button/preview.yml +106 -0
- data/test_app/app/components/ui/card/component.html.erb +16 -0
- data/test_app/app/components/ui/card/component.rb +26 -0
- data/test_app/app/components/ui/card/preview.yml +57 -0
- data/test_app/app/components/ui/checkbox/component.html.erb +6 -0
- data/test_app/app/components/ui/checkbox/component.rb +26 -0
- data/test_app/app/components/ui/checkbox/preview.yml +43 -0
- data/test_app/app/components/ui/collapsible/component.html.erb +8 -0
- data/test_app/app/components/ui/collapsible/component.rb +18 -0
- data/test_app/app/components/ui/collapsible/preview.yml +65 -0
- data/test_app/app/components/ui/dialog/component.html.erb +23 -0
- data/test_app/app/components/ui/dialog/component.rb +20 -0
- data/test_app/app/components/ui/dialog/preview.yml +77 -0
- data/test_app/app/components/ui/dropdown/component.html.erb +14 -0
- data/test_app/app/components/ui/dropdown/component.rb +62 -0
- data/test_app/app/components/ui/dropdown/preview.yml +75 -0
- data/test_app/app/components/ui/form/USAGE +51 -0
- data/test_app/app/components/ui/form/builder.rb +233 -0
- data/test_app/app/components/ui/form/component.rb +258 -0
- data/test_app/app/components/ui/form/form.css +48 -0
- data/test_app/app/components/ui/form/preview.yml +95 -0
- data/test_app/app/components/ui/input/component.rb +25 -0
- data/test_app/app/components/ui/input/preview.yml +58 -0
- data/test_app/app/components/ui/label/component.rb +25 -0
- data/test_app/app/components/ui/label/preview.yml +34 -0
- data/test_app/app/components/ui/pagination/component.html.erb +7 -0
- data/test_app/app/components/ui/pagination/component.rb +90 -0
- data/test_app/app/components/ui/pagination/preview.yml +61 -0
- data/test_app/app/components/ui/popover/component.html.erb +8 -0
- data/test_app/app/components/ui/popover/component.rb +19 -0
- data/test_app/app/components/ui/popover/preview.yml +102 -0
- data/test_app/app/components/ui/progress/component.html.erb +3 -0
- data/test_app/app/components/ui/progress/component.rb +38 -0
- data/test_app/app/components/ui/progress/preview.yml +44 -0
- data/test_app/app/components/ui/select/component.rb +38 -0
- data/test_app/app/components/ui/select/preview.yml +61 -0
- data/test_app/app/components/ui/separator/component.rb +34 -0
- data/test_app/app/components/ui/separator/preview.yml +32 -0
- data/test_app/app/components/ui/sheet/component.html.erb +23 -0
- data/test_app/app/components/ui/sheet/component.rb +23 -0
- data/test_app/app/components/ui/sheet/preview.yml +105 -0
- data/test_app/app/components/ui/skeleton/component.rb +38 -0
- data/test_app/app/components/ui/skeleton/preview.yml +44 -0
- data/test_app/app/components/ui/switch/component.html.erb +19 -0
- data/test_app/app/components/ui/switch/component.rb +23 -0
- data/test_app/app/components/ui/switch/preview.yml +43 -0
- data/test_app/app/components/ui/table/component.html.erb +14 -0
- data/test_app/app/components/ui/table/component.rb +25 -0
- data/test_app/app/components/ui/table/preview.yml +109 -0
- data/test_app/app/components/ui/tabs/component.html.erb +10 -0
- data/test_app/app/components/ui/tabs/component.rb +35 -0
- data/test_app/app/components/ui/tabs/preview.yml +60 -0
- data/test_app/app/components/ui/textarea/component.rb +25 -0
- data/test_app/app/components/ui/textarea/preview.yml +47 -0
- data/test_app/app/components/ui/toggle/component.rb +39 -0
- data/test_app/app/components/ui/toggle/preview.yml +81 -0
- data/test_app/app/components/ui/tooltip/component.html.erb +8 -0
- data/test_app/app/components/ui/tooltip/component.rb +19 -0
- data/test_app/app/components/ui/tooltip/preview.yml +52 -0
- data/test_app/app/controllers/application_controller.rb +7 -0
- data/test_app/app/controllers/concerns/.keep +0 -0
- data/test_app/app/helpers/application_helper.rb +2 -0
- data/test_app/app/javascript/application.js +3 -0
- data/test_app/app/javascript/controllers/application.js +9 -0
- data/test_app/app/javascript/controllers/hello_controller.js +7 -0
- data/test_app/app/javascript/controllers/index.js +4 -0
- data/test_app/app/javascript/controllers/ui/accordion_controller.js +19 -0
- data/test_app/app/javascript/controllers/ui/alert_dialog_controller.js +25 -0
- data/test_app/app/javascript/controllers/ui/collapsible_controller.js +9 -0
- data/test_app/app/javascript/controllers/ui/dialog_controller.js +19 -0
- data/test_app/app/javascript/controllers/ui/dropdown_controller.js +47 -0
- data/test_app/app/javascript/controllers/ui/popover_controller.js +47 -0
- data/test_app/app/javascript/controllers/ui/sheet_controller.js +19 -0
- data/test_app/app/javascript/controllers/ui/tabs_controller.js +24 -0
- data/test_app/app/javascript/controllers/ui/tooltip_controller.js +13 -0
- data/test_app/app/jobs/application_job.rb +7 -0
- data/test_app/app/mailers/application_mailer.rb +4 -0
- data/test_app/app/models/application_record.rb +3 -0
- data/test_app/app/models/concerns/.keep +0 -0
- data/test_app/app/views/layouts/application.html.erb +29 -0
- data/test_app/app/views/layouts/mailer.html.erb +13 -0
- data/test_app/app/views/layouts/mailer.text.erb +1 -0
- data/test_app/app/views/pwa/manifest.json.erb +22 -0
- data/test_app/app/views/pwa/service-worker.js +26 -0
- data/test_app/bin/brakeman +7 -0
- data/test_app/bin/bundler-audit +6 -0
- data/test_app/bin/ci +6 -0
- data/test_app/bin/dev +2 -0
- data/test_app/bin/docker-entrypoint +8 -0
- data/test_app/bin/importmap +4 -0
- data/test_app/bin/jobs +6 -0
- data/test_app/bin/kamal +16 -0
- data/test_app/bin/rails +4 -0
- data/test_app/bin/rake +4 -0
- data/test_app/bin/rubocop +8 -0
- data/test_app/bin/setup +35 -0
- data/test_app/bin/thrust +5 -0
- data/test_app/config/application.rb +27 -0
- data/test_app/config/boot.rb +4 -0
- data/test_app/config/bundler-audit.yml +5 -0
- data/test_app/config/cable.yml +17 -0
- data/test_app/config/cache.yml +16 -0
- data/test_app/config/ci.rb +24 -0
- data/test_app/config/credentials.yml.enc +1 -0
- data/test_app/config/database.yml +40 -0
- data/test_app/config/deploy.yml +119 -0
- data/test_app/config/environment.rb +5 -0
- data/test_app/config/environments/development.rb +78 -0
- data/test_app/config/environments/production.rb +90 -0
- data/test_app/config/environments/test.rb +53 -0
- data/test_app/config/importmap.rb +7 -0
- data/test_app/config/initializers/assets.rb +7 -0
- data/test_app/config/initializers/content_security_policy.rb +29 -0
- data/test_app/config/initializers/filter_parameter_logging.rb +8 -0
- data/test_app/config/initializers/inflections.rb +16 -0
- data/test_app/config/locales/en.yml +31 -0
- data/test_app/config/puma.rb +42 -0
- data/test_app/config/queue.yml +18 -0
- data/test_app/config/recurring.yml +15 -0
- data/test_app/config/routes.rb +13 -0
- data/test_app/config/storage.yml +27 -0
- data/test_app/config.ru +6 -0
- data/test_app/db/cable_schema.rb +11 -0
- data/test_app/db/cache_schema.rb +12 -0
- data/test_app/db/queue_schema.rb +129 -0
- data/test_app/db/seeds.rb +9 -0
- data/test_app/lib/tasks/.keep +0 -0
- data/test_app/log/.keep +0 -0
- data/test_app/public/400.html +135 -0
- data/test_app/public/404.html +135 -0
- data/test_app/public/406-unsupported-browser.html +135 -0
- data/test_app/public/422.html +135 -0
- data/test_app/public/500.html +135 -0
- data/test_app/public/icon.png +0 -0
- data/test_app/public/icon.svg +3 -0
- data/test_app/public/robots.txt +1 -0
- data/test_app/script/.keep +0 -0
- data/test_app/storage/.keep +0 -0
- data/test_app/test/controllers/.keep +0 -0
- data/test_app/test/fixtures/files/.keep +0 -0
- data/test_app/test/helpers/.keep +0 -0
- data/test_app/test/integration/.keep +0 -0
- data/test_app/test/mailers/.keep +0 -0
- data/test_app/test/models/.keep +0 -0
- data/test_app/test/test_helper.rb +15 -0
- data/test_app/tmp/.keep +0 -0
- data/test_app/tmp/pids/.keep +0 -0
- data/test_app/tmp/storage/.keep +0 -0
- data/test_app/vendor/.keep +0 -0
- data/test_app/vendor/javascript/.keep +0 -0
- metadata +448 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Ui
|
|
4
|
+
module Breadcrumb
|
|
5
|
+
# Navigation breadcrumb trail.
|
|
6
|
+
class Component < Ui::BaseComponent
|
|
7
|
+
renders_many :items, lambda { |href: nil, current: false, **html_attrs|
|
|
8
|
+
Item.new(href: href, current: current, **html_attrs)
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
attr_reader :html_attrs
|
|
12
|
+
|
|
13
|
+
def initialize(**html_attrs)
|
|
14
|
+
@html_attrs = html_attrs
|
|
15
|
+
super()
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Individual breadcrumb entry — renders as a link or current-page span.
|
|
19
|
+
class Item < Ui::BaseComponent
|
|
20
|
+
attr_reader :href, :current, :html_attrs
|
|
21
|
+
|
|
22
|
+
def initialize(href: nil, current: false, **html_attrs)
|
|
23
|
+
@href = href
|
|
24
|
+
@current = current
|
|
25
|
+
@html_attrs = html_attrs
|
|
26
|
+
super()
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def call
|
|
30
|
+
if href && !current
|
|
31
|
+
content_tag(:a, content, class: "ui-breadcrumb__link", href: href, **html_attrs)
|
|
32
|
+
else
|
|
33
|
+
content_tag(:span, content, class: "ui-breadcrumb__current", "aria-current": ("page" if current),
|
|
34
|
+
**html_attrs)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
description: A navigation breadcrumb trail showing the current page location within a hierarchy. Items can be links or plain text for the current page.
|
|
2
|
+
|
|
3
|
+
sections:
|
|
4
|
+
- title: Basic Breadcrumb
|
|
5
|
+
examples:
|
|
6
|
+
- title: Simple breadcrumb trail
|
|
7
|
+
code: |
|
|
8
|
+
<%= render Ui::Breadcrumb::Component.new do |bc| %>
|
|
9
|
+
<% bc.with_item(href: "/") do %>Home<% end %>
|
|
10
|
+
<% bc.with_item(href: "/products") do %>Products<% end %>
|
|
11
|
+
<% bc.with_item(current: true) do %>Widget<% end %>
|
|
12
|
+
<% end %>
|
|
13
|
+
|
|
14
|
+
- title: Two Levels
|
|
15
|
+
examples:
|
|
16
|
+
- title: Short breadcrumb
|
|
17
|
+
code: |
|
|
18
|
+
<%= render Ui::Breadcrumb::Component.new do |bc| %>
|
|
19
|
+
<% bc.with_item(href: "/") do %>Home<% end %>
|
|
20
|
+
<% bc.with_item(current: true) do %>Dashboard<% end %>
|
|
21
|
+
<% end %>
|
|
22
|
+
|
|
23
|
+
- title: Deep Navigation
|
|
24
|
+
examples:
|
|
25
|
+
- title: Multiple levels
|
|
26
|
+
code: |
|
|
27
|
+
<%= render Ui::Breadcrumb::Component.new do |bc| %>
|
|
28
|
+
<% bc.with_item(href: "/") do %>Home<% end %>
|
|
29
|
+
<% bc.with_item(href: "/settings") do %>Settings<% end %>
|
|
30
|
+
<% bc.with_item(href: "/settings/account") do %>Account<% end %>
|
|
31
|
+
<% bc.with_item(current: true) do %>Security<% end %>
|
|
32
|
+
<% end %>
|
|
33
|
+
|
|
34
|
+
- title: All Links
|
|
35
|
+
examples:
|
|
36
|
+
- title: Without current marker
|
|
37
|
+
code: |
|
|
38
|
+
<%= render Ui::Breadcrumb::Component.new do |bc| %>
|
|
39
|
+
<% bc.with_item(href: "/") do %>Home<% end %>
|
|
40
|
+
<% bc.with_item(href: "/docs") do %>Documentation<% end %>
|
|
41
|
+
<% bc.with_item(href: "/docs/components") do %>Components<% end %>
|
|
42
|
+
<% end %>
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Ui
|
|
4
|
+
module Button
|
|
5
|
+
# Button component with multiple variants and sizes.
|
|
6
|
+
class Component < Ui::BaseComponent
|
|
7
|
+
VARIANTS = %i[default destructive outline secondary ghost link].freeze
|
|
8
|
+
SIZES = %i[sm md lg icon].freeze
|
|
9
|
+
|
|
10
|
+
attr_reader :variant, :size, :tag, :html_attrs
|
|
11
|
+
|
|
12
|
+
def initialize(variant: :default, size: :md, tag: :button, **html_attrs)
|
|
13
|
+
@variant = variant.to_sym
|
|
14
|
+
@size = size.to_sym
|
|
15
|
+
@tag = tag
|
|
16
|
+
@html_attrs = html_attrs
|
|
17
|
+
super()
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def call
|
|
21
|
+
content_tag(tag, content, **computed_attrs)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
private
|
|
25
|
+
|
|
26
|
+
def computed_attrs
|
|
27
|
+
defaults = {
|
|
28
|
+
class: computed_classes,
|
|
29
|
+
type: (tag == :button ? "button" : nil)
|
|
30
|
+
}.compact
|
|
31
|
+
|
|
32
|
+
merge_attrs(defaults, html_attrs)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def computed_classes
|
|
36
|
+
class_names(
|
|
37
|
+
"ui-btn",
|
|
38
|
+
"ui-btn--#{variant}",
|
|
39
|
+
"ui-btn--#{size}"
|
|
40
|
+
)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
description: A clickable button with multiple variants and sizes. Renders as a <button> by default or as an <a> tag for links.
|
|
2
|
+
|
|
3
|
+
sections:
|
|
4
|
+
- title: Variants
|
|
5
|
+
examples:
|
|
6
|
+
- title: Default
|
|
7
|
+
code: |
|
|
8
|
+
<%= render Ui::Button::Component.new do %>
|
|
9
|
+
Click me
|
|
10
|
+
<% end %>
|
|
11
|
+
|
|
12
|
+
- title: Secondary
|
|
13
|
+
code: |
|
|
14
|
+
<%= render Ui::Button::Component.new(variant: :secondary) do %>
|
|
15
|
+
Secondary
|
|
16
|
+
<% end %>
|
|
17
|
+
|
|
18
|
+
- title: Destructive
|
|
19
|
+
code: |
|
|
20
|
+
<%= render Ui::Button::Component.new(variant: :destructive) do %>
|
|
21
|
+
Delete
|
|
22
|
+
<% end %>
|
|
23
|
+
|
|
24
|
+
- title: Outline
|
|
25
|
+
code: |
|
|
26
|
+
<%= render Ui::Button::Component.new(variant: :outline) do %>
|
|
27
|
+
Outline
|
|
28
|
+
<% end %>
|
|
29
|
+
|
|
30
|
+
- title: Ghost
|
|
31
|
+
code: |
|
|
32
|
+
<%= render Ui::Button::Component.new(variant: :ghost) do %>
|
|
33
|
+
Ghost
|
|
34
|
+
<% end %>
|
|
35
|
+
|
|
36
|
+
- title: Link
|
|
37
|
+
code: |
|
|
38
|
+
<%= render Ui::Button::Component.new(variant: :link) do %>
|
|
39
|
+
Link
|
|
40
|
+
<% end %>
|
|
41
|
+
|
|
42
|
+
- title: Sizes
|
|
43
|
+
examples:
|
|
44
|
+
- title: Small
|
|
45
|
+
code: |
|
|
46
|
+
<%= render Ui::Button::Component.new(size: :sm) do %>
|
|
47
|
+
Small
|
|
48
|
+
<% end %>
|
|
49
|
+
|
|
50
|
+
- title: Medium (default)
|
|
51
|
+
code: |
|
|
52
|
+
<%= render Ui::Button::Component.new(size: :md) do %>
|
|
53
|
+
Medium
|
|
54
|
+
<% end %>
|
|
55
|
+
|
|
56
|
+
- title: Large
|
|
57
|
+
code: |
|
|
58
|
+
<%= render Ui::Button::Component.new(size: :lg) do %>
|
|
59
|
+
Large
|
|
60
|
+
<% end %>
|
|
61
|
+
|
|
62
|
+
- title: Icon
|
|
63
|
+
code: |
|
|
64
|
+
<%= render Ui::Button::Component.new(size: :icon) do %>
|
|
65
|
+
★
|
|
66
|
+
<% end %>
|
|
67
|
+
|
|
68
|
+
- title: As a Link
|
|
69
|
+
examples:
|
|
70
|
+
- title: Link with default style
|
|
71
|
+
code: |
|
|
72
|
+
<%= render Ui::Button::Component.new(tag: :a, href: "/dashboard") do %>
|
|
73
|
+
Go to Dashboard
|
|
74
|
+
<% end %>
|
|
75
|
+
|
|
76
|
+
- title: Link with outline style
|
|
77
|
+
code: |
|
|
78
|
+
<%= render Ui::Button::Component.new(tag: :a, href: "#", variant: :outline) do %>
|
|
79
|
+
Learn more
|
|
80
|
+
<% end %>
|
|
81
|
+
|
|
82
|
+
- title: Disabled State
|
|
83
|
+
examples:
|
|
84
|
+
- title: Disabled default
|
|
85
|
+
code: |
|
|
86
|
+
<%= render Ui::Button::Component.new(disabled: true) do %>
|
|
87
|
+
Disabled
|
|
88
|
+
<% end %>
|
|
89
|
+
|
|
90
|
+
- title: Disabled destructive
|
|
91
|
+
code: |
|
|
92
|
+
<%= render Ui::Button::Component.new(variant: :destructive, disabled: true) do %>
|
|
93
|
+
Can't delete
|
|
94
|
+
<% end %>
|
|
95
|
+
|
|
96
|
+
- title: With Custom Attributes
|
|
97
|
+
examples:
|
|
98
|
+
- title: Custom class and data attributes
|
|
99
|
+
code: |
|
|
100
|
+
<%= render Ui::Button::Component.new(
|
|
101
|
+
variant: :secondary,
|
|
102
|
+
class: "my-custom-class",
|
|
103
|
+
data: { turbo: false, controller: "my-controller" }
|
|
104
|
+
) do %>
|
|
105
|
+
Custom
|
|
106
|
+
<% end %>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<%= content_tag :div, **computed_attrs do %>
|
|
2
|
+
<% if header? %>
|
|
3
|
+
<div class="ui-card__header"><%= header %></div>
|
|
4
|
+
<% elsif title? || description? %>
|
|
5
|
+
<div class="ui-card__header">
|
|
6
|
+
<% if title? %><h3 class="ui-card__title"><%= title %></h3><% end %>
|
|
7
|
+
<% if description? %><p class="ui-card__description"><%= description %></p><% end %>
|
|
8
|
+
</div>
|
|
9
|
+
<% end %>
|
|
10
|
+
<% if content? %>
|
|
11
|
+
<div class="ui-card__body"><%= content %></div>
|
|
12
|
+
<% end %>
|
|
13
|
+
<% if footer? %>
|
|
14
|
+
<div class="ui-card__footer"><%= footer %></div>
|
|
15
|
+
<% end %>
|
|
16
|
+
<% end %>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Ui
|
|
4
|
+
module Card
|
|
5
|
+
# Versatile container for grouping related content.
|
|
6
|
+
class Component < Ui::BaseComponent
|
|
7
|
+
renders_one :header
|
|
8
|
+
renders_one :title
|
|
9
|
+
renders_one :description
|
|
10
|
+
renders_one :footer
|
|
11
|
+
|
|
12
|
+
attr_reader :html_attrs
|
|
13
|
+
|
|
14
|
+
def initialize(**html_attrs)
|
|
15
|
+
@html_attrs = html_attrs
|
|
16
|
+
super()
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def computed_attrs
|
|
22
|
+
merge_attrs({ class: "ui-card" }, html_attrs)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
description: A versatile container for grouping related content with optional header, title, description, body, and footer sections.
|
|
2
|
+
|
|
3
|
+
sections:
|
|
4
|
+
- title: Basic Card
|
|
5
|
+
examples:
|
|
6
|
+
- title: Simple content
|
|
7
|
+
code: |
|
|
8
|
+
<%= render Ui::Card::Component.new do |card| %>
|
|
9
|
+
<% card.with_title do %>Card Title<% end %>
|
|
10
|
+
<% card.with_description do %>A short description of the card content.<% end %>
|
|
11
|
+
<p>This is the card body content.</p>
|
|
12
|
+
<% end %>
|
|
13
|
+
|
|
14
|
+
- title: Card with Header, Title, Description & Footer
|
|
15
|
+
examples:
|
|
16
|
+
- title: Full card
|
|
17
|
+
code: |
|
|
18
|
+
<%= render Ui::Card::Component.new do |card| %>
|
|
19
|
+
<% card.with_title do %>Notifications<% end %>
|
|
20
|
+
<% card.with_description do %>You have 3 unread messages.<% end %>
|
|
21
|
+
<p>Review your latest notifications and take action.</p>
|
|
22
|
+
<% card.with_footer do %>
|
|
23
|
+
<%= render Ui::Button::Component.new(size: :sm) do %>View all<% end %>
|
|
24
|
+
<% end %>
|
|
25
|
+
<% end %>
|
|
26
|
+
|
|
27
|
+
- title: Card with custom header
|
|
28
|
+
code: |
|
|
29
|
+
<%= render Ui::Card::Component.new do |card| %>
|
|
30
|
+
<% card.with_header do %>
|
|
31
|
+
<div style="display:flex;align-items:center;justify-content:space-between;">
|
|
32
|
+
<strong>Team Members</strong>
|
|
33
|
+
<span>3 online</span>
|
|
34
|
+
</div>
|
|
35
|
+
<% end %>
|
|
36
|
+
<p>Manage your team and their permissions.</p>
|
|
37
|
+
<% end %>
|
|
38
|
+
|
|
39
|
+
- title: Card with Custom Content
|
|
40
|
+
examples:
|
|
41
|
+
- title: Custom styled card
|
|
42
|
+
code: |
|
|
43
|
+
<%= render Ui::Card::Component.new(class: "my-custom-card") do |card| %>
|
|
44
|
+
<% card.with_title do %>Settings<% end %>
|
|
45
|
+
<% card.with_description do %>Manage your account preferences.<% end %>
|
|
46
|
+
<p>Content goes here.</p>
|
|
47
|
+
<% card.with_footer do %>
|
|
48
|
+
<%= render Ui::Button::Component.new(variant: :outline, size: :sm) do %>Cancel<% end %>
|
|
49
|
+
<%= render Ui::Button::Component.new(size: :sm) do %>Save<% end %>
|
|
50
|
+
<% end %>
|
|
51
|
+
<% end %>
|
|
52
|
+
|
|
53
|
+
- title: Minimal card
|
|
54
|
+
code: |
|
|
55
|
+
<%= render Ui::Card::Component.new do %>
|
|
56
|
+
<p>A simple card with just body content and no header or footer.</p>
|
|
57
|
+
<% end %>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Ui
|
|
4
|
+
module Checkbox
|
|
5
|
+
# Styled checkbox with optional label.
|
|
6
|
+
class Component < Ui::BaseComponent
|
|
7
|
+
attr_reader :label, :html_attrs
|
|
8
|
+
|
|
9
|
+
def initialize(label: nil, **html_attrs)
|
|
10
|
+
@label = label
|
|
11
|
+
@html_attrs = html_attrs
|
|
12
|
+
super()
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
|
|
17
|
+
def input_attrs
|
|
18
|
+
merge_attrs({ class: "ui-checkbox", type: "checkbox" }, html_attrs)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def input_id
|
|
22
|
+
html_attrs[:id] || html_attrs[:name]
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
description: A styled checkbox with an optional label. Supports checked, disabled, and all standard HTML input attributes.
|
|
2
|
+
|
|
3
|
+
sections:
|
|
4
|
+
- title: Basic Usage
|
|
5
|
+
examples:
|
|
6
|
+
- title: Without label
|
|
7
|
+
code: |
|
|
8
|
+
<%= render Ui::Checkbox::Component.new(name: "terms") %>
|
|
9
|
+
|
|
10
|
+
- title: With label
|
|
11
|
+
code: |
|
|
12
|
+
<%= render Ui::Checkbox::Component.new(label: "Accept terms and conditions", name: "terms", id: "terms") %>
|
|
13
|
+
|
|
14
|
+
- title: States
|
|
15
|
+
examples:
|
|
16
|
+
- title: Checked
|
|
17
|
+
code: |
|
|
18
|
+
<%= render Ui::Checkbox::Component.new(label: "Checked by default", checked: true, name: "notify", id: "notify") %>
|
|
19
|
+
|
|
20
|
+
- title: Disabled
|
|
21
|
+
code: |
|
|
22
|
+
<%= render Ui::Checkbox::Component.new(label: "Disabled checkbox", disabled: true, name: "disabled_cb", id: "disabled_cb") %>
|
|
23
|
+
|
|
24
|
+
- title: Disabled and checked
|
|
25
|
+
code: |
|
|
26
|
+
<%= render Ui::Checkbox::Component.new(label: "Disabled checked", disabled: true, checked: true, name: "disabled_checked", id: "disabled_checked") %>
|
|
27
|
+
|
|
28
|
+
- title: Form Integration
|
|
29
|
+
examples:
|
|
30
|
+
- title: With value
|
|
31
|
+
code: |
|
|
32
|
+
<%= render Ui::Checkbox::Component.new(label: "Subscribe to newsletter", name: "subscribe", value: "1", id: "subscribe") %>
|
|
33
|
+
|
|
34
|
+
- title: With Custom Attributes
|
|
35
|
+
examples:
|
|
36
|
+
- title: Custom data attributes
|
|
37
|
+
code: |
|
|
38
|
+
<%= render Ui::Checkbox::Component.new(
|
|
39
|
+
label: "Enable feature",
|
|
40
|
+
name: "feature",
|
|
41
|
+
id: "feature",
|
|
42
|
+
data: { controller: "feature-toggle", action: "change->feature-toggle#toggle" }
|
|
43
|
+
) %>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
<div data-controller="ui--collapsible" class="ui-collapsible" <%= tag.attributes(html_attrs) %>>
|
|
2
|
+
<% if trigger? %>
|
|
3
|
+
<div data-action="click->ui--collapsible#toggle" class="ui-collapsible__trigger"><%= trigger %></div>
|
|
4
|
+
<% end %>
|
|
5
|
+
<div data-ui--collapsible-target="content" class="ui-collapsible__content <%= 'ui-collapsible__content--open' if open %>">
|
|
6
|
+
<%= content %>
|
|
7
|
+
</div>
|
|
8
|
+
</div>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Ui
|
|
4
|
+
module Collapsible
|
|
5
|
+
# Expandable/collapsible content section.
|
|
6
|
+
class Component < Ui::BaseComponent
|
|
7
|
+
renders_one :trigger
|
|
8
|
+
|
|
9
|
+
attr_reader :open, :html_attrs
|
|
10
|
+
|
|
11
|
+
def initialize(open: false, **html_attrs)
|
|
12
|
+
@open = open
|
|
13
|
+
@html_attrs = html_attrs
|
|
14
|
+
super()
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
description: An expandable/collapsible content section. Click the trigger area to toggle visibility of the content below it with a smooth transition.
|
|
2
|
+
|
|
3
|
+
sections:
|
|
4
|
+
- title: Basic Collapsible
|
|
5
|
+
examples:
|
|
6
|
+
- title: Simple toggle
|
|
7
|
+
code: |
|
|
8
|
+
<%= render Ui::Collapsible::Component.new do |collapsible| %>
|
|
9
|
+
<% collapsible.with_trigger do %>
|
|
10
|
+
<span>Toggle content</span>
|
|
11
|
+
<span style="font-size:var(--ui-font-size-xs);">▼</span>
|
|
12
|
+
<% end %>
|
|
13
|
+
<p>This content can be shown or hidden by clicking the trigger above.</p>
|
|
14
|
+
<% end %>
|
|
15
|
+
|
|
16
|
+
- title: Open by default
|
|
17
|
+
code: |
|
|
18
|
+
<%= render Ui::Collapsible::Component.new(open: true) do |collapsible| %>
|
|
19
|
+
<% collapsible.with_trigger do %>
|
|
20
|
+
<span>Expanded by default</span>
|
|
21
|
+
<span style="font-size:var(--ui-font-size-xs);">▼</span>
|
|
22
|
+
<% end %>
|
|
23
|
+
<p>This collapsible starts in the open state.</p>
|
|
24
|
+
<% end %>
|
|
25
|
+
|
|
26
|
+
- title: Collapsible with Rich Content
|
|
27
|
+
examples:
|
|
28
|
+
- title: List of items
|
|
29
|
+
code: |
|
|
30
|
+
<%= render Ui::Collapsible::Component.new do |collapsible| %>
|
|
31
|
+
<% collapsible.with_trigger do %>
|
|
32
|
+
<span style="font-weight:600;">3 tagged items</span>
|
|
33
|
+
<span style="font-size:var(--ui-font-size-xs);">▼</span>
|
|
34
|
+
<% end %>
|
|
35
|
+
<div style="display:flex;flex-direction:column;gap:0.5rem;">
|
|
36
|
+
<div style="padding:0.5rem 0.75rem;border:1px solid var(--ui-border);border-radius:var(--ui-radius);font-size:var(--ui-font-size-sm);">@radix-ui/primitives</div>
|
|
37
|
+
<div style="padding:0.5rem 0.75rem;border:1px solid var(--ui-border);border-radius:var(--ui-radius);font-size:var(--ui-font-size-sm);">@radix-ui/colors</div>
|
|
38
|
+
<div style="padding:0.5rem 0.75rem;border:1px solid var(--ui-border);border-radius:var(--ui-radius);font-size:var(--ui-font-size-sm);">@stitches/react</div>
|
|
39
|
+
</div>
|
|
40
|
+
<% end %>
|
|
41
|
+
|
|
42
|
+
- title: Collapsible with Button Trigger
|
|
43
|
+
examples:
|
|
44
|
+
- title: Using a button as trigger
|
|
45
|
+
code: |
|
|
46
|
+
<%= render Ui::Collapsible::Component.new do |collapsible| %>
|
|
47
|
+
<% collapsible.with_trigger do %>
|
|
48
|
+
<%= render Ui::Button::Component.new(variant: :outline, size: :sm) do %>Show details<% end %>
|
|
49
|
+
<% end %>
|
|
50
|
+
<div style="margin-top:0.5rem;padding:1rem;border:1px solid var(--ui-border);border-radius:var(--ui-radius);font-size:var(--ui-font-size-sm);">
|
|
51
|
+
<p style="margin:0;">Here are the additional details that were hidden until the button was clicked.</p>
|
|
52
|
+
</div>
|
|
53
|
+
<% end %>
|
|
54
|
+
|
|
55
|
+
- title: Custom Attributes
|
|
56
|
+
examples:
|
|
57
|
+
- title: Collapsible with custom class
|
|
58
|
+
code: |
|
|
59
|
+
<%= render Ui::Collapsible::Component.new(class: "my-faq-item", data: { section: "faq" }) do |collapsible| %>
|
|
60
|
+
<% collapsible.with_trigger do %>
|
|
61
|
+
<span>What is UikitRails?</span>
|
|
62
|
+
<span style="font-size:var(--ui-font-size-xs);">▼</span>
|
|
63
|
+
<% end %>
|
|
64
|
+
<p>UikitRails is a component library for Ruby on Rails applications, providing pre-built UI components with design tokens.</p>
|
|
65
|
+
<% end %>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<div data-controller="ui--dialog" <%= tag.attributes(html_attrs) %>>
|
|
2
|
+
<% if trigger? %>
|
|
3
|
+
<div data-action="click->ui--dialog#open"><%= trigger %></div>
|
|
4
|
+
<% end %>
|
|
5
|
+
<dialog class="ui-dialog" data-ui--dialog-target="dialog">
|
|
6
|
+
<div class="ui-dialog__overlay" data-action="click->ui--dialog#close"></div>
|
|
7
|
+
<div class="ui-dialog__content">
|
|
8
|
+
<% if title? || description? %>
|
|
9
|
+
<div class="ui-dialog__header">
|
|
10
|
+
<% if title? %><h2 class="ui-dialog__title"><%= title %></h2><% end %>
|
|
11
|
+
<% if description? %><p class="ui-dialog__description"><%= description %></p><% end %>
|
|
12
|
+
</div>
|
|
13
|
+
<% end %>
|
|
14
|
+
<div class="ui-dialog__body"><%= content %></div>
|
|
15
|
+
<% if footer? %>
|
|
16
|
+
<div class="ui-dialog__footer"><%= footer %></div>
|
|
17
|
+
<% end %>
|
|
18
|
+
<button class="ui-dialog__close" data-action="click->ui--dialog#close" aria-label="Close">
|
|
19
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></svg>
|
|
20
|
+
</button>
|
|
21
|
+
</div>
|
|
22
|
+
</dialog>
|
|
23
|
+
</div>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Ui
|
|
4
|
+
module Dialog
|
|
5
|
+
# Modal dialog with backdrop overlay.
|
|
6
|
+
class Component < Ui::BaseComponent
|
|
7
|
+
renders_one :trigger
|
|
8
|
+
renders_one :title
|
|
9
|
+
renders_one :description
|
|
10
|
+
renders_one :footer
|
|
11
|
+
|
|
12
|
+
attr_reader :html_attrs
|
|
13
|
+
|
|
14
|
+
def initialize(**html_attrs)
|
|
15
|
+
@html_attrs = html_attrs
|
|
16
|
+
super()
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
description: A modal dialog that overlays the page with a backdrop. Uses the native HTML <dialog> element for accessibility and supports title, description, body content, and footer slots.
|
|
2
|
+
|
|
3
|
+
sections:
|
|
4
|
+
- title: Basic Dialog
|
|
5
|
+
examples:
|
|
6
|
+
- title: Simple dialog with trigger
|
|
7
|
+
code: |
|
|
8
|
+
<%= render Ui::Dialog::Component.new do |dialog| %>
|
|
9
|
+
<% dialog.with_trigger do %>
|
|
10
|
+
<%= render Ui::Button::Component.new do %>Open Dialog<% end %>
|
|
11
|
+
<% end %>
|
|
12
|
+
<% dialog.with_title do %>Are you sure?<% end %>
|
|
13
|
+
<% dialog.with_description do %>This action cannot be undone.<% end %>
|
|
14
|
+
<p>This will permanently delete your account and all associated data.</p>
|
|
15
|
+
<% dialog.with_footer do %>
|
|
16
|
+
<%= render Ui::Button::Component.new(variant: :outline, data: { action: "click->ui--dialog#close" }) do %>Cancel<% end %>
|
|
17
|
+
<%= render Ui::Button::Component.new(variant: :destructive) do %>Delete<% end %>
|
|
18
|
+
<% end %>
|
|
19
|
+
<% end %>
|
|
20
|
+
|
|
21
|
+
- title: Dialog with Form
|
|
22
|
+
examples:
|
|
23
|
+
- title: Edit profile dialog
|
|
24
|
+
code: |
|
|
25
|
+
<%= render Ui::Dialog::Component.new do |dialog| %>
|
|
26
|
+
<% dialog.with_trigger do %>
|
|
27
|
+
<%= render Ui::Button::Component.new(variant: :outline) do %>Edit Profile<% end %>
|
|
28
|
+
<% end %>
|
|
29
|
+
<% dialog.with_title do %>Edit Profile<% end %>
|
|
30
|
+
<% dialog.with_description do %>Make changes to your profile here. Click save when you're done.<% end %>
|
|
31
|
+
<div style="display:flex;flex-direction:column;gap:1rem;">
|
|
32
|
+
<div>
|
|
33
|
+
<label style="font-size:var(--ui-font-size-sm);font-weight:500;">Name</label>
|
|
34
|
+
<input type="text" value="Jane Doe" style="width:100%;padding:0.5rem;border:1px solid var(--ui-border);border-radius:var(--ui-radius);margin-top:0.25rem;" />
|
|
35
|
+
</div>
|
|
36
|
+
<div>
|
|
37
|
+
<label style="font-size:var(--ui-font-size-sm);font-weight:500;">Email</label>
|
|
38
|
+
<input type="email" value="jane@example.com" style="width:100%;padding:0.5rem;border:1px solid var(--ui-border);border-radius:var(--ui-radius);margin-top:0.25rem;" />
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
<% dialog.with_footer do %>
|
|
42
|
+
<%= render Ui::Button::Component.new(variant: :outline, data: { action: "click->ui--dialog#close" }) do %>Cancel<% end %>
|
|
43
|
+
<%= render Ui::Button::Component.new do %>Save changes<% end %>
|
|
44
|
+
<% end %>
|
|
45
|
+
<% end %>
|
|
46
|
+
|
|
47
|
+
- title: Dialog without Footer
|
|
48
|
+
examples:
|
|
49
|
+
- title: Informational dialog
|
|
50
|
+
code: |
|
|
51
|
+
<%= render Ui::Dialog::Component.new do |dialog| %>
|
|
52
|
+
<% dialog.with_trigger do %>
|
|
53
|
+
<%= render Ui::Button::Component.new(variant: :secondary) do %>View Details<% end %>
|
|
54
|
+
<% end %>
|
|
55
|
+
<% dialog.with_title do %>Release Notes<% end %>
|
|
56
|
+
<% dialog.with_description do %>What's new in version 2.0<% end %>
|
|
57
|
+
<ul style="list-style:disc;padding-left:1.25rem;font-size:var(--ui-font-size-sm);line-height:1.75;">
|
|
58
|
+
<li>New dialog component with native HTML dialog</li>
|
|
59
|
+
<li>Improved dropdown positioning</li>
|
|
60
|
+
<li>Alert dialog for confirmations</li>
|
|
61
|
+
</ul>
|
|
62
|
+
<% end %>
|
|
63
|
+
|
|
64
|
+
- title: Custom Attributes
|
|
65
|
+
examples:
|
|
66
|
+
- title: Dialog with custom class
|
|
67
|
+
code: |
|
|
68
|
+
<%= render Ui::Dialog::Component.new(class: "my-custom-dialog", data: { turbo_frame: "modal" }) do |dialog| %>
|
|
69
|
+
<% dialog.with_trigger do %>
|
|
70
|
+
<%= render Ui::Button::Component.new do %>Open<% end %>
|
|
71
|
+
<% end %>
|
|
72
|
+
<% dialog.with_title do %>Custom Dialog<% end %>
|
|
73
|
+
<p>This dialog has custom attributes applied to the wrapper.</p>
|
|
74
|
+
<% dialog.with_footer do %>
|
|
75
|
+
<%= render Ui::Button::Component.new(variant: :outline, data: { action: "click->ui--dialog#close" }) do %>Close<% end %>
|
|
76
|
+
<% end %>
|
|
77
|
+
<% end %>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<div class="ui-dropdown" data-controller="ui--dropdown" <%= tag.attributes(html_attrs) %>>
|
|
2
|
+
<% if trigger? %>
|
|
3
|
+
<div data-action="click->ui--dropdown#toggle"><%= trigger %></div>
|
|
4
|
+
<% end %>
|
|
5
|
+
<div class="ui-dropdown__menu <%= align_class %>"
|
|
6
|
+
data-ui--dropdown-target="menu"
|
|
7
|
+
role="menu"
|
|
8
|
+
hidden>
|
|
9
|
+
<% items.each do |item| %>
|
|
10
|
+
<%= item %>
|
|
11
|
+
<% end %>
|
|
12
|
+
<%= content %>
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|