From 3047fc3ebc1a1e328181b8f6722a05e8f1fe5181 Mon Sep 17 00:00:00 2001 From: Jakob Skjerning Date: Fri, 27 Feb 2026 11:34:18 +0100 Subject: [PATCH 1/2] Add Flowbite::Timeline component Implement default timeline component with wrapper and item sub-component, including tests and Lookbook preview. Co-Authored-By: Claude Opus 4.6 --- Gemfile.lock | 419 ++++++++++++++++++ app/components/flowbite/timeline.rb | 36 ++ app/components/flowbite/timeline/item.rb | 69 +++ .../flowbite/timeline/item/item.html.erb | 6 + .../flowbite/timeline/timeline.html.erb | 3 + claude.md | 7 + .../components/previews/timeline_preview.rb | 19 + test/components/flowbite/timeline_test.rb | 98 ++++ 8 files changed, 657 insertions(+) create mode 100644 Gemfile.lock create mode 100644 app/components/flowbite/timeline.rb create mode 100644 app/components/flowbite/timeline/item.rb create mode 100644 app/components/flowbite/timeline/item/item.html.erb create mode 100644 app/components/flowbite/timeline/timeline.html.erb create mode 100644 claude.md create mode 100644 demo/test/components/previews/timeline_preview.rb create mode 100644 test/components/flowbite/timeline_test.rb diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..9271acd --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,419 @@ +PATH + remote: . + specs: + flowbite-components (0.2.1) + view_component (>= 4.0.0) + +GEM + remote: https://rubygems.org/ + specs: + action_text-trix (2.1.16) + railties + actioncable (8.1.2) + actionpack (= 8.1.2) + activesupport (= 8.1.2) + nio4r (~> 2.0) + websocket-driver (>= 0.6.1) + zeitwerk (~> 2.6) + actionmailbox (8.1.2) + actionpack (= 8.1.2) + activejob (= 8.1.2) + activerecord (= 8.1.2) + activestorage (= 8.1.2) + activesupport (= 8.1.2) + mail (>= 2.8.0) + actionmailer (8.1.2) + actionpack (= 8.1.2) + actionview (= 8.1.2) + activejob (= 8.1.2) + activesupport (= 8.1.2) + mail (>= 2.8.0) + rails-dom-testing (~> 2.2) + actionpack (8.1.2) + actionview (= 8.1.2) + activesupport (= 8.1.2) + nokogiri (>= 1.8.5) + rack (>= 2.2.4) + rack-session (>= 1.0.1) + rack-test (>= 0.6.3) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + useragent (~> 0.16) + actiontext (8.1.2) + action_text-trix (~> 2.1.15) + actionpack (= 8.1.2) + activerecord (= 8.1.2) + activestorage (= 8.1.2) + activesupport (= 8.1.2) + globalid (>= 0.6.0) + nokogiri (>= 1.8.5) + actionview (8.1.2) + activesupport (= 8.1.2) + builder (~> 3.1) + erubi (~> 1.11) + rails-dom-testing (~> 2.2) + rails-html-sanitizer (~> 1.6) + activejob (8.1.2) + activesupport (= 8.1.2) + globalid (>= 0.3.6) + activemodel (8.1.2) + activesupport (= 8.1.2) + activerecord (8.1.2) + activemodel (= 8.1.2) + activesupport (= 8.1.2) + timeout (>= 0.4.0) + activestorage (8.1.2) + actionpack (= 8.1.2) + activejob (= 8.1.2) + activerecord (= 8.1.2) + activesupport (= 8.1.2) + marcel (~> 1.0) + activesupport (8.1.2) + base64 + bigdecimal + concurrent-ruby (~> 1.0, >= 1.3.1) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + json + logger (>= 1.4.2) + minitest (>= 5.1) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) + uri (>= 0.13.1) + addressable (2.8.8) + public_suffix (>= 2.0.2, < 8.0) + ast (2.4.3) + base64 (0.3.0) + bigdecimal (4.0.1) + builder (3.3.0) + capybara (3.40.0) + addressable + matrix + mini_mime (>= 0.1.3) + nokogiri (~> 1.11) + rack (>= 1.6.0) + rack-test (>= 0.6.3) + regexp_parser (>= 1.5, < 3.0) + xpath (~> 3.2) + concurrent-ruby (1.3.6) + connection_pool (3.0.2) + crass (1.0.6) + css_parser (1.21.1) + addressable + date (3.5.1) + decant (0.4.0) + drb (2.2.3) + erb (6.0.2) + erubi (1.13.1) + globalid (1.3.0) + activesupport (>= 6.1) + herb (0.8.10-arm64-darwin) + htmlbeautifier (1.4.3) + htmlentities (4.3.4) + i18n (1.14.8) + concurrent-ruby (~> 1.0) + io-console (0.8.2) + irb (1.17.0) + pp (>= 0.6.0) + prism (>= 1.3.0) + rdoc (>= 4.0.0) + reline (>= 0.4.2) + json (2.18.1) + kramdown (2.5.2) + rexml (>= 3.4.4) + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + language_server-protocol (3.17.0.5) + lint_roller (1.1.0) + logger (1.7.0) + loofah (2.25.0) + crass (~> 1.0.2) + nokogiri (>= 1.12.0) + lookbook (2.3.14) + activemodel + css_parser + htmlbeautifier (~> 1.3) + htmlentities (~> 4.3.4) + marcel (~> 1.0) + railties (>= 5.0) + redcarpet (~> 3.5) + rouge (>= 3.26, < 5.0) + view_component (>= 2.0) + yard (~> 0.9) + zeitwerk (~> 2.5) + mail (2.9.0) + logger + mini_mime (>= 0.1.1) + net-imap + net-pop + net-smtp + marcel (1.1.0) + matrix (0.4.3) + mini_mime (1.1.5) + minitest (6.0.2) + drb (~> 2.0) + prism (~> 1.5) + net-imap (0.6.3) + date + net-protocol + net-pop (0.1.2) + net-protocol + net-protocol (0.2.2) + timeout + net-smtp (0.5.1) + net-protocol + nio4r (2.7.5) + nokogiri (1.19.1-arm64-darwin) + racc (~> 1.4) + parallel (1.27.0) + parser (3.3.10.2) + ast (~> 2.4.1) + racc + pp (0.6.3) + prettyprint + prettyprint (0.2.0) + prism (1.9.0) + psych (5.3.1) + date + stringio + public_suffix (7.0.2) + racc (1.8.1) + rack (3.2.5) + rack-session (2.1.1) + base64 (>= 0.1.0) + rack (>= 3.0.0) + rack-test (2.2.0) + rack (>= 1.3) + rackup (2.3.1) + rack (>= 3) + rails (8.1.2) + actioncable (= 8.1.2) + actionmailbox (= 8.1.2) + actionmailer (= 8.1.2) + actionpack (= 8.1.2) + actiontext (= 8.1.2) + actionview (= 8.1.2) + activejob (= 8.1.2) + activemodel (= 8.1.2) + activerecord (= 8.1.2) + activestorage (= 8.1.2) + activesupport (= 8.1.2) + bundler (>= 1.15.0) + railties (= 8.1.2) + rails-dom-testing (2.3.0) + activesupport (>= 5.0.0) + minitest + nokogiri (>= 1.6) + rails-html-sanitizer (1.7.0) + loofah (~> 2.25) + nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) + rails_autolink (1.1.8) + actionview (> 3.1) + activesupport (> 3.1) + railties (> 3.1) + railties (8.1.2) + actionpack (= 8.1.2) + activesupport (= 8.1.2) + irb (~> 1.13) + rackup (>= 1.0.0) + rake (>= 12.2) + thor (~> 1.0, >= 1.2.2) + tsort (>= 0.2) + zeitwerk (~> 2.6) + rainbow (3.1.1) + rake (13.3.1) + rdoc (7.2.0) + erb + psych (>= 4.0.0) + tsort + redcarpet (3.6.1) + regexp_parser (2.11.3) + reline (0.6.3) + io-console (~> 0.5) + rexml (3.4.4) + rouge (4.7.0) + rubocop (1.84.2) + json (~> 2.3) + language_server-protocol (~> 3.17.0.2) + lint_roller (~> 1.1.0) + parallel (~> 1.10) + parser (>= 3.3.0.2) + rainbow (>= 2.2.2, < 4.0) + regexp_parser (>= 2.9.3, < 3.0) + rubocop-ast (>= 1.49.0, < 2.0) + ruby-progressbar (~> 1.7) + unicode-display_width (>= 2.4.0, < 4.0) + rubocop-ast (1.49.0) + parser (>= 3.3.7.2) + prism (~> 1.7) + rubocop-performance (1.26.1) + lint_roller (~> 1.1) + rubocop (>= 1.75.0, < 2.0) + rubocop-ast (>= 1.47.1, < 2.0) + ruby-progressbar (1.13.0) + securerandom (0.4.1) + sqlite3 (2.9.0-arm64-darwin) + standard (1.54.0) + language_server-protocol (~> 3.17.0.2) + lint_roller (~> 1.0) + rubocop (~> 1.84.0) + standard-custom (~> 1.0.0) + standard-performance (~> 1.8) + standard-custom (1.0.2) + lint_roller (~> 1.0) + rubocop (~> 1.50) + standard-performance (1.9.0) + lint_roller (~> 1.1) + rubocop-performance (~> 1.26.0) + stringio (3.2.0) + thor (1.5.0) + timeout (0.6.0) + tsort (0.2.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + unicode-display_width (3.2.0) + unicode-emoji (~> 4.1) + unicode-emoji (4.2.0) + uri (1.1.1) + useragent (0.16.11) + view_component (4.4.0) + actionview (>= 7.1.0) + activesupport (>= 7.1.0) + concurrent-ruby (~> 1) + websocket-driver (0.8.0) + base64 + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.5) + xpath (3.2.0) + nokogiri (~> 1.8) + yard (0.9.38) + zeitwerk (2.7.5) + +PLATFORMS + arm64-darwin + +DEPENDENCIES + capybara + decant + flowbite-components! + herb + irb + kramdown + kramdown-parser-gfm + lookbook (>= 2.3.11) + minitest + rails + rails_autolink + rake (~> 13.0) + sqlite3 + standard + yard + +CHECKSUMS + action_text-trix (2.1.16) + actioncable (8.1.2) + actionmailbox (8.1.2) + actionmailer (8.1.2) + actionpack (8.1.2) + actiontext (8.1.2) + actionview (8.1.2) + activejob (8.1.2) + activemodel (8.1.2) + activerecord (8.1.2) + activestorage (8.1.2) + activesupport (8.1.2) + addressable (2.8.8) + ast (2.4.3) + base64 (0.3.0) + bigdecimal (4.0.1) + builder (3.3.0) + capybara (3.40.0) + concurrent-ruby (1.3.6) + connection_pool (3.0.2) + crass (1.0.6) + css_parser (1.21.1) + date (3.5.1) + decant (0.4.0) + drb (2.2.3) + erb (6.0.2) + erubi (1.13.1) + flowbite-components (0.2.1) + globalid (1.3.0) + herb (0.8.10-arm64-darwin) + htmlbeautifier (1.4.3) + htmlentities (4.3.4) + i18n (1.14.8) + io-console (0.8.2) + irb (1.17.0) + json (2.18.1) + kramdown (2.5.2) + kramdown-parser-gfm (1.1.0) + language_server-protocol (3.17.0.5) + lint_roller (1.1.0) + logger (1.7.0) + loofah (2.25.0) + lookbook (2.3.14) + mail (2.9.0) + marcel (1.1.0) + matrix (0.4.3) + mini_mime (1.1.5) + minitest (6.0.2) + net-imap (0.6.3) + net-pop (0.1.2) + net-protocol (0.2.2) + net-smtp (0.5.1) + nio4r (2.7.5) + nokogiri (1.19.1-arm64-darwin) + parallel (1.27.0) + parser (3.3.10.2) + pp (0.6.3) + prettyprint (0.2.0) + prism (1.9.0) + psych (5.3.1) + public_suffix (7.0.2) + racc (1.8.1) + rack (3.2.5) + rack-session (2.1.1) + rack-test (2.2.0) + rackup (2.3.1) + rails (8.1.2) + rails-dom-testing (2.3.0) + rails-html-sanitizer (1.7.0) + rails_autolink (1.1.8) + railties (8.1.2) + rainbow (3.1.1) + rake (13.3.1) + rdoc (7.2.0) + redcarpet (3.6.1) + regexp_parser (2.11.3) + reline (0.6.3) + rexml (3.4.4) + rouge (4.7.0) + rubocop (1.84.2) + rubocop-ast (1.49.0) + rubocop-performance (1.26.1) + ruby-progressbar (1.13.0) + securerandom (0.4.1) + sqlite3 (2.9.0-arm64-darwin) + standard (1.54.0) + standard-custom (1.0.2) + standard-performance (1.9.0) + stringio (3.2.0) + thor (1.5.0) + timeout (0.6.0) + tsort (0.2.0) + tzinfo (2.0.6) + unicode-display_width (3.2.0) + unicode-emoji (4.2.0) + uri (1.1.1) + useragent (0.16.11) + view_component (4.4.0) + websocket-driver (0.8.0) + websocket-extensions (0.1.5) + xpath (3.2.0) + yard (0.9.38) + zeitwerk (2.7.5) + +BUNDLED WITH + 4.0.4 diff --git a/app/components/flowbite/timeline.rb b/app/components/flowbite/timeline.rb new file mode 100644 index 0000000..e786d3d --- /dev/null +++ b/app/components/flowbite/timeline.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +module Flowbite + # Renders a vertical timeline component for displaying chronological events. + # + # @example Basic usage + # <%= render(Flowbite::Timeline.new) do %> + # <%= render(Flowbite::Timeline::Item.new(datetime: "February 2022", title: "Event title")) do %> + # Event description goes here. + # <% end %> + # <% end %> + # + # @see https://flowbite.com/docs/components/timeline/ + # @lookbook_embed TimelinePreview + class Timeline < ViewComponent::Base + CLASSES = ["border-s", "border-default", "relative"].freeze + + attr_reader :options + + # @param class [String, Array] Additional CSS classes. + def initialize(class: nil, **options) + @class = Array.wrap(binding.local_variable_get(:class)) + @options = options + end + + private + + def classes + CLASSES + @class + end + + def tag_options + {class: classes}.merge(options) + end + end +end diff --git a/app/components/flowbite/timeline/item.rb b/app/components/flowbite/timeline/item.rb new file mode 100644 index 0000000..98df503 --- /dev/null +++ b/app/components/flowbite/timeline/item.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true + +module Flowbite + class Timeline + # Renders a single item within a Timeline component. + # + # @example Basic usage + # <%= render(Flowbite::Timeline::Item.new(datetime: "February 2022", title: "Event title")) do %> + # Event description goes here. + # <% end %> + class Item < ViewComponent::Base + CLASSES = ["mb-10", "ms-4"].freeze + + DOT_CLASSES = [ + "-start-1.5", + "absolute", + "bg-neutral-quaternary", + "border", + "border-buffer", + "h-3", + "mt-1.5", + "rounded-full", + "w-3" + ].freeze + + DATETIME_CLASSES = [ + "font-normal", + "leading-none", + "text-body", + "text-sm" + ].freeze + + TITLE_CLASSES = [ + "font-semibold", + "my-2", + "text-heading", + "text-lg" + ].freeze + + BODY_CLASSES = [ + "font-normal", + "text-base", + "text-body" + ].freeze + + attr_reader :options + + # @param class [String, Array] Additional CSS classes. + # @param datetime [String] The time label displayed for the item. + # @param title [String] The heading text for the item. + def initialize(datetime:, title:, class: nil, **options) + @class = Array.wrap(binding.local_variable_get(:class)) + @datetime = datetime + @title = title + @options = options + end + + private + + def classes + CLASSES + @class + end + + def tag_options + {class: classes}.merge(options) + end + end + end +end diff --git a/app/components/flowbite/timeline/item/item.html.erb b/app/components/flowbite/timeline/item/item.html.erb new file mode 100644 index 0000000..878eb49 --- /dev/null +++ b/app/components/flowbite/timeline/item/item.html.erb @@ -0,0 +1,6 @@ +<%= content_tag(:li, **tag_options) do %> +
">
+ +

"><%= @title %>

+

"><%= content %>

+<% end %> diff --git a/app/components/flowbite/timeline/timeline.html.erb b/app/components/flowbite/timeline/timeline.html.erb new file mode 100644 index 0000000..7c780f8 --- /dev/null +++ b/app/components/flowbite/timeline/timeline.html.erb @@ -0,0 +1,3 @@ +<%= content_tag(:ol, **tag_options) do %> + <%= content %> +<% end %> diff --git a/claude.md b/claude.md new file mode 100644 index 0000000..1a25af8 --- /dev/null +++ b/claude.md @@ -0,0 +1,7 @@ +# Claude + +- Keep lists of arguments and @params sorted alphabetically. +- Make sure that all tests pass using `rake test` +- Make sure that all files can be linted succesfully using `rake standard` +- When running tests, make sure to run the entire test suite, not just the files that has been updated or created. +- When generating components, generate a preview for the component in demo/test/components/previews following the patterns from the other previews there. diff --git a/demo/test/components/previews/timeline_preview.rb b/demo/test/components/previews/timeline_preview.rb new file mode 100644 index 0000000..a87a687 --- /dev/null +++ b/demo/test/components/previews/timeline_preview.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +class TimelinePreview < Lookbook::Preview + def example + render(Flowbite::Timeline.new) do + safe_join([ + render(Flowbite::Timeline::Item.new(datetime: "February 2022", title: "Application UI code in Tailwind CSS")) { + "Get access to over 20+ pages including a dashboard layout, charts, kanban board, calendar, and pre-order E-commerce & Marketing pages." + }, + render(Flowbite::Timeline::Item.new(datetime: "March 2022", title: "Marketing UI design in Figma")) { + "All of the pages and components are first designed in Figma and we keep a parity between the two versions even as we update the project." + }, + render(Flowbite::Timeline::Item.new(datetime: "April 2022", title: "E-Commerce UI code in Tailwind CSS")) { + "Get started with dozens of web components and interactive elements built on top of Tailwind CSS." + } + ]) + end + end +end diff --git a/test/components/flowbite/timeline_test.rb b/test/components/flowbite/timeline_test.rb new file mode 100644 index 0000000..bbe303b --- /dev/null +++ b/test/components/flowbite/timeline_test.rb @@ -0,0 +1,98 @@ +require "test_helper" + +class Flowbite::TimelineTest < Minitest::Test + include ViewComponent::TestHelpers + + def test_render_component + render_inline(Flowbite::Timeline.new) { "Content" } + + assert_component_rendered + assert_selector("ol", text: "Content") + end + + def test_renders_with_default_classes + render_inline(Flowbite::Timeline.new) { "Content" } + + assert_selector("ol.relative.border-s.border-default") + end + + # Custom classes + + def test_adds_classes_to_the_default_ones + render_inline(Flowbite::Timeline.new(class: "custom-class")) { "Content" } + + assert_selector("ol.relative.border-default.custom-class") + end + + # Custom options + + def test_passes_additional_options_as_attributes + render_inline(Flowbite::Timeline.new(id: "my-timeline", data: {controller: "timeline"})) { "Content" } + + assert_selector("ol[id='my-timeline'][data-controller='timeline']") + end +end + +class Flowbite::Timeline::ItemTest < Minitest::Test + include ViewComponent::TestHelpers + + def test_render_component + render_inline(Flowbite::Timeline::Item.new(datetime: "February 2022", title: "Event title")) { "Description" } + + assert_component_rendered + end + + def test_renders_with_default_classes + render_inline(Flowbite::Timeline::Item.new(datetime: "February 2022", title: "Event title")) { "Description" } + + assert_selector("li.mb-10.ms-4") + end + + # Dot + + def test_renders_dot_marker + render_inline(Flowbite::Timeline::Item.new(datetime: "February 2022", title: "Event title")) { "Description" } + + assert_selector("li div.absolute.rounded-full.bg-neutral-quaternary.border.border-buffer.h-3.w-3") + end + + # Datetime + + def test_renders_datetime + render_inline(Flowbite::Timeline::Item.new(datetime: "February 2022", title: "Event title")) { "Description" } + + assert_selector("time.text-sm.font-normal.text-body", text: "February 2022") + end + + # Title + + def test_renders_title + render_inline(Flowbite::Timeline::Item.new(datetime: "February 2022", title: "Event title")) { "Description" } + + assert_selector("h3.text-lg.font-semibold.text-heading", text: "Event title") + end + + # Body + + def test_renders_body_content + render_inline(Flowbite::Timeline::Item.new(datetime: "February 2022", title: "Event title")) { "Description text" } + + assert_selector("p.text-base.font-normal.text-body", text: "Description text") + end + + # Custom classes + + def test_adds_classes_to_the_default_ones + render_inline(Flowbite::Timeline::Item.new(class: "custom-class", datetime: "February 2022", title: "Event title")) { "Description" } + + assert_selector("li.mb-10.ms-4.custom-class") + end + + # Custom options + + def test_passes_additional_options_as_attributes + render_inline(Flowbite::Timeline::Item.new(datetime: "February 2022", id: "my-item", title: "Event title")) { "Description" } + + assert_selector("li[id='my-item']") + end +end From 385ea2c3842c76f256ea43b12baa720a1301fff3 Mon Sep 17 00:00:00 2001 From: Jakob Skjerning Date: Fri, 27 Feb 2026 11:36:06 +0100 Subject: [PATCH 2/2] Add x86_64-linux platform to Gemfile.lock Fix CI failures caused by lockfile only listing arm64-darwin platform. Co-Authored-By: Claude Opus 4.6 --- Gemfile.lock | 212 ++++++++++++++++++++++++++------------------------- 1 file changed, 110 insertions(+), 102 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 9271acd..30c7bde 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -109,6 +109,7 @@ GEM globalid (1.3.0) activesupport (>= 6.1) herb (0.8.10-arm64-darwin) + herb (0.8.10-x86_64-linux-gnu) htmlbeautifier (1.4.3) htmlentities (4.3.4) i18n (1.14.8) @@ -166,6 +167,8 @@ GEM nio4r (2.7.5) nokogiri (1.19.1-arm64-darwin) racc (~> 1.4) + nokogiri (1.19.1-x86_64-linux-gnu) + racc (~> 1.4) parallel (1.27.0) parser (3.3.10.2) ast (~> 2.4.1) @@ -254,6 +257,7 @@ GEM ruby-progressbar (1.13.0) securerandom (0.4.1) sqlite3 (2.9.0-arm64-darwin) + sqlite3 (2.9.0-x86_64-linux-gnu) standard (1.54.0) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.0) @@ -292,6 +296,7 @@ GEM PLATFORMS arm64-darwin + x86_64-linux DEPENDENCIES capybara @@ -311,109 +316,112 @@ DEPENDENCIES yard CHECKSUMS - action_text-trix (2.1.16) - actioncable (8.1.2) - actionmailbox (8.1.2) - actionmailer (8.1.2) - actionpack (8.1.2) - actiontext (8.1.2) - actionview (8.1.2) - activejob (8.1.2) - activemodel (8.1.2) - activerecord (8.1.2) - activestorage (8.1.2) - activesupport (8.1.2) - addressable (2.8.8) - ast (2.4.3) - base64 (0.3.0) - bigdecimal (4.0.1) - builder (3.3.0) - capybara (3.40.0) - concurrent-ruby (1.3.6) - connection_pool (3.0.2) - crass (1.0.6) - css_parser (1.21.1) - date (3.5.1) - decant (0.4.0) - drb (2.2.3) - erb (6.0.2) - erubi (1.13.1) + action_text-trix (2.1.16) sha256=f645a2c21821b8449fd1d6770708f4031c91a2eedf9ef476e9be93c64e703a8a + actioncable (8.1.2) sha256=dc31efc34cca9cdefc5c691ddb8b4b214c0ea5cd1372108cbc1377767fb91969 + actionmailbox (8.1.2) sha256=058b2fb1980e5d5a894f675475fcfa45c62631103d5a2596d9610ec81581889b + actionmailer (8.1.2) sha256=f4c1d2060f653bfe908aa7fdc5a61c0e5279670de992146582f2e36f8b9175e9 + actionpack (8.1.2) sha256=ced74147a1f0daafaa4bab7f677513fd4d3add574c7839958f7b4f1de44f8423 + actiontext (8.1.2) sha256=0bf57da22a9c19d970779c3ce24a56be31b51c7640f2763ec64aa72e358d2d2d + actionview (8.1.2) sha256=80455b2588911c9b72cec22d240edacb7c150e800ef2234821269b2b2c3e2e5b + activejob (8.1.2) sha256=908dab3713b101859536375819f4156b07bdf4c232cc645e7538adb9e302f825 + activemodel (8.1.2) sha256=e21358c11ce68aed3f9838b7e464977bc007b4446c6e4059781e1d5c03bcf33e + activerecord (8.1.2) sha256=acfbe0cadfcc50fa208011fe6f4eb01cae682ebae0ef57145ba45380c74bcc44 + activestorage (8.1.2) sha256=8a63a48c3999caeee26a59441f813f94681fc35cc41aba7ce1f836add04fba76 + activesupport (8.1.2) sha256=88842578ccd0d40f658289b0e8c842acfe9af751afee2e0744a7873f50b6fdae + addressable (2.8.8) sha256=7c13b8f9536cf6364c03b9d417c19986019e28f7c00ac8132da4eb0fe393b057 + ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383 + base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b + bigdecimal (4.0.1) sha256=8b07d3d065a9f921c80ceaea7c9d4ae596697295b584c296fe599dd0ad01c4a7 + builder (3.3.0) sha256=497918d2f9dca528fdca4b88d84e4ef4387256d984b8154e9d5d3fe5a9c8835f + capybara (3.40.0) sha256=42dba720578ea1ca65fd7a41d163dd368502c191804558f6e0f71b391054aeef + concurrent-ruby (1.3.6) sha256=6b56837e1e7e5292f9864f34b69c5a2cbc75c0cf5338f1ce9903d10fa762d5ab + connection_pool (3.0.2) sha256=33fff5ba71a12d2aa26cb72b1db8bba2a1a01823559fb01d29eb74c286e62e0a + crass (1.0.6) sha256=dc516022a56e7b3b156099abc81b6d2b08ea1ed12676ac7a5657617f012bd45d + css_parser (1.21.1) sha256=6cfd3ffc0a97333b39d2b1b49c95397b05e0e3b684d68f77ec471ba4ec2ef7c7 + date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0 + decant (0.4.0) sha256=31a166c984452ba2ce4ce3286b7f1c73f81ad9ea0d58520b598f174efe2cf7d2 + drb (2.2.3) sha256=0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373 + erb (6.0.2) sha256=9fe6264d44f79422c87490a1558479bd0e7dad4dd0e317656e67ea3077b5242b + erubi (1.13.1) sha256=a082103b0885dbc5ecf1172fede897f9ebdb745a4b97a5e8dc63953db1ee4ad9 flowbite-components (0.2.1) - globalid (1.3.0) - herb (0.8.10-arm64-darwin) - htmlbeautifier (1.4.3) - htmlentities (4.3.4) - i18n (1.14.8) - io-console (0.8.2) - irb (1.17.0) - json (2.18.1) - kramdown (2.5.2) - kramdown-parser-gfm (1.1.0) - language_server-protocol (3.17.0.5) - lint_roller (1.1.0) - logger (1.7.0) - loofah (2.25.0) - lookbook (2.3.14) - mail (2.9.0) - marcel (1.1.0) - matrix (0.4.3) - mini_mime (1.1.5) - minitest (6.0.2) - net-imap (0.6.3) - net-pop (0.1.2) - net-protocol (0.2.2) - net-smtp (0.5.1) - nio4r (2.7.5) - nokogiri (1.19.1-arm64-darwin) - parallel (1.27.0) - parser (3.3.10.2) - pp (0.6.3) - prettyprint (0.2.0) - prism (1.9.0) - psych (5.3.1) - public_suffix (7.0.2) - racc (1.8.1) - rack (3.2.5) - rack-session (2.1.1) - rack-test (2.2.0) - rackup (2.3.1) - rails (8.1.2) - rails-dom-testing (2.3.0) - rails-html-sanitizer (1.7.0) - rails_autolink (1.1.8) - railties (8.1.2) - rainbow (3.1.1) - rake (13.3.1) - rdoc (7.2.0) - redcarpet (3.6.1) - regexp_parser (2.11.3) - reline (0.6.3) - rexml (3.4.4) - rouge (4.7.0) - rubocop (1.84.2) - rubocop-ast (1.49.0) - rubocop-performance (1.26.1) - ruby-progressbar (1.13.0) - securerandom (0.4.1) - sqlite3 (2.9.0-arm64-darwin) - standard (1.54.0) - standard-custom (1.0.2) - standard-performance (1.9.0) - stringio (3.2.0) - thor (1.5.0) - timeout (0.6.0) - tsort (0.2.0) - tzinfo (2.0.6) - unicode-display_width (3.2.0) - unicode-emoji (4.2.0) - uri (1.1.1) - useragent (0.16.11) - view_component (4.4.0) - websocket-driver (0.8.0) - websocket-extensions (0.1.5) - xpath (3.2.0) - yard (0.9.38) - zeitwerk (2.7.5) + globalid (1.3.0) sha256=05c639ad6eb4594522a0b07983022f04aa7254626ab69445a0e493aa3786ff11 + herb (0.8.10-arm64-darwin) sha256=bba77f7f64ffd144f36af5d4573ca5ee863f7258acd71c8536384d63d60e3d72 + herb (0.8.10-x86_64-linux-gnu) sha256=268b059f66a1f3191c8d7c15cfcb293a91be5c3811704856acd49b6f2e5dc1b1 + htmlbeautifier (1.4.3) sha256=b43d08f7e2aa6ae1b5a6f0607b4ed8954c8d4a8e85fd2336f975dda1e4db385b + htmlentities (4.3.4) sha256=125a73c6c9f2d1b62100b7c3c401e3624441b663762afa7fe428476435a673da + i18n (1.14.8) sha256=285778639134865c5e0f6269e0b818256017e8cde89993fdfcbfb64d088824a5 + io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc + irb (1.17.0) sha256=168c4ddb93d8a361a045c41d92b2952c7a118fa73f23fe14e55609eb7a863aae + json (2.18.1) sha256=fe112755501b8d0466b5ada6cf50c8c3f41e897fa128ac5d263ec09eedc9f986 + kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa + kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729 + language_server-protocol (3.17.0.5) sha256=fd1e39a51a28bf3eec959379985a72e296e9f9acfce46f6a79d31ca8760803cc + lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87 + logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 + loofah (2.25.0) sha256=df5ed7ac3bac6a4ec802df3877ee5cc86d027299f8952e6243b3dac446b060e6 + lookbook (2.3.14) sha256=c11a693bde9915b553c4463440ad5e750829f90bff08abdb6b8610373864cd7c + mail (2.9.0) sha256=6fa6673ecd71c60c2d996260f9ee3dd387d4673b8169b502134659ece6d34941 + marcel (1.1.0) sha256=fdcfcfa33cc52e93c4308d40e4090a5d4ea279e160a7f6af988260fa970e0bee + matrix (0.4.3) sha256=a0d5ab7ddcc1973ff690ab361b67f359acbb16958d1dc072b8b956a286564c5b + mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef + minitest (6.0.2) sha256=db6e57956f6ecc6134683b4c87467d6dd792323c7f0eea7b93f66bd284adbc3d + net-imap (0.6.3) sha256=9bab75f876596d09ee7bf911a291da478e0cd6badc54dfb82874855ccc82f2ad + net-pop (0.1.2) sha256=848b4e982013c15b2f0382792268763b748cce91c9e91e36b0f27ed26420dff3 + net-protocol (0.2.2) sha256=aa73e0cba6a125369de9837b8d8ef82a61849360eba0521900e2c3713aa162a8 + net-smtp (0.5.1) sha256=ed96a0af63c524fceb4b29b0d352195c30d82dd916a42f03c62a3a70e5b70736 + nio4r (2.7.5) sha256=6c90168e48fb5f8e768419c93abb94ba2b892a1d0602cb06eef16d8b7df1dca1 + nokogiri (1.19.1-arm64-darwin) sha256=dfe2d337e6700eac47290407c289d56bcf85805d128c1b5a6434ddb79731cb9e + nokogiri (1.19.1-x86_64-linux-gnu) sha256=1a4902842a186b4f901078e692d12257678e6133858d0566152fe29cdb98456a + parallel (1.27.0) sha256=4ac151e1806b755fb4e2dc2332cbf0e54f2e24ba821ff2d3dcf86bf6dc4ae130 + parser (3.3.10.2) sha256=6f60c84aa4bdcedb6d1a2434b738fe8a8136807b6adc8f7f53b97da9bc4e9357 + pp (0.6.3) sha256=2951d514450b93ccfeb1df7d021cae0da16e0a7f95ee1e2273719669d0ab9df6 + prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193 + prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85 + psych (5.3.1) sha256=eb7a57cef10c9d70173ff74e739d843ac3b2c019a003de48447b2963d81b1974 + public_suffix (7.0.2) sha256=9114090c8e4e7135c1fd0e7acfea33afaab38101884320c65aaa0ffb8e26a857 + racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f + rack (3.2.5) sha256=4cbd0974c0b79f7a139b4812004a62e4c60b145cba76422e288ee670601ed6d3 + rack-session (2.1.1) sha256=0b6dc07dea7e4b583f58a48e8b806d4c9f1c6c9214ebc202ec94562cbea2e4e9 + rack-test (2.2.0) sha256=005a36692c306ac0b4a9350355ee080fd09ddef1148a5f8b2ac636c720f5c463 + rackup (2.3.1) sha256=6c79c26753778e90983761d677a48937ee3192b3ffef6bc963c0950f94688868 + rails (8.1.2) sha256=5069061b23dfa8706b9f0159ae8b9d35727359103178a26962b868a680ba7d95 + rails-dom-testing (2.3.0) sha256=8acc7953a7b911ca44588bf08737bc16719f431a1cc3091a292bca7317925c1d + rails-html-sanitizer (1.7.0) sha256=28b145cceaf9cc214a9874feaa183c3acba036c9592b19886e0e45efc62b1e89 + rails_autolink (1.1.8) sha256=fbcb9d2e5f2cea9435a32e5f12556c7a9b7ed6867889fb9cf5eac405049bfc3a + railties (8.1.2) sha256=1289ece76b4f7668fc46d07e55cc992b5b8751f2ad85548b7da351b8c59f8055 + rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a + rake (13.3.1) sha256=8c9e89d09f66a26a01264e7e3480ec0607f0c497a861ef16063604b1b08eb19c + rdoc (7.2.0) sha256=8650f76cd4009c3b54955eb5d7e3a075c60a57276766ebf36f9085e8c9f23192 + redcarpet (3.6.1) sha256=d444910e6aa55480c6bcdc0cdb057626e8a32c054c29e793fa642ba2f155f445 + regexp_parser (2.11.3) sha256=ca13f381a173b7a93450e53459075c9b76a10433caadcb2f1180f2c741fc55a4 + reline (0.6.3) sha256=1198b04973565b36ec0f11542ab3f5cfeeec34823f4e54cebde90968092b1835 + rexml (3.4.4) sha256=19e0a2c3425dfbf2d4fc1189747bdb2f849b6c5e74180401b15734bc97b5d142 + rouge (4.7.0) sha256=dba5896715c0325c362e895460a6d350803dbf6427454f49a47500f3193ea739 + rubocop (1.84.2) sha256=5692cea54168f3dc8cb79a6fe95c5424b7ea893c707ad7a4307b0585e88dbf5f + rubocop-ast (1.49.0) sha256=49c3676d3123a0923d333e20c6c2dbaaae2d2287b475273fddee0c61da9f71fd + rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834 + ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33 + securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1 + sqlite3 (2.9.0-arm64-darwin) sha256=a917bd9b84285766ff3300b7d79cd583f5a067594c8c1263e6441618c04a6ed3 + sqlite3 (2.9.0-x86_64-linux-gnu) sha256=72fff9bd750070ba3af695511ba5f0e0a2d8a9206f84869640b3e99dfaf3d5a5 + standard (1.54.0) sha256=7a4b08f83d9893083c8f03bc486f0feeb6a84d48233b40829c03ef4767ea0100 + standard-custom (1.0.2) sha256=424adc84179a074f1a2a309bb9cf7cd6bfdb2b6541f20c6bf9436c0ba22a652b + standard-performance (1.9.0) sha256=49483d31be448292951d80e5e67cdcb576c2502103c7b40aec6f1b6e9c88e3f2 + stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1 + thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73 + timeout (0.6.0) sha256=6d722ad619f96ee383a0c557ec6eb8c4ecb08af3af62098a0be5057bf00de1af + tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f + tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b + unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42 + unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f + uri (1.1.1) sha256=379fa58d27ffb1387eaada68c749d1426738bd0f654d812fcc07e7568f5c57c6 + useragent (0.16.11) sha256=700e6413ad4bb954bb63547fa098dddf7b0ebe75b40cc6f93b8d54255b173844 + view_component (4.4.0) sha256=ecccecb495ee4b4a5d9f93382992dc32c11a0708fde5ec261150a0f5223393d0 + websocket-driver (0.8.0) sha256=ed0dba4b943c22f17f9a734817e808bc84cdce6a7e22045f5315aa57676d4962 + websocket-extensions (0.1.5) sha256=1c6ba63092cda343eb53fc657110c71c754c56484aad42578495227d717a8241 + xpath (3.2.0) sha256=6dfda79d91bb3b949b947ecc5919f042ef2f399b904013eb3ef6d20dd3a4082e + yard (0.9.38) sha256=721fb82afb10532aa49860655f6cc2eaa7130889df291b052e1e6b268283010f + zeitwerk (2.7.5) sha256=d8da92128c09ea6ec62c949011b00ed4a20242b255293dd66bf41545398f73dd BUNDLED WITH 4.0.4