brut 0.13.0 → 0.15.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 (530) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +28 -0
  3. data/Gemfile.lock +1 -1
  4. data/brut-css/package-lock.json +57 -106
  5. data/brut-css/package.json +1 -1
  6. data/brut-js/package-lock.json +50 -50
  7. data/brut-js/package.json +1 -1
  8. data/brut-js/specs/Toast.spec.js +34 -0
  9. data/brut-js/src/I18nTranslation.js +3 -0
  10. data/brut-js/src/Message.js +9 -3
  11. data/brut-js/src/RichString.js +4 -1
  12. data/brut-js/src/Toast.js +102 -0
  13. data/brut-js/src/index.js +3 -0
  14. data/brutrb.com/.vitepress/config.mjs +0 -1
  15. data/brutrb.com/brut-js.md +1 -0
  16. data/brutrb.com/layouts.md +70 -12
  17. data/brutrb.com/package-lock.json +428 -381
  18. data/docs/404.html +3 -3
  19. data/docs/adrs.html +7 -7
  20. data/docs/ai.html +7 -7
  21. data/docs/api/Brut/BackEnd/SeedData.html +1 -1
  22. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server/FlushSpans.html +1 -1
  23. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server.html +1 -1
  24. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares.html +1 -1
  25. data/docs/api/Brut/BackEnd/Sidekiq.html +1 -1
  26. data/docs/api/Brut/BackEnd/Validators/FormValidator.html +1 -1
  27. data/docs/api/Brut/BackEnd/Validators.html +1 -1
  28. data/docs/api/Brut/BackEnd.html +1 -1
  29. data/docs/api/Brut/CLI/App.html +1 -1
  30. data/docs/api/Brut/CLI/AppRunner.html +1 -1
  31. data/docs/api/Brut/CLI/Apps/BuildAssets/All.html +1 -1
  32. data/docs/api/Brut/CLI/Apps/BuildAssets/CSS.html +1 -1
  33. data/docs/api/Brut/CLI/Apps/BuildAssets/Images.html +1 -1
  34. data/docs/api/Brut/CLI/Apps/BuildAssets/JS.html +1 -1
  35. data/docs/api/Brut/CLI/Apps/BuildAssets.html +1 -1
  36. data/docs/api/Brut/CLI/Apps/DB/Create.html +1 -1
  37. data/docs/api/Brut/CLI/Apps/DB/Drop.html +1 -1
  38. data/docs/api/Brut/CLI/Apps/DB/Migrate.html +1 -1
  39. data/docs/api/Brut/CLI/Apps/DB/NewMigration.html +1 -1
  40. data/docs/api/Brut/CLI/Apps/DB/Rebuild.html +1 -1
  41. data/docs/api/Brut/CLI/Apps/DB/Seed.html +1 -1
  42. data/docs/api/Brut/CLI/Apps/DB/Status.html +1 -1
  43. data/docs/api/Brut/CLI/Apps/DB.html +1 -1
  44. data/docs/api/Brut/CLI/Apps/DeployBase/GitChecks.html +1 -1
  45. data/docs/api/Brut/CLI/Apps/DeployBase.html +1 -1
  46. data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy/Deploy.html +1 -1
  47. data/docs/api/Brut/CLI/Apps/HerokuContainerBasedDeploy.html +1 -1
  48. data/docs/api/Brut/CLI/Apps/Scaffold/Action/Route.html +1 -1
  49. data/docs/api/Brut/CLI/Apps/Scaffold/Action.html +1 -1
  50. data/docs/api/Brut/CLI/Apps/Scaffold/Component.html +1 -1
  51. data/docs/api/Brut/CLI/Apps/Scaffold/CustomElementTest.html +1 -1
  52. data/docs/api/Brut/CLI/Apps/Scaffold/DbModel.html +1 -1
  53. data/docs/api/Brut/CLI/Apps/Scaffold/E2ETest.html +1 -1
  54. data/docs/api/Brut/CLI/Apps/Scaffold/Form.html +1 -1
  55. data/docs/api/Brut/CLI/Apps/Scaffold/Page/Route.html +1 -1
  56. data/docs/api/Brut/CLI/Apps/Scaffold/Page.html +1 -1
  57. data/docs/api/Brut/CLI/Apps/Scaffold/RoutesEditor.html +1 -1
  58. data/docs/api/Brut/CLI/Apps/Scaffold/Test.html +1 -1
  59. data/docs/api/Brut/CLI/Apps/Scaffold.html +1 -1
  60. data/docs/api/Brut/CLI/Apps/Test/Audit.html +1 -1
  61. data/docs/api/Brut/CLI/Apps/Test/E2e.html +1 -1
  62. data/docs/api/Brut/CLI/Apps/Test/JS.html +1 -1
  63. data/docs/api/Brut/CLI/Apps/Test/Run.html +1 -1
  64. data/docs/api/Brut/CLI/Apps/Test.html +1 -1
  65. data/docs/api/Brut/CLI/Apps.html +1 -1
  66. data/docs/api/Brut/CLI/Command.html +1 -1
  67. data/docs/api/Brut/CLI/Error.html +1 -1
  68. data/docs/api/Brut/CLI/ExecutionResults/Result.html +1 -1
  69. data/docs/api/Brut/CLI/ExecutionResults.html +1 -1
  70. data/docs/api/Brut/CLI/Executor.html +1 -1
  71. data/docs/api/Brut/CLI/InvalidOption.html +1 -1
  72. data/docs/api/Brut/CLI/Options.html +1 -1
  73. data/docs/api/Brut/CLI/Output.html +1 -1
  74. data/docs/api/Brut/CLI/SystemExecError.html +1 -1
  75. data/docs/api/Brut/CLI.html +1 -1
  76. data/docs/api/Brut/FactoryBot.html +1 -1
  77. data/docs/api/Brut/Framework/App.html +1 -1
  78. data/docs/api/Brut/Framework/Config.html +1 -1
  79. data/docs/api/Brut/Framework/Container.html +1 -1
  80. data/docs/api/Brut/Framework/Error.html +1 -1
  81. data/docs/api/Brut/Framework/Errors/AbstractMethod.html +1 -1
  82. data/docs/api/Brut/Framework/Errors/Bug.html +1 -1
  83. data/docs/api/Brut/Framework/Errors/MissingConfiguration.html +1 -1
  84. data/docs/api/Brut/Framework/Errors/MissingParameter.html +1 -1
  85. data/docs/api/Brut/Framework/Errors/NoClassForPath.html +1 -1
  86. data/docs/api/Brut/Framework/Errors/NotFound.html +1 -1
  87. data/docs/api/Brut/Framework/Errors/NotImplemented.html +1 -1
  88. data/docs/api/Brut/Framework/Errors.html +1 -1
  89. data/docs/api/Brut/Framework/FussyTypeEnforcement.html +1 -1
  90. data/docs/api/Brut/Framework/MCP.html +1 -1
  91. data/docs/api/Brut/Framework/ProjectEnvironment.html +1 -1
  92. data/docs/api/Brut/Framework.html +1 -1
  93. data/docs/api/Brut/FrontEnd/AssetPathResolver.html +1 -1
  94. data/docs/api/Brut/FrontEnd/Component/Helpers.html +1 -1
  95. data/docs/api/Brut/FrontEnd/Component.html +1 -1
  96. data/docs/api/Brut/FrontEnd/Components/ConstraintViolations.html +1 -1
  97. data/docs/api/Brut/FrontEnd/Components/FormTag.html +1 -1
  98. data/docs/api/Brut/FrontEnd/Components/I18nTranslations.html +1 -1
  99. data/docs/api/Brut/FrontEnd/Components/Input.html +1 -1
  100. data/docs/api/Brut/FrontEnd/Components/Inputs/ButtonTag.html +1 -1
  101. data/docs/api/Brut/FrontEnd/Components/Inputs/CsrfToken.html +1 -1
  102. data/docs/api/Brut/FrontEnd/Components/Inputs/InputTag.html +1 -1
  103. data/docs/api/Brut/FrontEnd/Components/Inputs/RadioButton.html +1 -1
  104. data/docs/api/Brut/FrontEnd/Components/Inputs/SelectTagWithOptions.html +1 -1
  105. data/docs/api/Brut/FrontEnd/Components/Inputs/TextareaTag.html +1 -1
  106. data/docs/api/Brut/FrontEnd/Components/Inputs.html +1 -1
  107. data/docs/api/Brut/FrontEnd/Components/LocaleDetection.html +1 -1
  108. data/docs/api/Brut/FrontEnd/Components/PageIdentifier.html +37 -18
  109. data/docs/api/Brut/FrontEnd/Components/TimeTag.html +1 -1
  110. data/docs/api/Brut/FrontEnd/Components/Traceparent.html +1 -1
  111. data/docs/api/Brut/FrontEnd/Components.html +1 -1
  112. data/docs/api/Brut/FrontEnd/CsrfProtector.html +1 -1
  113. data/docs/api/Brut/FrontEnd/Download.html +1 -1
  114. data/docs/api/Brut/FrontEnd/Flash.html +1 -1
  115. data/docs/api/Brut/FrontEnd/Form.html +1 -1
  116. data/docs/api/Brut/FrontEnd/Forms/Button.html +1 -1
  117. data/docs/api/Brut/FrontEnd/Forms/ButtonInputDefinition.html +1 -1
  118. data/docs/api/Brut/FrontEnd/Forms/ConstraintViolation.html +1 -1
  119. data/docs/api/Brut/FrontEnd/Forms/Input/Color.html +1 -1
  120. data/docs/api/Brut/FrontEnd/Forms/Input/TimeOfDay.html +1 -1
  121. data/docs/api/Brut/FrontEnd/Forms/Input.html +1 -1
  122. data/docs/api/Brut/FrontEnd/Forms/InputDeclarations.html +1 -1
  123. data/docs/api/Brut/FrontEnd/Forms/InputDefinition.html +1 -1
  124. data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInput.html +1 -1
  125. data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInputDefinition.html +1 -1
  126. data/docs/api/Brut/FrontEnd/Forms/SelectInput.html +1 -1
  127. data/docs/api/Brut/FrontEnd/Forms/SelectInputDefinition.html +1 -1
  128. data/docs/api/Brut/FrontEnd/Forms/ValidityState.html +1 -1
  129. data/docs/api/Brut/FrontEnd/Forms.html +1 -1
  130. data/docs/api/Brut/FrontEnd/GenericResponse.html +1 -1
  131. data/docs/api/Brut/FrontEnd/Handler.html +1 -1
  132. data/docs/api/Brut/FrontEnd/Handlers/CspReportingHandler.html +1 -1
  133. data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler/TraceParent.html +1 -1
  134. data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler.html +1 -1
  135. data/docs/api/Brut/FrontEnd/Handlers/LocaleDetectionHandler.html +1 -1
  136. data/docs/api/Brut/FrontEnd/Handlers/MissingHandler/Form.html +1 -1
  137. data/docs/api/Brut/FrontEnd/Handlers/MissingHandler.html +1 -1
  138. data/docs/api/Brut/FrontEnd/Handlers.html +1 -1
  139. data/docs/api/Brut/FrontEnd/HandlingResults.html +1 -1
  140. data/docs/api/Brut/FrontEnd/HttpMethod.html +1 -1
  141. data/docs/api/Brut/FrontEnd/HttpStatus.html +1 -1
  142. data/docs/api/Brut/FrontEnd/InlineSvgLocator.html +1 -1
  143. data/docs/api/Brut/FrontEnd/Layout.html +171 -3
  144. data/docs/api/Brut/FrontEnd/Middleware.html +1 -1
  145. data/docs/api/Brut/FrontEnd/Middlewares/AnnotateBrutOwnedPaths.html +1 -1
  146. data/docs/api/Brut/FrontEnd/Middlewares/Favicon.html +1 -1
  147. data/docs/api/Brut/FrontEnd/Middlewares/OpenTelemetrySpan.html +1 -1
  148. data/docs/api/Brut/FrontEnd/Middlewares/ReloadApp.html +1 -1
  149. data/docs/api/Brut/FrontEnd/Middlewares.html +1 -1
  150. data/docs/api/Brut/FrontEnd/Page.html +1 -1
  151. data/docs/api/Brut/FrontEnd/Pages/MissingPage.html +1 -1
  152. data/docs/api/Brut/FrontEnd/Pages.html +1 -1
  153. data/docs/api/Brut/FrontEnd/RequestContext.html +1 -1
  154. data/docs/api/Brut/FrontEnd/RouteHook.html +1 -1
  155. data/docs/api/Brut/FrontEnd/RouteHooks/AgeFlash.html +1 -1
  156. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineScripts.html +1 -1
  157. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts/ReportOnly.html +1 -1
  158. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts.html +1 -1
  159. data/docs/api/Brut/FrontEnd/RouteHooks/LocaleDetection.html +1 -1
  160. data/docs/api/Brut/FrontEnd/RouteHooks/SetupRequestContext.html +1 -1
  161. data/docs/api/Brut/FrontEnd/RouteHooks.html +1 -1
  162. data/docs/api/Brut/FrontEnd/Routing/FormHandlerRoute.html +1 -1
  163. data/docs/api/Brut/FrontEnd/Routing/FormRoute.html +1 -1
  164. data/docs/api/Brut/FrontEnd/Routing/MissingForm.html +1 -1
  165. data/docs/api/Brut/FrontEnd/Routing/MissingHandler.html +1 -1
  166. data/docs/api/Brut/FrontEnd/Routing/MissingPage.html +1 -1
  167. data/docs/api/Brut/FrontEnd/Routing/MissingPath.html +1 -1
  168. data/docs/api/Brut/FrontEnd/Routing/PageRoute.html +1 -1
  169. data/docs/api/Brut/FrontEnd/Routing/Route.html +1 -1
  170. data/docs/api/Brut/FrontEnd/Routing.html +1 -1
  171. data/docs/api/Brut/FrontEnd/Session.html +1 -1
  172. data/docs/api/Brut/FrontEnd.html +1 -1
  173. data/docs/api/Brut/I18n/BaseMethods.html +1 -1
  174. data/docs/api/Brut/I18n/ForBackEnd.html +1 -1
  175. data/docs/api/Brut/I18n/ForCLI.html +1 -1
  176. data/docs/api/Brut/I18n/ForHTML.html +1 -1
  177. data/docs/api/Brut/I18n/HTTPAcceptLanguage/AlwaysEnglish.html +1 -1
  178. data/docs/api/Brut/I18n/HTTPAcceptLanguage.html +1 -1
  179. data/docs/api/Brut/I18n.html +1 -1
  180. data/docs/api/Brut/Instrumentation/LoggerSpanExporter.html +1 -1
  181. data/docs/api/Brut/Instrumentation/Methods/ClassMethods.html +1 -1
  182. data/docs/api/Brut/Instrumentation/Methods.html +1 -1
  183. data/docs/api/Brut/Instrumentation/OpenTelemetry/NormalizedAttributes.html +1 -1
  184. data/docs/api/Brut/Instrumentation/OpenTelemetry/Span.html +1 -1
  185. data/docs/api/Brut/Instrumentation/OpenTelemetry.html +1 -1
  186. data/docs/api/Brut/Instrumentation.html +1 -1
  187. data/docs/api/Brut/RubocopConfig.html +1 -1
  188. data/docs/api/Brut/SinatraHelpers/ClassMethods.html +1 -1
  189. data/docs/api/Brut/SinatraHelpers.html +1 -1
  190. data/docs/api/Brut/SpecSupport/ClockSupport.html +1 -1
  191. data/docs/api/Brut/SpecSupport/ComponentSupport.html +1 -1
  192. data/docs/api/Brut/SpecSupport/E2ETestServer.html +1 -1
  193. data/docs/api/Brut/SpecSupport/E2eSupport.html +1 -1
  194. data/docs/api/Brut/SpecSupport/EnhancedNode.html +1 -1
  195. data/docs/api/Brut/SpecSupport/FlashSupport.html +1 -1
  196. data/docs/api/Brut/SpecSupport/GeneralSupport/ClassMethods.html +1 -1
  197. data/docs/api/Brut/SpecSupport/GeneralSupport.html +1 -1
  198. data/docs/api/Brut/SpecSupport/HandlerSupport.html +1 -1
  199. data/docs/api/Brut/SpecSupport/Matchers/BeABug.html +1 -1
  200. data/docs/api/Brut/SpecSupport/Matchers/BePageFor.html +1 -1
  201. data/docs/api/Brut/SpecSupport/Matchers/BeRoutingFor.html +1 -1
  202. data/docs/api/Brut/SpecSupport/Matchers/HaveConstraintViolation.html +1 -1
  203. data/docs/api/Brut/SpecSupport/Matchers/HaveGenerated.html +1 -1
  204. data/docs/api/Brut/SpecSupport/Matchers/HaveHTMLAttribute.html +1 -1
  205. data/docs/api/Brut/SpecSupport/Matchers/HaveI18nString.html +1 -1
  206. data/docs/api/Brut/SpecSupport/Matchers/HaveLinkTo.html +1 -1
  207. data/docs/api/Brut/SpecSupport/Matchers/HaveRedirectedTo.html +1 -1
  208. data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedHttpStatus.html +1 -1
  209. data/docs/api/Brut/SpecSupport/Matchers/HaveReturnedRackResponse.html +1 -1
  210. data/docs/api/Brut/SpecSupport/Matchers.html +1 -1
  211. data/docs/api/Brut/SpecSupport/RSpecSetup/OptionalSidekiqSupport.html +1 -1
  212. data/docs/api/Brut/SpecSupport/RSpecSetup.html +1 -1
  213. data/docs/api/Brut/SpecSupport/SessionSupport.html +1 -1
  214. data/docs/api/Brut/SpecSupport.html +1 -1
  215. data/docs/api/Brut.html +1 -1
  216. data/docs/api/Clock.html +1 -1
  217. data/docs/api/ModuleName.html +1 -1
  218. data/docs/api/RichString.html +1 -1
  219. data/docs/api/SemanticLogger/Appender/Async.html +1 -1
  220. data/docs/api/Sequel/Extensions/BrutInstrumentation.html +1 -1
  221. data/docs/api/Sequel/Extensions/BrutMigrations.html +1 -1
  222. data/docs/api/Sequel/Extensions.html +1 -1
  223. data/docs/api/Sequel/Plugins/CreatedAt/InstanceMethods.html +1 -1
  224. data/docs/api/Sequel/Plugins/CreatedAt.html +1 -1
  225. data/docs/api/Sequel/Plugins/ExternalId/ClassMethods.html +1 -1
  226. data/docs/api/Sequel/Plugins/ExternalId/InstanceMethods.html +1 -1
  227. data/docs/api/Sequel/Plugins/ExternalId.html +1 -1
  228. data/docs/api/Sequel/Plugins/FindBang/ClassMethods.html +1 -1
  229. data/docs/api/Sequel/Plugins/FindBang.html +1 -1
  230. data/docs/api/Sequel/Plugins.html +1 -1
  231. data/docs/api/Sequel.html +1 -1
  232. data/docs/api/_index.html +1 -1
  233. data/docs/api/file.README.html +1 -1
  234. data/docs/api/index.html +1 -1
  235. data/docs/api/method_list.html +157 -141
  236. data/docs/api/top-level-namespace.html +1 -1
  237. data/docs/assets/adrs.md.YglbWtQe.js +1 -0
  238. data/docs/assets/adrs.md.YglbWtQe.lean.js +1 -0
  239. data/docs/assets/ai.md.ChLnvDAX.js +1 -0
  240. data/docs/assets/ai.md.ChLnvDAX.lean.js +1 -0
  241. data/docs/assets/{app.BDtsVxyd.js → app.B0X8upRm.js} +1 -1
  242. data/docs/assets/{assets.md.7C3HWkga.js → assets.md.BEF6Oz6K.js} +2 -2
  243. data/docs/assets/assets.md.BEF6Oz6K.lean.js +1 -0
  244. data/docs/assets/{brut-js.md.B4GYxQVw.js → brut-js.md.CbJAe2Ky.js} +2 -2
  245. data/docs/assets/brut-js.md.CbJAe2Ky.lean.js +1 -0
  246. data/docs/assets/business-logic.md.DbuaOYGU.js +1 -0
  247. data/docs/assets/business-logic.md.DbuaOYGU.lean.js +1 -0
  248. data/docs/assets/chunks/@localSearchIndexroot.C0s1k0UQ.js +1 -0
  249. data/docs/assets/chunks/VPLocalSearchBox.jLmhant1.js +8 -0
  250. data/docs/assets/chunks/framework.C4nOkCZI.js +18 -0
  251. data/docs/assets/chunks/{theme.DZKmijwi.js → theme.CtVUdCdt.js} +2 -2
  252. data/docs/assets/{cli.md.CjsktgFz.js → cli.md.DDMar_51.js} +2 -2
  253. data/docs/assets/cli.md.DDMar_51.lean.js +1 -0
  254. data/docs/assets/{components.md.rMhQ0WdZ.js → components.md.C6nWgDP0.js} +5 -5
  255. data/docs/assets/components.md.C6nWgDP0.lean.js +1 -0
  256. data/docs/assets/{configuration.md.BK42Yjp_.js → configuration.md.CpbYHWPb.js} +2 -2
  257. data/docs/assets/configuration.md.CpbYHWPb.lean.js +1 -0
  258. data/docs/assets/{css.md.CltvJqAa.js → css.md.K5rOCOQY.js} +2 -2
  259. data/docs/assets/css.md.K5rOCOQY.lean.js +1 -0
  260. data/docs/assets/{custom-element-tests.md.B_rbta32.js → custom-element-tests.md.DiLe-eFw.js} +2 -2
  261. data/docs/assets/custom-element-tests.md.DiLe-eFw.lean.js +1 -0
  262. data/docs/assets/{database-access.md.gnluu54N.js → database-access.md.Dc8l2Plf.js} +2 -2
  263. data/docs/assets/database-access.md.Dc8l2Plf.lean.js +1 -0
  264. data/docs/assets/{database-schema.md.LpmBPVEU.js → database-schema.md.BJ_JhXmO.js} +2 -2
  265. data/docs/assets/database-schema.md.BJ_JhXmO.lean.js +1 -0
  266. data/docs/assets/{deployment.md.BLseERGV.js → deployment.md.C1u5ep0g.js} +2 -2
  267. data/docs/assets/deployment.md.C1u5ep0g.lean.js +1 -0
  268. data/docs/assets/{dev-environment.md.DRH2D2-O.js → dev-environment.md.B1S9p5ZK.js} +2 -2
  269. data/docs/assets/{dev-environment.md.DRH2D2-O.lean.js → dev-environment.md.B1S9p5ZK.lean.js} +1 -1
  270. data/docs/assets/{dir-structure.md.CWir1pic.js → dir-structure.md.D1T2kGwj.js} +2 -2
  271. data/docs/assets/dir-structure.md.D1T2kGwj.lean.js +1 -0
  272. data/docs/assets/doc-conventions.md.CDnWaEFg.js +1 -0
  273. data/docs/assets/doc-conventions.md.CDnWaEFg.lean.js +1 -0
  274. data/docs/assets/{end-to-end-tests.md.DzqRpZ43.js → end-to-end-tests.md.BJJdNDYL.js} +2 -2
  275. data/docs/assets/end-to-end-tests.md.BJJdNDYL.lean.js +1 -0
  276. data/docs/assets/{features.md.DPFXsy0z.js → features.md.BDWxnyNO.js} +2 -2
  277. data/docs/assets/features.md.BDWxnyNO.lean.js +1 -0
  278. data/docs/assets/{flash-and-session.md.nPvUpnUx.js → flash-and-session.md.CUsMxoNl.js} +2 -2
  279. data/docs/assets/flash-and-session.md.CUsMxoNl.lean.js +1 -0
  280. data/docs/assets/{form-constraints.md.KTv5cdR4.js → form-constraints.md.KlfXSKm2.js} +2 -2
  281. data/docs/assets/form-constraints.md.KlfXSKm2.lean.js +1 -0
  282. data/docs/assets/{forms.md.v9qIbmUM.js → forms.md.Bii91k3E.js} +3 -3
  283. data/docs/assets/forms.md.Bii91k3E.lean.js +1 -0
  284. data/docs/assets/{getting-started.md.DTOl4c2g.js → getting-started.md.ChAvueK7.js} +4 -4
  285. data/docs/assets/getting-started.md.ChAvueK7.lean.js +1 -0
  286. data/docs/assets/{handlers.md.h84MMB1R.js → handlers.md.C5tUwmmo.js} +2 -2
  287. data/docs/assets/handlers.md.C5tUwmmo.lean.js +1 -0
  288. data/docs/assets/{hooks.md.Jmb5VOLA.js → hooks.md.CoiYCKRc.js} +2 -2
  289. data/docs/assets/hooks.md.CoiYCKRc.lean.js +1 -0
  290. data/docs/assets/{i18n.md.BAm9t9JJ.js → i18n.md.DxkCKhUw.js} +2 -2
  291. data/docs/assets/i18n.md.DxkCKhUw.lean.js +1 -0
  292. data/docs/assets/{index.md.Bn9e0sRJ.js → index.md.DnphWyQd.js} +1 -1
  293. data/docs/assets/{index.md.Bn9e0sRJ.lean.js → index.md.DnphWyQd.lean.js} +1 -1
  294. data/docs/assets/{instrumentation.md._lNSriEZ.js → instrumentation.md.BcxjC4jd.js} +2 -2
  295. data/docs/assets/instrumentation.md.BcxjC4jd.lean.js +1 -0
  296. data/docs/assets/{javascript.md.DzrMxUmI.js → javascript.md.D6fxhaQb.js} +2 -2
  297. data/docs/assets/javascript.md.D6fxhaQb.lean.js +1 -0
  298. data/docs/assets/jobs.md.Bc7Y1YpK.js +1 -0
  299. data/docs/assets/jobs.md.Bc7Y1YpK.lean.js +1 -0
  300. data/docs/assets/{keyword-injection.md.95Zgh2eN.js → keyword-injection.md.CqLnnzIz.js} +2 -2
  301. data/docs/assets/keyword-injection.md.CqLnnzIz.lean.js +1 -0
  302. data/docs/assets/layouts.md.HEbeK7Jr.js +68 -0
  303. data/docs/assets/layouts.md.HEbeK7Jr.lean.js +1 -0
  304. data/docs/assets/lsp.md.bE9dW8n9.js +1 -0
  305. data/docs/assets/lsp.md.bE9dW8n9.lean.js +1 -0
  306. data/docs/assets/{markdown-examples.md.CCFEQO44.js → markdown-examples.md.BPmtHlc-.js} +2 -2
  307. data/docs/assets/markdown-examples.md.BPmtHlc-.lean.js +1 -0
  308. data/docs/assets/{middleware.md.Czz_UlJN.js → middleware.md.BhOIsg59.js} +2 -2
  309. data/docs/assets/middleware.md.BhOIsg59.lean.js +1 -0
  310. data/docs/assets/overview.md.BpWAgPFH.js +1 -0
  311. data/docs/assets/overview.md.BpWAgPFH.lean.js +1 -0
  312. data/docs/assets/{pages.md.B7Hc-i6H.js → pages.md.B3sQXpEd.js} +2 -2
  313. data/docs/assets/pages.md.B3sQXpEd.lean.js +1 -0
  314. data/docs/assets/{recipes_alternate-layouts.md.BwEytl59.js → recipes_alternate-layouts.md.C1QzVkA7.js} +2 -2
  315. data/docs/assets/recipes_alternate-layouts.md.C1QzVkA7.lean.js +1 -0
  316. data/docs/assets/{recipes_authentication.md.nwO6F7Ou.js → recipes_authentication.md.CyvoIW82.js} +2 -2
  317. data/docs/assets/recipes_authentication.md.CyvoIW82.lean.js +1 -0
  318. data/docs/assets/{recipes_custom-flash.md.CrQbI5eH.js → recipes_custom-flash.md.6gFqf2uL.js} +2 -2
  319. data/docs/assets/recipes_custom-flash.md.6gFqf2uL.lean.js +1 -0
  320. data/docs/assets/{recipes_form-errors.md.Bv5RCKqH.js → recipes_form-errors.md.B5ptSzMO.js} +2 -2
  321. data/docs/assets/recipes_form-errors.md.B5ptSzMO.lean.js +1 -0
  322. data/docs/assets/{recipes_indexed-forms.md.CstYyOSo.js → recipes_indexed-forms.md.BYYQGW2C.js} +2 -2
  323. data/docs/assets/recipes_indexed-forms.md.BYYQGW2C.lean.js +1 -0
  324. data/docs/assets/{recipes_migrations.md.CTcnWDJF.js → recipes_migrations.md.Cid7-3cu.js} +2 -2
  325. data/docs/assets/recipes_migrations.md.Cid7-3cu.lean.js +1 -0
  326. data/docs/assets/{recipes_text-field-component.md.H4wLAK0Z.js → recipes_text-field-component.md.VhOsCtKI.js} +2 -2
  327. data/docs/assets/recipes_text-field-component.md.VhOsCtKI.lean.js +1 -0
  328. data/docs/assets/roadmap.md.CJsbUmK_.js +1 -0
  329. data/docs/assets/roadmap.md.CJsbUmK_.lean.js +1 -0
  330. data/docs/assets/{routes.md.BD6y2i-f.js → routes.md.C1dgIBtD.js} +2 -2
  331. data/docs/assets/routes.md.C1dgIBtD.lean.js +1 -0
  332. data/docs/assets/security.md.Jn4SY1uK.js +1 -0
  333. data/docs/assets/security.md.Jn4SY1uK.lean.js +1 -0
  334. data/docs/assets/{seed-data.md.BvFZlqIk.js → seed-data.md.UZW0WxYN.js} +2 -2
  335. data/docs/assets/seed-data.md.UZW0WxYN.lean.js +1 -0
  336. data/docs/assets/space-time-continuum.md.D9rYGDFH.js +1 -0
  337. data/docs/assets/space-time-continuum.md.D9rYGDFH.lean.js +1 -0
  338. data/docs/assets/{tutorial.md.BM40jnoq.js → tutorial.md.BX6f6l00.js} +2 -2
  339. data/docs/assets/tutorial.md.BX6f6l00.lean.js +1 -0
  340. data/docs/assets/{tutorials_01-intro.md.B4sUBY3X.js → tutorials_01-intro.md.CzZ3kpF_.js} +2 -2
  341. data/docs/assets/{tutorials_01-intro.md.B4sUBY3X.lean.js → tutorials_01-intro.md.CzZ3kpF_.lean.js} +1 -1
  342. data/docs/assets/{tutorials_02-dialog.md.CPNK1SC_.js → tutorials_02-dialog.md.De6iTsWX.js} +2 -2
  343. data/docs/assets/{tutorials_02-dialog.md.CPNK1SC_.lean.js → tutorials_02-dialog.md.De6iTsWX.lean.js} +1 -1
  344. data/docs/assets/{unit-tests.md.DUGrnLj5.js → unit-tests.md.vDsdBbO_.js} +2 -2
  345. data/docs/assets/unit-tests.md.vDsdBbO_.lean.js +1 -0
  346. data/docs/assets/why.md.4WpxdrQ2.js +1 -0
  347. data/docs/assets/why.md.4WpxdrQ2.lean.js +1 -0
  348. data/docs/assets.html +7 -7
  349. data/docs/brut-js/api/AjaxSubmit.html +1 -1
  350. data/docs/brut-js/api/AjaxSubmit.js.html +1 -1
  351. data/docs/brut-js/api/Autosubmit.html +1 -1
  352. data/docs/brut-js/api/Autosubmit.js.html +1 -1
  353. data/docs/brut-js/api/BaseCustomElement.html +1 -1
  354. data/docs/brut-js/api/BaseCustomElement.js.html +1 -1
  355. data/docs/brut-js/api/BrutCustomElements.html +1 -1
  356. data/docs/brut-js/api/BufferedLogger.html +1 -1
  357. data/docs/brut-js/api/ConfirmSubmit.html +1 -1
  358. data/docs/brut-js/api/ConfirmSubmit.js.html +1 -1
  359. data/docs/brut-js/api/ConfirmationDialog.html +1 -1
  360. data/docs/brut-js/api/ConfirmationDialog.js.html +1 -1
  361. data/docs/brut-js/api/ConstraintViolationMessage.html +1 -1
  362. data/docs/brut-js/api/ConstraintViolationMessage.js.html +1 -1
  363. data/docs/brut-js/api/ConstraintViolationMessages.html +1 -1
  364. data/docs/brut-js/api/ConstraintViolationMessages.js.html +1 -1
  365. data/docs/brut-js/api/CopyToClipboard.html +1 -1
  366. data/docs/brut-js/api/CopyToClipboard.js.html +1 -1
  367. data/docs/brut-js/api/Form.html +1 -1
  368. data/docs/brut-js/api/Form.js.html +1 -1
  369. data/docs/brut-js/api/I18nTranslation.html +1 -1
  370. data/docs/brut-js/api/I18nTranslation.js.html +1 -1
  371. data/docs/brut-js/api/LocaleDetection.html +1 -1
  372. data/docs/brut-js/api/LocaleDetection.js.html +1 -1
  373. data/docs/brut-js/api/Logger.html +1 -1
  374. data/docs/brut-js/api/Logger.js.html +1 -1
  375. data/docs/brut-js/api/Message.html +1 -1
  376. data/docs/brut-js/api/Message.js.html +1 -1
  377. data/docs/brut-js/api/PrefixedLogger.html +1 -1
  378. data/docs/brut-js/api/RichString.html +1 -1
  379. data/docs/brut-js/api/RichString.js.html +1 -1
  380. data/docs/brut-js/api/Tabs.html +1 -1
  381. data/docs/brut-js/api/Tabs.js.html +1 -1
  382. data/docs/brut-js/api/Tracing.html +1 -1
  383. data/docs/brut-js/api/Tracing.js.html +1 -1
  384. data/docs/brut-js/api/external-CustomElementRegistry.html +1 -1
  385. data/docs/brut-js/api/external-Performance.html +1 -1
  386. data/docs/brut-js/api/external-Promise.html +1 -1
  387. data/docs/brut-js/api/external-ValidityState.html +1 -1
  388. data/docs/brut-js/api/external-Window.html +1 -1
  389. data/docs/brut-js/api/external-fetch.html +1 -1
  390. data/docs/brut-js/api/global.html +1 -1
  391. data/docs/brut-js/api/index.html +1 -1
  392. data/docs/brut-js/api/index.js.html +1 -1
  393. data/docs/brut-js/api/module-testing.html +1 -1
  394. data/docs/brut-js/api/testing.AssetMetadata.html +1 -1
  395. data/docs/brut-js/api/testing.AssetMetadataLoader.html +1 -1
  396. data/docs/brut-js/api/testing.CustomElementTest.html +1 -1
  397. data/docs/brut-js/api/testing.DOMCreator.html +1 -1
  398. data/docs/brut-js/api/testing_AssetMetadata.js.html +1 -1
  399. data/docs/brut-js/api/testing_AssetMetadataLoader.js.html +1 -1
  400. data/docs/brut-js/api/testing_CustomElementTest.js.html +1 -1
  401. data/docs/brut-js/api/testing_DOMCreator.js.html +1 -1
  402. data/docs/brut-js/api/testing_index.js.html +1 -1
  403. data/docs/brut-js.html +7 -7
  404. data/docs/business-logic.html +7 -7
  405. data/docs/cli.html +7 -7
  406. data/docs/components.html +10 -10
  407. data/docs/configuration.html +7 -7
  408. data/docs/css.html +7 -7
  409. data/docs/custom-element-tests.html +7 -7
  410. data/docs/database-access.html +7 -7
  411. data/docs/database-schema.html +7 -7
  412. data/docs/deployment.html +7 -7
  413. data/docs/dev-environment.html +7 -7
  414. data/docs/dir-structure.html +7 -7
  415. data/docs/doc-conventions.html +7 -7
  416. data/docs/end-to-end-tests.html +7 -7
  417. data/docs/features.html +7 -7
  418. data/docs/flash-and-session.html +7 -7
  419. data/docs/form-constraints.html +7 -7
  420. data/docs/forms.html +8 -8
  421. data/docs/getting-started.html +9 -9
  422. data/docs/handlers.html +7 -7
  423. data/docs/hashmap.json +1 -1
  424. data/docs/hooks.html +7 -7
  425. data/docs/i18n.html +7 -7
  426. data/docs/index.html +6 -6
  427. data/docs/instrumentation.html +7 -7
  428. data/docs/javascript.html +7 -7
  429. data/docs/jobs.html +7 -7
  430. data/docs/keyword-injection.html +7 -7
  431. data/docs/layouts.html +42 -12
  432. data/docs/lsp.html +7 -7
  433. data/docs/markdown-examples.html +7 -7
  434. data/docs/middleware.html +7 -7
  435. data/docs/overview.html +7 -7
  436. data/docs/pages.html +7 -7
  437. data/docs/recipes/alternate-layouts.html +8 -8
  438. data/docs/recipes/authentication.html +7 -7
  439. data/docs/recipes/custom-flash.html +8 -8
  440. data/docs/recipes/form-errors.html +7 -7
  441. data/docs/recipes/indexed-forms.html +7 -7
  442. data/docs/recipes/migrations.html +7 -7
  443. data/docs/recipes/text-field-component.html +7 -7
  444. data/docs/roadmap.html +7 -7
  445. data/docs/routes.html +7 -7
  446. data/docs/security.html +7 -7
  447. data/docs/seed-data.html +7 -7
  448. data/docs/space-time-continuum.html +7 -7
  449. data/docs/tutorial.html +7 -7
  450. data/docs/tutorials/01-intro.html +7 -7
  451. data/docs/tutorials/02-dialog.html +7 -7
  452. data/docs/unit-tests.html +7 -7
  453. data/docs/why.html +7 -7
  454. data/lib/brut/front_end/components/page_identifier.rb +7 -4
  455. data/lib/brut/front_end/layout.rb +11 -0
  456. data/lib/brut/front_end/page.rb +1 -1
  457. data/lib/brut/version.rb +1 -1
  458. data/mkbrut/Gemfile.lock +1 -1
  459. data/mkbrut/lib/mkbrut/version.rb +1 -1
  460. data/mkbrut/templates/Base/app/src/front_end/layouts/blank_layout.rb +11 -0
  461. data/mkbrut/templates/Base/app/src/front_end/layouts/default_layout.rb.erb +3 -6
  462. metadata +115 -116
  463. data/brutrb.com/recipes/blank-layouts.md +0 -22
  464. data/docs/assets/adrs.md.BxjHi9-8.js +0 -1
  465. data/docs/assets/adrs.md.BxjHi9-8.lean.js +0 -1
  466. data/docs/assets/ai.md.Cy9GWnER.js +0 -1
  467. data/docs/assets/ai.md.Cy9GWnER.lean.js +0 -1
  468. data/docs/assets/assets.md.7C3HWkga.lean.js +0 -1
  469. data/docs/assets/brut-js.md.B4GYxQVw.lean.js +0 -1
  470. data/docs/assets/business-logic.md.BY4hGy0m.js +0 -1
  471. data/docs/assets/business-logic.md.BY4hGy0m.lean.js +0 -1
  472. data/docs/assets/chunks/@localSearchIndexroot.BWVzhs5N.js +0 -1
  473. data/docs/assets/chunks/VPLocalSearchBox.DCJk5nAW.js +0 -8
  474. data/docs/assets/chunks/framework.1L-BeKqY.js +0 -18
  475. data/docs/assets/cli.md.CjsktgFz.lean.js +0 -1
  476. data/docs/assets/components.md.rMhQ0WdZ.lean.js +0 -1
  477. data/docs/assets/configuration.md.BK42Yjp_.lean.js +0 -1
  478. data/docs/assets/css.md.CltvJqAa.lean.js +0 -1
  479. data/docs/assets/custom-element-tests.md.B_rbta32.lean.js +0 -1
  480. data/docs/assets/database-access.md.gnluu54N.lean.js +0 -1
  481. data/docs/assets/database-schema.md.LpmBPVEU.lean.js +0 -1
  482. data/docs/assets/deployment.md.BLseERGV.lean.js +0 -1
  483. data/docs/assets/dir-structure.md.CWir1pic.lean.js +0 -1
  484. data/docs/assets/doc-conventions.md.DOkAuXlt.js +0 -1
  485. data/docs/assets/doc-conventions.md.DOkAuXlt.lean.js +0 -1
  486. data/docs/assets/end-to-end-tests.md.DzqRpZ43.lean.js +0 -1
  487. data/docs/assets/features.md.DPFXsy0z.lean.js +0 -1
  488. data/docs/assets/flash-and-session.md.nPvUpnUx.lean.js +0 -1
  489. data/docs/assets/form-constraints.md.KTv5cdR4.lean.js +0 -1
  490. data/docs/assets/forms.md.v9qIbmUM.lean.js +0 -1
  491. data/docs/assets/getting-started.md.DTOl4c2g.lean.js +0 -1
  492. data/docs/assets/handlers.md.h84MMB1R.lean.js +0 -1
  493. data/docs/assets/hooks.md.Jmb5VOLA.lean.js +0 -1
  494. data/docs/assets/i18n.md.BAm9t9JJ.lean.js +0 -1
  495. data/docs/assets/instrumentation.md._lNSriEZ.lean.js +0 -1
  496. data/docs/assets/javascript.md.DzrMxUmI.lean.js +0 -1
  497. data/docs/assets/jobs.md.S-2amAYp.js +0 -1
  498. data/docs/assets/jobs.md.S-2amAYp.lean.js +0 -1
  499. data/docs/assets/keyword-injection.md.95Zgh2eN.lean.js +0 -1
  500. data/docs/assets/layouts.md.CVGl9xIO.js +0 -38
  501. data/docs/assets/layouts.md.CVGl9xIO.lean.js +0 -1
  502. data/docs/assets/lsp.md.Dn1rIiW0.js +0 -1
  503. data/docs/assets/lsp.md.Dn1rIiW0.lean.js +0 -1
  504. data/docs/assets/markdown-examples.md.CCFEQO44.lean.js +0 -1
  505. data/docs/assets/middleware.md.Czz_UlJN.lean.js +0 -1
  506. data/docs/assets/overview.md.DlKiRRG_.js +0 -1
  507. data/docs/assets/overview.md.DlKiRRG_.lean.js +0 -1
  508. data/docs/assets/pages.md.B7Hc-i6H.lean.js +0 -1
  509. data/docs/assets/recipes_alternate-layouts.md.BwEytl59.lean.js +0 -1
  510. data/docs/assets/recipes_authentication.md.nwO6F7Ou.lean.js +0 -1
  511. data/docs/assets/recipes_blank-layouts.md.fyAUJyJR.js +0 -15
  512. data/docs/assets/recipes_blank-layouts.md.fyAUJyJR.lean.js +0 -1
  513. data/docs/assets/recipes_custom-flash.md.CrQbI5eH.lean.js +0 -1
  514. data/docs/assets/recipes_form-errors.md.Bv5RCKqH.lean.js +0 -1
  515. data/docs/assets/recipes_indexed-forms.md.CstYyOSo.lean.js +0 -1
  516. data/docs/assets/recipes_migrations.md.CTcnWDJF.lean.js +0 -1
  517. data/docs/assets/recipes_text-field-component.md.H4wLAK0Z.lean.js +0 -1
  518. data/docs/assets/roadmap.md.C6PRi0DX.js +0 -1
  519. data/docs/assets/roadmap.md.C6PRi0DX.lean.js +0 -1
  520. data/docs/assets/routes.md.BD6y2i-f.lean.js +0 -1
  521. data/docs/assets/security.md.C0G_AZR-.js +0 -1
  522. data/docs/assets/security.md.C0G_AZR-.lean.js +0 -1
  523. data/docs/assets/seed-data.md.BvFZlqIk.lean.js +0 -1
  524. data/docs/assets/space-time-continuum.md.xl44xDos.js +0 -1
  525. data/docs/assets/space-time-continuum.md.xl44xDos.lean.js +0 -1
  526. data/docs/assets/tutorial.md.BM40jnoq.lean.js +0 -1
  527. data/docs/assets/unit-tests.md.DUGrnLj5.lean.js +0 -1
  528. data/docs/assets/why.md.C-hk5xgJ.js +0 -1
  529. data/docs/assets/why.md.C-hk5xgJ.lean.js +0 -1
  530. data/docs/recipes/blank-layouts.html +0 -43
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3bd46fe65d3487de66c4e13c73eb6a7de32e95fdbade6667c75490386e7400f6
4
- data.tar.gz: 34945a93e94083e72a62b363f46a9b6a0a933830803525a4df52e68d6b9f419c
3
+ metadata.gz: b85e8f08f4b6505e4eb6b0eccf7954116e843e29a2fe44701510fb48a5453530
4
+ data.tar.gz: ee48f403522914288e3a6ee5a4c5182907da98102fe0080cd27a6afee4f63b33
5
5
  SHA512:
6
- metadata.gz: 41905f5926fdfa0460a8151a29feb85f6c3051e56cf38b4c4b577c4c5f32446b778a0f372a2fe62cfd1b63cf77eabb5b40e744a1c8ef3894eb5111467760dbea
7
- data.tar.gz: 01e29954900a7c4c5c1329d9cbbb3ee7506ab7b4e2e0b63e040b17bf43fb962f35729068873c3e967c66c39537b784acae843c1cde05c0936c41e949161fa423
6
+ metadata.gz: 894635a9a6137e99a5b48726e8c57266835741682591ff1c8121b9fc9d68f3ce752172a403018e8b3d6d64ddac197ef4ed11a58da0fe5a3b9bbe49663f4053b7
7
+ data.tar.gz: 36d4f093177d2a0f79f698c46eb5615225cf59c82562f990ef102feb9e8bd54c7e2655cfed9b8eaa2af35a134f0510adc7b06a91262cfaacfccddb233588a561
data/CHANGELOG.md CHANGED
@@ -1,5 +1,33 @@
1
1
  # Brut CHANGELOG
2
2
 
3
+ ## v0.15.0 - Sep 16, 2025
4
+
5
+ * Added `<brut-toast>` to help with toast notifications. They rely on CSS for showing, hiding, and animations, all your
6
+ client-side JS needs to do is set the `key` attribute to show the Toast with an i18n-provided message
7
+
8
+ ## v0.14.0 - Sep 9, 2025
9
+
10
+ * **BREAKING CHANGE** Layouts now have access to the page object they are
11
+ laying out. `Brut::FrontEnd::Layout` now requires being given the page
12
+ object in its constructor, and `Brut::FrontEnd::Components::PageIdentifier`
13
+ **requires** the page, not the page\_name.
14
+
15
+ To fix, inside your layouts, you will likely have this code:
16
+
17
+ ```ruby
18
+ def initialize(page_name:)
19
+ @page_name = page_name
20
+ end
21
+ ```
22
+
23
+ Remove that initializer, then find all uses of `@page_name` and replace
24
+ them with `@page.page_name`, **except** for the call to `PageIdentifier`,
25
+ That should look like so:
26
+
27
+ ```ruby
28
+ PageIdentifer(page) # NOTE @page_name NOR @page.page_name
29
+ ```
30
+
3
31
  ## v0.13.0 - Sep 8, 2025
4
32
 
5
33
  * `<brut-ajax-submit>` now works on forms that have `method="GET"`.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- brut (0.13.0)
4
+ brut (0.15.0)
5
5
  concurrent-ruby
6
6
  i18n
7
7
  irb
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "brut-css",
3
- "version": "0.13.0",
3
+ "version": "0.15.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "brut-css",
9
- "version": "0.13.0",
9
+ "version": "0.15.0",
10
10
  "license": "Hippocratic-2.1",
11
11
  "devDependencies": {
12
12
  "comment-parser": "^1.4.1",
@@ -69,9 +69,9 @@
69
69
  }
70
70
  },
71
71
  "node_modules/ansi-regex": {
72
- "version": "6.1.0",
73
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
74
- "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
72
+ "version": "6.2.2",
73
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
74
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
75
75
  "dev": true,
76
76
  "license": "MIT",
77
77
  "engines": {
@@ -166,14 +166,13 @@
166
166
  "license": "ISC"
167
167
  },
168
168
  "node_modules/brace-expansion": {
169
- "version": "1.1.12",
170
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
171
- "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
169
+ "version": "2.0.2",
170
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
171
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
172
172
  "dev": true,
173
173
  "license": "MIT",
174
174
  "dependencies": {
175
- "balanced-match": "^1.0.0",
176
- "concat-map": "0.0.1"
175
+ "balanced-match": "^1.0.0"
177
176
  }
178
177
  },
179
178
  "node_modules/braces": {
@@ -454,13 +453,6 @@
454
453
  "node": ">= 12.0.0"
455
454
  }
456
455
  },
457
- "node_modules/concat-map": {
458
- "version": "0.0.1",
459
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
460
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
461
- "dev": true,
462
- "license": "MIT"
463
- },
464
456
  "node_modules/config-chain": {
465
457
  "version": "1.1.13",
466
458
  "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
@@ -810,16 +802,6 @@
810
802
  "node": ">=14"
811
803
  }
812
804
  },
813
- "node_modules/editorconfig/node_modules/brace-expansion": {
814
- "version": "2.0.2",
815
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
816
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
817
- "dev": true,
818
- "license": "MIT",
819
- "dependencies": {
820
- "balanced-match": "^1.0.0"
821
- }
822
- },
823
805
  "node_modules/editorconfig/node_modules/minimatch": {
824
806
  "version": "9.0.1",
825
807
  "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz",
@@ -853,9 +835,9 @@
853
835
  }
854
836
  },
855
837
  "node_modules/electron-to-chromium": {
856
- "version": "1.5.214",
857
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.214.tgz",
858
- "integrity": "sha512-TpvUNdha+X3ybfU78NoQatKvQEm1oq3lf2QbnmCEdw+Bd9RuIAY+hJTvq1avzHM0f7EJfnH3vbCnbzKzisc/9Q==",
838
+ "version": "1.5.215",
839
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.215.tgz",
840
+ "integrity": "sha512-TIvGp57UpeNetj/wV/xpFNpWGb0b/ROw372lHPx5Aafx02gjTBtWnEEcaSX3W2dLM3OSdGGyHX/cHl01JQsLaQ==",
859
841
  "dev": true,
860
842
  "license": "ISC"
861
843
  },
@@ -939,29 +921,6 @@
939
921
  "minimatch": "^5.0.1"
940
922
  }
941
923
  },
942
- "node_modules/filelist/node_modules/brace-expansion": {
943
- "version": "2.0.2",
944
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
945
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
946
- "dev": true,
947
- "license": "MIT",
948
- "dependencies": {
949
- "balanced-match": "^1.0.0"
950
- }
951
- },
952
- "node_modules/filelist/node_modules/minimatch": {
953
- "version": "5.1.6",
954
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
955
- "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
956
- "dev": true,
957
- "license": "ISC",
958
- "dependencies": {
959
- "brace-expansion": "^2.0.1"
960
- },
961
- "engines": {
962
- "node": ">=10"
963
- }
964
- },
965
924
  "node_modules/fill-range": {
966
925
  "version": "7.1.1",
967
926
  "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
@@ -976,9 +935,9 @@
976
935
  }
977
936
  },
978
937
  "node_modules/follow-redirects": {
979
- "version": "1.15.9",
980
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
981
- "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
938
+ "version": "1.15.11",
939
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
940
+ "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
982
941
  "dev": true,
983
942
  "funding": [
984
943
  {
@@ -1014,9 +973,9 @@
1014
973
  }
1015
974
  },
1016
975
  "node_modules/fs-extra": {
1017
- "version": "11.3.0",
1018
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz",
1019
- "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==",
976
+ "version": "11.3.1",
977
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz",
978
+ "integrity": "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==",
1020
979
  "dev": true,
1021
980
  "license": "MIT",
1022
981
  "dependencies": {
@@ -1136,16 +1095,6 @@
1136
1095
  "node": ">= 6"
1137
1096
  }
1138
1097
  },
1139
- "node_modules/glob/node_modules/brace-expansion": {
1140
- "version": "2.0.2",
1141
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
1142
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
1143
- "dev": true,
1144
- "license": "MIT",
1145
- "dependencies": {
1146
- "balanced-match": "^1.0.0"
1147
- }
1148
- },
1149
1098
  "node_modules/glob/node_modules/minimatch": {
1150
1099
  "version": "9.0.5",
1151
1100
  "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
@@ -1400,16 +1349,15 @@
1400
1349
  }
1401
1350
  },
1402
1351
  "node_modules/jake": {
1403
- "version": "10.9.2",
1404
- "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz",
1405
- "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==",
1352
+ "version": "10.9.4",
1353
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz",
1354
+ "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==",
1406
1355
  "dev": true,
1407
1356
  "license": "Apache-2.0",
1408
1357
  "dependencies": {
1409
- "async": "^3.2.3",
1410
- "chalk": "^4.0.2",
1358
+ "async": "^3.2.6",
1411
1359
  "filelist": "^1.0.4",
1412
- "minimatch": "^3.1.2"
1360
+ "picocolors": "^1.1.1"
1413
1361
  },
1414
1362
  "bin": {
1415
1363
  "jake": "bin/cli.js"
@@ -1451,9 +1399,9 @@
1451
1399
  }
1452
1400
  },
1453
1401
  "node_modules/jsonfile": {
1454
- "version": "6.1.0",
1455
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
1456
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
1402
+ "version": "6.2.0",
1403
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
1404
+ "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
1457
1405
  "dev": true,
1458
1406
  "license": "MIT",
1459
1407
  "dependencies": {
@@ -1563,16 +1511,16 @@
1563
1511
  }
1564
1512
  },
1565
1513
  "node_modules/minimatch": {
1566
- "version": "3.1.2",
1567
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1568
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1514
+ "version": "5.1.6",
1515
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
1516
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
1569
1517
  "dev": true,
1570
1518
  "license": "ISC",
1571
1519
  "dependencies": {
1572
- "brace-expansion": "^1.1.7"
1520
+ "brace-expansion": "^2.0.1"
1573
1521
  },
1574
1522
  "engines": {
1575
- "node": "*"
1523
+ "node": ">=10"
1576
1524
  }
1577
1525
  },
1578
1526
  "node_modules/minimist": {
@@ -1622,9 +1570,9 @@
1622
1570
  }
1623
1571
  },
1624
1572
  "node_modules/node-releases": {
1625
- "version": "2.0.19",
1626
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
1627
- "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
1573
+ "version": "2.0.20",
1574
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.20.tgz",
1575
+ "integrity": "sha512-7gK6zSXEH6neM212JgfYFXe+GmZQM+fia5SsusuBIUgnPheLFBmIPhtFoAQRj8/7wASYQnbDlHPVwY0BefoFgA==",
1628
1576
  "dev": true,
1629
1577
  "license": "MIT"
1630
1578
  },
@@ -2732,9 +2680,9 @@
2732
2680
  }
2733
2681
  },
2734
2682
  "node_modules/strip-ansi": {
2735
- "version": "7.1.0",
2736
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
2737
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
2683
+ "version": "7.1.2",
2684
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
2685
+ "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
2738
2686
  "dev": true,
2739
2687
  "license": "MIT",
2740
2688
  "dependencies": {
@@ -2858,14 +2806,14 @@
2858
2806
  "license": "Apache-2.0"
2859
2807
  },
2860
2808
  "node_modules/tinyglobby": {
2861
- "version": "0.2.14",
2862
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz",
2863
- "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==",
2809
+ "version": "0.2.15",
2810
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
2811
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
2864
2812
  "dev": true,
2865
2813
  "license": "MIT",
2866
2814
  "dependencies": {
2867
- "fdir": "^6.4.4",
2868
- "picomatch": "^4.0.2"
2815
+ "fdir": "^6.5.0",
2816
+ "picomatch": "^4.0.3"
2869
2817
  },
2870
2818
  "engines": {
2871
2819
  "node": ">=12.0.0"
@@ -2875,11 +2823,14 @@
2875
2823
  }
2876
2824
  },
2877
2825
  "node_modules/tinyglobby/node_modules/fdir": {
2878
- "version": "6.4.6",
2879
- "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz",
2880
- "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==",
2826
+ "version": "6.5.0",
2827
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
2828
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
2881
2829
  "dev": true,
2882
2830
  "license": "MIT",
2831
+ "engines": {
2832
+ "node": ">=12.0.0"
2833
+ },
2883
2834
  "peerDependencies": {
2884
2835
  "picomatch": "^3 || ^4"
2885
2836
  },
@@ -2890,9 +2841,9 @@
2890
2841
  }
2891
2842
  },
2892
2843
  "node_modules/tinyglobby/node_modules/picomatch": {
2893
- "version": "4.0.2",
2894
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
2895
- "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
2844
+ "version": "4.0.3",
2845
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
2846
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
2896
2847
  "dev": true,
2897
2848
  "license": "MIT",
2898
2849
  "engines": {
@@ -3101,9 +3052,9 @@
3101
3052
  }
3102
3053
  },
3103
3054
  "node_modules/wrap-ansi/node_modules/ansi-styles": {
3104
- "version": "6.2.1",
3105
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
3106
- "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
3055
+ "version": "6.2.3",
3056
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
3057
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
3107
3058
  "dev": true,
3108
3059
  "license": "MIT",
3109
3060
  "engines": {
@@ -3124,9 +3075,9 @@
3124
3075
  }
3125
3076
  },
3126
3077
  "node_modules/yaml": {
3127
- "version": "2.8.0",
3128
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz",
3129
- "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==",
3078
+ "version": "2.8.1",
3079
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz",
3080
+ "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==",
3130
3081
  "dev": true,
3131
3082
  "license": "ISC",
3132
3083
  "bin": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "brut-css",
3
- "version": "0.13.0",
3
+ "version": "0.15.0",
4
4
  "description": "Utility CSS Library for Full Stack Developers",
5
5
  "keywords": [
6
6
  "css"
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "brut-js",
3
- "version": "0.13.0",
3
+ "version": "0.15.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "brut-js",
9
- "version": "0.13.0",
9
+ "version": "0.15.0",
10
10
  "license": "Hippocratic-2.1",
11
11
  "devDependencies": {
12
12
  "esbuild": "^0.24.2",
@@ -29,9 +29,9 @@
29
29
  }
30
30
  },
31
31
  "node_modules/@csstools/color-helpers": {
32
- "version": "5.0.2",
33
- "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz",
34
- "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==",
32
+ "version": "5.1.0",
33
+ "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz",
34
+ "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==",
35
35
  "dev": true,
36
36
  "funding": [
37
37
  {
@@ -73,9 +73,9 @@
73
73
  }
74
74
  },
75
75
  "node_modules/@csstools/css-color-parser": {
76
- "version": "3.0.10",
77
- "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.10.tgz",
78
- "integrity": "sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==",
76
+ "version": "3.1.0",
77
+ "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz",
78
+ "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==",
79
79
  "dev": true,
80
80
  "funding": [
81
81
  {
@@ -89,7 +89,7 @@
89
89
  ],
90
90
  "license": "MIT",
91
91
  "dependencies": {
92
- "@csstools/color-helpers": "^5.0.2",
92
+ "@csstools/color-helpers": "^5.1.0",
93
93
  "@csstools/css-calc": "^2.1.4"
94
94
  },
95
95
  "engines": {
@@ -569,9 +569,9 @@
569
569
  }
570
570
  },
571
571
  "node_modules/agent-base": {
572
- "version": "7.1.3",
573
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz",
574
- "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==",
572
+ "version": "7.1.4",
573
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
574
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
575
575
  "dev": true,
576
576
  "license": "MIT",
577
577
  "engines": {
@@ -786,9 +786,9 @@
786
786
  "license": "MIT"
787
787
  },
788
788
  "node_modules/cssstyle": {
789
- "version": "4.4.0",
790
- "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.4.0.tgz",
791
- "integrity": "sha512-W0Y2HOXlPkb2yaKrCVRjinYKciu/qSLEmK0K9mcfDei3zwlnHFEHAs/Du3cIRwPqY+J4JsiBzUjoHyc8RsJ03A==",
789
+ "version": "4.6.0",
790
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz",
791
+ "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==",
792
792
  "dev": true,
793
793
  "license": "MIT",
794
794
  "dependencies": {
@@ -845,9 +845,9 @@
845
845
  }
846
846
  },
847
847
  "node_modules/decimal.js": {
848
- "version": "10.5.0",
849
- "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz",
850
- "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==",
848
+ "version": "10.6.0",
849
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz",
850
+ "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==",
851
851
  "dev": true,
852
852
  "license": "MIT"
853
853
  },
@@ -868,6 +868,19 @@
868
868
  "dev": true,
869
869
  "license": "MIT"
870
870
  },
871
+ "node_modules/entities": {
872
+ "version": "6.0.1",
873
+ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
874
+ "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
875
+ "dev": true,
876
+ "license": "BSD-2-Clause",
877
+ "engines": {
878
+ "node": ">=0.12"
879
+ },
880
+ "funding": {
881
+ "url": "https://github.com/fb55/entities?sponsor=1"
882
+ }
883
+ },
871
884
  "node_modules/esbuild": {
872
885
  "version": "0.24.2",
873
886
  "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz",
@@ -919,6 +932,19 @@
919
932
  "node": ">=6"
920
933
  }
921
934
  },
935
+ "node_modules/escape-string-regexp": {
936
+ "version": "4.0.0",
937
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
938
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
939
+ "dev": true,
940
+ "license": "MIT",
941
+ "engines": {
942
+ "node": ">=10"
943
+ },
944
+ "funding": {
945
+ "url": "https://github.com/sponsors/sindresorhus"
946
+ }
947
+ },
922
948
  "node_modules/fill-range": {
923
949
  "version": "7.1.1",
924
950
  "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
@@ -1346,19 +1372,6 @@
1346
1372
  "node": ">= 14.0.0"
1347
1373
  }
1348
1374
  },
1349
- "node_modules/mocha/node_modules/escape-string-regexp": {
1350
- "version": "4.0.0",
1351
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
1352
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
1353
- "dev": true,
1354
- "license": "MIT",
1355
- "engines": {
1356
- "node": ">=10"
1357
- },
1358
- "funding": {
1359
- "url": "https://github.com/sponsors/sindresorhus"
1360
- }
1361
- },
1362
1375
  "node_modules/ms": {
1363
1376
  "version": "2.1.3",
1364
1377
  "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -1377,9 +1390,9 @@
1377
1390
  }
1378
1391
  },
1379
1392
  "node_modules/nwsapi": {
1380
- "version": "2.2.20",
1381
- "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz",
1382
- "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==",
1393
+ "version": "2.2.22",
1394
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz",
1395
+ "integrity": "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==",
1383
1396
  "dev": true,
1384
1397
  "license": "MIT"
1385
1398
  },
@@ -1438,19 +1451,6 @@
1438
1451
  "url": "https://github.com/inikulin/parse5?sponsor=1"
1439
1452
  }
1440
1453
  },
1441
- "node_modules/parse5/node_modules/entities": {
1442
- "version": "6.0.1",
1443
- "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
1444
- "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
1445
- "dev": true,
1446
- "license": "BSD-2-Clause",
1447
- "engines": {
1448
- "node": ">=0.12"
1449
- },
1450
- "funding": {
1451
- "url": "https://github.com/fb55/entities?sponsor=1"
1452
- }
1453
- },
1454
1454
  "node_modules/path-exists": {
1455
1455
  "version": "4.0.0",
1456
1456
  "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -1791,9 +1791,9 @@
1791
1791
  "license": "ISC"
1792
1792
  },
1793
1793
  "node_modules/ws": {
1794
- "version": "8.18.2",
1795
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz",
1796
- "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==",
1794
+ "version": "8.18.3",
1795
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
1796
+ "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
1797
1797
  "dev": true,
1798
1798
  "license": "MIT",
1799
1799
  "engines": {
data/brut-js/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "brut-js",
3
- "version": "0.13.0",
3
+ "version": "0.15.0",
4
4
  "type": "module",
5
5
  "keywords": [
6
6
  "WebComponents",
@@ -0,0 +1,34 @@
1
+ import { withHTML } from "./SpecHelper.js"
2
+
3
+ describe("<brut-toast>", () => {
4
+ withHTML(`
5
+ <div>
6
+ <brut-i18n-translation key="toast.saved" value="Save successful"></brut-i18n-translation>
7
+ <brut-toast show-warnings>
8
+ <div>
9
+ <output><span>Message here</span></output>
10
+ <button>Close</button>
11
+ </div>
12
+ <button>Close</button>
13
+ </brut-toast>
14
+ </div>
15
+ `).test("setting the key shows the message, then it's removed when closed", ({window,document,assert}) => {
16
+
17
+ const toast = document.querySelector("brut-toast")
18
+ assert(toast, "brut-toast element should be present")
19
+
20
+ toast.setAttribute("key", "toast.saved")
21
+ const output = toast.querySelector("output")
22
+ assert.equal(output.textContent.trim(), "Save successful")
23
+ const message = output.querySelector("brut-message")
24
+ assert(message, "brut-message should be present")
25
+ console.log(message.outerHTML)
26
+ assert.equal(message.getAttribute("role"), "status")
27
+ assert.equal(message.getAttribute("aria-live"), "polite")
28
+ assert.equal(message.getAttribute("aria-atomic"), "true")
29
+
30
+ const button = toast.querySelector("button")
31
+ button.click()
32
+ assert.equal(toast.getAttribute("key"), null)
33
+ })
34
+ })
@@ -49,6 +49,9 @@ class I18nTranslation extends BaseCustomElement {
49
49
  * }
50
50
  */
51
51
  translation(interpolatedValues) {
52
+ if (!this.#value) {
53
+ this.logger.warn("No value attribute for key '%s', so translation will be blank", this.#key)
54
+ }
52
55
  return this.#value.replaceAll(/%\{([^}%]+)\}/g, (match,key) => {
53
56
  if (interpolatedValues[key]) {
54
57
  return interpolatedValues[key]