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.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/brutrb.com/.vitepress/config.mjs +4 -2
- data/brutrb.com/.vitepress/theme/style.css +16 -38
- data/brutrb.com/adrs.md +15 -0
- data/brutrb.com/dev-environment.md +6 -1
- data/brutrb.com/doc-conventions.md +1 -2
- data/brutrb.com/images/DevEnvironment.graffle +0 -0
- data/brutrb.com/images/DevEnvironment.png +0 -0
- data/brutrb.com/index.md +0 -3
- data/brutrb.com/overview.md +2 -2
- data/brutrb.com/roadmap.md +57 -0
- data/brutrb.com/tutorial.md +5 -1
- data/docs/404.html +4 -4
- data/docs/{not-released.html → adrs.html} +8 -8
- data/docs/ai.html +6 -6
- data/docs/api/Brut/BackEnd/SeedData.html +1 -1
- data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server/FlushSpans.html +1 -1
- data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server.html +1 -1
- data/docs/api/Brut/BackEnd/Sidekiq/Middlewares.html +1 -1
- data/docs/api/Brut/BackEnd/Sidekiq.html +1 -1
- data/docs/api/Brut/BackEnd/Validators/FormValidator.html +1 -1
- data/docs/api/Brut/BackEnd/Validators.html +1 -1
- data/docs/api/Brut/BackEnd.html +1 -1
- data/docs/api/Brut/CLI/App.html +1 -1
- data/docs/api/Brut/CLI/AppRunner.html +1 -1
- data/docs/api/Brut/CLI/Apps/BuildAssets/All.html +1 -1
- data/docs/api/Brut/CLI/Apps/BuildAssets/CSS.html +1 -1
- data/docs/api/Brut/CLI/Apps/BuildAssets/Images.html +1 -1
- data/docs/api/Brut/CLI/Apps/BuildAssets/JS.html +1 -1
- data/docs/api/Brut/CLI/Apps/BuildAssets.html +1 -1
- data/docs/api/Brut/CLI/Apps/DB/Create.html +1 -1
- data/docs/api/Brut/CLI/Apps/DB/Drop.html +1 -1
- data/docs/api/Brut/CLI/Apps/DB/Migrate.html +1 -1
- data/docs/api/Brut/CLI/Apps/DB/NewMigration.html +1 -1
- data/docs/api/Brut/CLI/Apps/DB/Rebuild.html +1 -1
- data/docs/api/Brut/CLI/Apps/DB/Seed.html +1 -1
- data/docs/api/Brut/CLI/Apps/DB/Status.html +1 -1
- data/docs/api/Brut/CLI/Apps/DB.html +1 -1
- data/docs/api/Brut/CLI/Apps/DeployBase/GitChecks.html +1 -1
- data/docs/api/Brut/CLI/Apps/DeployBase.html +1 -1
- data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy/Deploy.html +1 -1
- data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/Action/Route.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/Action.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/Component.html +3 -3
- data/docs/api/Brut/CLI/Apps/Scaffold/CustomElementTest.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/E2ETest.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/Form.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/Page/Route.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/Page.html +2 -2
- data/docs/api/Brut/CLI/Apps/Scaffold/RoutesEditor.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold/Test.html +1 -1
- data/docs/api/Brut/CLI/Apps/Scaffold.html +1 -1
- data/docs/api/Brut/CLI/Apps/Test/Audit.html +1 -1
- data/docs/api/Brut/CLI/Apps/Test/E2e.html +1 -1
- data/docs/api/Brut/CLI/Apps/Test/JS.html +6 -6
- data/docs/api/Brut/CLI/Apps/Test/Run.html +1 -1
- data/docs/api/Brut/CLI/Apps/Test.html +2 -2
- data/docs/api/Brut/CLI/Apps.html +1 -1
- data/docs/api/Brut/CLI/Command.html +3 -3
- data/docs/api/Brut/CLI/Error.html +1 -1
- data/docs/api/Brut/CLI/ExecutionResults/Result.html +1 -1
- data/docs/api/Brut/CLI/ExecutionResults.html +1 -1
- data/docs/api/Brut/CLI/Executor.html +1 -1
- data/docs/api/Brut/CLI/InvalidOption.html +1 -1
- data/docs/api/Brut/CLI/Options.html +1 -1
- data/docs/api/Brut/CLI/Output.html +1 -1
- data/docs/api/Brut/CLI/SystemExecError.html +1 -1
- data/docs/api/Brut/CLI.html +1 -1
- data/docs/api/Brut/FactoryBot.html +1 -1
- data/docs/api/Brut/Framework/App.html +1 -1
- data/docs/api/Brut/Framework/Config.html +1 -1
- data/docs/api/Brut/Framework/Container.html +1 -1
- data/docs/api/Brut/Framework/Error.html +1 -1
- data/docs/api/Brut/Framework/Errors/AbstractMethod.html +1 -1
- data/docs/api/Brut/Framework/Errors/Bug.html +1 -1
- data/docs/api/Brut/Framework/Errors/MissingConfiguration.html +1 -1
- data/docs/api/Brut/Framework/Errors/MissingParameter.html +1 -1
- data/docs/api/Brut/Framework/Errors/NoClassForPath.html +1 -1
- data/docs/api/Brut/Framework/Errors/NotFound.html +1 -1
- data/docs/api/Brut/Framework/Errors/NotImplemented.html +1 -1
- data/docs/api/Brut/Framework/Errors.html +1 -1
- data/docs/api/Brut/Framework/FussyTypeEnforcement.html +1 -1
- data/docs/api/Brut/Framework/MCP.html +1 -1
- data/docs/api/Brut/Framework/ProjectEnvironment.html +1 -1
- data/docs/api/Brut/Framework.html +1 -1
- data/docs/api/Brut/FrontEnd/AssetPathResolver.html +1 -1
- data/docs/api/Brut/FrontEnd/Component/Helpers.html +1 -1
- data/docs/api/Brut/FrontEnd/Component.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/ConstraintViolations.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/FormTag.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/I18nTranslations.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/Input.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/Inputs/CsrfToken.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/Inputs/InputTag.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/Inputs/RadioButton.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/Inputs/SelectTagWithOptions.html +3 -3
- data/docs/api/Brut/FrontEnd/Components/Inputs/TextareaTag.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/Inputs.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/LocaleDetection.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/PageIdentifier.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/TimeTag.html +1 -1
- data/docs/api/Brut/FrontEnd/Components/Traceparent.html +1 -1
- data/docs/api/Brut/FrontEnd/Components.html +1 -1
- data/docs/api/Brut/FrontEnd/Download.html +1 -1
- data/docs/api/Brut/FrontEnd/Flash.html +1 -1
- data/docs/api/Brut/FrontEnd/Form.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/ConstraintViolation.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/Input/Color.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/Input/TimeOfDay.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/Input.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/InputDeclarations.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/InputDefinition.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInput.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInputDefinition.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/SelectInput.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/SelectInputDefinition.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms/ValidityState.html +1 -1
- data/docs/api/Brut/FrontEnd/Forms.html +1 -1
- data/docs/api/Brut/FrontEnd/GenericResponse.html +1 -1
- data/docs/api/Brut/FrontEnd/Handler.html +1 -1
- data/docs/api/Brut/FrontEnd/Handlers/CspReportingHandler.html +1 -1
- data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler/TraceParent.html +1 -1
- data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler.html +1 -1
- data/docs/api/Brut/FrontEnd/Handlers/LocaleDetectionHandler.html +1 -1
- data/docs/api/Brut/FrontEnd/Handlers/MissingHandler/Form.html +1 -1
- data/docs/api/Brut/FrontEnd/Handlers/MissingHandler.html +1 -1
- data/docs/api/Brut/FrontEnd/Handlers.html +1 -1
- data/docs/api/Brut/FrontEnd/HandlingResults.html +1 -1
- data/docs/api/Brut/FrontEnd/HttpMethod.html +1 -1
- data/docs/api/Brut/FrontEnd/HttpStatus.html +1 -1
- data/docs/api/Brut/FrontEnd/InlineSvgLocator.html +1 -1
- data/docs/api/Brut/FrontEnd/Layout.html +1 -1
- data/docs/api/Brut/FrontEnd/Middleware.html +1 -1
- data/docs/api/Brut/FrontEnd/Middlewares/AnnotateBrutOwnedPaths.html +1 -1
- data/docs/api/Brut/FrontEnd/Middlewares/Favicon.html +1 -1
- data/docs/api/Brut/FrontEnd/Middlewares/OpenTelemetrySpan.html +1 -1
- data/docs/api/Brut/FrontEnd/Middlewares/ReloadApp.html +1 -1
- data/docs/api/Brut/FrontEnd/Middlewares.html +1 -1
- data/docs/api/Brut/FrontEnd/Page.html +1 -1
- data/docs/api/Brut/FrontEnd/Pages/MissingPage.html +2 -2
- data/docs/api/Brut/FrontEnd/Pages.html +1 -1
- data/docs/api/Brut/FrontEnd/RequestContext.html +1 -1
- data/docs/api/Brut/FrontEnd/RouteHook.html +1 -1
- data/docs/api/Brut/FrontEnd/RouteHooks/AgeFlash.html +1 -1
- data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineScripts.html +1 -1
- data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts/ReportOnly.html +1 -1
- data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts.html +1 -1
- data/docs/api/Brut/FrontEnd/RouteHooks/LocaleDetection.html +1 -1
- data/docs/api/Brut/FrontEnd/RouteHooks/SetupRequestContext.html +1 -1
- data/docs/api/Brut/FrontEnd/RouteHooks.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing/FormHandlerRoute.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing/FormRoute.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing/MissingForm.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing/MissingHandler.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing/MissingPage.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing/MissingPath.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing/PageRoute.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing/Route.html +1 -1
- data/docs/api/Brut/FrontEnd/Routing.html +1 -1
- data/docs/api/Brut/FrontEnd/Session.html +1 -1
- data/docs/api/Brut/FrontEnd.html +1 -1
- data/docs/api/Brut/I18n/BaseMethods.html +1 -1
- data/docs/api/Brut/I18n/ForBackEnd.html +1 -1
- data/docs/api/Brut/I18n/ForCLI.html +1 -1
- data/docs/api/Brut/I18n/ForHTML.html +1 -1
- data/docs/api/Brut/I18n/HTTPAcceptLanguage/AlwaysEnglish.html +1 -1
- data/docs/api/Brut/I18n/HTTPAcceptLanguage.html +1 -1
- data/docs/api/Brut/I18n.html +1 -1
- data/docs/api/Brut/Instrumentation/LoggerSpanExporter.html +1 -1
- data/docs/api/Brut/Instrumentation/OpenTelemetry/NormalizedAttributes.html +1 -1
- data/docs/api/Brut/Instrumentation/OpenTelemetry/Span.html +1 -1
- data/docs/api/Brut/Instrumentation/OpenTelemetry.html +1 -1
- data/docs/api/Brut/Instrumentation.html +1 -1
- data/docs/api/Brut/SinatraHelpers/ClassMethods.html +1 -1
- data/docs/api/Brut/SinatraHelpers.html +1 -1
- data/docs/api/Brut/SpecSupport/ClockSupport.html +1 -1
- data/docs/api/Brut/SpecSupport/ComponentSupport.html +1 -1
- data/docs/api/Brut/SpecSupport/E2ETestServer.html +1 -1
- data/docs/api/Brut/SpecSupport/E2eSupport.html +1 -1
- data/docs/api/Brut/SpecSupport/EnhancedNode.html +1 -1
- data/docs/api/Brut/SpecSupport/FlashSupport.html +1 -1
- data/docs/api/Brut/SpecSupport/GeneralSupport/ClassMethods.html +1 -1
- data/docs/api/Brut/SpecSupport/GeneralSupport.html +1 -1
- data/docs/api/Brut/SpecSupport/HandlerSupport.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/BeABug.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/BePageFor.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/BeRoutingFor.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/HaveConstraintViolation.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/HaveGenerated.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/HaveHTMLAttribute.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/HaveI18nString.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/HaveLinkTo.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/HaveRedirectedTo.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedHttpStatus.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedRackResponse.html +1 -1
- data/docs/api/Brut/SpecSupport/Matchers.html +1 -1
- data/docs/api/Brut/SpecSupport/RSpecSetup/OptionalSidekiqSupport.html +1 -1
- data/docs/api/Brut/SpecSupport/RSpecSetup.html +1 -1
- data/docs/api/Brut/SpecSupport/SessionSupport.html +1 -1
- data/docs/api/Brut/SpecSupport.html +1 -1
- data/docs/api/Brut.html +1 -1
- data/docs/api/Clock.html +1 -1
- data/docs/api/RichString.html +150 -343
- data/docs/api/SemanticLogger/Appender/Async.html +1 -1
- data/docs/api/Sequel/Extensions/BrutInstrumentation.html +1 -1
- data/docs/api/Sequel/Extensions/BrutMigrations.html +1 -1
- data/docs/api/Sequel/Extensions.html +1 -1
- data/docs/api/Sequel/Plugins/CreatedAt/InstanceMethods.html +1 -1
- data/docs/api/Sequel/Plugins/CreatedAt.html +1 -1
- data/docs/api/Sequel/Plugins/ExternalId/ClassMethods.html +1 -1
- data/docs/api/Sequel/Plugins/ExternalId/InstanceMethods.html +1 -1
- data/docs/api/Sequel/Plugins/ExternalId.html +1 -1
- data/docs/api/Sequel/Plugins/FindBang/ClassMethods.html +1 -1
- data/docs/api/Sequel/Plugins/FindBang.html +1 -1
- data/docs/api/Sequel/Plugins.html +1 -1
- data/docs/api/Sequel.html +1 -1
- data/docs/api/_index.html +5 -5
- data/docs/api/class_list.html +1 -1
- data/docs/api/file.README.html +1 -1
- data/docs/api/index.html +1 -1
- data/docs/api/method_list.html +281 -313
- data/docs/api/top-level-namespace.html +1 -1
- data/docs/assets/DevEnvironment.DaFcVfwP.png +0 -0
- data/docs/assets/adrs.md.JRxZ5uYE.js +1 -0
- data/docs/assets/adrs.md.JRxZ5uYE.lean.js +1 -0
- data/docs/assets/{app.ClaS47Ru.js → app.Dm3x-DQc.js} +1 -1
- data/docs/assets/chunks/@localSearchIndexroot.BqRrkR00.js +1 -0
- data/docs/assets/chunks/{VPLocalSearchBox.DtgDfde2.js → VPLocalSearchBox.DL6bnqee.js} +1 -1
- data/docs/assets/chunks/{theme.B45bvibT.js → theme.BXdlf6e8.js} +2 -2
- data/docs/assets/{components.md.DatoNgFo.js → components.md.Pg_Lo35G.js} +3 -3
- data/docs/assets/{configuration.md.DeyhpqEx.js → configuration.md.BfeGnEci.js} +1 -1
- data/docs/assets/dev-environment.md.Dy6EldaM.js +16 -0
- data/docs/assets/dev-environment.md.Dy6EldaM.lean.js +1 -0
- data/docs/assets/doc-conventions.md.DOkAuXlt.js +1 -0
- data/docs/assets/{forms.md.C2Dizvzq.js → forms.md.BQZlCwvi.js} +1 -1
- data/docs/assets/{getting-started.md.C93e0odB.js → getting-started.md.BcXnNuD6.js} +2 -2
- data/docs/assets/index.md.Bn9e0sRJ.js +1 -0
- data/docs/assets/index.md.Bn9e0sRJ.lean.js +1 -0
- data/docs/assets/{overview.md.Bdq4qt3L.js → overview.md.iMnwLO4x.js} +1 -1
- data/docs/assets/roadmap.md.C6PRi0DX.js +1 -0
- data/docs/assets/roadmap.md.C6PRi0DX.lean.js +1 -0
- data/docs/assets/{style.prAgp4yQ.css → style.B1z60PPQ.css} +1 -1
- data/docs/assets/tutorial.md.BYXj4cOu.js +1 -0
- data/docs/assets/tutorial.md.BYXj4cOu.lean.js +1 -0
- data/docs/assets.html +6 -6
- data/docs/brut-js/api/AjaxSubmit.html +1 -1
- data/docs/brut-js/api/AjaxSubmit.js.html +1 -1
- data/docs/brut-js/api/Autosubmit.html +1 -1
- data/docs/brut-js/api/Autosubmit.js.html +1 -1
- data/docs/brut-js/api/BaseCustomElement.html +1 -1
- data/docs/brut-js/api/BaseCustomElement.js.html +1 -1
- data/docs/brut-js/api/BrutCustomElements.html +1 -1
- data/docs/brut-js/api/BufferedLogger.html +1 -1
- data/docs/brut-js/api/ConfirmSubmit.html +1 -1
- data/docs/brut-js/api/ConfirmSubmit.js.html +1 -1
- data/docs/brut-js/api/ConfirmationDialog.html +1 -1
- data/docs/brut-js/api/ConfirmationDialog.js.html +1 -1
- data/docs/brut-js/api/ConstraintViolationMessage.html +1 -1
- data/docs/brut-js/api/ConstraintViolationMessage.js.html +1 -1
- data/docs/brut-js/api/ConstraintViolationMessages.html +1 -1
- data/docs/brut-js/api/ConstraintViolationMessages.js.html +1 -1
- data/docs/brut-js/api/CopyToClipboard.html +1 -1
- data/docs/brut-js/api/CopyToClipboard.js.html +1 -1
- data/docs/brut-js/api/Form.html +1 -1
- data/docs/brut-js/api/Form.js.html +1 -1
- data/docs/brut-js/api/I18nTranslation.html +1 -1
- data/docs/brut-js/api/I18nTranslation.js.html +1 -1
- data/docs/brut-js/api/LocaleDetection.html +1 -1
- data/docs/brut-js/api/LocaleDetection.js.html +1 -1
- data/docs/brut-js/api/Logger.html +1 -1
- data/docs/brut-js/api/Logger.js.html +1 -1
- data/docs/brut-js/api/Message.html +1 -1
- data/docs/brut-js/api/Message.js.html +1 -1
- data/docs/brut-js/api/PrefixedLogger.html +1 -1
- data/docs/brut-js/api/RichString.html +1 -1
- data/docs/brut-js/api/RichString.js.html +1 -1
- data/docs/brut-js/api/Tabs.html +1 -1
- data/docs/brut-js/api/Tabs.js.html +1 -1
- data/docs/brut-js/api/Tracing.html +1 -1
- data/docs/brut-js/api/Tracing.js.html +1 -1
- data/docs/brut-js/api/external-CustomElementRegistry.html +1 -1
- data/docs/brut-js/api/external-Performance.html +1 -1
- data/docs/brut-js/api/external-Promise.html +1 -1
- data/docs/brut-js/api/external-ValidityState.html +1 -1
- data/docs/brut-js/api/external-Window.html +1 -1
- data/docs/brut-js/api/external-fetch.html +1 -1
- data/docs/brut-js/api/global.html +1 -1
- data/docs/brut-js/api/index.html +1 -1
- data/docs/brut-js/api/index.js.html +1 -1
- data/docs/brut-js/api/module-testing.html +1 -1
- data/docs/brut-js/api/testing.AssetMetadata.html +1 -1
- data/docs/brut-js/api/testing.AssetMetadataLoader.html +1 -1
- data/docs/brut-js/api/testing.CustomElementTest.html +1 -1
- data/docs/brut-js/api/testing.DOMCreator.html +1 -1
- data/docs/brut-js/api/testing_AssetMetadata.js.html +1 -1
- data/docs/brut-js/api/testing_AssetMetadataLoader.js.html +1 -1
- data/docs/brut-js/api/testing_CustomElementTest.js.html +1 -1
- data/docs/brut-js/api/testing_DOMCreator.js.html +1 -1
- data/docs/brut-js/api/testing_index.js.html +1 -1
- data/docs/brut-js.html +6 -6
- data/docs/business-logic.html +6 -6
- data/docs/cli.html +6 -6
- data/docs/components.html +10 -10
- data/docs/configuration.html +7 -7
- data/docs/css.html +6 -6
- data/docs/custom-element-tests.html +6 -6
- data/docs/database-access.html +6 -6
- data/docs/database-schema.html +6 -6
- data/docs/deployment.html +6 -6
- data/docs/dev-environment.html +12 -7
- data/docs/dir-structure.html +6 -6
- data/docs/doc-conventions.html +7 -7
- data/docs/end-to-end-tests.html +6 -6
- data/docs/features.html +6 -6
- data/docs/flash-and-session.html +6 -6
- data/docs/form-constraints.html +6 -6
- data/docs/forms.html +8 -8
- data/docs/getting-started.html +9 -9
- data/docs/handlers.html +6 -6
- data/docs/hashmap.json +1 -1
- data/docs/hooks.html +6 -6
- data/docs/i18n.html +6 -6
- data/docs/index.html +7 -7
- data/docs/instrumentation.html +6 -6
- data/docs/javascript.html +6 -6
- data/docs/jobs.html +6 -6
- data/docs/keyword-injection.html +6 -6
- data/docs/layouts.html +6 -6
- data/docs/lsp.html +6 -6
- data/docs/markdown-examples.html +6 -6
- data/docs/middleware.html +6 -6
- data/docs/overview.html +7 -7
- data/docs/pages.html +6 -6
- data/docs/recipes/alternate-layouts.html +6 -6
- data/docs/recipes/authentication.html +6 -6
- data/docs/recipes/blank-layouts.html +6 -6
- data/docs/recipes/custom-flash.html +6 -6
- data/docs/recipes/indexed-forms.html +6 -6
- data/docs/recipes/text-field-component.html +6 -6
- data/docs/roadmap.html +29 -0
- data/docs/routes.html +6 -6
- data/docs/security.html +6 -6
- data/docs/seed-data.html +6 -6
- data/docs/space-time-continuum.html +6 -6
- data/docs/tutorial.html +7 -7
- data/docs/unit-tests.html +6 -6
- data/docs/why.html +6 -6
- data/lib/brut/cli/apps/test.rb +1 -1
- data/lib/brut/front_end/components/inputs/select_tag_with_options.rb +2 -2
- data/lib/brut/junk_drawer.rb +48 -9
- data/lib/brut/version.rb +1 -1
- data/specs/brut/junk_drawer.spec.rb +75 -0
- metadata +36 -31
- data/brutrb.com/images/logo-300.png +0 -0
- data/brutrb.com/images/logo.png +0 -0
- data/brutrb.com/not-released.md +0 -5
- data/docs/assets/chunks/@localSearchIndexroot.Biqy1A4t.js +0 -1
- data/docs/assets/dev-env-overview.Gj7NWM8-.png +0 -0
- data/docs/assets/dev-environment.md.BroAOLhF.js +0 -11
- data/docs/assets/dev-environment.md.BroAOLhF.lean.js +0 -1
- data/docs/assets/doc-conventions.md.BzmSrTEW.js +0 -1
- data/docs/assets/index.md.CAMqGBJE.js +0 -1
- data/docs/assets/index.md.CAMqGBJE.lean.js +0 -1
- data/docs/assets/not-released.md.BBy28McC.js +0 -1
- data/docs/assets/not-released.md.BBy28McC.lean.js +0 -1
- data/docs/assets/tutorial.md.a4a0eVOy.js +0 -1
- data/docs/assets/tutorial.md.a4a0eVOy.lean.js +0 -1
- /data/docs/assets/{components.md.DatoNgFo.lean.js → components.md.Pg_Lo35G.lean.js} +0 -0
- /data/docs/assets/{configuration.md.DeyhpqEx.lean.js → configuration.md.BfeGnEci.lean.js} +0 -0
- /data/docs/assets/{doc-conventions.md.BzmSrTEW.lean.js → doc-conventions.md.DOkAuXlt.lean.js} +0 -0
- /data/docs/assets/{forms.md.C2Dizvzq.lean.js → forms.md.BQZlCwvi.lean.js} +0 -0
- /data/docs/assets/{getting-started.md.C93e0odB.lean.js → getting-started.md.BcXnNuD6.lean.js} +0 -0
- /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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6dad66a7dffc78b032c11605c85ad58139b151316d46ebc0c232dfa91cf76412
|
4
|
+
data.tar.gz: 1dc1a82264b6e3c026aceaf817ad5e4ca6b5b308013861bd38ce185186fbbd1f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3b0397fc6583b5ed0f85507c0d3605cc65cb3f11bf29f04ec5bf366d930ef905195c254b07413f6ded4b4ff229ad5fad47619730d02f88de632b7ea9f405d81a
|
7
|
+
data.tar.gz: c998ae7f7e8fd97ac5b340c35fa027dd3e86ee284ce6868243ea39c333197b8f44ca685fd1af97a56d92c3cf4c87f9a54cdfbf888682b1f86cc9c69b3689e1e5
|
data/Gemfile.lock
CHANGED
@@ -23,7 +23,7 @@ export default defineConfig({
|
|
23
23
|
[
|
24
24
|
"meta", {
|
25
25
|
property: "og:image",
|
26
|
-
content: "https://
|
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
|
-
--
|
54
|
-
--
|
55
|
-
--
|
56
|
-
--
|
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
|
-
--
|
75
|
-
--
|
76
|
-
--
|
77
|
-
--
|
78
|
-
|
79
|
-
--vp-c-
|
80
|
-
--vp-c-
|
81
|
-
--vp-c-
|
82
|
-
--vp-c-
|
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
|
-
#
|
120
|
-
#
|
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);
|
data/brutrb.com/adrs.md
ADDED
@@ -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
|
-

|
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**.
|
Binary file
|
Binary file
|
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
|
data/brutrb.com/overview.md
CHANGED
@@ -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
|
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
|
+
|
data/brutrb.com/tutorial.md
CHANGED
@@ -1,3 +1,7 @@
|
|
1
1
|
# Tutorial
|
2
2
|
|
3
|
-
|
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.
|
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.
|
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://
|
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\":\"
|
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>
|