brut 0.1.0 → 0.2.0

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 (375) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/brutrb.com/.vitepress/config.mjs +4 -2
  4. data/brutrb.com/.vitepress/theme/style.css +16 -38
  5. data/brutrb.com/adrs.md +15 -0
  6. data/brutrb.com/dev-environment.md +6 -1
  7. data/brutrb.com/doc-conventions.md +1 -2
  8. data/brutrb.com/images/DevEnvironment.graffle +0 -0
  9. data/brutrb.com/images/DevEnvironment.png +0 -0
  10. data/brutrb.com/index.md +0 -3
  11. data/brutrb.com/overview.md +2 -2
  12. data/brutrb.com/roadmap.md +57 -0
  13. data/brutrb.com/tutorial.md +5 -1
  14. data/docs/404.html +4 -4
  15. data/docs/{not-released.html → adrs.html} +8 -8
  16. data/docs/ai.html +6 -6
  17. data/docs/api/Brut/BackEnd/SeedData.html +1 -1
  18. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server/FlushSpans.html +1 -1
  19. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server.html +1 -1
  20. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares.html +1 -1
  21. data/docs/api/Brut/BackEnd/Sidekiq.html +1 -1
  22. data/docs/api/Brut/BackEnd/Validators/FormValidator.html +1 -1
  23. data/docs/api/Brut/BackEnd/Validators.html +1 -1
  24. data/docs/api/Brut/BackEnd.html +1 -1
  25. data/docs/api/Brut/CLI/App.html +1 -1
  26. data/docs/api/Brut/CLI/AppRunner.html +1 -1
  27. data/docs/api/Brut/CLI/Apps/BuildAssets/All.html +1 -1
  28. data/docs/api/Brut/CLI/Apps/BuildAssets/CSS.html +1 -1
  29. data/docs/api/Brut/CLI/Apps/BuildAssets/Images.html +1 -1
  30. data/docs/api/Brut/CLI/Apps/BuildAssets/JS.html +1 -1
  31. data/docs/api/Brut/CLI/Apps/BuildAssets.html +1 -1
  32. data/docs/api/Brut/CLI/Apps/DB/Create.html +1 -1
  33. data/docs/api/Brut/CLI/Apps/DB/Drop.html +1 -1
  34. data/docs/api/Brut/CLI/Apps/DB/Migrate.html +1 -1
  35. data/docs/api/Brut/CLI/Apps/DB/NewMigration.html +1 -1
  36. data/docs/api/Brut/CLI/Apps/DB/Rebuild.html +1 -1
  37. data/docs/api/Brut/CLI/Apps/DB/Seed.html +1 -1
  38. data/docs/api/Brut/CLI/Apps/DB/Status.html +1 -1
  39. data/docs/api/Brut/CLI/Apps/DB.html +1 -1
  40. data/docs/api/Brut/CLI/Apps/DeployBase/GitChecks.html +1 -1
  41. data/docs/api/Brut/CLI/Apps/DeployBase.html +1 -1
  42. data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy/Deploy.html +1 -1
  43. data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy.html +1 -1
  44. data/docs/api/Brut/CLI/Apps/Scaffold/Action/Route.html +1 -1
  45. data/docs/api/Brut/CLI/Apps/Scaffold/Action.html +1 -1
  46. data/docs/api/Brut/CLI/Apps/Scaffold/Component.html +3 -3
  47. data/docs/api/Brut/CLI/Apps/Scaffold/CustomElementTest.html +1 -1
  48. data/docs/api/Brut/CLI/Apps/Scaffold/E2ETest.html +1 -1
  49. data/docs/api/Brut/CLI/Apps/Scaffold/Form.html +1 -1
  50. data/docs/api/Brut/CLI/Apps/Scaffold/Page/Route.html +1 -1
  51. data/docs/api/Brut/CLI/Apps/Scaffold/Page.html +2 -2
  52. data/docs/api/Brut/CLI/Apps/Scaffold/RoutesEditor.html +1 -1
  53. data/docs/api/Brut/CLI/Apps/Scaffold/Test.html +1 -1
  54. data/docs/api/Brut/CLI/Apps/Scaffold.html +1 -1
  55. data/docs/api/Brut/CLI/Apps/Test/Audit.html +1 -1
  56. data/docs/api/Brut/CLI/Apps/Test/E2e.html +1 -1
  57. data/docs/api/Brut/CLI/Apps/Test/JS.html +6 -6
  58. data/docs/api/Brut/CLI/Apps/Test/Run.html +1 -1
  59. data/docs/api/Brut/CLI/Apps/Test.html +2 -2
  60. data/docs/api/Brut/CLI/Apps.html +1 -1
  61. data/docs/api/Brut/CLI/Command.html +3 -3
  62. data/docs/api/Brut/CLI/Error.html +1 -1
  63. data/docs/api/Brut/CLI/ExecutionResults/Result.html +1 -1
  64. data/docs/api/Brut/CLI/ExecutionResults.html +1 -1
  65. data/docs/api/Brut/CLI/Executor.html +1 -1
  66. data/docs/api/Brut/CLI/InvalidOption.html +1 -1
  67. data/docs/api/Brut/CLI/Options.html +1 -1
  68. data/docs/api/Brut/CLI/Output.html +1 -1
  69. data/docs/api/Brut/CLI/SystemExecError.html +1 -1
  70. data/docs/api/Brut/CLI.html +1 -1
  71. data/docs/api/Brut/FactoryBot.html +1 -1
  72. data/docs/api/Brut/Framework/App.html +1 -1
  73. data/docs/api/Brut/Framework/Config.html +1 -1
  74. data/docs/api/Brut/Framework/Container.html +1 -1
  75. data/docs/api/Brut/Framework/Error.html +1 -1
  76. data/docs/api/Brut/Framework/Errors/AbstractMethod.html +1 -1
  77. data/docs/api/Brut/Framework/Errors/Bug.html +1 -1
  78. data/docs/api/Brut/Framework/Errors/MissingConfiguration.html +1 -1
  79. data/docs/api/Brut/Framework/Errors/MissingParameter.html +1 -1
  80. data/docs/api/Brut/Framework/Errors/NoClassForPath.html +1 -1
  81. data/docs/api/Brut/Framework/Errors/NotFound.html +1 -1
  82. data/docs/api/Brut/Framework/Errors/NotImplemented.html +1 -1
  83. data/docs/api/Brut/Framework/Errors.html +1 -1
  84. data/docs/api/Brut/Framework/FussyTypeEnforcement.html +1 -1
  85. data/docs/api/Brut/Framework/MCP.html +1 -1
  86. data/docs/api/Brut/Framework/ProjectEnvironment.html +1 -1
  87. data/docs/api/Brut/Framework.html +1 -1
  88. data/docs/api/Brut/FrontEnd/AssetPathResolver.html +1 -1
  89. data/docs/api/Brut/FrontEnd/Component/Helpers.html +1 -1
  90. data/docs/api/Brut/FrontEnd/Component.html +1 -1
  91. data/docs/api/Brut/FrontEnd/Components/ConstraintViolations.html +1 -1
  92. data/docs/api/Brut/FrontEnd/Components/FormTag.html +1 -1
  93. data/docs/api/Brut/FrontEnd/Components/I18nTranslations.html +1 -1
  94. data/docs/api/Brut/FrontEnd/Components/Input.html +1 -1
  95. data/docs/api/Brut/FrontEnd/Components/Inputs/CsrfToken.html +1 -1
  96. data/docs/api/Brut/FrontEnd/Components/Inputs/InputTag.html +1 -1
  97. data/docs/api/Brut/FrontEnd/Components/Inputs/RadioButton.html +1 -1
  98. data/docs/api/Brut/FrontEnd/Components/Inputs/SelectTagWithOptions.html +3 -3
  99. data/docs/api/Brut/FrontEnd/Components/Inputs/TextareaTag.html +1 -1
  100. data/docs/api/Brut/FrontEnd/Components/Inputs.html +1 -1
  101. data/docs/api/Brut/FrontEnd/Components/LocaleDetection.html +1 -1
  102. data/docs/api/Brut/FrontEnd/Components/PageIdentifier.html +1 -1
  103. data/docs/api/Brut/FrontEnd/Components/TimeTag.html +1 -1
  104. data/docs/api/Brut/FrontEnd/Components/Traceparent.html +1 -1
  105. data/docs/api/Brut/FrontEnd/Components.html +1 -1
  106. data/docs/api/Brut/FrontEnd/Download.html +1 -1
  107. data/docs/api/Brut/FrontEnd/Flash.html +1 -1
  108. data/docs/api/Brut/FrontEnd/Form.html +1 -1
  109. data/docs/api/Brut/FrontEnd/Forms/ConstraintViolation.html +1 -1
  110. data/docs/api/Brut/FrontEnd/Forms/Input/Color.html +1 -1
  111. data/docs/api/Brut/FrontEnd/Forms/Input/TimeOfDay.html +1 -1
  112. data/docs/api/Brut/FrontEnd/Forms/Input.html +1 -1
  113. data/docs/api/Brut/FrontEnd/Forms/InputDeclarations.html +1 -1
  114. data/docs/api/Brut/FrontEnd/Forms/InputDefinition.html +1 -1
  115. data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInput.html +1 -1
  116. data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInputDefinition.html +1 -1
  117. data/docs/api/Brut/FrontEnd/Forms/SelectInput.html +1 -1
  118. data/docs/api/Brut/FrontEnd/Forms/SelectInputDefinition.html +1 -1
  119. data/docs/api/Brut/FrontEnd/Forms/ValidityState.html +1 -1
  120. data/docs/api/Brut/FrontEnd/Forms.html +1 -1
  121. data/docs/api/Brut/FrontEnd/GenericResponse.html +1 -1
  122. data/docs/api/Brut/FrontEnd/Handler.html +1 -1
  123. data/docs/api/Brut/FrontEnd/Handlers/CspReportingHandler.html +1 -1
  124. data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler/TraceParent.html +1 -1
  125. data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler.html +1 -1
  126. data/docs/api/Brut/FrontEnd/Handlers/LocaleDetectionHandler.html +1 -1
  127. data/docs/api/Brut/FrontEnd/Handlers/MissingHandler/Form.html +1 -1
  128. data/docs/api/Brut/FrontEnd/Handlers/MissingHandler.html +1 -1
  129. data/docs/api/Brut/FrontEnd/Handlers.html +1 -1
  130. data/docs/api/Brut/FrontEnd/HandlingResults.html +1 -1
  131. data/docs/api/Brut/FrontEnd/HttpMethod.html +1 -1
  132. data/docs/api/Brut/FrontEnd/HttpStatus.html +1 -1
  133. data/docs/api/Brut/FrontEnd/InlineSvgLocator.html +1 -1
  134. data/docs/api/Brut/FrontEnd/Layout.html +1 -1
  135. data/docs/api/Brut/FrontEnd/Middleware.html +1 -1
  136. data/docs/api/Brut/FrontEnd/Middlewares/AnnotateBrutOwnedPaths.html +1 -1
  137. data/docs/api/Brut/FrontEnd/Middlewares/Favicon.html +1 -1
  138. data/docs/api/Brut/FrontEnd/Middlewares/OpenTelemetrySpan.html +1 -1
  139. data/docs/api/Brut/FrontEnd/Middlewares/ReloadApp.html +1 -1
  140. data/docs/api/Brut/FrontEnd/Middlewares.html +1 -1
  141. data/docs/api/Brut/FrontEnd/Page.html +1 -1
  142. data/docs/api/Brut/FrontEnd/Pages/MissingPage.html +2 -2
  143. data/docs/api/Brut/FrontEnd/Pages.html +1 -1
  144. data/docs/api/Brut/FrontEnd/RequestContext.html +1 -1
  145. data/docs/api/Brut/FrontEnd/RouteHook.html +1 -1
  146. data/docs/api/Brut/FrontEnd/RouteHooks/AgeFlash.html +1 -1
  147. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineScripts.html +1 -1
  148. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts/ReportOnly.html +1 -1
  149. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts.html +1 -1
  150. data/docs/api/Brut/FrontEnd/RouteHooks/LocaleDetection.html +1 -1
  151. data/docs/api/Brut/FrontEnd/RouteHooks/SetupRequestContext.html +1 -1
  152. data/docs/api/Brut/FrontEnd/RouteHooks.html +1 -1
  153. data/docs/api/Brut/FrontEnd/Routing/FormHandlerRoute.html +1 -1
  154. data/docs/api/Brut/FrontEnd/Routing/FormRoute.html +1 -1
  155. data/docs/api/Brut/FrontEnd/Routing/MissingForm.html +1 -1
  156. data/docs/api/Brut/FrontEnd/Routing/MissingHandler.html +1 -1
  157. data/docs/api/Brut/FrontEnd/Routing/MissingPage.html +1 -1
  158. data/docs/api/Brut/FrontEnd/Routing/MissingPath.html +1 -1
  159. data/docs/api/Brut/FrontEnd/Routing/PageRoute.html +1 -1
  160. data/docs/api/Brut/FrontEnd/Routing/Route.html +1 -1
  161. data/docs/api/Brut/FrontEnd/Routing.html +1 -1
  162. data/docs/api/Brut/FrontEnd/Session.html +1 -1
  163. data/docs/api/Brut/FrontEnd.html +1 -1
  164. data/docs/api/Brut/I18n/BaseMethods.html +1 -1
  165. data/docs/api/Brut/I18n/ForBackEnd.html +1 -1
  166. data/docs/api/Brut/I18n/ForCLI.html +1 -1
  167. data/docs/api/Brut/I18n/ForHTML.html +1 -1
  168. data/docs/api/Brut/I18n/HTTPAcceptLanguage/AlwaysEnglish.html +1 -1
  169. data/docs/api/Brut/I18n/HTTPAcceptLanguage.html +1 -1
  170. data/docs/api/Brut/I18n.html +1 -1
  171. data/docs/api/Brut/Instrumentation/LoggerSpanExporter.html +1 -1
  172. data/docs/api/Brut/Instrumentation/OpenTelemetry/NormalizedAttributes.html +1 -1
  173. data/docs/api/Brut/Instrumentation/OpenTelemetry/Span.html +1 -1
  174. data/docs/api/Brut/Instrumentation/OpenTelemetry.html +1 -1
  175. data/docs/api/Brut/Instrumentation.html +1 -1
  176. data/docs/api/Brut/SinatraHelpers/ClassMethods.html +1 -1
  177. data/docs/api/Brut/SinatraHelpers.html +1 -1
  178. data/docs/api/Brut/SpecSupport/ClockSupport.html +1 -1
  179. data/docs/api/Brut/SpecSupport/ComponentSupport.html +1 -1
  180. data/docs/api/Brut/SpecSupport/E2ETestServer.html +1 -1
  181. data/docs/api/Brut/SpecSupport/E2eSupport.html +1 -1
  182. data/docs/api/Brut/SpecSupport/EnhancedNode.html +1 -1
  183. data/docs/api/Brut/SpecSupport/FlashSupport.html +1 -1
  184. data/docs/api/Brut/SpecSupport/GeneralSupport/ClassMethods.html +1 -1
  185. data/docs/api/Brut/SpecSupport/GeneralSupport.html +1 -1
  186. data/docs/api/Brut/SpecSupport/HandlerSupport.html +1 -1
  187. data/docs/api/Brut/SpecSupport/Matchers/BeABug.html +1 -1
  188. data/docs/api/Brut/SpecSupport/Matchers/BePageFor.html +1 -1
  189. data/docs/api/Brut/SpecSupport/Matchers/BeRoutingFor.html +1 -1
  190. data/docs/api/Brut/SpecSupport/Matchers/HaveConstraintViolation.html +1 -1
  191. data/docs/api/Brut/SpecSupport/Matchers/HaveGenerated.html +1 -1
  192. data/docs/api/Brut/SpecSupport/Matchers/HaveHTMLAttribute.html +1 -1
  193. data/docs/api/Brut/SpecSupport/Matchers/HaveI18nString.html +1 -1
  194. data/docs/api/Brut/SpecSupport/Matchers/HaveLinkTo.html +1 -1
  195. data/docs/api/Brut/SpecSupport/Matchers/HaveRedirectedTo.html +1 -1
  196. data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedHttpStatus.html +1 -1
  197. data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedRackResponse.html +1 -1
  198. data/docs/api/Brut/SpecSupport/Matchers.html +1 -1
  199. data/docs/api/Brut/SpecSupport/RSpecSetup/OptionalSidekiqSupport.html +1 -1
  200. data/docs/api/Brut/SpecSupport/RSpecSetup.html +1 -1
  201. data/docs/api/Brut/SpecSupport/SessionSupport.html +1 -1
  202. data/docs/api/Brut/SpecSupport.html +1 -1
  203. data/docs/api/Brut.html +1 -1
  204. data/docs/api/Clock.html +1 -1
  205. data/docs/api/RichString.html +150 -343
  206. data/docs/api/SemanticLogger/Appender/Async.html +1 -1
  207. data/docs/api/Sequel/Extensions/BrutInstrumentation.html +1 -1
  208. data/docs/api/Sequel/Extensions/BrutMigrations.html +1 -1
  209. data/docs/api/Sequel/Extensions.html +1 -1
  210. data/docs/api/Sequel/Plugins/CreatedAt/InstanceMethods.html +1 -1
  211. data/docs/api/Sequel/Plugins/CreatedAt.html +1 -1
  212. data/docs/api/Sequel/Plugins/ExternalId/ClassMethods.html +1 -1
  213. data/docs/api/Sequel/Plugins/ExternalId/InstanceMethods.html +1 -1
  214. data/docs/api/Sequel/Plugins/ExternalId.html +1 -1
  215. data/docs/api/Sequel/Plugins/FindBang/ClassMethods.html +1 -1
  216. data/docs/api/Sequel/Plugins/FindBang.html +1 -1
  217. data/docs/api/Sequel/Plugins.html +1 -1
  218. data/docs/api/Sequel.html +1 -1
  219. data/docs/api/_index.html +5 -5
  220. data/docs/api/class_list.html +1 -1
  221. data/docs/api/file.README.html +1 -1
  222. data/docs/api/index.html +1 -1
  223. data/docs/api/method_list.html +281 -313
  224. data/docs/api/top-level-namespace.html +1 -1
  225. data/docs/assets/DevEnvironment.DaFcVfwP.png +0 -0
  226. data/docs/assets/adrs.md.JRxZ5uYE.js +1 -0
  227. data/docs/assets/adrs.md.JRxZ5uYE.lean.js +1 -0
  228. data/docs/assets/{app.ClaS47Ru.js → app.Dm3x-DQc.js} +1 -1
  229. data/docs/assets/chunks/@localSearchIndexroot.BqRrkR00.js +1 -0
  230. data/docs/assets/chunks/{VPLocalSearchBox.DtgDfde2.js → VPLocalSearchBox.DL6bnqee.js} +1 -1
  231. data/docs/assets/chunks/{theme.B45bvibT.js → theme.BXdlf6e8.js} +2 -2
  232. data/docs/assets/{components.md.DatoNgFo.js → components.md.Pg_Lo35G.js} +3 -3
  233. data/docs/assets/{configuration.md.DeyhpqEx.js → configuration.md.BfeGnEci.js} +1 -1
  234. data/docs/assets/dev-environment.md.Dy6EldaM.js +16 -0
  235. data/docs/assets/dev-environment.md.Dy6EldaM.lean.js +1 -0
  236. data/docs/assets/doc-conventions.md.DOkAuXlt.js +1 -0
  237. data/docs/assets/{forms.md.C2Dizvzq.js → forms.md.BQZlCwvi.js} +1 -1
  238. data/docs/assets/{getting-started.md.C93e0odB.js → getting-started.md.BcXnNuD6.js} +2 -2
  239. data/docs/assets/index.md.Bn9e0sRJ.js +1 -0
  240. data/docs/assets/index.md.Bn9e0sRJ.lean.js +1 -0
  241. data/docs/assets/{overview.md.Bdq4qt3L.js → overview.md.iMnwLO4x.js} +1 -1
  242. data/docs/assets/roadmap.md.C6PRi0DX.js +1 -0
  243. data/docs/assets/roadmap.md.C6PRi0DX.lean.js +1 -0
  244. data/docs/assets/{style.prAgp4yQ.css → style.B1z60PPQ.css} +1 -1
  245. data/docs/assets/tutorial.md.BYXj4cOu.js +1 -0
  246. data/docs/assets/tutorial.md.BYXj4cOu.lean.js +1 -0
  247. data/docs/assets.html +6 -6
  248. data/docs/brut-js/api/AjaxSubmit.html +1 -1
  249. data/docs/brut-js/api/AjaxSubmit.js.html +1 -1
  250. data/docs/brut-js/api/Autosubmit.html +1 -1
  251. data/docs/brut-js/api/Autosubmit.js.html +1 -1
  252. data/docs/brut-js/api/BaseCustomElement.html +1 -1
  253. data/docs/brut-js/api/BaseCustomElement.js.html +1 -1
  254. data/docs/brut-js/api/BrutCustomElements.html +1 -1
  255. data/docs/brut-js/api/BufferedLogger.html +1 -1
  256. data/docs/brut-js/api/ConfirmSubmit.html +1 -1
  257. data/docs/brut-js/api/ConfirmSubmit.js.html +1 -1
  258. data/docs/brut-js/api/ConfirmationDialog.html +1 -1
  259. data/docs/brut-js/api/ConfirmationDialog.js.html +1 -1
  260. data/docs/brut-js/api/ConstraintViolationMessage.html +1 -1
  261. data/docs/brut-js/api/ConstraintViolationMessage.js.html +1 -1
  262. data/docs/brut-js/api/ConstraintViolationMessages.html +1 -1
  263. data/docs/brut-js/api/ConstraintViolationMessages.js.html +1 -1
  264. data/docs/brut-js/api/CopyToClipboard.html +1 -1
  265. data/docs/brut-js/api/CopyToClipboard.js.html +1 -1
  266. data/docs/brut-js/api/Form.html +1 -1
  267. data/docs/brut-js/api/Form.js.html +1 -1
  268. data/docs/brut-js/api/I18nTranslation.html +1 -1
  269. data/docs/brut-js/api/I18nTranslation.js.html +1 -1
  270. data/docs/brut-js/api/LocaleDetection.html +1 -1
  271. data/docs/brut-js/api/LocaleDetection.js.html +1 -1
  272. data/docs/brut-js/api/Logger.html +1 -1
  273. data/docs/brut-js/api/Logger.js.html +1 -1
  274. data/docs/brut-js/api/Message.html +1 -1
  275. data/docs/brut-js/api/Message.js.html +1 -1
  276. data/docs/brut-js/api/PrefixedLogger.html +1 -1
  277. data/docs/brut-js/api/RichString.html +1 -1
  278. data/docs/brut-js/api/RichString.js.html +1 -1
  279. data/docs/brut-js/api/Tabs.html +1 -1
  280. data/docs/brut-js/api/Tabs.js.html +1 -1
  281. data/docs/brut-js/api/Tracing.html +1 -1
  282. data/docs/brut-js/api/Tracing.js.html +1 -1
  283. data/docs/brut-js/api/external-CustomElementRegistry.html +1 -1
  284. data/docs/brut-js/api/external-Performance.html +1 -1
  285. data/docs/brut-js/api/external-Promise.html +1 -1
  286. data/docs/brut-js/api/external-ValidityState.html +1 -1
  287. data/docs/brut-js/api/external-Window.html +1 -1
  288. data/docs/brut-js/api/external-fetch.html +1 -1
  289. data/docs/brut-js/api/global.html +1 -1
  290. data/docs/brut-js/api/index.html +1 -1
  291. data/docs/brut-js/api/index.js.html +1 -1
  292. data/docs/brut-js/api/module-testing.html +1 -1
  293. data/docs/brut-js/api/testing.AssetMetadata.html +1 -1
  294. data/docs/brut-js/api/testing.AssetMetadataLoader.html +1 -1
  295. data/docs/brut-js/api/testing.CustomElementTest.html +1 -1
  296. data/docs/brut-js/api/testing.DOMCreator.html +1 -1
  297. data/docs/brut-js/api/testing_AssetMetadata.js.html +1 -1
  298. data/docs/brut-js/api/testing_AssetMetadataLoader.js.html +1 -1
  299. data/docs/brut-js/api/testing_CustomElementTest.js.html +1 -1
  300. data/docs/brut-js/api/testing_DOMCreator.js.html +1 -1
  301. data/docs/brut-js/api/testing_index.js.html +1 -1
  302. data/docs/brut-js.html +6 -6
  303. data/docs/business-logic.html +6 -6
  304. data/docs/cli.html +6 -6
  305. data/docs/components.html +10 -10
  306. data/docs/configuration.html +7 -7
  307. data/docs/css.html +6 -6
  308. data/docs/custom-element-tests.html +6 -6
  309. data/docs/database-access.html +6 -6
  310. data/docs/database-schema.html +6 -6
  311. data/docs/deployment.html +6 -6
  312. data/docs/dev-environment.html +12 -7
  313. data/docs/dir-structure.html +6 -6
  314. data/docs/doc-conventions.html +7 -7
  315. data/docs/end-to-end-tests.html +6 -6
  316. data/docs/features.html +6 -6
  317. data/docs/flash-and-session.html +6 -6
  318. data/docs/form-constraints.html +6 -6
  319. data/docs/forms.html +8 -8
  320. data/docs/getting-started.html +9 -9
  321. data/docs/handlers.html +6 -6
  322. data/docs/hashmap.json +1 -1
  323. data/docs/hooks.html +6 -6
  324. data/docs/i18n.html +6 -6
  325. data/docs/index.html +7 -7
  326. data/docs/instrumentation.html +6 -6
  327. data/docs/javascript.html +6 -6
  328. data/docs/jobs.html +6 -6
  329. data/docs/keyword-injection.html +6 -6
  330. data/docs/layouts.html +6 -6
  331. data/docs/lsp.html +6 -6
  332. data/docs/markdown-examples.html +6 -6
  333. data/docs/middleware.html +6 -6
  334. data/docs/overview.html +7 -7
  335. data/docs/pages.html +6 -6
  336. data/docs/recipes/alternate-layouts.html +6 -6
  337. data/docs/recipes/authentication.html +6 -6
  338. data/docs/recipes/blank-layouts.html +6 -6
  339. data/docs/recipes/custom-flash.html +6 -6
  340. data/docs/recipes/indexed-forms.html +6 -6
  341. data/docs/recipes/text-field-component.html +6 -6
  342. data/docs/roadmap.html +29 -0
  343. data/docs/routes.html +6 -6
  344. data/docs/security.html +6 -6
  345. data/docs/seed-data.html +6 -6
  346. data/docs/space-time-continuum.html +6 -6
  347. data/docs/tutorial.html +7 -7
  348. data/docs/unit-tests.html +6 -6
  349. data/docs/why.html +6 -6
  350. data/lib/brut/cli/apps/test.rb +1 -1
  351. data/lib/brut/front_end/components/inputs/select_tag_with_options.rb +2 -2
  352. data/lib/brut/junk_drawer.rb +48 -9
  353. data/lib/brut/version.rb +1 -1
  354. data/specs/brut/junk_drawer.spec.rb +75 -0
  355. metadata +36 -31
  356. data/brutrb.com/images/logo-300.png +0 -0
  357. data/brutrb.com/images/logo.png +0 -0
  358. data/brutrb.com/not-released.md +0 -5
  359. data/docs/assets/chunks/@localSearchIndexroot.Biqy1A4t.js +0 -1
  360. data/docs/assets/dev-env-overview.Gj7NWM8-.png +0 -0
  361. data/docs/assets/dev-environment.md.BroAOLhF.js +0 -11
  362. data/docs/assets/dev-environment.md.BroAOLhF.lean.js +0 -1
  363. data/docs/assets/doc-conventions.md.BzmSrTEW.js +0 -1
  364. data/docs/assets/index.md.CAMqGBJE.js +0 -1
  365. data/docs/assets/index.md.CAMqGBJE.lean.js +0 -1
  366. data/docs/assets/not-released.md.BBy28McC.js +0 -1
  367. data/docs/assets/not-released.md.BBy28McC.lean.js +0 -1
  368. data/docs/assets/tutorial.md.a4a0eVOy.js +0 -1
  369. data/docs/assets/tutorial.md.a4a0eVOy.lean.js +0 -1
  370. /data/docs/assets/{components.md.DatoNgFo.lean.js → components.md.Pg_Lo35G.lean.js} +0 -0
  371. /data/docs/assets/{configuration.md.DeyhpqEx.lean.js → configuration.md.BfeGnEci.lean.js} +0 -0
  372. /data/docs/assets/{doc-conventions.md.BzmSrTEW.lean.js → doc-conventions.md.DOkAuXlt.lean.js} +0 -0
  373. /data/docs/assets/{forms.md.C2Dizvzq.lean.js → forms.md.BQZlCwvi.lean.js} +0 -0
  374. /data/docs/assets/{getting-started.md.C93e0odB.lean.js → getting-started.md.BcXnNuD6.lean.js} +0 -0
  375. /data/docs/assets/{overview.md.Bdq4qt3L.lean.js → overview.md.iMnwLO4x.lean.js} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ac39a29b335413475986e02cf9baa658bc44fa2e67e6dbd60dfafa7e4b9c8a2f
4
- data.tar.gz: 155a9b104168bd18fe08fd8286576d63305d243d6025a4a1fcbcf1611611a8ed
3
+ metadata.gz: 6dad66a7dffc78b032c11605c85ad58139b151316d46ebc0c232dfa91cf76412
4
+ data.tar.gz: 1dc1a82264b6e3c026aceaf817ad5e4ca6b5b308013861bd38ce185186fbbd1f
5
5
  SHA512:
6
- metadata.gz: 6126e575575511de23bd9ffe1429f05fa017664c66f7de07fa93b000edfb4f4dfd7c619d76d02d28e69cb70bfe163c4023d7a79cc53e1e41e3a44b5882cd0fd8
7
- data.tar.gz: d38e331cd221d1a3bbd666b83a0d3e2df5a17fd4cbdccc47da7ca0df484d8ff46fb91c2f159c9da4fefcb8c829b98a8de4a040f013676170befecc0bcc45c3d1
6
+ metadata.gz: 3b0397fc6583b5ed0f85507c0d3605cc65cb3f11bf29f04ec5bf366d930ef905195c254b07413f6ded4b4ff229ad5fad47619730d02f88de632b7ea9f405d81a
7
+ data.tar.gz: c998ae7f7e8fd97ac5b340c35fa027dd3e86ee284ce6868243ea39c333197b8f44ca685fd1af97a56d92c3cf4c87f9a54cdfbf888682b1f86cc9c69b3689e1e5
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- brut (0.1.0)
4
+ brut (0.2.0)
5
5
  concurrent-ruby
6
6
  i18n
7
7
  irb
@@ -23,7 +23,7 @@ export default defineConfig({
23
23
  [
24
24
  "meta", {
25
25
  property: "og:image",
26
- content: "https://github.com/thirdtank/brut/blob/main/assets/SocialImage.png?raw=true"
26
+ content: "https://brutrb.com/SocialImage.png"
27
27
  }
28
28
  ],
29
29
  ["script", {
@@ -139,9 +139,11 @@ export default defineConfig({
139
139
  collapsed: false,
140
140
  items: [
141
141
  { text: "Why?!", link: "/why" },
142
+ { text: "ADRs", link: "/adrs" },
143
+ { text: "Roadmap to 1.0", link: "/roadmap" },
142
144
  { text: "AI Declaration", link: "/ai" },
143
145
  ]
144
- }
146
+ },
145
147
  ],
146
148
 
147
149
  socialLinks: [
@@ -44,52 +44,30 @@
44
44
  * -------------------------------------------------------------------------- */
45
45
 
46
46
  :root {
47
- --vp-c-text-1: #362400;
48
47
  --vp-c-default-1: var(--vp-c-gray-1);
49
48
  --vp-c-default-2: var(--vp-c-gray-2);
50
49
  --vp-c-default-3: var(--vp-c-gray-3);
51
50
  --vp-c-default-soft: var(--vp-c-gray-soft);
52
51
 
53
- --blue-vp-c-brand-1: #0C00A7;
54
- --blue-vp-c-brand-2: #6357FF;
55
- --blue-vp-c-brand-3: #4C0606;
56
- --blue-vp-c-brand-soft: #FFF9F9;
57
-
58
- --vp-c-brand-1: #001842;
59
- --vp-c-brand-2: #6B84B1;
60
- --vp-c-brand-3: #0443B1;
61
- --vp-c-brand-soft: #FFF1D6;
62
-
63
-
64
- --xvp-c-brand-1: var(--vp-c-indigo-1);
65
- --xvp-c-brand-2: var(--vp-c-indigo-2);
66
- --xvp-c-brand-3: var(--vp-c-indigo-3);
67
- --xvp-c-brand-soft: var(--vp-c-indigo-soft);
52
+ --vp-c-brand-1: var(--vp-c-indigo-1);
53
+ --vp-c-brand-2: var(--vp-c-indigo-2);
54
+ --vp-c-brand-3: var(--vp-c-indigo-3);
55
+ --vp-c-brand-soft: var(--vp-c-indigo-soft);
68
56
 
69
57
  --vp-c-tip-1: var(--vp-c-brand-1);
70
58
  --vp-c-tip-2: var(--vp-c-brand-2);
71
59
  --vp-c-tip-3: var(--vp-c-brand-3);
72
60
  --vp-c-tip-soft: var(--vp-c-brand-soft);
73
61
 
74
- --xvp-c-warning-1: var(--vp-c-yellow-1);
75
- --xvp-c-warning-2: var(--vp-c-yellow-2);
76
- --xvp-c-warning-3: var(--vp-c-yellow-3);
77
- --xvp-c-warning-soft: var(--vp-c-yellow-soft);
78
-
79
- --vp-c-warning-1: #9E5601;
80
- --vp-c-warning-2: #FDAF53;
81
- --vp-c-warning-3: #5E3301;
82
- --vp-c-warning-soft: #FFF3E5;
83
-
84
- --vp-c-danger-1: #AC0E0E;
85
- --vp-c-danger-2: #F14E4E;
86
- --vp-c-danger-3: #4C0606;
87
- --vp-c-danger-soft: #FFF9F9;
88
-
89
- --xvp-c-danger-1: var(--vp-c-red-1);
90
- --xvp-c-danger-2: var(--vp-c-red-2);
91
- --xvp-c-danger-3: var(--vp-c-red-3);
92
- --xvp-c-danger-soft: var(--vp-c-red-soft);
62
+ --vp-c-warning-1: var(--vp-c-yellow-1);
63
+ --vp-c-warning-2: var(--vp-c-yellow-2);
64
+ --vp-c-warning-3: var(--vp-c-yellow-3);
65
+ --vp-c-warning-soft: var(--vp-c-yellow-soft);
66
+
67
+ --vp-c-danger-1: var(--vp-c-red-1);
68
+ --vp-c-danger-2: var(--vp-c-red-2);
69
+ --vp-c-danger-3: var(--vp-c-red-3);
70
+ --vp-c-danger-soft: var(--vp-c-red-soft);
93
71
  }
94
72
 
95
73
  /**
@@ -116,13 +94,13 @@
116
94
  --vp-home-hero-name-color: transparent;
117
95
  --vp-home-hero-name-background: -webkit-linear-gradient(
118
96
  120deg,
119
- #D67402 20%,
120
- #11AC0E
97
+ #333333 30%,
98
+ #d14141
121
99
  );
122
100
 
123
101
  --vp-home-hero-image-background-image: linear-gradient(
124
102
  -45deg,
125
- #ffe7e5,
103
+ #ffe7e5 30%,
126
104
  #a70c00
127
105
  );
128
106
  --vp-home-hero-image-filter: blur(44px);
@@ -0,0 +1,15 @@
1
+ # Architecture Decision Records
2
+
3
+ The decisions here aren't *all* the architectural decisions I made, but are some of
4
+ them, and mostly hold up.
5
+
6
+ `adrs.cloud` is a Brut app.
7
+
8
+ * [Rely on Web Standards and MDN Baseline](https://adrs.cloud/shared_adrs/padr_b6920f0df907886b8a9207e9e2c9c2a2)
9
+ * [The Core Abstraction is the Plain Old Class](https://adrs.cloud/shared_adrs/padr_57f2397009a8aaf2c6083813ca588d73)
10
+ * [Pages and Forms are First-Class Abstractions…not REST](https://adrs.cloud/shared_adrs/padr_cdfcbe6b116b80a4f3d53fb3a6ed44b2)
11
+ * [Sequel will provide the data layer and its models will only model the database](https://adrs.cloud/shared_adrs/padr_01810ba90a92ec6c081a81affe212fb2)
12
+ * [There will be no controllers. Purpose-built classes will support pages, forms, and components.](https://adrs.cloud/shared_adrs/padr_f318e74925cb3e9d7e0eda329d085c4a)
13
+ * [Brut will not provider mailers, cloud storage, or background jobs](https://adrs.cloud/shared_adrs/padr_e7078d29f00710848ebbe43aea6094a6)
14
+ * [Requiring files should not execute code](https://adrs.cloud/shared_adrs/padr_03b5cf8e34bb7900a38f6de27e50adaa)
15
+ * [Phlex will be used for HTML templating](https://adrs.cloud/shared_adrs/padr_9529a5ada671254b5e5865b45abde92d)
@@ -34,7 +34,12 @@ as a separate Docker container available to the dev Docker container.
34
34
 
35
35
  Your editor and version control system run on your computer.
36
36
 
37
- ![Conceptual Overview](/images/dev-env-overview.png)
37
+ ![Diagram showing the parts of the dev environment. The foundational core is also
38
+ labeled "Docker containers" and it contains three boxes labeled "Container". One
39
+ box contains ValKey, another contains Postrgres. The third box contains "Your Brut
40
+ App", "NodeJS", "Ruby", and part of "Source Code". The "Source Code" also also
41
+ partially inside a box containing the foundational core labeled "Your Computer".
42
+ This box contains "Browser" and "source code editor".](/images/DevEnvironment.png)
38
43
 
39
44
  ### Foundational Core Command Line Apps
40
45
 
@@ -12,8 +12,7 @@ Here are some common exampels:
12
12
  - Forms don't have validations, they have **constraints** which are **violated** by invalid data.
13
13
  - Ruby classes don't have constructors, they have **initializers**.
14
14
  - Invoking behavior on a Ruby object is **calling a method**, not sending a message.
15
- - Despite being in `specs/`, the files in there are **tests**, not specifications or
16
- -specs".
15
+ - Despite being in `specs/`, the files in there are **tests**, not specifications or "specs".
17
16
  - Tests that use a browser are **end to end** or **e2e** tests.
18
17
  - HTML is not rendered, but **generated**. The browser renders the HTML sent to it by the server, along with the CSS.
19
18
  - Your app or site doesn't have users, it has **visitors**.
data/brutrb.com/index.md CHANGED
@@ -10,9 +10,6 @@ hero:
10
10
  src: /images/LogoTall.png
11
11
  alt: "A Ruby gemstone embedded into a concrete, brutalist building"
12
12
  actions:
13
- - theme: brand
14
- text: "Brut is Not Yet Released"
15
- link: /not-released
16
13
  - theme: brand
17
14
  text: "Getting Started"
18
15
  link: /getting-started
@@ -54,9 +54,9 @@ abstraction. Although HTTP does include this concept, we find it's not as usefu
54
54
  for managing web apps as it may seem.
55
55
 
56
56
  We've found that teams often struggle with mapping what everyone else calls pages
57
- to resources and HTTP verbs. We also find that the consonance features, resources, actions, and database tables never materializes. We're basically not going to debate what the meaning of the `DELETE` verb on the `widgets` resource is actually supposed to mean.
57
+ to resources and HTTP verbs. We also find that the consonance of features, resources, actions, and database tables never materializes. We're basically not going to debate what the meaning of the `DELETE` verb on the `widgets` resource is actually supposed to mean.
58
58
 
59
59
  ## Brut is Hippocratic Licensed
60
60
 
61
61
  It's important to me that Brut is used to make the world a better place. Please take
62
- a not of [its license](https://firstdonoharm.dev/version/3/0/cl-eco-media-my-tal-xuar.txt)
62
+ a note of [its license](https://firstdonoharm.dev/version/3/0/cl-eco-media-my-tal-xuar.txt)
@@ -0,0 +1,57 @@
1
+ # Roadmap to 1.0
2
+
3
+ A lot of Brut is solid, but there's several things missing from what I would
4
+ call a 1.0 release. Here are some ideas of what I think is needed:
5
+
6
+ ## Better Dev Experience
7
+
8
+ * The output of `bin/dev` isn't great.
9
+ * otel-desktop-viewer is cool, but not the easiest to figure out issues as compred to good 'ole logging.
10
+ * Error pages in the app are *really* bad.
11
+ * CLI apps are OK, but could be fancier.
12
+
13
+ ## More Tests
14
+
15
+ * Unit tests for all/most classes are needed. There's only a few now.
16
+ * Integration test of `mkbrut`, all automated.
17
+ * Web component/custom element tests need to be re-thought.
18
+ * Test output is a wall of text stack trace and this sucks.
19
+ * Improvements in access to Playwright features.
20
+ * Playright is the worst E2E testing tool except all the rest. Would love a better option here.
21
+
22
+ ## More Complete Web Features
23
+
24
+ * Content security policy doens't allow for hashes, which can be limiting in some situations. I want everyone to be running with a CSP, so it has to be configurable to some degree.
25
+ * Websockets, server-push, etc. should be possible or at least have a recipe.
26
+ * Learn more about importmaps.
27
+
28
+ ## Client-Side Improvements
29
+
30
+ BrutJS is woefully incomplete. I'd like developers to be able to accomplishe
31
+ certain tasks without needing a framework:
32
+
33
+ * Hooks into asset building to e.g. enable TailwindCSS or other tools.
34
+ * Better use of `fetch` in more situations
35
+ * Server-generated HTML replacement
36
+ * Better support for "API" style back-end when a framework *is* going to be used.
37
+
38
+ ## Deployment
39
+
40
+ Out of the box support for more deployment mechanism, at least:
41
+
42
+ * Normal Heroku/`Procfile`-based deploy
43
+ * Digital Ocean-style hosting
44
+ * VPS?
45
+
46
+ ## Documentation
47
+
48
+ * More recipes for how to do things
49
+ * More complete API docs with examples
50
+ * A unified look and feel across the board
51
+ * Get rid of VitePress for something less client-heavy, but still great
52
+ * Dash-accessible API docs
53
+
54
+ ## Misc
55
+
56
+ * More direct Sidekiq support
57
+
@@ -1,3 +1,7 @@
1
1
  # Tutorial
2
2
 
3
- TBD - this will be created once Brut is somewhat stabilized.
3
+ A real tutorial will appear here eventually.
4
+
5
+ In the mean time, [ADRs.cloud](https://github.com/thirdtank/adrs.cloud) is a
6
+ full-fledge Brut app you can examine to see how things work. You can be running it
7
+ locally in minutes, once you install Docker.
data/docs/404.html CHANGED
@@ -6,21 +6,21 @@
6
6
  <title>404 | Brut RB</title>
7
7
  <meta name="description" content="Not Found">
8
8
  <meta name="generator" content="VitePress v1.6.3">
9
- <link rel="preload stylesheet" href="/assets/style.prAgp4yQ.css" as="style">
9
+ <link rel="preload stylesheet" href="/assets/style.B1z60PPQ.css" as="style">
10
10
  <link rel="preload stylesheet" href="/vp-icons.css" as="style">
11
11
 
12
- <script type="module" src="/assets/app.ClaS47Ru.js"></script>
12
+ <script type="module" src="/assets/app.Dm3x-DQc.js"></script>
13
13
  <link rel="icon" href="/favicon.ico">
14
14
  <meta property="og:title" content="BrutRB Documentation">
15
15
  <meta property="og:type" content="website">
16
- <meta property="og:image" content="https://github.com/thirdtank/brut/blob/main/assets/SocialImage.png?raw=true">
16
+ <meta property="og:image" content="https://brutrb.com/SocialImage.png">
17
17
  <script defer data-domain="brutrb.com" src="https://plausible.io/js/script.js"></script>
18
18
  <script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
19
19
  <script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
20
20
  </head>
21
21
  <body>
22
22
  <div id="app"></div>
23
- <script>window.__VP_HASH_MAP__=JSON.parse("{\"ai.md\":\"Cy9GWnER\",\"assets.md\":\"7C3HWkga\",\"brut-js.md\":\"B4GYxQVw\",\"business-logic.md\":\"BY4hGy0m\",\"cli.md\":\"CjsktgFz\",\"components.md\":\"DatoNgFo\",\"configuration.md\":\"DeyhpqEx\",\"css.md\":\"CltvJqAa\",\"custom-element-tests.md\":\"B_rbta32\",\"database-access.md\":\"gnluu54N\",\"database-schema.md\":\"CSYk6E6v\",\"deployment.md\":\"BLseERGV\",\"dev-environment.md\":\"BroAOLhF\",\"dir-structure.md\":\"CWir1pic\",\"doc-conventions.md\":\"BzmSrTEW\",\"end-to-end-tests.md\":\"DzqRpZ43\",\"features.md\":\"DPFXsy0z\",\"flash-and-session.md\":\"nPvUpnUx\",\"form-constraints.md\":\"x5tNpTTI\",\"forms.md\":\"C2Dizvzq\",\"getting-started.md\":\"C93e0odB\",\"handlers.md\":\"Chyri6KA\",\"hooks.md\":\"Jmb5VOLA\",\"i18n.md\":\"xQhiGo1G\",\"index.md\":\"CAMqGBJE\",\"instrumentation.md\":\"BgcaGVYH\",\"javascript.md\":\"DzrMxUmI\",\"jobs.md\":\"S-2amAYp\",\"keyword-injection.md\":\"95Zgh2eN\",\"layouts.md\":\"CJGDFY-m\",\"lsp.md\":\"Dn1rIiW0\",\"markdown-examples.md\":\"CCFEQO44\",\"middleware.md\":\"Czz_UlJN\",\"not-released.md\":\"BBy28McC\",\"overview.md\":\"Bdq4qt3L\",\"pages.md\":\"B7Hc-i6H\",\"recipes_alternate-layouts.md\":\"BwEytl59\",\"recipes_authentication.md\":\"Dzvi_g69\",\"recipes_blank-layouts.md\":\"fyAUJyJR\",\"recipes_custom-flash.md\":\"CrQbI5eH\",\"recipes_indexed-forms.md\":\"CstYyOSo\",\"recipes_text-field-component.md\":\"H4wLAK0Z\",\"routes.md\":\"B8kfUPHU\",\"security.md\":\"C0G_AZR-\",\"seed-data.md\":\"BvFZlqIk\",\"space-time-continuum.md\":\"xl44xDos\",\"tutorial.md\":\"a4a0eVOy\",\"unit-tests.md\":\"DUGrnLj5\",\"why.md\":\"C-hk5xgJ\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Brut RB\",\"description\":\"Documentation for the Brut.RB web framework.\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"search\":{\"provider\":\"local\"},\"nav\":[{\"text\":\"Home\",\"link\":\"/\"},{\"text\":\"Getting Started\",\"link\":\"/getting-started\"},{\"text\":\"Overview\",\"link\":\"/overview\"},{\"text\":\"Brut API\",\"link\":\"/api/index.html\",\"target\":\"_self\"},{\"text\":\"BrutJS\",\"link\":\"/brut-js/api/index.html\",\"target\":\"_self\"},{\"text\":\"BrutCSS\",\"link\":\"/brut-css/index.html\",\"target\":\"_self\"}],\"outline\":[2,3],\"sidebar\":[{\"text\":\"Overview\",\"collapsed\":false,\"items\":[{\"text\":\"Getting Started\",\"link\":\"/getting-started\"},{\"text\":\"Concepts\",\"link\":\"/overview\"},{\"text\":\"Features\",\"link\":\"/features\"},{\"text\":\"Directory Structure\",\"link\":\"/dir-structure\"},{\"text\":\"Dev Environment\",\"link\":\"/dev-environment\"},{\"text\":\"Tutorial\",\"link\":\"/tutorial\"},{\"text\":\"Documentation Conventions\",\"link\":\"/doc-conventions\"}]},{\"text\":\"Front-End\",\"collapsed\":false,\"items\":[{\"text\":\"Routes\",\"link\":\"/routes\"},{\"text\":\"Pages\",\"link\":\"/pages\"},{\"text\":\"Layouts\",\"link\":\"/layouts\"},{\"text\":\"Forms\",\"link\":\"/forms\"},{\"text\":\"Form Constraints\",\"link\":\"/form-constraints\"},{\"text\":\"Handlers and Actions\",\"link\":\"/handlers\"},{\"text\":\"Components\",\"link\":\"/components\"},{\"text\":\"Flash and Session\",\"link\":\"/flash-and-session\"},{\"text\":\"Space/Time Continuum\",\"link\":\"/space-time-continuum\"},{\"text\":\"JavaScript\",\"link\":\"/javascript\"},{\"text\":\"CSS\",\"link\":\"/css\"},{\"text\":\"Assets\",\"link\":\"/assets\"},{\"text\":\"BrutJS\",\"link\":\"/brut-js\"}]},{\"text\":\"Back-End\",\"collapsed\":false,\"items\":[{\"text\":\"Database Schema\",\"link\":\"/database-schema\"},{\"text\":\"Database Access\",\"link\":\"/database-access\"},{\"text\":\"Seed Data\",\"link\":\"/seed-data\"},{\"text\":\"Jobs\",\"link\":\"/jobs\"},{\"text\":\"Business Logic\",\"link\":\"/business-logic\"}]},{\"text\":\"Framework\",\"collapsed\":false,\"items\":[{\"text\":\"Configuration\",\"link\":\"/configuration\"},{\"text\":\"Keyword Injection\",\"link\":\"/keyword-injection\"},{\"text\":\"I18n\",\"link\":\"/i18n\"},{\"text\":\"CLI / Tasks\",\"link\":\"/cli\"},{\"text\":\"Deployment\",\"link\":\"/deployment\"}]},{\"text\":\"Testing\",\"collapsed\":false,\"items\":[{\"text\":\"Unit Tests\",\"link\":\"/unit-tests\"},{\"text\":\"End-to-End Tests\",\"link\":\"/end-to-end-tests\"},{\"text\":\"Testing Custom Elements\",\"link\":\"/custom-element-tests\"}]},{\"text\":\"Advanced Topics\",\"collapsed\":true,\"items\":[{\"text\":\"Route Hooks\",\"link\":\"/hooks\"},{\"text\":\"Middleware\",\"link\":\"/middleware\"},{\"text\":\"Instrumentation\",\"link\":\"/instrumentation\"},{\"text\":\"Security\",\"link\":\"/security\"},{\"text\":\"LSP Support\",\"link\":\"/lsp\"}]},{\"text\":\"Recipes\",\"collapsed\":true,\"items\":[{\"text\":\"Authentication\",\"link\":\"/recipes/authentication\"},{\"text\":\"Alternate Layouts\",\"link\":\"/recipes/alternate-layouts\"},{\"text\":\"Blank Layouts\",\"link\":\"/recipes/blank-layouts\"},{\"text\":\"Custom Flash Class\",\"link\":\"/recipes/custom-flash\"},{\"text\":\"Indexed Form Elements\",\"link\":\"/recipes/indexed-forms\"},{\"text\":\"Text Field Component\",\"link\":\"/recipes/text-field-component\"}]},{\"text\":\"Meta\",\"collapsed\":false,\"items\":[{\"text\":\"Why?!\",\"link\":\"/why\"},{\"text\":\"AI Declaration\",\"link\":\"/ai\"}]}],\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/thirdtank/brut\"}]},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
23
+ <script>window.__VP_HASH_MAP__=JSON.parse("{\"adrs.md\":\"JRxZ5uYE\",\"ai.md\":\"Cy9GWnER\",\"assets.md\":\"7C3HWkga\",\"brut-js.md\":\"B4GYxQVw\",\"business-logic.md\":\"BY4hGy0m\",\"cli.md\":\"CjsktgFz\",\"components.md\":\"Pg_Lo35G\",\"configuration.md\":\"BfeGnEci\",\"css.md\":\"CltvJqAa\",\"custom-element-tests.md\":\"B_rbta32\",\"database-access.md\":\"gnluu54N\",\"database-schema.md\":\"CSYk6E6v\",\"deployment.md\":\"BLseERGV\",\"dev-environment.md\":\"Dy6EldaM\",\"dir-structure.md\":\"CWir1pic\",\"doc-conventions.md\":\"DOkAuXlt\",\"end-to-end-tests.md\":\"DzqRpZ43\",\"features.md\":\"DPFXsy0z\",\"flash-and-session.md\":\"nPvUpnUx\",\"form-constraints.md\":\"x5tNpTTI\",\"forms.md\":\"BQZlCwvi\",\"getting-started.md\":\"BcXnNuD6\",\"handlers.md\":\"Chyri6KA\",\"hooks.md\":\"Jmb5VOLA\",\"i18n.md\":\"xQhiGo1G\",\"index.md\":\"Bn9e0sRJ\",\"instrumentation.md\":\"BgcaGVYH\",\"javascript.md\":\"DzrMxUmI\",\"jobs.md\":\"S-2amAYp\",\"keyword-injection.md\":\"95Zgh2eN\",\"layouts.md\":\"CJGDFY-m\",\"lsp.md\":\"Dn1rIiW0\",\"markdown-examples.md\":\"CCFEQO44\",\"middleware.md\":\"Czz_UlJN\",\"overview.md\":\"iMnwLO4x\",\"pages.md\":\"B7Hc-i6H\",\"recipes_alternate-layouts.md\":\"BwEytl59\",\"recipes_authentication.md\":\"Dzvi_g69\",\"recipes_blank-layouts.md\":\"fyAUJyJR\",\"recipes_custom-flash.md\":\"CrQbI5eH\",\"recipes_indexed-forms.md\":\"CstYyOSo\",\"recipes_text-field-component.md\":\"H4wLAK0Z\",\"roadmap.md\":\"C6PRi0DX\",\"routes.md\":\"B8kfUPHU\",\"security.md\":\"C0G_AZR-\",\"seed-data.md\":\"BvFZlqIk\",\"space-time-continuum.md\":\"xl44xDos\",\"tutorial.md\":\"BYXj4cOu\",\"unit-tests.md\":\"DUGrnLj5\",\"why.md\":\"C-hk5xgJ\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"Brut RB\",\"description\":\"Documentation for the Brut.RB web framework.\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"search\":{\"provider\":\"local\"},\"nav\":[{\"text\":\"Home\",\"link\":\"/\"},{\"text\":\"Getting Started\",\"link\":\"/getting-started\"},{\"text\":\"Overview\",\"link\":\"/overview\"},{\"text\":\"Brut API\",\"link\":\"/api/index.html\",\"target\":\"_self\"},{\"text\":\"BrutJS\",\"link\":\"/brut-js/api/index.html\",\"target\":\"_self\"},{\"text\":\"BrutCSS\",\"link\":\"/brut-css/index.html\",\"target\":\"_self\"}],\"outline\":[2,3],\"sidebar\":[{\"text\":\"Overview\",\"collapsed\":false,\"items\":[{\"text\":\"Getting Started\",\"link\":\"/getting-started\"},{\"text\":\"Concepts\",\"link\":\"/overview\"},{\"text\":\"Features\",\"link\":\"/features\"},{\"text\":\"Directory Structure\",\"link\":\"/dir-structure\"},{\"text\":\"Dev Environment\",\"link\":\"/dev-environment\"},{\"text\":\"Tutorial\",\"link\":\"/tutorial\"},{\"text\":\"Documentation Conventions\",\"link\":\"/doc-conventions\"}]},{\"text\":\"Front-End\",\"collapsed\":false,\"items\":[{\"text\":\"Routes\",\"link\":\"/routes\"},{\"text\":\"Pages\",\"link\":\"/pages\"},{\"text\":\"Layouts\",\"link\":\"/layouts\"},{\"text\":\"Forms\",\"link\":\"/forms\"},{\"text\":\"Form Constraints\",\"link\":\"/form-constraints\"},{\"text\":\"Handlers and Actions\",\"link\":\"/handlers\"},{\"text\":\"Components\",\"link\":\"/components\"},{\"text\":\"Flash and Session\",\"link\":\"/flash-and-session\"},{\"text\":\"Space/Time Continuum\",\"link\":\"/space-time-continuum\"},{\"text\":\"JavaScript\",\"link\":\"/javascript\"},{\"text\":\"CSS\",\"link\":\"/css\"},{\"text\":\"Assets\",\"link\":\"/assets\"},{\"text\":\"BrutJS\",\"link\":\"/brut-js\"}]},{\"text\":\"Back-End\",\"collapsed\":false,\"items\":[{\"text\":\"Database Schema\",\"link\":\"/database-schema\"},{\"text\":\"Database Access\",\"link\":\"/database-access\"},{\"text\":\"Seed Data\",\"link\":\"/seed-data\"},{\"text\":\"Jobs\",\"link\":\"/jobs\"},{\"text\":\"Business Logic\",\"link\":\"/business-logic\"}]},{\"text\":\"Framework\",\"collapsed\":false,\"items\":[{\"text\":\"Configuration\",\"link\":\"/configuration\"},{\"text\":\"Keyword Injection\",\"link\":\"/keyword-injection\"},{\"text\":\"I18n\",\"link\":\"/i18n\"},{\"text\":\"CLI / Tasks\",\"link\":\"/cli\"},{\"text\":\"Deployment\",\"link\":\"/deployment\"}]},{\"text\":\"Testing\",\"collapsed\":false,\"items\":[{\"text\":\"Unit Tests\",\"link\":\"/unit-tests\"},{\"text\":\"End-to-End Tests\",\"link\":\"/end-to-end-tests\"},{\"text\":\"Testing Custom Elements\",\"link\":\"/custom-element-tests\"}]},{\"text\":\"Advanced Topics\",\"collapsed\":true,\"items\":[{\"text\":\"Route Hooks\",\"link\":\"/hooks\"},{\"text\":\"Middleware\",\"link\":\"/middleware\"},{\"text\":\"Instrumentation\",\"link\":\"/instrumentation\"},{\"text\":\"Security\",\"link\":\"/security\"},{\"text\":\"LSP Support\",\"link\":\"/lsp\"}]},{\"text\":\"Recipes\",\"collapsed\":true,\"items\":[{\"text\":\"Authentication\",\"link\":\"/recipes/authentication\"},{\"text\":\"Alternate Layouts\",\"link\":\"/recipes/alternate-layouts\"},{\"text\":\"Blank Layouts\",\"link\":\"/recipes/blank-layouts\"},{\"text\":\"Custom Flash Class\",\"link\":\"/recipes/custom-flash\"},{\"text\":\"Indexed Form Elements\",\"link\":\"/recipes/indexed-forms\"},{\"text\":\"Text Field Component\",\"link\":\"/recipes/text-field-component\"}]},{\"text\":\"Meta\",\"collapsed\":false,\"items\":[{\"text\":\"Why?!\",\"link\":\"/why\"},{\"text\":\"ADRs\",\"link\":\"/adrs\"},{\"text\":\"Roadmap to 1.0\",\"link\":\"/roadmap\"},{\"text\":\"AI Declaration\",\"link\":\"/ai\"}]}],\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/thirdtank/brut\"}]},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false}");</script>
24
24
 
25
25
  </body>
26
26
  </html>