compony 0.11.12 → 0.11.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +2 -0
  3. data/CHANGELOG.md +9 -0
  4. data/Gemfile +3 -0
  5. data/Gemfile.lock +145 -106
  6. data/README.md +12 -1
  7. data/Rakefile +10 -0
  8. data/TODO.md +2 -1
  9. data/VERSION +1 -1
  10. data/compony.gemspec +5 -3
  11. data/doc/ComponentGenerator.html +1 -1
  12. data/doc/Components.html +1 -1
  13. data/doc/ComponentsGenerator.html +1 -1
  14. data/doc/Compony/Component.html +1 -1
  15. data/doc/Compony/ComponentMixins/Default/Labelling.html +1 -1
  16. data/doc/Compony/ComponentMixins/Default/Standalone/ResourcefulVerbDsl.html +1 -1
  17. data/doc/Compony/ComponentMixins/Default/Standalone/StandaloneDsl.html +1 -1
  18. data/doc/Compony/ComponentMixins/Default/Standalone/VerbDsl.html +1 -1
  19. data/doc/Compony/ComponentMixins/Default/Standalone.html +1 -1
  20. data/doc/Compony/ComponentMixins/Default.html +1 -1
  21. data/doc/Compony/ComponentMixins/Resourceful.html +1 -1
  22. data/doc/Compony/ComponentMixins.html +1 -1
  23. data/doc/Compony/Components/Buttons/CssButton.html +1 -1
  24. data/doc/Compony/Components/Buttons/Link.html +1 -1
  25. data/doc/Compony/Components/Buttons.html +1 -1
  26. data/doc/Compony/Components/Destroy.html +1 -1
  27. data/doc/Compony/Components/Edit.html +1 -1
  28. data/doc/Compony/Components/Form.html +1 -1
  29. data/doc/Compony/Components/Index.html +1 -1
  30. data/doc/Compony/Components/List.html +1 -1
  31. data/doc/Compony/Components/New.html +1 -1
  32. data/doc/Compony/Components/Show.html +1 -1
  33. data/doc/Compony/Components/WithForm.html +1 -1
  34. data/doc/Compony/Components.html +1 -1
  35. data/doc/Compony/ControllerMixin.html +1 -1
  36. data/doc/Compony/Engine.html +1 -1
  37. data/doc/Compony/Intent.html +1 -1
  38. data/doc/Compony/ManageIntentsDsl.html +2 -2
  39. data/doc/Compony/MethodAccessibleHash.html +1 -1
  40. data/doc/Compony/ModelFields/Anchormodel.html +1 -1
  41. data/doc/Compony/ModelFields/Association.html +1 -1
  42. data/doc/Compony/ModelFields/Attachment.html +1 -1
  43. data/doc/Compony/ModelFields/Base.html +8 -2
  44. data/doc/Compony/ModelFields/Boolean.html +1 -1
  45. data/doc/Compony/ModelFields/Color.html +1 -1
  46. data/doc/Compony/ModelFields/Currency.html +1 -1
  47. data/doc/Compony/ModelFields/Date.html +1 -1
  48. data/doc/Compony/ModelFields/Datetime.html +1 -1
  49. data/doc/Compony/ModelFields/Decimal.html +1 -1
  50. data/doc/Compony/ModelFields/Email.html +1 -1
  51. data/doc/Compony/ModelFields/Float.html +1 -1
  52. data/doc/Compony/ModelFields/Integer.html +1 -1
  53. data/doc/Compony/ModelFields/Percentage.html +1 -1
  54. data/doc/Compony/ModelFields/Phone.html +1 -1
  55. data/doc/Compony/ModelFields/RichText.html +1 -1
  56. data/doc/Compony/ModelFields/String.html +1 -1
  57. data/doc/Compony/ModelFields/Text.html +1 -1
  58. data/doc/Compony/ModelFields/Time.html +1 -1
  59. data/doc/Compony/ModelFields/Url.html +1 -1
  60. data/doc/Compony/ModelFields.html +1 -1
  61. data/doc/Compony/ModelMixin.html +1 -1
  62. data/doc/Compony/NaturalOrdering.html +1 -1
  63. data/doc/Compony/RequestContext.html +1 -1
  64. data/doc/Compony/Version.html +1 -1
  65. data/doc/Compony/ViewHelpers.html +1 -1
  66. data/doc/Compony/VirtualModel.html +1 -1
  67. data/doc/Compony.html +1 -1
  68. data/doc/ComponyController.html +1 -1
  69. data/doc/_index.html +1 -1
  70. data/doc/file.CHANGELOG.html +84 -77
  71. data/doc/file.README.html +21 -11
  72. data/doc/file.basic_component.html +14 -14
  73. data/doc/file.cookbook.html +27 -27
  74. data/doc/file.destroy.html +2 -2
  75. data/doc/file.dsl_reference.html +199 -199
  76. data/doc/file.edit.html +3 -3
  77. data/doc/file.example.html +13 -13
  78. data/doc/file.example_advanced.html +10 -10
  79. data/doc/file.feasibility.html +2 -2
  80. data/doc/file.form.html +7 -7
  81. data/doc/file.generators.html +3 -3
  82. data/doc/file.glossary.html +44 -44
  83. data/doc/file.gotchas.html +35 -35
  84. data/doc/file.index.html +10 -10
  85. data/doc/file.inheritance.html +5 -5
  86. data/doc/file.installation.html +9 -9
  87. data/doc/file.integrations.html +46 -46
  88. data/doc/file.intents.html +11 -11
  89. data/doc/file.internal_datastructures.html +6 -6
  90. data/doc/file.list.html +35 -35
  91. data/doc/file.maintaining.html +21 -21
  92. data/doc/file.model_fields.html +3 -3
  93. data/doc/file.nesting.html +5 -5
  94. data/doc/file.new.html +3 -3
  95. data/doc/file.ownership.html +2 -2
  96. data/doc/file.patterns.html +50 -50
  97. data/doc/file.pre_built_components.html +2 -2
  98. data/doc/file.resourceful.html +5 -5
  99. data/doc/file.show.html +17 -17
  100. data/doc/file.standalone.html +12 -12
  101. data/doc/file.virtual_models.html +2 -2
  102. data/doc/file.with_form.html +23 -23
  103. data/doc/index.html +21 -11
  104. data/doc/top-level-namespace.html +1 -1
  105. data/lib/compony/model_fields/base.rb +3 -0
  106. data/spec/README.md +22 -0
  107. data/spec/compony/component_spec.rb +80 -0
  108. data/spec/compony/compony_spec.rb +102 -0
  109. data/spec/compony/intent_spec.rb +94 -0
  110. data/spec/compony/method_accessible_hash_spec.rb +32 -0
  111. data/spec/compony/model_fields_spec.rb +70 -0
  112. data/spec/compony/model_mixin_spec.rb +81 -0
  113. data/spec/compony/natural_ordering_spec.rb +61 -0
  114. data/spec/dummy/app/components/statics/home.rb +17 -0
  115. data/spec/dummy/app/components/statics/secret.rb +15 -0
  116. data/spec/dummy/app/components/users/destroy.rb +2 -0
  117. data/spec/dummy/app/components/users/edit.rb +2 -0
  118. data/spec/dummy/app/components/users/form.rb +14 -0
  119. data/spec/dummy/app/components/users/index.rb +29 -0
  120. data/spec/dummy/app/components/users/new.rb +2 -0
  121. data/spec/dummy/app/components/users/show.rb +26 -0
  122. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  123. data/spec/dummy/app/models/ability.rb +7 -0
  124. data/spec/dummy/app/models/application_record.rb +4 -0
  125. data/spec/dummy/app/models/user.rb +22 -0
  126. data/spec/dummy/app/views/layouts/application.html.erb +7 -0
  127. data/spec/dummy/config/application.rb +20 -0
  128. data/spec/dummy/config/database.yml +3 -0
  129. data/spec/dummy/config/environment.rb +3 -0
  130. data/spec/dummy/config/initializers/simple_form.rb +9 -0
  131. data/spec/dummy/config/routes.rb +3 -0
  132. data/spec/dummy/db/schema.rb +14 -0
  133. data/spec/rails_helper.rb +23 -0
  134. data/spec/requests/authorization_spec.rb +16 -0
  135. data/spec/requests/plain_component_spec.rb +9 -0
  136. data/spec/requests/routing_spec.rb +20 -0
  137. data/spec/requests/users_crud_spec.rb +99 -0
  138. metadata +62 -1
data/doc/file.README.html CHANGED
@@ -60,7 +60,7 @@
60
60
  <div id="content"><div id='filecontents'>
61
61
  <p>&lt;img src=“logo.svg” height=250 alt=“Compony logo”/&gt;</p>
62
62
 
63
- <h1 id="label-Where+to+read+what">Where to read what</h1>
63
+ <h1 id="where-to-read-what">Where to read what</h1>
64
64
  <ul><li>
65
65
  <p>Get to know what Compony is and which concepts it uses in the <a href="https://github.com/kalsan/compony">README on GitHub</a>.</p>
66
66
  </li><li>
@@ -69,7 +69,7 @@
69
69
  <p>There is also a <a href="https://www.rubydoc.info/github/kalsan/compony.git">RubyDoc page for Compony</a> available.</p>
70
70
  </li></ul>
71
71
 
72
- <h1 id="label-About+Compony">About Compony</h1>
72
+ <h1 id="about-compony">About Compony</h1>
73
73
 
74
74
  <p>Compony is a Gem that allows you to write your Rails application in <strong>component-style</strong> fashion. It combines a controller action and route along with its view into a single Ruby class. Along with the DSL approach and a powerful model mixin, Compony <strong>makes your application’s code more semantic</strong>, allows writing <strong>much DRYer code</strong>, using inheritance even in views and <strong>much easier refactoring</strong> for your Rails applications, helping you to <strong>keep the code clean as the application evolves</strong>.</p>
75
75
 
@@ -95,15 +95,15 @@
95
95
  <p>Compony uses <a href="https://github.com/CanCanCommunity/cancancan">CanCanCan</a> for authorization but does not provide an authentication mechanism. You can easily build your own by creating login/logout components that manage cookies, and configure Compony to enforce authentication using the <code>Compony.authentication_before_action</code> setter. I have also successfully tested Compony to work with <a href="https://github.com/heartcombo/devise">Devise</a>.</p>
96
96
  </li></ul>
97
97
 
98
- <h2 id="label-State+of+the+project">State of the project</h2>
98
+ <h2 id="state-of-the-project">State of the project</h2>
99
99
 
100
- <p>I am actively using this framework in various applications and both performance and reliability are good. However, the project is experimental and lacking peer reviews and especially automatic testing, such as unit and integration tests. Also, expect there to be (<a href="/CHANGELOG_md.html">documented</a>) breaking changes in the future, as the API will likely be further refined, resulting in renamings and deprecation of various methods.</p>
100
+ <p>I am actively using this framework in various applications and both performance and reliability are good. However, the project is experimental and lacking peer reviews and especially extensive automatic testing, such as unit and integration tests. Also, expect there to be (<a href="/CHANGELOG_md.html">documented</a>) breaking changes in the future, as the API will likely be further refined, resulting in renamings and deprecation of various methods.</p>
101
101
 
102
- <h2 id="label-Other+projects+exploring+similar+concepts">Other projects exploring similar concepts</h2>
102
+ <h2 id="other-projects-exploring-similar-concepts">Other projects exploring similar concepts</h2>
103
103
 
104
104
  <p>A project with a similar aim, but a different approach, is <a href="https://github.com/phlex-ruby/phlex">Phlex</a>.</p>
105
105
 
106
- <h1 id="label-Guide+-2F+Documentation">Guide / Documentation</h1>
106
+ <h1 id="guide--documentation">Guide / Documentation</h1>
107
107
 
108
108
  <p>The following topics should help you get started. Please note that the links will not work in yard doc - read this on <a href="https://github.com/kalsan/compony">Compony’s GitHub repo</a>.</p>
109
109
  <ul><li>
@@ -181,18 +181,28 @@
181
181
  </li></ul>
182
182
  </li></ul>
183
183
 
184
- <h1 id="label-Contributing">Contributing</h1>
184
+ <h1 id="contributing">Contributing</h1>
185
185
 
186
186
  <p>Compony is Free Software under the LGPLv3 and you are most welcome to contribute to it.</p>
187
187
  <ul><li>
188
- <p>If you spotted a security vulnerability, <strong>do not open an issue</strong> but instead use the contact form at <a href="https://kalsan.ch/#contact">kalsan.ch/#contact</a> instead (English is just fine, even if the website is in German).</p>
188
+ <p>If you spotted a security vulnerability, <strong>do not open an issue</strong> but instead use the contact form at <a href="https://kalsan.ch/#contact">https://kalsan.ch/#contact</a> instead (English is just fine, even if the website is in German).</p>
189
189
  </li><li>
190
190
  <p>If you’d like to contribute feedback or discuss something, please open an issue.</p>
191
191
  </li><li>
192
192
  <p>If you have an idea that is worth implementing, please fork the repo, implement your changes in your own fork, and open a pull request.</p>
193
193
  </li></ul>
194
194
 
195
- <h1 id="label-Caveats">Caveats</h1>
195
+ <h2 id="running-the-tests">Running the tests</h2>
196
+
197
+ <p>The gem ships an RSpec suite backed by a minimal dummy Rails app (in-memory SQLite, no setup needed):</p>
198
+
199
+ <pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_bundle'>bundle</span> <span class='id identifier rubyid_install'>install</span>
200
+ <span class='id identifier rubyid_bundle'>bundle</span> <span class='id identifier rubyid_exec'>exec</span> <span class='id identifier rubyid_rspec'>rspec</span> <span class='comment'># or: bundle exec rake spec (also the default rake task)
201
+ </span></code></pre>
202
+
203
+ <p>See <a href="./spec/README_md.html">spec/README.md</a> for the suite’s layout and the reasons behind the Gemfile’s <code>rails</code> and <code>rack</code> version pins.</p>
204
+
205
+ <h1 id="caveats">Caveats</h1>
196
206
  <ul><li>
197
207
  <p>The API is not yet as consistent as I’d like it. Examples:</p>
198
208
  </li><li>
@@ -212,7 +222,7 @@
212
222
  <p>Compony is not compatible with <code>tailwindcss-rails</code>. This is likely due to Tailwind automatically removing any CSS that is not used by the application and the usage detection not picking up Compony components, as their content is not provided in views.</p>
213
223
  </li></ul>
214
224
 
215
- <h1 id="label-Acknowledgements">Acknowledgements</h1>
225
+ <h1 id="acknowledgements">Acknowledgements</h1>
216
226
 
217
227
  <p>A big thank you to Alex and Koni who have patiently listened to my weird ideas and helped me developing them further, resulting in a few of the key concepts of Compony, such as <code>param_name</code>, or the way forms are structured.</p>
218
228
 
@@ -220,7 +230,7 @@
220
230
  </div></div>
221
231
 
222
232
  <div id="footer">
223
- Generated on Tue Jun 30 22:41:17 2026 by
233
+ Generated on Tue Aug 18 14:36:32 2026 by
224
234
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
225
235
  0.9.34 (ruby-3.4.9).
226
236
  </div>
@@ -60,15 +60,15 @@
60
60
  <div id="content"><div id='filecontents'>
61
61
  <p><a href="/README_md.html#guide--documentation">Back to the guide</a></p>
62
62
 
63
- <h1 id="label-What+is+a+component-3F">What is a component?</h1>
63
+ <h1 id="what-is-a-component">What is a component?</h1>
64
64
 
65
65
  <p>Compony components are nestable elements that are capable of replacing Rails’ routes, views and controllers. They structure code for data manipulation, authentication and rendering into a single class that can easily be subclassed. This is achieved with Compony’s DSL that provides a readable and overridable way to store your logic.</p>
66
66
 
67
67
  <p>Just like Rails, Compony is opinionated and you are advised to structure your code according to the examples and explanations. This makes it easier for others to dive into existing code.</p>
68
68
 
69
- <h1 id="label-A+basic+-28bare-29+component">A basic (bare) component</h1>
69
+ <h1 id="a-basic-bare-component">A basic (bare) component</h1>
70
70
 
71
- <h2 id="label-Naming">Naming</h2>
71
+ <h2 id="naming">Naming</h2>
72
72
 
73
73
  <p>Compony components must be named according to the pattern <code>Components::FamilyName::ComponentName</code>.</p>
74
74
  <ul><li>
@@ -81,7 +81,7 @@
81
81
 
82
82
  <p>If you have abstract components (i.e. components that your app never uses directly, but which you inherit from), you may name and place them arbitrarily.</p>
83
83
 
84
- <h2 id="label-Initialization-2C+manual+instantiation+and+rendering">Initialization, manual instantiation and rendering</h2>
84
+ <h2 id="initialization-manual-instantiation-and-rendering">Initialization, manual instantiation and rendering</h2>
85
85
 
86
86
  <p>You will rarely have to override <code>def initialize</code> of a component, as most of your code will go into the component’s <code>setup</code> block as explained below. However, when you do, make sure to forward all default arguments to the parent class, as they are essential to the component’s function:</p>
87
87
 
@@ -106,7 +106,7 @@
106
106
  &lt;%= index_users_comp.render(controller, locals: { weather: :sunny }) %&gt;
107
107
  </code></pre>
108
108
 
109
- <h2 id="label-Setup">Setup</h2>
109
+ <h2 id="setup">Setup</h2>
110
110
 
111
111
  <p>Every component must call the static method <code>setup</code> which will contain most of the code of your components. This can be achieved either by a call directly from your class, or by <a href="/doc/guide/inheritance_md.html">inheriting</a> from a component that calls <code>setup</code>. If both classes call the method, the inherited class’ <code>setup</code> is run first and the inheriting’s second, thus, the child class can override setup properties of the parent class.</p>
112
112
 
@@ -121,7 +121,7 @@
121
121
 
122
122
  <p>The code in setup is run at the end the component’s initialization. In this block, you will call a number of methods that define the component’s behavior and which we will explain now.</p>
123
123
 
124
- <h3 id="label-Labelling">Labelling</h3>
124
+ <h3 id="labelling">Labelling</h3>
125
125
 
126
126
  <p>This defines a component’s label, both as seen from within the component and from the outside, e.g. from an <a href="/doc/guide/intents_md.html">intent</a>. You can query the label in order to display it as a title in your component. Links and buttons to components will also display the same label, allowing you to easily rename a component, including any parts of your UI that point to it.</p>
127
127
 
@@ -174,11 +174,11 @@
174
174
  </span><span class='id identifier rubyid_my_component'>my_component</span><span class='period'>.</span><span class='id identifier rubyid_icon'>icon</span> <span class='comment'># [:&#39;fa-solid&#39;, :circle]
175
175
  </span></code></pre>
176
176
 
177
- <h3 id="label-Providing+content">Providing content</h3>
177
+ <h3 id="providing-content">Providing content</h3>
178
178
 
179
179
  <p>Basic components do not come with default content. Instead, you must call the method <code>content</code> inside the setup block and provide a block containing your view. It will be evaluated inside a <a href="/doc/guide/internal_datastructures_md.html#requestcontext">request context</a>.</p>
180
180
 
181
- <p>In this block, provide the HTML to be generated using Dyny: <a href="https://github.com/kalsan/dyny">github.com/kalsan/dyny</a></p>
181
+ <p>In this block, provide the HTML to be generated using Dyny: <a href="https://github.com/kalsan/dyny">https://github.com/kalsan/dyny</a></p>
182
182
 
183
183
  <p>Here is an example of a component that renders a title along with a paragraph:</p>
184
184
 
@@ -191,7 +191,7 @@
191
191
  <span class='kw'>end</span>
192
192
  </code></pre>
193
193
 
194
- <h4 id="label-Naming+content+blocks-2C+ordering+and+overriding+them+in+subclasses">Naming content blocks, ordering and overriding them in subclasses</h4>
194
+ <h4 id="naming-content-blocks-ordering-and-overriding-them-in-subclasses">Naming content blocks, ordering and overriding them in subclasses</h4>
195
195
 
196
196
  <p>Content blocks are actually named. The <code>content</code> call adds or replaces a previously defined content block, e.g. in an earlier call to <code>setup</code> in a component’s superclass. When calling <code>content</code> without a name, it defaults to <code>main</code> and will overwrite any previous <code>main</code> content. However, you can provide your own name and refer to other names by using the <code>before:</code> keyword.</p>
197
197
 
@@ -214,13 +214,13 @@
214
214
  <span class='kw'>end</span>
215
215
  </code></pre>
216
216
 
217
- <p>This results in: - This appears first. - Welcome to my basic component. - This paragraph is inserted between the others. - Thank you and see you tonight.</p>
217
+ <p>This results in: - This appears first. - Welcome to my basic component. - This paragraph is inserted between the others. - Thank you and see you tonight.</p>
218
218
 
219
219
  <p>As you see, overusing this feature can lead to messy code as it becomes unclear what happens in what order. For this reason, this feature should only be used to decouple the content of your abstract components for allowing surgical overrides in <a href="/doc/guide/inheritance_md.html">subclasses</a>.</p>
220
220
 
221
221
  <p>It is a good convention to always have one content block named <code>:main</code>, as you might want to refer to it in subclasses.</p>
222
222
 
223
- <h4 id="label-Nesting+content+blocks-2C+calling+a+content+block+from+another">Nesting content blocks, calling a content block from another</h4>
223
+ <h4 id="nesting-content-blocks-calling-a-content-block-from-another">Nesting content blocks, calling a content block from another</h4>
224
224
 
225
225
  <p>In some situations, such as in forms, it can be useful to nest content blocks. This will also allow subclasses to override a wrapper while keeping the content, and vice versa. To make this possible, you can also use the <code>content</code> keyword inside a content block. Note that unlike the call in <code>setup</code>, this call will render a content block instead of defining it. This happens inside the request context and the content block must be defined inside the current component.</p>
226
226
 
@@ -263,7 +263,7 @@
263
263
  <pre class="code ruby"><code class="ruby">&lt;div class=&quot;card card-body&quot;&gt;&lt;h1&gt;Hello&lt;/h1&gt;&lt;p&gt;Welcome to my site.&lt;/p&gt;&lt;/div&gt;
264
264
  </code></pre>
265
265
 
266
- <h4 id="label-Removing+content+blocks">Removing content blocks</h4>
266
+ <h4 id="removing-content-blocks">Removing content blocks</h4>
267
267
 
268
268
  <p>If a component’s parent class defines a content block that is undesired in a subclass component, the content block can be removed as follows:</p>
269
269
 
@@ -272,7 +272,7 @@
272
272
  </span><span class='kw'>end</span>
273
273
  </code></pre>
274
274
 
275
- <h3 id="label-Redirecting+away+-2F+Intercepting+rendering">Redirecting away / Intercepting rendering</h3>
275
+ <h3 id="redirecting-away--intercepting-rendering">Redirecting away / Intercepting rendering</h3>
276
276
 
277
277
  <p>Immediately before the <code>content</code> block(s) are evaluated, another chain of blocks is evaluated if present: <code>before_render</code>. If on of these blocks creates a reponse body in the Rails controller, the subsequent <code>before_render</code> blocks and all <code>content</code> blocks are skipped.</p>
278
278
 
@@ -304,7 +304,7 @@
304
304
  </div></div>
305
305
 
306
306
  <div id="footer">
307
- Generated on Tue Jun 30 22:41:18 2026 by
307
+ Generated on Tue Aug 18 14:36:33 2026 by
308
308
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
309
309
  0.9.34 (ruby-3.4.9).
310
310
  </div>
@@ -60,11 +60,11 @@
60
60
  <div id="content"><div id='filecontents'>
61
61
  <p><a href="/README_md.html#guide--documentation">Back to the guide</a></p>
62
62
 
63
- <h1 id="label-Cookbook">Cookbook</h1>
63
+ <h1 id="cookbook">Cookbook</h1>
64
64
 
65
65
  <p>Task-oriented entry point: “I want to do X — where is it?”. Every recipe lives in <a href="./patterns_md.html">Real-world patterns</a> or the guide; this page is a pure index by goal so you don’t need to know a pattern’s name. Nothing is duplicated here — only links.</p>
66
66
 
67
- <h2 id="label-Recipes+by+task">Recipes by task</h2>
67
+ <h2 id="recipes-by-task">Recipes by task</h2>
68
68
 
69
69
  <table role="table">
70
70
  <thead>
@@ -76,99 +76,99 @@
76
76
  <tbody>
77
77
  <tr>
78
78
  <td>Share layout/chrome across all components</td>
79
- <td>[patterns §1 base layer](./patterns.md#1-the-app-base-component-layer)</td>
79
+ <td><a href="./patterns_md.html#1-the-app-base-component-layer">patterns §1 base layer</a></td>
80
80
  </tr>
81
81
  <tr>
82
82
  <td>Add a CRUD screen with almost no code</td>
83
- <td>[patterns §2 thin leaves](./patterns.md#2-thin-leaf-components), [example.md](./example.md)</td>
83
+ <td><a href="./patterns_md.html#2-thin-leaf-components">patterns §2 thin leaves</a>, <a href="./example_md.html">example.md</a></td>
84
84
  </tr>
85
85
  <tr>
86
86
  <td>List records with columns/filters/sorts</td>
87
- <td>[List](./pre_built_components/list.md), [patterns §3–4](./patterns.md#3-indexload_data-scopenested-list)</td>
87
+ <td><a href="./pre_built_components/list_md.html">List</a>, <a href="./patterns_md.html#3-index--load_data-scope--nested-list">patterns §3–4</a></td>
88
88
  </tr>
89
89
  <tr>
90
90
  <td>Scope/order what an Index shows</td>
91
- <td>[patterns §3](./patterns.md#3-indexload_data-scopenested-list) (load_data`)</td>
91
+ <td><a href="./patterns_md.html#3-index--load_data-scope--nested-list">patterns §3</a> (<code>load_data</code>)</td>
92
92
  </tr>
93
93
  <tr>
94
94
  <td>Embed a child list inside a Show</td>
95
- <td>[patterns §4](./patterns.md#4-list-customization), [nesting.md](./nesting.md)</td>
95
+ <td><a href="./patterns_md.html#4-list-customization">patterns §4</a>, <a href="./nesting_md.html">nesting.md</a></td>
96
96
  </tr>
97
97
  <tr>
98
98
  <td>Build a custom form + strong params</td>
99
- <td>[patterns §5](./patterns.md#5-custom-formschemacop-kept-in-sync), [Form](./pre_built_components/form.md)</td>
99
+ <td><a href="./patterns_md.html#5-custom-form--schemacop-kept-in-sync">patterns §5</a>, <a href="./pre_built_components/form_md.html">Form</a></td>
100
100
  </tr>
101
101
  <tr>
102
102
  <td>Nested attributes in a form</td>
103
- <td>[patterns §5](./patterns.md#5-custom-formschemacop-kept-in-sync), [example_advanced.md](./example_advanced.md)</td>
103
+ <td><a href="./patterns_md.html#5-custom-form--schemacop-kept-in-sync">patterns §5</a>, <a href="./example_advanced_md.html">example_advanced.md</a></td>
104
104
  </tr>
105
105
  <tr>
106
106
  <td>Autocomplete / ajax select field</td>
107
- <td>[patterns §6](./patterns.md#6-autocomplete-form-app-level-subclass)</td>
107
+ <td><a href="./patterns_md.html#6-autocomplete-form-app-level-subclass">patterns §6</a></td>
108
108
  </tr>
109
109
  <tr>
110
110
  <td>Split a detail page into tabs</td>
111
- <td>[patterns §7](./patterns.md#7-tabbed-show-via-a-mixin)</td>
111
+ <td><a href="./patterns_md.html#7-tabbed-show-via-a-mixin">patterns §7</a></td>
112
112
  </tr>
113
113
  <tr>
114
114
  <td>Prefill/derive fields before save</td>
115
- <td>[patterns §8](./patterns.md#8-lifecycle-hooks-for-derived-data) (after_assign_attributes`)</td>
115
+ <td><a href="./patterns_md.html#8-lifecycle-hooks-for-derived-data">patterns §8</a> (<code>after_assign_attributes</code>)</td>
116
116
  </tr>
117
117
  <tr>
118
118
  <td>Guard/redirect before rendering</td>
119
- <td>[patterns §8](./patterns.md#8-lifecycle-hooks-for-derived-data), [basic_component.md](./basic_component.md#redirecting-awayintercepting-rendering)</td>
119
+ <td><a href="./patterns_md.html#8-lifecycle-hooks-for-derived-data">patterns §8</a>, <a href="./basic_component_md.html#redirecting-away--intercepting-rendering">basic_component.md</a></td>
120
120
  </tr>
121
121
  <tr>
122
122
  <td>Customize the action toolbar</td>
123
- <td>[patterns §9](./patterns.md#9-exposed-intents-as-the-action-toolbar), [intents.md](./intents.md#exposed-intents)</td>
123
+ <td><a href="./patterns_md.html#9-exposed-intents-as-the-action-toolbar">patterns §9</a>, <a href="./intents_md.html#exposed-intents">intents.md</a></td>
124
124
  </tr>
125
125
  <tr>
126
126
  <td>Disable a button with a reason</td>
127
- <td>[feasibility.md](./feasibility.md), [patterns §9](./patterns.md#9-exposed-intents-as-the-action-toolbar)</td>
127
+ <td><a href="./feasibility_md.html">feasibility.md</a>, <a href="./patterns_md.html#9-exposed-intents-as-the-action-toolbar">patterns §9</a></td>
128
128
  </tr>
129
129
  <tr>
130
130
  <td>Export CSV / PDF</td>
131
- <td>[patterns §10](./patterns.md#10-csvpdf-via-respond-format)</td>
131
+ <td><a href="./patterns_md.html#10-csv--pdf-via-respond-format">patterns §10</a></td>
132
132
  </tr>
133
133
  <tr>
134
134
  <td>Launch a background job from a button</td>
135
- <td>[patterns §11](./patterns.md#11-non-crud-job-dispatch-toggles-clone)</td>
135
+ <td><a href="./patterns_md.html#11-non-crud-job-dispatch-toggles-clone">patterns §11</a></td>
136
136
  </tr>
137
137
  <tr>
138
138
  <td>Toggle a boolean (activate/lock/…)</td>
139
- <td>[patterns §11](./patterns.md#11-non-crud-job-dispatch-toggles-clone)</td>
139
+ <td><a href="./patterns_md.html#11-non-crud-job-dispatch-toggles-clone">patterns §11</a></td>
140
140
  </tr>
141
141
  <tr>
142
142
  <td>Clone/duplicate a record</td>
143
- <td>[patterns §11](./patterns.md#11-non-crud-job-dispatch-toggles-clone)</td>
143
+ <td><a href="./patterns_md.html#11-non-crud-job-dispatch-toggles-clone">patterns §11</a></td>
144
144
  </tr>
145
145
  <tr>
146
146
  <td>Non-persistent / upload-only form</td>
147
- <td>[patterns §12](./patterns.md#12-virtual-model-for-non-persistentupload-forms), [virtual_models.md](./virtual_models.md)</td>
147
+ <td><a href="./patterns_md.html#12-virtual-model-for-non-persistent--upload-forms">patterns §12</a>, <a href="./virtual_models_md.html">virtual_models.md</a></td>
148
148
  </tr>
149
149
  <tr>
150
150
  <td>Public page / inbound webhook</td>
151
- <td>[patterns §13](./patterns.md#13-public-endpointswebhooks), [gotchas §14](./gotchas.md#14-public-endpoint-still-401redirecting)</td>
151
+ <td><a href="./patterns_md.html#13-public-endpoints--webhooks">patterns §13</a>, <a href="./gotchas_md.html#14-public-endpoint-still-401redirecting">gotchas §14</a></td>
152
152
  </tr>
153
153
  <tr>
154
154
  <td>Custom button look</td>
155
- <td>[patterns §14](./patterns.md#14-custom-button-style), [intents.md](./intents.md#adding-your-own-styles)</td>
155
+ <td><a href="./patterns_md.html#14-custom-button-style">patterns §14</a>, <a href="./intents_md.html#adding-your-own-styles">intents.md</a></td>
156
156
  </tr>
157
157
  <tr>
158
158
  <td>Inline-edit a card without a full page</td>
159
- <td>[patterns §15 turbo-frame inline edit](./patterns.md#15-inline-edit-card-with-a-turbo-frame)</td>
159
+ <td><a href="./patterns_md.html#15-inline-edit-card-with-a-turbo-frame">patterns §15 turbo-frame inline edit</a></td>
160
160
  </tr>
161
161
  <tr>
162
162
  <td>Multi-step wizard across components</td>
163
- <td>[patterns §16 multi-step wizard](./patterns.md#16-multi-step-wizard-across-components)</td>
163
+ <td><a href="./patterns_md.html#16-multi-step-wizard-across-components">patterns §16 multi-step wizard</a></td>
164
164
  </tr>
165
165
  <tr>
166
166
  <td>Reorder/inline-patch without a form</td>
167
- <td>[patterns §17 inline PATCH](./patterns.md#17-inline-patch-without-a-form-reorderquick-toggle)</td>
167
+ <td><a href="./patterns_md.html#17-inline-patch-without-a-form-reorder--quick-toggle">patterns §17 inline PATCH</a></td>
168
168
  </tr>
169
169
  <tr>
170
170
  <td>Magic-login / invite / reset / confirm link (no session)</td>
171
- <td>[patterns §18 signed-token capability links](./patterns.md#18-signed-token-capability-links-auth-less-onboardingmagic-links)</td>
171
+ <td><a href="./patterns_md.html#18-signed-token-capability-links-auth-less-onboarding--magic-links">patterns §18 signed-token capability links</a></td>
172
172
  </tr>
173
173
  </tbody>
174
174
  </table>
@@ -179,7 +179,7 @@
179
179
  </div></div>
180
180
 
181
181
  <div id="footer">
182
- Generated on Tue Jun 30 22:41:20 2026 by
182
+ Generated on Tue Aug 18 14:36:35 2026 by
183
183
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
184
184
  0.9.34 (ruby-3.4.9).
185
185
  </div>
@@ -63,7 +63,7 @@
63
63
  <p><a href="/doc/guide/pre_built_components_md.html">List of pre-built components</a></p>
64
64
  </li></ul>
65
65
 
66
- <h1 id="label-Pre-built+components-3A+Destroy">Pre-built components: Destroy</h1>
66
+ <h1 id="pre-built-components-destroy">Pre-built components: Destroy</h1>
67
67
 
68
68
  <p>This component is the Compony equivalent to a typical Rails controller’s <code>destroy</code> action.</p>
69
69
 
@@ -95,7 +95,7 @@
95
95
  </div></div>
96
96
 
97
97
  <div id="footer">
98
- Generated on Tue Jun 30 22:41:19 2026 by
98
+ Generated on Tue Aug 18 14:36:34 2026 by
99
99
  <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
100
100
  0.9.34 (ruby-3.4.9).
101
101
  </div>