diff --git a/LICENSE.txt b/LICENSE.txt index 89c27dd9..f2420e82 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2024 RBUI +Copyright (c) 2024 RubyUI Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 4bcc1b9f..47b51b56 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,15 @@ -# RBUI (former PhlexUI) 🚀 +# RubyUI (former PhlexUI) 🚀 A UI component library, crafted precisely for Ruby devs who want to stay organized and build modern apps, fast. ✨ **Use this to build your own component library** 🛠️ -## About RBUI 📚 +## About RubyUI 📚 -RBUI is a UI component library designed to let Ruby developers create modern, fast, and organized applications. 💎 +RubyUI is a UI component library designed to let Ruby developers create modern, fast, and organized applications. 💎 ### Key Features: -- **Built for Speed** ⚡: RBUI leverages Phlex, which is up to 12x faster than traditional Rails ERB templates. +- **Built for Speed** ⚡: RubyUI leverages Phlex, which is up to 12x faster than traditional Rails ERB templates. - **Stunning UI** 🎨: Design beautiful, streamlined, and customizable UIs that sell your app effortlessly. - **Stay Organized** 📁: Keep your UI components well-organized and easy to manage. - **Customer-Centric UX** 🧑‍💼: Create memorable app experiences for your users. @@ -28,26 +28,26 @@ RBUI is a UI component library designed to let Ruby developers create modern, fa ### 1. Install the gem ```bash -bundle add rbui +bundle add ruby_ui ``` or add it to your Gemfile: ```ruby -gem "rbui" +gem "ruby_ui" ``` ### 2. Run the installer: ```bash -bin/rails g rbui:install +bin/rails g ruby_ui:install ``` ### 3. Done! 🎉 ## Documentation 📖 -Visit https://rbui.dev/docs/introduction to view the full documentation, including: +Visit https://ruby_ui.dev/docs/introduction to view the full documentation, including: - Detailed component guides - Themes @@ -56,7 +56,7 @@ Visit https://rbui.dev/docs/introduction to view the full documentation, includi ## Speed Comparison 🏎️ -RBUI, powered by Phlex, outperforms traditional methods: +RubyUI, powered by Phlex, outperforms traditional methods: - Phlex: Baseline 🏁 - ViewComponent: 5.57x slower 🐢 @@ -75,4 +75,4 @@ Licensed under the [MIT license](https://github.com/shadcn/ui/blob/main/LICENSE. --- -© 2024 RBUI. All rights reserved. 🔒 +© 2024 RubyUI. All rights reserved. 🔒 diff --git a/bin/console b/bin/console index 1d47efb2..22d83bec 100644 --- a/bin/console +++ b/bin/console @@ -1,7 +1,7 @@ #!/usr/bin/env ruby require "bundler/setup" -require "rbui" +require "ruby_ui" Bundler.require(:development) diff --git a/lib/generators/rbui/install/templates/base_store_initializer.rb.tt b/lib/generators/rbui/install/templates/base_store_initializer.rb.tt deleted file mode 100644 index 02a09787..00000000 --- a/lib/generators/rbui/install/templates/base_store_initializer.rb.tt +++ /dev/null @@ -1,10 +0,0 @@ -#RBUI.setup do |config| - - # Setting a namespace allows you to access RBUI components through this namespace. - # For example, with namespace set to "UI", you can use: - # UI::Button.new instead of RBUI::Button.new - # UI::Card.new instead of RBUI::Card.new - # This can help avoid naming conflicts and allows for cleaner, more concise code. - # If you prefer to use RBUI components directly, you can leave this unset. - # config.namespace = "UI" -#end diff --git a/lib/generators/rbui/base_generator.rb b/lib/generators/ruby_ui/base_generator.rb similarity index 89% rename from lib/generators/rbui/base_generator.rb rename to lib/generators/ruby_ui/base_generator.rb index 40e313c3..8f55601a 100644 --- a/lib/generators/rbui/base_generator.rb +++ b/lib/generators/ruby_ui/base_generator.rb @@ -1,9 +1,9 @@ require "rails/generators" -module RBUI +module RubyUI module Generators class BaseGenerator < defined?(Rails::Generators::Base) ? Rails::Generators::Base : Object - namespace "rbui:base" + namespace "ruby_ui:base" source_root File.join(__dir__, "templates") diff --git a/lib/generators/rbui/component_generator.rb b/lib/generators/ruby_ui/component_generator.rb similarity index 80% rename from lib/generators/rbui/component_generator.rb rename to lib/generators/ruby_ui/component_generator.rb index ae81404b..4ff80df9 100644 --- a/lib/generators/rbui/component_generator.rb +++ b/lib/generators/ruby_ui/component_generator.rb @@ -1,7 +1,7 @@ -module RBUI +module RubyUI module Generators - class ComponentGenerator < RBUI::Generators::BaseGenerator - namespace "rbui:component" + class ComponentGenerator < RubyUI::Generators::BaseGenerator + namespace "ruby_ui:component" source_root File.expand_path("../../..", __dir__) argument :component_name, type: :string, required: true @@ -21,7 +21,7 @@ def copy_common_files end def copy_component_files - puts "Component #{component} not found in rbui gem" if component_source.empty? + puts "Component #{component} not found in ruby_ui gem" if component_source.empty? component_files = Dir.glob("#{component_source}/*") @@ -32,22 +32,22 @@ def copy_component_files end def update_index_file - index_path = File.join(destination_root, "app/components/rbui/index.js") + index_path = File.join(destination_root, "app/components/ruby_ui/index.js") - rbui_index_content = File.read(index_path) + ruby_ui_index_content = File.read(index_path) - updated_rbui_index_content = add_controller_registration(rbui_index_content) + updated_ruby_ui_index_content = add_controller_registration(ruby_ui_index_content) - File.write(index_path, updated_rbui_index_content) + File.write(index_path, updated_ruby_ui_index_content) end - def add_controller_registration(rbui_index_content) + def add_controller_registration(ruby_ui_index_content) valid_controllers = get_valid_controllers - rbui_index_content = update_imports(rbui_index_content, valid_controllers) - update_registrations(rbui_index_content, valid_controllers) + ruby_ui_index_content = update_imports(ruby_ui_index_content, valid_controllers) + update_registrations(ruby_ui_index_content, valid_controllers) # Uncomment the following line if you want to update exports - # rbui_index_content = update_exports(rbui_index_content, valid_controllers) + # ruby_ui_index_content = update_exports(ruby_ui_index_content, valid_controllers) end def get_valid_controllers @@ -74,8 +74,8 @@ def controller_info(controller_file) # Build the new import path new_import_path = new_import_path("./#{relative_path.dirname}/#{file_name}") - # Create the registration name by dasherizing the component name and prefixing with 'rbui--' - registration_name = "rbui--#{component_name.dasherize}" + # Create the registration name by dasherizing the component name and prefixing with 'ruby_ui--' + registration_name = "ruby_ui--#{component_name.dasherize}" # Return a hash with import, registration, and export statements { @@ -92,7 +92,7 @@ def controller_info(controller_file) def new_import_path(relative_path) if using_importmap? - "rbui/#{relative_path.sub(/^\.\//, "")}" + "ruby_ui/#{relative_path.sub(/^\.\//, "")}" else relative_path end @@ -118,11 +118,11 @@ def component end def source_path - @source_path ||= "lib/rbui" + @source_path ||= "lib/ruby_ui" end def destination_path - @destination_path ||= "app/components/rbui" + @destination_path ||= "app/components/ruby_ui" end def component_source diff --git a/lib/generators/rbui/install/install_generator.rb b/lib/generators/ruby_ui/install/install_generator.rb similarity index 82% rename from lib/generators/rbui/install/install_generator.rb rename to lib/generators/ruby_ui/install/install_generator.rb index 3454641c..f7b4acac 100644 --- a/lib/generators/rbui/install/install_generator.rb +++ b/lib/generators/ruby_ui/install/install_generator.rb @@ -2,10 +2,10 @@ require_relative "../base_generator" # TODO: make ejctectec components work without the gem -module RBUI +module RubyUI module Generators - class InstallGenerator < RBUI::Generators::BaseGenerator - namespace "rbui:install" + class InstallGenerator < RubyUI::Generators::BaseGenerator + namespace "ruby_ui:install" if defined?(Rails::Generators::Base) source_root File.expand_path("templates", __dir__) @@ -22,7 +22,7 @@ def add_phlex_rails say "Phlex Rails is already installed", :green else say "Adding Phlex Rails" - run "bundle add phlex-rails --version=\"~> 1.2.1\"" + run "bundle add phlex-rails --version=\"~> 2.0.0.beta2\"" end say "Adding tailwind_merge" @@ -59,11 +59,11 @@ def install_stuff tailwind_config_path = Rails.root.join("config/tailwind.config.js") if !File.exist?(tailwind_config_path) - say "Tailwind CSS is required for RBUI", :red + say "Tailwind CSS is required for RubyUI", :red end - say "Add rbui initializer" - template "base_store_initializer.rb", "config/initializers/rbui.rb" + say "Add ruby_ui initializer" + template "base_store_initializer.rb", "config/initializers/ruby_ui.rb" if using_importmap? say "Using importmaps, adding tailwind-animate" @@ -90,16 +90,16 @@ def install_stuff template "application.tailwind.css", "app/assets/stylesheets/application.tailwind.css", force: true end - def pin_rbui_js + def pin_ruby_ui_js stimulus_path = Rails.root.join("app/javascript/application.js") - package_name = "rbui-js" + package_name = "ruby_ui-js" - say "Add RBUI Stimulus controllers" - # run "mkdir -p app/javascript/controllers/rbui-js" - template "index.js", "app/components/rbui/index.js" + say "Add RubyUI Stimulus controllers" + # run "mkdir -p app/javascript/controllers/ruby_ui-js" + template "index.js", "app/components/ruby_ui/index.js" if using_importmap? - gsub_file "app/components/rbui/index.js", /^import { application }.*$/ do + gsub_file "app/components/ruby_ui/index.js", /^import { application }.*$/ do 'import { application } from "controllers/application";' end @@ -109,34 +109,34 @@ def pin_rbui_js say "Pin #{package_name}" append_to_file Rails.root.join("config/importmap.rb") do - "pin_all_from \"app/components/rbui\", under: \"rbui\"\n" + "pin_all_from \"app/components/ruby_ui\", under: \"ruby_ui\"\n" end run "bin/importmap pin #{package_name}" - append_to_file stimulus_path, "\nimport \"rbui\";\n" + append_to_file stimulus_path, "\nimport \"ruby_ui\";\n" manifest_path = Rails.root.join("app/assets/config/manifest.js") if File.exist?(manifest_path) - append_to_file manifest_path, "\n//= link rbui/index.js\n" + append_to_file manifest_path, "\n//= link ruby_ui/index.js\n" end fix_import_maps! else - say "Add rbui-js package" + say "Add ruby_ui-js package" run "yarn add #{package_name}" - append_to_file stimulus_path, "\nimport \"../components/rbui\";\n" + append_to_file stimulus_path, "\nimport \"../components/ruby_ui\";\n" run "yarn build" end end - def include_rbui - message = "Include RBUI in your global component layout?\n This allows to call RBUI.Button {\"button\"} / RBUI::Button.new {\"button\"} with Button {\"button\"} (y/n)" + def include_ruby_ui + message = "Include RubyUI in your global component layout?\n This allows to call RubyUI.Button {\"button\"} / RubyUI::Button.new {\"button\"} with Button {\"button\"} (y/n)" if yes?(message) - say "Add RBUI to your global component layout" + say "Add RubyUI to your global component layout" insert_into_file "app/views/application_view.rb", after: "class ApplicationView < ApplicationComponent\n" do - " include RBUI\n" + " include RubyUI\n" end end end diff --git a/lib/generators/rbui/install/templates/.keep b/lib/generators/ruby_ui/install/templates/.keep similarity index 100% rename from lib/generators/rbui/install/templates/.keep rename to lib/generators/ruby_ui/install/templates/.keep diff --git a/lib/generators/rbui/install/templates/application.tailwind.css.tt b/lib/generators/ruby_ui/install/templates/application.tailwind.css.tt similarity index 97% rename from lib/generators/rbui/install/templates/application.tailwind.css.tt rename to lib/generators/ruby_ui/install/templates/application.tailwind.css.tt index 26fa13a0..582befe7 100644 --- a/lib/generators/rbui/install/templates/application.tailwind.css.tt +++ b/lib/generators/ruby_ui/install/templates/application.tailwind.css.tt @@ -25,7 +25,7 @@ --ring: 240 5.9% 10%; --radius: 0.5rem; - /* rbui especific */ + /* ruby_ui especific */ --warning: 38 92% 50%; --warning-foreground: 0 0% 100%; --success: 87 100% 37%; @@ -53,7 +53,7 @@ --input: 240 3.7% 15.9%; --ring: 240 4.9% 83.9%; - /* rbui especific */ + /* ruby_ui especific */ --warning: 38 92% 50%; --warning-foreground: 0 0% 100%; --success: 84 81% 44%; diff --git a/lib/generators/ruby_ui/install/templates/base_store_initializer.rb.tt b/lib/generators/ruby_ui/install/templates/base_store_initializer.rb.tt new file mode 100644 index 00000000..c99d685f --- /dev/null +++ b/lib/generators/ruby_ui/install/templates/base_store_initializer.rb.tt @@ -0,0 +1,10 @@ +#RubyUI.setup do |config| + + # Setting a namespace allows you to access RubyUI components through this namespace. + # For example, with namespace set to "UI", you can use: + # UI::Button.new instead of RubyUI::Button.new + # UI::Card.new instead of RubyUI::Card.new + # This can help avoid naming conflicts and allows for cleaner, more concise code. + # If you prefer to use RubyUI components directly, you can leave this unset. + # config.namespace = "UI" +#end diff --git a/lib/generators/rbui/install/templates/index.js.tt b/lib/generators/ruby_ui/install/templates/index.js.tt similarity index 61% rename from lib/generators/rbui/install/templates/index.js.tt rename to lib/generators/ruby_ui/install/templates/index.js.tt index ff6e702d..68a9f7ad 100644 --- a/lib/generators/rbui/install/templates/index.js.tt +++ b/lib/generators/ruby_ui/install/templates/index.js.tt @@ -4,7 +4,7 @@ import { application } from "../../../app/javascript/controllers/application"; // import ComboboxController from "./combobox/combobox_controller"; // Register all controllers -// application.register("rbui--combobox", ComboboxController); +// application.register("ruby_ui--combobox", ComboboxController); -import RBUI from "rbui-js"; -RBUI.initialize(application); +import RubyUI from "ruby_ui-js"; +RubyUI.initialize(application); diff --git a/lib/generators/rbui/install/templates/index_view.rb.tt b/lib/generators/ruby_ui/install/templates/index_view.rb.tt similarity index 94% rename from lib/generators/rbui/install/templates/index_view.rb.tt rename to lib/generators/ruby_ui/install/templates/index_view.rb.tt index 963dc8dd..0218e28d 100644 --- a/lib/generators/rbui/install/templates/index_view.rb.tt +++ b/lib/generators/ruby_ui/install/templates/index_view.rb.tt @@ -2,7 +2,7 @@ class Static::IndexView < ApplicationView def template - render RBUI::Button.new { "click me" } + render RubyUI::Button.new { "click me" } br {} # UI.Button { "click me" } diff --git a/lib/generators/rbui/install/templates/tailwind.config.js.tt b/lib/generators/ruby_ui/install/templates/tailwind.config.js.tt similarity index 88% rename from lib/generators/rbui/install/templates/tailwind.config.js.tt rename to lib/generators/ruby_ui/install/templates/tailwind.config.js.tt index a517a41e..038bdb94 100644 --- a/lib/generators/rbui/install/templates/tailwind.config.js.tt +++ b/lib/generators/ruby_ui/install/templates/tailwind.config.js.tt @@ -1,9 +1,9 @@ -// For importing tailwind styles from rbui gem +// For importing tailwind styles from ruby_ui gem const execSync = require('child_process').execSync; -// Import rbui gem path -const outputRBUI = execSync('bundle show rbui', { encoding: 'utf-8' }); -const rbui_path = outputRBUI.trim() + '/**/*.rb'; +// Import ruby_ui gem path +const outputRubyUI = execSync('bundle show ruby_ui', { encoding: 'utf-8' }); +const ruby_ui_path = outputRubyUI.trim() + '/**/*.rb'; const defaultTheme = require('tailwindcss/defaultTheme') @@ -11,11 +11,11 @@ module.exports = { darkMode: ["class"], content: [ './app/views/**/*.{erb,haml,html,slim,rb}', - './app/components/rbui/**/*.rb', + './app/components/ruby_ui/**/*.rb', './app/helpers/**/*.rb', './app/assets/stylesheets/**/*.css', './app/javascript/**/*.js', - rbui_path + ruby_ui_path ], theme: { container: { @@ -60,7 +60,7 @@ module.exports = { DEFAULT: "hsl(var(--card))", foreground: "hsl(var(--card-foreground))", }, - /* rbui especific */ + /* ruby_ui especific */ warning: { DEFAULT: "hsl(var(--warning))", foreground: "hsl(var(--warning-foreground))", diff --git a/lib/rbui.rb b/lib/rbui.rb deleted file mode 100644 index 63073aea..00000000 --- a/lib/rbui.rb +++ /dev/null @@ -1,57 +0,0 @@ -# frozen_string_literal: true - -require "json" -require "phlex" - -module RBUI - extend Phlex::Kit - - def self.setup - yield self - create_namespace_module if namespace - end - - def self.create_namespace_module - source_module = self - mod = namespace.to_s.split("::").inject(Object) do |parent, const| - parent.const_get(const) - rescue - parent.const_set(const, Module.new) - end - - mod.singleton_class.class_eval do - define_method :const_missing do |name| - source_module.const_defined?(name) ? source_module.const_get(name) : super(name) - end - - define_method :method_missing do |name, *args, &block| - source_module.respond_to?(name) ? source_module.send(name, *args, &block) : super(name, *args, &block) - end - - define_method :respond_to_missing? do |name, include_private = false| - source_module.respond_to?(name) || super(name, include_private) - end - end - end - - def self.namespace - @namespace ||= nil - end - - def self.namespace=(value) - @namespace = value - end -end - -# Require the Base class first -require_relative "rbui/base" - -# Manually require all the files -Dir.glob(File.join(__dir__, "rbui", "**", "*.rb")).sort.each { |file| require file } - -# If you need to require generators (assuming they're needed) -if defined?(Rails::Generators) - require_relative "generators/rbui/base_generator" - require_relative "generators/rbui/install/install_generator" - require_relative "generators/rbui/component_generator" -end diff --git a/lib/rbui/accordion/accordion_controller.js b/lib/rbui/accordion/accordion_controller.js deleted file mode 100644 index d646cefc..00000000 --- a/lib/rbui/accordion/accordion_controller.js +++ /dev/null @@ -1,81 +0,0 @@ -import { Controller } from "@hotwired/stimulus" -import { animate } from "motion" - -// Connects to data-controller="rbui--accordion" -export default class extends Controller { - static targets = ['icon', 'content'] - static values = { - open: { - type: Boolean, - default: false, - }, - animationDuration: { - type: Number, - default: 0.15, // Default animation duration (in seconds) - }, - animationEasing: { - type: String, - default: 'ease-in-out', // Default animation easing - }, - rotateIcon: { - type: Number, - default: 180, // Default icon rotation (in degrees) - }, - } - - connect() { - // Set the initial state of the accordion - let originalAnimationDuration = this.animationDurationValue - this.animationDurationValue = 0 - this.openValue ? this.open() : this.close() - this.animationDurationValue = originalAnimationDuration - } - - // Toggle the 'open' value - toggle() { - this.openValue = !this.openValue - } - - // Handle changes in the 'open' value - openValueChanged(isOpen, wasOpen) { - if (isOpen) { - this.open() - } else { - this.close() - } - } - - // Open the accordion content - open() { - if (this.hasContentTarget) { - this.revealContent() - this.hasIconTarget && this.rotateIcon() - this.openValue = true - } - } - - // Close the accordion content - close() { - if (this.hasContentTarget) { - this.hideContent() - this.hasIconTarget && this.rotateIcon() - this.openValue = false - } - } - - // Reveal the accordion content with animation - revealContent() { - const contentHeight = this.contentTarget.scrollHeight; - animate(this.contentTarget, { height: `${contentHeight}px` }, { duration: this.animationDurationValue, easing: this.animationEasingValue }) - } - - // Hide the accordion content with animation - hideContent() { - animate(this.contentTarget, { height: 0 }, { duration: this.animationDurationValue, easing: this.animationEasingValue }) - } - - // Rotate the accordion icon 180deg using animate function - rotateIcon() { - animate(this.iconTarget, { rotate: `${this.openValue ? this.rotateIconValue : 0}deg` }) - } -} diff --git a/lib/rbui/calendar/calendar.rb b/lib/rbui/calendar/calendar.rb deleted file mode 100644 index 2ea26c02..00000000 --- a/lib/rbui/calendar/calendar.rb +++ /dev/null @@ -1,39 +0,0 @@ -# frozen_string_literal: true - -module RBUI - class Calendar < Base - def initialize(selected_date: nil, input_id: nil, date_format: "yyyy-MM-dd", **attrs) - @selected_date = selected_date - @input_id = input_id - @date_format = date_format - super(**attrs) - end - - def view_template - div(**attrs) do - RBUI.CalendarHeader do - RBUI.CalendarTitle - RBUI.CalendarPrev - RBUI.CalendarNext - end - RBUI.CalendarBody # Where the calendar is rendered (Weekdays and Days) - RBUI.CalendarWeekdays # Template for the weekdays - RBUI.CalendarDays # Template for the days - end - end - - private - - def default_attrs - { - class: "p-3 space-y-4", - data: { - controller: "rbui--calendar", - rbui__calendar_selected_date_value: @selected_date&.to_s, - rbui__calendar_format_value: @date_format, - rbui__calendar_rbui__calendar_input_outlet: @input_id - } - } - end - end -end diff --git a/lib/rbui/combobox/combobox.rb b/lib/rbui/combobox/combobox.rb deleted file mode 100644 index 6441db31..00000000 --- a/lib/rbui/combobox/combobox.rb +++ /dev/null @@ -1,24 +0,0 @@ -# frozen_string_literal: true - -module RBUI - class Combobox < Base - def view_template(&) - div(**attrs, &) - end - - private - - def default_attrs - { - data: { - controller: "rbui--combobox", - rbui__combobox_open_value: "false", - action: "click@window->rbui--combobox#onClickOutside", - rbui__combobox_rbui__combobox_content_outlet: ".combobox-content", - rbui__combobox_rbui__combobox_item_outlet: ".combobox-item" - }, - class: "group/combobox w-full relative" - } - end - end -end diff --git a/lib/rbui/combobox/combobox_content.rb b/lib/rbui/combobox/combobox_content.rb deleted file mode 100644 index 75d858e8..00000000 --- a/lib/rbui/combobox/combobox_content.rb +++ /dev/null @@ -1,31 +0,0 @@ -# frozen_string_literal: true - -module RBUI - class ComboboxContent < Base - def initialize(**attrs) - @id = "content#{SecureRandom.hex(4)}" - super - end - - def view_template(&) - div(**attrs) do - div(class: "min-w-max max-h-[300px] overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md outline-none animate-out group-data-[rbui--combobox-open-value=true]/combobox:animate-in fade-out-0 group-data-[rbui--combobox-open-value=true]/combobox:fade-in-0 zoom-out-95 group-data-[rbui--combobox-open-value=true]/combobox:zoom-in-95 slide-in-from-top-2", &) - end - end - - private - - def default_attrs - { - id: @id, - role: "listbox", - data: { - controller: "rbui--combobox-content", - rbui__combobox_target: "content", - action: "keydown.enter->rbui--combobox#onKeyEnter keydown.esc->rbui--combobox#onEscKey keydown.down->rbui--combobox#onKeyDown keydown.up->rbui--combobox#onKeyUp" - }, - class: "combobox-content hidden w-full absolute top-0 left-0 z-50" - } - end - end -end diff --git a/lib/rbui/tabs/tabs_controller.js b/lib/rbui/tabs/tabs_controller.js deleted file mode 100644 index 26cfa1af..00000000 --- a/lib/rbui/tabs/tabs_controller.js +++ /dev/null @@ -1,40 +0,0 @@ -import { Controller } from "@hotwired/stimulus" - -// Connects to data-controller="rbui--tabs" -export default class extends Controller { - static targets = ["trigger", "content"] - static values = { active: String } - - connect() { - if (!this.hasActiveValue && this.triggerTargets.length > 0) { - this.activeValue = this.triggerTargets[0].dataset.value - } - } - - show(e) { - this.activeValue = e.currentTarget.dataset.value - } - - activeValueChanged(currentValue, previousValue) { - if (currentValue == '' || currentValue == previousValue) return - - this.contentTargets.forEach((el) => { - el.classList.add("hidden") - }) - - this.triggerTargets.forEach((el) => { - el.dataset.state = "inactive" - }) - - this.activeContentTarget() && this.activeContentTarget().classList.remove("hidden") - this.activeTriggerTarget().dataset.state = "active" - } - - activeTriggerTarget() { - return this.triggerTargets.find((el) => el.dataset.value == this.activeValue) - } - - activeContentTarget() { - return this.contentTargets.find((el) => el.dataset.value == this.activeValue) - } -} diff --git a/lib/ruby_ui.rb b/lib/ruby_ui.rb index afff68f0..5ec29716 100644 --- a/lib/ruby_ui.rb +++ b/lib/ruby_ui.rb @@ -1 +1,57 @@ -require_relative "rbui" +# frozen_string_literal: true + +require "json" +require "phlex" + +module RubyUI + extend Phlex::Kit + + def self.setup + yield self + create_namespace_module if namespace + end + + def self.create_namespace_module + source_module = self + mod = namespace.to_s.split("::").inject(Object) do |parent, const| + parent.const_get(const) + rescue + parent.const_set(const, Module.new) + end + + mod.singleton_class.class_eval do + define_method :const_missing do |name| + source_module.const_defined?(name) ? source_module.const_get(name) : super(name) + end + + define_method :method_missing do |name, *args, &block| + source_module.respond_to?(name) ? source_module.send(name, *args, &block) : super(name, *args, &block) + end + + define_method :respond_to_missing? do |name, include_private = false| + source_module.respond_to?(name) || super(name, include_private) + end + end + end + + def self.namespace + @namespace ||= nil + end + + def self.namespace=(value) + @namespace = value + end +end + +# Require the Base class first +require_relative "ruby_ui/base" + +# Manually require all the files +Dir.glob(File.join(__dir__, "ruby_ui", "**", "*.rb")).sort.each { |file| require file } + +# If you need to require generators (assuming they're needed) +if defined?(Rails::Generators) + require_relative "generators/ruby_ui/base_generator" + require_relative "generators/ruby_ui/install/install_generator" + require_relative "generators/ruby_ui/component_generator" +end diff --git a/lib/rbui/accordion/accordion.rb b/lib/ruby_ui/accordion/accordion.rb similarity index 93% rename from lib/rbui/accordion/accordion.rb rename to lib/ruby_ui/accordion/accordion.rb index 70ce830e..c7f8ff24 100644 --- a/lib/rbui/accordion/accordion.rb +++ b/lib/ruby_ui/accordion/accordion.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class Accordion < Base def view_template(&) div(**attrs, &) diff --git a/lib/rbui/accordion/accordion_content.rb b/lib/ruby_ui/accordion/accordion_content.rb similarity index 82% rename from lib/rbui/accordion/accordion_content.rb rename to lib/ruby_ui/accordion/accordion_content.rb index a8b168ce..1b6feef9 100644 --- a/lib/rbui/accordion/accordion_content.rb +++ b/lib/ruby_ui/accordion/accordion_content.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class AccordionContent < Base def view_template(&) div(**attrs, &) @@ -11,7 +11,7 @@ def view_template(&) def default_attrs { data: { - rbui__accordion_target: "content" + ruby_ui__accordion_target: "content" }, class: "overflow-y-hidden", style: "height: 0px;" diff --git a/lib/ruby_ui/accordion/accordion_controller.js b/lib/ruby_ui/accordion/accordion_controller.js new file mode 100644 index 00000000..0a2f0fd8 --- /dev/null +++ b/lib/ruby_ui/accordion/accordion_controller.js @@ -0,0 +1,97 @@ +import { Controller } from "@hotwired/stimulus"; +import { animate } from "motion"; + +// Connects to data-controller="ruby_ui--accordion" +export default class extends Controller { + static targets = ["icon", "content"]; + static values = { + open: { + type: Boolean, + default: false, + }, + animationDuration: { + type: Number, + default: 0.15, // Default animation duration (in seconds) + }, + animationEasing: { + type: String, + default: "ease-in-out", // Default animation easing + }, + rotateIcon: { + type: Number, + default: 180, // Default icon rotation (in degrees) + }, + }; + + connect() { + // Set the initial state of the accordion + let originalAnimationDuration = this.animationDurationValue; + this.animationDurationValue = 0; + this.openValue ? this.open() : this.close(); + this.animationDurationValue = originalAnimationDuration; + } + + // Toggle the 'open' value + toggle() { + this.openValue = !this.openValue; + } + + // Handle changes in the 'open' value + openValueChanged(isOpen, wasOpen) { + if (isOpen) { + this.open(); + } else { + this.close(); + } + } + + // Open the accordion content + open() { + if (this.hasContentTarget) { + this.revealContent(); + this.hasIconTarget && this.rotateIcon(); + this.openValue = true; + } + } + + // Close the accordion content + close() { + if (this.hasContentTarget) { + this.hideContent(); + this.hasIconTarget && this.rotateIcon(); + this.openValue = false; + } + } + + // Reveal the accordion content with animation + revealContent() { + const contentHeight = this.contentTarget.scrollHeight; + animate( + this.contentTarget, + { height: `${contentHeight}px` }, + { + duration: this.animationDurationValue, + easing: this.animationEasingValue, + }, + ); + } + + // Hide the accordion content with animation + hideContent() { + animate( + this.contentTarget, + { height: 0 }, + { + duration: this.animationDurationValue, + easing: this.animationEasingValue, + }, + ); + } + + // Rotate the accordion icon 180deg using animate function + rotateIcon() { + animate(this.iconTarget, { + rotate: `${this.openValue ? this.rotateIconValue : 0}deg`, + }); + } +} diff --git a/lib/rbui/accordion/accordion_default_content.rb b/lib/ruby_ui/accordion/accordion_default_content.rb similarity index 94% rename from lib/rbui/accordion/accordion_default_content.rb rename to lib/ruby_ui/accordion/accordion_default_content.rb index c405d6bb..423255b6 100644 --- a/lib/rbui/accordion/accordion_default_content.rb +++ b/lib/ruby_ui/accordion/accordion_default_content.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class AccordionDefaultContent < Base def view_template(&) div(**attrs, &) diff --git a/lib/rbui/accordion/accordion_default_trigger.rb b/lib/ruby_ui/accordion/accordion_default_trigger.rb similarity index 78% rename from lib/rbui/accordion/accordion_default_trigger.rb rename to lib/ruby_ui/accordion/accordion_default_trigger.rb index 968f6dc2..51187c69 100644 --- a/lib/rbui/accordion/accordion_default_trigger.rb +++ b/lib/ruby_ui/accordion/accordion_default_trigger.rb @@ -1,17 +1,17 @@ # frozen_string_literal: true -module RBUI +module RubyUI class AccordionDefaultTrigger < Base def view_template(&block) div(class: "flex items-center justify-between w-full") do p(&block) - RBUI.AccordionIcon + RubyUI.AccordionIcon end end def default_attrs { - data: {action: "click->rbui--accordion#toggle"}, + data: {action: "click->ruby_ui--accordion#toggle"}, class: "w-full flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all hover:underline" } end diff --git a/lib/rbui/accordion/accordion_icon.rb b/lib/ruby_ui/accordion/accordion_icon.rb similarity index 91% rename from lib/rbui/accordion/accordion_icon.rb rename to lib/ruby_ui/accordion/accordion_icon.rb index 5fbb5ac1..bda60b1e 100644 --- a/lib/rbui/accordion/accordion_icon.rb +++ b/lib/ruby_ui/accordion/accordion_icon.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class AccordionIcon < Base def view_template(&block) span(**attrs) do @@ -31,7 +31,7 @@ def icon def default_attrs { class: "opacity-50", - data: {rbui__accordion_target: "icon"} + data: {ruby_ui__accordion_target: "icon"} } end end diff --git a/lib/rbui/accordion/accordion_item.rb b/lib/ruby_ui/accordion/accordion_item.rb similarity index 69% rename from lib/rbui/accordion/accordion_item.rb rename to lib/ruby_ui/accordion/accordion_item.rb index 6dab750f..d2d1937e 100644 --- a/lib/rbui/accordion/accordion_item.rb +++ b/lib/ruby_ui/accordion/accordion_item.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class AccordionItem < Base def initialize(open: false, rotate_icon: 180, **attrs) @open = open @@ -17,9 +17,9 @@ def view_template(&) def default_attrs { data: { - controller: "rbui--accordion", - rbui__accordion_open_value: @open, - rbui__accordion_rotate_icon_value: @rotate_icon + controller: "ruby_ui--accordion", + ruby_ui__accordion_open_value: @open, + ruby_ui__accordion_rotate_icon_value: @rotate_icon }, class: "border-b" } diff --git a/lib/rbui/accordion/accordion_trigger.rb b/lib/ruby_ui/accordion/accordion_trigger.rb similarity index 81% rename from lib/rbui/accordion/accordion_trigger.rb rename to lib/ruby_ui/accordion/accordion_trigger.rb index 5659939d..471de1d3 100644 --- a/lib/rbui/accordion/accordion_trigger.rb +++ b/lib/ruby_ui/accordion/accordion_trigger.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class AccordionTrigger < Base def view_template(&) button(**attrs, &) @@ -9,7 +9,7 @@ def view_template(&) def default_attrs { type: "button", - data: {action: "click->rbui--accordion#toggle"}, + data: {action: "click->ruby_ui--accordion#toggle"}, class: "w-full flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all hover:underline" } end diff --git a/lib/rbui/alert/alert.rb b/lib/ruby_ui/alert/alert.rb similarity index 98% rename from lib/rbui/alert/alert.rb rename to lib/ruby_ui/alert/alert.rb index fdc428e3..0c7881eb 100644 --- a/lib/rbui/alert/alert.rb +++ b/lib/ruby_ui/alert/alert.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class Alert < Base def initialize(variant: nil, **attrs) @variant = variant diff --git a/lib/rbui/alert/alert_description.rb b/lib/ruby_ui/alert/alert_description.rb similarity index 94% rename from lib/rbui/alert/alert_description.rb rename to lib/ruby_ui/alert/alert_description.rb index 776bf52f..b36a15d1 100644 --- a/lib/rbui/alert/alert_description.rb +++ b/lib/ruby_ui/alert/alert_description.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class AlertDescription < Base def view_template(&) div(**attrs, &) diff --git a/lib/rbui/alert/alert_title.rb b/lib/ruby_ui/alert/alert_title.rb similarity index 94% rename from lib/rbui/alert/alert_title.rb rename to lib/ruby_ui/alert/alert_title.rb index 09caaec2..37e2fff9 100644 --- a/lib/rbui/alert/alert_title.rb +++ b/lib/ruby_ui/alert/alert_title.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class AlertTitle < Base def view_template(&) h5(**attrs, &) diff --git a/lib/rbui/alert_dialog/alert_dialog.rb b/lib/ruby_ui/alert_dialog/alert_dialog.rb similarity index 73% rename from lib/rbui/alert_dialog/alert_dialog.rb rename to lib/ruby_ui/alert_dialog/alert_dialog.rb index af688f5e..756fa9c7 100644 --- a/lib/rbui/alert_dialog/alert_dialog.rb +++ b/lib/ruby_ui/alert_dialog/alert_dialog.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class AlertDialog < Base def initialize(open: false, **attrs) @open = open @@ -16,8 +16,8 @@ def view_template(&) def default_attrs { data: { - controller: "rbui--alert-dialog", - rbui__alert_dialog_open_value: @open.to_s + controller: "ruby_ui--alert-dialog", + ruby_ui__alert_dialog_open_value: @open.to_s }, class: "inline-block" } diff --git a/lib/rbui/alert_dialog/alert_dialog_action.rb b/lib/ruby_ui/alert_dialog/alert_dialog_action.rb similarity index 76% rename from lib/rbui/alert_dialog/alert_dialog_action.rb rename to lib/ruby_ui/alert_dialog/alert_dialog_action.rb index dd314700..75a34d2e 100644 --- a/lib/rbui/alert_dialog/alert_dialog_action.rb +++ b/lib/ruby_ui/alert_dialog/alert_dialog_action.rb @@ -1,9 +1,9 @@ # frozen_string_literal: true -module RBUI +module RubyUI class AlertDialogAction < Base def view_template(&) - render RBUI::Button.new(**attrs, &) + render RubyUI::Button.new(**attrs, &) end private diff --git a/lib/rbui/alert_dialog/alert_dialog_cancel.rb b/lib/ruby_ui/alert_dialog/alert_dialog_cancel.rb similarity index 68% rename from lib/rbui/alert_dialog/alert_dialog_cancel.rb rename to lib/ruby_ui/alert_dialog/alert_dialog_cancel.rb index 69a85b1a..75a4f89c 100644 --- a/lib/rbui/alert_dialog/alert_dialog_cancel.rb +++ b/lib/ruby_ui/alert_dialog/alert_dialog_cancel.rb @@ -1,9 +1,9 @@ # frozen_string_literal: true -module RBUI +module RubyUI class AlertDialogCancel < Base def view_template(&) - render RBUI::Button.new(**attrs, &) + render RubyUI::Button.new(**attrs, &) end private @@ -12,7 +12,7 @@ def default_attrs { variant: :outline, data: { - action: "click->rbui--alert-dialog#dismiss" + action: "click->ruby_ui--alert-dialog#dismiss" }, class: "mt-2 sm:mt-0" } diff --git a/lib/rbui/alert_dialog/alert_dialog_content.rb b/lib/ruby_ui/alert_dialog/alert_dialog_content.rb similarity index 95% rename from lib/rbui/alert_dialog/alert_dialog_content.rb rename to lib/ruby_ui/alert_dialog/alert_dialog_content.rb index a892ce3f..eee13407 100644 --- a/lib/rbui/alert_dialog/alert_dialog_content.rb +++ b/lib/ruby_ui/alert_dialog/alert_dialog_content.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class AlertDialogContent < Base def view_template(&block) all_template_tag(**attrs) do @@ -37,7 +37,7 @@ def container(&) def default_attrs { data: { - rbui__alert_dialog_target: "content" + ruby_ui__alert_dialog_target: "content" } } end diff --git a/lib/rbui/alert_dialog/alert_dialog_controller.js b/lib/ruby_ui/alert_dialog/alert_dialog_controller.js similarity index 91% rename from lib/rbui/alert_dialog/alert_dialog_controller.js rename to lib/ruby_ui/alert_dialog/alert_dialog_controller.js index 3f19be01..439a450f 100644 --- a/lib/rbui/alert_dialog/alert_dialog_controller.js +++ b/lib/ruby_ui/alert_dialog/alert_dialog_controller.js @@ -1,6 +1,6 @@ import { Controller } from "@hotwired/stimulus"; -// Connects to data-controller="rbui--alert-dialog" +// Connects to data-controller="ruby_ui--alert-dialog" export default class extends Controller { static targets = ["content"]; static values = { diff --git a/lib/rbui/alert_dialog/alert_dialog_description.rb b/lib/ruby_ui/alert_dialog/alert_dialog_description.rb similarity index 94% rename from lib/rbui/alert_dialog/alert_dialog_description.rb rename to lib/ruby_ui/alert_dialog/alert_dialog_description.rb index 5a0aa7b9..4bcf5578 100644 --- a/lib/rbui/alert_dialog/alert_dialog_description.rb +++ b/lib/ruby_ui/alert_dialog/alert_dialog_description.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class AlertDialogDescription < Base def view_template(&) p(**attrs, &) diff --git a/lib/rbui/alert_dialog/alert_dialog_footer.rb b/lib/ruby_ui/alert_dialog/alert_dialog_footer.rb similarity index 95% rename from lib/rbui/alert_dialog/alert_dialog_footer.rb rename to lib/ruby_ui/alert_dialog/alert_dialog_footer.rb index d03b8aea..07c0e6e1 100644 --- a/lib/rbui/alert_dialog/alert_dialog_footer.rb +++ b/lib/ruby_ui/alert_dialog/alert_dialog_footer.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class AlertDialogFooter < Base def view_template(&) div(**attrs, &) diff --git a/lib/rbui/alert_dialog/alert_dialog_header.rb b/lib/ruby_ui/alert_dialog/alert_dialog_header.rb similarity index 94% rename from lib/rbui/alert_dialog/alert_dialog_header.rb rename to lib/ruby_ui/alert_dialog/alert_dialog_header.rb index 93b17f0f..1331fa1f 100644 --- a/lib/rbui/alert_dialog/alert_dialog_header.rb +++ b/lib/ruby_ui/alert_dialog/alert_dialog_header.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class AlertDialogHeader < Base def view_template(&) div(**attrs, &) diff --git a/lib/rbui/alert_dialog/alert_dialog_title.rb b/lib/ruby_ui/alert_dialog/alert_dialog_title.rb similarity index 94% rename from lib/rbui/alert_dialog/alert_dialog_title.rb rename to lib/ruby_ui/alert_dialog/alert_dialog_title.rb index 5cd0015b..6f7a87b4 100644 --- a/lib/rbui/alert_dialog/alert_dialog_title.rb +++ b/lib/ruby_ui/alert_dialog/alert_dialog_title.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class AlertDialogTitle < Base def view_template(&) h2(**attrs, &) diff --git a/lib/rbui/alert_dialog/alert_dialog_trigger.rb b/lib/ruby_ui/alert_dialog/alert_dialog_trigger.rb similarity index 74% rename from lib/rbui/alert_dialog/alert_dialog_trigger.rb rename to lib/ruby_ui/alert_dialog/alert_dialog_trigger.rb index 447e13bc..127c2c39 100644 --- a/lib/rbui/alert_dialog/alert_dialog_trigger.rb +++ b/lib/ruby_ui/alert_dialog/alert_dialog_trigger.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class AlertDialogTrigger < Base def view_template(&) div(**attrs, &) @@ -10,7 +10,7 @@ def view_template(&) def default_attrs { - data: {action: "click->rbui--alert-dialog#open"}, + data: {action: "click->ruby_ui--alert-dialog#open"}, class: "inline-block" } end diff --git a/lib/rbui/aspect_ratio/aspect_ratio.rb b/lib/ruby_ui/aspect_ratio/aspect_ratio.rb similarity index 98% rename from lib/rbui/aspect_ratio/aspect_ratio.rb rename to lib/ruby_ui/aspect_ratio/aspect_ratio.rb index fede6a68..87c286f1 100644 --- a/lib/rbui/aspect_ratio/aspect_ratio.rb +++ b/lib/ruby_ui/aspect_ratio/aspect_ratio.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class AspectRatio < Base def initialize(aspect_ratio: "16/9", **attrs) raise "aspect_ratio must be in the format of a string with a slash in the middle (eg. '16/9', '1/1')" unless aspect_ratio.is_a?(String) && aspect_ratio.include?("/") diff --git a/lib/rbui/avatar/avatar.rb b/lib/ruby_ui/avatar/avatar.rb similarity index 97% rename from lib/rbui/avatar/avatar.rb rename to lib/ruby_ui/avatar/avatar.rb index 28bd2bf5..01b96781 100644 --- a/lib/rbui/avatar/avatar.rb +++ b/lib/ruby_ui/avatar/avatar.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class Avatar < Base SIZES = { xs: "h-4 w-4 text-[0.5rem]", diff --git a/lib/rbui/avatar/avatar_fallback.rb b/lib/ruby_ui/avatar/avatar_fallback.rb similarity index 95% rename from lib/rbui/avatar/avatar_fallback.rb rename to lib/ruby_ui/avatar/avatar_fallback.rb index d7115333..a1a5a538 100644 --- a/lib/rbui/avatar/avatar_fallback.rb +++ b/lib/ruby_ui/avatar/avatar_fallback.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class AvatarFallback < Base def view_template(&) span(**attrs, &) diff --git a/lib/rbui/avatar/avatar_image.rb b/lib/ruby_ui/avatar/avatar_image.rb similarity index 96% rename from lib/rbui/avatar/avatar_image.rb rename to lib/ruby_ui/avatar/avatar_image.rb index 00985466..bce164e3 100644 --- a/lib/rbui/avatar/avatar_image.rb +++ b/lib/ruby_ui/avatar/avatar_image.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class AvatarImage < Base def initialize(src:, alt: "", **attrs) @src = src diff --git a/lib/rbui/badge/badge.rb b/lib/ruby_ui/badge/badge.rb similarity index 99% rename from lib/rbui/badge/badge.rb rename to lib/ruby_ui/badge/badge.rb index 18afd91f..752f70e5 100644 --- a/lib/rbui/badge/badge.rb +++ b/lib/ruby_ui/badge/badge.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class Badge < Base SIZES = { sm: "px-1.5 py-0.5 text-xs", diff --git a/lib/rbui/base.rb b/lib/ruby_ui/base.rb similarity index 98% rename from lib/rbui/base.rb rename to lib/ruby_ui/base.rb index ee5ecaf7..16ccc7db 100644 --- a/lib/rbui/base.rb +++ b/lib/ruby_ui/base.rb @@ -2,7 +2,7 @@ require "tailwind_merge" -module RBUI +module RubyUI class Base < Phlex::HTML TAILWIND_MERGER = ::TailwindMerge::Merger.new.freeze unless defined?(TAILWIND_MERGER) diff --git a/lib/rbui/button/button.rb b/lib/ruby_ui/button/button.rb similarity index 99% rename from lib/rbui/button/button.rb rename to lib/ruby_ui/button/button.rb index 7cc67912..9636fa22 100644 --- a/lib/rbui/button/button.rb +++ b/lib/ruby_ui/button/button.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class Button < Base def initialize(type: :button, variant: :primary, size: :md, icon: false, **attrs) @type = type diff --git a/lib/ruby_ui/calendar/calendar.rb b/lib/ruby_ui/calendar/calendar.rb new file mode 100644 index 00000000..0bb8e815 --- /dev/null +++ b/lib/ruby_ui/calendar/calendar.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +module RubyUI + class Calendar < Base + def initialize(selected_date: nil, input_id: nil, date_format: "yyyy-MM-dd", **attrs) + @selected_date = selected_date + @input_id = input_id + @date_format = date_format + super(**attrs) + end + + def view_template + div(**attrs) do + RubyUI.CalendarHeader do + RubyUI.CalendarTitle + RubyUI.CalendarPrev + RubyUI.CalendarNext + end + RubyUI.CalendarBody # Where the calendar is rendered (Weekdays and Days) + RubyUI.CalendarWeekdays # Template for the weekdays + RubyUI.CalendarDays # Template for the days + end + end + + private + + def default_attrs + { + class: "p-3 space-y-4", + data: { + controller: "ruby_ui--calendar", + ruby_ui__calendar_selected_date_value: @selected_date&.to_s, + ruby_ui__calendar_format_value: @date_format, + ruby_ui__calendar_ruby_ui__calendar_input_outlet: @input_id + } + } + end + end +end diff --git a/lib/rbui/calendar/calendar_body.rb b/lib/ruby_ui/calendar/calendar_body.rb similarity index 77% rename from lib/rbui/calendar/calendar_body.rb rename to lib/ruby_ui/calendar/calendar_body.rb index c1d49706..fe6437c8 100644 --- a/lib/rbui/calendar/calendar_body.rb +++ b/lib/ruby_ui/calendar/calendar_body.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class CalendarBody < Base def view_template table(**attrs) @@ -11,7 +11,7 @@ def view_template def default_attrs { data: { - rbui__calendar_target: "calendar" + ruby_ui__calendar_target: "calendar" } } end diff --git a/lib/rbui/calendar/calendar_controller.js b/lib/ruby_ui/calendar/calendar_controller.js similarity index 73% rename from lib/rbui/calendar/calendar_controller.js rename to lib/ruby_ui/calendar/calendar_controller.js index bc669a18..bf706e13 100644 --- a/lib/rbui/calendar/calendar_controller.js +++ b/lib/ruby_ui/calendar/calendar_controller.js @@ -2,22 +2,30 @@ import { Controller } from "@hotwired/stimulus"; import Mustache from "mustache"; export default class extends Controller { - static targets = ["calendar", "title", "weekdaysTemplate", "selectedDateTemplate", "todayDateTemplate", "currentMonthDateTemplate", "otherMonthDateTemplate"]; + static targets = [ + "calendar", + "title", + "weekdaysTemplate", + "selectedDateTemplate", + "todayDateTemplate", + "currentMonthDateTemplate", + "otherMonthDateTemplate", + ]; static values = { selectedDate: { type: String, - default: null + default: null, }, viewDate: { type: String, - default: new Date().toISOString().slice(0, 10) + default: new Date().toISOString().slice(0, 10), }, format: { type: String, - default: "yyyy-MM-dd" // Default format - } + default: "yyyy-MM-dd", // Default format + }, }; - static outlets = ["rbui--calendar-input"] + static outlets = ["ruby_ui--calendar-input"]; initialize() { this.updateCalendar(); // Initial calendar render @@ -49,7 +57,7 @@ export default class extends Controller { this.updateCalendar(); // update the input value - this.rbuiCalendarInputOutlets.forEach(outlet => { + this.ruby_uiCalendarInputOutlets.forEach((outlet) => { const formattedDate = this.formatDate(this.selectedDate()); outlet.setValue(formattedDate); }); @@ -77,34 +85,47 @@ export default class extends Controller { } calendarDays() { - return this.getFullWeeksStartAndEndInMonth().map(week => this.renderWeek(week)).join(''); + return this.getFullWeeksStartAndEndInMonth() + .map((week) => this.renderWeek(week)) + .join(""); } renderWeek(week) { - const days = week.map(day => { - return this.renderDay(day); - }).join(''); + const days = week + .map((day) => { + return this.renderDay(day); + }) + .join(""); return `${days}`; } renderDay(day) { const today = new Date(); - let dateHTML = ''; + let dateHTML = ""; const data = { day: day, dayDate: day.getDate() }; if (day.toDateString() === this.selectedDate().toDateString()) { // selectedDate // Render the selected date template target innerHTML with Mustache - dateHTML = Mustache.render(this.selectedDateTemplateTarget.innerHTML, data); + dateHTML = Mustache.render( + this.selectedDateTemplateTarget.innerHTML, + data, + ); } else if (day.toDateString() === today.toDateString()) { // todayDate dateHTML = Mustache.render(this.todayDateTemplateTarget.innerHTML, data); } else if (day.getMonth() === this.viewDate().getMonth()) { // currentMonthDate - dateHTML = Mustache.render(this.currentMonthDateTemplateTarget.innerHTML, data); + dateHTML = Mustache.render( + this.currentMonthDateTemplateTarget.innerHTML, + data, + ); } else { // otherMonthDate - dateHTML = Mustache.render(this.otherMonthDateTemplateTarget.innerHTML, data); + dateHTML = Mustache.render( + this.otherMonthDateTemplateTarget.innerHTML, + data, + ); } return dateHTML; } @@ -120,7 +141,9 @@ export default class extends Controller { } viewDate() { - return this.viewDateValue ? new Date(this.viewDateValue) : this.selectedDate(); + return this.viewDateValue + ? new Date(this.viewDateValue) + : this.selectedDate(); } getFullWeeksStartAndEndInMonth() { @@ -146,7 +169,7 @@ export default class extends Controller { end = 7 - firstDate.getDay() + 1; weeks.push({ start: start, - end: end + end: end, }); start = end + 1; end = end + 7; @@ -154,7 +177,7 @@ export default class extends Controller { while (start <= numDays) { weeks.push({ start: start, - end: end + end: end, }); start = end + 1; end = end + 7; @@ -163,7 +186,7 @@ export default class extends Controller { end = end - numDays; weeks.push({ start: start, - end: end + end: end, }); break; } @@ -190,31 +213,38 @@ export default class extends Controller { const monthName = date.toLocaleString("en-US", { month: "long" }); const daySuffix = this.getDaySuffix(day); - const map = { - 'yyyy': year, - 'MM': ('0' + month).slice(-2), - 'dd': ('0' + day).slice(-2), - 'HH': ('0' + hours).slice(-2), - 'mm': ('0' + minutes).slice(-2), - 'ss': ('0' + seconds).slice(-2), - 'EEEE': dayOfWeek, - 'MMMM': monthName, - 'do': day + daySuffix, - 'PPPP': `${dayOfWeek}, ${monthName} ${day}${daySuffix}, ${year}` + yyyy: year, + MM: ("0" + month).slice(-2), + dd: ("0" + day).slice(-2), + HH: ("0" + hours).slice(-2), + mm: ("0" + minutes).slice(-2), + ss: ("0" + seconds).slice(-2), + EEEE: dayOfWeek, + MMMM: monthName, + do: day + daySuffix, + PPPP: `${dayOfWeek}, ${monthName} ${day}${daySuffix}, ${year}`, }; - const formattedDate = format.replace(/yyyy|MM|dd|HH|mm|ss|EEEE|MMMM|do|PPPP/g, matched => map[matched]); + const formattedDate = format.replace( + /yyyy|MM|dd|HH|mm|ss|EEEE|MMMM|do|PPPP/g, + (matched) => map[matched], + ); return formattedDate; } getDaySuffix(day) { - if (day > 3 && day < 21) return 'th'; + if (day > 3 && day < 21) return "th"; switch (day % 10) { - case 1: return "st"; - case 2: return "nd"; - case 3: return "rd"; - default: return "th"; + case 1: + return "st"; + case 2: + return "nd"; + case 3: + return "rd"; + default: + return "th"; } } -} \ No newline at end of file +} + diff --git a/lib/rbui/calendar/calendar_days.rb b/lib/ruby_ui/calendar/calendar_days.rb similarity index 90% rename from lib/rbui/calendar/calendar_days.rb rename to lib/ruby_ui/calendar/calendar_days.rb index 38177f8d..ceb6e9a2 100644 --- a/lib/rbui/calendar/calendar_days.rb +++ b/lib/ruby_ui/calendar/calendar_days.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class CalendarDays < Base BASE_CLASS = "inline-flex items-center justify-center rounded-md text-sm ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 h-8 w-8 p-0 font-normal aria-selected:opacity-100" @@ -17,7 +17,7 @@ def render_selected_date_template date_template("selectedDateTemplate") do button( data_day: "{{day}}", - data_action: "click->rbui--calendar#selectDay", + data_action: "click->ruby_ui--calendar#selectDay", name: "day", class: [ @@ -36,7 +36,7 @@ def render_today_date_template date_template("todayDateTemplate") do button( data_day: "{{day}}", - data_action: "click->rbui--calendar#selectDay", + data_action: "click->ruby_ui--calendar#selectDay", name: "day", class: [ @@ -54,7 +54,7 @@ def render_current_month_date_template date_template("currentMonthDateTemplate") do button( data_day: "{{day}}", - data_action: "click->rbui--calendar#selectDay", + data_action: "click->ruby_ui--calendar#selectDay", name: "day", class: [ @@ -72,7 +72,7 @@ def render_other_month_date_template date_template("otherMonthDateTemplate") do button( data_day: "{{day}}", - data_action: " click->rbui--calendar#selectDay", + data_action: " click->ruby_ui--calendar#selectDay", name: "day", class: [ @@ -87,7 +87,7 @@ def render_other_month_date_template end def date_template(target, &block) - all_template_tag(data: {rbui__calendar_target: target}) do + all_template_tag(data: {ruby_ui__calendar_target: target}) do td( class: "relative p-0 text-center text-sm focus-within:relative focus-within:z-20 [&:has([aria-selected])]:bg-accent [&:has([aria-selected])]:rounded-md", diff --git a/lib/rbui/calendar/calendar_header.rb b/lib/ruby_ui/calendar/calendar_header.rb similarity index 94% rename from lib/rbui/calendar/calendar_header.rb rename to lib/ruby_ui/calendar/calendar_header.rb index 324cef7c..72a560b6 100644 --- a/lib/rbui/calendar/calendar_header.rb +++ b/lib/ruby_ui/calendar/calendar_header.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class CalendarHeader < Base def view_template(&) div(**attrs, &) diff --git a/lib/rbui/calendar/calendar_input_controller.js b/lib/ruby_ui/calendar/calendar_input_controller.js similarity index 100% rename from lib/rbui/calendar/calendar_input_controller.js rename to lib/ruby_ui/calendar/calendar_input_controller.js diff --git a/lib/rbui/calendar/calendar_next.rb b/lib/ruby_ui/calendar/calendar_next.rb similarity index 95% rename from lib/rbui/calendar/calendar_next.rb rename to lib/ruby_ui/calendar/calendar_next.rb index 7203ca56..5b0c72a7 100644 --- a/lib/rbui/calendar/calendar_next.rb +++ b/lib/ruby_ui/calendar/calendar_next.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class CalendarNext < Base def view_template(&block) button(**attrs) do @@ -36,7 +36,7 @@ def default_attrs class: "inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border border-input hover:bg-accent hover:text-accent-foreground h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100 absolute right-1", type: "button", - data_action: "click->rbui--calendar#nextMonth" + data_action: "click->ruby_ui--calendar#nextMonth" } end end diff --git a/lib/rbui/calendar/calendar_prev.rb b/lib/ruby_ui/calendar/calendar_prev.rb similarity index 95% rename from lib/rbui/calendar/calendar_prev.rb rename to lib/ruby_ui/calendar/calendar_prev.rb index 750d0879..31ebd33c 100644 --- a/lib/rbui/calendar/calendar_prev.rb +++ b/lib/ruby_ui/calendar/calendar_prev.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class CalendarPrev < Base def view_template(&block) button(**attrs) do @@ -36,7 +36,7 @@ def default_attrs class: "rdp-button_reset rdp-button inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border border-input hover:bg-accent hover:text-accent-foreground h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100 absolute left-1", type: "button", - data_action: "click->rbui--calendar#prevMonth" + data_action: "click->ruby_ui--calendar#prevMonth" } end end diff --git a/lib/rbui/calendar/calendar_title.rb b/lib/ruby_ui/calendar/calendar_title.rb similarity index 87% rename from lib/rbui/calendar/calendar_title.rb rename to lib/ruby_ui/calendar/calendar_title.rb index da308203..3c844c6d 100644 --- a/lib/rbui/calendar/calendar_title.rb +++ b/lib/ruby_ui/calendar/calendar_title.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class CalendarTitle < Base def initialize(default: "Month Year", **attrs) @default = default @@ -19,7 +19,7 @@ def default_attrs aria_live: "polite", role: "presentation", data: { - rbui__calendar_target: "title" + ruby_ui__calendar_target: "title" } } end diff --git a/lib/rbui/calendar/calendar_weekdays.rb b/lib/ruby_ui/calendar/calendar_weekdays.rb similarity index 86% rename from lib/rbui/calendar/calendar_weekdays.rb rename to lib/ruby_ui/calendar/calendar_weekdays.rb index 45b9c376..9aa4c64a 100644 --- a/lib/rbui/calendar/calendar_weekdays.rb +++ b/lib/ruby_ui/calendar/calendar_weekdays.rb @@ -1,11 +1,11 @@ # frozen_string_literal: true -module RBUI +module RubyUI class CalendarWeekdays < Base DAYS = %w[Monday Tuesday Wednesday Thursday Friday Saturday Sunday].freeze def view_template - all_template_tag(data: {rbui__calendar_target: "weekdaysTemplate"}) do + all_template_tag(data: {ruby_ui__calendar_target: "weekdaysTemplate"}) do thead(**attrs) do tr(class: "flex") do DAYS.each do |day| diff --git a/lib/rbui/card/card.rb b/lib/ruby_ui/card/card.rb similarity index 94% rename from lib/rbui/card/card.rb rename to lib/ruby_ui/card/card.rb index 7250f49c..520c04bc 100644 --- a/lib/rbui/card/card.rb +++ b/lib/ruby_ui/card/card.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class Card < Base def view_template(&) div(**attrs, &) diff --git a/lib/rbui/card/card_content.rb b/lib/ruby_ui/card/card_content.rb similarity index 93% rename from lib/rbui/card/card_content.rb rename to lib/ruby_ui/card/card_content.rb index 511d53f6..675780c9 100644 --- a/lib/rbui/card/card_content.rb +++ b/lib/ruby_ui/card/card_content.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class CardContent < Base def view_template(&) div(**attrs, &) diff --git a/lib/rbui/card/card_description.rb b/lib/ruby_ui/card/card_description.rb similarity index 94% rename from lib/rbui/card/card_description.rb rename to lib/ruby_ui/card/card_description.rb index 5ad4db77..c00e7439 100644 --- a/lib/rbui/card/card_description.rb +++ b/lib/ruby_ui/card/card_description.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class CardDescription < Base def view_template(&) p(**attrs, &) diff --git a/lib/rbui/card/card_footer.rb b/lib/ruby_ui/card/card_footer.rb similarity index 94% rename from lib/rbui/card/card_footer.rb rename to lib/ruby_ui/card/card_footer.rb index 11d0478f..63e59cc3 100644 --- a/lib/rbui/card/card_footer.rb +++ b/lib/ruby_ui/card/card_footer.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class CardFooter < Base def view_template(&) div(**attrs, &) diff --git a/lib/rbui/card/card_header.rb b/lib/ruby_ui/card/card_header.rb similarity index 94% rename from lib/rbui/card/card_header.rb rename to lib/ruby_ui/card/card_header.rb index f185a911..302da732 100644 --- a/lib/rbui/card/card_header.rb +++ b/lib/ruby_ui/card/card_header.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class CardHeader < Base def view_template(&) div(**attrs, &) diff --git a/lib/rbui/card/card_title.rb b/lib/ruby_ui/card/card_title.rb similarity index 94% rename from lib/rbui/card/card_title.rb rename to lib/ruby_ui/card/card_title.rb index c96898b7..87dd16a9 100644 --- a/lib/rbui/card/card_title.rb +++ b/lib/ruby_ui/card/card_title.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class CardTitle < Base def view_template(&) h3(**attrs, &) diff --git a/lib/rbui/chart/chart.rb b/lib/ruby_ui/chart/chart.rb similarity index 72% rename from lib/rbui/chart/chart.rb rename to lib/ruby_ui/chart/chart.rb index f9ef7f33..bc47d6f0 100644 --- a/lib/rbui/chart/chart.rb +++ b/lib/ruby_ui/chart/chart.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class Chart < Base def initialize(options: {}, **attrs) @options = options.to_json @@ -15,8 +15,8 @@ def view_template(&) def default_attrs { - data_controller: "rbui--chart", - data_rbui__chart_options_value: @options + data_controller: "ruby_ui--chart", + data_ruby_ui__chart_options_value: @options } end end diff --git a/lib/rbui/chart/chart_controller.js b/lib/ruby_ui/chart/chart_controller.js similarity index 100% rename from lib/rbui/chart/chart_controller.js rename to lib/ruby_ui/chart/chart_controller.js diff --git a/lib/rbui/checkbox/checkbox.rb b/lib/ruby_ui/checkbox/checkbox.rb similarity index 65% rename from lib/rbui/checkbox/checkbox.rb rename to lib/ruby_ui/checkbox/checkbox.rb index 9ea4c2fc..1f464755 100644 --- a/lib/rbui/checkbox/checkbox.rb +++ b/lib/ruby_ui/checkbox/checkbox.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class Checkbox < Base def view_template input(**attrs) @@ -12,9 +12,9 @@ def default_attrs { type: "checkbox", data: { - rbui__form_field_target: "input", - rbui__checkbox_group_target: "checkbox", - action: "change->rbui--checkbox-group#onChange change->rbui--form-field#onInput invalid->rbui--form-field#onInvalid" + ruby_ui__form_field_target: "input", + ruby_ui__checkbox_group_target: "checkbox", + action: "change->ruby_ui--checkbox-group#onChange change->ruby_ui--form-field#onInput invalid->ruby_ui--form-field#onInvalid" }, class: "peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 accent-primary" } diff --git a/lib/rbui/checkbox/checkbox_group.rb b/lib/ruby_ui/checkbox/checkbox_group.rb similarity index 79% rename from lib/rbui/checkbox/checkbox_group.rb rename to lib/ruby_ui/checkbox/checkbox_group.rb index 4cb13504..cc14bf53 100644 --- a/lib/rbui/checkbox/checkbox_group.rb +++ b/lib/ruby_ui/checkbox/checkbox_group.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class CheckboxGroup < Base def view_template(&) div(**attrs, &) @@ -12,7 +12,7 @@ def default_attrs { role: "group", data: { - controller: "rbui--checkbox-group" + controller: "ruby_ui--checkbox-group" } } end diff --git a/lib/rbui/checkbox/checkbox_group_controller.js b/lib/ruby_ui/checkbox/checkbox_group_controller.js similarity index 100% rename from lib/rbui/checkbox/checkbox_group_controller.js rename to lib/ruby_ui/checkbox/checkbox_group_controller.js diff --git a/lib/rbui/clipboard/clipboard.rb b/lib/ruby_ui/clipboard/clipboard.rb similarity index 68% rename from lib/rbui/clipboard/clipboard.rb rename to lib/ruby_ui/clipboard/clipboard.rb index e3b36ebb..4253459e 100644 --- a/lib/rbui/clipboard/clipboard.rb +++ b/lib/ruby_ui/clipboard/clipboard.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class Clipboard < Base def initialize(options: {}, success: "Copied!", error: "Copy Failed!", **attrs) @options = options @@ -30,11 +30,11 @@ def error_popover def default_attrs { data: { - controller: "rbui--clipboard", - action: "click@window->rbui--clipboard#onClickOutside", - rbui__clipboard_success_value: @success, - rbui__clipboard_error_value: @error, - rbui__clipboard_options_value: @options.to_json + controller: "ruby_ui--clipboard", + action: "click@window->ruby_ui--clipboard#onClickOutside", + ruby_ui__clipboard_success_value: @success, + ruby_ui__clipboard_error_value: @error, + ruby_ui__clipboard_options_value: @options.to_json } } end diff --git a/lib/rbui/clipboard/clipboard_controller.js b/lib/ruby_ui/clipboard/clipboard_controller.js similarity index 100% rename from lib/rbui/clipboard/clipboard_controller.js rename to lib/ruby_ui/clipboard/clipboard_controller.js diff --git a/lib/rbui/clipboard/clipboard_popover.rb b/lib/ruby_ui/clipboard/clipboard_popover.rb similarity index 93% rename from lib/rbui/clipboard/clipboard_popover.rb rename to lib/ruby_ui/clipboard/clipboard_popover.rb index b13c7278..f1ae18f0 100644 --- a/lib/rbui/clipboard/clipboard_popover.rb +++ b/lib/ruby_ui/clipboard/clipboard_popover.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class ClipboardPopover < Base def initialize(type:, **attrs) @type = type @@ -11,7 +11,7 @@ def view_template(&block) div( class: "hidden", style: "width: max-content; position: absolute; top: 0; left: 0;", - data: {rbui__clipboard_target: clipboard_target} + data: {ruby_ui__clipboard_target: clipboard_target} ) do div(**attrs, &block) end diff --git a/lib/rbui/clipboard/clipboard_source.rb b/lib/ruby_ui/clipboard/clipboard_source.rb similarity index 78% rename from lib/rbui/clipboard/clipboard_source.rb rename to lib/ruby_ui/clipboard/clipboard_source.rb index 56769c2a..ef2771f1 100644 --- a/lib/rbui/clipboard/clipboard_source.rb +++ b/lib/ruby_ui/clipboard/clipboard_source.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class ClipboardSource < Base def view_template(&) div(**attrs, &) @@ -11,7 +11,7 @@ def view_template(&) def default_attrs { data: { - rbui__clipboard_target: "source" + ruby_ui__clipboard_target: "source" } } end diff --git a/lib/rbui/clipboard/clipboard_trigger.rb b/lib/ruby_ui/clipboard/clipboard_trigger.rb similarity index 65% rename from lib/rbui/clipboard/clipboard_trigger.rb rename to lib/ruby_ui/clipboard/clipboard_trigger.rb index 22b76df3..b7da6767 100644 --- a/lib/rbui/clipboard/clipboard_trigger.rb +++ b/lib/ruby_ui/clipboard/clipboard_trigger.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class ClipboardTrigger < Base def view_template(&) div(**attrs, &) @@ -11,8 +11,8 @@ def view_template(&) def default_attrs { data: { - rbui__clipboard_target: "trigger", - action: "click->rbui--clipboard#copy" + ruby_ui__clipboard_target: "trigger", + action: "click->ruby_ui--clipboard#copy" } } end diff --git a/lib/rbui/codeblock/codeblock.rb b/lib/ruby_ui/codeblock/codeblock.rb similarity index 89% rename from lib/rbui/codeblock/codeblock.rb rename to lib/ruby_ui/codeblock/codeblock.rb index 2a360c88..e214d4ef 100644 --- a/lib/rbui/codeblock/codeblock.rb +++ b/lib/ruby_ui/codeblock/codeblock.rb @@ -2,7 +2,7 @@ require "rouge" -module RBUI +module RubyUI class Codeblock < Base FORMATTER = ::Rouge::Formatters::HTML.new ROUGE_CSS = Rouge::Themes::Github.mode(:dark).render(scope: ".highlight") # See themes here: https://rouge-ruby.github.io/docs/Rouge/CSSTheme.html @@ -39,13 +39,13 @@ def default_attrs end def with_clipboard - RBUI.Clipboard(success: @clipboard_success, error: @clipboard_error, class: "relative") do - RBUI.ClipboardSource do + RubyUI.Clipboard(success: @clipboard_success, error: @clipboard_error, class: "relative") do + RubyUI.ClipboardSource do codeblock end div(class: "absolute top-2 right-2") do - RBUI.ClipboardTrigger do - RBUI.Button(variant: :ghost, size: :sm, icon: true, class: "text-white hover:text-white hover:bg-white/20") { clipboard_icon } + RubyUI.ClipboardTrigger do + RubyUI.Button(variant: :ghost, size: :sm, icon: true, class: "text-white hover:text-white hover:bg-white/20") { clipboard_icon } end end end diff --git a/lib/rbui/collapsible/collapsible.rb b/lib/ruby_ui/collapsible/collapsible.rb similarity index 73% rename from lib/rbui/collapsible/collapsible.rb rename to lib/ruby_ui/collapsible/collapsible.rb index adbfcfc7..1f094012 100644 --- a/lib/rbui/collapsible/collapsible.rb +++ b/lib/ruby_ui/collapsible/collapsible.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class Collapsible < Base def initialize(open: false, **attrs) @open = open @@ -16,8 +16,8 @@ def view_template(&) def default_attrs { data: { - controller: "rbui--collapsible", - rbui__collapsible_open_value: @open + controller: "ruby_ui--collapsible", + ruby_ui__collapsible_open_value: @open } } end diff --git a/lib/rbui/collapsible/collapsible_content.rb b/lib/ruby_ui/collapsible/collapsible_content.rb similarity index 76% rename from lib/rbui/collapsible/collapsible_content.rb rename to lib/ruby_ui/collapsible/collapsible_content.rb index e6259b15..8af7379f 100644 --- a/lib/rbui/collapsible/collapsible_content.rb +++ b/lib/ruby_ui/collapsible/collapsible_content.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class CollapsibleContent < Base def view_template(&) div(**attrs, &) @@ -10,7 +10,7 @@ def view_template(&) def default_attrs { - data: {rbui__collapsible_target: "content"}, + data: {ruby_ui__collapsible_target: "content"}, class: "overflow-y-hidden" } end diff --git a/lib/rbui/collapsible/collapsible_controller.js b/lib/ruby_ui/collapsible/collapsible_controller.js similarity index 100% rename from lib/rbui/collapsible/collapsible_controller.js rename to lib/ruby_ui/collapsible/collapsible_controller.js diff --git a/lib/rbui/collapsible/collapsible_trigger.rb b/lib/ruby_ui/collapsible/collapsible_trigger.rb similarity index 75% rename from lib/rbui/collapsible/collapsible_trigger.rb rename to lib/ruby_ui/collapsible/collapsible_trigger.rb index 4273cab4..b0d76fdb 100644 --- a/lib/rbui/collapsible/collapsible_trigger.rb +++ b/lib/ruby_ui/collapsible/collapsible_trigger.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class CollapsibleTrigger < Base def view_template(&) div(**attrs, &) @@ -11,7 +11,7 @@ def view_template(&) def default_attrs { data: { - action: "click->rbui--collapsible#toggle" + action: "click->ruby_ui--collapsible#toggle" } } end diff --git a/lib/ruby_ui/combobox/combobox.rb b/lib/ruby_ui/combobox/combobox.rb new file mode 100644 index 00000000..81641d1c --- /dev/null +++ b/lib/ruby_ui/combobox/combobox.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +module RubyUI + class Combobox < Base + def view_template(&) + div(**attrs, &) + end + + private + + def default_attrs + { + data: { + controller: "ruby_ui--combobox", + ruby_ui__combobox_open_value: "false", + action: "click@window->ruby_ui--combobox#onClickOutside", + ruby_ui__combobox_ruby_ui__combobox_content_outlet: ".combobox-content", + ruby_ui__combobox_ruby_ui__combobox_item_outlet: ".combobox-item" + }, + class: "group/combobox w-full relative" + } + end + end +end diff --git a/lib/ruby_ui/combobox/combobox_content.rb b/lib/ruby_ui/combobox/combobox_content.rb new file mode 100644 index 00000000..e0bead32 --- /dev/null +++ b/lib/ruby_ui/combobox/combobox_content.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +module RubyUI + class ComboboxContent < Base + def initialize(**attrs) + @id = "content#{SecureRandom.hex(4)}" + super + end + + def view_template(&) + div(**attrs) do + div(class: "min-w-max max-h-[300px] overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md outline-none animate-out group-data-[ruby_ui--combobox-open-value=true]/combobox:animate-in fade-out-0 group-data-[ruby_ui--combobox-open-value=true]/combobox:fade-in-0 zoom-out-95 group-data-[ruby_ui--combobox-open-value=true]/combobox:zoom-in-95 slide-in-from-top-2", &) + end + end + + private + + def default_attrs + { + id: @id, + role: "listbox", + data: { + controller: "ruby_ui--combobox-content", + ruby_ui__combobox_target: "content", + action: "keydown.enter->ruby_ui--combobox#onKeyEnter keydown.esc->ruby_ui--combobox#onEscKey keydown.down->ruby_ui--combobox#onKeyDown keydown.up->ruby_ui--combobox#onKeyUp" + }, + class: "combobox-content hidden w-full absolute top-0 left-0 z-50" + } + end + end +end diff --git a/lib/rbui/combobox/combobox_content_controller.js b/lib/ruby_ui/combobox/combobox_content_controller.js similarity index 75% rename from lib/rbui/combobox/combobox_content_controller.js rename to lib/ruby_ui/combobox/combobox_content_controller.js index 8c04529a..2c825cbf 100644 --- a/lib/rbui/combobox/combobox_content_controller.js +++ b/lib/ruby_ui/combobox/combobox_content_controller.js @@ -18,13 +18,18 @@ export default class extends Controller { #updateGroupVisibility() { this.groupTargets.forEach((group) => { - const hasVisibleItems = group.querySelectorAll("[data-rbui--combobox-content-target='item']:not(.hidden)").length > 0; + const hasVisibleItems = + group.querySelectorAll( + "[data-ruby_ui--combobox-content-target='item']:not(.hidden)", + ).length > 0; this.#toggleVisibility([group], hasVisibleItems); }); } #filterItems(query) { - return this.itemTargets.filter((item) => this.#sanitizeStr(item.innerText).includes(query)); + return this.itemTargets.filter((item) => + this.#sanitizeStr(item.innerText).includes(query), + ); } #toggleVisibility(elements, isVisible) { diff --git a/lib/rbui/combobox/combobox_controller.js b/lib/ruby_ui/combobox/combobox_controller.js similarity index 73% rename from lib/rbui/combobox/combobox_controller.js rename to lib/ruby_ui/combobox/combobox_controller.js index 89c4caf8..8caeac86 100644 --- a/lib/rbui/combobox/combobox_controller.js +++ b/lib/ruby_ui/combobox/combobox_controller.js @@ -1,12 +1,20 @@ import { Controller } from "@hotwired/stimulus"; import { computePosition, autoUpdate, offset } from "@floating-ui/dom"; -export const POPOVER_OPENED = "rbui--combobox#popoverOpened"; +export const POPOVER_OPENED = "ruby_ui--combobox#popoverOpened"; export default class extends Controller { - static targets = ["input", "trigger", "value", "content", "search", "list", "item"]; + static targets = [ + "input", + "trigger", + "value", + "content", + "search", + "list", + "item", + ]; static values = { open: Boolean }; - static outlets = ["rbui--combobox-item", "rbui--combobox-content"]; + static outlets = ["ruby_ui--combobox-item", "ruby_ui--combobox-content"]; constructor(...args) { super(...args); @@ -41,15 +49,17 @@ export default class extends Controller { onKeyEnter(event) { event.preventDefault(); - const currentItem = this.itemTargets.find((item) => item.getAttribute("aria-current") === "true"); + const currentItem = this.itemTargets.find( + (item) => item.getAttribute("aria-current") === "true", + ); if (!currentItem) this.#closeContent(); - this.#setValueDispatchEventAndCloseContent(currentItem) + this.#setValueDispatchEventAndCloseContent(currentItem); } onSearchInput(event) { - this.rbuiComboboxContentOutlet.handleSearchInput(event.target.value); + this.ruby_uiComboboxContentOutlet.handleSearchInput(event.target.value); this.#findAndSetCurrentAndActiveDescendant(); } @@ -70,7 +80,9 @@ export default class extends Controller { onKeyDown(event) { event.preventDefault(); - const currentIndex = this.itemTargets.findIndex((item) => item.getAttribute("aria-current") === "true"); + const currentIndex = this.itemTargets.findIndex( + (item) => item.getAttribute("aria-current") === "true", + ); if (currentIndex + 1 < this.itemTargets.length) { this.itemTargets[currentIndex].removeAttribute("aria-current"); @@ -82,7 +94,9 @@ export default class extends Controller { onKeyUp(event) { event.preventDefault(); - const currentIndex = this.itemTargets.findIndex((item) => item.getAttribute("aria-current") === "true"); + const currentIndex = this.itemTargets.findIndex( + (item) => item.getAttribute("aria-current") === "true", + ); if (currentIndex > 0) { this.itemTargets[currentIndex].removeAttribute("aria-current"); @@ -112,14 +126,18 @@ export default class extends Controller { } #findAndSetCurrentAndActiveDescendant() { - const selectedItem = this.itemTargets.find((item) => item.getAttribute("aria-selected") === "true"); + const selectedItem = this.itemTargets.find( + (item) => item.getAttribute("aria-selected") === "true", + ); if (selectedItem) { this.#setCurrentAndActiveDescendant(selectedItem); return; } - const selectedVisible = this.itemTargets.find((item) => !item.classList.contains("hidden")); + const selectedVisible = this.itemTargets.find( + (item) => !item.classList.contains("hidden"), + ); this.#setCurrentAndActiveDescendant(selectedVisible); } @@ -127,14 +145,19 @@ export default class extends Controller { if (!item) return; item.setAttribute("aria-current", "true"); - this.triggerTarget.setAttribute("aria-activedescendant", item.getAttribute("id")); + this.triggerTarget.setAttribute( + "aria-activedescendant", + item.getAttribute("id"), + ); } #setValueDispatchEventAndCloseContent(item) { const oldValue = this.inputTarget.value; const newValue = item.dataset.value; - this.rbuiComboboxItemOutlets.forEach(item => item.handleItemSelected(newValue)); + this.ruby_uiComboboxItemOutlets.forEach((item) => + item.handleItemSelected(newValue), + ); this.inputTarget.value = item.dataset.value; this.valueTarget.innerText = item.innerText; @@ -143,7 +166,6 @@ export default class extends Controller { this.#closeContent(); } - #dispatchOnChange(oldValue, newValue) { if (oldValue === newValue) return; @@ -166,7 +188,9 @@ export default class extends Controller { #setFloatingElement() { this.cleanup = autoUpdate(this.triggerTarget, this.contentTarget, () => { - computePosition(this.triggerTarget, this.contentTarget, { middleware: [offset(4)] }).then(({ x, y }) => { + computePosition(this.triggerTarget, this.contentTarget, { + middleware: [offset(4)], + }).then(({ x, y }) => { Object.assign(this.contentTarget.style, { left: `${x}px`, top: `${y}px`, diff --git a/lib/rbui/combobox/combobox_empty.rb b/lib/ruby_ui/combobox/combobox_empty.rb similarity index 81% rename from lib/rbui/combobox/combobox_empty.rb rename to lib/ruby_ui/combobox/combobox_empty.rb index e487a473..552c5a3c 100644 --- a/lib/rbui/combobox/combobox_empty.rb +++ b/lib/ruby_ui/combobox/combobox_empty.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class ComboboxEmpty < Base def view_template(&) div(**attrs, &) @@ -13,7 +13,7 @@ def default_attrs role: "presentation", class: "hidden py-6 text-center text-sm", data: { - rbui__combobox_content_target: "empty" + ruby_ui__combobox_content_target: "empty" } } end diff --git a/lib/rbui/combobox/combobox_group.rb b/lib/ruby_ui/combobox/combobox_group.rb similarity index 91% rename from lib/rbui/combobox/combobox_group.rb rename to lib/ruby_ui/combobox/combobox_group.rb index 4b53824f..1620d032 100644 --- a/lib/rbui/combobox/combobox_group.rb +++ b/lib/ruby_ui/combobox/combobox_group.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class ComboboxGroup < Base def initialize(heading: nil, **attrs) @heading = heading @@ -30,7 +30,7 @@ def default_attrs role: "presentation", data: { value: @heading, - rbui__combobox_content_target: "group" + ruby_ui__combobox_content_target: "group" } } end diff --git a/lib/rbui/combobox/combobox_input.rb b/lib/ruby_ui/combobox/combobox_input.rb similarity index 53% rename from lib/rbui/combobox/combobox_input.rb rename to lib/ruby_ui/combobox/combobox_input.rb index 01a55cf1..bab4122c 100644 --- a/lib/rbui/combobox/combobox_input.rb +++ b/lib/ruby_ui/combobox/combobox_input.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class ComboboxInput < Base def view_template input(**attrs) @@ -12,9 +12,9 @@ def default_attrs { class: "hidden", data: { - rbui__combobox_target: "input", - rbui__form_field_target: "input", - action: "change->rbui--form-field#onChange invalid->rbui--form-field#onInvalid" + ruby_ui__combobox_target: "input", + ruby_ui__form_field_target: "input", + action: "change->ruby_ui--form-field#onChange invalid->ruby_ui--form-field#onInvalid" } } end diff --git a/lib/rbui/combobox/combobox_item.rb b/lib/ruby_ui/combobox/combobox_item.rb similarity index 84% rename from lib/rbui/combobox/combobox_item.rb rename to lib/ruby_ui/combobox/combobox_item.rb index d7bd455a..319b9afb 100644 --- a/lib/rbui/combobox/combobox_item.rb +++ b/lib/ruby_ui/combobox/combobox_item.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class ComboboxItem < Base def initialize(value: nil, **attrs) @value = value @@ -41,10 +41,10 @@ def default_attrs "combobox-item group relative flex cursor-pointer select-none items-center gap-x-2 rounded-sm px-2 py-1.5 text-sm outline-none hover:bg-accent hover:text-accent-foreground aria-[current]:bg-accent aria-[current]:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50", data: { value: @value, - rbui__combobox_target: "item", - rbui__combobox_content_target: "item", - controller: "rbui--combobox-item", - action: "click->rbui--combobox#onItemSelected" + ruby_ui__combobox_target: "item", + ruby_ui__combobox_content_target: "item", + controller: "ruby_ui--combobox-item", + action: "click->ruby_ui--combobox#onItemSelected" }, aria_selected: "false" } diff --git a/lib/rbui/combobox/combobox_item_controller.js b/lib/ruby_ui/combobox/combobox_item_controller.js similarity index 100% rename from lib/rbui/combobox/combobox_item_controller.js rename to lib/ruby_ui/combobox/combobox_item_controller.js diff --git a/lib/rbui/combobox/combobox_list.rb b/lib/ruby_ui/combobox/combobox_list.rb similarity index 87% rename from lib/rbui/combobox/combobox_list.rb rename to lib/ruby_ui/combobox/combobox_list.rb index da9a64af..278111f4 100644 --- a/lib/rbui/combobox/combobox_list.rb +++ b/lib/ruby_ui/combobox/combobox_list.rb @@ -2,7 +2,7 @@ require "securerandom" -module RBUI +module RubyUI class ComboboxList < Base def initialize(**attrs) @id = "list#{SecureRandom.hex(4)}" @@ -19,7 +19,7 @@ def default_attrs { id: @id, data: { - rbui__combobox_target: "list" + ruby_ui__combobox_target: "list" }, role: "listbox", tabindex: "-1" diff --git a/lib/rbui/combobox/combobox_search_input.rb b/lib/ruby_ui/combobox/combobox_search_input.rb similarity index 90% rename from lib/rbui/combobox/combobox_search_input.rb rename to lib/ruby_ui/combobox/combobox_search_input.rb index f42ba5d4..0d1ec828 100644 --- a/lib/rbui/combobox/combobox_search_input.rb +++ b/lib/ruby_ui/combobox/combobox_search_input.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class ComboboxSearchInput < Base def initialize(placeholder:, **attrs) @placeholder = placeholder @@ -44,8 +44,8 @@ def default_attrs "flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50", placeholder: @placeholder, data: { - action: "input->rbui--combobox#onSearchInput", - rbui__combobox_target: "search" + action: "input->ruby_ui--combobox#onSearchInput", + ruby_ui__combobox_target: "search" }, autocomplete: "off", autocorrect: "off", diff --git a/lib/rbui/combobox/combobox_separator.rb b/lib/ruby_ui/combobox/combobox_separator.rb similarity index 93% rename from lib/rbui/combobox/combobox_separator.rb rename to lib/ruby_ui/combobox/combobox_separator.rb index 3f14366e..a2a18732 100644 --- a/lib/rbui/combobox/combobox_separator.rb +++ b/lib/ruby_ui/combobox/combobox_separator.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class ComboboxSeparator < Base def view_template(&) div(**attrs, &) diff --git a/lib/rbui/combobox/combobox_trigger.rb b/lib/ruby_ui/combobox/combobox_trigger.rb similarity index 91% rename from lib/rbui/combobox/combobox_trigger.rb rename to lib/ruby_ui/combobox/combobox_trigger.rb index 6d3a21e0..80f45470 100644 --- a/lib/rbui/combobox/combobox_trigger.rb +++ b/lib/ruby_ui/combobox/combobox_trigger.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class ComboboxTrigger < Base def view_template(&block) button(**attrs) do @@ -34,8 +34,8 @@ def icon def default_attrs { data: { - action: "rbui--combobox#onTriggerClick", - rbui__combobox_target: "trigger" + action: "ruby_ui--combobox#onTriggerClick", + ruby_ui__combobox_target: "trigger" }, type: "button", role: "combobox", diff --git a/lib/rbui/combobox/combobox_value.rb b/lib/ruby_ui/combobox/combobox_value.rb similarity index 87% rename from lib/rbui/combobox/combobox_value.rb rename to lib/ruby_ui/combobox/combobox_value.rb index 7ba6cb0f..f011a5b1 100644 --- a/lib/rbui/combobox/combobox_value.rb +++ b/lib/ruby_ui/combobox/combobox_value.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class ComboboxValue < Base def initialize(placeholder: nil, **attrs) @placeholder = placeholder @@ -18,7 +18,7 @@ def view_template(&block) def default_attrs { data: { - rbui__combobox_target: "value" + ruby_ui__combobox_target: "value" }, class: "pointer-events-none" } diff --git a/lib/rbui/command/command.rb b/lib/ruby_ui/command/command.rb similarity index 89% rename from lib/rbui/command/command.rb rename to lib/ruby_ui/command/command.rb index c4498430..de1d042c 100644 --- a/lib/rbui/command/command.rb +++ b/lib/ruby_ui/command/command.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class Command < Base def view_template(&) div(**attrs, &) diff --git a/lib/rbui/command/command_controller.js b/lib/ruby_ui/command/command_controller.js similarity index 65% rename from lib/rbui/command/command_controller.js rename to lib/ruby_ui/command/command_controller.js index a53a40eb..933e909a 100644 --- a/lib/rbui/command/command_controller.js +++ b/lib/ruby_ui/command/command_controller.js @@ -1,16 +1,16 @@ import { Controller } from "@hotwired/stimulus"; -import Fuse from 'fuse.js'; +import Fuse from "fuse.js"; -// Connects to data-controller="rbui--command" +// Connects to data-controller="ruby_ui--command" export default class extends Controller { - static targets = ["input", "group", "item", "empty", "content"] + static targets = ["input", "group", "item", "empty", "content"]; static values = { open: { type: Boolean, - default: false + default: false, }, - } + }; connect() { this.inputTarget.focus(); @@ -19,24 +19,23 @@ export default class extends Controller { this.selectedIndex = -1; if (this.openValue) { - this.open() + this.open(); } } open(e) { - e.preventDefault() - document.body.insertAdjacentHTML('beforeend', this.contentTarget.innerHTML) + e.preventDefault(); + document.body.insertAdjacentHTML("beforeend", this.contentTarget.innerHTML); // prevent scroll on body - document.body.classList.add('overflow-hidden') + document.body.classList.add("overflow-hidden"); } - dismiss() { // allow scroll on body - document.body.classList.remove('overflow-hidden') + document.body.classList.remove("overflow-hidden"); // remove the element - console.log("this.element", this.element) - this.element.remove() + console.log("this.element", this.element); + this.element.remove(); } filter(e) { @@ -52,19 +51,24 @@ export default class extends Controller { this.toggleVisibility(this.itemTargets, false); const results = this.searchIndex.search(query); - results.forEach(result => this.toggleVisibility([result.item.element], true)); + results.forEach((result) => + this.toggleVisibility([result.item.element], true), + ); this.toggleVisibility(this.emptyTargets, results.length === 0); this.updateGroupVisibility(); } toggleVisibility(elements, isVisible) { - elements.forEach(el => el.classList.toggle("hidden", !isVisible)); + elements.forEach((el) => el.classList.toggle("hidden", !isVisible)); } updateGroupVisibility() { - this.groupTargets.forEach(group => { - const hasVisibleItems = group.querySelectorAll("[data-rbui--command-target='item']:not(.hidden)").length > 0; + this.groupTargets.forEach((group) => { + const hasVisibleItems = + group.querySelectorAll( + "[data-ruby_ui--command-target='item']:not(.hidden)", + ).length > 0; this.toggleVisibility([group], hasVisibleItems); }); } @@ -81,19 +85,24 @@ export default class extends Controller { threshold: 0.2, includeMatches: true, }; - const items = this.itemTargets.map(el => ({ value: el.dataset.value, element: el })); + const items = this.itemTargets.map((el) => ({ + value: el.dataset.value, + element: el, + })); return new Fuse(items, options); } handleKeydown(e) { - const visibleItems = this.itemTargets.filter(item => !item.classList.contains('hidden')); - if (e.key === 'ArrowDown') { + const visibleItems = this.itemTargets.filter( + (item) => !item.classList.contains("hidden"), + ); + if (e.key === "ArrowDown") { e.preventDefault(); this.updateSelectedItem(visibleItems, 1); - } else if (e.key === 'ArrowUp') { + } else if (e.key === "ArrowUp") { e.preventDefault(); this.updateSelectedItem(visibleItems, -1); - } else if (e.key === 'Enter' && this.selectedIndex !== -1) { + } else if (e.key === "Enter" && this.selectedIndex !== -1) { e.preventDefault(); visibleItems[this.selectedIndex].click(); } @@ -117,11 +126,11 @@ export default class extends Controller { } toggleAriaSelected(element, isSelected) { - element.setAttribute('aria-selected', isSelected.toString()); + element.setAttribute("aria-selected", isSelected.toString()); } deselectAll() { - this.itemTargets.forEach(item => this.toggleAriaSelected(item, false)); + this.itemTargets.forEach((item) => this.toggleAriaSelected(item, false)); this.selectedIndex = -1; } } diff --git a/lib/rbui/command/command_dialog.rb b/lib/ruby_ui/command/command_dialog.rb similarity index 75% rename from lib/rbui/command/command_dialog.rb rename to lib/ruby_ui/command/command_dialog.rb index 167d7b99..7a179185 100644 --- a/lib/rbui/command/command_dialog.rb +++ b/lib/ruby_ui/command/command_dialog.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class CommandDialog < Base def view_template(&) div(**attrs, &) @@ -10,7 +10,7 @@ def view_template(&) def default_attrs { - data: {controller: "rbui--command"} + data: {controller: "ruby_ui--command"} } end end diff --git a/lib/rbui/command/command_dialog_content.rb b/lib/ruby_ui/command/command_dialog_content.rb similarity index 86% rename from lib/rbui/command/command_dialog_content.rb rename to lib/ruby_ui/command/command_dialog_content.rb index a387e6f0..893ad0b5 100644 --- a/lib/rbui/command/command_dialog_content.rb +++ b/lib/ruby_ui/command/command_dialog_content.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class CommandDialogContent < Base SIZES = { xs: "max-w-sm", @@ -17,8 +17,8 @@ def initialize(size: :md, **attrs) end def view_template(&block) - all_template_tag(data: {rbui__command_target: "content"}) do - div(data: {controller: "rbui--command"}) do + all_template_tag(data: {ruby_ui__command_target: "content"}) do + div(data: {controller: "ruby_ui--command"}) do backdrop div(**attrs, &block) end @@ -40,7 +40,7 @@ def default_attrs def backdrop div( data_state: "open", - data_action: "click->rbui--command#dismiss esc->rbui--command#dismiss", + data_action: "click->ruby_ui--command#dismiss esc->ruby_ui--command#dismiss", class: "fixed pointer-events-auto inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0" ) end diff --git a/lib/rbui/command/command_dialog_trigger.rb b/lib/ruby_ui/command/command_dialog_trigger.rb similarity index 71% rename from lib/rbui/command/command_dialog_trigger.rb rename to lib/ruby_ui/command/command_dialog_trigger.rb index 7d4d0f17..ec70d5d5 100644 --- a/lib/rbui/command/command_dialog_trigger.rb +++ b/lib/ruby_ui/command/command_dialog_trigger.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class CommandDialogTrigger < Base DEFAULT_KEYBINDINGS = [ "keydown.ctrl+k@window", @@ -8,7 +8,7 @@ class CommandDialogTrigger < Base ].freeze def initialize(keybindings: DEFAULT_KEYBINDINGS, **attrs) - @keybindings = keybindings.map { |kb| "#{kb}->rbui--command#open" } + @keybindings = keybindings.map { |kb| "#{kb}->ruby_ui--command#open" } super(**attrs) end @@ -21,7 +21,7 @@ def view_template(&) def default_attrs { data: { - action: ["click->rbui--command#open", @keybindings.join(" ")] + action: ["click->ruby_ui--command#open", @keybindings.join(" ")] } } end diff --git a/lib/rbui/command/command_empty.rb b/lib/ruby_ui/command/command_empty.rb similarity index 80% rename from lib/rbui/command/command_empty.rb rename to lib/ruby_ui/command/command_empty.rb index d42327d3..d0f9c74f 100644 --- a/lib/rbui/command/command_empty.rb +++ b/lib/ruby_ui/command/command_empty.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class CommandEmpty < Base def view_template(&) div(**attrs, &) @@ -12,7 +12,7 @@ def default_attrs { class: "py-6 text-center text-sm", role: "presentation", - data: {rbui__command_target: "empty"} + data: {ruby_ui__command_target: "empty"} } end end diff --git a/lib/rbui/command/command_group.rb b/lib/ruby_ui/command/command_group.rb similarity index 93% rename from lib/rbui/command/command_group.rb rename to lib/ruby_ui/command/command_group.rb index 84ba6774..7eb5b7d6 100644 --- a/lib/rbui/command/command_group.rb +++ b/lib/ruby_ui/command/command_group.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class CommandGroup < Base def initialize(title: nil, **attrs) @title = title @@ -32,7 +32,7 @@ def default_attrs role: "presentation", data: { value: @title, - rbui__command_target: "group" + ruby_ui__command_target: "group" } } end diff --git a/lib/rbui/command/command_input.rb b/lib/ruby_ui/command/command_input.rb similarity index 82% rename from lib/rbui/command/command_input.rb rename to lib/ruby_ui/command/command_input.rb index 1d4fd53e..ee921cb0 100644 --- a/lib/rbui/command/command_input.rb +++ b/lib/ruby_ui/command/command_input.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class CommandInput < Base def initialize(placeholder: "Type a command or search...", **attrs) @placeholder = placeholder @@ -40,8 +40,8 @@ def default_attrs { class: "flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50", placeholder: @placeholder, - data_action: "input->rbui--command#filter keydown.down->rbui--command#handleKeydown keydown.up->rbui--command#handleKeydown keydown.enter->rbui--command#handleKeydown keydown.esc->rbui--command#dismiss", - data_rbui__command_target: "input", + data_action: "input->ruby_ui--command#filter keydown.down->ruby_ui--command#handleKeydown keydown.up->ruby_ui--command#handleKeydown keydown.enter->ruby_ui--command#handleKeydown keydown.esc->ruby_ui--command#dismiss", + data_ruby_ui__command_target: "input", autocomplete: "off", autocorrect: "off", spellcheck: false, diff --git a/lib/rbui/command/command_item.rb b/lib/ruby_ui/command/command_item.rb similarity index 93% rename from lib/rbui/command/command_item.rb rename to lib/ruby_ui/command/command_item.rb index a9cb1929..8b2c2aad 100644 --- a/lib/rbui/command/command_item.rb +++ b/lib/ruby_ui/command/command_item.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class CommandItem < Base def initialize(value:, text: "", href: "#", **attrs) @value = value @@ -21,7 +21,7 @@ def default_attrs href: @href, role: "option", data: { - rbui__command_target: "item", + ruby_ui__command_target: "item", value: @value, text: @text } diff --git a/lib/rbui/command/command_list.rb b/lib/ruby_ui/command/command_list.rb similarity index 94% rename from lib/rbui/command/command_list.rb rename to lib/ruby_ui/command/command_list.rb index f99876db..990872c3 100644 --- a/lib/rbui/command/command_list.rb +++ b/lib/ruby_ui/command/command_list.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class CommandList < Base def view_template(&) div(**attrs, &) diff --git a/lib/rbui/context_menu/context_menu.rb b/lib/ruby_ui/context_menu/context_menu.rb similarity index 86% rename from lib/rbui/context_menu/context_menu.rb rename to lib/ruby_ui/context_menu/context_menu.rb index 1d33370b..37a28c4d 100644 --- a/lib/rbui/context_menu/context_menu.rb +++ b/lib/ruby_ui/context_menu/context_menu.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class ContextMenu < Base def initialize(options: {}, **attrs) @options = options @@ -17,7 +17,7 @@ def view_template(&) def default_attrs { data: { - controller: "rbui--context-menu", + controller: "ruby_ui--context-menu", popover_options_value: @options.to_json } } diff --git a/lib/rbui/context_menu/context_menu_content.rb b/lib/ruby_ui/context_menu/context_menu_content.rb similarity index 90% rename from lib/rbui/context_menu/context_menu_content.rb rename to lib/ruby_ui/context_menu/context_menu_content.rb index 4c2bbf85..6ff51082 100644 --- a/lib/rbui/context_menu/context_menu_content.rb +++ b/lib/ruby_ui/context_menu/context_menu_content.rb @@ -1,9 +1,9 @@ # frozen_string_literal: true -module RBUI +module RubyUI class ContextMenuContent < Base def view_template(&block) - all_template_tag(data: {rbui__context_menu_target: "content"}) do + all_template_tag(data: {ruby_ui__context_menu_target: "content"}) do div(**attrs, &block) end end diff --git a/lib/rbui/context_menu/context_menu_controller.js b/lib/ruby_ui/context_menu/context_menu_controller.js similarity index 100% rename from lib/rbui/context_menu/context_menu_controller.js rename to lib/ruby_ui/context_menu/context_menu_controller.js diff --git a/lib/rbui/context_menu/context_menu_item.rb b/lib/ruby_ui/context_menu/context_menu_item.rb similarity index 94% rename from lib/rbui/context_menu/context_menu_item.rb rename to lib/ruby_ui/context_menu/context_menu_item.rb index ab3580a0..4c870fc3 100644 --- a/lib/rbui/context_menu/context_menu_item.rb +++ b/lib/ruby_ui/context_menu/context_menu_item.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class ContextMenuItem < Base def initialize(href: "#", checked: false, shortcut: nil, disabled: false, **attrs) @href = href @@ -56,8 +56,8 @@ def default_attrs "relative flex cursor-pointer select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground aria-selected:bg-accent aria-selected:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 pl-8", tabindex: "-1", data_orientation: "vertical", - data_action: "click->rbui--context-menu#close", - data_rbui__context_menu_target: "menuItem", + data_action: "click->ruby_ui--context-menu#close", + data_ruby_ui__context_menu_target: "menuItem", data_disabled: @disabled, disabled: @disabled } diff --git a/lib/rbui/context_menu/context_menu_label.rb b/lib/ruby_ui/context_menu/context_menu_label.rb similarity index 96% rename from lib/rbui/context_menu/context_menu_label.rb rename to lib/ruby_ui/context_menu/context_menu_label.rb index 46e779f7..0c6b6b86 100644 --- a/lib/rbui/context_menu/context_menu_label.rb +++ b/lib/ruby_ui/context_menu/context_menu_label.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class ContextMenuLabel < Base def initialize(inset: false, **attrs) @inset = inset diff --git a/lib/rbui/context_menu/context_menu_separator.rb b/lib/ruby_ui/context_menu/context_menu_separator.rb similarity index 95% rename from lib/rbui/context_menu/context_menu_separator.rb rename to lib/ruby_ui/context_menu/context_menu_separator.rb index 19afc01c..6b0a50d3 100644 --- a/lib/rbui/context_menu/context_menu_separator.rb +++ b/lib/ruby_ui/context_menu/context_menu_separator.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class ContextMenuSeparator < Base def view_template div(**attrs) diff --git a/lib/rbui/context_menu/context_menu_trigger.rb b/lib/ruby_ui/context_menu/context_menu_trigger.rb similarity index 61% rename from lib/rbui/context_menu/context_menu_trigger.rb rename to lib/ruby_ui/context_menu/context_menu_trigger.rb index 9cc7c5a7..8aff0651 100644 --- a/lib/rbui/context_menu/context_menu_trigger.rb +++ b/lib/ruby_ui/context_menu/context_menu_trigger.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class ContextMenuTrigger < Base def view_template(&) div(**attrs, &) @@ -11,8 +11,8 @@ def view_template(&) def default_attrs { data: { - rbui__context_menu_target: "trigger", - action: "contextmenu->rbui--context-menu#handleContextMenu" + ruby_ui__context_menu_target: "trigger", + action: "contextmenu->ruby_ui--context-menu#handleContextMenu" } } end diff --git a/lib/rbui/dialog/dialog.rb b/lib/ruby_ui/dialog/dialog.rb similarity index 74% rename from lib/rbui/dialog/dialog.rb rename to lib/ruby_ui/dialog/dialog.rb index 9800e99e..51a8d89b 100644 --- a/lib/rbui/dialog/dialog.rb +++ b/lib/ruby_ui/dialog/dialog.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class Dialog < Base def initialize(open: false, **attrs) @open = open @@ -16,8 +16,8 @@ def view_template(&) def default_attrs { data: { - controller: "rbui--dialog", - rbui__dialog_open_value: @open + controller: "ruby_ui--dialog", + ruby_ui__dialog_open_value: @open } } end diff --git a/lib/rbui/dialog/dialog_content.rb b/lib/ruby_ui/dialog/dialog_content.rb similarity index 91% rename from lib/rbui/dialog/dialog_content.rb rename to lib/ruby_ui/dialog/dialog_content.rb index d81d1975..3b95f522 100644 --- a/lib/rbui/dialog/dialog_content.rb +++ b/lib/ruby_ui/dialog/dialog_content.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class DialogContent < Base SIZES = { xs: "max-w-sm", @@ -17,8 +17,8 @@ def initialize(size: :md, **attrs) end def view_template - all_template_tag(data: {rbui__dialog_target: "content"}) do - div(data_controller: "rbui--dialog") do + all_template_tag(data: {ruby_ui__dialog_target: "content"}) do + div(data_controller: "ruby_ui--dialog") do backdrop div(**attrs) do yield @@ -44,7 +44,7 @@ def close_button button( type: "button", class: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground", - data_action: "click->rbui--dialog#dismiss" + data_action: "click->ruby_ui--dialog#dismiss" ) do svg( width: "15", @@ -69,7 +69,7 @@ def close_button def backdrop div( data_state: "open", - data_action: "click->rbui--dialog#dismiss esc->rbui--dialog#dismiss", + data_action: "click->ruby_ui--dialog#dismiss esc->ruby_ui--dialog#dismiss", class: "fixed pointer-events-auto inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0" ) diff --git a/lib/rbui/dialog/dialog_controller.js b/lib/ruby_ui/dialog/dialog_controller.js similarity index 100% rename from lib/rbui/dialog/dialog_controller.js rename to lib/ruby_ui/dialog/dialog_controller.js diff --git a/lib/rbui/dialog/dialog_description.rb b/lib/ruby_ui/dialog/dialog_description.rb similarity index 94% rename from lib/rbui/dialog/dialog_description.rb rename to lib/ruby_ui/dialog/dialog_description.rb index 0efa4301..2da33bda 100644 --- a/lib/rbui/dialog/dialog_description.rb +++ b/lib/ruby_ui/dialog/dialog_description.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class DialogDescription < Base def view_template(&) p(**attrs, &) diff --git a/lib/rbui/dialog/dialog_footer.rb b/lib/ruby_ui/dialog/dialog_footer.rb similarity index 95% rename from lib/rbui/dialog/dialog_footer.rb rename to lib/ruby_ui/dialog/dialog_footer.rb index 43fdb58b..88277df0 100644 --- a/lib/rbui/dialog/dialog_footer.rb +++ b/lib/ruby_ui/dialog/dialog_footer.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class DialogFooter < Base def view_template(&) div(**attrs, &) diff --git a/lib/rbui/dialog/dialog_header.rb b/lib/ruby_ui/dialog/dialog_header.rb similarity index 94% rename from lib/rbui/dialog/dialog_header.rb rename to lib/ruby_ui/dialog/dialog_header.rb index 097eb501..cb7d9b5c 100644 --- a/lib/rbui/dialog/dialog_header.rb +++ b/lib/ruby_ui/dialog/dialog_header.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class DialogHeader < Base def view_template(&) div(**attrs, &) diff --git a/lib/rbui/dialog/dialog_middle.rb b/lib/ruby_ui/dialog/dialog_middle.rb similarity index 93% rename from lib/rbui/dialog/dialog_middle.rb rename to lib/ruby_ui/dialog/dialog_middle.rb index c0cf6665..aa8a9072 100644 --- a/lib/rbui/dialog/dialog_middle.rb +++ b/lib/ruby_ui/dialog/dialog_middle.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class DialogMiddle < Base def view_template(&) div(**attrs, &) diff --git a/lib/rbui/dialog/dialog_title.rb b/lib/ruby_ui/dialog/dialog_title.rb similarity index 94% rename from lib/rbui/dialog/dialog_title.rb rename to lib/ruby_ui/dialog/dialog_title.rb index eb448971..fce48fa7 100644 --- a/lib/rbui/dialog/dialog_title.rb +++ b/lib/ruby_ui/dialog/dialog_title.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class DialogTitle < Base def view_template(&) h3(**attrs, &) diff --git a/lib/rbui/dialog/dialog_trigger.rb b/lib/ruby_ui/dialog/dialog_trigger.rb similarity index 79% rename from lib/rbui/dialog/dialog_trigger.rb rename to lib/ruby_ui/dialog/dialog_trigger.rb index 97423f39..ddc877da 100644 --- a/lib/rbui/dialog/dialog_trigger.rb +++ b/lib/ruby_ui/dialog/dialog_trigger.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class DialogTrigger < Base def view_template(&) div(**attrs, &) @@ -11,7 +11,7 @@ def view_template(&) def default_attrs { data: { - action: "click->rbui--dialog#open" + action: "click->ruby_ui--dialog#open" }, class: "inline-block" } diff --git a/lib/rbui/dropdown_menu/dropdown_menu.rb b/lib/ruby_ui/dropdown_menu/dropdown_menu.rb similarity index 60% rename from lib/rbui/dropdown_menu/dropdown_menu.rb rename to lib/ruby_ui/dropdown_menu/dropdown_menu.rb index d004417c..e7e8bcda 100644 --- a/lib/rbui/dropdown_menu/dropdown_menu.rb +++ b/lib/ruby_ui/dropdown_menu/dropdown_menu.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class DropdownMenu < Base def initialize(options: {}, **attrs) @options = options @@ -16,9 +16,9 @@ def view_template(&) def default_attrs { data: { - controller: "rbui--dropdown-menu", - action: "click@window->rbui--dropdown-menu#onClickOutside", - rbui__dropdown_menu_options_value: @options.to_json + controller: "ruby_ui--dropdown-menu", + action: "click@window->ruby_ui--dropdown-menu#onClickOutside", + ruby_ui__dropdown_menu_options_value: @options.to_json } } end diff --git a/lib/rbui/dropdown_menu/dropdown_menu_content.rb b/lib/ruby_ui/dropdown_menu/dropdown_menu_content.rb similarity index 81% rename from lib/rbui/dropdown_menu/dropdown_menu_content.rb rename to lib/ruby_ui/dropdown_menu/dropdown_menu_content.rb index f2ddb87e..44b8e16d 100644 --- a/lib/rbui/dropdown_menu/dropdown_menu_content.rb +++ b/lib/ruby_ui/dropdown_menu/dropdown_menu_content.rb @@ -1,9 +1,9 @@ # frozen_string_literal: true -module RBUI +module RubyUI class DropdownMenuContent < Base def view_template(&block) - div(data: {rbui__dropdown_menu_target: "content"}, class: "hidden", style: "width: max-content; position: absolute; top: 0; left: 0;") do + div(data: {ruby_ui__dropdown_menu_target: "content"}, class: "hidden", style: "width: max-content; position: absolute; top: 0; left: 0;") do div(**attrs, &block) end end diff --git a/lib/rbui/dropdown_menu/dropdown_menu_controller.js b/lib/ruby_ui/dropdown_menu/dropdown_menu_controller.js similarity index 100% rename from lib/rbui/dropdown_menu/dropdown_menu_controller.js rename to lib/ruby_ui/dropdown_menu/dropdown_menu_controller.js diff --git a/lib/rbui/dropdown_menu/dropdown_menu_item.rb b/lib/ruby_ui/dropdown_menu/dropdown_menu_item.rb similarity index 84% rename from lib/rbui/dropdown_menu/dropdown_menu_item.rb rename to lib/ruby_ui/dropdown_menu/dropdown_menu_item.rb index c9cf38f4..88b8f24b 100644 --- a/lib/rbui/dropdown_menu/dropdown_menu_item.rb +++ b/lib/ruby_ui/dropdown_menu/dropdown_menu_item.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class DropdownMenuItem < Base def initialize(href: "#", **attrs) @href = href @@ -18,8 +18,8 @@ def default_attrs href: @href, role: "menuitem", class: "relative flex cursor-pointer select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground aria-selected:bg-accent aria-selected:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50", - data_action: "click->rbui--dropdown-menu#close", - data_rbui__dropdown_menu_target: "menuItem", + data_action: "click->ruby_ui--dropdown-menu#close", + data_ruby_ui__dropdown_menu_target: "menuItem", tabindex: "-1", data_orientation: "vertical" } diff --git a/lib/rbui/dropdown_menu/dropdown_menu_label.rb b/lib/ruby_ui/dropdown_menu/dropdown_menu_label.rb similarity index 94% rename from lib/rbui/dropdown_menu/dropdown_menu_label.rb rename to lib/ruby_ui/dropdown_menu/dropdown_menu_label.rb index cf8c10b7..1a29ee72 100644 --- a/lib/rbui/dropdown_menu/dropdown_menu_label.rb +++ b/lib/ruby_ui/dropdown_menu/dropdown_menu_label.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class DropdownMenuLabel < Base def view_template(&) h3(**attrs, &) diff --git a/lib/rbui/dropdown_menu/dropdown_menu_separator.rb b/lib/ruby_ui/dropdown_menu/dropdown_menu_separator.rb similarity index 95% rename from lib/rbui/dropdown_menu/dropdown_menu_separator.rb rename to lib/ruby_ui/dropdown_menu/dropdown_menu_separator.rb index e5fc565f..030064b1 100644 --- a/lib/rbui/dropdown_menu/dropdown_menu_separator.rb +++ b/lib/ruby_ui/dropdown_menu/dropdown_menu_separator.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class DropdownMenuSeparator < Base def view_template div(**attrs) diff --git a/lib/rbui/dropdown_menu/dropdown_menu_trigger.rb b/lib/ruby_ui/dropdown_menu/dropdown_menu_trigger.rb similarity index 64% rename from lib/rbui/dropdown_menu/dropdown_menu_trigger.rb rename to lib/ruby_ui/dropdown_menu/dropdown_menu_trigger.rb index b363a5e5..448deb88 100644 --- a/lib/rbui/dropdown_menu/dropdown_menu_trigger.rb +++ b/lib/ruby_ui/dropdown_menu/dropdown_menu_trigger.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class DropdownMenuTrigger < Base def view_template(&) div(**attrs, &) @@ -10,7 +10,7 @@ def view_template(&) def default_attrs { - data: {rbui__dropdown_menu_target: "trigger", action: "click->rbui--dropdown-menu#toggle"}, + data: {ruby_ui__dropdown_menu_target: "trigger", action: "click->ruby_ui--dropdown-menu#toggle"}, class: "inline-block" } end diff --git a/lib/rbui/form/form.rb b/lib/ruby_ui/form/form.rb similarity index 92% rename from lib/rbui/form/form.rb rename to lib/ruby_ui/form/form.rb index 5ea73430..c34e7745 100644 --- a/lib/rbui/form/form.rb +++ b/lib/ruby_ui/form/form.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class Form < Base def view_template(&) form(**attrs, &) diff --git a/lib/rbui/form/form_field.rb b/lib/ruby_ui/form/form_field.rb similarity index 80% rename from lib/rbui/form/form_field.rb rename to lib/ruby_ui/form/form_field.rb index e02d839c..0dfd6fb7 100644 --- a/lib/rbui/form/form_field.rb +++ b/lib/ruby_ui/form/form_field.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class FormField < Base def view_template(&) div(**attrs, &) @@ -11,7 +11,7 @@ def view_template(&) def default_attrs { data: { - controller: "rbui--form-field" + controller: "ruby_ui--form-field" }, class: "space-y-2" } diff --git a/lib/rbui/form/form_field_controller.js b/lib/ruby_ui/form/form_field_controller.js similarity index 100% rename from lib/rbui/form/form_field_controller.js rename to lib/ruby_ui/form/form_field_controller.js diff --git a/lib/rbui/form/form_field_error.rb b/lib/ruby_ui/form/form_field_error.rb similarity index 81% rename from lib/rbui/form/form_field_error.rb rename to lib/ruby_ui/form/form_field_error.rb index 414296f3..0fceacd3 100644 --- a/lib/rbui/form/form_field_error.rb +++ b/lib/ruby_ui/form/form_field_error.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class FormFieldError < Base def view_template(&) p(**attrs, &) @@ -11,7 +11,7 @@ def view_template(&) def default_attrs { data: { - rbui__form_field_target: "error" + ruby_ui__form_field_target: "error" }, class: "text-sm font-medium text-destructive" } diff --git a/lib/rbui/form/form_field_hint.rb b/lib/ruby_ui/form/form_field_hint.rb similarity index 93% rename from lib/rbui/form/form_field_hint.rb rename to lib/ruby_ui/form/form_field_hint.rb index a4d3b038..5304a259 100644 --- a/lib/rbui/form/form_field_hint.rb +++ b/lib/ruby_ui/form/form_field_hint.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class FormFieldHint < Base def view_template(&) p(**attrs, &) diff --git a/lib/rbui/form/form_field_label.rb b/lib/ruby_ui/form/form_field_label.rb similarity index 95% rename from lib/rbui/form/form_field_label.rb rename to lib/ruby_ui/form/form_field_label.rb index 13ae7a25..032ada13 100644 --- a/lib/rbui/form/form_field_label.rb +++ b/lib/ruby_ui/form/form_field_label.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class FormFieldLabel < Base def view_template(&) label(**attrs, &) diff --git a/lib/rbui/hover_card/hover_card.rb b/lib/ruby_ui/hover_card/hover_card.rb similarity index 76% rename from lib/rbui/hover_card/hover_card.rb rename to lib/ruby_ui/hover_card/hover_card.rb index b9251c70..a072e4f1 100644 --- a/lib/rbui/hover_card/hover_card.rb +++ b/lib/ruby_ui/hover_card/hover_card.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class HoverCard < Base def initialize(option: {}, **attrs) @options = option @@ -18,8 +18,8 @@ def view_template(&) def default_attrs { data: { - controller: "rbui--hover-card", - rbui__hover_card_options_value: @options.to_json + controller: "ruby_ui--hover-card", + ruby_ui__hover_card_options_value: @options.to_json } } end diff --git a/lib/rbui/hover_card/hover_card_content.rb b/lib/ruby_ui/hover_card/hover_card_content.rb similarity index 88% rename from lib/rbui/hover_card/hover_card_content.rb rename to lib/ruby_ui/hover_card/hover_card_content.rb index b26384bc..068356cd 100644 --- a/lib/rbui/hover_card/hover_card_content.rb +++ b/lib/ruby_ui/hover_card/hover_card_content.rb @@ -1,9 +1,9 @@ # frozen_string_literal: true -module RBUI +module RubyUI class HoverCardContent < Base def view_template(&block) - all_template_tag(data: {rbui__hover_card_target: "content"}) do + all_template_tag(data: {ruby_ui__hover_card_target: "content"}) do div(**attrs, &block) end end diff --git a/lib/rbui/hover_card/hover_card_controller.js b/lib/ruby_ui/hover_card/hover_card_controller.js similarity index 100% rename from lib/rbui/hover_card/hover_card_controller.js rename to lib/ruby_ui/hover_card/hover_card_controller.js diff --git a/lib/rbui/hover_card/hover_card_trigger.rb b/lib/ruby_ui/hover_card/hover_card_trigger.rb similarity index 79% rename from lib/rbui/hover_card/hover_card_trigger.rb rename to lib/ruby_ui/hover_card/hover_card_trigger.rb index 1713212e..6b5238a5 100644 --- a/lib/rbui/hover_card/hover_card_trigger.rb +++ b/lib/ruby_ui/hover_card/hover_card_trigger.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class HoverCardTrigger < Base def view_template(&) div(**attrs, &) @@ -11,7 +11,7 @@ def view_template(&) def default_attrs { data: { - rbui__hover_card_target: "trigger" + ruby_ui__hover_card_target: "trigger" }, class: "inline-block" } diff --git a/lib/rbui/index.js b/lib/ruby_ui/index.js similarity index 55% rename from lib/rbui/index.js rename to lib/ruby_ui/index.js index 838a546b..6b80213e 100644 --- a/lib/rbui/index.js +++ b/lib/ruby_ui/index.js @@ -34,37 +34,37 @@ function initialize(application) { }; // Register all controllers - registerIfNotExists("rbui--accordion", AccordionController); - registerIfNotExists("rbui--alert-dialog", AlertDialogController); - registerIfNotExists("rbui--calendar", CalendarController); - registerIfNotExists("rbui--calendar-input", CalendarInputController); - registerIfNotExists("rbui--collapsible", CollapsibleController); - registerIfNotExists("rbui--chart", ChartController); - registerIfNotExists("rbui--checkbox-group", CheckboxGroupController); - registerIfNotExists("rbui--clipboard", ClipboardController); - registerIfNotExists("rbui--combobox", ComboboxController); - registerIfNotExists("rbui--combobox-content", ComboboxContentController); - registerIfNotExists("rbui--combobox-item", ComboboxItemController); - registerIfNotExists("rbui--command", CommandController); - registerIfNotExists("rbui--context-menu", ContextMenuController); - registerIfNotExists("rbui--dialog", DialogController); - registerIfNotExists("rbui--dropdown-menu", DropdownMenuController); - registerIfNotExists("rbui--form-field", FormFieldController); - registerIfNotExists("rbui--hover-card", HoverCardController); - registerIfNotExists("rbui--popover", PopoverController); - registerIfNotExists("rbui--tabs", TabsController); - registerIfNotExists("rbui--theme-toggle", ThemeToggleController); - registerIfNotExists("rbui--tooltip", TooltipController); - registerIfNotExists("rbui--select", SelectController); - registerIfNotExists("rbui--select-item", SelectItemController); - registerIfNotExists("rbui--sheet", SheetController); - registerIfNotExists("rbui--sheet-content", SheetContentController); + registerIfNotExists("ruby_ui--accordion", AccordionController); + registerIfNotExists("ruby_ui--alert-dialog", AlertDialogController); + registerIfNotExists("ruby_ui--calendar", CalendarController); + registerIfNotExists("ruby_ui--calendar-input", CalendarInputController); + registerIfNotExists("ruby_ui--collapsible", CollapsibleController); + registerIfNotExists("ruby_ui--chart", ChartController); + registerIfNotExists("ruby_ui--checkbox-group", CheckboxGroupController); + registerIfNotExists("ruby_ui--clipboard", ClipboardController); + registerIfNotExists("ruby_ui--combobox", ComboboxController); + registerIfNotExists("ruby_ui--combobox-content", ComboboxContentController); + registerIfNotExists("ruby_ui--combobox-item", ComboboxItemController); + registerIfNotExists("ruby_ui--command", CommandController); + registerIfNotExists("ruby_ui--context-menu", ContextMenuController); + registerIfNotExists("ruby_ui--dialog", DialogController); + registerIfNotExists("ruby_ui--dropdown-menu", DropdownMenuController); + registerIfNotExists("ruby_ui--form-field", FormFieldController); + registerIfNotExists("ruby_ui--hover-card", HoverCardController); + registerIfNotExists("ruby_ui--popover", PopoverController); + registerIfNotExists("ruby_ui--tabs", TabsController); + registerIfNotExists("ruby_ui--theme-toggle", ThemeToggleController); + registerIfNotExists("ruby_ui--tooltip", TooltipController); + registerIfNotExists("ruby_ui--select", SelectController); + registerIfNotExists("ruby_ui--select-item", SelectItemController); + registerIfNotExists("ruby_ui--sheet", SheetController); + registerIfNotExists("ruby_ui--sheet-content", SheetContentController); } -const RBUI = { +const RubyUI = { initialize, }; -export default RBUI; +export default RubyUI; export { initialize }; diff --git a/lib/rbui/input/input.rb b/lib/ruby_ui/input/input.rb similarity index 80% rename from lib/rbui/input/input.rb rename to lib/ruby_ui/input/input.rb index d8c127c7..4cc7f0ef 100644 --- a/lib/rbui/input/input.rb +++ b/lib/ruby_ui/input/input.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class Input < Base def initialize(type: :string, **attrs) @type = type.to_sym @@ -16,8 +16,8 @@ def view_template def default_attrs { data: { - rbui__form_field_target: "input", - action: "input->rbui--form-field#onInput invalid->rbui--form-field#onInvalid" + ruby_ui__form_field_target: "input", + action: "input->ruby_ui--form-field#onInput invalid->ruby_ui--form-field#onInvalid" }, class: "flex h-9 w-full rounded-md border bg-background px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium focus-visible:outline-none focus-visible:ring-1 disabled:cursor-not-allowed disabled:opacity-50 border-border focus-visible:ring-ring placeholder:text-muted-foreground" } diff --git a/lib/rbui/link/link.rb b/lib/ruby_ui/link/link.rb similarity index 99% rename from lib/rbui/link/link.rb rename to lib/ruby_ui/link/link.rb index 083c316c..528ea507 100644 --- a/lib/rbui/link/link.rb +++ b/lib/ruby_ui/link/link.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class Link < Base def initialize(href: "#", variant: :link, size: :md, icon: false, **attrs) @href = href diff --git a/lib/rbui/pagination/pagination.rb b/lib/ruby_ui/pagination/pagination.rb similarity index 95% rename from lib/rbui/pagination/pagination.rb rename to lib/ruby_ui/pagination/pagination.rb index 839e93d6..dfc64369 100644 --- a/lib/rbui/pagination/pagination.rb +++ b/lib/ruby_ui/pagination/pagination.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class Pagination < Base def view_template(&) nav(**attrs, &) diff --git a/lib/rbui/pagination/pagination_content.rb b/lib/ruby_ui/pagination/pagination_content.rb similarity index 94% rename from lib/rbui/pagination/pagination_content.rb rename to lib/ruby_ui/pagination/pagination_content.rb index 2fd0e433..135f403a 100644 --- a/lib/rbui/pagination/pagination_content.rb +++ b/lib/ruby_ui/pagination/pagination_content.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class PaginationContent < Base def view_template(&) ul(**attrs, &) diff --git a/lib/rbui/pagination/pagination_ellipsis.rb b/lib/ruby_ui/pagination/pagination_ellipsis.rb similarity index 98% rename from lib/rbui/pagination/pagination_ellipsis.rb rename to lib/ruby_ui/pagination/pagination_ellipsis.rb index b59a4b87..10b26783 100644 --- a/lib/rbui/pagination/pagination_ellipsis.rb +++ b/lib/ruby_ui/pagination/pagination_ellipsis.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class PaginationEllipsis < Base def view_template(&block) li do diff --git a/lib/rbui/pagination/pagination_item.rb b/lib/ruby_ui/pagination/pagination_item.rb similarity index 82% rename from lib/rbui/pagination/pagination_item.rb rename to lib/ruby_ui/pagination/pagination_item.rb index 3a211d1d..d9add897 100644 --- a/lib/rbui/pagination/pagination_item.rb +++ b/lib/ruby_ui/pagination/pagination_item.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class PaginationItem < Base def initialize(href: "#", active: false, **attrs) @href = href @@ -20,7 +20,7 @@ def default_attrs { aria: {current: @active ? "page" : nil}, class: [ - RBUI::Button.new(variant: @active ? :outline : :ghost).attrs[:class] + RubyUI::Button.new(variant: @active ? :outline : :ghost).attrs[:class] ] } end diff --git a/lib/rbui/popover/popover.rb b/lib/ruby_ui/popover/popover.rb similarity index 61% rename from lib/rbui/popover/popover.rb rename to lib/ruby_ui/popover/popover.rb index 28dd4301..ab0f3439 100644 --- a/lib/rbui/popover/popover.rb +++ b/lib/ruby_ui/popover/popover.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class Popover < Base def initialize(options: {}, **attrs) @options = options @@ -16,9 +16,9 @@ def view_template(&) def default_attrs { data: { - controller: "rbui--popover", - rbui__popover_options_value: @options.to_json, - rbui__popover_trigger_value: @options[:trigger] || "hover" + controller: "ruby_ui--popover", + ruby_ui__popover_options_value: @options.to_json, + ruby_ui__popover_trigger_value: @options[:trigger] || "hover" } } end diff --git a/lib/rbui/popover/popover_content.rb b/lib/ruby_ui/popover/popover_content.rb similarity index 92% rename from lib/rbui/popover/popover_content.rb rename to lib/ruby_ui/popover/popover_content.rb index 34e44eaa..8ba5aeda 100644 --- a/lib/rbui/popover/popover_content.rb +++ b/lib/ruby_ui/popover/popover_content.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class PopoverContent < Base def view_template(&) div(**attrs, &) @@ -11,7 +11,7 @@ def view_template(&) def default_attrs { data: { - rbui__popover_target: "content" + ruby_ui__popover_target: "content" }, class: [ "hidden z-50 rounded-md border bg-background p-1 text-foreground shadow-md outline-none", diff --git a/lib/rbui/popover/popover_controller.js b/lib/ruby_ui/popover/popover_controller.js similarity index 100% rename from lib/rbui/popover/popover_controller.js rename to lib/ruby_ui/popover/popover_controller.js diff --git a/lib/rbui/popover/popover_trigger.rb b/lib/ruby_ui/popover/popover_trigger.rb similarity index 80% rename from lib/rbui/popover/popover_trigger.rb rename to lib/ruby_ui/popover/popover_trigger.rb index e9ad61f3..8644c1f7 100644 --- a/lib/rbui/popover/popover_trigger.rb +++ b/lib/ruby_ui/popover/popover_trigger.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class PopoverTrigger < Base def view_template(&) div(**attrs, &) @@ -11,7 +11,7 @@ def view_template(&) def default_attrs { data: { - rbui__popover_target: "trigger" + ruby_ui__popover_target: "trigger" }, class: "inline-block" } diff --git a/lib/rbui/radio_button/radio_button.rb b/lib/ruby_ui/radio_button/radio_button.rb similarity index 65% rename from lib/rbui/radio_button/radio_button.rb rename to lib/ruby_ui/radio_button/radio_button.rb index b4c85448..596a0470 100644 --- a/lib/rbui/radio_button/radio_button.rb +++ b/lib/ruby_ui/radio_button/radio_button.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class RadioButton < Base def view_template input(**attrs) @@ -12,8 +12,8 @@ def default_attrs { type: "radio", data: { - rbui__form_field_target: "input", - action: "change->rbui--form-field#onInput invalid->rbui--form-field#onInvalid" + ruby_ui__form_field_target: "input", + action: "change->ruby_ui--form-field#onInput invalid->ruby_ui--form-field#onInvalid" }, class: "h-4 w-4 p-0 border-primary rounded-full flex-none" } diff --git a/lib/rbui/railtie.rb b/lib/ruby_ui/railtie.rb similarity index 53% rename from lib/rbui/railtie.rb rename to lib/ruby_ui/railtie.rb index 992832dd..07a06a78 100644 --- a/lib/rbui/railtie.rb +++ b/lib/ruby_ui/railtie.rb @@ -1,37 +1,37 @@ -module RBUI +module RubyUI if defined?(Rails) class Railtie < ::Rails::Railtie generators do - require_relative "../generators/rbui/install/install_generator" + require_relative "../generators/ruby_ui/install/install_generator" config.app_generators do |g| g.templates.unshift File.expand_path("../templates", __FILE__) end - initializer "rbui.set_generator_namespace" do - Rails::Generators.namespace(RBUI::Generators, as: "rbui") + initializer "ruby_ui.set_generator_namespace" do + Rails::Generators.namespace(RubyUI::Generators, as: "ruby_ui") end end # Add component loading config.to_prepare do - # Define the path to the RBUI components - rbui_components_path = Rails.root.join("app/components/rbui") + # Define the path to the RubyUI components + ruby_ui_components_path = Rails.root.join("app/components/ruby_ui") - # Check if the RBUI components directory exists - if Dir.exist?(rbui_components_path) - # Find all Ruby files in the RBUI components directory and its subdirectories - Dir[rbui_components_path.join("**", "*.rb")].each do |file| - # Get the relative path of the file from the RBUI components directory - relative_path = Pathname.new(file).relative_path_from(rbui_components_path) + # Check if the RubyUI components directory exists + if Dir.exist?(ruby_ui_components_path) + # Find all Ruby files in the RubyUI components directory and its subdirectories + Dir[ruby_ui_components_path.join("**", "*.rb")].each do |file| + # Get the relative path of the file from the RubyUI components directory + relative_path = Pathname.new(file).relative_path_from(ruby_ui_components_path) # Convert the file path to a component name # e.g., "form/input.rb" becomes ["Form", "Input"] component_name_parts = relative_path.to_s.chomp(".rb").split("/").map(&:camelize) - # Create the full component name with RBUI namespace - # e.g., "RBUI::Form::Input" - full_component_name = "RBUI::#{component_name_parts.join("::")}" + # Create the full component name with RubyUI namespace + # e.g., "RubyUI::Form::Input" + full_component_name = "RubyUI::#{component_name_parts.join("::")}" begin # Check if the component is already defined diff --git a/lib/rbui/select/select.rb b/lib/ruby_ui/select/select.rb similarity index 52% rename from lib/rbui/select/select.rb rename to lib/ruby_ui/select/select.rb index 5d3705dc..95ca50a0 100644 --- a/lib/rbui/select/select.rb +++ b/lib/ruby_ui/select/select.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class Select < Base def view_template(&) div(**attrs, &) @@ -11,10 +11,10 @@ def view_template(&) def default_attrs { data: { - controller: "rbui--select", - rbui__select_open_value: "false", - action: "click@window->rbui--select#clickOutside", - rbui__select_rbui__select_item_outlet: ".item" + controller: "ruby_ui--select", + ruby_ui__select_open_value: "false", + action: "click@window->ruby_ui--select#clickOutside", + ruby_ui__select_ruby_ui__select_item_outlet: ".item" }, class: "group/select w-full relative" } diff --git a/lib/rbui/select/select_content.rb b/lib/ruby_ui/select/select_content.rb similarity index 66% rename from lib/rbui/select/select_content.rb rename to lib/ruby_ui/select/select_content.rb index 60554be9..1756eea6 100644 --- a/lib/rbui/select/select_content.rb +++ b/lib/ruby_ui/select/select_content.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class SelectContent < Base def initialize(**attrs) @id = "content#{SecureRandom.hex(4)}" @@ -10,7 +10,7 @@ def initialize(**attrs) def view_template(&block) div(**attrs) do div( - class: "max-h-96 min-w-max overflow-auto rounded-md border bg-background p-1 text-foreground shadow-md animate-out group-data-[rbui--select-open-value=true]/select:animate-in fade-out-0 group-data-[rbui--select-open-value=true]/select:fade-in-0 zoom-out-95 group-data-[rbui--select-open-value=true]/select:zoom-in-95 slide-in-from-top-2", &block + class: "max-h-96 min-w-max overflow-auto rounded-md border bg-background p-1 text-foreground shadow-md animate-out group-data-[ruby_ui--select-open-value=true]/select:animate-in fade-out-0 group-data-[ruby_ui--select-open-value=true]/select:fade-in-0 zoom-out-95 group-data-[ruby_ui--select-open-value=true]/select:zoom-in-95 slide-in-from-top-2", &block ) end end @@ -23,7 +23,7 @@ def default_attrs role: "listbox", tabindex: "-1", data: { - rbui__select_target: "content" + ruby_ui__select_target: "content" }, class: "hidden w-full absolute top-0 left-0 z-50" } diff --git a/lib/rbui/select/select_controller.js b/lib/ruby_ui/select/select_controller.js similarity index 77% rename from lib/rbui/select/select_controller.js rename to lib/ruby_ui/select/select_controller.js index c078d246..8a65fe26 100644 --- a/lib/rbui/select/select_controller.js +++ b/lib/ruby_ui/select/select_controller.js @@ -4,7 +4,7 @@ import { computePosition, autoUpdate, offset } from "@floating-ui/dom"; export default class extends Controller { static targets = ["trigger", "content", "input", "value", "item"]; static values = { open: Boolean }; - static outlets = ["rbui--select-item"]; + static outlets = ["ruby_ui--select-item"]; constructor(...args) { super(...args); @@ -23,7 +23,9 @@ export default class extends Controller { selectItem(event) { event.preventDefault(); - this.rbuiSelectItemOutlets.forEach(item => item.handleSelectItem(event)); + this.ruby_uiSelectItemOutlets.forEach((item) => + item.handleSelectItem(event), + ); const oldValue = this.inputTarget.value; const newValue = event.target.dataset.value; @@ -48,7 +50,9 @@ export default class extends Controller { handleKeyDown(event) { event.preventDefault(); - const currentIndex = this.itemTargets.findIndex((item) => item.getAttribute("aria-current") === "true"); + const currentIndex = this.itemTargets.findIndex( + (item) => item.getAttribute("aria-current") === "true", + ); if (currentIndex + 1 < this.itemTargets.length) { this.itemTargets[currentIndex].removeAttribute("aria-current"); @@ -59,7 +63,9 @@ export default class extends Controller { handleKeyUp(event) { event.preventDefault(); - const currentIndex = this.itemTargets.findIndex((item) => item.getAttribute("aria-current") === "true"); + const currentIndex = this.itemTargets.findIndex( + (item) => item.getAttribute("aria-current") === "true", + ); if (currentIndex > 0) { this.itemTargets[currentIndex].removeAttribute("aria-current"); @@ -72,18 +78,25 @@ export default class extends Controller { this.closeContent(); } - setFocusAndCurrent() { - const selectedItem = this.itemTargets.find((item) => item.getAttribute("aria-selected") === "true"); + const selectedItem = this.itemTargets.find( + (item) => item.getAttribute("aria-selected") === "true", + ); if (selectedItem) { selectedItem.focus({ preventScroll: true }); selectedItem.setAttribute("aria-current", "true"); - this.triggerTarget.setAttribute("aria-activedescendant", selectedItem.getAttribute("id")); + this.triggerTarget.setAttribute( + "aria-activedescendant", + selectedItem.getAttribute("id"), + ); } else { this.itemTarget.focus({ preventScroll: true }); this.itemTarget.setAttribute("aria-current", "true"); - this.triggerTarget.setAttribute("aria-activedescendant", this.itemTarget.getAttribute("id")); + this.triggerTarget.setAttribute( + "aria-activedescendant", + this.itemTarget.getAttribute("id"), + ); } } @@ -107,7 +120,9 @@ export default class extends Controller { setFloatingElement() { this.cleanup = autoUpdate(this.triggerTarget, this.contentTarget, () => { - computePosition(this.triggerTarget, this.contentTarget, { middleware: [offset(4)] }).then(({ x, y }) => { + computePosition(this.triggerTarget, this.contentTarget, { + middleware: [offset(4)], + }).then(({ x, y }) => { Object.assign(this.contentTarget.style, { left: `${x}px`, top: `${y}px`, @@ -129,7 +144,10 @@ export default class extends Controller { const currentItem = this.itemTargets[currentIndex]; currentItem.focus({ preventScroll: true }); currentItem.setAttribute("aria-current", "true"); - this.triggerTarget.setAttribute("aria-activedescendant", currentItem.getAttribute("id")); + this.triggerTarget.setAttribute( + "aria-activedescendant", + currentItem.getAttribute("id"), + ); } closeContent() { diff --git a/lib/rbui/select/select_group.rb b/lib/ruby_ui/select/select_group.rb similarity index 92% rename from lib/rbui/select/select_group.rb rename to lib/ruby_ui/select/select_group.rb index bc9c7efe..e22d8d22 100644 --- a/lib/rbui/select/select_group.rb +++ b/lib/ruby_ui/select/select_group.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class SelectGroup < Base def view_template(&) div(**attrs, &) diff --git a/lib/rbui/select/select_input.rb b/lib/ruby_ui/select/select_input.rb similarity index 53% rename from lib/rbui/select/select_input.rb rename to lib/ruby_ui/select/select_input.rb index 3f3e02d5..2a22fb81 100644 --- a/lib/rbui/select/select_input.rb +++ b/lib/ruby_ui/select/select_input.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class SelectInput < Base def view_template input(**attrs) @@ -12,9 +12,9 @@ def default_attrs { class: "hidden", data: { - rbui__select_target: "input", - rbui__form_field_target: "input", - action: "change->rbui--form-field#onChange invalid->rbui--form-field#onInvalid" + ruby_ui__select_target: "input", + ruby_ui__form_field_target: "input", + action: "change->ruby_ui--form-field#onChange invalid->ruby_ui--form-field#onInvalid" } } end diff --git a/lib/rbui/select/select_item.rb b/lib/ruby_ui/select/select_item.rb similarity index 80% rename from lib/rbui/select/select_item.rb rename to lib/ruby_ui/select/select_item.rb index fb8c6a34..fa49bbe8 100644 --- a/lib/rbui/select/select_item.rb +++ b/lib/ruby_ui/select/select_item.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class SelectItem < Base def initialize(value: nil, **attrs) @value = value @@ -39,9 +39,9 @@ def default_attrs tabindex: "0", class: "item group relative flex cursor-pointer select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground aria-selected:bg-accent aria-selected:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50", data: { - controller: "rbui--select-item", - action: "click->rbui--select#selectItem keydown.enter->rbui--select#selectItem keydown.down->rbui--select#handleKeyDown keydown.up->rbui--select#handleKeyUp keydown.esc->rbui--select#handleEsc", - rbui__select_target: "item" + controller: "ruby_ui--select-item", + action: "click->ruby_ui--select#selectItem keydown.enter->ruby_ui--select#selectItem keydown.down->ruby_ui--select#handleKeyDown keydown.up->ruby_ui--select#handleKeyUp keydown.esc->ruby_ui--select#handleEsc", + ruby_ui__select_target: "item" }, data_value: @value, data_orientation: "vertical", diff --git a/lib/rbui/select/select_item_controller.js b/lib/ruby_ui/select/select_item_controller.js similarity index 100% rename from lib/rbui/select/select_item_controller.js rename to lib/ruby_ui/select/select_item_controller.js diff --git a/lib/rbui/select/select_label.rb b/lib/ruby_ui/select/select_label.rb similarity index 94% rename from lib/rbui/select/select_label.rb rename to lib/ruby_ui/select/select_label.rb index 7f1029bc..99feee83 100644 --- a/lib/rbui/select/select_label.rb +++ b/lib/ruby_ui/select/select_label.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class SelectLabel < Base def view_template(&) h3(**attrs, &) diff --git a/lib/rbui/select/select_trigger.rb b/lib/ruby_ui/select/select_trigger.rb similarity index 92% rename from lib/rbui/select/select_trigger.rb rename to lib/ruby_ui/select/select_trigger.rb index e3b16fa5..549775e2 100644 --- a/lib/rbui/select/select_trigger.rb +++ b/lib/ruby_ui/select/select_trigger.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class SelectTrigger < Base def view_template(&block) button(**attrs) do @@ -34,8 +34,8 @@ def icon def default_attrs { data: { - action: "rbui--select#onClick", - rbui__select_target: "trigger" + action: "ruby_ui--select#onClick", + ruby_ui__select_target: "trigger" }, type: "button", role: "combobox", diff --git a/lib/rbui/select/select_value.rb b/lib/ruby_ui/select/select_value.rb similarity index 88% rename from lib/rbui/select/select_value.rb rename to lib/ruby_ui/select/select_value.rb index dbae3c00..0ca8d02d 100644 --- a/lib/rbui/select/select_value.rb +++ b/lib/ruby_ui/select/select_value.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class SelectValue < Base def initialize(placeholder: nil, **attrs) @placeholder = placeholder @@ -18,7 +18,7 @@ def view_template(&block) def default_attrs { data: { - rbui__select_target: "value" + ruby_ui__select_target: "value" }, class: "pointer-events-none" } diff --git a/lib/rbui/sheet/sheet.rb b/lib/ruby_ui/sheet/sheet.rb similarity index 75% rename from lib/rbui/sheet/sheet.rb rename to lib/ruby_ui/sheet/sheet.rb index 6d0c50f4..cae400bc 100644 --- a/lib/rbui/sheet/sheet.rb +++ b/lib/ruby_ui/sheet/sheet.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class Sheet < Base def view_template(&) div(**attrs, &) @@ -10,7 +10,7 @@ def view_template(&) def default_attrs { - data: {controller: "rbui--sheet"} + data: {controller: "ruby_ui--sheet"} } end end diff --git a/lib/rbui/sheet/sheet_content.rb b/lib/ruby_ui/sheet/sheet_content.rb similarity index 91% rename from lib/rbui/sheet/sheet_content.rb rename to lib/ruby_ui/sheet/sheet_content.rb index 680b706c..440b70b6 100644 --- a/lib/rbui/sheet/sheet_content.rb +++ b/lib/ruby_ui/sheet/sheet_content.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class SheetContent < Base SIDE_CLASS = { top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top", @@ -16,8 +16,8 @@ def initialize(side: :right, **attrs) end def view_template(&block) - all_template_tag(data: {rbui__sheet_target: "content"}) do - div(data: {controller: "rbui--sheet-content"}) do + all_template_tag(data: {ruby_ui__sheet_target: "content"}) do + div(data: {controller: "ruby_ui--sheet-content"}) do backdrop div(**attrs) do block&.call @@ -43,7 +43,7 @@ def close_button button( type: "button", class: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground", - data_action: "click->rbui--sheet-content#close" + data_action: "click->ruby_ui--sheet-content#close" ) do svg( width: "15", @@ -68,7 +68,7 @@ def close_button def backdrop div( data_state: "open", - data_action: "click->rbui--sheet-content#close", + data_action: "click->ruby_ui--sheet-content#close", class: "fixed pointer-events-auto inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0" ) diff --git a/lib/rbui/sheet/sheet_content_controller.js b/lib/ruby_ui/sheet/sheet_content_controller.js similarity index 100% rename from lib/rbui/sheet/sheet_content_controller.js rename to lib/ruby_ui/sheet/sheet_content_controller.js diff --git a/lib/rbui/sheet/sheet_controller.js b/lib/ruby_ui/sheet/sheet_controller.js similarity index 100% rename from lib/rbui/sheet/sheet_controller.js rename to lib/ruby_ui/sheet/sheet_controller.js diff --git a/lib/rbui/sheet/sheet_description.rb b/lib/ruby_ui/sheet/sheet_description.rb similarity index 94% rename from lib/rbui/sheet/sheet_description.rb rename to lib/ruby_ui/sheet/sheet_description.rb index bc127aa6..1edc1459 100644 --- a/lib/rbui/sheet/sheet_description.rb +++ b/lib/ruby_ui/sheet/sheet_description.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class SheetDescription < Base def view_template(&) p(**attrs, &) diff --git a/lib/rbui/sheet/sheet_footer.rb b/lib/ruby_ui/sheet/sheet_footer.rb similarity index 95% rename from lib/rbui/sheet/sheet_footer.rb rename to lib/ruby_ui/sheet/sheet_footer.rb index 2ed204b3..36cc4ded 100644 --- a/lib/rbui/sheet/sheet_footer.rb +++ b/lib/ruby_ui/sheet/sheet_footer.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class SheetFooter < Base def view_template(&) div(**attrs, &) diff --git a/lib/rbui/sheet/sheet_header.rb b/lib/ruby_ui/sheet/sheet_header.rb similarity index 94% rename from lib/rbui/sheet/sheet_header.rb rename to lib/ruby_ui/sheet/sheet_header.rb index ddcee85f..08626ee3 100644 --- a/lib/rbui/sheet/sheet_header.rb +++ b/lib/ruby_ui/sheet/sheet_header.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class SheetHeader < Base def view_template(&) div(**attrs, &) diff --git a/lib/rbui/sheet/sheet_middle.rb b/lib/ruby_ui/sheet/sheet_middle.rb similarity index 93% rename from lib/rbui/sheet/sheet_middle.rb rename to lib/ruby_ui/sheet/sheet_middle.rb index 58c2ae78..10648ab6 100644 --- a/lib/rbui/sheet/sheet_middle.rb +++ b/lib/ruby_ui/sheet/sheet_middle.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class SheetMiddle < Base def view_template(&) div(**attrs, &) diff --git a/lib/rbui/sheet/sheet_title.rb b/lib/ruby_ui/sheet/sheet_title.rb similarity index 94% rename from lib/rbui/sheet/sheet_title.rb rename to lib/ruby_ui/sheet/sheet_title.rb index 57b866a4..891a29b0 100644 --- a/lib/rbui/sheet/sheet_title.rb +++ b/lib/ruby_ui/sheet/sheet_title.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class SheetTitle < Base def view_template(&) h3(**attrs, &) diff --git a/lib/rbui/sheet/sheet_trigger.rb b/lib/ruby_ui/sheet/sheet_trigger.rb similarity index 73% rename from lib/rbui/sheet/sheet_trigger.rb rename to lib/ruby_ui/sheet/sheet_trigger.rb index f93970cb..32419ae2 100644 --- a/lib/rbui/sheet/sheet_trigger.rb +++ b/lib/ruby_ui/sheet/sheet_trigger.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class SheetTrigger < Base def view_template(&) div(**attrs, &) @@ -10,7 +10,7 @@ def view_template(&) def default_attrs { - data: {action: "click->rbui--sheet#open"} + data: {action: "click->ruby_ui--sheet#open"} } end end diff --git a/lib/rbui/shortcut_key/shortcut_key.rb b/lib/ruby_ui/shortcut_key/shortcut_key.rb similarity index 96% rename from lib/rbui/shortcut_key/shortcut_key.rb rename to lib/ruby_ui/shortcut_key/shortcut_key.rb index 0d3e4e93..257d42ad 100644 --- a/lib/rbui/shortcut_key/shortcut_key.rb +++ b/lib/ruby_ui/shortcut_key/shortcut_key.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class ShortcutKey < Base def view_template(&) kbd(**attrs, &) diff --git a/lib/rbui/table/table.rb b/lib/ruby_ui/table/table.rb similarity index 95% rename from lib/rbui/table/table.rb rename to lib/ruby_ui/table/table.rb index aa1cbbd1..d3f2c373 100644 --- a/lib/rbui/table/table.rb +++ b/lib/ruby_ui/table/table.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class Table < Base def view_template(&block) div(class: "relative w-full overflow-auto") do diff --git a/lib/rbui/table/table_body.rb b/lib/ruby_ui/table/table_body.rb similarity index 94% rename from lib/rbui/table/table_body.rb rename to lib/ruby_ui/table/table_body.rb index eb67515b..84891e20 100644 --- a/lib/rbui/table/table_body.rb +++ b/lib/ruby_ui/table/table_body.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class TableBody < Base def view_template(&) tbody(**attrs, &) diff --git a/lib/rbui/table/table_caption.rb b/lib/ruby_ui/table/table_caption.rb similarity index 94% rename from lib/rbui/table/table_caption.rb rename to lib/ruby_ui/table/table_caption.rb index 538b4b16..21335a8b 100644 --- a/lib/rbui/table/table_caption.rb +++ b/lib/ruby_ui/table/table_caption.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class TableCaption < Base def view_template(&) caption(**attrs, &) diff --git a/lib/rbui/table/table_cell.rb b/lib/ruby_ui/table/table_cell.rb similarity index 95% rename from lib/rbui/table/table_cell.rb rename to lib/ruby_ui/table/table_cell.rb index a51877ea..6d7e3539 100644 --- a/lib/rbui/table/table_cell.rb +++ b/lib/ruby_ui/table/table_cell.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class TableCell < Base def view_template(&) td(**attrs, &) diff --git a/lib/rbui/table/table_footer.rb b/lib/ruby_ui/table/table_footer.rb similarity index 95% rename from lib/rbui/table/table_footer.rb rename to lib/ruby_ui/table/table_footer.rb index 8f7cd1f3..156d7683 100644 --- a/lib/rbui/table/table_footer.rb +++ b/lib/ruby_ui/table/table_footer.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class TableFooter < Base def view_template(&) tfoot(**attrs, &) diff --git a/lib/rbui/table/table_head.rb b/lib/ruby_ui/table/table_head.rb similarity index 95% rename from lib/rbui/table/table_head.rb rename to lib/ruby_ui/table/table_head.rb index 83b9ae1e..c0c8d0e4 100644 --- a/lib/rbui/table/table_head.rb +++ b/lib/ruby_ui/table/table_head.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class TableHead < Base def view_template(&) th(**attrs, &) diff --git a/lib/rbui/table/table_header.rb b/lib/ruby_ui/table/table_header.rb similarity index 93% rename from lib/rbui/table/table_header.rb rename to lib/ruby_ui/table/table_header.rb index 32b868c8..5d632e8c 100644 --- a/lib/rbui/table/table_header.rb +++ b/lib/ruby_ui/table/table_header.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class TableHeader < Base def view_template(&) thead(**attrs, &) diff --git a/lib/rbui/table/table_row.rb b/lib/ruby_ui/table/table_row.rb similarity index 95% rename from lib/rbui/table/table_row.rb rename to lib/ruby_ui/table/table_row.rb index c50dfcb2..4b451df7 100644 --- a/lib/rbui/table/table_row.rb +++ b/lib/ruby_ui/table/table_row.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class TableRow < Base def view_template(&) tr(**attrs, &) diff --git a/lib/rbui/tabs/tabs.rb b/lib/ruby_ui/tabs/tabs.rb similarity index 74% rename from lib/rbui/tabs/tabs.rb rename to lib/ruby_ui/tabs/tabs.rb index 4d67f8d2..37e37adf 100644 --- a/lib/rbui/tabs/tabs.rb +++ b/lib/ruby_ui/tabs/tabs.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class Tabs < Base def initialize(default: nil, **attrs) @default = default @@ -16,8 +16,8 @@ def view_template(&) def default_attrs { data: { - controller: "rbui--tabs", - rbui__tabs_active_value: @default + controller: "ruby_ui--tabs", + ruby_ui__tabs_active_value: @default } } end diff --git a/lib/rbui/tabs/tabs_content.rb b/lib/ruby_ui/tabs/tabs_content.rb similarity index 89% rename from lib/rbui/tabs/tabs_content.rb rename to lib/ruby_ui/tabs/tabs_content.rb index 5c7055f2..c27b7072 100644 --- a/lib/rbui/tabs/tabs_content.rb +++ b/lib/ruby_ui/tabs/tabs_content.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class TabsContent < Base def initialize(value:, **attrs) @value = value @@ -16,7 +16,7 @@ def view_template(&) def default_attrs { data: { - rbui__tabs_target: :content, + ruby_ui__tabs_target: :content, value: @value }, class: "mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 hidden" diff --git a/lib/ruby_ui/tabs/tabs_controller.js b/lib/ruby_ui/tabs/tabs_controller.js new file mode 100644 index 00000000..995df447 --- /dev/null +++ b/lib/ruby_ui/tabs/tabs_controller.js @@ -0,0 +1,45 @@ +import { Controller } from "@hotwired/stimulus"; + +// Connects to data-controller="ruby_ui--tabs" +export default class extends Controller { + static targets = ["trigger", "content"]; + static values = { active: String }; + + connect() { + if (!this.hasActiveValue && this.triggerTargets.length > 0) { + this.activeValue = this.triggerTargets[0].dataset.value; + } + } + + show(e) { + this.activeValue = e.currentTarget.dataset.value; + } + + activeValueChanged(currentValue, previousValue) { + if (currentValue == "" || currentValue == previousValue) return; + + this.contentTargets.forEach((el) => { + el.classList.add("hidden"); + }); + + this.triggerTargets.forEach((el) => { + el.dataset.state = "inactive"; + }); + + this.activeContentTarget() && + this.activeContentTarget().classList.remove("hidden"); + this.activeTriggerTarget().dataset.state = "active"; + } + + activeTriggerTarget() { + return this.triggerTargets.find( + (el) => el.dataset.value == this.activeValue, + ); + } + + activeContentTarget() { + return this.contentTargets.find( + (el) => el.dataset.value == this.activeValue, + ); + } +} diff --git a/lib/rbui/tabs/tabs_list.rb b/lib/ruby_ui/tabs/tabs_list.rb similarity index 95% rename from lib/rbui/tabs/tabs_list.rb rename to lib/ruby_ui/tabs/tabs_list.rb index aa31adc2..650e00c0 100644 --- a/lib/rbui/tabs/tabs_list.rb +++ b/lib/ruby_ui/tabs/tabs_list.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class TabsList < Base def view_template(&) div(**attrs, &) diff --git a/lib/rbui/tabs/tabs_trigger.rb b/lib/ruby_ui/tabs/tabs_trigger.rb similarity index 87% rename from lib/rbui/tabs/tabs_trigger.rb rename to lib/ruby_ui/tabs/tabs_trigger.rb index eac6b0df..64ddd904 100644 --- a/lib/rbui/tabs/tabs_trigger.rb +++ b/lib/ruby_ui/tabs/tabs_trigger.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class TabsTrigger < Base def initialize(value:, **attrs) @value = value @@ -17,8 +17,8 @@ def default_attrs { type: :button, data: { - rbui__tabs_target: "trigger", - action: "click->rbui--tabs#show", + ruby_ui__tabs_target: "trigger", + action: "click->ruby_ui--tabs#show", value: @value }, class: "inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow" diff --git a/lib/rbui/textarea/textarea.rb b/lib/ruby_ui/textarea/textarea.rb similarity index 80% rename from lib/rbui/textarea/textarea.rb rename to lib/ruby_ui/textarea/textarea.rb index 5600aabe..3fa2ef13 100644 --- a/lib/rbui/textarea/textarea.rb +++ b/lib/ruby_ui/textarea/textarea.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class Textarea < Base def initialize(rows: 4, **attrs) @rows = rows @@ -16,8 +16,8 @@ def view_template(&) def default_attrs { data: { - rbui__form_field_target: "input", - action: "input->rbui--form-field#onInput invalid->rbui--form-field#onInvalid" + ruby_ui__form_field_target: "input", + action: "input->ruby_ui--form-field#onInput invalid->ruby_ui--form-field#onInvalid" }, class: "flex w-full rounded-md border bg-background px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium focus-visible:outline-none focus-visible:ring-1 disabled:cursor-not-allowed disabled:opacity-50 border-border focus-visible:ring-ring placeholder:text-muted-foreground" } diff --git a/lib/rbui/theme_toggle/theme_toggle.rb b/lib/ruby_ui/theme_toggle/theme_toggle.rb similarity index 75% rename from lib/rbui/theme_toggle/theme_toggle.rb rename to lib/ruby_ui/theme_toggle/theme_toggle.rb index 3a14041c..a3a4b15f 100644 --- a/lib/rbui/theme_toggle/theme_toggle.rb +++ b/lib/ruby_ui/theme_toggle/theme_toggle.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class ThemeToggle < Base def view_template(&) div(**attrs, &) @@ -20,21 +20,21 @@ def dark_mode(**user_attrs, &) def default_attrs { - data: {controller: "rbui--theme-toggle"} + data: {controller: "ruby_ui--theme-toggle"} } end def default_light_attrs { class: "dark:hidden", - data: {action: "click->rbui--theme-toggle#setDarkTheme"} + data: {action: "click->ruby_ui--theme-toggle#setDarkTheme"} } end def default_dark_attrs { class: "hidden dark:inline-block", - data: {action: "click->rbui--theme-toggle#setLightTheme"} + data: {action: "click->ruby_ui--theme-toggle#setLightTheme"} } end end diff --git a/lib/rbui/theme_toggle/theme_toggle_controller.js b/lib/ruby_ui/theme_toggle/theme_toggle_controller.js similarity index 100% rename from lib/rbui/theme_toggle/theme_toggle_controller.js rename to lib/ruby_ui/theme_toggle/theme_toggle_controller.js diff --git a/lib/rbui/tooltip/tooltip.rb b/lib/ruby_ui/tooltip/tooltip.rb similarity index 75% rename from lib/rbui/tooltip/tooltip.rb rename to lib/ruby_ui/tooltip/tooltip.rb index 74e21677..83de01cd 100644 --- a/lib/rbui/tooltip/tooltip.rb +++ b/lib/ruby_ui/tooltip/tooltip.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class Tooltip < Base def initialize(placement: "top", **attrs) @placement = placement @@ -16,8 +16,8 @@ def view_template(&) def default_attrs { data: { - controller: "rbui--tooltip", - rbui__tooltip_placement_value: @placement + controller: "ruby_ui--tooltip", + ruby_ui__tooltip_placement_value: @placement }, class: "group" } diff --git a/lib/rbui/tooltip/tooltip_content.rb b/lib/ruby_ui/tooltip/tooltip_content.rb similarity index 61% rename from lib/rbui/tooltip/tooltip_content.rb rename to lib/ruby_ui/tooltip/tooltip_content.rb index 0cfe4377..6cdc0353 100644 --- a/lib/rbui/tooltip/tooltip_content.rb +++ b/lib/ruby_ui/tooltip/tooltip_content.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class TooltipContent < Base def initialize(**attrs) @id = "tooltip#{SecureRandom.hex(4)}" @@ -17,9 +17,9 @@ def default_attrs { id: @id, data: { - rbui__tooltip_target: "content" + ruby_ui__tooltip_target: "content" }, - class: "invisible peer-hover:visible peer-focus:visible w-max absolute top-0 left-0 z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md peer-focus:zoom-in-95 animate-out fade-out-0 zoom-out-95 peer-hover:animate-in peer-focus:animate-in peer-hover:fade-in-0 peer-focus:fade-in-0 peer-hover:zoom-in-95 group-data-[rbui--tooltip-placement-value=bottom]:slide-in-from-top-2 group-data-[rbui--tooltip-placement-value=left]:slide-in-from-right-2 group-data-[rbui--tooltip-placement-value=right]:slide-in-from-left-2 group-data-[rbui--tooltip-placement-value=top]:slide-in-from-bottom-2 delay-500" + class: "invisible peer-hover:visible peer-focus:visible w-max absolute top-0 left-0 z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md peer-focus:zoom-in-95 animate-out fade-out-0 zoom-out-95 peer-hover:animate-in peer-focus:animate-in peer-hover:fade-in-0 peer-focus:fade-in-0 peer-hover:zoom-in-95 group-data-[ruby_ui--tooltip-placement-value=bottom]:slide-in-from-top-2 group-data-[ruby_ui--tooltip-placement-value=left]:slide-in-from-right-2 group-data-[ruby_ui--tooltip-placement-value=right]:slide-in-from-left-2 group-data-[ruby_ui--tooltip-placement-value=top]:slide-in-from-bottom-2 delay-500" } end end diff --git a/lib/rbui/tooltip/tooltip_controller.js b/lib/ruby_ui/tooltip/tooltip_controller.js similarity index 100% rename from lib/rbui/tooltip/tooltip_controller.js rename to lib/ruby_ui/tooltip/tooltip_controller.js diff --git a/lib/rbui/tooltip/tooltip_trigger.rb b/lib/ruby_ui/tooltip/tooltip_trigger.rb similarity index 78% rename from lib/rbui/tooltip/tooltip_trigger.rb rename to lib/ruby_ui/tooltip/tooltip_trigger.rb index 6be872cb..a535e942 100644 --- a/lib/rbui/tooltip/tooltip_trigger.rb +++ b/lib/ruby_ui/tooltip/tooltip_trigger.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class TooltipTrigger < Base def view_template(&) div(**attrs, &) @@ -10,7 +10,7 @@ def view_template(&) def default_attrs { - data: {rbui__tooltip_target: "trigger"}, + data: {ruby_ui__tooltip_target: "trigger"}, variant: :outline, class: "peer" } diff --git a/lib/rbui/typography/heading.rb b/lib/ruby_ui/typography/heading.rb similarity index 98% rename from lib/rbui/typography/heading.rb rename to lib/ruby_ui/typography/heading.rb index 30a1dabe..bd883c0f 100644 --- a/lib/rbui/typography/heading.rb +++ b/lib/ruby_ui/typography/heading.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class Heading < Base def initialize(level: nil, as: nil, size: nil, **attrs) @level = level diff --git a/lib/rbui/typography/inline_code.rb b/lib/ruby_ui/typography/inline_code.rb similarity index 95% rename from lib/rbui/typography/inline_code.rb rename to lib/ruby_ui/typography/inline_code.rb index 277dc443..539c9617 100644 --- a/lib/rbui/typography/inline_code.rb +++ b/lib/ruby_ui/typography/inline_code.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class InlineCode < Base def view_template(&) code(**attrs, &) diff --git a/lib/rbui/typography/inline_link.rb b/lib/ruby_ui/typography/inline_link.rb similarity index 96% rename from lib/rbui/typography/inline_link.rb rename to lib/ruby_ui/typography/inline_link.rb index 02332273..07929dd1 100644 --- a/lib/rbui/typography/inline_link.rb +++ b/lib/ruby_ui/typography/inline_link.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class InlineLink < Base def initialize(href:, **attrs) super(**attrs) diff --git a/lib/rbui/typography/text.rb b/lib/ruby_ui/typography/text.rb similarity index 98% rename from lib/rbui/typography/text.rb rename to lib/ruby_ui/typography/text.rb index 71848699..b3945936 100644 --- a/lib/rbui/typography/text.rb +++ b/lib/ruby_ui/typography/text.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class Text < Base def initialize(as: "p", size: "3", weight: "regular", **attrs) @as = as diff --git a/lib/rbui/typography/typography_blockquote.rb b/lib/ruby_ui/typography/typography_blockquote.rb similarity index 94% rename from lib/rbui/typography/typography_blockquote.rb rename to lib/ruby_ui/typography/typography_blockquote.rb index fd93b320..b4d4e843 100644 --- a/lib/rbui/typography/typography_blockquote.rb +++ b/lib/ruby_ui/typography/typography_blockquote.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module RBUI +module RubyUI class TypographyBlockquote < Base def view_template(&) blockquote(**attrs, &) diff --git a/lib/rbui/version.rb b/lib/ruby_ui/version.rb similarity index 81% rename from lib/rbui/version.rb rename to lib/ruby_ui/version.rb index ce71ba2b..8b278664 100644 --- a/lib/rbui/version.rb +++ b/lib/ruby_ui/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true -module RBUI +module RubyUI VERSION = "1.0.0-alpha.4" end diff --git a/package.json b/package.json index 01e37a0e..95b2236f 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,14 @@ { "name": "ruby_ui_js", "version": "1.0.0-alpha.4", - "main": "lib/rbui/index.js", - "description": "Stimulus controllers for RbUI Component Library", - "homepage": "https://rbui.dev", + "main": "lib/ruby_ui/index.js", + "description": "Stimulus controllers for ruby_ui Component Library", + "homepage": "https://ruby_ui.dev", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [ - "RbUI", + "ruby_ui", "Stimulus", "StimulusJS", "StimulusControllers", @@ -18,7 +18,7 @@ ], "repository": { "type": "git", - "url": "https://github.com/rbui-hq/rbui.git" + "url": "https://github.com/ruby_ui-hq/ruby_ui.git" }, "author": "George Kettle", "license": "ISC", diff --git a/ruby_ui.gemspec b/ruby_ui.gemspec index dc5890c5..3e3747fe 100644 --- a/ruby_ui.gemspec +++ b/ruby_ui.gemspec @@ -1,8 +1,8 @@ -require_relative "lib/rbui/version" +require_relative "lib/ruby_ui/version" Gem::Specification.new do |s| s.name = "ruby_ui" - s.version = RBUI::VERSION + s.version = RubyUI::VERSION s.summary = "RubyUI is a UI Component Library for Ruby developers." s.description = "Ruby UI is a UI Component Library for Ruby developers. Built on top of the Phlex Framework." s.authors = ["George Kettle"] diff --git a/test/rbui/alert_dialog_test.rb b/test/rbui/alert_dialog_test.rb deleted file mode 100644 index 485ff02d..00000000 --- a/test/rbui/alert_dialog_test.rb +++ /dev/null @@ -1,29 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -class RBUI::AlertDialogTest < Minitest::Test - include Phlex::Testing::ViewHelper - - def test_render_with_all_items - output = phlex_context do - RBUI.AlertDialog do - RBUI.AlertDialogTrigger do - RBUI.Button { "Show dialog" } - end - RBUI.AlertDialogContent do - RBUI.AlertDialogHeader do - RBUI.AlertDialogTitle { "Are you absolutely sure?" } - RBUI.AlertDialogDescription { "This action cannot be undone. This will permanently delete your account and remove your data from our servers." } - end - RBUI.AlertDialogFooter do - RBUI.AlertDialogCancel { "Cancel" } - RBUI.AlertDialogAction { "Continue" } - end - end - end - end - - assert_match(/Show dialog/, output) - end -end diff --git a/test/rbui/calendar_test.rb b/test/rbui/calendar_test.rb deleted file mode 100644 index c5927ff7..00000000 --- a/test/rbui/calendar_test.rb +++ /dev/null @@ -1,16 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -class RBUI::CalendarTest < Minitest::Test - include Phlex::Testing::ViewHelper - - def test_render_with_all_items - output = phlex_context do - RBUI.Input(type: "string", placeholder: "Select a date", class: "rounded-md border shadow", id: "date", data_controller: "rbui--input") - RBUI.Calendar(input_id: "#date", class: "rounded-md border shadow") - end - - assert_match(/Select a date/, output) - end -end diff --git a/test/rbui/card_test.rb b/test/rbui/card_test.rb deleted file mode 100644 index 74e31b69..00000000 --- a/test/rbui/card_test.rb +++ /dev/null @@ -1,33 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -class RBUI::CardTest < Minitest::Test - include Phlex::Testing::ViewHelper - - def test_render_with_all_items - output = phlex_context do - RBUI.Card(class: "w-96") do - RBUI.CardHeader do - RBUI.CardTitle { 'You might like "RBUI"' } - RBUI.CardDescription { "@joeldrapper" } - end - RBUI.CardContent do - RBUI.AspectRatio(aspect_ratio: "16/9", class: "rounded-md overflow-hidden border") do |aspect_ratio| - aspect_ratio.img( - alt: "Placeholder", - loading: "lazy", - src: "https://avatars.githubusercontent.com/u/246692?v=4" - ) - end - end - RBUI.CardFooter(class: "flex justify-end gap-x-2") do - RBUI.Button(variant: :outline) { "See more" } - RBUI.Button(variant: :primary) { "Buy now" } - end - end - end - - assert_match(/You might like/, output) - end -end diff --git a/test/rbui/combobox_test.rb b/test/rbui/combobox_test.rb deleted file mode 100644 index d516c26f..00000000 --- a/test/rbui/combobox_test.rb +++ /dev/null @@ -1,51 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -class RBUI::ComboboxTest < Minitest::Test - include Phlex::Testing::ViewHelper - - def test_render_with_all_items - output = phlex_context do - RBUI.Combobox do - RBUI.ComboboxInput() - RBUI.ComboboxTrigger do - RBUI.ComboboxValue(placeholder: "Select event...") - end - RBUI.ComboboxContent do - RBUI.ComboboxSearchInput(placeholder: "Search event...") - RBUI.ComboboxList do - RBUI.ComboboxEmpty { "No results found." } - RBUI.ComboboxGroup(heading: "Suggestions") do - RBUI.ComboboxItem(value: "railsworld") do |item| - item.span { "Rails World" } - end - RBUI.ComboboxItem(value: "tropicalrb") do |item| - item.span { "Tropical.rb" } - end - RBUI.ComboboxItem(value: "friendly.rb") do |item| - item.span { "Friendly.rb" } - end - end - - RBUI.ComboboxSeparator() - - RBUI.ComboboxGroup(heading: "Others") do - RBUI.ComboboxItem(value: "railsconf") do |item| - item.span { "RailsConf" } - end - RBUI.ComboboxItem(value: "euruko") do |item| - item.span { "Euruko" } - end - RBUI.ComboboxItem(value: "rubykaigi") do |item| - item.span { "RubyKaigi" } - end - end - end - end - end - end - - assert_match(/Tropical.rb/, output) - end -end diff --git a/test/rbui/context_menu_test.rb b/test/rbui/context_menu_test.rb deleted file mode 100644 index c510d4c6..00000000 --- a/test/rbui/context_menu_test.rb +++ /dev/null @@ -1,31 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -class RBUI::ContextMenuTest < Minitest::Test - include Phlex::Testing::ViewHelper - - def test_render_with_all_items - output = phlex_context do - RBUI.ContextMenu do - RBUI.ContextMenuTrigger(class: "flex h-[150px] w-[300px] items-center justify-center rounded-md border border-dashed text-sm") { "Right click here" } - RBUI.ContextMenuContent(class: "w-64") do - RBUI.ContextMenuItem(href: "#", shortcut: "⌘[") { "Back" } - RBUI.ContextMenuItem(href: "#", shortcut: "⌘]", disabled: true) { "Forward" } - RBUI.ContextMenuItem(href: "#", shortcut: "⌘R") { "Reload" } - RBUI.ContextMenuSeparator - RBUI.ContextMenuItem(href: "#", shortcut: "⌘⇧B", checked: true) { "Show Bookmarks Bar" } - RBUI.ContextMenuItem(href: "#") { "Show Full URLs" } - RBUI.ContextMenuSeparator - RBUI.ContextMenuLabel(inset: true) { "More Tools" } - RBUI.ContextMenuSeparator - RBUI.ContextMenuItem(href: "#") { "Developer Tools" } - RBUI.ContextMenuItem(href: "#") { "Task Manager" } - RBUI.ContextMenuItem(href: "#") { "Extensions" } - end - end - end - - assert_match(/Right click here/, output) - end -end diff --git a/test/rbui/dialog_test.rb b/test/rbui/dialog_test.rb deleted file mode 100644 index 85cf8b74..00000000 --- a/test/rbui/dialog_test.rb +++ /dev/null @@ -1,38 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -class RBUI::DialogTest < Minitest::Test - include Phlex::Testing::ViewHelper - - def test_render_with_all_items - output = phlex_context do - RBUI.Dialog do - RBUI.DialogTrigger do - RBUI.Button { "Open Dialog" } - end - RBUI.DialogContent do - RBUI.DialogHeader do - RBUI.DialogTitle { "RBUI to the rescue" } - RBUI.DialogDescription { "RBUI helps you build accessible standard compliant web apps with ease" } - end - RBUI.DialogMiddle do - RBUI.AspectRatio(aspect_ratio: "16/9", class: "rounded-md overflow-hidden border") do |aspect| - aspect.img( - alt: "Placeholder", - loading: "lazy", - src: "https://avatars.githubusercontent.com/u/246692?v=4" - ) - end - end - RBUI.DialogFooter do - RBUI.Button(variant: :outline, data: {action: "click->rbui--dialog#dismiss"}) { "Cancel" } - RBUI.Button { "Save" } - end - end - end - end - - assert_match(/Open Dialog/, output) - end -end diff --git a/test/rbui/dropdown_menu_test.rb b/test/rbui/dropdown_menu_test.rb deleted file mode 100644 index 3eda7925..00000000 --- a/test/rbui/dropdown_menu_test.rb +++ /dev/null @@ -1,27 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -class RBUI::DropdownMenuTest < Minitest::Test - include Phlex::Testing::ViewHelper - - def test_render_with_all_items - output = phlex_context do - RBUI.DropdownMenu do - RBUI.DropdownMenuTrigger(class: "w-full") do - RBUI.Button(variant: :outline) { "Open" } - end - RBUI.DropdownMenuContent do - RBUI.DropdownMenuLabel { "My Account" } - RBUI.DropdownMenuSeparator - RBUI.DropdownMenuItem(href: "#") { "Profile" } - RBUI.DropdownMenuItem(href: "#") { "Billing" } - RBUI.DropdownMenuItem(href: "#") { "Team" } - RBUI.DropdownMenuItem(href: "#") { "Subscription" } - end - end - end - - assert_match(/Open/, output) - end -end diff --git a/test/rbui/form_test.rb b/test/rbui/form_test.rb deleted file mode 100644 index 572f88e0..00000000 --- a/test/rbui/form_test.rb +++ /dev/null @@ -1,22 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -class RBUI::FormTest < Minitest::Test - include Phlex::Testing::ViewHelper - - def test_render_with_all_items - output = phlex_context do - RBUI.Form do - RBUI.FormField do - RBUI.FormFieldLabel { "Label" } - RBUI.Input(placeholder: "Joel Drapper", required: true, minlength: "3") { "Joel Drapper" } - RBUI.FormFieldHint() - RBUI.FormFieldError() - end - end - end - - assert_match(/Joel/, output) - end -end diff --git a/test/rbui/hover_card_test.rb b/test/rbui/hover_card_test.rb deleted file mode 100644 index 455bfc0d..00000000 --- a/test/rbui/hover_card_test.rb +++ /dev/null @@ -1,27 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -class RBUI::HoverCardTest < Minitest::Test - include Phlex::Testing::ViewHelper - - def test_render_with_all_items - output = phlex_context do - RBUI.HoverCard do - RBUI.HoverCardTrigger do - RBUI.Button(variant: :link) { "@joeldrapper" } - end - RBUI.HoverCardContent do |card_content| - card_content.div(class: "flex justify-between space-x-4") do - RBUI.Avatar do - RBUI.AvatarImage(src: "https://avatars.githubusercontent.com/u/246692?v=4", alt: "joeldrapper") - RBUI.AvatarFallback { "JD" } - end - end - end - end - end - - assert_match(/joeldrapper/, output) - end -end diff --git a/test/rbui/pagination_test.rb b/test/rbui/pagination_test.rb deleted file mode 100644 index 68974e52..00000000 --- a/test/rbui/pagination_test.rb +++ /dev/null @@ -1,39 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -class RBUI::PaginationTest < Minitest::Test - include Phlex::Testing::ViewHelper - - def test_render_with_all_items - output = phlex_context do - RBUI.Pagination do - RBUI.PaginationContent do - RBUI.PaginationItem(href: "#") do |item| - item.plain "First" - end - RBUI.PaginationItem(href: "#") do |item| - item.plain "Prev" - end - - RBUI.PaginationEllipsis - - RBUI.PaginationItem(href: "#") { "4" } - RBUI.PaginationItem(href: "#", active: true) { "5" } - RBUI.PaginationItem(href: "#") { "6" } - - RBUI.PaginationEllipsis - - RBUI.PaginationItem(href: "#") do |item| - item.plain "Next" - end - RBUI.PaginationItem(href: "#") do |item| - item.plain "Last" - end - end - end - end - - assert_match(/First/, output) - end -end diff --git a/test/rbui/popover_test.rb b/test/rbui/popover_test.rb deleted file mode 100644 index 610a1c3a..00000000 --- a/test/rbui/popover_test.rb +++ /dev/null @@ -1,30 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -class RBUI::PopoverTest < Minitest::Test - include Phlex::Testing::ViewHelper - - def test_render_with_all_items - output = phlex_context do - RBUI.Popover do - RBUI.PopoverTrigger(class: "w-full") do - RBUI.Button(variant: :outline) { "Open Popover" } - end - RBUI.PopoverContent(class: "w-40") do - RBUI.Link(href: "#", variant: :ghost, class: "block w-full justify-start pl-2") do |link| - link.plain "Profile" - end - RBUI.Link(href: "#", variant: :ghost, class: "block w-full justify-start pl-2") do |link| - link.plain "Settings" - end - RBUI.Link(href: "#", variant: :ghost, class: "block w-full justify-start pl-2") do |link| - link.plain "Logout" - end - end - end - end - - assert_match(/Profile/, output) - end -end diff --git a/test/rbui/setup_test.rb b/test/rbui/setup_test.rb deleted file mode 100644 index 8e796121..00000000 --- a/test/rbui/setup_test.rb +++ /dev/null @@ -1,31 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -class RBUI::SetupTest < Minitest::Test - def setup - @original_namespace = RBUI.namespace - end - - def teardown - RBUI.namespace = @original_namespace - Object.send(:remove_const, :UI) if Object.const_defined?(:UI) - end - - def test_default_namespace - RBUI.setup {} - - assert_nil RBUI.namespace - assert_kind_of RBUI::Base, RBUI::Button.new - end - - def test_custom_namespace - RBUI.setup do |config| - config.namespace = "UI" - end - - assert_equal "UI", RBUI.namespace - assert_equal RBUI::Base, UI::Base - assert_kind_of RBUI::Base, UI::Button.new - end -end diff --git a/test/rbui/sheet_test.rb b/test/rbui/sheet_test.rb deleted file mode 100644 index 17a3e78e..00000000 --- a/test/rbui/sheet_test.rb +++ /dev/null @@ -1,35 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -class RBUI::SheetTest < Minitest::Test - include Phlex::Testing::ViewHelper - - def test_render_with_all_items - output = phlex_context do - RBUI.Sheet do - RBUI.SheetTrigger do - RBUI.Button(variant: :outline) { "Open Sheet" } - end - - RBUI.SheetContent(class: "sm:max-w-sm") do - RBUI.SheetHeader do - RBUI.SheetTitle { "Edit profile" } - RBUI.SheetDescription { "Make changes to your profile here. Click save when you're done." } - end - RBUI.SheetMiddle do - RBUI.Input(placeholder: "Joel Drapper") { "Joel Drapper" } - RBUI.Input(placeholder: "joel@drapper.me") - - RBUI.SheetFooter do - RBUI.Button(variant: :outline, data: {action: "click->rbui--sheet-content#close"}) { "Cancel" } - RBUI.Button(type: "submit") { "Save" } - end - end - end - end - end - - assert_match(/Open Sheet/, output) - end -end diff --git a/test/rbui/table_test.rb b/test/rbui/table_test.rb deleted file mode 100644 index a9f9b7ae..00000000 --- a/test/rbui/table_test.rb +++ /dev/null @@ -1,48 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -class RBUI::TableTest < Minitest::Test - include Phlex::Testing::ViewHelper - - def test_render_with_all_items - invoices = [ - {identifier: "INV-0001", status: "Active", method: "Credit Card", amount: 100}, - {identifier: "INV-0002", status: "Active", method: "Bank Transfer", amount: 230}, - {identifier: "INV-0003", status: "Pending", method: "PayPal", amount: 350}, - {identifier: "INV-0004", status: "Inactive", method: "Credit Card", amount: 100} - ] - - output = phlex_context do - RBUI.Table do - RBUI.TableCaption { "Employees at Acme inc." } - RBUI.TableHeader do - RBUI.TableRow do - RBUI.TableHead { "Name" } - RBUI.TableHead { "Email" } - RBUI.TableHead { "Status" } - RBUI.TableHead(class: "text-right") { "Role" } - end - end - RBUI.TableBody do - invoices.each do |invoice| - RBUI.TableRow do - RBUI.TableCell(class: "font-medium") { invoice[:identifier] } - RBUI.TableCell { invoice[:status] } - RBUI.TableCell { invoice[:method] } - RBUI.TableCell(class: "text-right") { invoice[:amount] } - end - end - end - RBUI.TableFooter do - RBUI.TableRow do - RBUI.TableHead(class: "font-medium", colspan: 3) { "Total" } - RBUI.TableHead(class: "font-medium text-right") { invoices.sum { |invoice| invoice[:amount] } } - end - end - end - end - - assert_match(/Total/, output) - end -end diff --git a/test/rbui/tabs_test.rb b/test/rbui/tabs_test.rb deleted file mode 100644 index 4e6e4255..00000000 --- a/test/rbui/tabs_test.rb +++ /dev/null @@ -1,29 +0,0 @@ -# frozen_string_literal: true - -require "test_helper" - -class RBUI::TabsTest < Minitest::Test - include Phlex::Testing::ViewHelper - - def test_render_with_all_items - output = phlex_context do - RBUI.Tabs(default_value: "account", class: "w-96") do - RBUI.TabsList do - RBUI.TabsTrigger(value: "account") { "Account" } - RBUI.TabsTrigger(value: "password") { "Password" } - end - RBUI.TabsContent(value: "account") do - RBUI::Text(as: "p", size: "4") { "Account" } - RBUI::Text(size: "5", weight: "semibold") { "Are you sure absolutely sure?" } - RBUI::Text(size: "2", class: "text-muted-foreground") { "Update your account details." } - end - RBUI.TabsContent(value: "password") do - RBUI::Text(as: "p", size: "4") { "Password" } - RBUI::Text(size: "2", class: "text-muted-foreground") { "Change your password here. After saving, you'll be logged out." } - end - end - end - - assert_match(/Account/, output) - end -end diff --git a/test/rbui/accordion_test.rb b/test/ruby_ui/accordion_test.rb similarity index 62% rename from test/rbui/accordion_test.rb rename to test/ruby_ui/accordion_test.rb index 464caf61..38a8ac0f 100644 --- a/test/rbui/accordion_test.rb +++ b/test/ruby_ui/accordion_test.rb @@ -2,29 +2,29 @@ require "test_helper" -class RBUI::AccordionTest < Minitest::Test +class RubyUI::AccordionTest < Minitest::Test include Phlex::Testing::ViewHelper def test_render_with_default_items output = phlex_context do - RBUI.Accordion do - RBUI.AccordionItem do - RBUI.AccordionDefaultTrigger { "Title" } - RBUI.AccordionDefaultContent { "Content" } + RubyUI.Accordion do + RubyUI.AccordionItem do + RubyUI.AccordionDefaultTrigger { "Title" } + RubyUI.AccordionDefaultContent { "Content" } end end end - assert_match(/
ruby_ui--dialog#dismiss"}) { "Cancel" } + RubyUI.Button { "Save" } + end + end + end + end + + assert_match(/Open Dialog/, output) + end +end diff --git a/test/ruby_ui/dropdown_menu_test.rb b/test/ruby_ui/dropdown_menu_test.rb new file mode 100644 index 00000000..4e0df149 --- /dev/null +++ b/test/ruby_ui/dropdown_menu_test.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +require "test_helper" + +class RubyUI::DropdownMenuTest < Minitest::Test + include Phlex::Testing::ViewHelper + + def test_render_with_all_items + output = phlex_context do + RubyUI.DropdownMenu do + RubyUI.DropdownMenuTrigger(class: "w-full") do + RubyUI.Button(variant: :outline) { "Open" } + end + RubyUI.DropdownMenuContent do + RubyUI.DropdownMenuLabel { "My Account" } + RubyUI.DropdownMenuSeparator + RubyUI.DropdownMenuItem(href: "#") { "Profile" } + RubyUI.DropdownMenuItem(href: "#") { "Billing" } + RubyUI.DropdownMenuItem(href: "#") { "Team" } + RubyUI.DropdownMenuItem(href: "#") { "Subscription" } + end + end + end + + assert_match(/Open/, output) + end +end diff --git a/test/ruby_ui/form_test.rb b/test/ruby_ui/form_test.rb new file mode 100644 index 00000000..33871e71 --- /dev/null +++ b/test/ruby_ui/form_test.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +require "test_helper" + +class RubyUI::FormTest < Minitest::Test + include Phlex::Testing::ViewHelper + + def test_render_with_all_items + output = phlex_context do + RubyUI.Form do + RubyUI.FormField do + RubyUI.FormFieldLabel { "Label" } + RubyUI.Input(placeholder: "Joel Drapper", required: true, minlength: "3") { "Joel Drapper" } + RubyUI.FormFieldHint() + RubyUI.FormFieldError() + end + end + end + + assert_match(/Joel/, output) + end +end diff --git a/test/ruby_ui/hover_card_test.rb b/test/ruby_ui/hover_card_test.rb new file mode 100644 index 00000000..16bc1f14 --- /dev/null +++ b/test/ruby_ui/hover_card_test.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +require "test_helper" + +class RubyUI::HoverCardTest < Minitest::Test + include Phlex::Testing::ViewHelper + + def test_render_with_all_items + output = phlex_context do + RubyUI.HoverCard do + RubyUI.HoverCardTrigger do + RubyUI.Button(variant: :link) { "@joeldrapper" } + end + RubyUI.HoverCardContent do |card_content| + card_content.div(class: "flex justify-between space-x-4") do + RubyUI.Avatar do + RubyUI.AvatarImage(src: "https://avatars.githubusercontent.com/u/246692?v=4", alt: "joeldrapper") + RubyUI.AvatarFallback { "JD" } + end + end + end + end + end + + assert_match(/joeldrapper/, output) + end +end diff --git a/test/rbui/inline_code_test.rb b/test/ruby_ui/inline_code_test.rb similarity index 79% rename from test/rbui/inline_code_test.rb rename to test/ruby_ui/inline_code_test.rb index fdb50d3c..501c3330 100644 --- a/test/rbui/inline_code_test.rb +++ b/test/ruby_ui/inline_code_test.rb @@ -2,12 +2,12 @@ require "test_helper" -class RBUI::InlineCodeTest < Minitest::Test +class RubyUI::InlineCodeTest < Minitest::Test include Phlex::Testing::ViewHelper def test_render_inline_code output = phlex_context do - RBUI::InlineCode() { "This is an inline code block" } + RubyUI::InlineCode() { "This is an inline code block" } end assert_match("This is an inline code block", output) diff --git a/test/rbui/inline_link_test.rb b/test/ruby_ui/inline_link_test.rb similarity index 79% rename from test/rbui/inline_link_test.rb rename to test/ruby_ui/inline_link_test.rb index 2340a391..6f646fda 100644 --- a/test/rbui/inline_link_test.rb +++ b/test/ruby_ui/inline_link_test.rb @@ -2,12 +2,12 @@ require "test_helper" -class RBUI::InlineLinkTest < Minitest::Test +class RubyUI::InlineLinkTest < Minitest::Test include Phlex::Testing::ViewHelper def test_render_inline_link output = phlex_context do - RBUI::InlineLink(href: "#") { "Link" } + RubyUI::InlineLink(href: "#") { "Link" } end assert_match(/Link/, output) diff --git a/test/rbui/input_test.rb b/test/ruby_ui/input_test.rb similarity index 67% rename from test/rbui/input_test.rb rename to test/ruby_ui/input_test.rb index 3380e9b7..7f6d48e8 100644 --- a/test/rbui/input_test.rb +++ b/test/ruby_ui/input_test.rb @@ -2,12 +2,12 @@ require "test_helper" -class RBUI::InputTest < Minitest::Test +class RubyUI::InputTest < Minitest::Test include Phlex::Testing::ViewHelper def test_render_with_all_items output = phlex_context do - RBUI.Input(type: "email", placeholder: "Email") + RubyUI.Input(type: "email", placeholder: "Email") end assert_match(/Email/, output) @@ -15,7 +15,7 @@ def test_render_with_all_items def test_render_with_value output = phlex_context do - RBUI.Input(type: "email", value: "user@email.com") + RubyUI.Input(type: "email", value: "user@email.com") end assert_match(/user@email.com/, output) diff --git a/test/rbui/link_test.rb b/test/ruby_ui/link_test.rb similarity index 72% rename from test/rbui/link_test.rb rename to test/ruby_ui/link_test.rb index 53faa885..85b2e6aa 100644 --- a/test/rbui/link_test.rb +++ b/test/ruby_ui/link_test.rb @@ -2,12 +2,12 @@ require "test_helper" -class RBUI::LinkTest < Minitest::Test +class RubyUI::LinkTest < Minitest::Test include Phlex::Testing::ViewHelper def test_render_with_all_items output = phlex_context do - RBUI.Link(href: "#") { "Link" } + RubyUI.Link(href: "#") { "Link" } end assert_match(/Link/, output) diff --git a/test/ruby_ui/pagination_test.rb b/test/ruby_ui/pagination_test.rb new file mode 100644 index 00000000..036c2c95 --- /dev/null +++ b/test/ruby_ui/pagination_test.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +require "test_helper" + +class RubyUI::PaginationTest < Minitest::Test + include Phlex::Testing::ViewHelper + + def test_render_with_all_items + output = phlex_context do + RubyUI.Pagination do + RubyUI.PaginationContent do + RubyUI.PaginationItem(href: "#") do |item| + item.plain "First" + end + RubyUI.PaginationItem(href: "#") do |item| + item.plain "Prev" + end + + RubyUI.PaginationEllipsis + + RubyUI.PaginationItem(href: "#") { "4" } + RubyUI.PaginationItem(href: "#", active: true) { "5" } + RubyUI.PaginationItem(href: "#") { "6" } + + RubyUI.PaginationEllipsis + + RubyUI.PaginationItem(href: "#") do |item| + item.plain "Next" + end + RubyUI.PaginationItem(href: "#") do |item| + item.plain "Last" + end + end + end + end + + assert_match(/First/, output) + end +end diff --git a/test/ruby_ui/popover_test.rb b/test/ruby_ui/popover_test.rb new file mode 100644 index 00000000..4baccc9e --- /dev/null +++ b/test/ruby_ui/popover_test.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +require "test_helper" + +class RubyUI::PopoverTest < Minitest::Test + include Phlex::Testing::ViewHelper + + def test_render_with_all_items + output = phlex_context do + RubyUI.Popover do + RubyUI.PopoverTrigger(class: "w-full") do + RubyUI.Button(variant: :outline) { "Open Popover" } + end + RubyUI.PopoverContent(class: "w-40") do + RubyUI.Link(href: "#", variant: :ghost, class: "block w-full justify-start pl-2") do |link| + link.plain "Profile" + end + RubyUI.Link(href: "#", variant: :ghost, class: "block w-full justify-start pl-2") do |link| + link.plain "Settings" + end + RubyUI.Link(href: "#", variant: :ghost, class: "block w-full justify-start pl-2") do |link| + link.plain "Logout" + end + end + end + end + + assert_match(/Profile/, output) + end +end diff --git a/test/rbui/select_test.rb b/test/ruby_ui/select_test.rb similarity index 56% rename from test/rbui/select_test.rb rename to test/ruby_ui/select_test.rb index 6ebbf5a7..14e223ab 100644 --- a/test/rbui/select_test.rb +++ b/test/ruby_ui/select_test.rb @@ -2,7 +2,7 @@ require "test_helper" -class RBUI::SelectTest < Minitest::Test +class RubyUI::SelectTest < Minitest::Test include Phlex::Testing::ViewHelper def test_render_with_all_items @@ -13,15 +13,15 @@ def test_render_with_all_items ] output = phlex_context do - RBUI.Select do - RBUI.SelectInput(name: "NAME") - RBUI.SelectTrigger do - RBUI.SelectValue(placeholder: "Placeholder") + RubyUI.Select do + RubyUI.SelectInput(name: "NAME") + RubyUI.SelectTrigger do + RubyUI.SelectValue(placeholder: "Placeholder") end - RBUI.SelectContent(outlet_id: "1") do - RBUI.SelectGroup do + RubyUI.SelectContent(outlet_id: "1") do + RubyUI.SelectGroup do people.each do |person| - RBUI.SelectItem(value: person[1]) { person[0] } + RubyUI.SelectItem(value: person[1]) { person[0] } end end end diff --git a/test/ruby_ui/setup_test.rb b/test/ruby_ui/setup_test.rb new file mode 100644 index 00000000..76f0a59d --- /dev/null +++ b/test/ruby_ui/setup_test.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +require "test_helper" + +class RubyUI::SetupTest < Minitest::Test + def setup + @original_namespace = RubyUI.namespace + end + + def teardown + RubyUI.namespace = @original_namespace + Object.send(:remove_const, :UI) if Object.const_defined?(:UI) + end + + def test_default_namespace + RubyUI.setup {} + + assert_nil RubyUI.namespace + assert_kind_of RubyUI::Base, RubyUI::Button.new + end + + def test_custom_namespace + RubyUI.setup do |config| + config.namespace = "UI" + end + + assert_equal "UI", RubyUI.namespace + assert_equal RubyUI::Base, UI::Base + assert_kind_of RubyUI::Base, UI::Button.new + end +end diff --git a/test/ruby_ui/sheet_test.rb b/test/ruby_ui/sheet_test.rb new file mode 100644 index 00000000..8d66e109 --- /dev/null +++ b/test/ruby_ui/sheet_test.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +require "test_helper" + +class RubyUI::SheetTest < Minitest::Test + include Phlex::Testing::ViewHelper + + def test_render_with_all_items + output = phlex_context do + RubyUI.Sheet do + RubyUI.SheetTrigger do + RubyUI.Button(variant: :outline) { "Open Sheet" } + end + + RubyUI.SheetContent(class: "sm:max-w-sm") do + RubyUI.SheetHeader do + RubyUI.SheetTitle { "Edit profile" } + RubyUI.SheetDescription { "Make changes to your profile here. Click save when you're done." } + end + RubyUI.SheetMiddle do + RubyUI.Input(placeholder: "Joel Drapper") { "Joel Drapper" } + RubyUI.Input(placeholder: "joel@drapper.me") + + RubyUI.SheetFooter do + RubyUI.Button(variant: :outline, data: {action: "click->ruby_ui--sheet-content#close"}) { "Cancel" } + RubyUI.Button(type: "submit") { "Save" } + end + end + end + end + end + + assert_match(/Open Sheet/, output) + end +end diff --git a/test/rbui/shortcut_key_test.rb b/test/ruby_ui/shortcut_key_test.rb similarity index 77% rename from test/rbui/shortcut_key_test.rb rename to test/ruby_ui/shortcut_key_test.rb index ffbafbf9..55b12262 100644 --- a/test/rbui/shortcut_key_test.rb +++ b/test/ruby_ui/shortcut_key_test.rb @@ -2,12 +2,12 @@ require "test_helper" -class RBUI::ShortcutKeyTest < Minitest::Test +class RubyUI::ShortcutKeyTest < Minitest::Test include Phlex::Testing::ViewHelper def test_render_with_all_items output = phlex_context do - RBUI.ShortcutKey do |shortcut| + RubyUI.ShortcutKey do |shortcut| shortcut.span(class: "text-xs") { "⌘" } shortcut.plain "K" end diff --git a/test/ruby_ui/table_test.rb b/test/ruby_ui/table_test.rb new file mode 100644 index 00000000..3983f28d --- /dev/null +++ b/test/ruby_ui/table_test.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +require "test_helper" + +class RubyUI::TableTest < Minitest::Test + include Phlex::Testing::ViewHelper + + def test_render_with_all_items + invoices = [ + {identifier: "INV-0001", status: "Active", method: "Credit Card", amount: 100}, + {identifier: "INV-0002", status: "Active", method: "Bank Transfer", amount: 230}, + {identifier: "INV-0003", status: "Pending", method: "PayPal", amount: 350}, + {identifier: "INV-0004", status: "Inactive", method: "Credit Card", amount: 100} + ] + + output = phlex_context do + RubyUI.Table do + RubyUI.TableCaption { "Employees at Acme inc." } + RubyUI.TableHeader do + RubyUI.TableRow do + RubyUI.TableHead { "Name" } + RubyUI.TableHead { "Email" } + RubyUI.TableHead { "Status" } + RubyUI.TableHead(class: "text-right") { "Role" } + end + end + RubyUI.TableBody do + invoices.each do |invoice| + RubyUI.TableRow do + RubyUI.TableCell(class: "font-medium") { invoice[:identifier] } + RubyUI.TableCell { invoice[:status] } + RubyUI.TableCell { invoice[:method] } + RubyUI.TableCell(class: "text-right") { invoice[:amount] } + end + end + end + RubyUI.TableFooter do + RubyUI.TableRow do + RubyUI.TableHead(class: "font-medium", colspan: 3) { "Total" } + RubyUI.TableHead(class: "font-medium text-right") { invoices.sum { |invoice| invoice[:amount] } } + end + end + end + end + + assert_match(/Total/, output) + end +end diff --git a/test/ruby_ui/tabs_test.rb b/test/ruby_ui/tabs_test.rb new file mode 100644 index 00000000..374cccc1 --- /dev/null +++ b/test/ruby_ui/tabs_test.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +require "test_helper" + +class RubyUI::TabsTest < Minitest::Test + include Phlex::Testing::ViewHelper + + def test_render_with_all_items + output = phlex_context do + RubyUI.Tabs(default_value: "account", class: "w-96") do + RubyUI.TabsList do + RubyUI.TabsTrigger(value: "account") { "Account" } + RubyUI.TabsTrigger(value: "password") { "Password" } + end + RubyUI.TabsContent(value: "account") do + RubyUI::Text(as: "p", size: "4") { "Account" } + RubyUI::Text(size: "5", weight: "semibold") { "Are you sure absolutely sure?" } + RubyUI::Text(size: "2", class: "text-muted-foreground") { "Update your account details." } + end + RubyUI.TabsContent(value: "password") do + RubyUI::Text(as: "p", size: "4") { "Password" } + RubyUI::Text(size: "2", class: "text-muted-foreground") { "Change your password here. After saving, you'll be logged out." } + end + end + end + + assert_match(/Account/, output) + end +end diff --git a/test/rbui/text_test.rb b/test/ruby_ui/text_test.rb similarity index 76% rename from test/rbui/text_test.rb rename to test/ruby_ui/text_test.rb index 03b0fd44..dba4f73d 100644 --- a/test/rbui/text_test.rb +++ b/test/ruby_ui/text_test.rb @@ -2,13 +2,13 @@ require "test_helper" -class RBUI::TypographyTest < Minitest::Test +class RubyUI::TypographyTest < Minitest::Test include Phlex::Testing::ViewHelper def test_heading_with_levels (1..4).each do |level| output = phlex_context do - RBUI::Heading(level: level.to_s) { "This is an H#{level} title" } + RubyUI::Heading(level: level.to_s) { "This is an H#{level} title" } end assert_match("This is an H#{level} title", output) @@ -18,7 +18,7 @@ def test_heading_with_levels def test_heading_with_custom_size output = phlex_context do - RBUI::Heading(as: "h2", size: "7") { "Custom Heading" } + RubyUI::Heading(as: "h2", size: "7") { "Custom Heading" } end assert_match("Custom Heading", output) @@ -29,7 +29,7 @@ def test_heading_with_custom_size def test_text_with_sizes (1..9).each do |size| output = phlex_context do - RBUI::Text(size: size.to_s) { "Size #{size} text" } + RubyUI::Text(size: size.to_s) { "Size #{size} text" } end assert_match("Size #{size} text", output) @@ -48,7 +48,7 @@ def test_text_with_sizes def test_text_with_weights %w[light regular medium bold].each do |weight| output = phlex_context do - RBUI::Text(weight: weight) { "#{weight.capitalize} text" } + RubyUI::Text(weight: weight) { "#{weight.capitalize} text" } end assert_match("#{weight.capitalize} text", output) @@ -59,7 +59,7 @@ def test_text_with_weights def test_text_as_different_elements %w[p span div label].each do |element| output = phlex_context do - RBUI::Text(as: element) { element.capitalize.to_s } + RubyUI::Text(as: element) { element.capitalize.to_s } end assert_match(element.capitalize.to_s, output) @@ -69,7 +69,7 @@ def test_text_as_different_elements def test_lead_text output = phlex_context do - RBUI::Text(as: "p", size: "5", weight: "medium") { "A modal dialog that interrupts the user." } + RubyUI::Text(as: "p", size: "5", weight: "medium") { "A modal dialog that interrupts the user." } end assert_match("A modal dialog that interrupts the user.", output) @@ -79,7 +79,7 @@ def test_lead_text def test_large_text output = phlex_context do - RBUI::Text(size: "5", weight: "semibold") { "Are you sure absolutely sure?" } + RubyUI::Text(size: "5", weight: "semibold") { "Are you sure absolutely sure?" } end assert_match("Are you sure absolutely sure?", output) @@ -89,7 +89,7 @@ def test_large_text def test_small_text output = phlex_context do - RBUI::Text(size: "2", weight: "medium") { "Email address" } + RubyUI::Text(size: "2", weight: "medium") { "Email address" } end assert_match("Email address", output) @@ -99,7 +99,7 @@ def test_small_text def test_muted_text output = phlex_context do - RBUI::Text(size: "2", class: "text-muted-foreground") { "Enter your email address." } + RubyUI::Text(size: "2", class: "text-muted-foreground") { "Enter your email address." } end assert_match("Enter your email address.", output) diff --git a/test/rbui/textarea_test.rb b/test/ruby_ui/textarea_test.rb similarity index 70% rename from test/rbui/textarea_test.rb rename to test/ruby_ui/textarea_test.rb index 9174e70a..5513ff22 100644 --- a/test/rbui/textarea_test.rb +++ b/test/ruby_ui/textarea_test.rb @@ -2,12 +2,12 @@ require "test_helper" -class RBUI::TextareaTest < Minitest::Test +class RubyUI::TextareaTest < Minitest::Test include Phlex::Testing::ViewHelper def test_render_with_all_items output = phlex_context do - RBUI.Textarea(rows: 4, placeholder: "Comment") + RubyUI.Textarea(rows: 4, placeholder: "Comment") end assert_match(/Comment/, output) @@ -15,7 +15,7 @@ def test_render_with_all_items def test_render_with_value output = phlex_context do - RBUI.Textarea { "Value" } + RubyUI.Textarea { "Value" } end assert_match(/Value/, output) diff --git a/test/rbui/theme_toggle_test.rb b/test/ruby_ui/theme_toggle_test.rb similarity index 60% rename from test/rbui/theme_toggle_test.rb rename to test/ruby_ui/theme_toggle_test.rb index 31e06e00..d514aa27 100644 --- a/test/rbui/theme_toggle_test.rb +++ b/test/ruby_ui/theme_toggle_test.rb @@ -2,18 +2,18 @@ require "test_helper" -class RBUI::ThemeToggleTest < Minitest::Test +class RubyUI::ThemeToggleTest < Minitest::Test include Phlex::Testing::ViewHelper def test_render_with_all_items output = phlex_context do - RBUI.ThemeToggle do |toggle| + RubyUI.ThemeToggle do |toggle| toggle.light_mode do - RBUI.Button(variant: :primary) { "Light" } + RubyUI.Button(variant: :primary) { "Light" } end toggle.dark_mode do - RBUI.Button(variant: :primary) { "Dark" } + RubyUI.Button(variant: :primary) { "Dark" } end end end diff --git a/test/rbui/tooltip_test.rb b/test/ruby_ui/tooltip_test.rb similarity index 50% rename from test/rbui/tooltip_test.rb rename to test/ruby_ui/tooltip_test.rb index 6beeac4e..eca36ebf 100644 --- a/test/rbui/tooltip_test.rb +++ b/test/ruby_ui/tooltip_test.rb @@ -2,17 +2,17 @@ require "test_helper" -class RBUI::TooltipTest < Minitest::Test +class RubyUI::TooltipTest < Minitest::Test include Phlex::Testing::ViewHelper def test_render_with_all_items output = phlex_context do - RBUI.Tooltip do - RBUI.TooltipTrigger do - RBUI.Button(variant: :outline, icon: true) { "?" } + RubyUI.Tooltip do + RubyUI.TooltipTrigger do + RubyUI.Button(variant: :outline, icon: true) { "?" } end - RBUI.TooltipContent do - RBUI::Text(as: "p") { "Add to library" } + RubyUI.TooltipContent do + RubyUI::Text(as: "p") { "Add to library" } end end end