brut 0.0.20 → 0.0.22

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 (728) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +24 -3
  3. data/.nvim.lua +1 -0
  4. data/Dockerfile.dx +12 -3
  5. data/Gemfile.lock +9 -7
  6. data/README.md +0 -7
  7. data/Rakefile +6 -4
  8. data/bin/dev +20 -0
  9. data/bin/docs +27 -0
  10. data/bin/setup +47 -1
  11. data/brut-css/.nvim.lua +1 -0
  12. data/brut-css/README.md +28 -0
  13. data/brut-css/bin/build +31 -0
  14. data/brut-css/bin/dev +1 -0
  15. data/brut-css/bin/docs +15 -0
  16. data/brut-css/bin/setup +5 -0
  17. data/brut-css/config/media-queries-all.css +15 -0
  18. data/brut-css/config/media-queries-minimal.css +5 -0
  19. data/brut-css/config/postcss.config.cjs +7 -0
  20. data/brut-css/config/pseudo-classes-all.css +9 -0
  21. data/brut-css/dx +1 -0
  22. data/brut-css/package-lock.json +3217 -0
  23. data/brut-css/package.json +36 -0
  24. data/brut-css/src/css/appearance.css +145 -0
  25. data/brut-css/src/css/border.css +522 -0
  26. data/brut-css/src/css/colors.css +3502 -0
  27. data/brut-css/src/css/dimensions.css +548 -0
  28. data/brut-css/src/css/flex.css +179 -0
  29. data/brut-css/src/css/index.css +13 -0
  30. data/brut-css/src/css/layout.css +120 -0
  31. data/brut-css/src/css/list.css +41 -0
  32. data/brut-css/src/css/positioning.css +354 -0
  33. data/brut-css/src/css/properties/colors.css +455 -0
  34. data/brut-css/src/css/properties/index.css +3 -0
  35. data/brut-css/src/css/properties/spacing.css +140 -0
  36. data/brut-css/src/css/properties/typography.css +224 -0
  37. data/brut-css/src/css/reset.css +107 -0
  38. data/brut-css/src/css/spacing.css +585 -0
  39. data/brut-css/src/css/typography.css +519 -0
  40. data/brut-css/src/css/utils.css +104 -0
  41. data/brut-css/src/docs/1_getting-started/1_overview.md +46 -0
  42. data/brut-css/src/docs/1_getting-started/2_installation.md +25 -0
  43. data/brut-css/src/docs/1_getting-started/3_core-concepts.md +75 -0
  44. data/brut-css/src/docs/1_getting-started/4_simple-example.md +132 -0
  45. data/brut-css/src/docs/1_getting-started/page.html.ejs +10 -0
  46. data/brut-css/src/docs/2_properties/page.html.ejs +71 -0
  47. data/brut-css/src/docs/3_classes/color-demo.html.ejs +31 -0
  48. data/brut-css/src/docs/3_classes/page.html.ejs +87 -0
  49. data/brut-css/src/docs/4_customization/1_design-system.md +36 -0
  50. data/brut-css/src/docs/4_customization/2_breakpoints.md +75 -0
  51. data/brut-css/src/docs/4_customization/3_pseudo-classes.md +74 -0
  52. data/brut-css/src/docs/4_customization/4_advanced-configuration.md +40 -0
  53. data/brut-css/src/docs/4_customization/page.html.ejs +10 -0
  54. data/brut-css/src/docs/docs.css +98 -0
  55. data/brut-css/src/docs/includes/body-and-header.html.ejs +30 -0
  56. data/brut-css/src/docs/includes/footer-and-rest.html.ejs +9 -0
  57. data/brut-css/src/docs/includes/head.html.ejs +5 -0
  58. data/brut-css/src/docs/includes/nav.html.ejs +10 -0
  59. data/brut-css/src/docs/index.html.ejs +32 -0
  60. data/brut-css/src/docs/prism-twilight.min.css +1 -0
  61. data/brut-css/src/js/Logger.js +71 -0
  62. data/brut-css/src/js/build.js +111 -0
  63. data/brut-css/src/js/cli/CLIArgError.js +7 -0
  64. data/brut-css/src/js/cli/Debug.js +27 -0
  65. data/brut-css/src/js/cli/DocsDir.js +16 -0
  66. data/brut-css/src/js/cli/DocsTemplateSourceDir.js +16 -0
  67. data/brut-css/src/js/cli/InputFile.js +31 -0
  68. data/brut-css/src/js/cli/MediaQueryConfigFile.js +10 -0
  69. data/brut-css/src/js/cli/OutputFile.js +22 -0
  70. data/brut-css/src/js/cli/ParsedArg.js +17 -0
  71. data/brut-css/src/js/cli/PathToBrutCSSRoot.js +19 -0
  72. data/brut-css/src/js/cli/PseudoClassConfigFile.js +11 -0
  73. data/brut-css/src/js/cli.js +108 -0
  74. data/brut-css/src/js/docGenerator.js +467 -0
  75. data/brut-css/src/js/mediaQueryConfigParser.js +98 -0
  76. data/brut-css/src/js/post-css-plugins/addMediaQueriesPlugin.js +49 -0
  77. data/brut-css/src/js/post-css-plugins/addPseudoClassesPlugin.js +42 -0
  78. data/brut-css/src/js/post-css-plugins/generateDocumentationPlugin/Category.js +9 -0
  79. data/brut-css/src/js/post-css-plugins/generateDocumentationPlugin/DocState.js +185 -0
  80. data/brut-css/src/js/post-css-plugins/generateDocumentationPlugin/Documentable.js +8 -0
  81. data/brut-css/src/js/post-css-plugins/generateDocumentationPlugin/Group.js +7 -0
  82. data/brut-css/src/js/post-css-plugins/generateDocumentationPlugin/ParsedComment.js +73 -0
  83. data/brut-css/src/js/post-css-plugins/generateDocumentationPlugin/Property.js +9 -0
  84. data/brut-css/src/js/post-css-plugins/generateDocumentationPlugin/PropertyCategory.js +4 -0
  85. data/brut-css/src/js/post-css-plugins/generateDocumentationPlugin/PropertyGroup.js +8 -0
  86. data/brut-css/src/js/post-css-plugins/generateDocumentationPlugin/Rule.js +12 -0
  87. data/brut-css/src/js/post-css-plugins/generateDocumentationPlugin/RuleCategory.js +4 -0
  88. data/brut-css/src/js/post-css-plugins/generateDocumentationPlugin/RuleGroup.js +8 -0
  89. data/brut-css/src/js/post-css-plugins/generateDocumentationPlugin/SeeRef.js +5 -0
  90. data/brut-css/src/js/post-css-plugins/generateDocumentationPlugin/SeeURL.js +9 -0
  91. data/brut-css/src/js/post-css-plugins/generateDocumentationPlugin.js +49 -0
  92. data/brut-css/src/js/post-css-plugins/generateRootCustomPropertiesPlugin.js +45 -0
  93. data/brut-css/src/js/pseudoClassConfigParser.js +145 -0
  94. data/brut-js/.projections.json +10 -0
  95. data/brut-js/README.md +118 -0
  96. data/brut-js/bin/build +10 -0
  97. data/brut-js/bin/ci +5 -0
  98. data/brut-js/bin/setup +5 -0
  99. data/brut-js/docs/README.md +8 -0
  100. data/brut-js/docs/jsdoc-plugins/customElementTag.js +8 -0
  101. data/brut-js/docs/jsdoc-theme/publish.js +692 -0
  102. data/brut-js/docs/jsdoc-theme/static/scripts/linenumber.js +25 -0
  103. data/brut-js/docs/jsdoc-theme/static/scripts/prettify/Apache-License-2.0.txt +202 -0
  104. data/brut-js/docs/jsdoc-theme/static/scripts/prettify/lang-css.js +2 -0
  105. data/brut-js/docs/jsdoc-theme/static/scripts/prettify/prettify.js +28 -0
  106. data/brut-js/docs/jsdoc-theme/static/styles/jsdoc-default.css +327 -0
  107. data/brut-js/docs/jsdoc-theme/static/styles/prettify-jsdoc.css +111 -0
  108. data/brut-js/docs/jsdoc-theme/static/styles/prettify-tomorrow.css +132 -0
  109. data/brut-js/docs/jsdoc-theme/tmpl/augments.tmpl +10 -0
  110. data/brut-js/docs/jsdoc-theme/tmpl/container.tmpl +199 -0
  111. data/brut-js/docs/jsdoc-theme/tmpl/details.tmpl +143 -0
  112. data/brut-js/docs/jsdoc-theme/tmpl/example.tmpl +2 -0
  113. data/brut-js/docs/jsdoc-theme/tmpl/examples.tmpl +13 -0
  114. data/brut-js/docs/jsdoc-theme/tmpl/exceptions.tmpl +32 -0
  115. data/brut-js/docs/jsdoc-theme/tmpl/layout.tmpl +38 -0
  116. data/brut-js/docs/jsdoc-theme/tmpl/mainpage.tmpl +14 -0
  117. data/brut-js/docs/jsdoc-theme/tmpl/members.tmpl +38 -0
  118. data/brut-js/docs/jsdoc-theme/tmpl/method.tmpl +131 -0
  119. data/brut-js/docs/jsdoc-theme/tmpl/modifies.tmpl +14 -0
  120. data/brut-js/docs/jsdoc-theme/tmpl/params.tmpl +131 -0
  121. data/brut-js/docs/jsdoc-theme/tmpl/properties.tmpl +108 -0
  122. data/brut-js/docs/jsdoc-theme/tmpl/returns.tmpl +19 -0
  123. data/brut-js/docs/jsdoc-theme/tmpl/source.tmpl +8 -0
  124. data/brut-js/docs/jsdoc-theme/tmpl/tutorial.tmpl +19 -0
  125. data/brut-js/docs/jsdoc-theme/tmpl/type.tmpl +7 -0
  126. data/brut-js/docs/jsdoc.config.json +23 -0
  127. data/brut-js/docs/package-lock.json +343 -0
  128. data/brut-js/docs/package.json +7 -0
  129. data/brut-js/package-lock.json +2171 -0
  130. data/brut-js/package.json +32 -0
  131. data/brut-js/specs/AjaxSubmit.spec.js +256 -0
  132. data/brut-js/specs/Autosubmit.spec.js +127 -0
  133. data/brut-js/specs/ConfirmSubmit.spec.js +193 -0
  134. data/brut-js/specs/ConstraintViolationMessage.spec.js +33 -0
  135. data/brut-js/specs/ConstraintViolationMessages.spec.js +29 -0
  136. data/brut-js/specs/CopyToClipboard.spec.js +35 -0
  137. data/brut-js/specs/Form.spec.js +181 -0
  138. data/brut-js/specs/I18nTranslation.spec.js +19 -0
  139. data/brut-js/specs/LocaleDetection.spec.js +22 -0
  140. data/brut-js/specs/Message.spec.js +15 -0
  141. data/brut-js/specs/SpecHelper.js +23 -0
  142. data/brut-js/specs/Tabs.spec.js +41 -0
  143. data/brut-js/specs/config/asset_metadata.json +7 -0
  144. data/brut-js/src/AjaxSubmit.js +384 -0
  145. data/brut-js/src/Autosubmit.js +63 -0
  146. data/brut-js/src/BaseCustomElement.js +261 -0
  147. data/brut-js/src/ConfirmSubmit.js +116 -0
  148. data/brut-js/src/ConfirmationDialog.js +143 -0
  149. data/brut-js/src/ConstraintViolationMessage.js +125 -0
  150. data/brut-js/src/ConstraintViolationMessages.js +98 -0
  151. data/brut-js/src/CopyToClipboard.js +96 -0
  152. data/brut-js/src/Form.js +151 -0
  153. data/brut-js/src/I18nTranslation.js +61 -0
  154. data/brut-js/src/LocaleDetection.js +117 -0
  155. data/brut-js/src/Logger.js +90 -0
  156. data/brut-js/src/Message.js +56 -0
  157. data/brut-js/src/RichString.js +113 -0
  158. data/brut-js/src/Tabs.js +168 -0
  159. data/brut-js/src/Tracing.js +247 -0
  160. data/brut-js/src/appForTestingOnly.js +15 -0
  161. data/brut-js/src/index.js +130 -0
  162. data/brut-js/src/testing/AssetMetadata.js +35 -0
  163. data/brut-js/src/testing/AssetMetadataLoader.js +25 -0
  164. data/brut-js/src/testing/CustomElementTest.js +235 -0
  165. data/brut-js/src/testing/DOMCreator.js +45 -0
  166. data/brut-js/src/testing/index.js +48 -0
  167. data/brutrb.com/.vitepress/config.mjs +106 -0
  168. data/brutrb.com/.vitepress/plugins/jsdocLinker.js +34 -0
  169. data/brutrb.com/.vitepress/plugins/rdocLinker.js +18 -0
  170. data/brutrb.com/.vitepress/theme/custom.css +7 -0
  171. data/brutrb.com/.vitepress/theme/index.js +18 -0
  172. data/brutrb.com/.vitepress/theme/style.css +149 -0
  173. data/brutrb.com/ai.md +68 -0
  174. data/brutrb.com/assets.md +138 -0
  175. data/brutrb.com/bin/build +5 -0
  176. data/brutrb.com/bin/deploy +7 -0
  177. data/brutrb.com/bin/dev +5 -0
  178. data/brutrb.com/bin/setup +5 -0
  179. data/brutrb.com/brut-js.md +117 -0
  180. data/brutrb.com/business-logic.md +55 -0
  181. data/brutrb.com/cli.md +278 -0
  182. data/brutrb.com/components.md +243 -0
  183. data/brutrb.com/configuration.md +257 -0
  184. data/brutrb.com/css.md +103 -0
  185. data/brutrb.com/custom-element-tests.md +149 -0
  186. data/brutrb.com/database-access.md +201 -0
  187. data/brutrb.com/database-schema.md +312 -0
  188. data/brutrb.com/deployment.md +66 -0
  189. data/brutrb.com/dev-environment.md +179 -0
  190. data/brutrb.com/doc-conventions.md +39 -0
  191. data/brutrb.com/end-to-end-tests.md +174 -0
  192. data/brutrb.com/flash-and-session.md +224 -0
  193. data/brutrb.com/forms.md +866 -0
  194. data/brutrb.com/getting-started.md +66 -0
  195. data/brutrb.com/handlers.md +153 -0
  196. data/brutrb.com/hooks.md +178 -0
  197. data/brutrb.com/i18n.md +188 -0
  198. data/brutrb.com/images/Makefile +10 -0
  199. data/brutrb.com/images/dev-env-overview.dot +54 -0
  200. data/brutrb.com/images/dev-env-overview.png +0 -0
  201. data/brutrb.com/images/dev-env-protocol.dot +37 -0
  202. data/brutrb.com/images/dev-env-protocol.png +0 -0
  203. data/brutrb.com/images/logo-300.png +0 -0
  204. data/brutrb.com/images/logo.png +0 -0
  205. data/brutrb.com/images/overview.graffle +0 -0
  206. data/brutrb.com/images/overview.png +0 -0
  207. data/brutrb.com/images/spa.dot +19 -0
  208. data/brutrb.com/images/spa.png +0 -0
  209. data/brutrb.com/images/workspace-protocol.dot +44 -0
  210. data/brutrb.com/images/workspace-protocol.png +0 -0
  211. data/brutrb.com/index.md +36 -0
  212. data/brutrb.com/instrumentation.md +183 -0
  213. data/brutrb.com/javascript.md +122 -0
  214. data/brutrb.com/jobs.md +14 -0
  215. data/{doc-src → brutrb.com}/keyword-injection.md +122 -68
  216. data/brutrb.com/markdown-examples.md +85 -0
  217. data/brutrb.com/middleware.md +80 -0
  218. data/brutrb.com/not-released.md +5 -0
  219. data/brutrb.com/overview.md +404 -0
  220. data/brutrb.com/package-lock.json +2404 -0
  221. data/brutrb.com/package.json +11 -0
  222. data/brutrb.com/pages.md +378 -0
  223. data/brutrb.com/public/images/logo-300.png +0 -0
  224. data/brutrb.com/public/images/logo.png +0 -0
  225. data/brutrb.com/routes.md +215 -0
  226. data/brutrb.com/security.md +105 -0
  227. data/brutrb.com/seed-data.md +63 -0
  228. data/brutrb.com/space-time-continuum.md +85 -0
  229. data/brutrb.com/tutorial.md +3 -0
  230. data/brutrb.com/unit-tests.md +148 -0
  231. data/docker-compose.dx.yml +6 -3
  232. data/docs/404.html +21 -0
  233. data/docs/CNAME +1 -0
  234. data/docs/ai.html +24 -0
  235. data/docs/api/Brut/BackEnd/SeedData.html +493 -0
  236. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server/FlushSpans.html +214 -0
  237. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares/Server.html +125 -0
  238. data/docs/api/Brut/BackEnd/Sidekiq/Middlewares.html +125 -0
  239. data/docs/api/Brut/BackEnd/Sidekiq.html +125 -0
  240. data/docs/api/Brut/BackEnd/Validators/FormValidator.html +414 -0
  241. data/docs/api/Brut/BackEnd/Validators.html +128 -0
  242. data/docs/api/Brut/BackEnd.html +132 -0
  243. data/docs/api/Brut/CLI/App.html +1576 -0
  244. data/docs/api/Brut/CLI/AppRunner.html +491 -0
  245. data/docs/api/Brut/CLI/Apps/BuildAssets/All.html +264 -0
  246. data/docs/api/Brut/CLI/Apps/BuildAssets/CSS.html +306 -0
  247. data/docs/api/Brut/CLI/Apps/BuildAssets/Images.html +262 -0
  248. data/docs/api/Brut/CLI/Apps/BuildAssets/JS.html +314 -0
  249. data/docs/api/Brut/CLI/Apps/BuildAssets.html +183 -0
  250. data/docs/api/Brut/CLI/Apps/DB/Create.html +365 -0
  251. data/docs/api/Brut/CLI/Apps/DB/Drop.html +357 -0
  252. data/docs/api/Brut/CLI/Apps/DB/Migrate.html +383 -0
  253. data/docs/api/Brut/CLI/Apps/DB/NewMigration.html +335 -0
  254. data/docs/api/Brut/CLI/Apps/DB/Rebuild.html +329 -0
  255. data/docs/api/Brut/CLI/Apps/DB/Seed.html +347 -0
  256. data/docs/api/Brut/CLI/Apps/DB/Status.html +383 -0
  257. data/docs/api/Brut/CLI/Apps/DB.html +183 -0
  258. data/docs/api/Brut/CLI/Apps/Scaffold/Action/Route.html +303 -0
  259. data/docs/api/Brut/CLI/Apps/Scaffold/Action.html +512 -0
  260. data/docs/api/Brut/CLI/Apps/Scaffold/Component.html +398 -0
  261. data/docs/api/Brut/CLI/Apps/Scaffold/CustomElementTest.html +374 -0
  262. data/docs/api/Brut/CLI/Apps/Scaffold/E2ETest.html +410 -0
  263. data/docs/api/Brut/CLI/Apps/Scaffold/Form.html +262 -0
  264. data/docs/api/Brut/CLI/Apps/Scaffold/Page/Route.html +303 -0
  265. data/docs/api/Brut/CLI/Apps/Scaffold/Page.html +480 -0
  266. data/docs/api/Brut/CLI/Apps/Scaffold/RoutesEditor.html +450 -0
  267. data/docs/api/Brut/CLI/Apps/Scaffold/Test.html +380 -0
  268. data/docs/api/Brut/CLI/Apps/Scaffold.html +253 -0
  269. data/docs/api/Brut/CLI/Apps/Test/Audit.html +464 -0
  270. data/docs/api/Brut/CLI/Apps/Test/E2e.html +407 -0
  271. data/docs/api/Brut/CLI/Apps/Test/JS.html +262 -0
  272. data/docs/api/Brut/CLI/Apps/Test/Run.html +578 -0
  273. data/docs/api/Brut/CLI/Apps/Test.html +253 -0
  274. data/docs/api/Brut/CLI/Apps.html +125 -0
  275. data/docs/api/Brut/CLI/Command.html +2342 -0
  276. data/docs/api/Brut/CLI/Error.html +139 -0
  277. data/docs/api/Brut/CLI/ExecutionResults/Result.html +664 -0
  278. data/docs/api/Brut/CLI/ExecutionResults.html +675 -0
  279. data/docs/api/Brut/CLI/Executor.html +430 -0
  280. data/docs/api/Brut/CLI/InvalidOption.html +245 -0
  281. data/docs/api/Brut/CLI/Options.html +753 -0
  282. data/docs/api/Brut/CLI/Output.html +699 -0
  283. data/docs/api/Brut/CLI/SystemExecError.html +451 -0
  284. data/docs/api/Brut/CLI.html +263 -0
  285. data/docs/api/Brut/FactoryBot.html +225 -0
  286. data/docs/api/Brut/Framework/App.html +1097 -0
  287. data/docs/api/Brut/Framework/Config.html +1045 -0
  288. data/docs/api/Brut/Framework/Container.html +1379 -0
  289. data/docs/api/Brut/Framework/Error.html +140 -0
  290. data/docs/api/Brut/Framework/Errors/AbstractMethod.html +144 -0
  291. data/docs/api/Brut/Framework/Errors/Bug.html +234 -0
  292. data/docs/api/Brut/Framework/Errors/MissingConfiguration.html +257 -0
  293. data/docs/api/Brut/Framework/Errors/MissingParameter.html +273 -0
  294. data/docs/api/Brut/Framework/Errors/NoClassForPath.html +471 -0
  295. data/docs/api/Brut/Framework/Errors/NotFound.html +308 -0
  296. data/docs/api/Brut/Framework/Errors/NotImplemented.html +234 -0
  297. data/docs/api/Brut/Framework/Errors.html +328 -0
  298. data/docs/api/Brut/Framework/FussyTypeEnforcement.html +392 -0
  299. data/docs/api/Brut/Framework/MCP.html +861 -0
  300. data/docs/api/Brut/Framework/ProjectEnvironment.html +648 -0
  301. data/docs/api/Brut/Framework.html +129 -0
  302. data/docs/api/Brut/FrontEnd/AssetPathResolver.html +317 -0
  303. data/docs/api/Brut/FrontEnd/Component/Helpers.html +326 -0
  304. data/docs/api/Brut/FrontEnd/Component.html +365 -0
  305. data/docs/api/Brut/FrontEnd/Components/ConstraintViolations.html +470 -0
  306. data/docs/api/Brut/FrontEnd/Components/FormTag.html +518 -0
  307. data/docs/api/Brut/FrontEnd/Components/I18nTranslations.html +317 -0
  308. data/docs/api/Brut/FrontEnd/Components/Input.html +195 -0
  309. data/docs/api/Brut/FrontEnd/Components/Inputs/CsrfToken.html +339 -0
  310. data/docs/api/Brut/FrontEnd/Components/Inputs/InputTag.html +660 -0
  311. data/docs/api/Brut/FrontEnd/Components/Inputs/RadioButton.html +417 -0
  312. data/docs/api/Brut/FrontEnd/Components/Inputs/SelectTagWithOptions.html +918 -0
  313. data/docs/api/Brut/FrontEnd/Components/Inputs/TextareaTag.html +651 -0
  314. data/docs/api/Brut/FrontEnd/Components/Inputs.html +125 -0
  315. data/docs/api/Brut/FrontEnd/Components/LocaleDetection.html +367 -0
  316. data/docs/api/Brut/FrontEnd/Components/PageIdentifier.html +336 -0
  317. data/docs/api/Brut/FrontEnd/Components/TimeTag.html +655 -0
  318. data/docs/api/Brut/FrontEnd/Components/Traceparent.html +352 -0
  319. data/docs/api/Brut/FrontEnd/Components.html +135 -0
  320. data/docs/api/Brut/FrontEnd/Download.html +467 -0
  321. data/docs/api/Brut/FrontEnd/Flash.html +1150 -0
  322. data/docs/api/Brut/FrontEnd/Form.html +1157 -0
  323. data/docs/api/Brut/FrontEnd/Forms/ConstraintViolation.html +634 -0
  324. data/docs/api/Brut/FrontEnd/Forms/Input.html +615 -0
  325. data/docs/api/Brut/FrontEnd/Forms/InputDeclarations.html +547 -0
  326. data/docs/api/Brut/FrontEnd/Forms/InputDefinition.html +1318 -0
  327. data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInput.html +609 -0
  328. data/docs/api/Brut/FrontEnd/Forms/RadioButtonGroupInputDefinition.html +587 -0
  329. data/docs/api/Brut/FrontEnd/Forms/SelectInput.html +613 -0
  330. data/docs/api/Brut/FrontEnd/Forms/SelectInputDefinition.html +582 -0
  331. data/docs/api/Brut/FrontEnd/Forms/ValidityState.html +609 -0
  332. data/docs/api/Brut/FrontEnd/Forms.html +127 -0
  333. data/docs/api/Brut/FrontEnd/GenericResponse.html +377 -0
  334. data/docs/api/Brut/FrontEnd/Handler.html +442 -0
  335. data/docs/api/Brut/FrontEnd/Handlers/CspReportingHandler.html +318 -0
  336. data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler/TraceParent.html +336 -0
  337. data/docs/api/Brut/FrontEnd/Handlers/InstrumentationHandler.html +399 -0
  338. data/docs/api/Brut/FrontEnd/Handlers/LocaleDetectionHandler.html +354 -0
  339. data/docs/api/Brut/FrontEnd/Handlers/MissingHandler/Form.html +151 -0
  340. data/docs/api/Brut/FrontEnd/Handlers/MissingHandler.html +315 -0
  341. data/docs/api/Brut/FrontEnd/Handlers.html +125 -0
  342. data/docs/api/Brut/FrontEnd/HandlingResults.html +339 -0
  343. data/docs/api/Brut/FrontEnd/HttpMethod.html +661 -0
  344. data/docs/api/Brut/FrontEnd/HttpStatus.html +496 -0
  345. data/docs/api/Brut/FrontEnd/InlineSvgLocator.html +284 -0
  346. data/docs/api/Brut/FrontEnd/Layout.html +318 -0
  347. data/docs/api/Brut/FrontEnd/Middleware.html +135 -0
  348. data/docs/api/Brut/FrontEnd/Middlewares/AnnotateBrutOwnedPaths.html +288 -0
  349. data/docs/api/Brut/FrontEnd/Middlewares/Favicon.html +292 -0
  350. data/docs/api/Brut/FrontEnd/Middlewares/OpenTelemetrySpan.html +324 -0
  351. data/docs/api/Brut/FrontEnd/Middlewares/ReloadApp.html +372 -0
  352. data/docs/api/Brut/FrontEnd/Middlewares.html +125 -0
  353. data/docs/api/Brut/FrontEnd/Page.html +773 -0
  354. data/docs/api/Brut/FrontEnd/Pages/MissingPage.html +797 -0
  355. data/docs/api/Brut/FrontEnd/Pages.html +125 -0
  356. data/docs/api/Brut/FrontEnd/RequestContext.html +1312 -0
  357. data/docs/api/Brut/FrontEnd/RouteHook.html +424 -0
  358. data/docs/api/Brut/FrontEnd/RouteHooks/AgeFlash.html +242 -0
  359. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineScripts.html +249 -0
  360. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts/ReportOnly.html +264 -0
  361. data/docs/api/Brut/FrontEnd/RouteHooks/CSPNoInlineStylesOrScripts.html +261 -0
  362. data/docs/api/Brut/FrontEnd/RouteHooks/LocaleDetection.html +284 -0
  363. data/docs/api/Brut/FrontEnd/RouteHooks/SetupRequestContext.html +252 -0
  364. data/docs/api/Brut/FrontEnd/RouteHooks.html +115 -0
  365. data/docs/api/Brut/FrontEnd/Routing/FormHandlerRoute.html +227 -0
  366. data/docs/api/Brut/FrontEnd/Routing/FormRoute.html +305 -0
  367. data/docs/api/Brut/FrontEnd/Routing/MissingForm.html +324 -0
  368. data/docs/api/Brut/FrontEnd/Routing/MissingHandler.html +319 -0
  369. data/docs/api/Brut/FrontEnd/Routing/MissingPage.html +315 -0
  370. data/docs/api/Brut/FrontEnd/Routing/MissingPath.html +315 -0
  371. data/docs/api/Brut/FrontEnd/Routing/PageRoute.html +327 -0
  372. data/docs/api/Brut/FrontEnd/Routing/Route.html +761 -0
  373. data/docs/api/Brut/FrontEnd/Routing.html +927 -0
  374. data/docs/api/Brut/FrontEnd/Session.html +1195 -0
  375. data/docs/api/Brut/FrontEnd.html +134 -0
  376. data/docs/api/Brut/I18n/BaseMethods.html +931 -0
  377. data/docs/api/Brut/I18n/ForBackEnd.html +302 -0
  378. data/docs/api/Brut/I18n/ForCLI.html +302 -0
  379. data/docs/api/Brut/I18n/ForHTML.html +296 -0
  380. data/docs/api/Brut/I18n/HTTPAcceptLanguage/AlwaysEnglish.html +316 -0
  381. data/docs/api/Brut/I18n/HTTPAcceptLanguage.html +930 -0
  382. data/docs/api/Brut/I18n.html +127 -0
  383. data/docs/api/Brut/Instrumentation/LoggerSpanExporter.html +435 -0
  384. data/docs/api/Brut/Instrumentation/OpenTelemetry/NormalizedAttributes.html +286 -0
  385. data/docs/api/Brut/Instrumentation/OpenTelemetry/Span.html +302 -0
  386. data/docs/api/Brut/Instrumentation/OpenTelemetry.html +864 -0
  387. data/docs/api/Brut/Instrumentation.html +126 -0
  388. data/docs/api/Brut/SinatraHelpers/ClassMethods.html +532 -0
  389. data/docs/api/Brut/SinatraHelpers.html +281 -0
  390. data/docs/api/Brut/SpecSupport/ClockSupport.html +383 -0
  391. data/docs/api/Brut/SpecSupport/ComponentSupport.html +502 -0
  392. data/docs/api/Brut/SpecSupport/E2ETestServer.html +503 -0
  393. data/docs/api/Brut/SpecSupport/E2eSupport.html +142 -0
  394. data/docs/api/Brut/SpecSupport/EnhancedNode.html +403 -0
  395. data/docs/api/Brut/SpecSupport/FlashSupport.html +278 -0
  396. data/docs/api/Brut/SpecSupport/GeneralSupport/ClassMethods.html +401 -0
  397. data/docs/api/Brut/SpecSupport/GeneralSupport.html +195 -0
  398. data/docs/api/Brut/SpecSupport/HandlerSupport.html +160 -0
  399. data/docs/api/Brut/SpecSupport/Matchers/HaveConstraintViolation.html +553 -0
  400. data/docs/api/Brut/SpecSupport/Matchers/HaveHTMLAttribute.html +439 -0
  401. data/docs/api/Brut/SpecSupport/Matchers.html +125 -0
  402. data/docs/api/Brut/SpecSupport/RSpecSetup/OptionalSidekiqSupport.html +335 -0
  403. data/docs/api/Brut/SpecSupport/RSpecSetup.html +602 -0
  404. data/docs/api/Brut/SpecSupport/SessionSupport.html +196 -0
  405. data/docs/api/Brut/SpecSupport.html +129 -0
  406. data/docs/api/Brut.html +225 -0
  407. data/docs/api/Clock.html +603 -0
  408. data/docs/api/RichString.html +968 -0
  409. data/docs/api/SemanticLogger/Appender/Async.html +219 -0
  410. data/docs/api/Sequel/Extensions/BrutInstrumentation.html +115 -0
  411. data/docs/api/Sequel/Extensions/BrutMigrations.html +533 -0
  412. data/docs/api/Sequel/Extensions.html +117 -0
  413. data/docs/api/Sequel/Plugins/CreatedAt/InstanceMethods.html +105 -0
  414. data/docs/api/Sequel/Plugins/CreatedAt.html +125 -0
  415. data/docs/api/Sequel/Plugins/ExternalId/ClassMethods.html +207 -0
  416. data/docs/api/Sequel/Plugins/ExternalId/InstanceMethods.html +186 -0
  417. data/docs/api/Sequel/Plugins/ExternalId.html +218 -0
  418. data/docs/api/Sequel/Plugins/FindBang/ClassMethods.html +202 -0
  419. data/docs/api/Sequel/Plugins/FindBang.html +125 -0
  420. data/docs/api/Sequel/Plugins.html +117 -0
  421. data/docs/api/Sequel.html +117 -0
  422. data/docs/api/_index.html +1553 -0
  423. data/docs/api/class_list.html +54 -0
  424. data/docs/api/css/common.css +1 -0
  425. data/docs/api/css/full_list.css +58 -0
  426. data/docs/api/css/style.css +503 -0
  427. data/docs/api/file.README.html +127 -0
  428. data/docs/api/file_list.html +59 -0
  429. data/docs/api/frames.html +22 -0
  430. data/docs/api/index.html +127 -0
  431. data/docs/api/js/app.js +344 -0
  432. data/docs/api/js/full_list.js +242 -0
  433. data/docs/api/js/jquery.js +4 -0
  434. data/docs/api/method_list.html +3998 -0
  435. data/docs/api/top-level-namespace.html +112 -0
  436. data/docs/assets/ai.md.tZrjP9im.js +1 -0
  437. data/docs/assets/ai.md.tZrjP9im.lean.js +1 -0
  438. data/docs/assets/app.D_yaTITQ.js +1 -0
  439. data/docs/assets/assets.md.D3wunzLx.js +19 -0
  440. data/docs/assets/assets.md.D3wunzLx.lean.js +1 -0
  441. data/docs/assets/brut-js.md.o2DAO2s2.js +12 -0
  442. data/docs/assets/brut-js.md.o2DAO2s2.lean.js +1 -0
  443. data/docs/assets/business-logic.md.BY4hGy0m.js +1 -0
  444. data/docs/assets/business-logic.md.BY4hGy0m.lean.js +1 -0
  445. data/docs/assets/chunks/@localSearchIndexroot.BsN5i0Fi.js +1 -0
  446. data/docs/assets/chunks/VPLocalSearchBox.B2-ZzyTY.js +8 -0
  447. data/docs/assets/chunks/framework.1L-BeKqY.js +18 -0
  448. data/docs/assets/chunks/theme.CfGFVRvE.js +2 -0
  449. data/docs/assets/cli.md.RmeA2b0i.js +127 -0
  450. data/docs/assets/cli.md.RmeA2b0i.lean.js +1 -0
  451. data/docs/assets/components.md.eCttGlN-.js +104 -0
  452. data/docs/assets/components.md.eCttGlN-.lean.js +1 -0
  453. data/docs/assets/configuration.md.BRriU0cL.js +78 -0
  454. data/docs/assets/configuration.md.BRriU0cL.lean.js +1 -0
  455. data/docs/assets/css.md.DJgj2clw.js +21 -0
  456. data/docs/assets/css.md.DJgj2clw.lean.js +1 -0
  457. data/docs/assets/custom-element-tests.md.BrYJQEl3.js +69 -0
  458. data/docs/assets/custom-element-tests.md.BrYJQEl3.lean.js +1 -0
  459. data/docs/assets/database-access.md.C7l-Vuvb.js +63 -0
  460. data/docs/assets/database-access.md.C7l-Vuvb.lean.js +1 -0
  461. data/docs/assets/database-schema.md.BUjR0VS1.js +63 -0
  462. data/docs/assets/database-schema.md.BUjR0VS1.lean.js +1 -0
  463. data/docs/assets/deployment.md.Dbka4OTr.js +1 -0
  464. data/docs/assets/deployment.md.Dbka4OTr.lean.js +1 -0
  465. data/docs/assets/dev-env-overview.Gj7NWM8-.png +0 -0
  466. data/docs/assets/dev-env-protocol.DysDAtnz.png +0 -0
  467. data/docs/assets/dev-environment.md.BNc8AYiK.js +11 -0
  468. data/docs/assets/dev-environment.md.BNc8AYiK.lean.js +1 -0
  469. data/docs/assets/doc-conventions.md.DCfRXXi-.js +1 -0
  470. data/docs/assets/doc-conventions.md.DCfRXXi-.lean.js +1 -0
  471. data/docs/assets/end-to-end-tests.md.yfQHC0b5.js +26 -0
  472. data/docs/assets/end-to-end-tests.md.yfQHC0b5.lean.js +1 -0
  473. data/docs/assets/flash-and-session.md.BXY8RvT0.js +93 -0
  474. data/docs/assets/flash-and-session.md.BXY8RvT0.lean.js +1 -0
  475. data/docs/assets/forms.md.CBTYQ_Cz.js +379 -0
  476. data/docs/assets/forms.md.CBTYQ_Cz.lean.js +1 -0
  477. data/docs/assets/getting-started.md.Bz2s1Vjb.js +2 -0
  478. data/docs/assets/getting-started.md.Bz2s1Vjb.lean.js +1 -0
  479. data/docs/assets/handlers.md.089DVD3v.js +69 -0
  480. data/docs/assets/handlers.md.089DVD3v.lean.js +1 -0
  481. data/docs/assets/hooks.md.C4-moMny.js +80 -0
  482. data/docs/assets/hooks.md.C4-moMny.lean.js +1 -0
  483. data/docs/assets/i18n.md.Do9i1qWl.js +23 -0
  484. data/docs/assets/i18n.md.Do9i1qWl.lean.js +1 -0
  485. data/docs/assets/index.md.B28EwVpq.js +1 -0
  486. data/docs/assets/index.md.B28EwVpq.lean.js +1 -0
  487. data/docs/assets/instrumentation.md.CL6ax7nT.js +35 -0
  488. data/docs/assets/instrumentation.md.CL6ax7nT.lean.js +1 -0
  489. data/docs/assets/javascript.md.GWbhRS51.js +31 -0
  490. data/docs/assets/javascript.md.GWbhRS51.lean.js +1 -0
  491. data/docs/assets/jobs.md.S-2amAYp.js +1 -0
  492. data/docs/assets/jobs.md.S-2amAYp.lean.js +1 -0
  493. data/docs/assets/keyword-injection.md.Dt2tKREs.js +25 -0
  494. data/docs/assets/keyword-injection.md.Dt2tKREs.lean.js +1 -0
  495. data/docs/assets/markdown-examples.md.CCFEQO44.js +33 -0
  496. data/docs/assets/markdown-examples.md.CCFEQO44.lean.js +1 -0
  497. data/docs/assets/middleware.md.Czz_UlJN.js +20 -0
  498. data/docs/assets/middleware.md.Czz_UlJN.lean.js +1 -0
  499. data/docs/assets/not-released.md.BBy28McC.js +1 -0
  500. data/docs/assets/not-released.md.BBy28McC.lean.js +1 -0
  501. data/docs/assets/overview.Da81cB9R.png +0 -0
  502. data/docs/assets/overview.md.CDalkuxV.js +133 -0
  503. data/docs/assets/overview.md.CDalkuxV.lean.js +1 -0
  504. data/docs/assets/pages.md.BE3kfOc5.js +122 -0
  505. data/docs/assets/pages.md.BE3kfOc5.lean.js +1 -0
  506. data/docs/assets/routes.md.BMM7peut.js +29 -0
  507. data/docs/assets/routes.md.BMM7peut.lean.js +1 -0
  508. data/docs/assets/security.md.C668yXCi.js +1 -0
  509. data/docs/assets/security.md.C668yXCi.lean.js +1 -0
  510. data/docs/assets/seed-data.md.BvFZlqIk.js +14 -0
  511. data/docs/assets/seed-data.md.BvFZlqIk.lean.js +1 -0
  512. data/docs/assets/spa.qejUdp-5.png +0 -0
  513. data/docs/assets/space-time-continuum.md.KPUIKysQ.js +1 -0
  514. data/docs/assets/space-time-continuum.md.KPUIKysQ.lean.js +1 -0
  515. data/docs/assets/style.D73IYGCX.css +1 -0
  516. data/docs/assets/tutorial.md.BnoGjrdK.js +1 -0
  517. data/docs/assets/tutorial.md.BnoGjrdK.lean.js +1 -0
  518. data/docs/assets/unit-tests.md.DUGrnLj5.js +13 -0
  519. data/docs/assets/unit-tests.md.DUGrnLj5.lean.js +1 -0
  520. data/docs/assets/workspace-protocol.C0gXsoDb.png +0 -0
  521. data/docs/assets.html +42 -0
  522. data/docs/brut-css/brut.css +1 -0
  523. data/docs/brut-css/brut.max.css +22372 -0
  524. data/docs/brut-css/classes/appearances.html +783 -0
  525. data/docs/brut-css/classes/background-colors.html +3529 -0
  526. data/docs/brut-css/classes/border-colors.html +3529 -0
  527. data/docs/brut-css/classes/borders.html +2293 -0
  528. data/docs/brut-css/classes/dimensions.html +2581 -0
  529. data/docs/brut-css/classes/flex.html +917 -0
  530. data/docs/brut-css/classes/foreground-colors.html +3261 -0
  531. data/docs/brut-css/classes/junk-drawer.html +431 -0
  532. data/docs/brut-css/classes/layout.html +668 -0
  533. data/docs/brut-css/classes/lists.html +331 -0
  534. data/docs/brut-css/classes/positioning.html +1751 -0
  535. data/docs/brut-css/classes/spacings.html +2633 -0
  536. data/docs/brut-css/classes/typography.html +2206 -0
  537. data/docs/brut-css/customization/advanced-configuration.html +204 -0
  538. data/docs/brut-css/customization/breakpoints.html +227 -0
  539. data/docs/brut-css/customization/design-system.html +197 -0
  540. data/docs/brut-css/customization/pseudo-classes.html +228 -0
  541. data/docs/brut-css/docs.css +98 -0
  542. data/docs/brut-css/getting-started/core-concepts.html +234 -0
  543. data/docs/brut-css/getting-started/installation.html +190 -0
  544. data/docs/brut-css/getting-started/overview.html +210 -0
  545. data/docs/brut-css/getting-started/simple-example.html +285 -0
  546. data/docs/brut-css/index.html +193 -0
  547. data/docs/brut-css/prism-twilight.min.css +1 -0
  548. data/docs/brut-css/properties/colors.html +1548 -0
  549. data/docs/brut-css/properties/spacings.html +614 -0
  550. data/docs/brut-css/properties/typography.html +777 -0
  551. data/docs/brut-js/api/AjaxSubmit.html +374 -0
  552. data/docs/brut-js/api/AjaxSubmit.js.html +435 -0
  553. data/docs/brut-js/api/Autosubmit.html +192 -0
  554. data/docs/brut-js/api/Autosubmit.js.html +114 -0
  555. data/docs/brut-js/api/BaseCustomElement.html +1091 -0
  556. data/docs/brut-js/api/BaseCustomElement.js.html +312 -0
  557. data/docs/brut-js/api/BrutCustomElements.html +172 -0
  558. data/docs/brut-js/api/BufferedLogger.html +173 -0
  559. data/docs/brut-js/api/ConfirmSubmit.html +278 -0
  560. data/docs/brut-js/api/ConfirmSubmit.js.html +167 -0
  561. data/docs/brut-js/api/ConfirmationDialog.html +425 -0
  562. data/docs/brut-js/api/ConfirmationDialog.js.html +194 -0
  563. data/docs/brut-js/api/ConstraintViolationMessage.html +448 -0
  564. data/docs/brut-js/api/ConstraintViolationMessage.js.html +176 -0
  565. data/docs/brut-js/api/ConstraintViolationMessages.html +590 -0
  566. data/docs/brut-js/api/ConstraintViolationMessages.js.html +149 -0
  567. data/docs/brut-js/api/CopyToClipboard.html +345 -0
  568. data/docs/brut-js/api/CopyToClipboard.js.html +147 -0
  569. data/docs/brut-js/api/Form.html +294 -0
  570. data/docs/brut-js/api/Form.js.html +202 -0
  571. data/docs/brut-js/api/I18nTranslation.html +409 -0
  572. data/docs/brut-js/api/I18nTranslation.js.html +112 -0
  573. data/docs/brut-js/api/LocaleDetection.html +312 -0
  574. data/docs/brut-js/api/LocaleDetection.js.html +168 -0
  575. data/docs/brut-js/api/Logger.html +702 -0
  576. data/docs/brut-js/api/Logger.js.html +141 -0
  577. data/docs/brut-js/api/Message.html +238 -0
  578. data/docs/brut-js/api/Message.js.html +107 -0
  579. data/docs/brut-js/api/PrefixedLogger.html +369 -0
  580. data/docs/brut-js/api/RichString.html +1049 -0
  581. data/docs/brut-js/api/RichString.js.html +164 -0
  582. data/docs/brut-js/api/Tabs.html +295 -0
  583. data/docs/brut-js/api/Tabs.js.html +219 -0
  584. data/docs/brut-js/api/Tracing.html +277 -0
  585. data/docs/brut-js/api/Tracing.js.html +298 -0
  586. data/docs/brut-js/api/external-CustomElementRegistry.html +140 -0
  587. data/docs/brut-js/api/external-Performance.html +138 -0
  588. data/docs/brut-js/api/external-Promise.html +138 -0
  589. data/docs/brut-js/api/external-ValidityState.html +138 -0
  590. data/docs/brut-js/api/external-Window.html +233 -0
  591. data/docs/brut-js/api/external-fetch.html +138 -0
  592. data/docs/brut-js/api/global.html +400 -0
  593. data/docs/brut-js/api/index.html +168 -0
  594. data/docs/brut-js/api/index.js.html +181 -0
  595. data/docs/brut-js/api/module-testing.html +383 -0
  596. data/docs/brut-js/api/scripts/linenumber.js +25 -0
  597. data/docs/brut-js/api/scripts/prettify/Apache-License-2.0.txt +202 -0
  598. data/docs/brut-js/api/scripts/prettify/lang-css.js +2 -0
  599. data/docs/brut-js/api/scripts/prettify/prettify.js +28 -0
  600. data/docs/brut-js/api/styles/jsdoc-default.css +327 -0
  601. data/docs/brut-js/api/styles/prettify-jsdoc.css +111 -0
  602. data/docs/brut-js/api/styles/prettify-tomorrow.css +132 -0
  603. data/docs/brut-js/api/testing.AssetMetadata.html +172 -0
  604. data/docs/brut-js/api/testing.AssetMetadataLoader.html +171 -0
  605. data/docs/brut-js/api/testing.CustomElementTest.html +679 -0
  606. data/docs/brut-js/api/testing.DOMCreator.html +171 -0
  607. data/docs/brut-js/api/testing_AssetMetadata.js.html +86 -0
  608. data/docs/brut-js/api/testing_AssetMetadataLoader.js.html +76 -0
  609. data/docs/brut-js/api/testing_CustomElementTest.js.html +286 -0
  610. data/docs/brut-js/api/testing_DOMCreator.js.html +96 -0
  611. data/docs/brut-js/api/testing_index.js.html +99 -0
  612. data/docs/brut-js.html +35 -0
  613. data/docs/business-logic.html +24 -0
  614. data/docs/cli.html +150 -0
  615. data/docs/components.html +127 -0
  616. data/docs/configuration.html +101 -0
  617. data/docs/css.html +44 -0
  618. data/docs/custom-element-tests.html +92 -0
  619. data/docs/database-access.html +86 -0
  620. data/docs/database-schema.html +86 -0
  621. data/docs/deployment.html +24 -0
  622. data/docs/dev-environment.html +34 -0
  623. data/docs/doc-conventions.html +24 -0
  624. data/docs/end-to-end-tests.html +49 -0
  625. data/docs/flash-and-session.html +116 -0
  626. data/docs/forms.html +402 -0
  627. data/docs/getting-started.html +25 -0
  628. data/docs/handlers.html +92 -0
  629. data/docs/hashmap.json +1 -0
  630. data/docs/hooks.html +103 -0
  631. data/docs/i18n.html +46 -0
  632. data/docs/images/logo-300.png +0 -0
  633. data/docs/images/logo.png +0 -0
  634. data/docs/index.html +24 -0
  635. data/docs/instrumentation.html +58 -0
  636. data/docs/javascript.html +54 -0
  637. data/docs/jobs.html +24 -0
  638. data/docs/keyword-injection.html +48 -0
  639. data/docs/markdown-examples.html +56 -0
  640. data/docs/middleware.html +43 -0
  641. data/docs/not-released.html +24 -0
  642. data/docs/overview.html +156 -0
  643. data/docs/pages.html +145 -0
  644. data/docs/routes.html +52 -0
  645. data/docs/security.html +24 -0
  646. data/docs/seed-data.html +37 -0
  647. data/docs/space-time-continuum.html +24 -0
  648. data/docs/tutorial.html +24 -0
  649. data/docs/unit-tests.html +36 -0
  650. data/docs/vp-icons.css +1 -0
  651. data/lib/brut/back_end/seed_data.rb +19 -2
  652. data/lib/brut/back_end/sidekiq/middlewares/server.rb +2 -1
  653. data/lib/brut/back_end/sidekiq/middlewares.rb +2 -1
  654. data/lib/brut/back_end/sidekiq.rb +2 -1
  655. data/lib/brut/back_end/validator.rb +5 -1
  656. data/lib/brut/back_end.rb +4 -2
  657. data/lib/brut/cli/app_runner.rb +1 -1
  658. data/lib/brut/cli/apps/test.rb +5 -0
  659. data/lib/brut/cli.rb +4 -3
  660. data/lib/brut/factory_bot.rb +0 -5
  661. data/lib/brut/framework/app.rb +70 -5
  662. data/lib/brut/framework/config.rb +5 -3
  663. data/lib/brut/framework/container.rb +3 -2
  664. data/lib/brut/framework/errors.rb +12 -4
  665. data/lib/brut/framework/mcp.rb +58 -1
  666. data/lib/brut/framework/project_environment.rb +6 -2
  667. data/lib/brut/framework.rb +1 -1
  668. data/lib/brut/front_end/component.rb +69 -71
  669. data/lib/brut/front_end/components/constraint_violations.rb +1 -4
  670. data/lib/brut/front_end/components/form_tag.rb +1 -1
  671. data/lib/brut/front_end/components/input.rb +3 -3
  672. data/lib/brut/front_end/components/inputs/csrf_token.rb +1 -1
  673. data/lib/brut/front_end/components/inputs/{text_field.rb → input_tag.rb} +7 -9
  674. data/lib/brut/front_end/components/inputs/radio_button.rb +1 -1
  675. data/lib/brut/front_end/components/inputs/select_tag_with_options.rb +187 -0
  676. data/lib/brut/front_end/components/inputs/{textarea.rb → textarea_tag.rb} +2 -2
  677. data/lib/brut/front_end/components/time_tag.rb +2 -1
  678. data/lib/brut/front_end/form.rb +4 -4
  679. data/lib/brut/front_end/forms/input.rb +2 -1
  680. data/lib/brut/front_end/forms/input_definition.rb +5 -2
  681. data/lib/brut/front_end/forms/radio_button_group_input.rb +2 -1
  682. data/lib/brut/front_end/forms/radio_button_group_input_definition.rb +2 -2
  683. data/lib/brut/front_end/forms/select_input.rb +2 -4
  684. data/lib/brut/front_end/forms/select_input_definition.rb +2 -2
  685. data/lib/brut/front_end/handler.rb +28 -26
  686. data/lib/brut/front_end/handlers/csp_reporting_handler.rb +5 -2
  687. data/lib/brut/front_end/handlers/instrumentation_handler.rb +8 -4
  688. data/lib/brut/front_end/handlers/locale_detection_handler.rb +9 -5
  689. data/lib/brut/front_end/handlers/missing_handler.rb +5 -2
  690. data/lib/brut/front_end/layout.rb +16 -0
  691. data/lib/brut/front_end/page.rb +52 -29
  692. data/lib/brut/front_end/request_context.rb +3 -2
  693. data/lib/brut/front_end/routing.rb +5 -1
  694. data/lib/brut/front_end.rb +4 -13
  695. data/lib/brut/i18n/base_methods.rb +167 -79
  696. data/lib/brut/i18n/for_back_end.rb +4 -0
  697. data/lib/brut/i18n/for_cli.rb +4 -0
  698. data/lib/brut/i18n/for_html.rb +32 -4
  699. data/lib/brut/i18n/http_accept_language.rb +47 -0
  700. data/lib/brut/instrumentation/open_telemetry.rb +36 -1
  701. data/lib/brut/instrumentation.rb +3 -5
  702. data/lib/brut/sinatra_helpers.rb +11 -3
  703. data/lib/brut/spec_support/component_support.rb +30 -16
  704. data/lib/brut/spec_support/e2e_support.rb +1 -1
  705. data/lib/brut/spec_support/e2e_test_server.rb +3 -0
  706. data/lib/brut/spec_support/general_support.rb +3 -0
  707. data/lib/brut/spec_support/handler_support.rb +6 -1
  708. data/lib/brut/spec_support/matcher.rb +1 -0
  709. data/lib/brut/spec_support/matchers/be_page_for.rb +1 -0
  710. data/lib/brut/spec_support/matchers/have_html_attribute.rb +1 -0
  711. data/lib/brut/spec_support/matchers/have_i18n_string.rb +2 -5
  712. data/lib/brut/spec_support/matchers/have_link_to.rb +1 -0
  713. data/lib/brut/spec_support/matchers/have_redirected_to.rb +1 -0
  714. data/lib/brut/spec_support/matchers/have_rendered.rb +1 -0
  715. data/lib/brut/spec_support/matchers/have_returned_rack_response.rb +44 -0
  716. data/lib/brut/spec_support.rb +1 -1
  717. data/lib/brut/version.rb +1 -1
  718. data/lib/brut.rb +5 -4
  719. data/lib/sequel/extensions/brut_migrations.rb +1 -1
  720. metadata +648 -13
  721. data/doc-src/architecture.md +0 -102
  722. data/doc-src/assets.md +0 -98
  723. data/doc-src/forms.md +0 -214
  724. data/doc-src/handlers.md +0 -83
  725. data/doc-src/javascript.md +0 -265
  726. data/doc-src/pages.md +0 -210
  727. data/doc-src/route-hooks.md +0 -59
  728. data/lib/brut/front_end/components/inputs/select.rb +0 -117
@@ -0,0 +1,75 @@
1
+ ## Core Concepts
2
+
3
+ BrutCSS is heavily inspried by [Tachyons](https://tachyons.io), which is similar to TailwindCSS at a very high level, but
4
+ conceptually different. Brut's goal is not to eliminate CSS from your project. Instead, it's to allow you to iterate quickly
5
+ on design in the browser.
6
+
7
+ BrutCSS achieves based on two values:
8
+
9
+ * **You don't need 200 font sizes.** Brut provides you with 10, which is probably enough for most design problems.
10
+ * **You (should) already know CSS.** In BrutCSS, to get a `font-weight` of 300, you'd use the class `fw-300`, which you can
11
+ quickly learn stands for **f**ont-**w**eight **300**. In Tailwind, you have to look up what class to use (it's `font-light`).
12
+
13
+ With these values at the front of the design, this leads to two mindsets:
14
+
15
+ * **Designing in the Browser is fast.** Being able to edit *only* your HTML template while doing design is extremely fast and
16
+ low friction. Especially when you consider that you don't have infinite classes/decisions, and your classes are easily
17
+ guessable from the CSS you already know.
18
+ * **CSS is Powerful.** Single-function classes are great, but they become unweildy when trying to use more modern features of
19
+ CSS, especially in the context of web components. What is trivial in CSS becomes a very long list of esoteric classes and a
20
+ lengthy build step.
21
+
22
+ Thus, a BrutCSS-powered app is going to have a mix of single- and special-purpose classes. This is fine. Just as we rely on
23
+ multiple techniques for managing re-use in our JavaScript or Ruby code, so it is with CSS.
24
+
25
+ ### Design System
26
+
27
+ Brut's *design system* is a set of *custom properties*. They work together to define a basic grid, a modular scale, and a
28
+ color palette. You can change this easily by changing the value of the custom properties.
29
+
30
+ ### Single Purpose Classes
31
+
32
+ Brut includes *single-purpose classes* that apply common values for common CSS attributes. Brut does not aim to provide
33
+ access to *all* of CSS with single-purpose classes. You can add your own if you need to.
34
+
35
+ Brut's classes follow a strict naming convention that is either a mnemonic for a CSS attribute, or the attribute spelled out, coupled with either a numeric step in some scale, or the value to use.
36
+
37
+ * `fw-3` is `font-weight: 300`
38
+ * `pa-3` sets `padding` to size 3 of the scale
39
+ * `justify-between` sets `justify-content` to `between`
40
+ * etc.
41
+
42
+ The goal is to capitalize on the knowledge you have of CSS, and allow you to reasonably guess the other values once you learn
43
+ a few of them. There is a minimum of abstractions in the names of the classes. For example, Tailwind's third step of its
44
+ `border-radius` scale is called `rounded-ms`. In BrutCSS, this is `br-3`.
45
+
46
+ ### Width-Based/Breakpoint Classes
47
+
48
+ Brut provides breakpoint-specific versions of each class to allow you apply the class' attribute's value only at certain
49
+ widths. The following code will use the third font size by default, which are small screens, the fourth size on screens
50
+ between 30 and 60em and the fifth size on screens larger than 60em:
51
+
52
+ <div class="f-3 f-4-m f-5-l">
53
+ Responsive Design!
54
+ </div>
55
+
56
+ ### Pseudo Classes
57
+
58
+ Brut also provides a limited number of classes available for pseudo-states, namely `:hover`. This link will show an
59
+ underline via `text-decoration: underline` (tdu) only when the user agent is capable of hovering and actually *is* hovering.
60
+ Otherwise, there is no text decoration:
61
+
62
+ <a href="#" class="tdn hover-tdu">
63
+ Click Me, or Just Hang Around
64
+ </a>
65
+
66
+ It's the equivalent of this:
67
+
68
+ a {
69
+ text-decoration: none;
70
+ }
71
+ @media(hover: hover) {
72
+ a:hover {
73
+ text-decoration: underline;
74
+ }
75
+ }
@@ -0,0 +1,132 @@
1
+ ## Example
2
+
3
+ Let's make a button toolbar thingy. We have three buttons: "Send Now", "Send Later", and "Cancel". We aren't sure how we
4
+ want them to look.
5
+
6
+
7
+ First, write HTML:
8
+
9
+ <button>
10
+ Send Now
11
+ </button>
12
+ <button>
13
+ Send Later
14
+ </button>
15
+ <button>
16
+ Cancel
17
+ </button>
18
+
19
+
20
+ Looks ok, actually, but we want the buttons to be different and bigger and more buttony.
21
+
22
+ <button>
23
+ Send Now
24
+ </button>
25
+ <button>
26
+ Send Later
27
+ </button>
28
+ <button>
29
+ Cancel
30
+ </button>
31
+
32
+ Let's give them some padding, custom borders, and border radius:
33
+
34
+
35
+ <button class="ph-3 pv-2 ba bc-black br-3">
36
+ Send Now
37
+ </button>
38
+ <button class="ph-3 pv-2 ba bc-black br-3">
39
+ Send Later
40
+ </button>
41
+ <button class="ph-3 pv-2 ba bc-black br-3">
42
+ Cancel
43
+ </button>
44
+
45
+ <button class="ph-3 pv-2 ba bc-black br-3">
46
+ Send Now
47
+ </button>
48
+ <button class="ph-3 pv-2 ba bc-black br-3">
49
+ Send Later
50
+ </button>
51
+ <button class="ph-3 pv-2 ba bc-black br-3">
52
+ Cancel
53
+ </button>
54
+
55
+ They need to be be bigger, so let's add one step more padding all around, use a bigger font and, while we're at it, use some
56
+ color to differentiate. "Send Now" is what our growth-hacking engagement managers want people to click, so that will be
57
+ green, with "Send Later" in blue. Of course, cancel is the universal sign of danger: red.
58
+
59
+ <button class="ph-4 pv-3 f-3 ba bc-green-300 br-3 bg-green-800 green-400">
60
+ Send Now
61
+ </button>
62
+ <button class="ph-4 pv-3 f-3 ba bc-blue-300 br-3 bg-blue-800 blue-400">
63
+ Send Later
64
+ </button>
65
+ <button class="ph-4 pv-3 f-3 ba bc-red-300 br-3 bg-red-800 red-400">
66
+ Cancel
67
+ </button>
68
+
69
+ Not bad!
70
+
71
+ <button class="ph-4 pv-3 f-3 ba bc-green-300 br-3 bg-green-800 green-400">
72
+ Send Now
73
+ </button>
74
+ <button class="ph-4 pv-3 f-3 ba bc-blue-300 br-3 bg-blue-800 blue-400">
75
+ Send Later
76
+ </button>
77
+ <button class="ph-4 pv-3 f-3 ba bc-red-300 br-3 bg-red-800 red-400">
78
+ Cancel
79
+ </button>
80
+
81
+ Our green text needs more contrast, but our marketing team wants it to stand out even more, so we'll inverse the colors. Let's also adjust the design so that the two send buttons appear to be related, and cancel is a bit unrelated. We'll make the send buttons look like two sides of one button.
82
+
83
+ <button class="ph-4 pv-3 f-3 ba bc-green-300 br-left-3 ma-0 bg-green-300 green-800">
84
+ Send Now
85
+ </button>
86
+ <button class="ph-4 pv-3 f-3 ba bc-blue-300 br-right-3 ma-0 bg-blue-800 blue-400">
87
+ Send Later
88
+ </button>
89
+ <button class="ph-3 pv-2 f-2 ba bc-red-300 br-3 ml-4 bg-red-800 red-400">
90
+ Cancel
91
+ </button>
92
+
93
+ <button class="ph-4 pv-3 f-3 ba bc-green-300 br-left-3 ma-0 bg-green-400 green-900">
94
+ Send Now
95
+ </button>
96
+ <button class="ph-4 pv-3 f-3 ba bc-blue-300 br-right-3 ma-0 bg-blue-800 blue-400">
97
+ Send Later
98
+ </button>
99
+ <button class="ph-3 pv-2 f-2 ba bc-red-300 br-3 ml-4 bg-red-800 red-400">
100
+ Cancel
101
+ </button>
102
+
103
+ It's not quite right. We want our Send buttonsd touching, and the cancel button is now too far away. Let's use flexbox.
104
+ We'll also make the cancel button "pointier" but reducing the border radius.
105
+
106
+ <div class="flex items-center justify-center">
107
+ <button class="ph-4 pv-3 f-3 ba bc-green-300 br-left-3 ma-0 bg-green-400 green-900">
108
+ Send Now
109
+ </button>
110
+ <button class="ph-4 pv-3 f-3 ba bc-blue-300 br-right-3 blw-0 ma-0 bg-blue-800 blue-400">
111
+ Send Later
112
+ </button>
113
+ <button class="ph-3 pv-2 f-2 ba bc-red-300 br-1 ml-2 bg-red-800 red-400">
114
+ Cancel
115
+ </button>
116
+ </div>
117
+
118
+ <div class="flex items-center justify-center">
119
+ <button class="ph-4 pv-3 f-3 ba bc-green-300 br-left-3 ma-0 bg-green-400 green-900">
120
+ Send Now
121
+ </button>
122
+ <button class="ph-4 pv-3 f-3 ba bc-blue-300 br-right-3 blw-0 ma-0 bg-blue-800 blue-400">
123
+ Send Later
124
+ </button>
125
+ <button class="ph-3 pv-2 f-2 ba bc-red-300 br-1 ml-2 bg-red-800 red-400">
126
+ Cancel
127
+ </button>
128
+ </div>
129
+
130
+ Not bad! Notice how we used the various scales of the classes to quickly audition and tweak aspects of the design. We
131
+ didn't have to agonize of pixels or points.
132
+
@@ -0,0 +1,10 @@
1
+ <!doctype html>
2
+ <html class="ma-0 pa-0 h-100" lang="en">
3
+ <%- include("../includes/head.html.ejs") %>
4
+ <%- include("../includes/body-and-header.html.ejs") %>
5
+ <article>
6
+ <%- content %>
7
+ </article>
8
+ <%- include("../includes/footer-and-rest.html.ejs") %>
9
+ </html>
10
+
@@ -0,0 +1,71 @@
1
+ <!doctype html>
2
+ <html class="ma-0 pa-0 h-100" lang="en">
3
+ <%- include("../includes/head.html.ejs") %>
4
+ <%- include("../includes/body-and-header.html.ejs") %>
5
+ <article>
6
+ <h2 class="f-5"><%= category.title %> Custom Properties</h2>
7
+ <p class="p">
8
+ <%- category.descriptionHTML %>
9
+ </p>
10
+ <% if (category.seeLinks.length > 0) { %>
11
+ <h3 class="f-2 b">See Also</h3>
12
+ <ul class="see-also">
13
+ <% category.seeLinks.forEach( (link) => { %>
14
+ <li><%- link %></li>
15
+ <% }) %>
16
+ </ul>
17
+ <% } %>
18
+ <% category.scales.forEach( (scale) => { %>
19
+ <h3 class="f-5 mt-4" id="<%= scale.ref %>"><%= scale.title %></h3>
20
+ <p class="p">
21
+ <%- scale.descriptionHTML %>
22
+ </p>
23
+ <% if (scale.seeLinks.length > 0) { %>
24
+ <h4 class="f-2 b">See Also</h3>
25
+ <ul class="see-also">
26
+ <% scale.seeLinks.forEach( (link) => { %>
27
+ <li><%- link %></li>
28
+ <% }) %>
29
+ </ul>
30
+ <% } %>
31
+ <% scale.properties.forEach( (property) => { %>
32
+ <h4 class="f-4 fw-3 mt-4" id="<%= property.ref %>"><code><%= property.name %></code></h4>
33
+ <div class="ml-3">
34
+ <p class="p">
35
+ <%- property.descriptionHTML %>
36
+ </p>
37
+ <% if (property.seeLinks.length > 0) { %>
38
+ <h5 class="f-1 b">See Also</h3>
39
+ <ul class="see-also">
40
+ <% property.seeLinks.forEach( (link) => { %>
41
+ <li><%- link %></li>
42
+ <% }) %>
43
+ </ul>
44
+ <% } %>
45
+ <dl class="property-grid">
46
+ <dt>Type:</dt>
47
+ <dd>
48
+ <code><%= property.type %></code>
49
+ </dd>
50
+ <dt>Value:</dt>
51
+ <dd>
52
+ <code><%= property.value %></code>
53
+ </dd>
54
+ </dl>
55
+ </div>
56
+ <% }) %>
57
+ <% }) %>
58
+ </article>
59
+ <div class="z-5 ma-0 overflow-y-auto pa-2 w-20 h-100 pos-absolute top-0 right-2">
60
+ <div class="pa-3 ba bc-gray-700 bg-gray-900 br-3 shadow-1 ridiculous-liquid-glass-is-all-the-rage">
61
+ <h3>On this Page</h3>
62
+ <ul class="lst-none ma-0 pa-0">
63
+ <% category.scales.forEach( (scale) => { %>
64
+ <li class="lh-copy"><a href="#<%= scale.ref %>"><%= scale.title %></a></li>
65
+ <% }) %>
66
+ </ul>
67
+ </div>
68
+ </div>
69
+ <%- include("../includes/footer-and-rest.html.ejs") %>
70
+ </html>
71
+
@@ -0,0 +1,31 @@
1
+ <div class="pa-3 inset-shadow-1 br-3 mb-3">
2
+ <table class="collapse">
3
+ <thead>
4
+ <tr>
5
+ <th role="none"></th>
6
+ <% colorsCategory.scales[0].rules.forEach( (rule, i) => { %>
7
+ <th class="pa-2 tc ff-mono"><%= (i+1) * 100 %></th>
8
+ <% }) %>
9
+ </tr>
10
+ </thead>
11
+ <% colorsCategory.scales.forEach( (scale) => { %>
12
+ <% if (scale.title == "Black") { %>
13
+ <thead>
14
+ <tr>
15
+ <th role="none"></th>
16
+ <th class="pa-2 tc"><em class="fw-normal">pure</em></th>
17
+ <th class="pa-2 tc ff-mono">-ish</th>
18
+ </tr>
19
+ </thead>
20
+ <% } %>
21
+ <tr>
22
+ <th class="pa-2 tr ff-mono"><%= scale.title %></th>
23
+ <% scale.rules.forEach( (rule, i) => {
24
+ const bgClass = "bg-" + rule.selector.slice(1)
25
+ %>
26
+ <td class="pa-2"><div class="br-3 w-4 h-3 <%= ( (i > 6) || rule.selector.startsWith('.white') ) ? 'ba bc-gray-700' : '' %> <%= bgClass %>">&nbsp;</div></td>
27
+ <% }) %>
28
+ </tr>
29
+ <% }) %>
30
+ </table>
31
+ </div>
@@ -0,0 +1,87 @@
1
+ <!doctype html>
2
+ <html class="ma-0 pa-0 h-100" lang="en">
3
+ <%- include("../includes/head.html.ejs") %>
4
+ <%- include("../includes/body-and-header.html.ejs") %>
5
+ <article>
6
+ <h2 class="}-5"><%= category.title %> Classes</h2>
7
+ <% if ( typeof(colorsCategory) != "undefined" ) { %>
8
+ <%- category.descriptionHTML %>
9
+ <%- include("color-demo.html.ejs") %>
10
+ <% } else { %>
11
+ <%- category.descriptionHTML %>
12
+ <% } %>
13
+ <% if (category.seeLinks.length > 0) { %>
14
+ <h3 class="f-2 b">See Also</h3>
15
+ <ul class="see-also">
16
+ <% category.seeLinks.forEach( (link) => { %>
17
+ <li><%- link %></li>
18
+ <% }) %>
19
+ </ul>
20
+ <% } %>
21
+ <% category.scales.forEach( (scale) => { %>
22
+ <h3 class="f-5 mt-4" id="<%= scale.ref %>"><%= scale.title %></h3>
23
+ <p class="p">
24
+ <%- scale.descriptionHTML %>
25
+ </p>
26
+ <% if (scale.seeLinks.length > 0) { %>
27
+ <h4 class="f-2 b">See Also</h3>
28
+ <ul class="see-also">
29
+ <% scale.seeLinks.forEach( (link) => { %>
30
+ <li><%- link %></li>
31
+ <% }) %>
32
+ </ul>
33
+ <% } %>
34
+ <% scale.rules.forEach( (rule) => { %>
35
+ <div class="mt-4 flex gap-3 items-center justify-between" id="<%= rule.ref %>">
36
+ <h4 class="f-4 fw-3 ws-nowrap"><code><%= rule.selector %></code></h4>
37
+ <pre class="f-3 highlighted-code"><%- rule.highlightedCode %></pre>
38
+ </div>
39
+ <div class="ml-3">
40
+ <p class="p">
41
+ <%- rule.descriptionHTML %>
42
+ </p>
43
+ <% if (rule.seeLinks.length > 0) { %>
44
+ <h5 class="f-1 b">See Also</h3>
45
+ <ul class="see-also">
46
+ <% rule.seeLinks.forEach( (link) => { %>
47
+ <li><%- link %></li>
48
+ <% }) %>
49
+ </ul>
50
+ <% } %>
51
+ <% if (rule.examples.length > 0) { %>
52
+ <h5 class="f-2 ttu">
53
+ <% if (rule.examples.length > 1) { %>
54
+ Examples
55
+ <% } else { %>
56
+ Example
57
+ <% } %>
58
+ </h5>
59
+ <% rule.examples.forEach( (example) => { %>
60
+ <% if (example.name) { %>
61
+ <h6 class="f-1 fw-bold mt-2"><%= example.name %></h6>
62
+ <% } %>
63
+ <div class="mv-3 example">
64
+ <pre class="highlighted-code"><%- example.highlightedCode %></pre>
65
+ <div class="example-demonstration">
66
+ <%- example.code.join("\n") %>
67
+ </div>
68
+ </div>
69
+ <% }) %>
70
+ <% } %>
71
+ </div>
72
+ <% }) %>
73
+ <% }) %>
74
+ </article>
75
+ <div class="z-5 ma-0 overflow-y-auto pa-2 w-20 h-100 pos-absolute top-0 right-2">
76
+ <div class="pa-3 ba bc-gray-700 bg-gray-900 br-3 shadow-1 ridiculous-liquid-glass-is-all-the-rage">
77
+ <h3>On this Page</h3>
78
+ <ul class="lst-none ma-0 pa-0">
79
+ <% category.scales.forEach( (scale) => { %>
80
+ <li class="lh-copy"><a href="#<%= scale.ref %>"><%= scale.title %></a></li>
81
+ <% }) %>
82
+ </ul>
83
+ </div>
84
+ </div>
85
+ <%- include("../includes/footer-and-rest.html.ejs") %>
86
+ </html>
87
+
@@ -0,0 +1,36 @@
1
+ ## Changing the Design System
2
+
3
+ Brut's custom properties are documented here. Changing them involves overriding their values using the [custom property syntax](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_cascading_variables/Using_CSS_custom_properties) supported by browsers:
4
+
5
+ ```
6
+ :root {
7
+ --ff-sans: Avenir, sans;
8
+ }
9
+ ```
10
+
11
+ As long as this appears after you've imported BrutCSS, your overrides will take effect.
12
+
13
+ Of note, BrutCSS uses `@property` to declare and define all custom properties. While these are duplicated to a `:root` block
14
+ for compatibility, since `@property` cannot use functions for `initial-value`, several values which are semantically derived
15
+ from other values are not *actually* so derived.
16
+
17
+ For example, `--wh-1` is intended to be double the value of `--sp-1`, however this doubling is done offline:
18
+
19
+ ```
20
+ @property --sp-1 {
21
+ syntax: "<length>";
22
+ inherits: true;
23
+ initial-value: 0.25rem;
24
+ }
25
+ @property --wh-1 {
26
+ syntax: "<length>";
27
+ inherits: true;
28
+ initial-value: 0.5rem;
29
+ }
30
+ ```
31
+
32
+ We mention this so that if you choose to modify the spacing scale, you should also consider updating the width/height scale
33
+ to match.
34
+
35
+ In general, we recommended that you modify either all values in a category or none of them. The source code and documentation
36
+ reflect the categorizations.
@@ -0,0 +1,75 @@
1
+ ## Breakpoints / Responsive Design Customization
2
+
3
+ There are two ways to control the available breakpoints and thus which classes are available for responsive design. You can
4
+ change which bundle of BrutCSS you use, or you can build your own bundle.
5
+
6
+ ### Selecting a Bundle
7
+
8
+ BrutCSS provides three `.css` files depending on what you need:
9
+
10
+ * `brut.css` - the largest file with all the classes, plus `-m`, `-l`, and `-ns`, for medium, large and not-small screens, respectively.
11
+ * `brut-ns-only.css` - the second largest file with all the classes, plus the not-small (`-ns`) classes. This provides a
12
+ roughtly "mobile" and "desktop" breakpoint system.
13
+ * `brut-thin.css` - the smallest file provides only the classes, with no breakpoints.
14
+
15
+
16
+ ### Configuring Your Own Bundle
17
+
18
+ BrutCSS is built via the command line app in `src/js/build.js`.
19
+
20
+ ```
21
+ > node src/js/build.js -h
22
+ usage: build.js [options]
23
+
24
+ OPTIONS
25
+
26
+ -i/--input - Input .css to process
27
+ -m/--media-query-config - Specialized .css describing the media queries to support in the output
28
+ -p/--pseudo-class-config - Specialized .css describing the pseudo classes to support in the output
29
+ -o/--output - Output .css (this is what your app will use)
30
+ -d/--docs-dir - path to generate documentation
31
+ -t/--docs-template-source-dir - path where doc templates live
32
+ ```
33
+
34
+ By checking out this repo, you can create your own specialized version of BrutCSS by modifying the file used for the
35
+ `--media-query-config` option.
36
+
37
+ This file is a `.css` file that specifies one or more `@media` queries, each requiring a specialized comment. Here is the
38
+ one used to build `brut.css`:
39
+
40
+ ```
41
+ /* Not-small screens, essentially anything that is likely not a mobile device.
42
+ * @suffix ns
43
+ */
44
+ @media screen and (min-width: 30em) {
45
+ }
46
+ /* Medium-sized screens.
47
+ * @suffix m
48
+ */
49
+ @media screen and (min-width: 30em) and (max-width: 60em) {
50
+ }
51
+ /* Large screens.
52
+ * @suffix l
53
+ */
54
+ @media screen and (min-width: 60em) {
55
+ }
56
+ ```
57
+
58
+ `bundle.js` will process all rules in `src/css` and then duplicate them for each `@media` query in the file. Each `@media`
59
+ query **must** have a `@suffix` tag in its doc comment. This tag is used to name the duplicated class. This is how `db`
60
+ becomes `db-ns` or `fs-3` becomes `fs-3-l`.
61
+
62
+ You can create your own file that uses different values for `min-width` or even different `@media` queries entirely:
63
+
64
+ ```
65
+ /* Dark mode.
66
+ * @suffix dm
67
+ * /
68
+ @media (prefers-color-scheme dark) {
69
+ }
70
+ ```
71
+
72
+ Note that currently, this will duplicate *all* of BrutCSS's classes. This may not be what you want.
73
+
74
+
75
+
@@ -0,0 +1,74 @@
1
+ ## Pseudo Classes
2
+
3
+ Brut provides a limited number of pseudo-class selectors. To change how this works, you must create your own bundle using
4
+ `src/js/build.js`.
5
+
6
+ ```
7
+ > node src/js/build.js -h
8
+ usage: build.js [options]
9
+
10
+ OPTIONS
11
+
12
+ -i/--input - Input .css to process
13
+ -m/--media-query-config - Specialized .css describing the media queries to support in the output
14
+ -p/--pseudo-class-config - Specialized .css describing the pseudo classes to support in the output
15
+ -o/--output - Output .css (this is what your app will use)
16
+ -d/--docs-dir - path to generate documentation
17
+ -t/--docs-template-source-dir - path where doc templates live
18
+ ```
19
+
20
+ By checking out this repo, you can create your own specialized version of BrutCSS by modifying the file used for the
21
+ `--pseudo-class-config` option.
22
+
23
+ This file is a `.css` file that uses proprietary `@`-rules. The top-level rule is called `@brut-pseudo` and it accepts two
24
+ arguments inside parens: the pseudo class being targeted and the prefix to use for the classes targeting it.
25
+
26
+ Inside this `@-rule`, you can use these `@` rules to describe which classes to target:
27
+
28
+ * `@brut-classes-with-prefix(«prefix»)` - target all classes that start with the given prefix.
29
+ * `@brut-class(«class»)` - target the specific class.
30
+ * `@brut-colors` - target the foreground color classes.
31
+
32
+
33
+ Here is the one used to build `brut.css`:
34
+
35
+ ```
36
+ @brut-pseudo(hover hover true) {
37
+ @brut-classes-with-prefix(bg-);
38
+ @brut-class(tdu);
39
+ @brut-colors;
40
+ }
41
+ @brut-pseudo(disabled disabled) {
42
+ @brut-classes-with-prefix(bg-gray);
43
+ @brut-classes-with-prefix(gray-);
44
+ }
45
+ ```
46
+
47
+ This creates classes that start with `hover-` for:
48
+
49
+ * All classes starting with `bg-` (which are the background color classes)
50
+ * The class `tdu`
51
+ * The foreground color classes
52
+
53
+ This also creates classes starting with `disabled-` for:
54
+
55
+ * All classes starting with `bg-gray`
56
+ * All classes starting with `gray-`
57
+
58
+ You can create your own file to target the pseudo selectors you want. For example, if you wanted to target the active state
59
+ for only reds and oranges, using the `act-` suffix:
60
+
61
+ ```
62
+ @brut-pseudo(active act) {
63
+ @brut-classes-with-prefix(bg-red);
64
+ @brut-classes-with-prefix(red-);
65
+ @brut-classes-with-prefix(bg-orange);
66
+ @brut-classes-with-prefix(orange-);
67
+ }
68
+ ```
69
+
70
+ Note that this will happend *before* breakpoints are examined, so if you have, say, three configured breakpoints (the deafult), the above configurations will result in four additional classes per class targeted.
71
+
72
+
73
+
74
+
@@ -0,0 +1,40 @@
1
+ ## Advanced Configuration
2
+
3
+ BrutCSS does not support advanced configuration options directly, however you can clone its repo and use its internal build
4
+ system to save a bit of work.
5
+
6
+ ### How BrutCSS is Built
7
+
8
+ `src/css/index.css` is the root file for all of BrutCSS (the value for `build.js`'s `--input`). This file uses `@import` to bring in first the custom properties in
9
+ `src/css/properties/`, and then each `.css` file. The aforementioned media query and pseudo class configuration files are
10
+ also inputs.
11
+
12
+ Each `.css` file contains doc comments and some tags (tokens starting with `@`). These comments and tags define a structure:
13
+
14
+ * *Categories* group similar concepts. The side nav of this site shows categories like typography or spacing.
15
+ * *Scales* or *Groups* are the different available values for the same CSS attribute. These appear in the right-hand sidebar
16
+ on each category page. Font scale is an example.
17
+ * *Property* is a custom property, as defined by the `@property` rule, for example `--ff-sans`, which sets the sans serif
18
+ font face.
19
+ * *Rules* or *Classes* are CSS classes you'd use in your HTML, for example `fw-4` for a font weight of 400.
20
+
21
+ When `src/js/build.js` runs, it processes all of this information. It is based on PostCSS and does the following:
22
+
23
+ 1. `@import` properties are applied to create a single `.css` file
24
+ 2. For each `@property`, a value in a new `:root` rule is created. This `:root` rule is added after all `@property` rules, but before any classes.
25
+ 3. If `--docs-dir` was specified, all the doc comments are read and documentation is produced.
26
+ 4. The pseudo class configuration is processed and new classes generated.
27
+ 5. The media query configuration is processed and new classes generated.
28
+
29
+ The result, as a single `.css` file is output to `--output`.
30
+
31
+ ### Build Your Own BrutCSS
32
+
33
+ With this information, you can build or enhance your own `.css` file. The simplest way to do this would be:
34
+
35
+ 1. Clone this repo
36
+ 2. Add, modify, or remove files in `src/css`
37
+ 3. Create your own media query or pseudo class files in `config/`
38
+ 4. Run `build.js`
39
+
40
+
@@ -0,0 +1,10 @@
1
+ <!doctype html>
2
+ <html class="ma-0 pa-0 h-100" lang="en">
3
+ <%- include("../includes/head.html.ejs") %>
4
+ <%- include("../includes/body-and-header.html.ejs") %>
5
+ <article>
6
+ <%- content %>
7
+ </article>
8
+ <%- include("../includes/footer-and-rest.html.ejs") %>
9
+ </html>
10
+