brut 0.11.0 → 0.12.1

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 (376) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +11 -0
  3. data/Gemfile.lock +8 -8
  4. data/brut-css/package-lock.json +94 -97
  5. data/brut-css/package.json +2 -2
  6. data/brut-js/package-lock.json +3 -3
  7. data/brut-js/package.json +6 -3
  8. data/brut-js/specs/AjaxSubmit.spec.js +62 -6
  9. data/brut-js/src/AjaxSubmit.js +26 -6
  10. data/brutrb.com/forms.md +1 -0
  11. data/brutrb.com/recipes/authentication.md +1 -0
  12. data/brutrb.com/tutorials/01-intro.md +26 -2
  13. data/docs/404.html +2 -2
  14. data/docs/adrs.html +3 -3
  15. data/docs/ai.html +3 -3
  16. data/docs/api/Brut/BackEnd/SeedData.html +1 -1
  17. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server/FlushSpans.html +1 -1
  18. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server.html +1 -1
  19. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares.html +1 -1
  20. data/docs/api/Brut/BackEnd/Sidekiq.html +1 -1
  21. data/docs/api/Brut/BackEnd/Validators/FormValidator.html +1 -1
  22. data/docs/api/Brut/BackEnd/Validators.html +1 -1
  23. data/docs/api/Brut/BackEnd.html +1 -1
  24. data/docs/api/Brut/CLI/App.html +1 -1
  25. data/docs/api/Brut/CLI/AppRunner.html +1 -1
  26. data/docs/api/Brut/CLI/Apps/BuildAssets/All.html +1 -1
  27. data/docs/api/Brut/CLI/Apps/BuildAssets/CSS.html +1 -1
  28. data/docs/api/Brut/CLI/Apps/BuildAssets/Images.html +1 -1
  29. data/docs/api/Brut/CLI/Apps/BuildAssets/JS.html +1 -1
  30. data/docs/api/Brut/CLI/Apps/BuildAssets.html +1 -1
  31. data/docs/api/Brut/CLI/Apps/DB/Create.html +1 -1
  32. data/docs/api/Brut/CLI/Apps/DB/Drop.html +1 -1
  33. data/docs/api/Brut/CLI/Apps/DB/Migrate.html +1 -1
  34. data/docs/api/Brut/CLI/Apps/DB/NewMigration.html +1 -1
  35. data/docs/api/Brut/CLI/Apps/DB/Rebuild.html +1 -1
  36. data/docs/api/Brut/CLI/Apps/DB/Seed.html +1 -1
  37. data/docs/api/Brut/CLI/Apps/DB/Status.html +1 -1
  38. data/docs/api/Brut/CLI/Apps/DB.html +1 -1
  39. data/docs/api/Brut/CLI/Apps/DeployBase/GitChecks.html +1 -1
  40. data/docs/api/Brut/CLI/Apps/DeployBase.html +1 -1
  41. data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy/Deploy.html +1 -1
  42. data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy.html +1 -1
  43. data/docs/api/Brut/CLI/Apps/Scaffold/Action/Route.html +1 -1
  44. data/docs/api/Brut/CLI/Apps/Scaffold/Action.html +1 -1
  45. data/docs/api/Brut/CLI/Apps/Scaffold/Component.html +1 -1
  46. data/docs/api/Brut/CLI/Apps/Scaffold/CustomElementTest.html +1 -1
  47. data/docs/api/Brut/CLI/Apps/Scaffold/DbModel.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 +1 -1
  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 +1 -1
  58. data/docs/api/Brut/CLI/Apps/Test/Run.html +1 -1
  59. data/docs/api/Brut/CLI/Apps/Test.html +1 -1
  60. data/docs/api/Brut/CLI/Apps.html +1 -1
  61. data/docs/api/Brut/CLI/Command.html +1 -1
  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 +2 -2
  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 +2 -2
  95. data/docs/api/Brut/FrontEnd/Components/Inputs/ButtonTag.html +447 -0
  96. data/docs/api/Brut/FrontEnd/Components/Inputs/CsrfToken.html +1 -1
  97. data/docs/api/Brut/FrontEnd/Components/Inputs/InputTag.html +14 -9
  98. data/docs/api/Brut/FrontEnd/Components/Inputs/RadioButton.html +1 -1
  99. data/docs/api/Brut/FrontEnd/Components/Inputs/SelectTagWithOptions.html +8 -9
  100. data/docs/api/Brut/FrontEnd/Components/Inputs/TextareaTag.html +10 -11
  101. data/docs/api/Brut/FrontEnd/Components/Inputs.html +2 -2
  102. data/docs/api/Brut/FrontEnd/Components/LocaleDetection.html +1 -1
  103. data/docs/api/Brut/FrontEnd/Components/PageIdentifier.html +1 -1
  104. data/docs/api/Brut/FrontEnd/Components/TimeTag.html +1 -1
  105. data/docs/api/Brut/FrontEnd/Components/Traceparent.html +1 -1
  106. data/docs/api/Brut/FrontEnd/Components.html +1 -1
  107. data/docs/api/Brut/FrontEnd/CsrfProtector.html +1 -1
  108. data/docs/api/Brut/FrontEnd/Download.html +1 -1
  109. data/docs/api/Brut/FrontEnd/Flash.html +1 -1
  110. data/docs/api/Brut/FrontEnd/Form.html +39 -39
  111. data/docs/api/Brut/FrontEnd/Forms/Button.html +331 -0
  112. data/docs/api/Brut/FrontEnd/Forms/ButtonInputDefinition.html +537 -0
  113. data/docs/api/Brut/FrontEnd/Forms/ConstraintViolation.html +1 -1
  114. data/docs/api/Brut/FrontEnd/Forms/Input/Color.html +1 -1
  115. data/docs/api/Brut/FrontEnd/Forms/Input/TimeOfDay.html +1 -1
  116. data/docs/api/Brut/FrontEnd/Forms/Input.html +6 -2
  117. data/docs/api/Brut/FrontEnd/Forms/InputDeclarations.html +111 -23
  118. data/docs/api/Brut/FrontEnd/Forms/InputDefinition.html +20 -12
  119. data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInput.html +1 -1
  120. data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInputDefinition.html +1 -1
  121. data/docs/api/Brut/FrontEnd/Forms/SelectInput.html +1 -1
  122. data/docs/api/Brut/FrontEnd/Forms/SelectInputDefinition.html +1 -1
  123. data/docs/api/Brut/FrontEnd/Forms/ValidityState.html +1 -1
  124. data/docs/api/Brut/FrontEnd/Forms.html +2 -2
  125. data/docs/api/Brut/FrontEnd/GenericResponse.html +1 -1
  126. data/docs/api/Brut/FrontEnd/Handler.html +1 -1
  127. data/docs/api/Brut/FrontEnd/Handlers/CspReportingHandler.html +1 -1
  128. data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler/TraceParent.html +1 -1
  129. data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler.html +1 -1
  130. data/docs/api/Brut/FrontEnd/Handlers/LocaleDetectionHandler.html +1 -1
  131. data/docs/api/Brut/FrontEnd/Handlers/MissingHandler/Form.html +2 -2
  132. data/docs/api/Brut/FrontEnd/Handlers/MissingHandler.html +1 -1
  133. data/docs/api/Brut/FrontEnd/Handlers.html +1 -1
  134. data/docs/api/Brut/FrontEnd/HandlingResults.html +1 -1
  135. data/docs/api/Brut/FrontEnd/HttpMethod.html +1 -1
  136. data/docs/api/Brut/FrontEnd/HttpStatus.html +1 -1
  137. data/docs/api/Brut/FrontEnd/InlineSvgLocator.html +1 -1
  138. data/docs/api/Brut/FrontEnd/Layout.html +1 -1
  139. data/docs/api/Brut/FrontEnd/Middleware.html +1 -1
  140. data/docs/api/Brut/FrontEnd/Middlewares/AnnotateBrutOwnedPaths.html +1 -1
  141. data/docs/api/Brut/FrontEnd/Middlewares/Favicon.html +1 -1
  142. data/docs/api/Brut/FrontEnd/Middlewares/OpenTelemetrySpan.html +1 -1
  143. data/docs/api/Brut/FrontEnd/Middlewares/ReloadApp.html +1 -1
  144. data/docs/api/Brut/FrontEnd/Middlewares.html +1 -1
  145. data/docs/api/Brut/FrontEnd/Page.html +1 -1
  146. data/docs/api/Brut/FrontEnd/Pages/MissingPage.html +1 -1
  147. data/docs/api/Brut/FrontEnd/Pages.html +1 -1
  148. data/docs/api/Brut/FrontEnd/RequestContext.html +1 -1
  149. data/docs/api/Brut/FrontEnd/RouteHook.html +1 -1
  150. data/docs/api/Brut/FrontEnd/RouteHooks/AgeFlash.html +1 -1
  151. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineScripts.html +1 -1
  152. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts/ReportOnly.html +1 -1
  153. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts.html +1 -1
  154. data/docs/api/Brut/FrontEnd/RouteHooks/LocaleDetection.html +1 -1
  155. data/docs/api/Brut/FrontEnd/RouteHooks/SetupRequestContext.html +1 -1
  156. data/docs/api/Brut/FrontEnd/RouteHooks.html +1 -1
  157. data/docs/api/Brut/FrontEnd/Routing/FormHandlerRoute.html +1 -1
  158. data/docs/api/Brut/FrontEnd/Routing/FormRoute.html +1 -1
  159. data/docs/api/Brut/FrontEnd/Routing/MissingForm.html +1 -1
  160. data/docs/api/Brut/FrontEnd/Routing/MissingHandler.html +1 -1
  161. data/docs/api/Brut/FrontEnd/Routing/MissingPage.html +1 -1
  162. data/docs/api/Brut/FrontEnd/Routing/MissingPath.html +1 -1
  163. data/docs/api/Brut/FrontEnd/Routing/PageRoute.html +1 -1
  164. data/docs/api/Brut/FrontEnd/Routing/Route.html +1 -1
  165. data/docs/api/Brut/FrontEnd/Routing.html +1 -1
  166. data/docs/api/Brut/FrontEnd/Session.html +1 -1
  167. data/docs/api/Brut/FrontEnd.html +1 -1
  168. data/docs/api/Brut/I18n/BaseMethods.html +1 -1
  169. data/docs/api/Brut/I18n/ForBackEnd.html +1 -1
  170. data/docs/api/Brut/I18n/ForCLI.html +1 -1
  171. data/docs/api/Brut/I18n/ForHTML.html +1 -1
  172. data/docs/api/Brut/I18n/HTTPAcceptLanguage/AlwaysEnglish.html +1 -1
  173. data/docs/api/Brut/I18n/HTTPAcceptLanguage.html +1 -1
  174. data/docs/api/Brut/I18n.html +1 -1
  175. data/docs/api/Brut/Instrumentation/LoggerSpanExporter.html +1 -1
  176. data/docs/api/Brut/Instrumentation/Methods/ClassMethods.html +596 -0
  177. data/docs/api/Brut/Instrumentation/Methods.html +173 -0
  178. data/docs/api/Brut/Instrumentation/OpenTelemetry/NormalizedAttributes.html +7 -7
  179. data/docs/api/Brut/Instrumentation/OpenTelemetry/Span.html +7 -7
  180. data/docs/api/Brut/Instrumentation/OpenTelemetry.html +19 -17
  181. data/docs/api/Brut/Instrumentation.html +3 -1
  182. data/docs/api/Brut/RubocopConfig.html +1 -1
  183. data/docs/api/Brut/SinatraHelpers/ClassMethods.html +1 -1
  184. data/docs/api/Brut/SinatraHelpers.html +1 -1
  185. data/docs/api/Brut/SpecSupport/ClockSupport.html +1 -1
  186. data/docs/api/Brut/SpecSupport/ComponentSupport.html +1 -1
  187. data/docs/api/Brut/SpecSupport/E2ETestServer.html +1 -1
  188. data/docs/api/Brut/SpecSupport/E2eSupport.html +1 -1
  189. data/docs/api/Brut/SpecSupport/EnhancedNode.html +1 -1
  190. data/docs/api/Brut/SpecSupport/FlashSupport.html +1 -1
  191. data/docs/api/Brut/SpecSupport/GeneralSupport/ClassMethods.html +1 -1
  192. data/docs/api/Brut/SpecSupport/GeneralSupport.html +1 -1
  193. data/docs/api/Brut/SpecSupport/HandlerSupport.html +1 -1
  194. data/docs/api/Brut/SpecSupport/Matchers/BeABug.html +1 -1
  195. data/docs/api/Brut/SpecSupport/Matchers/BePageFor.html +1 -1
  196. data/docs/api/Brut/SpecSupport/Matchers/BeRoutingFor.html +1 -1
  197. data/docs/api/Brut/SpecSupport/Matchers/HaveConstraintViolation.html +1 -1
  198. data/docs/api/Brut/SpecSupport/Matchers/HaveGenerated.html +1 -1
  199. data/docs/api/Brut/SpecSupport/Matchers/HaveHTMLAttribute.html +1 -1
  200. data/docs/api/Brut/SpecSupport/Matchers/HaveI18nString.html +1 -1
  201. data/docs/api/Brut/SpecSupport/Matchers/HaveLinkTo.html +1 -1
  202. data/docs/api/Brut/SpecSupport/Matchers/HaveRedirectedTo.html +1 -1
  203. data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedHttpStatus.html +1 -1
  204. data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedRackResponse.html +1 -1
  205. data/docs/api/Brut/SpecSupport/Matchers.html +1 -1
  206. data/docs/api/Brut/SpecSupport/RSpecSetup/OptionalSidekiqSupport.html +1 -1
  207. data/docs/api/Brut/SpecSupport/RSpecSetup.html +1 -1
  208. data/docs/api/Brut/SpecSupport/SessionSupport.html +1 -1
  209. data/docs/api/Brut/SpecSupport.html +1 -1
  210. data/docs/api/Brut.html +1 -1
  211. data/docs/api/Clock.html +1 -1
  212. data/docs/api/ModuleName.html +1 -1
  213. data/docs/api/RichString.html +1 -1
  214. data/docs/api/SemanticLogger/Appender/Async.html +1 -1
  215. data/docs/api/Sequel/Extensions/BrutInstrumentation.html +1 -1
  216. data/docs/api/Sequel/Extensions/BrutMigrations.html +1 -1
  217. data/docs/api/Sequel/Extensions.html +1 -1
  218. data/docs/api/Sequel/Plugins/CreatedAt/InstanceMethods.html +1 -1
  219. data/docs/api/Sequel/Plugins/CreatedAt.html +1 -1
  220. data/docs/api/Sequel/Plugins/ExternalId/ClassMethods.html +1 -1
  221. data/docs/api/Sequel/Plugins/ExternalId/InstanceMethods.html +1 -1
  222. data/docs/api/Sequel/Plugins/ExternalId.html +1 -1
  223. data/docs/api/Sequel/Plugins/FindBang/ClassMethods.html +1 -1
  224. data/docs/api/Sequel/Plugins/FindBang.html +1 -1
  225. data/docs/api/Sequel/Plugins.html +1 -1
  226. data/docs/api/Sequel.html +1 -1
  227. data/docs/api/_index.html +36 -1
  228. data/docs/api/class_list.html +1 -1
  229. data/docs/api/file.README.html +1 -1
  230. data/docs/api/index.html +1 -1
  231. data/docs/api/method_list.html +364 -252
  232. data/docs/api/top-level-namespace.html +1 -1
  233. data/docs/assets/{app.0-aKXKdt.js → app.CGHFI-MA.js} +1 -1
  234. data/docs/assets/chunks/@localSearchIndexroot.DcMsFVrO.js +1 -0
  235. data/docs/assets/chunks/{VPLocalSearchBox.CW-UBkNA.js → VPLocalSearchBox.-c-Kihwo.js} +1 -1
  236. data/docs/assets/chunks/{theme.a6feKWJO.js → theme.DpqrgXG8.js} +2 -2
  237. data/docs/assets/{components.md.BzVRwegp.js → components.md.X4h_TEG-.js} +3 -3
  238. data/docs/assets/{configuration.md.eM5wFVi5.js → configuration.md.CPCyUo5A.js} +1 -1
  239. data/docs/assets/{forms.md.B3BHvCV3.js → forms.md.BwmfAZ6Z.js} +2 -2
  240. data/docs/assets/{getting-started.md.BgR0ZHsl.js → getting-started.md.mPgbkbBv.js} +2 -2
  241. data/docs/assets/instrumentation.md._lNSriEZ.js +90 -0
  242. data/docs/assets/instrumentation.md._lNSriEZ.lean.js +1 -0
  243. data/docs/assets/{recipes_authentication.md.Dzvi_g69.js → recipes_authentication.md.BAISoxmN.js} +1 -0
  244. data/docs/assets/{tutorials_01-intro.md.BXvYWcO9.js → tutorials_01-intro.md.B4sUBY3X.js} +10 -10
  245. data/docs/assets/{tutorials_01-intro.md.BXvYWcO9.lean.js → tutorials_01-intro.md.B4sUBY3X.lean.js} +1 -1
  246. data/docs/assets/{tutorials_02-dialog.md.CIeg8R--.js → tutorials_02-dialog.md.DOonTBrE.js} +1 -1
  247. data/docs/assets.html +3 -3
  248. data/docs/brut-js/api/AjaxSubmit.html +16 -6
  249. data/docs/brut-js/api/AjaxSubmit.js.html +27 -7
  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 +3 -3
  303. data/docs/business-logic.html +3 -3
  304. data/docs/cli.html +3 -3
  305. data/docs/components.html +7 -7
  306. data/docs/configuration.html +5 -5
  307. data/docs/css.html +3 -3
  308. data/docs/custom-element-tests.html +3 -3
  309. data/docs/database-access.html +3 -3
  310. data/docs/database-schema.html +3 -3
  311. data/docs/deployment.html +3 -3
  312. data/docs/dev-environment.html +3 -3
  313. data/docs/dir-structure.html +3 -3
  314. data/docs/doc-conventions.html +3 -3
  315. data/docs/end-to-end-tests.html +3 -3
  316. data/docs/features.html +3 -3
  317. data/docs/flash-and-session.html +3 -3
  318. data/docs/form-constraints.html +3 -3
  319. data/docs/forms.html +6 -6
  320. data/docs/getting-started.html +6 -6
  321. data/docs/handlers.html +3 -3
  322. data/docs/hashmap.json +1 -1
  323. data/docs/hooks.html +3 -3
  324. data/docs/i18n.html +3 -3
  325. data/docs/index.html +3 -3
  326. data/docs/instrumentation.html +61 -6
  327. data/docs/javascript.html +3 -3
  328. data/docs/jobs.html +3 -3
  329. data/docs/keyword-injection.html +3 -3
  330. data/docs/layouts.html +3 -3
  331. data/docs/lsp.html +3 -3
  332. data/docs/markdown-examples.html +3 -3
  333. data/docs/middleware.html +3 -3
  334. data/docs/overview.html +3 -3
  335. data/docs/pages.html +3 -3
  336. data/docs/recipes/alternate-layouts.html +3 -3
  337. data/docs/recipes/authentication.html +5 -4
  338. data/docs/recipes/blank-layouts.html +3 -3
  339. data/docs/recipes/custom-flash.html +3 -3
  340. data/docs/recipes/form-errors.html +3 -3
  341. data/docs/recipes/indexed-forms.html +3 -3
  342. data/docs/recipes/migrations.html +3 -3
  343. data/docs/recipes/text-field-component.html +3 -3
  344. data/docs/roadmap.html +3 -3
  345. data/docs/routes.html +3 -3
  346. data/docs/security.html +3 -3
  347. data/docs/seed-data.html +3 -3
  348. data/docs/space-time-continuum.html +3 -3
  349. data/docs/tutorial.html +3 -3
  350. data/docs/tutorials/01-intro.html +12 -12
  351. data/docs/tutorials/02-dialog.html +5 -5
  352. data/docs/unit-tests.html +3 -3
  353. data/docs/why.html +3 -3
  354. data/lib/brut/front_end/components/input.rb +1 -0
  355. data/lib/brut/front_end/components/inputs/button_tag.rb +43 -0
  356. data/lib/brut/front_end/components/inputs/input_tag.rb +3 -1
  357. data/lib/brut/front_end/components/inputs/select_tag_with_options.rb +0 -1
  358. data/lib/brut/front_end/components/inputs/textarea_tag.rb +0 -1
  359. data/lib/brut/front_end/form.rb +7 -5
  360. data/lib/brut/front_end/forms/button.rb +21 -0
  361. data/lib/brut/front_end/forms/button_input_definition.rb +33 -0
  362. data/lib/brut/front_end/forms/input_declarations.rb +10 -0
  363. data/lib/brut/front_end/forms/input_definition.rb +7 -2
  364. data/lib/brut/version.rb +1 -1
  365. data/mkbrut/Gemfile.lock +1 -1
  366. data/mkbrut/lib/mkbrut/version.rb +1 -1
  367. metadata +29 -21
  368. data/docs/assets/chunks/@localSearchIndexroot.DPhqaz1b.js +0 -1
  369. data/docs/assets/instrumentation.md.BgcaGVYH.js +0 -35
  370. data/docs/assets/instrumentation.md.BgcaGVYH.lean.js +0 -1
  371. /data/docs/assets/{components.md.BzVRwegp.lean.js → components.md.X4h_TEG-.lean.js} +0 -0
  372. /data/docs/assets/{configuration.md.eM5wFVi5.lean.js → configuration.md.CPCyUo5A.lean.js} +0 -0
  373. /data/docs/assets/{forms.md.B3BHvCV3.lean.js → forms.md.BwmfAZ6Z.lean.js} +0 -0
  374. /data/docs/assets/{getting-started.md.BgR0ZHsl.lean.js → getting-started.md.mPgbkbBv.lean.js} +0 -0
  375. /data/docs/assets/{recipes_authentication.md.Dzvi_g69.lean.js → recipes_authentication.md.BAISoxmN.lean.js} +0 -0
  376. /data/docs/assets/{tutorials_02-dialog.md.CIeg8R--.lean.js → tutorials_02-dialog.md.DOonTBrE.lean.js} +0 -0
@@ -0,0 +1,43 @@
1
+ # Creates a button tag to be used inside a form. This is only
2
+ # needed if your form declared a `button` and you wish the value
3
+ # to be included whern the form is submitted (for example, if you have
4
+ # more than one submit button and wish to know which one was clicked on the
5
+ # back end).
6
+ class Brut::FrontEnd::Components::Inputs::ButtonTag < Brut::FrontEnd::Components::Input
7
+
8
+ # Creates the appropriate button for the given {Brut::FrontEnd::Form} and input name. Note that if the
9
+ # form has no value for this input, the value `"true"` will be used, as this allows you to create
10
+ # buttons without worrying about an often irrelevant value.
11
+ #
12
+ # @param [Brut::FrontEnd::Form} form The form that is being rendered. This method will consult this class to understand the requirements on this input so its HTML is generated correctly.
13
+ # @param [String] input_name the name of the input, which should be a member of `form`
14
+ # @param [Integer] index if this input is part of an array, this is the index into that array. This is used to get the input's value.
15
+ # @param [Hash] html_attributes any additional HTML attributes to include on the `<input>` element. Note
16
+ # that if you set `type` here to be `reset` or `button`, this button will not submit
17
+ # the form (as per the HTML spec). Also note that the various
18
+ # `form*` attributes *will* take effect and work as desired.
19
+ def initialize(form:, input_name:, index: nil, **html_attributes)
20
+ input = form.input(input_name, index:)
21
+ if input.class.name != "Brut::FrontEnd::Forms::Button"
22
+ raise ArgumentError, "#{self.class} can only be used with `button` elements, not #{input.class.name} form elements"
23
+ end
24
+ default_html_attributes = {}
25
+ html_attributes = html_attributes.map { |key,value| [ key.to_sym, value ] }.to_h
26
+
27
+ default_html_attributes[:name] = if input.array?
28
+ "#{input.name}[]"
29
+ else
30
+ input.name
31
+ end
32
+ value = RichString.from_string(input.value)
33
+ default_html_attributes[:value] = (value || "true").to_s
34
+
35
+ @attributes = default_html_attributes.merge(html_attributes)
36
+ end
37
+
38
+ def view_template
39
+ button(**@attributes) do
40
+ yield
41
+ end
42
+ end
43
+ end
@@ -3,7 +3,6 @@ class Brut::FrontEnd::Components::Inputs::InputTag < Brut::FrontEnd::Components:
3
3
  def invalid? = @attributes["data-invalid"] == true
4
4
 
5
5
  # Creates the appropriate input for the given {Brut::FrontEnd::Form} and input name.
6
- # Generally, you want to use this method over the initializer.
7
6
  #
8
7
  # @param [Brut::FrontEnd::Form} form The form that is being rendered. This method will consult this class to understand the requirements on this input so its HTML is generated correctly.
9
8
  # @param [String] input_name the name of the input, which should be a member of `form`
@@ -11,6 +10,9 @@ class Brut::FrontEnd::Components::Inputs::InputTag < Brut::FrontEnd::Components:
11
10
  # @param [Hash] html_attributes any additional HTML attributes to include on the `<input>` element.
12
11
  def initialize(form:, input_name:, index: nil, **html_attributes)
13
12
  input = form.input(input_name, index:)
13
+ if input.class.name != "Brut::FrontEnd::Forms::Input"
14
+ raise ArgumentError, "#{self.class} can only be used with `input` elements, not #{input.class.name} form elements"
15
+ end
14
16
  default_html_attributes = {}
15
17
  html_attributes = html_attributes.map { |key,value| [ key.to_sym, value ] }.to_h
16
18
 
@@ -1,7 +1,6 @@
1
1
  # Renders an HTML `<select>`.
2
2
  class Brut::FrontEnd::Components::Inputs::SelectTagWithOptions < Brut::FrontEnd::Components::Input
3
3
  # Creates the appropriate select input for the given {Brut::FrontEnd::Form} and input name.
4
- # Generally, you want to use this method over the initializer.
5
4
  #
6
5
  # @param [Brut::FrontEnd::Form} form The form that is being rendered.
7
6
  # This method will consult this class to understand the requirements
@@ -2,7 +2,6 @@
2
2
  class Brut::FrontEnd::Components::Inputs::TextareaTag < Brut::FrontEnd::Components::Input
3
3
 
4
4
  # Creates the appropriate textarea for the given {Brut::FrontEnd::Form} and input name.
5
- # Generally, you want to use this method over the initializer.
6
5
  #
7
6
  # @param [Brut::FrontEnd::Form} form The form that is being rendered. This method will consult this class to understand the requirements on this textarea so its HTML is generated correctly.
8
7
  # @param [String] input_name the name of the input, which should be a member of `form`
@@ -5,10 +5,12 @@ module Brut::FrontEnd::Forms
5
5
  autoload(:InputDeclarations, "brut/front_end/forms/input_declarations")
6
6
  autoload(:InputDefinition, "brut/front_end/forms/input_definition")
7
7
  autoload(:SelectInputDefinition, "brut/front_end/forms/select_input_definition")
8
+ autoload(:ButtonInputDefinition, "brut/front_end/forms/button_input_definition")
8
9
  autoload(:RadioButtonGroupInputDefinition, "brut/front_end/forms/radio_button_group_input_definition")
9
10
  autoload(:ConstraintViolation, "brut/front_end/forms/constraint_violation")
10
11
  autoload(:ValidityState, "brut/front_end/forms/validity_state")
11
12
  autoload(:Input, "brut/front_end/forms/input")
13
+ autoload(:Button, "brut/front_end/forms/button")
12
14
  autoload(:SelectInput, "brut/front_end/forms/select_input")
13
15
  autoload(:RadioButtonGroupInput, "brut/front_end/forms/radio_button_group_input")
14
16
  end
@@ -38,11 +40,11 @@ class Brut::FrontEnd::Form
38
40
  Brut.container.instrumentation.add_attributes(prefix: :brut, ignored_unknown_params: unknown_params.join(","))
39
41
  end
40
42
  @params = params.except(*unknown_params).map { |name,value|
41
- input_definition = begin
42
- self.class.input_definitions[name] || self.class.input_definitions.fetch(name.to_s)
43
- rescue KeyError
44
- raise "cannot find input definition for '#{name}'. Have these: #{self.class.input_definitions.keys.inspect}"
45
- end
43
+ input_definition = begin
44
+ self.class.input_definitions[name] || self.class.input_definitions.fetch(name.to_s)
45
+ rescue KeyError
46
+ raise "cannot find input definition for '#{name}'. Have these: #{self.class.input_definitions.keys.inspect}"
47
+ end
46
48
  if value.kind_of?(Array)
47
49
  input_definition = begin
48
50
  self.class.input_definitions[name] || self.class.input_definitions.fetch(name.to_s)
@@ -0,0 +1,21 @@
1
+ # Represents the current state of a particular button that is part of a form.
2
+ # Button's in this context don't really have state, but this allows the button to be
3
+ # modeled like any other form element.
4
+ class Brut::FrontEnd::Forms::Button < Brut::FrontEnd::Forms::Input
5
+ # Create the input with the given definition and value
6
+ # @param [Brut::FrontEnd::Forms::InputDefinition] input_definition
7
+ # @param [String] value Value of the button, which would be submitted with the form. Note
8
+ # that {Brut::FrontEnd::Forms::ButtonInputDefinition#make_input} will
9
+ # default this value to `"true"`.
10
+ def initialize(input_definition:, value:, index:)
11
+ @input_definition = input_definition
12
+ @validity_state = Brut::FrontEnd::Forms::ValidityState.new
13
+ @index = index
14
+ self.value=(value)
15
+ end
16
+
17
+ def value=(new_value)
18
+ @value = new_value.to_s
19
+ @typed_value = @value
20
+ end
21
+ end
@@ -0,0 +1,33 @@
1
+ # Defines a button to be used to submit a form (as opposed to an `<input type="submit">`).
2
+ # This is needed when the name/value of the button should be submitted witih the form.
3
+ class Brut::FrontEnd::Forms::ButtonInputDefinition
4
+ include Brut::Framework::FussyTypeEnforcement
5
+
6
+ attr_reader :name
7
+
8
+ # Create a ButtonInputDefinition.
9
+ #
10
+ # @param [String] name Name of the button (required)
11
+ # @param [true|false] array If true, the form will expect multiple values for this input. The values will be available as an array. Any values omitted by the user will be present as empty strings.
12
+ #
13
+ # @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button BUTTON Element
14
+ def initialize(
15
+ name:,
16
+ array: false
17
+ )
18
+ name = name.to_s
19
+ @name = type!(name, String, "name", required: true)
20
+ @array = type!(array, [true, false], "array", required: true)
21
+ end
22
+
23
+ def array? = @array
24
+
25
+
26
+ # Create an Input based on this definition, initializing it with the given value.
27
+ # @param [String] value the value to give this input initially.
28
+ # @param [Integer] index the index of this input, if it is part of an array of
29
+ # inputs. `nil` is allowed only if the input definition is not for an array.
30
+ def make_input(value:, index:)
31
+ Brut::FrontEnd::Forms::Button.new(input_definition: self, value:, index:)
32
+ end
33
+ end
@@ -11,6 +11,16 @@ module Brut::FrontEnd::Forms::InputDeclarations
11
11
  )
12
12
  end
13
13
 
14
+ # Declares a named button for this form, which is required in order to have this button's name and
15
+ # value sent to the back. This will generate a `<button>` tag. To use `<input type="submit">`, {.input} should
16
+ # be used instead.
17
+ # @param [String] name The name of the button (used in the `name` attribute)
18
+ def button(name)
19
+ self.add_input_definition(
20
+ Brut::FrontEnd::Forms::ButtonInputDefinition.new(name:)
21
+ )
22
+ end
23
+
14
24
  # Declares a select for this form, to be modeled via an HTML `<SELECT>` tag. Note that this will not define the values that appear
15
25
  # in the select. That is done when the select is rendered, which you might do with a
16
26
  # {Brut::FrontEnd::Components::Inputs::Select}
@@ -32,6 +32,7 @@ class Brut::FrontEnd::Forms::InputDefinition
32
32
  "radio" => String,
33
33
  "range" => String,
34
34
  "search" => String,
35
+ "submit" => String,
35
36
  "tel" => String,
36
37
  "text" => String,
37
38
  "time" => Time, # XXX
@@ -49,7 +50,7 @@ class Brut::FrontEnd::Forms::InputDefinition
49
50
  # @param [Integer] maxlength Maximum length of the value allowed.
50
51
  # @param [String] name Name of the input (required)
51
52
  # @param [Regexp] pattern that the value must match. Note that this technically must be a regular expression that works for both Ruby and JavaScript, so don't get fancy.
52
- # @param [true|false] required true if this field is required, false otherwise. Default is `true` unless `type` is `"checkbox"`.
53
+ # @param [true|false] required true if this field is required, false otherwise. Default is `true` unless `type` is `"checkbox"` or `"submit"`.
53
54
  # @param [Integer] step Step value for ranged inputs. A value that is not on a step is considered invalid.
54
55
  # @param [String] type the type of input to create. Should be a value from the HTML spec. Default is based on the value of `name`. If `email`, `type` is `email`. If `password` or `password_confirmation`, type is `password`. Otherwise `text`.
55
56
  # @param [true|false] array If true, the form will expect multiple values for this input. The values will be available as an array. Any values omitted by the user will be present as empty strings.
@@ -84,7 +85,11 @@ class Brut::FrontEnd::Forms::InputDefinition
84
85
 
85
86
  type = type.to_s
86
87
  if required == :based_on_type
87
- required = type != "checkbox"
88
+ required = case type
89
+ when "checkbox" then false
90
+ when "submit" then false
91
+ else true
92
+ end
88
93
  end
89
94
 
90
95
  @max = max
data/lib/brut/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Brut
2
2
  # @!visibility private
3
- VERSION = "0.11.0"
3
+ VERSION = "0.12.1"
4
4
  end
data/mkbrut/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mkbrut (0.11.0)
4
+ mkbrut (0.12.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -1,3 +1,3 @@
1
1
  module MKBrut
2
- VERSION = "0.11.0"
2
+ VERSION = "0.12.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brut
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0
4
+ version: 0.12.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Bryant Copeland
@@ -809,6 +809,7 @@ files:
809
809
  - docs/api/Brut/FrontEnd/Components/I18nTranslations.html
810
810
  - docs/api/Brut/FrontEnd/Components/Input.html
811
811
  - docs/api/Brut/FrontEnd/Components/Inputs.html
812
+ - docs/api/Brut/FrontEnd/Components/Inputs/ButtonTag.html
812
813
  - docs/api/Brut/FrontEnd/Components/Inputs/CsrfToken.html
813
814
  - docs/api/Brut/FrontEnd/Components/Inputs/InputTag.html
814
815
  - docs/api/Brut/FrontEnd/Components/Inputs/RadioButton.html
@@ -823,6 +824,8 @@ files:
823
824
  - docs/api/Brut/FrontEnd/Flash.html
824
825
  - docs/api/Brut/FrontEnd/Form.html
825
826
  - docs/api/Brut/FrontEnd/Forms.html
827
+ - docs/api/Brut/FrontEnd/Forms/Button.html
828
+ - docs/api/Brut/FrontEnd/Forms/ButtonInputDefinition.html
826
829
  - docs/api/Brut/FrontEnd/Forms/ConstraintViolation.html
827
830
  - docs/api/Brut/FrontEnd/Forms/Input.html
828
831
  - docs/api/Brut/FrontEnd/Forms/Input/Color.html
@@ -885,6 +888,8 @@ files:
885
888
  - docs/api/Brut/I18n/HTTPAcceptLanguage/AlwaysEnglish.html
886
889
  - docs/api/Brut/Instrumentation.html
887
890
  - docs/api/Brut/Instrumentation/LoggerSpanExporter.html
891
+ - docs/api/Brut/Instrumentation/Methods.html
892
+ - docs/api/Brut/Instrumentation/Methods/ClassMethods.html
888
893
  - docs/api/Brut/Instrumentation/OpenTelemetry.html
889
894
  - docs/api/Brut/Instrumentation/OpenTelemetry/NormalizedAttributes.html
890
895
  - docs/api/Brut/Instrumentation/OpenTelemetry/Span.html
@@ -959,7 +964,7 @@ files:
959
964
  - docs/assets/adrs.md.BxjHi9-8.lean.js
960
965
  - docs/assets/ai.md.Cy9GWnER.js
961
966
  - docs/assets/ai.md.Cy9GWnER.lean.js
962
- - docs/assets/app.0-aKXKdt.js
967
+ - docs/assets/app.CGHFI-MA.js
963
968
  - docs/assets/assets.md.7C3HWkga.js
964
969
  - docs/assets/assets.md.7C3HWkga.lean.js
965
970
  - docs/assets/basic-form-with-violations.Cv6Y9-Q_.png
@@ -968,16 +973,16 @@ files:
968
973
  - docs/assets/brut-js.md.B4GYxQVw.lean.js
969
974
  - docs/assets/business-logic.md.BY4hGy0m.js
970
975
  - docs/assets/business-logic.md.BY4hGy0m.lean.js
971
- - docs/assets/chunks/@localSearchIndexroot.DPhqaz1b.js
972
- - docs/assets/chunks/VPLocalSearchBox.CW-UBkNA.js
976
+ - docs/assets/chunks/@localSearchIndexroot.DcMsFVrO.js
977
+ - docs/assets/chunks/VPLocalSearchBox.-c-Kihwo.js
973
978
  - docs/assets/chunks/framework.1L-BeKqY.js
974
- - docs/assets/chunks/theme.a6feKWJO.js
979
+ - docs/assets/chunks/theme.DpqrgXG8.js
975
980
  - docs/assets/cli.md.CjsktgFz.js
976
981
  - docs/assets/cli.md.CjsktgFz.lean.js
977
- - docs/assets/components.md.BzVRwegp.js
978
- - docs/assets/components.md.BzVRwegp.lean.js
979
- - docs/assets/configuration.md.eM5wFVi5.js
980
- - docs/assets/configuration.md.eM5wFVi5.lean.js
982
+ - docs/assets/components.md.X4h_TEG-.js
983
+ - docs/assets/components.md.X4h_TEG-.lean.js
984
+ - docs/assets/configuration.md.CPCyUo5A.js
985
+ - docs/assets/configuration.md.CPCyUo5A.lean.js
981
986
  - docs/assets/css.md.CltvJqAa.js
982
987
  - docs/assets/css.md.CltvJqAa.lean.js
983
988
  - docs/assets/custom-element-tests.md.B_rbta32.js
@@ -1003,10 +1008,10 @@ files:
1003
1008
  - docs/assets/flash-and-session.md.nPvUpnUx.lean.js
1004
1009
  - docs/assets/form-constraints.md.KTv5cdR4.js
1005
1010
  - docs/assets/form-constraints.md.KTv5cdR4.lean.js
1006
- - docs/assets/forms.md.B3BHvCV3.js
1007
- - docs/assets/forms.md.B3BHvCV3.lean.js
1008
- - docs/assets/getting-started.md.BgR0ZHsl.js
1009
- - docs/assets/getting-started.md.BgR0ZHsl.lean.js
1011
+ - docs/assets/forms.md.BwmfAZ6Z.js
1012
+ - docs/assets/forms.md.BwmfAZ6Z.lean.js
1013
+ - docs/assets/getting-started.md.mPgbkbBv.js
1014
+ - docs/assets/getting-started.md.mPgbkbBv.lean.js
1010
1015
  - docs/assets/handlers.md.h84MMB1R.js
1011
1016
  - docs/assets/handlers.md.h84MMB1R.lean.js
1012
1017
  - docs/assets/hooks.md.Jmb5VOLA.js
@@ -1016,8 +1021,8 @@ files:
1016
1021
  - docs/assets/index.md.Bn9e0sRJ.js
1017
1022
  - docs/assets/index.md.Bn9e0sRJ.lean.js
1018
1023
  - docs/assets/initial-home-page.DNIaYmgP.png
1019
- - docs/assets/instrumentation.md.BgcaGVYH.js
1020
- - docs/assets/instrumentation.md.BgcaGVYH.lean.js
1024
+ - docs/assets/instrumentation.md._lNSriEZ.js
1025
+ - docs/assets/instrumentation.md._lNSriEZ.lean.js
1021
1026
  - docs/assets/javascript.md.DzrMxUmI.js
1022
1027
  - docs/assets/javascript.md.DzrMxUmI.lean.js
1023
1028
  - docs/assets/jobs.md.S-2amAYp.js
@@ -1040,8 +1045,8 @@ files:
1040
1045
  - docs/assets/pages.md.B7Hc-i6H.lean.js
1041
1046
  - docs/assets/recipes_alternate-layouts.md.BwEytl59.js
1042
1047
  - docs/assets/recipes_alternate-layouts.md.BwEytl59.lean.js
1043
- - docs/assets/recipes_authentication.md.Dzvi_g69.js
1044
- - docs/assets/recipes_authentication.md.Dzvi_g69.lean.js
1048
+ - docs/assets/recipes_authentication.md.BAISoxmN.js
1049
+ - docs/assets/recipes_authentication.md.BAISoxmN.lean.js
1045
1050
  - docs/assets/recipes_blank-layouts.md.fyAUJyJR.js
1046
1051
  - docs/assets/recipes_blank-layouts.md.fyAUJyJR.lean.js
1047
1052
  - docs/assets/recipes_custom-flash.md.CrQbI5eH.js
@@ -1072,10 +1077,10 @@ files:
1072
1077
  - docs/assets/styled-home-page.BzdI7dWz.png
1073
1078
  - docs/assets/tutorial.md.BM40jnoq.js
1074
1079
  - docs/assets/tutorial.md.BM40jnoq.lean.js
1075
- - docs/assets/tutorials_01-intro.md.BXvYWcO9.js
1076
- - docs/assets/tutorials_01-intro.md.BXvYWcO9.lean.js
1077
- - docs/assets/tutorials_02-dialog.md.CIeg8R--.js
1078
- - docs/assets/tutorials_02-dialog.md.CIeg8R--.lean.js
1080
+ - docs/assets/tutorials_01-intro.md.B4sUBY3X.js
1081
+ - docs/assets/tutorials_01-intro.md.B4sUBY3X.lean.js
1082
+ - docs/assets/tutorials_02-dialog.md.DOonTBrE.js
1083
+ - docs/assets/tutorials_02-dialog.md.DOonTBrE.lean.js
1079
1084
  - docs/assets/unit-tests.md.DUGrnLj5.js
1080
1085
  - docs/assets/unit-tests.md.DUGrnLj5.lean.js
1081
1086
  - docs/assets/welcome-to-brut.VSWzl17-.png
@@ -1285,6 +1290,7 @@ files:
1285
1290
  - lib/brut/front_end/components/form_tag.rb
1286
1291
  - lib/brut/front_end/components/i18n_translations.rb
1287
1292
  - lib/brut/front_end/components/input.rb
1293
+ - lib/brut/front_end/components/inputs/button_tag.rb
1288
1294
  - lib/brut/front_end/components/inputs/csrf_token.rb
1289
1295
  - lib/brut/front_end/components/inputs/input_tag.rb
1290
1296
  - lib/brut/front_end/components/inputs/radio_button.rb
@@ -1298,6 +1304,8 @@ files:
1298
1304
  - lib/brut/front_end/download.rb
1299
1305
  - lib/brut/front_end/flash.rb
1300
1306
  - lib/brut/front_end/form.rb
1307
+ - lib/brut/front_end/forms/button.rb
1308
+ - lib/brut/front_end/forms/button_input_definition.rb
1301
1309
  - lib/brut/front_end/forms/constraint_violation.rb
1302
1310
  - lib/brut/front_end/forms/input.rb
1303
1311
  - lib/brut/front_end/forms/input_declarations.rb