diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 410d333e..dc6b7a6d 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -10,7 +10,7 @@ jobs:
fail-fast: false
matrix:
ruby: ['3.2.6', '3.3.6']
- rails: ['6.1.5', '7.0.3']
+ rails: ['8.0.1']
runs-on: ubuntu-latest
name: Testing with Ruby ${{ matrix.ruby }} and Rails ${{ matrix.rails }}
steps:
diff --git a/.gitignore b/.gitignore
index f0a1e309..415256f7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,6 +12,7 @@ spec/dummy/tmp/
spec/dummy/node_modules/
spec/dummy/public/assets/
spec/dummy/config/master.key
+spec/dummy/app/assets/builds
coverage
*.gem
.tool-versions
diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml
index d9b9640f..0c1cc2a2 100644
--- a/.rubocop_todo.yml
+++ b/.rubocop_todo.yml
@@ -1,25 +1,47 @@
# This configuration was generated by
# `rubocop --auto-gen-config`
-# on 2022-12-09 16:36:08 UTC using RuboCop version 1.39.0.
+# on 2025-01-03 11:06:15 UTC using RuboCop version 1.69.2.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
# versions of RuboCop, may require this file to be generated again.
+# Offense count: 21
+# Configuration parameters: EnforcedStyle, AllowedGems, Include.
+# SupportedStyles: Gemfile, gems.rb, gemspec
+# Include: **/*.gemspec, **/Gemfile, **/gems.rb
+Gemspec/DevelopmentDependencies:
+ Exclude:
+ - 'dsfr-view-components.gemspec'
+
+# Offense count: 2
+# This cop supports safe autocorrection (--autocorrect).
+# Configuration parameters: TreatCommentsAsGroupSeparators, ConsiderPunctuation, Include.
+# Include: **/*.gemspec
+Gemspec/OrderedDependencies:
+ Exclude:
+ - 'dsfr-view-components.gemspec'
+
# Offense count: 1
-# Configuration parameters: Include.
+# Configuration parameters: Severity, Include.
# Include: **/*.gemspec
Gemspec/RequiredRubyVersion:
Exclude:
- 'dsfr-view-components.gemspec'
-# Offense count: 8
+# Offense count: 20
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: IndentationWidth.
# SupportedStyles: outdent, indent
Layout/AccessModifierIndentation:
EnforcedStyle: outdent
+# Offense count: 1
+# This cop supports safe autocorrection (--autocorrect).
+Layout/EmptyLines:
+ Exclude:
+ - 'dsfr-view-components.gemspec'
+
# Offense count: 1
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: EnforcedStyle.
@@ -28,16 +50,6 @@ Layout/EmptyLinesAroundBlockBody:
Exclude:
- 'spec/dummy/db/schema.rb'
-# Offense count: 6
-# This cop supports safe autocorrection (--autocorrect).
-# Configuration parameters: AllowMultipleStyles, EnforcedHashRocketStyle, EnforcedColonStyle, EnforcedLastArgumentHashStyle.
-# SupportedHashRocketStyles: key, separator, table
-# SupportedColonStyles: key, separator, table
-# SupportedLastArgumentHashStyles: always_inspect, always_ignore, ignore_implicit, ignore_explicit
-Layout/HashAlignment:
- Exclude:
- - 'app/helpers/dsfr_link_helper.rb'
-
# Offense count: 3
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: EnforcedStyle, IndentationWidth.
@@ -69,37 +81,24 @@ Lint/EmptyBlock:
- 'config/routes.rb'
- 'spec/dummy/db/schema.rb'
-# Offense count: 3
+# Offense count: 1
# This cop supports unsafe autocorrection (--autocorrect-all).
-Lint/RedundantDirGlobSort:
+# Configuration parameters: AllowedImplicitNamespaces.
+# AllowedImplicitNamespaces: Gem
+Lint/RaiseException:
Exclude:
- - 'guide/lib/helpers.rb'
- - 'lib/dsfr/components/engine.rb'
- - 'spec/spec_helper.rb'
+ - 'scripts/deploy_gem.rb'
# Offense count: 2
-# Configuration parameters: CountComments, CountAsOne, ExcludedMethods, AllowedMethods, AllowedPatterns, IgnoredMethods.
+# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
+Metrics/AbcSize:
+ Max: 19
+
+# Offense count: 3
+# Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns.
Metrics/MethodLength:
Max: 13
-# Offense count: 1
-# Configuration parameters: CountComments, CountAsOne.
-Metrics/ModuleLength:
- Max: 106
-
-# Offense count: 2
-# Configuration parameters: CountKeywordArgs, MaxOptionalParameters.
-Metrics/ParameterLists:
- Max: 6
-
-# Offense count: 10
-# This cop supports safe autocorrection (--autocorrect).
-# Configuration parameters: EnforcedStyle, BlockForwardingName.
-# SupportedStyles: anonymous, explicit
-Naming/BlockForwarding:
- Exclude:
- - 'app/helpers/dsfr_link_helper.rb'
-
# Offense count: 6
# Configuration parameters: Prefixes, AllowedPatterns.
# Prefixes: when, with, without
@@ -113,17 +112,12 @@ RSpec/ContextWording:
# Offense count: 3
# This cop supports unsafe autocorrection (--autocorrect-all).
-# Configuration parameters: SkipBlocks, EnforcedStyle.
+# Configuration parameters: SkipBlocks, EnforcedStyle, OnlyStaticConstants.
# SupportedStyles: described_class, explicit
RSpec/DescribedClass:
Exclude:
- 'spec/components/dsfr_component/accordion_component_spec.rb'
-# Offense count: 3
-# Configuration parameters: CountAsOne.
-RSpec/ExampleLength:
- Max: 14
-
# Offense count: 3
# This cop supports safe autocorrection (--autocorrect).
RSpec/LeadingSubject:
@@ -132,21 +126,13 @@ RSpec/LeadingSubject:
- 'spec/components/shared/a_component_with_a_slot_that_accepts_custom_classes.rb'
- 'spec/components/shared/a_component_with_a_slot_that_accepts_custom_html_attributes.rb'
-# Offense count: 3
-# Configuration parameters: EnforcedStyle.
-# SupportedStyles: slashes, arguments
-Rails/FilePath:
- Exclude:
- - 'spec/dummy/config/environments/development.rb'
- - 'spec/dummy/config/environments/production.rb'
-
# Offense count: 2
Rails/OutputSafety:
Exclude:
+ - 'app/components/dsfr_component/header_component/direct_link_dropdown_component.rb'
- 'app/helpers/dsfr_back_to_top_link_helper.rb'
- - 'guide/lib/helpers/content_helpers.rb'
-# Offense count: 2
+# Offense count: 3
Security/Eval:
Exclude:
- 'guide/lib/helpers/formatters.rb'
@@ -159,7 +145,7 @@ Style/Alias:
Exclude:
- 'app/components/dsfr_component/accordion_component/section_component.rb'
-# Offense count: 6
+# Offense count: 14
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: EnforcedStyle.
# SupportedStyles: nested, compact
@@ -169,15 +155,23 @@ Style/ClassAndModuleChildren:
- 'app/components/dsfr_component/accordion_component/section_component.rb'
- 'app/components/dsfr_component/alert_component.rb'
- 'app/components/dsfr_component/base.rb'
+ - 'app/components/dsfr_component/breadcrumbs_component.rb'
+ - 'app/components/dsfr_component/header_component.rb'
+ - 'app/components/dsfr_component/header_component/direct_link_component.rb'
+ - 'app/components/dsfr_component/header_component/direct_link_dropdown_component.rb'
+ - 'app/components/dsfr_component/header_component/operator_image_component.rb'
+ - 'app/components/dsfr_component/header_component/tool_link_component.rb'
+ - 'app/components/dsfr_component/tabs_component.rb'
+ - 'app/components/dsfr_component/tabs_component/tab_component.rb'
- 'app/components/dsfr_component/traits.rb'
- 'spec/spec_helper.rb'
-# Offense count: 24
+# Offense count: 47
# Configuration parameters: AllowedConstants.
Style/Documentation:
Enabled: false
-# Offense count: 73
+# Offense count: 104
# This cop supports unsafe autocorrection (--autocorrect-all).
# Configuration parameters: EnforcedStyle.
# SupportedStyles: always, always_true, never
@@ -190,19 +184,34 @@ Style/GlobalStdStream:
Exclude:
- 'spec/dummy/config/environments/production.rb'
-# Offense count: 1
+# Offense count: 2
+# This cop supports safe autocorrection (--autocorrect).
+Style/KeywordArgumentsMerging:
+ Exclude:
+ - 'spec/components/shared/a_component_that_accepts_custom_classes.rb'
+
+# Offense count: 2
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: EnforcedStyle.
# SupportedStyles: line_count_dependent, lambda, literal
Style/Lambda:
Exclude:
- 'app/components/dsfr_component/accordion_component.rb'
+ - 'app/components/dsfr_component/breadcrumbs_component.rb'
# Offense count: 3
Style/MixinUsage:
Exclude:
- 'spec/spec_helper.rb'
+# Offense count: 1
+# This cop supports unsafe autocorrection (--autocorrect-all).
+# Configuration parameters: EnforcedStyle.
+# SupportedStyles: literals, strict
+Style/MutableConstant:
+ Exclude:
+ - 'dsfr-view-components.gemspec'
+
# Offense count: 3
Style/OpenStructUse:
Exclude:
@@ -217,11 +226,10 @@ Style/PercentLiteralDelimiters:
- 'app/components/dsfr_component/accordion_component.rb'
- 'app/components/dsfr_component/alert_component.rb'
- 'app/helpers/dsfr_link_helper.rb'
- - 'dsfr-view-components.gemspec'
- 'lib/dsfr/components/engine.rb'
- 'spec/components/shared/a_component_that_accepts_custom_classes.rb'
-# Offense count: 4
+# Offense count: 47
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: .
# SupportedStyles: same_as_string_literals, single_quotes, double_quotes
@@ -235,6 +243,20 @@ Style/RedundantFetchBlock:
Exclude:
- 'spec/dummy/config/puma.rb'
+# Offense count: 3
+# This cop supports safe autocorrection (--autocorrect).
+Style/RedundantLineContinuation:
+ Exclude:
+ - 'app/components/dsfr_component/header_component/direct_link_component.rb'
+ - 'app/components/dsfr_component/header_component/direct_link_dropdown_component.rb'
+ - 'app/components/dsfr_component/tag_component.rb'
+
+# Offense count: 2
+# This cop supports safe autocorrection (--autocorrect).
+Style/RedundantRegexpArgument:
+ Exclude:
+ - 'guide/lib/helpers/formatters.rb'
+
# Offense count: 4
# This cop supports safe autocorrection (--autocorrect).
Style/RedundantStringEscape:
@@ -249,14 +271,13 @@ Style/RegexpLiteral:
Exclude:
- 'guide/lib/helpers/formatters.rb'
-# Offense count: 7
+# Offense count: 5
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: EnforcedStyle.
# SupportedStyles: only_raise, only_fail, semantic
Style/SignalException:
Exclude:
- 'app/components/dsfr_component/alert_component.rb'
- - 'app/helpers/dsfr_link_helper.rb'
- 'guide/lib/filters/dart_sass.rb'
- 'guide/lib/suppress_listen_symlink_errors.rb'
- 'lib/dsfr/components/helpers/css_utilities.rb'
@@ -268,26 +289,31 @@ Style/StringConcatenation:
Exclude:
- 'spec/components/shared/setup.rb'
-# Offense count: 286
+# Offense count: 793
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: EnforcedStyle, ConsistentQuotesInMultiline.
# SupportedStyles: single_quotes, double_quotes
Style/StringLiterals:
Enabled: false
-# Offense count: 4
+# Offense count: 2
+# This cop supports safe autocorrection (--autocorrect).
+Style/SuperArguments:
+ Exclude:
+ - 'app/components/dsfr_component/accordion_component.rb'
+ - 'app/components/dsfr_component/breadcrumbs_component.rb'
+
+# Offense count: 1
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: EnforcedStyleForMultiline.
# SupportedStylesForMultiline: comma, consistent_comma, no_comma
Style/TrailingCommaInHashLiteral:
Exclude:
- - 'app/helpers/dsfr_link_helper.rb'
- - 'guide/lib/helpers/content_helpers.rb'
- 'lib/dsfr/components/engine.rb'
-# Offense count: 8
+# Offense count: 30
# This cop supports safe autocorrection (--autocorrect).
-# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns, IgnoredPatterns.
+# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns, SplitStrings.
# URISchemes: http, https
Layout/LineLength:
Max: 199
diff --git a/Gemfile b/Gemfile
index f8b0e5de..be93f9c2 100644
--- a/Gemfile
+++ b/Gemfile
@@ -21,4 +21,6 @@ group 'nanoc' do
gem 'nanoc-live'
end
-gem "rubocop-rspec", "~> 2.14"
+gem "cssbundling-rails"
+gem "rubocop-rails"
+gem "rubocop-rspec"
diff --git a/Gemfile.lock b/Gemfile.lock
index 5835d75e..afee2804 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -4,33 +4,87 @@ PATH
dsfr-view-components (1.5.3)
html-attributes-utils (~> 1)
pagy (~> 6)
- view_component (~> 2)
+ view_component (~> 3)
GEM
remote: https://rubygems.org/
specs:
- actionpack (7.0.4)
- actionview (= 7.0.4)
- activesupport (= 7.0.4)
- rack (~> 2.0, >= 2.2.0)
+ actioncable (8.0.1)
+ actionpack (= 8.0.1)
+ activesupport (= 8.0.1)
+ nio4r (~> 2.0)
+ websocket-driver (>= 0.6.1)
+ zeitwerk (~> 2.6)
+ actionmailbox (8.0.1)
+ actionpack (= 8.0.1)
+ activejob (= 8.0.1)
+ activerecord (= 8.0.1)
+ activestorage (= 8.0.1)
+ activesupport (= 8.0.1)
+ mail (>= 2.8.0)
+ actionmailer (8.0.1)
+ actionpack (= 8.0.1)
+ actionview (= 8.0.1)
+ activejob (= 8.0.1)
+ activesupport (= 8.0.1)
+ mail (>= 2.8.0)
+ rails-dom-testing (~> 2.2)
+ actionpack (8.0.1)
+ actionview (= 8.0.1)
+ activesupport (= 8.0.1)
+ nokogiri (>= 1.8.5)
+ rack (>= 2.2.4)
+ rack-session (>= 1.0.1)
rack-test (>= 0.6.3)
- rails-dom-testing (~> 2.0)
- rails-html-sanitizer (~> 1.0, >= 1.2.0)
- actionview (7.0.4)
- activesupport (= 7.0.4)
+ rails-dom-testing (~> 2.2)
+ rails-html-sanitizer (~> 1.6)
+ useragent (~> 0.16)
+ actiontext (8.0.1)
+ actionpack (= 8.0.1)
+ activerecord (= 8.0.1)
+ activestorage (= 8.0.1)
+ activesupport (= 8.0.1)
+ globalid (>= 0.6.0)
+ nokogiri (>= 1.8.5)
+ actionview (8.0.1)
+ activesupport (= 8.0.1)
builder (~> 3.1)
- erubi (~> 1.4)
- rails-dom-testing (~> 2.0)
- rails-html-sanitizer (~> 1.1, >= 1.2.0)
- activesupport (7.0.4)
- concurrent-ruby (~> 1.0, >= 1.0.2)
+ erubi (~> 1.11)
+ rails-dom-testing (~> 2.2)
+ rails-html-sanitizer (~> 1.6)
+ activejob (8.0.1)
+ activesupport (= 8.0.1)
+ globalid (>= 0.3.6)
+ activemodel (8.0.1)
+ activesupport (= 8.0.1)
+ activerecord (8.0.1)
+ activemodel (= 8.0.1)
+ activesupport (= 8.0.1)
+ timeout (>= 0.4.0)
+ activestorage (8.0.1)
+ actionpack (= 8.0.1)
+ activejob (= 8.0.1)
+ activerecord (= 8.0.1)
+ activesupport (= 8.0.1)
+ marcel (~> 1.0)
+ activesupport (8.0.1)
+ base64
+ benchmark (>= 0.3)
+ bigdecimal
+ concurrent-ruby (~> 1.0, >= 1.3.1)
+ connection_pool (>= 2.2.5)
+ drb
i18n (>= 1.6, < 2)
+ logger (>= 1.4.2)
minitest (>= 5.1)
- tzinfo (~> 2.0)
+ securerandom (>= 0.3)
+ tzinfo (~> 2.0, >= 2.0.5)
+ uri (>= 0.13.1)
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
- adsf (1.4.6)
- rack (>= 1.0.0, < 3.0.0)
+ adsf (1.5.2)
+ rack (>= 1.0.0, < 4.0.0)
+ rackup (~> 2.1)
adsf-live (1.5.2)
adsf (~> 1.3)
em-websocket (~> 0.5)
@@ -38,31 +92,44 @@ GEM
listen (~> 3.0)
ast (2.4.2)
base64 (0.2.0)
- builder (3.2.4)
+ benchmark (0.4.0)
+ bigdecimal (3.1.9)
+ builder (3.3.0)
byebug (11.1.3)
coderay (1.1.3)
colored (1.2)
concurrent-ruby (1.3.4)
+ connection_pool (2.4.1)
crass (1.0.6)
cri (2.15.12)
+ cssbundling-rails (1.4.1)
+ railties (>= 6.0.0)
+ date (3.4.1)
ddmetrics (1.1.0)
ddplugin (1.0.3)
deep_merge (1.2.2)
diff-lcs (1.5.1)
- docile (1.4.0)
+ docile (1.4.1)
+ drb (2.2.1)
em-websocket (0.5.3)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0)
- erubi (1.12.0)
+ erubi (1.13.1)
eventmachine (1.2.7)
- ffi (1.15.5)
+ ffi (1.17.1-arm64-darwin)
+ ffi (1.17.1-x86_64-darwin)
+ ffi (1.17.1-x86_64-linux-gnu)
formatador (1.1.0)
- guard (2.18.0)
+ globalid (1.2.1)
+ activesupport (>= 6.1)
+ guard (2.19.1)
formatador (>= 0.2.4)
listen (>= 2.7, < 4.0)
+ logger (~> 1.6)
lumberjack (>= 1.0.12, < 2.0)
nenv (~> 0.1)
notiffany (~> 0.0)
+ ostruct (~> 0.6)
pry (>= 0.13.0)
shellany (~> 0.0)
thor (>= 0.18.1)
@@ -71,39 +138,51 @@ GEM
guard (~> 2.1)
guard-compat (~> 1.1)
rspec (>= 2.99.0, < 4.0)
- haml (6.1.1)
+ haml (6.1.4)
temple (>= 0.8.2)
thor
tilt
- haml_lint (0.43.0)
- haml (>= 4.0, < 6.2)
+ haml_lint (0.59.0)
+ haml (>= 5.0)
parallel (~> 1.10)
rainbow
- rubocop (>= 0.50.0)
+ rubocop (>= 1.0)
sysexits (~> 1.1)
html-attributes-utils (1.0.2)
activesupport (>= 6.1.4.4)
- htmlbeautifier (1.4.2)
+ htmlbeautifier (1.4.3)
http_parser.rb (0.8.0)
i18n (1.14.6)
concurrent-ruby (~> 1.0)
immutable-ruby (0.2.0)
concurrent-ruby (~> 1.1)
sorted_set (~> 1.0)
- json (2.6.3)
+ io-console (0.8.0)
+ irb (1.14.3)
+ rdoc (>= 4.0.0)
+ reline (>= 0.4.2)
+ json (2.9.1)
json_schema (0.21.0)
kramdown (2.4.0)
rexml
- listen (3.8.0)
+ language_server-protocol (3.17.0.3)
+ listen (3.9.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
- loofah (2.19.1)
+ logger (1.6.4)
+ loofah (2.24.0)
crass (~> 1.0.2)
- nokogiri (>= 1.5.9)
- lumberjack (1.2.8)
+ nokogiri (>= 1.12.0)
+ lumberjack (1.2.10)
+ mail (2.8.1)
+ mini_mime (>= 0.1.1)
+ net-imap
+ net-pop
+ net-smtp
+ marcel (1.0.4)
memo_wise (1.10.0)
method_source (1.1.0)
- mini_portile2 (2.8.8)
+ mini_mime (1.1.5)
minitest (5.25.4)
nanoc (4.13.3)
addressable (~> 2.5)
@@ -145,114 +224,152 @@ GEM
nanoc-cli (~> 4.11, >= 4.11.14)
nanoc-core (~> 4.11, >= 4.11.14)
nenv (0.3.0)
- nokogiri (1.13.10)
- mini_portile2 (~> 2.8.0)
+ net-imap (0.5.4)
+ date
+ net-protocol
+ net-pop (0.1.2)
+ net-protocol
+ net-protocol (0.2.2)
+ timeout
+ net-smtp (0.5.0)
+ net-protocol
+ nio4r (2.7.4)
+ nokogiri (1.18.1-arm64-darwin)
+ racc (~> 1.4)
+ nokogiri (1.18.1-x86_64-darwin)
+ racc (~> 1.4)
+ nokogiri (1.18.1-x86_64-linux-gnu)
racc (~> 1.4)
notiffany (0.1.3)
nenv (~> 0.1)
shellany (~> 0.0)
+ ostruct (0.6.1)
pagy (6.5.0)
parallel (1.26.3)
- parser (3.2.0.0)
+ parser (3.3.6.0)
ast (~> 2.4.1)
+ racc
pastel (0.8.0)
tty-color (~> 0.5)
+ propshaft (1.1.0)
+ actionpack (>= 7.0.0)
+ activesupport (>= 7.0.0)
+ rack
+ railties (>= 7.0.0)
pry (0.14.2)
coderay (~> 1.1)
method_source (~> 1.0)
pry-byebug (3.10.1)
byebug (~> 11.0)
pry (>= 0.13, < 0.15)
+ psych (5.2.2)
+ date
+ stringio
public_suffix (6.0.1)
- racc (1.6.2)
- rack (2.2.5)
- rack-test (2.0.2)
+ racc (1.8.1)
+ rack (3.1.8)
+ rack-session (2.0.0)
+ rack (>= 3.0.0)
+ rack-test (2.2.0)
rack (>= 1.3)
- rails-dom-testing (2.0.3)
- activesupport (>= 4.2.0)
+ rackup (2.2.1)
+ rack (>= 3)
+ rails (8.0.1)
+ actioncable (= 8.0.1)
+ actionmailbox (= 8.0.1)
+ actionmailer (= 8.0.1)
+ actionpack (= 8.0.1)
+ actiontext (= 8.0.1)
+ actionview (= 8.0.1)
+ activejob (= 8.0.1)
+ activemodel (= 8.0.1)
+ activerecord (= 8.0.1)
+ activestorage (= 8.0.1)
+ activesupport (= 8.0.1)
+ bundler (>= 1.15.0)
+ railties (= 8.0.1)
+ rails-dom-testing (2.2.0)
+ activesupport (>= 5.0.0)
+ minitest
nokogiri (>= 1.6)
- rails-html-sanitizer (1.4.4)
- loofah (~> 2.19, >= 2.19.1)
- railties (7.0.4)
- actionpack (= 7.0.4)
- activesupport (= 7.0.4)
- method_source
+ rails-html-sanitizer (1.6.2)
+ loofah (~> 2.21)
+ 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)
+ railties (8.0.1)
+ actionpack (= 8.0.1)
+ activesupport (= 8.0.1)
+ irb (~> 1.13)
+ rackup (>= 1.0.0)
rake (>= 12.2)
- thor (~> 1.0)
- zeitwerk (~> 2.5)
+ thor (~> 1.0, >= 1.2.2)
+ zeitwerk (~> 2.6)
rainbow (3.1.1)
- rake (13.0.6)
+ rake (13.2.1)
rb-fsevent (0.11.2)
- rb-inotify (0.10.1)
+ rb-inotify (0.11.1)
ffi (~> 1.0)
rbtree (0.4.6)
- regexp_parser (2.6.1)
- rexml (3.2.5)
+ rdoc (6.10.0)
+ psych (>= 4.0.0)
+ regexp_parser (2.10.0)
+ reline (0.6.0)
+ io-console (~> 0.5)
+ rexml (3.4.0)
rouge (4.0.1)
- rspec (3.12.0)
- rspec-core (~> 3.12.0)
- rspec-expectations (~> 3.12.0)
- rspec-mocks (~> 3.12.0)
- rspec-core (3.12.0)
- rspec-support (~> 3.12.0)
- rspec-expectations (3.12.2)
+ rspec (3.13.0)
+ rspec-core (~> 3.13.0)
+ rspec-expectations (~> 3.13.0)
+ rspec-mocks (~> 3.13.0)
+ rspec-core (3.13.2)
+ rspec-support (~> 3.13.0)
+ rspec-expectations (3.13.3)
diff-lcs (>= 1.2.0, < 2.0)
- rspec-support (~> 3.12.0)
+ rspec-support (~> 3.13.0)
rspec-html-matchers (0.10.0)
nokogiri (~> 1)
rspec (>= 3.0.0.a)
- rspec-mocks (3.12.2)
+ rspec-mocks (3.13.2)
diff-lcs (>= 1.2.0, < 2.0)
- rspec-support (~> 3.12.0)
- rspec-rails (6.0.1)
- actionpack (>= 6.1)
- activesupport (>= 6.1)
- railties (>= 6.1)
- rspec-core (~> 3.11)
- rspec-expectations (~> 3.11)
- rspec-mocks (~> 3.11)
- rspec-support (~> 3.11)
- rspec-support (3.12.0)
- rubocop (1.43.0)
+ rspec-support (~> 3.13.0)
+ rspec-support (3.13.2)
+ rubocop (1.69.2)
json (~> 2.3)
+ language_server-protocol (>= 3.17.0)
parallel (~> 1.10)
- parser (>= 3.2.0.0)
+ parser (>= 3.3.0.2)
rainbow (>= 2.2.2, < 4.0)
- regexp_parser (>= 1.8, < 3.0)
- rexml (>= 3.2.5, < 4.0)
- rubocop-ast (>= 1.24.1, < 2.0)
+ regexp_parser (>= 2.9.3, < 3.0)
+ rubocop-ast (>= 1.36.2, < 2.0)
ruby-progressbar (~> 1.7)
- unicode-display_width (>= 2.4.0, < 3.0)
- rubocop-ast (1.24.1)
- parser (>= 3.1.1.0)
- rubocop-rails (2.17.4)
+ unicode-display_width (>= 2.4.0, < 4.0)
+ rubocop-ast (1.37.0)
+ parser (>= 3.3.1.0)
+ rubocop-capybara (2.21.0)
+ rubocop (~> 1.41)
+ rubocop-factory_bot (2.26.1)
+ rubocop (~> 1.61)
+ rubocop-rails (2.28.0)
activesupport (>= 4.2.0)
rack (>= 1.1)
- rubocop (>= 1.33.0, < 2.0)
- rubocop-rspec (2.16.0)
- rubocop (~> 1.33)
- ruby-progressbar (1.11.0)
+ rubocop (>= 1.52.0, < 2.0)
+ rubocop-ast (>= 1.31.1, < 2.0)
+ rubocop-rspec (2.31.0)
+ rubocop (~> 1.40)
+ rubocop-capybara (~> 2.17)
+ rubocop-factory_bot (~> 2.22)
+ rubocop-rspec_rails (~> 2.28)
+ rubocop-rspec_rails (2.29.1)
+ rubocop (~> 1.61)
+ ruby-progressbar (1.13.0)
rubypants (0.7.1)
- sass (3.7.4)
- sass-listen (~> 4.0.0)
- sass-listen (4.0.0)
- rb-fsevent (~> 0.9, >= 0.9.4)
- rb-inotify (~> 0.9, >= 0.9.7)
- sassc (2.4.0)
- ffi (~> 1.9)
- sassc-rails (2.1.2)
- railties (>= 4.0.0)
- sassc (>= 2.0)
- sprockets (> 3.0)
- sprockets-rails
- tilt
- set (1.1.0)
+ securerandom (0.4.1)
+ set (1.1.1)
shellany (0.0.1)
simplecov (0.22.0)
docile (~> 1.1)
simplecov-html (~> 0.11)
simplecov_json_formatter (~> 0.1)
- simplecov-html (0.12.3)
+ simplecov-html (0.13.1)
simplecov_json_formatter (0.1.4)
slim (4.1.0)
temple (>= 0.7.6, < 0.9)
@@ -264,19 +381,15 @@ GEM
sorted_set (1.0.3)
rbtree
set (~> 1.0)
- sprockets (4.2.0)
- concurrent-ruby (~> 1.0)
- rack (>= 2.2.4, < 4)
- sprockets-rails (3.4.2)
- actionpack (>= 5.2)
- activesupport (>= 5.2)
- sprockets (>= 3.0.0)
- sqlite3 (1.5.4)
- mini_portile2 (~> 2.8.0)
+ sqlite3 (2.5.0-arm64-darwin)
+ sqlite3 (2.5.0-x86_64-darwin)
+ sqlite3 (2.5.0-x86_64-linux-gnu)
+ stringio (3.1.2)
sysexits (1.2.0)
temple (0.8.2)
- thor (1.2.1)
+ thor (1.3.2)
tilt (2.0.11)
+ timeout (0.4.3)
tty-color (0.6.0)
tty-command (0.10.1)
pastel (~> 0.8)
@@ -284,14 +397,20 @@ GEM
tty-which (0.5.0)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
- unicode-display_width (2.4.2)
- view_component (2.83.0)
- activesupport (>= 5.2.0, < 8.0)
+ unicode-display_width (3.1.3)
+ unicode-emoji (~> 4.0, >= 4.0.4)
+ unicode-emoji (4.0.4)
+ uri (1.0.2)
+ useragent (0.16.11)
+ view_component (3.21.0)
+ activesupport (>= 5.2.0, < 8.1)
concurrent-ruby (~> 1.0)
method_source (~> 1.0)
webrick (1.7.0)
- yard (0.9.28)
- webrick (~> 1.7.0)
+ websocket-driver (0.7.6)
+ websocket-extensions (>= 0.1.0)
+ websocket-extensions (0.1.5)
+ yard (0.9.37)
zeitwerk (2.7.1)
PLATFORMS
@@ -303,6 +422,7 @@ PLATFORMS
x86_64-linux
DEPENDENCIES
+ cssbundling-rails
deep_merge
dsfr-view-components!
guard
@@ -313,17 +433,15 @@ DEPENDENCIES
kramdown (~> 2.4.0)
nanoc
nanoc-live
+ propshaft
pry-byebug
+ rails (~> 8)
rouge (~> 4.0.0)
rspec-html-matchers (~> 0.9)
- rspec-rails
rubocop
rubocop-rails
- rubocop-rspec (~> 2.14)
+ rubocop-rspec
rubypants (~> 0.7.0)
- sass
- sassc (~> 2.4.0)
- sassc-rails
simplecov (~> 0.20)
slim (~> 4.1.0)
slim_lint (~> 0.22.0)
diff --git a/Makefile b/Makefile
index bc7b33bf..35abd460 100644
--- a/Makefile
+++ b/Makefile
@@ -23,7 +23,7 @@ nanoc-check-external:
nanoc-check-all: build-guide
( ${guide_dir} ${prefix} nanoc check ${nanoc_internal_checks} ${nanoc_external_checks} )
build:
- ${prefix} gem build dsfr-components.gemspec
+ ${prefix} gem build dsfr-view-components.gemspec
build-guide: npm-install
( ${guide_dir} ${prefix} nanoc )
view-guide: build-guide
diff --git a/dsfr-view-components.gemspec b/dsfr-view-components.gemspec
index 96a841b1..45d81185 100644
--- a/dsfr-view-components.gemspec
+++ b/dsfr-view-components.gemspec
@@ -2,6 +2,8 @@ $LOAD_PATH.push File.expand_path("lib", __dir__)
require "dsfr/components/version"
+DEFAULT_RAILS_VERSION = "~> 8"
+
METADATA = {
"bug_tracker_uri" => "https://github.com/betagouv/dsfr-view-components/issues",
"changelog_uri" => "https://github.com/betagouv/dsfr-view-components/releases",
@@ -24,27 +26,24 @@ Gem::Specification.new do |spec|
spec.required_ruby_version = '>= 3.2'
- exact_rails_version = ENV.key?("RAILS_VERSION")
- rails_version = ENV.fetch("RAILS_VERSION") { "6.1.5" }
-
spec.add_dependency "html-attributes-utils", "~> 1"
spec.add_dependency "pagy", "~> 6"
- spec.add_dependency "view_component", "~> 2"
+ spec.add_dependency "view_component", "~> 3"
spec.add_development_dependency "deep_merge"
spec.add_development_dependency "guard"
spec.add_development_dependency "guard-rspec"
spec.add_development_dependency "pry-byebug"
spec.add_development_dependency "rspec-html-matchers", "~> 0.9"
- spec.add_development_dependency "rspec-rails"
spec.add_development_dependency "rubocop"
- spec.add_development_dependency "rubocop-rails"
- spec.add_development_dependency "sassc-rails"
spec.add_development_dependency("simplecov", "~> 0.20")
spec.add_development_dependency "sqlite3"
spec.add_development_dependency "yard"
+
# Required for the guide
+ spec.add_development_dependency("rails", ENV.fetch("RAILS_VERSION", DEFAULT_RAILS_VERSION))
+ spec.add_development_dependency("propshaft")
spec.add_development_dependency("haml", "~> 6.1.1")
spec.add_development_dependency("haml_lint")
spec.add_development_dependency("htmlbeautifier", "~> 1.4.1")
@@ -52,8 +51,6 @@ Gem::Specification.new do |spec|
spec.add_development_dependency("nanoc", "~> 4.11")
spec.add_development_dependency("rouge", "~> 4.0.0")
spec.add_development_dependency("rubypants", "~> 0.7.0")
- spec.add_development_dependency("sass")
- spec.add_development_dependency("sassc", "~> 2.4.0")
spec.add_development_dependency("slim", "~> 4.1.0")
spec.add_development_dependency("slim_lint", "~> 0.22.0")
spec.add_development_dependency("webrick", "~> 1.7.0")
diff --git a/guide/content/components/accordion.haml b/guide/content/components/accordion.haml
index 4cb67442..6af0bcab 100644
--- a/guide/content/components/accordion.haml
+++ b/guide/content/components/accordion.haml
@@ -7,15 +7,15 @@ title: Accordéon
présentés dans une page.
= render('/partials/example.haml',
- caption: "Accordéon section unique",
- code: accordion_single) do
+ caption: "Accordéon section unique",
+ code: accordion_single) do
:markdown
Vous pouvez aussi utiliser le helper `dsfr_accordion` avec une unique section.
La section sera alors wrappée par une div `fr-accordions-group` invisible.
= render('/partials/example.haml',
- caption: "Accordéon avec trois sections",
- code: accordion_normal) do
+ caption: "Accordéon avec trois sections",
+ code: accordion_normal) do
:markdown
Les titres `title` et les contenus sont obligatoires pour les sections.
L'attribut `id` est optionnel et permet de définir une ancre HTML réutilisable.
diff --git a/guide/content/components/alert.haml b/guide/content/components/alert.haml
index ef40b71c..9b137fe0 100644
--- a/guide/content/components/alert.haml
+++ b/guide/content/components/alert.haml
@@ -11,29 +11,27 @@ title: Alerte
En taille SM l'alerte ne peut pas avoir de titre et doit avoir un contenu.
= render('/partials/example.haml',
- caption: "Alerte MD de succès avec du contenu",
- code: alert_md_success_with_content) do
+ caption: "Alerte MD de succès avec du contenu",
+ code: alert_md_success_with_content) do
:markdown
Une alerte a un `type` obligatoire parmi `:error`, `:success`, `:info` ou `:warning`.
= render('/partials/example.haml',
- caption: "Alerte MD de succès sans contenu",
- code: alert_md_success_without_content) do
-
+ caption: "Alerte MD de succès sans contenu",
+ code: alert_md_success_without_content) do
:markdown
En taille MD, le titre `title` est obligatoire pour les alertes mais le contenu est optionnel.
= render('/partials/example.haml',
- caption: "Alerte d'erreur taille SM sans contenu",
- code: alert_sm_error) do
-
+ caption: "Alerte d'erreur taille SM sans contenu",
+ code: alert_sm_error) do
:markdown
La taille `size` peut être `:sm` ou `:md` (par défaut).
A l'inverse, en taille SM il ne peut pas y avoir de titre mais le contenu est obligatoire.
= render('/partials/example.haml',
- caption: "Alerte avec un bouton pour fermer",
- code: alert_md_with_close_button)
+ caption: "Alerte avec un bouton pour fermer",
+ code: alert_md_with_close_button)
= render('/partials/related-info.haml', links: dsfr_component_doc_link("Alerte"))
diff --git a/guide/content/introduction/options.haml b/guide/content/introduction/options.haml
index 366dc3ca..9b907bc3 100644
--- a/guide/content/introduction/options.haml
+++ b/guide/content/introduction/options.haml
@@ -11,9 +11,8 @@ title: Options communes
Ces paramètres fonctionnent de la même manière pour tous les composants et slots.
= render('/partials/example.haml',
- caption: "Alerte avec des classes CSS spécifiques",
- code: alert_with_classes) do
-
+ caption: "Alerte avec des classes CSS spécifiques",
+ code: alert_with_classes) do
:markdown
Tous les composants, slots et helpers ont des classes CSS par défaut permettant de les faire
fonctionner avec le DSFR.
@@ -25,13 +24,11 @@ title: Options communes
par des espaces.
= render('/partials/example.haml',
- caption: "Alerte avec des attributs HTML spécifiques",
- code: alert_with_html_attributes) do
-
+ caption: "Alerte avec des attributs HTML spécifiques",
+ code: alert_with_html_attributes) do
:markdown
Le fonctionnement est similaire avec le paramètre `html_attributes` à la différence que cet
argument doit être passé sous forme d'un Hash.
Vous pouvez utiliser la [convention Rails](https://api.rubyonrails.org/classes/ActionView/Helpers/TagHelper.html#method-i-tag){:target="_blank" rel="noopener"}
d'imbriquer les attributs `aria` et `data`.
-
diff --git a/guide/layouts/partials/footer.haml b/guide/layouts/partials/footer.haml
index 983bdd4f..a0c9c699 100644
--- a/guide/layouts/partials/footer.haml
+++ b/guide/layouts/partials/footer.haml
@@ -33,13 +33,13 @@
%a.fr-footer__bottom-link{href: "/"} Accueil
%li.fr-footer__bottom-item
%button.fr-footer__bottom-link{"aria-controls": "fr-theme-modal",
- "data-fr-opened": "false"}
+ "data-fr-opened": "false"}
Paramètres d'affichage
.fr-footer__bottom-copy
%p
Sauf mention contraire, tous les contenus de ce site sont sous
= link_to "licence etalab-2.0", "https://github.com/etalab/licence-ouverte/blob/master/LO.md",
- target: "_blank", rel: "noopener"
+ target: "_blank", rel: "noopener"
= render "/partials/theme-modal.haml"
diff --git a/guide/lib/examples/accordion_helpers.rb b/guide/lib/examples/accordion_helpers.rb
index fdba7224..67e1911f 100644
--- a/guide/lib/examples/accordion_helpers.rb
+++ b/guide/lib/examples/accordion_helpers.rb
@@ -9,9 +9,9 @@ def accordion_single
def accordion_normal
<<~ACCORDION
= dsfr_accordion do |accordion|
- - accordion.section(title: "Un") { tag.p("Premier contenu") }
- - accordion.section(title: "Deux", id: "section-deux") { tag.p("Deuxième contenu") }
- - accordion.section(title: "Trois", expanded: true) { tag.p("Troisième contenu déplié") }
+ - accordion.with_section(title: "Un") { tag.p("Premier contenu") }
+ - accordion.with_section(title: "Deux", id: "section-deux") { tag.p("Deuxième contenu") }
+ - accordion.with_section(title: "Trois", expanded: true) { tag.p("Troisième contenu déplié") }
ACCORDION
end
end
diff --git a/guide/lib/examples/breadcrumbs_helper.rb b/guide/lib/examples/breadcrumbs_helper.rb
index d3c46447..4ad9d93e 100644
--- a/guide/lib/examples/breadcrumbs_helper.rb
+++ b/guide/lib/examples/breadcrumbs_helper.rb
@@ -3,10 +3,10 @@ module BreadcrumbsHelpers
def breadcrumbs
<<~BREADCRUMBS
= dsfr_breadcrumbs do |b|
- = b.breadcrumb label: "Accueil", href: "#"
- = b.breadcrumb label: "Section 1", href: "#"
- = b.breadcrumb label: "Sous-section 2", href: "#"
- = b.breadcrumb label: "Cette page"
+ = b.with_breadcrumb label: "Accueil", href: "#"
+ = b.with_breadcrumb label: "Section 1", href: "#"
+ = b.with_breadcrumb label: "Sous-section 2", href: "#"
+ = b.with_breadcrumb label: "Cette page"
BREADCRUMBS
end
end
diff --git a/guide/lib/examples/tabs_helpers.rb b/guide/lib/examples/tabs_helpers.rb
index 519b24d2..4e58559c 100644
--- a/guide/lib/examples/tabs_helpers.rb
+++ b/guide/lib/examples/tabs_helpers.rb
@@ -3,9 +3,9 @@ module TabsHelpers
def tabs_default
<<~RAW
= dsfr_tabs do |tabs|
- - tabs.tab title: "Onglet 1", active: true do
+ - tabs.with_tab title: "Onglet 1", active: true do
%p Contenu de l’onglet 1
- - tabs.tab title: "Onglet 2" do
+ - tabs.with_tab title: "Onglet 2" do
%p Contenu de l’onglet 2
RAW
end
@@ -13,11 +13,11 @@ def tabs_default
def tabs_with_icons
<<~RAW
= dsfr_tabs do |tabs|
- - tabs.tab title: "Comment ça marche ?", icon: "info-fill" do
+ - tabs.with_tab title: "Comment ça marche ?", icon: "info-fill" do
%p Ça marche bien
- - tabs.tab title: "Contact", icon: "mail-line" do
+ - tabs.with_tab title: "Contact", icon: "mail-line" do
%p Contactez-nous par email
- - tabs.tab title: "Support", active: true, icon: "settings-5-line" do
+ - tabs.with_tab title: "Support", active: true, icon: "settings-5-line" do
%p Support technique
RAW
end
@@ -25,10 +25,10 @@ def tabs_with_icons
def tabs_with_links
<<~RAW
= dsfr_tabs do |tabs|
- - tabs.tab title: "Première page", path: "#onglet-1"
- - tabs.tab title: "Deuxième page", active: true do
+ - tabs.with_tab title: "Première page", path: "#onglet-1"
+ - tabs.with_tab title: "Deuxième page", active: true do
%p Contenu de l’onglet 2
- - tabs.tab title: "Troisième page", path: "#onglet-3"
+ - tabs.with_tab title: "Troisième page", path: "#onglet-3"
RAW
end
end
diff --git a/lib/dsfr/components/version.rb b/lib/dsfr/components/version.rb
index 9baed07f..bbcfa6a1 100644
--- a/lib/dsfr/components/version.rb
+++ b/lib/dsfr/components/version.rb
@@ -1,5 +1,5 @@
module Dsfr
module Components
- VERSION = '1.5.3'.freeze
+ VERSION = '2.0.0'.freeze
end
end
diff --git a/spec/components/dsfr_component/accordion_component_spec.rb b/spec/components/dsfr_component/accordion_component_spec.rb
index a7425b22..3073cbb6 100644
--- a/spec/components/dsfr_component/accordion_component_spec.rb
+++ b/spec/components/dsfr_component/accordion_component_spec.rb
@@ -4,8 +4,8 @@
context "two sections" do
subject! do
render_inline(DsfrComponent::AccordionComponent.new) do |component|
- component.section(title: "Un") { "Premier contenu" }
- component.section(title: "Deux") { "Deuxième contenu" }
+ component.with_section(title: "Un") { "Premier contenu" }
+ component.with_section(title: "Deux") { "Deuxième contenu" }
end
end
@@ -30,7 +30,7 @@
context "with a specific section id" do
subject! do
render_inline(DsfrComponent::AccordionComponent.new) do |component|
- component.section(title: "Un", id: "test-un") { "Premier contenu" }
+ component.with_section(title: "Un", id: "test-un") { "Premier contenu" }
end
end
@@ -49,7 +49,7 @@
context "with an expanded section" do
subject! do
render_inline(DsfrComponent::AccordionComponent.new) do |component|
- component.section(title: "Un", expanded: true) { "Premier contenu" }
+ component.with_section(title: "Un", expanded: true) { "Premier contenu" }
end
end
diff --git a/spec/components/dsfr_component/breadcrumbs_component_spec.rb b/spec/components/dsfr_component/breadcrumbs_component_spec.rb
index a936ce10..310234d8 100644
--- a/spec/components/dsfr_component/breadcrumbs_component_spec.rb
+++ b/spec/components/dsfr_component/breadcrumbs_component_spec.rb
@@ -3,8 +3,8 @@
RSpec.describe(DsfrComponent::BreadcrumbsComponent, type: :component) do
subject! do
render_inline(described_class.new) do |b|
- b.breadcrumb(label: "Accueil", href: "/")
- b.breadcrumb(label: "Cette page")
+ b.with_breadcrumb(label: "Accueil", href: "/")
+ b.with_breadcrumb(label: "Cette page")
end
end
diff --git a/spec/components/dsfr_component/tabs_component_spec.rb b/spec/components/dsfr_component/tabs_component_spec.rb
index 14993df6..3e1c6d1b 100644
--- a/spec/components/dsfr_component/tabs_component_spec.rb
+++ b/spec/components/dsfr_component/tabs_component_spec.rb
@@ -4,10 +4,10 @@
context "with basic usage" do
subject! do
render_inline(described_class.new) do |tabs|
- tabs.tab(title: "Onglet 1", active: true) do
+ tabs.with_tab(title: "Onglet 1", active: true) do
"contenu premier onglet"
end
- tabs.tab(title: "Onglet 2") do
+ tabs.with_tab(title: "Onglet 2") do
"contenu deuxième onglet"
end
end
@@ -40,13 +40,13 @@
context "with icons" do
subject! do
render_inline(described_class.new) do |tabs|
- tabs.tab(title: "Comment ça marche ?", icon: "info-line") do
+ tabs.with_tab(title: "Comment ça marche ?", icon: "info-line") do
"Ça marche bien"
end
- tabs.tab(title: "Contact", icon: "mail-line") do
+ tabs.with_tab(title: "Contact", icon: "mail-line") do
"Contactez-nous par email"
end
- tabs.tab(title: "Support", active: true, icon: "settings-5-line") do
+ tabs.with_tab(title: "Support", active: true, icon: "settings-5-line") do
"Support technique"
end
end
@@ -81,11 +81,11 @@
context "with links instead of buttons" do
subject! do
render_inline(described_class.new) do |tabs|
- tabs.tab(title: "Onglet 1", path: "/onglet-1")
- tabs.tab(title: "Onglet 2", active: true) do
+ tabs.with_tab(title: "Onglet 1", path: "/onglet-1")
+ tabs.with_tab(title: "Onglet 2", active: true) do
"contenu deuxième onglet chargé"
end
- tabs.tab(title: "Onglet 3", path: "/onglet-3")
+ tabs.with_tab(title: "Onglet 3", path: "/onglet-3")
end
end
diff --git a/spec/dummy/.ruby-version b/spec/dummy/.ruby-version
index ef538c28..9c25013d 100644
--- a/spec/dummy/.ruby-version
+++ b/spec/dummy/.ruby-version
@@ -1 +1 @@
-3.1.2
+3.3.6
diff --git a/spec/dummy/Procfile.dev b/spec/dummy/Procfile.dev
new file mode 100644
index 00000000..7eaba233
--- /dev/null
+++ b/spec/dummy/Procfile.dev
@@ -0,0 +1,2 @@
+web: env RUBY_DEBUG_OPEN=true bin/rails server
+css: bun run build:css --watch
diff --git a/spec/dummy/app/assets/builds/.keep b/spec/dummy/app/assets/builds/.keep
new file mode 100644
index 00000000..e69de29b
diff --git a/spec/dummy/app/assets/config/manifest.js b/spec/dummy/app/assets/config/manifest.js
deleted file mode 100644
index 317b45aa..00000000
--- a/spec/dummy/app/assets/config/manifest.js
+++ /dev/null
@@ -1,3 +0,0 @@
-//= link_tree ../images
-//= link_directory ../stylesheets .css
-//= link application.js
diff --git a/spec/dummy/app/assets/stylesheets/application.sass.scss b/spec/dummy/app/assets/stylesheets/application.sass.scss
new file mode 100644
index 00000000..94906978
--- /dev/null
+++ b/spec/dummy/app/assets/stylesheets/application.sass.scss
@@ -0,0 +1,2 @@
+// Entry point for your Sass build
+@import "@gouvfr/dsfr/dist/dsfr.min";
diff --git a/spec/dummy/app/assets/stylesheets/application.scss b/spec/dummy/app/assets/stylesheets/application.scss
deleted file mode 100644
index 7e75462b..00000000
--- a/spec/dummy/app/assets/stylesheets/application.scss
+++ /dev/null
@@ -1,2 +0,0 @@
-@import "@gouvfr/dsfr/dist/dsfr.css";
-@import "prismjs/themes/prism-tomorrow";
diff --git a/spec/dummy/app/views/layouts/application.html.erb b/spec/dummy/app/views/layouts/application.html.erb
index 9284c99d..8f8469cd 100644
--- a/spec/dummy/app/views/layouts/application.html.erb
+++ b/spec/dummy/app/views/layouts/application.html.erb
@@ -7,7 +7,7 @@
<%= csp_meta_tag %>
<%# %>
- <%= stylesheet_link_tag 'application', media: 'all' %>
+ <%= stylesheet_link_tag :app, "data-turbo-track": "reload" %>
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
@@ -84,16 +84,10 @@
- <%# dsfr_skip_link %>
- <%# dsfr_header(crown: false, logotype: "GOV.UK Components") %>
-
<%= yield %>
-
- <%# dsfr_footer(meta_items: { "GitHub" => "https://github.com/DFE-Digital/govuk-components", "RubyGems" => "https://rubygems.org/gems/govuk-components", "DfE Digital" => "https://dfedigital.blog.gov.uk/" }) %>
-