backpack 0.3.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (606) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +18 -0
  3. data/.gitlab-ci.yml +152 -0
  4. data/.rubocop.yml +2 -0
  5. data/.ruby-version +1 -0
  6. data/LICENSE +21 -0
  7. data/README.md +29 -0
  8. data/Rakefile +4 -0
  9. data/demo/.gitignore +47 -0
  10. data/demo/.overmind.env +2 -0
  11. data/demo/.yarn/cache/@babel-code-frame-npm-7.27.1-4dbcabb137-5874edc5d3.zip +0 -0
  12. data/demo/.yarn/cache/@babel-helper-validator-identifier-npm-7.28.5-1953d49d2b-5a251a6848.zip +0 -0
  13. data/demo/.yarn/cache/@csstools-css-parser-algorithms-npm-2.7.1-8dc62b9586-304e6f92e5.zip +0 -0
  14. data/demo/.yarn/cache/@csstools-css-tokenizer-npm-2.4.1-51184be252-395c51f872.zip +0 -0
  15. data/demo/.yarn/cache/@csstools-media-query-list-parser-npm-2.1.13-cb3cb9a768-7754b4b9fc.zip +0 -0
  16. data/demo/.yarn/cache/@csstools-postcss-cascade-layers-npm-1.1.1-4382e19cf0-8ecd6a929e.zip +0 -0
  17. data/demo/.yarn/cache/@csstools-postcss-color-function-npm-1.1.1-7c5a0199ae-087595985e.zip +0 -0
  18. data/demo/.yarn/cache/@csstools-postcss-font-format-keywords-npm-1.0.1-ef1db49912-ed8d9eab97.zip +0 -0
  19. data/demo/.yarn/cache/@csstools-postcss-hwb-function-npm-1.0.2-f3f621e351-352ead754a.zip +0 -0
  20. data/demo/.yarn/cache/@csstools-postcss-ic-unit-npm-1.0.1-111638e451-09c414c9b7.zip +0 -0
  21. data/demo/.yarn/cache/@csstools-postcss-is-pseudo-class-npm-2.0.7-c85939401b-a4494bb8e9.zip +0 -0
  22. data/demo/.yarn/cache/@csstools-postcss-nested-calc-npm-1.0.0-8028506411-53bb783dd6.zip +0 -0
  23. data/demo/.yarn/cache/@csstools-postcss-normalize-display-values-npm-1.0.1-53721ce3eb-75901daec3.zip +0 -0
  24. data/demo/.yarn/cache/@csstools-postcss-oklab-function-npm-1.1.1-2907029cf1-d66b789060.zip +0 -0
  25. data/demo/.yarn/cache/@csstools-postcss-progressive-custom-properties-npm-1.3.0-1e56504855-e281845fde.zip +0 -0
  26. data/demo/.yarn/cache/@csstools-postcss-stepped-value-functions-npm-1.0.1-01aa1138bd-2fc88713a0.zip +0 -0
  27. data/demo/.yarn/cache/@csstools-postcss-text-decoration-shorthand-npm-1.0.0-96f61ef9fe-d27aaf9787.zip +0 -0
  28. data/demo/.yarn/cache/@csstools-postcss-trigonometric-functions-npm-1.0.2-4553514702-f7f5b5f249.zip +0 -0
  29. data/demo/.yarn/cache/@csstools-postcss-unset-value-npm-1.0.2-f57c79bfc4-3facdae154.zip +0 -0
  30. data/demo/.yarn/cache/@csstools-selector-specificity-npm-2.2.0-9e6097918b-97c89f23b3.zip +0 -0
  31. data/demo/.yarn/cache/@csstools-selector-specificity-npm-3.1.1-85fd5757fc-3786a6afea.zip +0 -0
  32. data/demo/.yarn/cache/@eslint-community-eslint-utils-npm-4.9.0-fe45a08548-ae9b98eea0.zip +0 -0
  33. data/demo/.yarn/cache/@eslint-community-regexpp-npm-4.12.2-3d54624470-1770bc81f6.zip +0 -0
  34. data/demo/.yarn/cache/@eslint-eslintrc-npm-2.1.4-1ff4b5f908-10957c7592.zip +0 -0
  35. data/demo/.yarn/cache/@eslint-js-npm-8.57.1-dec269f278-2afb77454c.zip +0 -0
  36. data/demo/.yarn/cache/@hotwired-stimulus-npm-3.2.2-e1e064f1fe-e0c13469df.zip +0 -0
  37. data/demo/.yarn/cache/@humanwhocodes-config-array-npm-0.13.0-843095a032-eae69ff913.zip +0 -0
  38. data/demo/.yarn/cache/@humanwhocodes-module-importer-npm-1.0.1-9d07ed2e4a-0fd22007db.zip +0 -0
  39. data/demo/.yarn/cache/@humanwhocodes-object-schema-npm-2.0.3-4f0e508cd9-d3b78f6c58.zip +0 -0
  40. data/demo/.yarn/cache/@isaacs-balanced-match-npm-4.0.1-8965afafe6-102fbc6d2c.zip +0 -0
  41. data/demo/.yarn/cache/@isaacs-brace-expansion-npm-5.0.0-754d3cb3f5-d7a3b8b0dd.zip +0 -0
  42. data/demo/.yarn/cache/@isaacs-cliui-npm-8.0.2-f4364666d5-4a473b9b32.zip +0 -0
  43. data/demo/.yarn/cache/@isaacs-fs-minipass-npm-4.0.1-677026e841-5d36d28996.zip +0 -0
  44. data/demo/.yarn/cache/@nodelib-fs.scandir-npm-2.1.5-89c67370dd-a970d595bd.zip +0 -0
  45. data/demo/.yarn/cache/@nodelib-fs.stat-npm-2.0.5-01f4dd3030-012480b5ca.zip +0 -0
  46. data/demo/.yarn/cache/@nodelib-fs.walk-npm-1.2.8-b4a89da548-190c643f15.zip +0 -0
  47. data/demo/.yarn/cache/@npmcli-agent-npm-4.0.0-502e5ae4f0-89ae20b448.zip +0 -0
  48. data/demo/.yarn/cache/@npmcli-fs-npm-4.0.0-1d9cc8a27b-68951c589e.zip +0 -0
  49. data/demo/.yarn/cache/@pkgjs-parseargs-npm-0.11.0-cd2a3fe948-6ad6a00fc4.zip +0 -0
  50. data/demo/.yarn/cache/@radix-ui-colors-npm-3.0.0-a7484539fd-5ac1b69df7.zip +0 -0
  51. data/demo/.yarn/cache/@types-less-npm-3.0.8-5556bee38f-8e04acca20.zip +0 -0
  52. data/demo/.yarn/cache/@types-minimist-npm-1.2.5-c85664a9d8-477047b606.zip +0 -0
  53. data/demo/.yarn/cache/@types-node-npm-24.10.1-d514f50dfd-c2f370ae7a.zip +0 -0
  54. data/demo/.yarn/cache/@types-normalize-package-data-npm-2.4.4-676a8ba353-65dff72b54.zip +0 -0
  55. data/demo/.yarn/cache/@types-sass-npm-1.43.1-6770eea7c0-19eb71acc4.zip +0 -0
  56. data/demo/.yarn/cache/@types-stylus-npm-0.48.43-0d92990605-bd780fc7e8.zip +0 -0
  57. data/demo/.yarn/cache/@ungap-structured-clone-npm-1.3.0-aea1bdf957-64ed518f49.zip +0 -0
  58. data/demo/.yarn/cache/abbrev-npm-4.0.0-7d848a1ef0-d0344b63d2.zip +0 -0
  59. data/demo/.yarn/cache/acorn-jsx-npm-5.3.2-d7594599ea-c3d3b2a89c.zip +0 -0
  60. data/demo/.yarn/cache/acorn-npm-8.15.0-0764cf600e-309c6b49ae.zip +0 -0
  61. data/demo/.yarn/cache/agent-base-npm-7.1.4-cb8b4604d5-86a7f542af.zip +0 -0
  62. data/demo/.yarn/cache/ajv-npm-6.12.6-4b5105e2b2-874972efe5.zip +0 -0
  63. data/demo/.yarn/cache/ajv-npm-8.17.1-12ade7edc6-1797bf242c.zip +0 -0
  64. data/demo/.yarn/cache/ansi-regex-npm-5.0.1-c963a48615-2aa4bb54ca.zip +0 -0
  65. data/demo/.yarn/cache/ansi-regex-npm-6.2.2-f2d6691eb1-9b17ce2c6d.zip +0 -0
  66. data/demo/.yarn/cache/ansi-styles-npm-4.3.0-245c7d42c7-513b44c3b2.zip +0 -0
  67. data/demo/.yarn/cache/ansi-styles-npm-6.2.3-6fc7ca2bf5-f1b0829cf0.zip +0 -0
  68. data/demo/.yarn/cache/anymatch-npm-3.1.3-bc81d103b1-3e044fd6d1.zip +0 -0
  69. data/demo/.yarn/cache/argparse-npm-2.0.1-faff7999e6-83644b5649.zip +0 -0
  70. data/demo/.yarn/cache/array-union-npm-2.1.0-4e4852b221-5bee12395c.zip +0 -0
  71. data/demo/.yarn/cache/arrify-npm-1.0.1-affafba9fe-745075dd4a.zip +0 -0
  72. data/demo/.yarn/cache/astral-regex-npm-2.0.0-f30d866aab-876231688c.zip +0 -0
  73. data/demo/.yarn/cache/autoprefixer-npm-10.4.22-7e7e3bc20e-7aa0c668bc.zip +0 -0
  74. data/demo/.yarn/cache/balanced-match-npm-1.0.2-a53c126459-9706c088a2.zip +0 -0
  75. data/demo/.yarn/cache/balanced-match-npm-2.0.0-d9722af241-9a5caad6a2.zip +0 -0
  76. data/demo/.yarn/cache/baseline-browser-mapping-npm-2.8.28-9d8c2e2d8e-d9b54c55ed.zip +0 -0
  77. data/demo/.yarn/cache/binary-extensions-npm-2.3.0-bd3f20d865-bcad01494e.zip +0 -0
  78. data/demo/.yarn/cache/boolbase-npm-1.0.0-965fe9af6d-3e25c80ef6.zip +0 -0
  79. data/demo/.yarn/cache/brace-expansion-npm-1.1.12-329e9ad7a1-12cb6d6310.zip +0 -0
  80. data/demo/.yarn/cache/brace-expansion-npm-2.0.2-bc7f134bbc-01dff195e3.zip +0 -0
  81. data/demo/.yarn/cache/braces-npm-3.0.3-582c14023c-b95aa0b3bd.zip +0 -0
  82. data/demo/.yarn/cache/browserslist-npm-4.28.0-c16ea3c47c-c19fe2c6f1.zip +0 -0
  83. data/demo/.yarn/cache/cacache-npm-20.0.1-9350b3f826-33d1514f5c.zip +0 -0
  84. data/demo/.yarn/cache/callsites-npm-3.1.0-268f989910-072d17b6ab.zip +0 -0
  85. data/demo/.yarn/cache/camelcase-keys-npm-7.0.2-36fbc5a8f7-b5821cc48d.zip +0 -0
  86. data/demo/.yarn/cache/camelcase-npm-6.3.0-e5e42a0d15-8c96818a90.zip +0 -0
  87. data/demo/.yarn/cache/caniuse-lite-npm-1.0.30001754-112f366158-f5a956d820.zip +0 -0
  88. data/demo/.yarn/cache/chalk-npm-4.1.2-ba8b67ab80-fe75c9d5c7.zip +0 -0
  89. data/demo/.yarn/cache/chokidar-npm-3.6.0-3c413a828f-d2f29f4997.zip +0 -0
  90. data/demo/.yarn/cache/chownr-npm-3.0.0-5275e85d25-fd73a4bab4.zip +0 -0
  91. data/demo/.yarn/cache/cliui-npm-8.0.1-3b029092cf-79648b3b00.zip +0 -0
  92. data/demo/.yarn/cache/color-convert-npm-2.0.1-79730e935b-79e6bdb9fd.zip +0 -0
  93. data/demo/.yarn/cache/color-name-npm-1.1.4-025792b0ea-b044585952.zip +0 -0
  94. data/demo/.yarn/cache/colord-npm-2.9.3-5c35c27898-95d909bfbc.zip +0 -0
  95. data/demo/.yarn/cache/concat-map-npm-0.0.1-85a921b7ee-902a9f5d89.zip +0 -0
  96. data/demo/.yarn/cache/cosmiconfig-npm-8.3.6-a5566e2779-dc339ebea4.zip +0 -0
  97. data/demo/.yarn/cache/cross-spawn-npm-7.0.6-264bddf921-8d306efaca.zip +0 -0
  98. data/demo/.yarn/cache/css-blank-pseudo-npm-3.0.3-af86e84805-9be0a13885.zip +0 -0
  99. data/demo/.yarn/cache/css-functions-list-npm-3.2.3-c87dc5954d-25f12fb0ef.zip +0 -0
  100. data/demo/.yarn/cache/css-has-pseudo-npm-3.0.4-e97bb61896-8f165d68f6.zip +0 -0
  101. data/demo/.yarn/cache/css-prefers-color-scheme-npm-6.0.3-e1c91bc5cd-3a2b02f045.zip +0 -0
  102. data/demo/.yarn/cache/css-select-npm-3.1.2-ee1a42b802-a54b73ee89.zip +0 -0
  103. data/demo/.yarn/cache/css-tree-npm-2.3.1-6540d78e26-493cc24b5c.zip +0 -0
  104. data/demo/.yarn/cache/css-what-npm-4.0.0-5d0d0ff02b-69b5574912.zip +0 -0
  105. data/demo/.yarn/cache/cssdb-npm-7.11.2-d799f85811-79b2c3b6de.zip +0 -0
  106. data/demo/.yarn/cache/cssesc-npm-3.0.0-15ec56f86f-f8c4ababff.zip +0 -0
  107. data/demo/.yarn/cache/cuint-npm-0.2.2-3990651cc6-b8127a93a7.zip +0 -0
  108. data/demo/.yarn/cache/debug-npm-4.4.3-0105c6123a-4805abd570.zip +0 -0
  109. data/demo/.yarn/cache/decamelize-keys-npm-1.1.1-4cfa36ed4b-fc645fe20b.zip +0 -0
  110. data/demo/.yarn/cache/decamelize-npm-1.2.0-c5a2fdc622-ad8c51a7e7.zip +0 -0
  111. data/demo/.yarn/cache/decamelize-npm-5.0.1-2fde8c926c-7c3b1ed4b3.zip +0 -0
  112. data/demo/.yarn/cache/deep-is-npm-0.1.4-88938b5a67-edb65dd0d7.zip +0 -0
  113. data/demo/.yarn/cache/dependency-graph-npm-0.11.0-658e382681-477204beaa.zip +0 -0
  114. data/demo/.yarn/cache/dir-glob-npm-3.0.1-1aea628b1b-fa05e18324.zip +0 -0
  115. data/demo/.yarn/cache/doctrine-npm-3.0.0-c6f1615f04-fd7673ca77.zip +0 -0
  116. data/demo/.yarn/cache/dom-serializer-npm-1.4.1-ebb24349c1-fbb0b01f87.zip +0 -0
  117. data/demo/.yarn/cache/domelementtype-npm-2.3.0-02de7cbfba-ee837a318f.zip +0 -0
  118. data/demo/.yarn/cache/domhandler-npm-3.3.0-6417f7e17e-850e5e9fee.zip +0 -0
  119. data/demo/.yarn/cache/domhandler-npm-4.3.1-493539c1ca-4c665ceed0.zip +0 -0
  120. data/demo/.yarn/cache/domutils-npm-2.8.0-0325139e5c-abf7434315.zip +0 -0
  121. data/demo/.yarn/cache/eastasianwidth-npm-0.2.0-c37eb16bd1-7d00d7cd8e.zip +0 -0
  122. data/demo/.yarn/cache/electron-to-chromium-npm-1.5.250-3e6f742b0b-4f32d0e176.zip +0 -0
  123. data/demo/.yarn/cache/emoji-regex-npm-8.0.0-213764015c-d4c5c39d5a.zip +0 -0
  124. data/demo/.yarn/cache/emoji-regex-npm-9.2.2-e6fac8d058-8487182da7.zip +0 -0
  125. data/demo/.yarn/cache/encoding-npm-0.1.13-82a1837d30-bb98632f8f.zip +0 -0
  126. data/demo/.yarn/cache/entities-npm-2.2.0-0fc8d5b2f7-19010dacaf.zip +0 -0
  127. data/demo/.yarn/cache/env-paths-npm-2.2.1-7c7577428c-65b5df55a8.zip +0 -0
  128. data/demo/.yarn/cache/err-code-npm-2.0.3-082e0ff9a7-8b7b1be20d.zip +0 -0
  129. data/demo/.yarn/cache/error-ex-npm-1.3.4-c7248e4040-25136c0984.zip +0 -0
  130. data/demo/.yarn/cache/esbuild-darwin-arm64-npm-0.15.18-37bdbfa731-8.zip +0 -0
  131. data/demo/.yarn/cache/esbuild-npm-0.15.18-61e07796c8-ec12682b2c.zip +0 -0
  132. data/demo/.yarn/cache/esbuild-plugin-import-glob-npm-0.1.1-b0534ed204-d6a350e13e.zip +0 -0
  133. data/demo/.yarn/cache/esbuild-rails-npm-1.0.7-a0e5a3f51e-55efdcd04b.zip +0 -0
  134. data/demo/.yarn/cache/esbuild-style-plugin-npm-1.6.3-ee685c408e-05fa06f2e7.zip +0 -0
  135. data/demo/.yarn/cache/escalade-npm-3.2.0-19b50dd48f-47b029c83d.zip +0 -0
  136. data/demo/.yarn/cache/escape-string-regexp-npm-4.0.0-4b531d8d59-98b48897d9.zip +0 -0
  137. data/demo/.yarn/cache/eslint-config-prettier-npm-8.10.2-2e293fd4f2-a92b7e8a99.zip +0 -0
  138. data/demo/.yarn/cache/eslint-npm-8.57.1-dd20287a5a-e2489bb7f8.zip +0 -0
  139. data/demo/.yarn/cache/eslint-scope-npm-7.2.2-53cb0df8e8-ec97dbf5fb.zip +0 -0
  140. data/demo/.yarn/cache/eslint-visitor-keys-npm-3.4.3-a356ac7e46-36e9ef87fc.zip +0 -0
  141. data/demo/.yarn/cache/espree-npm-9.6.1-a50722a5a9-eb8c149c7a.zip +0 -0
  142. data/demo/.yarn/cache/esquery-npm-1.6.0-16fee31531-08ec4fe446.zip +0 -0
  143. data/demo/.yarn/cache/esrecurse-npm-4.3.0-10b86a887a-ebc17b1a33.zip +0 -0
  144. data/demo/.yarn/cache/estraverse-npm-5.3.0-03284f8f63-072780882d.zip +0 -0
  145. data/demo/.yarn/cache/esutils-npm-2.0.3-f865beafd5-22b5b08f74.zip +0 -0
  146. data/demo/.yarn/cache/exponential-backoff-npm-3.1.3-28be78d98e-471fdb70fd.zip +0 -0
  147. data/demo/.yarn/cache/fast-deep-equal-npm-3.1.3-790edcfcf5-e21a9d8d84.zip +0 -0
  148. data/demo/.yarn/cache/fast-glob-npm-3.3.3-2a653be532-0704d7b85c.zip +0 -0
  149. data/demo/.yarn/cache/fast-json-stable-stringify-npm-2.1.0-02e8905fda-b191531e36.zip +0 -0
  150. data/demo/.yarn/cache/fast-levenshtein-npm-2.0.6-fcd74b8df5-92cfec0a8d.zip +0 -0
  151. data/demo/.yarn/cache/fast-uri-npm-3.1.0-57fa0b3f3c-daab0efd35.zip +0 -0
  152. data/demo/.yarn/cache/fastest-levenshtein-npm-1.0.16-192d328856-a78d44285c.zip +0 -0
  153. data/demo/.yarn/cache/fastq-npm-1.19.1-ca0a13ec3f-7691d1794f.zip +0 -0
  154. data/demo/.yarn/cache/fdir-npm-6.5.0-8814a0dec7-bd537daa9d.zip +0 -0
  155. data/demo/.yarn/cache/file-entry-cache-npm-6.0.1-31965cf0af-f49701feaa.zip +0 -0
  156. data/demo/.yarn/cache/file-entry-cache-npm-7.0.2-9ddf8eaba9-283c674fc2.zip +0 -0
  157. data/demo/.yarn/cache/fill-range-npm-7.1.1-bf491486db-b4abfbca38.zip +0 -0
  158. data/demo/.yarn/cache/find-up-npm-5.0.0-e03e9b796d-07955e3573.zip +0 -0
  159. data/demo/.yarn/cache/flat-cache-npm-3.2.0-9a887f084e-e7e0f59801.zip +0 -0
  160. data/demo/.yarn/cache/flatted-npm-3.3.3-ca455563b2-8c96c02fbe.zip +0 -0
  161. data/demo/.yarn/cache/foreground-child-npm-3.3.1-b7775fda04-b2c1a6fc0b.zip +0 -0
  162. data/demo/.yarn/cache/fraction.js-npm-5.3.4-52b06f74c0-6ac88ecfdb.zip +0 -0
  163. data/demo/.yarn/cache/fs-extra-npm-11.3.2-490a8d09c5-24a7a6e096.zip +0 -0
  164. data/demo/.yarn/cache/fs-minipass-npm-3.0.3-d148d6ac19-8722a41109.zip +0 -0
  165. data/demo/.yarn/cache/fs.realpath-npm-1.0.0-c8f05d8126-99ddea01a7.zip +0 -0
  166. data/demo/.yarn/cache/fsevents-npm-2.3.3-ce9fb0ffae-11e6ea6fea.zip +0 -0
  167. data/demo/.yarn/cache/fsevents-patch-21ad2b1333-8.zip +0 -0
  168. data/demo/.yarn/cache/function-bind-npm-1.1.2-7a55be9b03-2b0ff4ce70.zip +0 -0
  169. data/demo/.yarn/cache/generic-names-npm-4.0.0-c188ad8a22-8dabd25051.zip +0 -0
  170. data/demo/.yarn/cache/get-caller-file-npm-2.0.5-80e8a86305-b9769a836d.zip +0 -0
  171. data/demo/.yarn/cache/get-stdin-npm-9.0.0-4221477153-5972bc34d0.zip +0 -0
  172. data/demo/.yarn/cache/glob-npm-10.4.5-8c63175f05-0bc725de5e.zip +0 -0
  173. data/demo/.yarn/cache/glob-npm-11.0.3-f68382b3cc-65ddc1e3c9.zip +0 -0
  174. data/demo/.yarn/cache/glob-npm-7.2.3-2d866d17a5-29452e97b3.zip +0 -0
  175. data/demo/.yarn/cache/glob-parent-npm-5.1.2-021ab32634-f4f2bfe242.zip +0 -0
  176. data/demo/.yarn/cache/glob-parent-npm-6.0.2-2cbef12738-c13ee97978.zip +0 -0
  177. data/demo/.yarn/cache/global-modules-npm-2.0.0-f71d340362-d6197f2585.zip +0 -0
  178. data/demo/.yarn/cache/global-prefix-npm-3.0.0-68cf01e67d-8a82fc1d6f.zip +0 -0
  179. data/demo/.yarn/cache/globals-npm-13.24.0-cc7713139c-56066ef058.zip +0 -0
  180. data/demo/.yarn/cache/globby-npm-11.1.0-bdcdf20c71-b4be8885e0.zip +0 -0
  181. data/demo/.yarn/cache/globby-npm-13.2.2-47efcd4a86-f3d84ced58.zip +0 -0
  182. data/demo/.yarn/cache/globjoin-npm-0.1.4-a1beb812bf-0a47d88d56.zip +0 -0
  183. data/demo/.yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-ac85f94da9.zip +0 -0
  184. data/demo/.yarn/cache/graphemer-npm-1.4.0-0627732d35-bab8f0be9b.zip +0 -0
  185. data/demo/.yarn/cache/hard-rejection-npm-2.1.0-a80f2a977d-7baaf80a0c.zip +0 -0
  186. data/demo/.yarn/cache/has-flag-npm-4.0.0-32af9f0536-261a135703.zip +0 -0
  187. data/demo/.yarn/cache/hasown-npm-2.0.2-80fe6c9901-e8516f776a.zip +0 -0
  188. data/demo/.yarn/cache/hosted-git-info-npm-4.1.0-4efcdf8fd3-c3f87b3c2f.zip +0 -0
  189. data/demo/.yarn/cache/html-tags-npm-3.3.1-c8f411791b-b4ef1d5a76.zip +0 -0
  190. data/demo/.yarn/cache/htmlparser2-npm-5.0.1-d50ebd0fbb-b67ac02e44.zip +0 -0
  191. data/demo/.yarn/cache/http-cache-semantics-npm-4.2.0-fadacfb3ad-7a7246ddfc.zip +0 -0
  192. data/demo/.yarn/cache/http-proxy-agent-npm-7.0.2-643ed7cc33-670858c8f8.zip +0 -0
  193. data/demo/.yarn/cache/https-proxy-agent-npm-7.0.6-27a95c2690-b882377a12.zip +0 -0
  194. data/demo/.yarn/cache/iconv-lite-npm-0.6.3-24b8aae27e-3f60d47a5c.zip +0 -0
  195. data/demo/.yarn/cache/icss-replace-symbols-npm-1.1.0-bc11c612de-24575b2c2f.zip +0 -0
  196. data/demo/.yarn/cache/icss-utils-npm-5.1.0-8d8c062d07-5c324d2835.zip +0 -0
  197. data/demo/.yarn/cache/ignore-npm-5.3.2-346d3ba017-2acfd32a57.zip +0 -0
  198. data/demo/.yarn/cache/import-fresh-npm-3.3.1-1916794950-a06b19461b.zip +0 -0
  199. data/demo/.yarn/cache/import-lazy-npm-4.0.0-3215653869-22f5e51702.zip +0 -0
  200. data/demo/.yarn/cache/imurmurhash-npm-0.1.4-610c5068a0-7cae75c8cd.zip +0 -0
  201. data/demo/.yarn/cache/indent-string-npm-5.0.0-35eaa3b052-e466c27b63.zip +0 -0
  202. data/demo/.yarn/cache/inflight-npm-1.0.6-ccedb4b908-f4f76aa072.zip +0 -0
  203. data/demo/.yarn/cache/inherits-npm-2.0.4-c66b3957a0-4a48a73384.zip +0 -0
  204. data/demo/.yarn/cache/ini-npm-1.3.8-fb5040b4c0-dfd98b0ca3.zip +0 -0
  205. data/demo/.yarn/cache/ip-address-npm-10.1.0-d5d5693401-76b1abcdf5.zip +0 -0
  206. data/demo/.yarn/cache/is-arrayish-npm-0.2.1-23927dfb15-eef4417e3c.zip +0 -0
  207. data/demo/.yarn/cache/is-binary-path-npm-2.1.0-e61d46f557-84192eb88c.zip +0 -0
  208. data/demo/.yarn/cache/is-core-module-npm-2.16.1-a54837229e-6ec5b3c42d.zip +0 -0
  209. data/demo/.yarn/cache/is-extglob-npm-2.1.1-0870ea68b5-df033653d0.zip +0 -0
  210. data/demo/.yarn/cache/is-fullwidth-code-point-npm-3.0.0-1ecf4ebee5-44a30c2945.zip +0 -0
  211. data/demo/.yarn/cache/is-glob-npm-4.0.3-cb87bf1bdb-d381c1319f.zip +0 -0
  212. data/demo/.yarn/cache/is-number-npm-7.0.0-060086935c-456ac6f8e0.zip +0 -0
  213. data/demo/.yarn/cache/is-path-inside-npm-3.0.3-2ea0ef44fd-abd50f0618.zip +0 -0
  214. data/demo/.yarn/cache/is-plain-obj-npm-1.1.0-1046f64c0b-0ee0480779.zip +0 -0
  215. data/demo/.yarn/cache/is-plain-object-npm-5.0.0-285b70faa3-e32d27061e.zip +0 -0
  216. data/demo/.yarn/cache/isexe-npm-2.0.0-b58870bd2e-26bf6c5480.zip +0 -0
  217. data/demo/.yarn/cache/isexe-npm-3.1.1-9c0061eead-7fe1931ee4.zip +0 -0
  218. data/demo/.yarn/cache/jackspeak-npm-3.4.3-546bfad080-be31027fc7.zip +0 -0
  219. data/demo/.yarn/cache/jackspeak-npm-4.1.1-582e5d1ed7-daca714c5a.zip +0 -0
  220. data/demo/.yarn/cache/js-tokens-npm-4.0.0-0ac852e9e2-8a95213a5a.zip +0 -0
  221. data/demo/.yarn/cache/js-yaml-npm-4.1.1-86ec786790-ea2339c693.zip +0 -0
  222. data/demo/.yarn/cache/json-buffer-npm-3.0.1-f8f6d20603-9026b03edc.zip +0 -0
  223. data/demo/.yarn/cache/json-parse-even-better-errors-npm-2.3.1-144d62256e-798ed4cf33.zip +0 -0
  224. data/demo/.yarn/cache/json-schema-traverse-npm-0.4.1-4759091693-7486074d3b.zip +0 -0
  225. data/demo/.yarn/cache/json-schema-traverse-npm-1.0.0-fb3684f4f0-02f2f466cd.zip +0 -0
  226. data/demo/.yarn/cache/json-stable-stringify-without-jsonify-npm-1.0.1-b65772b28b-cff44156dd.zip +0 -0
  227. data/demo/.yarn/cache/jsonfile-npm-6.2.0-aefb9ffd45-c3028ec5c7.zip +0 -0
  228. data/demo/.yarn/cache/keyv-npm-4.5.4-4c8e2cf7f7-74a24395b1.zip +0 -0
  229. data/demo/.yarn/cache/kind-of-npm-6.0.3-ab15f36220-3ab01e7b1d.zip +0 -0
  230. data/demo/.yarn/cache/known-css-properties-npm-0.29.0-6bc491faeb-daa6562e90.zip +0 -0
  231. data/demo/.yarn/cache/lefthook-darwin-arm64-npm-1.13.6-b8f333b5db-8.zip +0 -0
  232. data/demo/.yarn/cache/lefthook-npm-1.13.6-54219a35e6-3f84a08528.zip +0 -0
  233. data/demo/.yarn/cache/levn-npm-0.4.1-d183b2d7bb-12c5021c85.zip +0 -0
  234. data/demo/.yarn/cache/lilconfig-npm-3.1.3-74a77377bb-644eb10830.zip +0 -0
  235. data/demo/.yarn/cache/lines-and-columns-npm-1.2.4-d6c7cc5799-0c37f9f7fa.zip +0 -0
  236. data/demo/.yarn/cache/loader-utils-npm-3.3.1-eed38ce75b-d35808e081.zip +0 -0
  237. data/demo/.yarn/cache/locate-path-npm-6.0.0-06a1e4c528-72eb661788.zip +0 -0
  238. data/demo/.yarn/cache/lodash.camelcase-npm-4.3.0-bf268e3bf0-cb9227612f.zip +0 -0
  239. data/demo/.yarn/cache/lodash.merge-npm-4.6.2-77cb4416bf-ad580b4bdb.zip +0 -0
  240. data/demo/.yarn/cache/lodash.truncate-npm-4.4.2-bc50fe1663-b463d8a382.zip +0 -0
  241. data/demo/.yarn/cache/lru-cache-npm-10.4.3-30c10b861a-6476138d21.zip +0 -0
  242. data/demo/.yarn/cache/lru-cache-npm-11.2.2-685f5506dc-052b3d0b81.zip +0 -0
  243. data/demo/.yarn/cache/lru-cache-npm-6.0.0-b4c8668fe1-f97f499f89.zip +0 -0
  244. data/demo/.yarn/cache/lucide-static-npm-0.554.0-7aee65ee52-c357b6fbc4.zip +0 -0
  245. data/demo/.yarn/cache/make-dir-npm-3.1.0-d1d7505142-484200020a.zip +0 -0
  246. data/demo/.yarn/cache/make-fetch-happen-npm-15.0.2-53d5a83906-27413f3d69.zip +0 -0
  247. data/demo/.yarn/cache/map-obj-npm-1.0.1-fa55100fac-9949e7baec.zip +0 -0
  248. data/demo/.yarn/cache/map-obj-npm-4.3.0-d53e32935d-fbc554934d.zip +0 -0
  249. data/demo/.yarn/cache/mathml-tag-names-npm-2.1.3-875bd2d6e7-1201a25a13.zip +0 -0
  250. data/demo/.yarn/cache/mdn-data-npm-2.0.30-bf7b39c09a-d6ac5ac743.zip +0 -0
  251. data/demo/.yarn/cache/meow-npm-10.1.5-a1bab640d1-dd5f0caa4a.zip +0 -0
  252. data/demo/.yarn/cache/merge2-npm-1.4.1-a2507bd06c-7268db63ed.zip +0 -0
  253. data/demo/.yarn/cache/micromatch-npm-4.0.8-c9570e4aca-79920eb634.zip +0 -0
  254. data/demo/.yarn/cache/mime-npm-2.5.2-d3335c8166-dd3c93d433.zip +0 -0
  255. data/demo/.yarn/cache/minimatch-npm-10.1.1-453db4ee1a-8820c0be92.zip +0 -0
  256. data/demo/.yarn/cache/minimatch-npm-3.0.8-f3deb724b2-850cca179c.zip +0 -0
  257. data/demo/.yarn/cache/minimatch-npm-3.1.2-9405269906-c154e56640.zip +0 -0
  258. data/demo/.yarn/cache/minimatch-npm-9.0.5-9aa93d97fa-2c035575ed.zip +0 -0
  259. data/demo/.yarn/cache/minimist-options-npm-4.1.0-64ca250fc1-8c040b3068.zip +0 -0
  260. data/demo/.yarn/cache/minipass-collect-npm-2.0.1-73d3907e40-b251bceea6.zip +0 -0
  261. data/demo/.yarn/cache/minipass-fetch-npm-4.0.1-ce1d15e957-3dfca705ce.zip +0 -0
  262. data/demo/.yarn/cache/minipass-flush-npm-1.0.5-efe79d9826-56269a0b22.zip +0 -0
  263. data/demo/.yarn/cache/minipass-npm-3.3.6-b8d93a945b-a30d083c80.zip +0 -0
  264. data/demo/.yarn/cache/minipass-npm-7.1.2-3a5327d36d-2bfd325b95.zip +0 -0
  265. data/demo/.yarn/cache/minipass-pipeline-npm-1.2.4-5924cb077f-b14240dac0.zip +0 -0
  266. data/demo/.yarn/cache/minipass-sized-npm-1.0.3-306d86f432-79076749fc.zip +0 -0
  267. data/demo/.yarn/cache/minizlib-npm-3.1.0-6680befdba-a15e6f0128.zip +0 -0
  268. data/demo/.yarn/cache/ms-npm-2.1.3-81ff3cfac1-aa92de6080.zip +0 -0
  269. data/demo/.yarn/cache/nanoid-npm-3.3.11-f98c1f9ef6-3be20d8866.zip +0 -0
  270. data/demo/.yarn/cache/natural-compare-npm-1.4.0-97b75b362d-23ad088b08.zip +0 -0
  271. data/demo/.yarn/cache/negotiator-npm-1.0.0-47d727e27e-20ebfe79b2.zip +0 -0
  272. data/demo/.yarn/cache/node-gyp-npm-12.1.0-0690767ce9-198d91c535.zip +0 -0
  273. data/demo/.yarn/cache/node-releases-npm-2.0.27-b2d1b8de4a-a9a54079d8.zip +0 -0
  274. data/demo/.yarn/cache/nopt-npm-9.0.0-81316ec15c-7a5d9ab062.zip +0 -0
  275. data/demo/.yarn/cache/normalize-package-data-npm-3.0.3-1a49056685-bbcee00339.zip +0 -0
  276. data/demo/.yarn/cache/normalize-path-npm-3.0.0-658ba7d77f-88eeb4da89.zip +0 -0
  277. data/demo/.yarn/cache/normalize-range-npm-0.1.2-bec5e259e2-9b2f14f093.zip +0 -0
  278. data/demo/.yarn/cache/nth-check-npm-2.1.1-f97afc8169-5afc3dafcd.zip +0 -0
  279. data/demo/.yarn/cache/once-npm-1.4.0-ccf03ef07a-cd0a885013.zip +0 -0
  280. data/demo/.yarn/cache/optionator-npm-0.9.4-1f114b00e8-ecbd010e3d.zip +0 -0
  281. data/demo/.yarn/cache/p-limit-npm-3.1.0-05d2ede37f-7c3690c4db.zip +0 -0
  282. data/demo/.yarn/cache/p-locate-npm-5.0.0-92cc7c7a3e-1623088f36.zip +0 -0
  283. data/demo/.yarn/cache/p-map-npm-7.0.4-39386109d0-4be2097e94.zip +0 -0
  284. data/demo/.yarn/cache/package-json-from-dist-npm-1.0.1-4631a88465-58ee9538f2.zip +0 -0
  285. data/demo/.yarn/cache/parent-module-npm-1.0.1-1fae11b095-6ba8b25514.zip +0 -0
  286. data/demo/.yarn/cache/parse-json-npm-5.2.0-00a63b1199-62085b17d6.zip +0 -0
  287. data/demo/.yarn/cache/path-exists-npm-4.0.0-e9e4f63eb0-505807199d.zip +0 -0
  288. data/demo/.yarn/cache/path-is-absolute-npm-1.0.1-31bc695ffd-060840f92c.zip +0 -0
  289. data/demo/.yarn/cache/path-key-npm-3.1.1-0e66ea8321-55cd7a9dd4.zip +0 -0
  290. data/demo/.yarn/cache/path-parse-npm-1.0.7-09564527b7-49abf3d811.zip +0 -0
  291. data/demo/.yarn/cache/path-scurry-npm-1.11.1-aaf8c339af-890d5abcd5.zip +0 -0
  292. data/demo/.yarn/cache/path-scurry-npm-2.0.1-7744619e5d-a022c6c38f.zip +0 -0
  293. data/demo/.yarn/cache/path-type-npm-4.0.0-10d47fc86a-5b1e2daa24.zip +0 -0
  294. data/demo/.yarn/cache/picocolors-npm-1.1.1-4fede47cf1-e1cf46bf84.zip +0 -0
  295. data/demo/.yarn/cache/picomatch-npm-2.3.1-c782cfd986-050c865ce8.zip +0 -0
  296. data/demo/.yarn/cache/picomatch-npm-4.0.3-0a647b87cc-6817fb74eb.zip +0 -0
  297. data/demo/.yarn/cache/pify-npm-2.3.0-8b63310934-9503aaeaf4.zip +0 -0
  298. data/demo/.yarn/cache/postcss-attribute-case-insensitive-npm-5.0.2-6aa24bfafa-c0b8139f37.zip +0 -0
  299. data/demo/.yarn/cache/postcss-clamp-npm-4.1.0-32ba814068-118eec936b.zip +0 -0
  300. data/demo/.yarn/cache/postcss-cli-npm-10.1.0-a45841d3d2-c900cc48cb.zip +0 -0
  301. data/demo/.yarn/cache/postcss-color-functional-notation-npm-4.2.4-8f3a9400c3-b763e164fe.zip +0 -0
  302. data/demo/.yarn/cache/postcss-color-hex-alpha-npm-8.0.4-88605e8cec-a2f3173a60.zip +0 -0
  303. data/demo/.yarn/cache/postcss-color-rebeccapurple-npm-7.1.1-b7828c0a0c-03482f9b81.zip +0 -0
  304. data/demo/.yarn/cache/postcss-custom-media-npm-8.0.2-5ad89ea0fe-887bbbacf6.zip +0 -0
  305. data/demo/.yarn/cache/postcss-custom-properties-npm-12.1.11-78be1c709e-421f9d8d6b.zip +0 -0
  306. data/demo/.yarn/cache/postcss-custom-selectors-npm-6.0.3-0a63667536-18080d60a8.zip +0 -0
  307. data/demo/.yarn/cache/postcss-dir-pseudo-class-npm-6.0.5-2555aeb05f-7810c439d8.zip +0 -0
  308. data/demo/.yarn/cache/postcss-double-position-gradients-npm-3.1.2-278f758391-ca09bf2aef.zip +0 -0
  309. data/demo/.yarn/cache/postcss-env-function-npm-4.0.6-2282fa7c63-645b2363cf.zip +0 -0
  310. data/demo/.yarn/cache/postcss-flexbugs-fixes-npm-5.0.2-8c28e40a5b-022ddbcca8.zip +0 -0
  311. data/demo/.yarn/cache/postcss-focus-visible-npm-6.0.4-2eb1d7ff31-acd010b9dd.zip +0 -0
  312. data/demo/.yarn/cache/postcss-focus-within-npm-5.0.4-d70f73ac5d-f23d8ab757.zip +0 -0
  313. data/demo/.yarn/cache/postcss-font-variant-npm-5.0.0-0a5e349320-a192865892.zip +0 -0
  314. data/demo/.yarn/cache/postcss-gap-properties-npm-3.0.5-78f268ad64-aed559d6d3.zip +0 -0
  315. data/demo/.yarn/cache/postcss-image-set-function-npm-4.0.7-46769dca3e-7e50933098.zip +0 -0
  316. data/demo/.yarn/cache/postcss-import-npm-15.1.0-8b9e86f900-7bd04bd8f0.zip +0 -0
  317. data/demo/.yarn/cache/postcss-initial-npm-4.0.1-80cde7a815-6956953853.zip +0 -0
  318. data/demo/.yarn/cache/postcss-inline-svg-npm-5.0.0-bc19ff7916-96c5701c2c.zip +0 -0
  319. data/demo/.yarn/cache/postcss-lab-function-npm-4.2.1-1ebd916151-26ac74b430.zip +0 -0
  320. data/demo/.yarn/cache/postcss-load-config-npm-4.0.2-319bcff9ca-7c27dd3801.zip +0 -0
  321. data/demo/.yarn/cache/postcss-logical-npm-5.0.4-cf11b97479-17c71291ed.zip +0 -0
  322. data/demo/.yarn/cache/postcss-media-minmax-npm-5.0.0-ba7d6b2179-2cd7283e07.zip +0 -0
  323. data/demo/.yarn/cache/postcss-modules-extract-imports-npm-3.1.0-501aab09e8-b9192e0f4f.zip +0 -0
  324. data/demo/.yarn/cache/postcss-modules-local-by-default-npm-4.2.0-3f37e3939f-720d145453.zip +0 -0
  325. data/demo/.yarn/cache/postcss-modules-npm-5.0.0-eee2fcb829-60b34035b2.zip +0 -0
  326. data/demo/.yarn/cache/postcss-modules-npm-6.0.1-41d5592a7a-bdbf1e2bab.zip +0 -0
  327. data/demo/.yarn/cache/postcss-modules-scope-npm-3.2.1-eb0a0538a7-085f65863b.zip +0 -0
  328. data/demo/.yarn/cache/postcss-modules-values-npm-4.0.0-63d7ec543a-f7f2cdf14a.zip +0 -0
  329. data/demo/.yarn/cache/postcss-nesting-npm-10.2.0-eec5f664e8-25e6e66186.zip +0 -0
  330. data/demo/.yarn/cache/postcss-npm-8.5.6-e7f126c6f3-20f3b5d673.zip +0 -0
  331. data/demo/.yarn/cache/postcss-opacity-percentage-npm-1.1.3-552e884ed7-54d1b8ca68.zip +0 -0
  332. data/demo/.yarn/cache/postcss-overflow-shorthand-npm-3.0.4-b5a0785c77-7400902249.zip +0 -0
  333. data/demo/.yarn/cache/postcss-page-break-npm-3.0.4-6892987dc4-a7d08c945f.zip +0 -0
  334. data/demo/.yarn/cache/postcss-place-npm-7.0.5-895593f8b4-903fec0c31.zip +0 -0
  335. data/demo/.yarn/cache/postcss-preset-env-npm-7.8.3-242e470fd9-71bfb697ff.zip +0 -0
  336. data/demo/.yarn/cache/postcss-pseudo-class-any-link-npm-7.1.6-1a34600b0e-43aa18ea1e.zip +0 -0
  337. data/demo/.yarn/cache/postcss-replace-overflow-wrap-npm-4.0.0-e27e12bbc3-3ffe20b300.zip +0 -0
  338. data/demo/.yarn/cache/postcss-reporter-npm-7.1.0-af4f73892f-765d1d3bca.zip +0 -0
  339. data/demo/.yarn/cache/postcss-resolve-nested-selector-npm-0.1.6-c30614d887-85453901af.zip +0 -0
  340. data/demo/.yarn/cache/postcss-safe-parser-npm-6.0.0-dd01bffb52-06c733eaad.zip +0 -0
  341. data/demo/.yarn/cache/postcss-selector-not-npm-6.0.1-135f19a20c-fe523a0219.zip +0 -0
  342. data/demo/.yarn/cache/postcss-selector-parser-npm-6.1.2-46a8e03b00-ce9440fc42.zip +0 -0
  343. data/demo/.yarn/cache/postcss-selector-parser-npm-7.1.0-141ba29b54-1300e7871d.zip +0 -0
  344. data/demo/.yarn/cache/postcss-sorting-npm-8.0.2-d9f7d43c59-ebb5cc6a29.zip +0 -0
  345. data/demo/.yarn/cache/postcss-url-npm-10.1.3-1c99e6b8ad-5983dbd20e.zip +0 -0
  346. data/demo/.yarn/cache/postcss-value-parser-npm-4.2.0-3cef602a6a-819ffab0c9.zip +0 -0
  347. data/demo/.yarn/cache/prelude-ls-npm-1.2.1-3e4d272a55-cd192ec0d0.zip +0 -0
  348. data/demo/.yarn/cache/prettier-npm-2.8.8-430828a36c-b49e409431.zip +0 -0
  349. data/demo/.yarn/cache/pretty-hrtime-npm-1.0.3-32fd75fcbd-bae0e6832f.zip +0 -0
  350. data/demo/.yarn/cache/proc-log-npm-5.0.0-405173f9b4-c78b26ecef.zip +0 -0
  351. data/demo/.yarn/cache/proc-log-npm-6.0.0-455d6f01a6-005a2aa24b.zip +0 -0
  352. data/demo/.yarn/cache/promise-retry-npm-2.0.1-871f0b01b7-f96a3f6d90.zip +0 -0
  353. data/demo/.yarn/cache/punycode-npm-2.3.1-97543c420d-bb0a0ceedc.zip +0 -0
  354. data/demo/.yarn/cache/queue-microtask-npm-1.2.3-fcc98e4e2d-b676f8c040.zip +0 -0
  355. data/demo/.yarn/cache/quick-lru-npm-5.1.1-e38e0edce3-a516faa255.zip +0 -0
  356. data/demo/.yarn/cache/read-cache-npm-1.0.0-00fa89ed05-cffc728b9e.zip +0 -0
  357. data/demo/.yarn/cache/read-pkg-npm-6.0.0-d89ce14684-0cebdff381.zip +0 -0
  358. data/demo/.yarn/cache/read-pkg-up-npm-8.0.0-6f39941cc9-fe4c804016.zip +0 -0
  359. data/demo/.yarn/cache/readdirp-npm-3.6.0-f950cc74ab-1ced032e6e.zip +0 -0
  360. data/demo/.yarn/cache/redent-npm-4.0.0-67da39f156-6944e7b1d8.zip +0 -0
  361. data/demo/.yarn/cache/require-directory-npm-2.1.1-8608aee50b-fb47e70bf0.zip +0 -0
  362. data/demo/.yarn/cache/require-from-string-npm-2.0.2-8557e0db12-a03ef68954.zip +0 -0
  363. data/demo/.yarn/cache/resolve-from-npm-4.0.0-f758ec21bf-f4ba0b8494.zip +0 -0
  364. data/demo/.yarn/cache/resolve-from-npm-5.0.0-15c9db4d33-4ceeb9113e.zip +0 -0
  365. data/demo/.yarn/cache/resolve-npm-1.22.11-2b5ca6ec84-6d5baa2156.zip +0 -0
  366. data/demo/.yarn/cache/resolve-patch-4e481dbf2b-1462da84ac.zip +0 -0
  367. data/demo/.yarn/cache/retry-npm-0.12.0-72ac7fb4cc-623bd7d2e5.zip +0 -0
  368. data/demo/.yarn/cache/reusify-npm-1.1.0-96242be57f-64cb3142ac.zip +0 -0
  369. data/demo/.yarn/cache/rimraf-npm-3.0.2-2cb7dac69a-87f4164e39.zip +0 -0
  370. data/demo/.yarn/cache/run-parallel-npm-1.2.0-3f47ff2034-cb4f97ad25.zip +0 -0
  371. data/demo/.yarn/cache/safer-buffer-npm-2.1.2-8d5c0b705e-cab8f25ae6.zip +0 -0
  372. data/demo/.yarn/cache/semver-npm-6.3.1-bcba31fdbe-ae47d06de2.zip +0 -0
  373. data/demo/.yarn/cache/semver-npm-7.7.3-9cf7b3b46c-f013a3ee46.zip +0 -0
  374. data/demo/.yarn/cache/shebang-command-npm-2.0.0-eb2b01921d-6b52fe8727.zip +0 -0
  375. data/demo/.yarn/cache/shebang-regex-npm-3.0.0-899a0cd65e-1a2bcae50d.zip +0 -0
  376. data/demo/.yarn/cache/signal-exit-npm-4.1.0-61fb957687-64c757b498.zip +0 -0
  377. data/demo/.yarn/cache/slash-npm-3.0.0-b87de2279a-94a93fff61.zip +0 -0
  378. data/demo/.yarn/cache/slash-npm-4.0.0-ce4bbc4a80-da8e4af737.zip +0 -0
  379. data/demo/.yarn/cache/slash-npm-5.1.0-718a84282e-70434b34c5.zip +0 -0
  380. data/demo/.yarn/cache/slice-ansi-npm-4.0.0-6eeca1d10e-4a82d7f085.zip +0 -0
  381. data/demo/.yarn/cache/smart-buffer-npm-4.2.0-5ac3f668bb-b5167a7142.zip +0 -0
  382. data/demo/.yarn/cache/socks-npm-2.8.7-d1d20aae19-4bbe2c88cf.zip +0 -0
  383. data/demo/.yarn/cache/socks-proxy-agent-npm-8.0.5-24d77a90dc-b4fbcdb7ad.zip +0 -0
  384. data/demo/.yarn/cache/source-map-js-npm-1.2.1-b9a47d7e1a-4eb0cd997c.zip +0 -0
  385. data/demo/.yarn/cache/spdx-correct-npm-3.2.0-ffae008484-e9ae98d22f.zip +0 -0
  386. data/demo/.yarn/cache/spdx-exceptions-npm-2.5.0-718ed4b7d6-bb127d6e25.zip +0 -0
  387. data/demo/.yarn/cache/spdx-expression-parse-npm-3.0.1-b718cbb35a-a1c6e104a2.zip +0 -0
  388. data/demo/.yarn/cache/spdx-license-ids-npm-3.0.22-2b47dea449-3810ce1ddd.zip +0 -0
  389. data/demo/.yarn/cache/ssri-npm-12.0.0-97c0e53d2e-ef4b6b0ae4.zip +0 -0
  390. data/demo/.yarn/cache/string-hash-npm-1.1.3-3cb8892e7c-104b8667a5.zip +0 -0
  391. data/demo/.yarn/cache/string-width-npm-4.2.3-2c27177bae-e52c10dc3f.zip +0 -0
  392. data/demo/.yarn/cache/string-width-npm-5.1.2-bf60531341-7369deaa29.zip +0 -0
  393. data/demo/.yarn/cache/strip-ansi-npm-6.0.1-caddc7cb40-f3cd25890a.zip +0 -0
  394. data/demo/.yarn/cache/strip-ansi-npm-7.1.2-aa4fadccd9-db0e3f9654.zip +0 -0
  395. data/demo/.yarn/cache/strip-indent-npm-4.1.1-e5fb519bd9-d322bfdc59.zip +0 -0
  396. data/demo/.yarn/cache/strip-json-comments-npm-3.1.1-dcb2324823-492f73e272.zip +0 -0
  397. data/demo/.yarn/cache/style-search-npm-0.1.0-e3177d3642-3cfefe3350.zip +0 -0
  398. data/demo/.yarn/cache/stylelint-config-recommended-npm-11.0.0-22dbca58e6-f6bed59952.zip +0 -0
  399. data/demo/.yarn/cache/stylelint-config-standard-npm-31.0.0-fc3caa478e-8e5769252c.zip +0 -0
  400. data/demo/.yarn/cache/stylelint-npm-15.11.0-6dc193bb48-9835f8a3e3.zip +0 -0
  401. data/demo/.yarn/cache/stylelint-order-npm-6.0.4-fa909cac07-66ed8a80b3.zip +0 -0
  402. data/demo/.yarn/cache/supports-color-npm-7.2.0-606bfcf7da-3dda818de0.zip +0 -0
  403. data/demo/.yarn/cache/supports-hyperlinks-npm-3.2.0-f5a5cbe606-460594ec00.zip +0 -0
  404. data/demo/.yarn/cache/supports-preserve-symlinks-flag-npm-1.0.0-f17c4d0028-53b1e247e6.zip +0 -0
  405. data/demo/.yarn/cache/svg-tags-npm-1.0.0-68a35c11fa-407e5ef87c.zip +0 -0
  406. data/demo/.yarn/cache/table-npm-6.9.0-5955281f93-f54a7d1c11.zip +0 -0
  407. data/demo/.yarn/cache/tar-npm-7.5.2-6d8cfb7a13-192559b0e7.zip +0 -0
  408. data/demo/.yarn/cache/text-table-npm-0.2.0-d92a778b59-b6937a38c8.zip +0 -0
  409. data/demo/.yarn/cache/thenby-npm-1.3.4-766aefdf7d-2d2ef3d67f.zip +0 -0
  410. data/demo/.yarn/cache/tinyglobby-npm-0.2.15-0e783aadbd-0e33b8babf.zip +0 -0
  411. data/demo/.yarn/cache/to-regex-range-npm-5.0.1-f1e8263b00-f76fa01b3d.zip +0 -0
  412. data/demo/.yarn/cache/trim-newlines-npm-4.1.1-d247eb0d1e-5b09f8e329.zip +0 -0
  413. data/demo/.yarn/cache/type-check-npm-0.4.0-60565800ce-ec688ebfc9.zip +0 -0
  414. data/demo/.yarn/cache/type-fest-npm-0.20.2-b36432617f-4fb3272df2.zip +0 -0
  415. data/demo/.yarn/cache/type-fest-npm-1.4.0-7dd848962a-b011c33886.zip +0 -0
  416. data/demo/.yarn/cache/undici-types-npm-7.16.0-0e23b08124-1ef68fc6c5.zip +0 -0
  417. data/demo/.yarn/cache/unique-filename-npm-4.0.0-bfc100c4e3-6a62094fca.zip +0 -0
  418. data/demo/.yarn/cache/unique-slug-npm-5.0.0-11508c0469-222d0322bc.zip +0 -0
  419. data/demo/.yarn/cache/universalify-npm-2.0.1-040ba5a21e-ecd8469fe0.zip +0 -0
  420. data/demo/.yarn/cache/update-browserslist-db-npm-1.1.4-55ef7b4ab9-b757805a63.zip +0 -0
  421. data/demo/.yarn/cache/uri-js-npm-4.4.1-66d11cbcaf-7167432de6.zip +0 -0
  422. data/demo/.yarn/cache/util-deprecate-npm-1.0.2-e3fe1a219c-474acf1146.zip +0 -0
  423. data/demo/.yarn/cache/validate-npm-package-license-npm-3.0.4-7af8adc7a8-35703ac889.zip +0 -0
  424. data/demo/.yarn/cache/which-npm-1.3.1-f0ebb8bdd8-f2e185c624.zip +0 -0
  425. data/demo/.yarn/cache/which-npm-2.0.2-320ddf72f7-1a5c563d3c.zip +0 -0
  426. data/demo/.yarn/cache/which-npm-6.0.0-48f25f0ec8-df19b2cd8a.zip +0 -0
  427. data/demo/.yarn/cache/word-wrap-npm-1.2.5-42d00c4b09-f93ba3586f.zip +0 -0
  428. data/demo/.yarn/cache/wrap-ansi-npm-7.0.0-ad6e1a0554-a790b846fd.zip +0 -0
  429. data/demo/.yarn/cache/wrap-ansi-npm-8.1.0-26a4e6ae28-371733296d.zip +0 -0
  430. data/demo/.yarn/cache/wrappy-npm-1.0.2-916de4d4b3-159da4805f.zip +0 -0
  431. data/demo/.yarn/cache/write-file-atomic-npm-5.0.1-52283db6ee-8dbb0e2512.zip +0 -0
  432. data/demo/.yarn/cache/xxhashjs-npm-0.2.2-70e0154c76-cf6baf05ba.zip +0 -0
  433. data/demo/.yarn/cache/y18n-npm-5.0.8-5f3a0a7e62-54f0fb9562.zip +0 -0
  434. data/demo/.yarn/cache/yallist-npm-4.0.0-b493d9e907-343617202a.zip +0 -0
  435. data/demo/.yarn/cache/yallist-npm-5.0.0-8732dd9f1c-eba5118240.zip +0 -0
  436. data/demo/.yarn/cache/yaml-npm-2.8.1-b364b3bec4-35b46150d4.zip +0 -0
  437. data/demo/.yarn/cache/yargs-npm-17.7.2-80b62638e1-73b572e863.zip +0 -0
  438. data/demo/.yarn/cache/yargs-parser-npm-20.2.9-a1d19e598d-8bb69015f2.zip +0 -0
  439. data/demo/.yarn/cache/yargs-parser-npm-21.1.1-8fdc003314-ed2d96a616.zip +0 -0
  440. data/demo/.yarn/cache/yocto-queue-npm-0.1.0-c6c9a7db29-f77b3d8d00.zip +0 -0
  441. data/demo/.yarnrc.yml +5 -0
  442. data/demo/Gemfile +24 -0
  443. data/demo/Gemfile.lock +293 -0
  444. data/demo/Makefile +8 -0
  445. data/demo/Procfile.dev +2 -0
  446. data/demo/Rakefile +6 -0
  447. data/demo/app/assets/images/.keep +0 -0
  448. data/demo/app/assets/stylesheets/application.css +23 -0
  449. data/demo/app/components/index.js +20 -0
  450. data/demo/app/controllers/application_controller.rb +2 -0
  451. data/demo/app/javascript/application.js +3 -0
  452. data/demo/app/javascript/controllers/application.js +9 -0
  453. data/demo/app/javascript/controllers/index.js +5 -0
  454. data/demo/app/models/current.rb +3 -0
  455. data/demo/app/views/layouts/application.html.erb +19 -0
  456. data/demo/app/views/layouts/backpack.html.erb +40 -0
  457. data/demo/bin/dev +2 -0
  458. data/demo/bin/rails +4 -0
  459. data/demo/bin/rake +4 -0
  460. data/demo/bin/setup +26 -0
  461. data/demo/bin/thrust +5 -0
  462. data/demo/config/application.rb +57 -0
  463. data/demo/config/boot.rb +3 -0
  464. data/demo/config/cable.yml +10 -0
  465. data/demo/config/ci.rb +14 -0
  466. data/demo/config/database.yml +41 -0
  467. data/demo/config/environment.rb +5 -0
  468. data/demo/config/environments/development.rb +48 -0
  469. data/demo/config/environments/production.rb +61 -0
  470. data/demo/config/environments/test.rb +42 -0
  471. data/demo/config/initializers/assets.rb +7 -0
  472. data/demo/config/initializers/content_security_policy.rb +29 -0
  473. data/demo/config/initializers/filter_parameter_logging.rb +8 -0
  474. data/demo/config/initializers/inflections.rb +16 -0
  475. data/demo/config/initializers/phlex.rb +9 -0
  476. data/demo/config/locales/en.yml +31 -0
  477. data/demo/config/puma.rb +39 -0
  478. data/demo/config/routes.rb +9 -0
  479. data/demo/config.ru +6 -0
  480. data/demo/db/seeds.rb +9 -0
  481. data/demo/esbuild.config.js +36 -0
  482. data/demo/log/.keep +0 -0
  483. data/demo/package.json +36 -0
  484. data/demo/postcss.config.js +56 -0
  485. data/demo/public/404.html +135 -0
  486. data/demo/public/500.html +135 -0
  487. data/demo/public/icon.png +0 -0
  488. data/demo/public/icon.svg +3 -0
  489. data/demo/public/robots.txt +1 -0
  490. data/demo/test/fixtures/files/.keep +0 -0
  491. data/demo/test/test_helper.rb +15 -0
  492. data/demo/tmp/.keep +0 -0
  493. data/demo/tmp/pids/.keep +0 -0
  494. data/demo/tmp/storage/.keep +0 -0
  495. data/demo/yarn.lock +4434 -0
  496. data/docs/getting_started.md.erb +10 -0
  497. data/docs/tokens-and-utilities.md.erb +199 -0
  498. data/figma/Backpack.json +1 -0
  499. data/lib/backpack/attributes.rb +43 -0
  500. data/lib/backpack/classes.rb +38 -0
  501. data/lib/backpack/components/badge/badge.css +51 -0
  502. data/lib/backpack/components/badge/badge.js +1 -0
  503. data/lib/backpack/components/badge.rb +25 -0
  504. data/lib/backpack/components/base.rb +15 -0
  505. data/lib/backpack/components/breadcrumb/breadcrumb.css +51 -0
  506. data/lib/backpack/components/breadcrumb/breadcrumb.js +1 -0
  507. data/lib/backpack/components/breadcrumb.rb +49 -0
  508. data/lib/backpack/components/button/button.css +215 -0
  509. data/lib/backpack/components/button/button.js +1 -0
  510. data/lib/backpack/components/button.rb +29 -0
  511. data/lib/backpack/components/favicon.rb +16 -0
  512. data/lib/backpack/components/heading/heading.css +27 -0
  513. data/lib/backpack/components/heading/heading.js +1 -0
  514. data/lib/backpack/components/heading.rb +16 -0
  515. data/lib/backpack/components/icon/icon.css +10 -0
  516. data/lib/backpack/components/icon/icon.js +1 -0
  517. data/lib/backpack/components/icon.rb +41 -0
  518. data/lib/backpack/components/icon_button/icon_button.css +183 -0
  519. data/lib/backpack/components/icon_button/icon_button.js +1 -0
  520. data/lib/backpack/components/icon_button.rb +32 -0
  521. data/lib/backpack/components/icon_sprite.rb +60 -0
  522. data/lib/backpack/components/quotation/quotation.css +39 -0
  523. data/lib/backpack/components/quotation/quotation.js +1 -0
  524. data/lib/backpack/components/quotation.rb +30 -0
  525. data/lib/backpack/components/rich_text/rich_text.css +0 -0
  526. data/lib/backpack/components/rich_text/rich_text.js +1 -0
  527. data/lib/backpack/components/rich_text.rb +9 -0
  528. data/lib/backpack/components/skip_links/skip_links.css +35 -0
  529. data/lib/backpack/components/skip_links/skip_links.js +1 -0
  530. data/lib/backpack/components/skip_links.rb +18 -0
  531. data/lib/backpack/components.rb +3 -0
  532. data/lib/backpack/identifier.rb +17 -0
  533. data/lib/backpack/stylesheets/application.css +12 -0
  534. data/lib/backpack/stylesheets/base/_base.css +59 -0
  535. data/lib/backpack/stylesheets/tokens/_colors.css +179 -0
  536. data/lib/backpack/stylesheets/tokens/_focus.css +4 -0
  537. data/lib/backpack/stylesheets/tokens/_layout.css +12 -0
  538. data/lib/backpack/stylesheets/tokens/_radius.css +11 -0
  539. data/lib/backpack/stylesheets/tokens/_spacing.css +14 -0
  540. data/lib/backpack/stylesheets/tokens/_typography.css +37 -0
  541. data/lib/backpack/stylesheets/utilities/_focus.css +14 -0
  542. data/lib/backpack/stylesheets/utilities/_sr-only.css +50 -0
  543. data/lib/backpack/tokens.rb +11 -0
  544. data/lib/backpack/version.rb +5 -0
  545. data/lib/backpack.rb +17 -101
  546. data/spec/components/badge_spec.rb +31 -0
  547. data/spec/components/breadcrumb_spec.rb +55 -0
  548. data/spec/components/button_spec.rb +95 -0
  549. data/spec/components/favicon_spec.rb +28 -0
  550. data/spec/components/heading_spec.rb +39 -0
  551. data/spec/components/icon_button_spec.rb +58 -0
  552. data/spec/components/icon_spec.rb +139 -0
  553. data/spec/components/icon_sprite_spec.rb +46 -0
  554. data/spec/components/previews/badge_preview/overview.html.erb +36 -0
  555. data/spec/components/previews/badge_preview.rb +12 -0
  556. data/spec/components/previews/breadcrumb_preview.rb +12 -0
  557. data/spec/components/previews/button_preview/overview.html.erb +47 -0
  558. data/spec/components/previews/button_preview.rb +22 -0
  559. data/spec/components/previews/heading_preview.rb +21 -0
  560. data/spec/components/previews/icon_button_preview/overview.html.erb +48 -0
  561. data/spec/components/previews/icon_button_preview.rb +14 -0
  562. data/spec/components/previews/icon_preview.rb +13 -0
  563. data/spec/components/previews/quotation_preview/overview.html.erb +24 -0
  564. data/spec/components/previews/quotation_preview.rb +14 -0
  565. data/spec/components/previews/rich_text_preview.rb +101 -0
  566. data/spec/components/previews/skip_links_preview.rb +7 -0
  567. data/spec/components/quotation_spec.rb +58 -0
  568. data/spec/components/rich_text_spec.rb +39 -0
  569. data/spec/components/skip_links_spec.rb +31 -0
  570. data/spec/fixtures/icons/arrow-right.svg +1 -0
  571. data/spec/fixtures/icons/close.svg +1 -0
  572. data/spec/fixtures/icons/user.svg +1 -0
  573. data/spec/spec_helper.rb +20 -0
  574. data/spec/support/components.rb +8 -0
  575. data/spec/support/matchers/eq_html.rb +47 -0
  576. data/spec/support/matchers/include_html.rb +47 -0
  577. data/spec/support/spec_helpers.rb +15 -0
  578. data/vendor/normalize.css +351 -0
  579. metadata +662 -98
  580. data/AUTHORS +0 -1
  581. data/COPYING +0 -340
  582. data/README +0 -65
  583. data/bin/backpack +0 -59
  584. data/doc/rdoc/created.rid +0 -1
  585. data/doc/rdoc/files/AUTHORS.html +0 -95
  586. data/doc/rdoc/files/COPYING.html +0 -519
  587. data/doc/rdoc/files/README.html +0 -175
  588. data/doc/rdoc/index.html +0 -10
  589. data/doc/rdoc/permalink.gif +0 -0
  590. data/doc/rdoc/rdoc-style.css +0 -106
  591. data/doc/rdoc/rubyfr.png +0 -0
  592. data/lib/template/INSTALL.rb +0 -5
  593. data/lib/template/LICENCE.rb +0 -21
  594. data/lib/template/README.rb +0 -26
  595. data/lib/template/generators/plugin_begin.rb +0 -8
  596. data/lib/template/generators/plugin_end.rb +0 -2
  597. data/lib/template/generators/plugin_generator.rb +0 -32
  598. data/lib/template/generators/template/template_controller.rb +0 -17
  599. data/lib/template/generators/template/template_view.rb +0 -12
  600. data/lib/template/init.rb +0 -2
  601. data/lib/template/init_controller.rb +0 -3
  602. data/lib/template/init_view.rb +0 -3
  603. data/lib/template/lib/plugin/controller_helpers.rb +0 -5
  604. data/lib/template/lib/plugin/view_helpers.rb +0 -5
  605. data/lib/template/tasks/tasks.rb +0 -27
  606. data/setup.rb +0 -1585
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe Components::Badge, type: :component do
4
+ let(:component) { described_class.new(**params) { text } }
5
+ let(:params) { {} }
6
+ let(:text) { "Badge" }
7
+
8
+ subject(:output) { render_fragment(component) }
9
+
10
+ it "renders the element with the default styling" do
11
+ expect(output).to have_css(
12
+ ".Badge.Badge-variant-solid", text:
13
+ )
14
+ end
15
+
16
+ context "with variant options" do
17
+ let(:params) { { variant: :outline, size: 3 } }
18
+
19
+ it "updates the variant modifiers in the class list" do
20
+ expect(output).to have_css(".Badge.Badge-variant-outline.Badge-size-3", text:)
21
+ end
22
+ end
23
+
24
+ context "with a color option" do
25
+ let(:params) { { color: :red } }
26
+
27
+ it "sets the data-accent-color attribute" do
28
+ expect(output).to have_css(".Badge.Badge-variant-solid[data-accent-color='red']", text:)
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ describe Components::Breadcrumb, type: :component do
4
+ let(:component) { described_class.new(**params) }
5
+ let(:params) { {} }
6
+
7
+ subject(:output) { render_fragment(component) }
8
+
9
+ context "without items" do
10
+ it "renders nothing" do
11
+ expect(output).to eq_html('')
12
+ end
13
+ end
14
+
15
+ context "with items" do
16
+ let(:component) do
17
+ described_class.new(**params) do |c|
18
+ c.item(href: "/") { "Home" }
19
+ c.item(href: "/sections") { "Sections" }
20
+ c.item(href: "") { "Articles" }
21
+ end
22
+ end
23
+
24
+ it "renders a navigation landmark with default aria label" do
25
+ expect(output).to have_css("nav.Breadcrumb[role='navigation'][aria-label='Breadcrumb']")
26
+ end
27
+
28
+ it "renders all items" do
29
+ expect(output).to have_css("li:nth-child(1) a[href='/']", text: "Home")
30
+ expect(output).to have_css("li:nth-child(2) a[href='/sections']", text: "Sections")
31
+ expect(output).to have_css("li:nth-child(3) a[href='']", text: "Articles")
32
+ end
33
+
34
+ context "with custom HTML attributes" do
35
+ let(:params) do
36
+ {
37
+ class: "custom",
38
+ data: { controller: "crumbs" }
39
+ }
40
+ end
41
+
42
+ it "merges the custom attributes with the generated ones" do
43
+ expect(output).to have_css("nav.Breadcrumb.custom[data-controller='crumbs']")
44
+ end
45
+ end
46
+
47
+ context "with a custom aria label" do
48
+ let(:params) { { aria_label: "Fil d'Ariane" } }
49
+
50
+ it "sets the provided aria label on the root element" do
51
+ expect(output).to have_css("nav[aria-label=\"Fil d'Ariane\"]")
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,95 @@
1
+ require 'spec_helper'
2
+
3
+ describe Components::Button, type: :component do
4
+ let(:component) { described_class.new(**params) { text } }
5
+ let(:params) { {} }
6
+ let(:text) { "Label" }
7
+
8
+ subject(:output) { render_fragment(component) }
9
+
10
+ it "renders a button element with the default styling" do
11
+ expect(output).to have_css(
12
+ "button.Button.Button-variant-solid.Button-size-2", text:
13
+ )
14
+ end
15
+
16
+ it "doesn't render an icon" do
17
+ expect(output).to_not have_css("button.Button svg.Icon")
18
+ end
19
+
20
+ context "with a href" do
21
+ let(:params) { { href: "/path" } }
22
+
23
+ it "renders a link element using the same styling classes" do
24
+ expect(output).to have_css("a.Button.Button-variant-solid.Button-size-2[href='/path']", text:)
25
+ end
26
+ end
27
+
28
+ context "with variant options" do
29
+ let(:params) { { variant: :outline, color: :red, size: 1 } }
30
+
31
+ it "updates the variant modifiers in the class list" do
32
+ expect(output).to have_css("button.Button.Button-variant-outline.Button-size-1", text:)
33
+ end
34
+ end
35
+
36
+ context "with HTML attributes" do
37
+ let(:params) do
38
+ { class: "custom", data: { test: "value" }, aria: { label: "Perform action" } }
39
+ end
40
+
41
+ it "merges the custom attributes with the generated ones" do
42
+ expect(output).to have_css(
43
+ "button.Button.Button-variant-solid.Button-size-2.custom[data-test='value'][aria-label='Perform action']", text:
44
+ )
45
+ end
46
+ end
47
+
48
+ context "with a color option" do
49
+ let(:params) { { color: :red } }
50
+
51
+ it "sets the data-accent-color attribute" do
52
+ expect(output).to have_css("button.Button.Button-variant-solid.Button-size-2[data-accent-color='red']", text:)
53
+ end
54
+ end
55
+
56
+ context "with an icon before the text" do
57
+ let(:icon) { render(Components::Icon.new("user")) }
58
+ let(:component) do
59
+ described_class.new(**params) do
60
+ icon
61
+ text
62
+ end
63
+ end
64
+
65
+ xit "renders the icon before the text" do
66
+ expect(output).to have_css("button.Button.Button-variant-solid.Button-size-2", text:)
67
+ expect(output).to eq_html <<~HTML
68
+ <button class="Button Button-variant-solid Button-size-2">
69
+ <svg class="Icon" data-icon-key="user" role="img"><use xlink:href="#IconSprite-user"></use></svg>
70
+ Label
71
+ </button>
72
+ HTML
73
+ end
74
+ end
75
+
76
+ context "with an icon after the text" do
77
+ let(:icon) { render(Components::Icon.new("user")) }
78
+ let(:component) do
79
+ described_class.new(**params) do
80
+ text
81
+ icon
82
+ end
83
+ end
84
+
85
+ xit "renders the icon after the text" do
86
+ expect(output).to have_css("button.Button.Button-variant-solid.Button-size-2", text:)
87
+ expect(output).to eq_html <<~HTML
88
+ <button class="Button Button-variant-solid Button-size-2">
89
+ Label
90
+ <svg class="Icon" data-icon-key="user" role="img"><use xlink:href="#IconSprite-user"></use></svg>
91
+ </button>
92
+ HTML
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe Components::Favicon, type: :component do
4
+ let(:component) { described_class.new(**params) }
5
+ let(:params) { {} }
6
+
7
+ subject(:output) { render_fragment(component) }
8
+
9
+ it "renders the links" do
10
+ expect(output).to eq_html <<~HTML
11
+ <link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96">
12
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg">
13
+ <link rel="shortcut icon" href="/favicon.ico">
14
+ <link rel="apple-touch-icon" href="/apple-touch-icon.png" sizes="180x180">
15
+ <link rel="manifest" href="/site.webmanifest">
16
+ HTML
17
+ end
18
+
19
+ context "with application name" do
20
+ let(:params) { { application_name: "My App" } }
21
+
22
+ it "renders the apple-mobile-web-app-title meta" do
23
+ expect(output).to include_html <<~HTML
24
+ <meta name="apple-mobile-web-app-title" content="My App">
25
+ HTML
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ describe Components::Heading, type: :component do
4
+ let(:component) { described_class.new(**params) { text } }
5
+ let(:params) { {} }
6
+ let(:text) { "Heading" }
7
+
8
+ subject(:output) { render_fragment(component) }
9
+
10
+ it "renders a level 1 heading by default" do
11
+ expect(output).to have_css("h1.Heading.Heading-1", text:)
12
+ end
13
+
14
+ context "with a different level" do
15
+ let(:params) { { level: 3 } }
16
+
17
+ it "uses the corresponding heading tag and classes" do
18
+ expect(output).to have_css("h3.Heading.Heading-3", text:)
19
+ end
20
+ end
21
+
22
+ context "with a custom tag" do
23
+ let(:params) { { tag: :h2 } }
24
+
25
+ it "renders the provided tag while keeping the computed classes" do
26
+ expect(output).to have_css("h2.Heading.Heading-1", text:)
27
+ end
28
+ end
29
+
30
+ context "with HTML attributes" do
31
+ let(:params) do
32
+ { class: "custom", data: { foo: "bar" } }
33
+ end
34
+
35
+ it "merges user attributes with the component defaults" do
36
+ expect(output).to have_css("h1.Heading.Heading-1.custom[data-foo='bar']", text:)
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ describe Components::IconButton, type: :component do
4
+ let(:component) { described_class.new(**params) }
5
+ let(:params) { { icon: :user, label: "User" } }
6
+
7
+ subject(:output) { render_fragment(component) }
8
+
9
+ it "renders a button element with the default styling" do
10
+ expect(output).to have_css(
11
+ "button.IconButton.IconButton-variant-solid.IconButton-size-2"
12
+ )
13
+ end
14
+
15
+ it "renders the icon" do
16
+ expect(output).to have_css("button.IconButton svg.Icon.IconButton-icon[data-icon-key='user']")
17
+ end
18
+
19
+ context "with a href" do
20
+ let(:params) { { icon: :user, label: "User", href: "/path" } }
21
+
22
+ it "renders a link element using the same styling classes" do
23
+ expect(output).to have_css(
24
+ "a.IconButton.IconButton-variant-solid.IconButton-size-2[href='/path']"
25
+ )
26
+ end
27
+ end
28
+
29
+ context "with variant options" do
30
+ let(:params) { { icon: :user, label: "User", variant: :outline, color: :red, size: 1 } }
31
+
32
+ it "updates the variant modifiers in the class list" do
33
+ expect(output).to have_css(
34
+ "button.IconButton.IconButton-variant-outline.IconButton-size-1"
35
+ )
36
+ end
37
+ end
38
+
39
+ context "with HTML attributes" do
40
+ let(:params) do
41
+ { icon: :user, label: "User", class: "custom", data: { test: "value" }, aria: { label: "Open menu" } }
42
+ end
43
+
44
+ it "merges custom attributes with the generated ones" do
45
+ expect(output).to have_css(
46
+ "button.IconButton.IconButton-variant-solid.IconButton-size-2.custom[data-test='value'][aria-label='Open menu']"
47
+ )
48
+ end
49
+ end
50
+
51
+ context "with a color option" do
52
+ let(:params) { { icon: :user, label: "User", color: :red } }
53
+
54
+ it "sets the data-accent-color attribute" do
55
+ expect(output).to have_css("button.IconButton[data-accent-color='red']")
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,139 @@
1
+ require 'spec_helper'
2
+
3
+ describe Components::Icon, type: :component do
4
+ let(:component) { described_class.new(key, **params) }
5
+ let(:key) { nil }
6
+ let(:params) { {} }
7
+
8
+ subject(:output) { render_fragment(component) }
9
+
10
+ context "with symbol key" do
11
+ let(:key) { :user }
12
+
13
+ it "renders the svg with the key" do
14
+ expect(output).to eq_html <<~HTML
15
+ <svg class="Icon" data-icon-key="user" role="img"><use xlink:href="#IconSprite-user"></use></svg>
16
+ HTML
17
+ end
18
+ end
19
+
20
+ context "with string key" do
21
+ let(:key) { "user" }
22
+
23
+ it "renders the svg with the key" do
24
+ expect(output).to eq_html <<~HTML
25
+ <svg class="Icon" data-icon-key="user" role="img"><use xlink:href="#IconSprite-user"></use></svg>
26
+ HTML
27
+ end
28
+ end
29
+
30
+ context "with key that needs formatting" do
31
+ let(:key) { "left Arrow" }
32
+
33
+ it "correctly formats the key" do
34
+ expect(output).to eq_html <<~HTML
35
+ <svg class="Icon" data-icon-key="left-arrow" role="img"><use xlink:href="#IconSprite-left-arrow"></use></svg>
36
+ HTML
37
+ end
38
+ end
39
+
40
+ context "with key that contains a slash" do
41
+ let(:key) { "social/discord" }
42
+
43
+ it "replaces the slash with a dash" do
44
+ expect(output).to eq_html <<~HTML
45
+ <svg class="Icon" data-icon-key="social-discord" role="img"><use xlink:href="#IconSprite-social-discord"></use></svg>
46
+ HTML
47
+ end
48
+ end
49
+
50
+ context "without role" do
51
+ let(:key) { :user }
52
+ let(:params) { { role: nil } }
53
+
54
+ it "has no role attribute" do
55
+ expect(output).to eq_html <<~HTML
56
+ <svg class="Icon" data-icon-key="user"><use xlink:href="#IconSprite-user"></use></svg>
57
+ HTML
58
+ end
59
+ end
60
+
61
+ describe "when the icon conveys information" do
62
+ let(:key) { :user }
63
+
64
+ context "with label" do
65
+ let(:params) { { label: "User" } }
66
+
67
+ it "has the role and aria-label attributes, and a title element" do
68
+ expect(output).to eq_html <<~HTML
69
+ <svg class="Icon" data-icon-key="user" role="img" aria-label="User"><title>User</title><use xlink:href="#IconSprite-user"></use></svg>
70
+ HTML
71
+ end
72
+ end
73
+ end
74
+
75
+ describe "when the icon does not convey information" do
76
+ let(:key) { :user }
77
+ let(:params) { { aria_hidden: true, role: nil } }
78
+
79
+ context "with aria_hidden as a boolean" do
80
+ let(:params) { { aria_hidden: true, role: nil } }
81
+
82
+ it "has the aria-hidden attribute and no role attribute" do
83
+ expect(output).to eq_html <<~HTML
84
+ <svg class="Icon" data-icon-key="user" aria-hidden="true"><use xlink:href="#IconSprite-user"></use></svg>
85
+ HTML
86
+ end
87
+ end
88
+
89
+ context "with aria_hidden as a string" do
90
+ let(:params) { { aria_hidden: "true", role: nil } }
91
+
92
+ it "has the aria-hidden attribute and no role attribute" do
93
+ expect(output).to eq_html <<~HTML
94
+ <svg class="Icon" data-icon-key="user" aria-hidden="true"><use xlink:href="#IconSprite-user"></use></svg>
95
+ HTML
96
+ end
97
+ end
98
+
99
+ context "with label" do
100
+ let(:params) { { aria_hidden: true, role: nil, label: "User" } }
101
+
102
+ it "has the aria-hidden attribute, no role attribute and no label" do
103
+ expect(output).to eq_html <<~HTML
104
+ <svg class="Icon" data-icon-key="user" aria-hidden="true"><use xlink:href="#IconSprite-user"></use></svg>
105
+ HTML
106
+ end
107
+ end
108
+ end
109
+
110
+ context "with Current" do
111
+ let(:current_class) do
112
+ Class.new(ActiveSupport::CurrentAttributes) do
113
+ attribute :icons
114
+ end
115
+ end
116
+
117
+ before do
118
+ stub_const('Current', current_class)
119
+ end
120
+
121
+ after do
122
+ Current.reset
123
+ end
124
+
125
+ describe "adds the icon key to Current.icons" do
126
+ let(:key) { :user }
127
+
128
+ it "adds the icon key to Current.icons" do
129
+ output
130
+ expect(Current.icons).to eq(["user"])
131
+ end
132
+
133
+ it "doesn't add the icon key twice" do
134
+ 2.times { output }
135
+ expect(Current.icons).to eq(["user"])
136
+ end
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe Components::IconSprite, type: :component do
4
+ let(:component) { described_class.new(**params) }
5
+ let(:params) { {} }
6
+
7
+ subject(:output) { render_fragment(component) }
8
+
9
+ context "without Current" do
10
+ it "renders nothing" do
11
+ expect(output).to eq_html('')
12
+ end
13
+ end
14
+
15
+ context "with Current" do
16
+ let(:current_class) do
17
+ Class.new(ActiveSupport::CurrentAttributes) do
18
+ attribute :icons
19
+ end
20
+ end
21
+
22
+ before do
23
+ stub_const('Current', current_class)
24
+ end
25
+
26
+ after do
27
+ Current.reset
28
+ end
29
+
30
+ it "renders nothing" do
31
+ expect(output).to eq_html('')
32
+ end
33
+
34
+ context "with icons in Current" do
35
+ before do
36
+ Current.icons = %w[user close]
37
+ end
38
+
39
+ it "renders the sprite with icons ordered alphabetically" do
40
+ expect(output).to eq_html <<~HTML
41
+ <svg class="IconSprite" hidden=""><defs><symbol id="IconSprite-close" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 6 6 18"></path><path d="m6 6 12 12"></path></symbol><symbol id="IconSprite-user" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"></path><circle cx="12" cy="7" r="4"></circle></symbol></defs></svg>
42
+ HTML
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,36 @@
1
+ <% props = Components::Badge.literal_properties %>
2
+
3
+ <table class="lookbook-table">
4
+ <thead>
5
+ <tr>
6
+ <th>Color</th>
7
+ <% props[:color].type.each do |color| %>
8
+ <th colspan="<%= props[:size].type.to_a.size %>">
9
+ <code><%= color || :default %></code>
10
+ </th>
11
+ <% end %>
12
+ </tr>
13
+ <tr>
14
+ <th>Size</th>
15
+ <% props[:color].type.each do %>
16
+ <% props[:size].type.each do |size| %>
17
+ <th><code><%= size %></code></th>
18
+ <% end %>
19
+ <% end %>
20
+ </tr>
21
+ </thead>
22
+ <tbody>
23
+ <% props[:variant].type.each do |variant| %>
24
+ <tr>
25
+ <th><code><%= variant %></code></th>
26
+ <% props[:color].type.each do |color| %>
27
+ <% props[:size].type.each do |size| %>
28
+ <td>
29
+ <%= render Components::Badge.new(variant:, size:, color:) { "Badge" } %>
30
+ </td>
31
+ <% end %>
32
+ <% end %>
33
+ </tr>
34
+ <% end %>
35
+ </tbody>
36
+ </table>
@@ -0,0 +1,12 @@
1
+ class BadgePreview < Lookbook::Preview
2
+ include Components
3
+
4
+ def overview; end
5
+
6
+ # @param size [Integer] range { min: 1, max: 3, step: 1 }
7
+ # @param variant select { choices: [solid, soft, surface, outline] }
8
+ # @param label
9
+ def playground(size: 2, variant: :solid, label: "Badge")
10
+ Badge(variant:, size:) { label }
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ class BreadcrumbPreview < Lookbook::Preview
2
+ include Components
3
+
4
+ # Markup and style based on [ARIA Breadcrumb Pattern Example](https://www.w3.org/WAI/ARIA/apg/patterns/breadcrumb/examples/breadcrumb/)
5
+ def default
6
+ Breadcrumb() do |c|
7
+ c.item(href: "/") { "Home" }
8
+ c.item(href: "/sections") { "Sections" }
9
+ c.item(href: "") { "Articles" }
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,47 @@
1
+ <% props = Components::Button.literal_properties
2
+ icon = "arrow-right" %>
3
+
4
+ <table class="lookbook-table">
5
+ <thead>
6
+ <tr>
7
+ <th>Color</th>
8
+ <% props[:color].type.each do |color| %>
9
+ <th colspan="<%= props[:size].type.to_a.size %>">
10
+ <code><%= color || :default %></code>
11
+ </th>
12
+ <% end %>
13
+ </tr>
14
+ <tr>
15
+ <th>Size</th>
16
+ <% props[:color].type.each do %>
17
+ <% props[:size].type.each do |size| %>
18
+ <th><code><%= size %></code></th>
19
+ <% end %>
20
+ <% end %>
21
+ </tr>
22
+ </thead>
23
+ <tbody>
24
+ <% props[:variant].type.each do |variant| %>
25
+ <tr>
26
+ <th><code><%= variant %></code></th>
27
+ <% props[:color].type.each do |color| %>
28
+ <% props[:size].type.each do |size| %>
29
+ <td>
30
+ <%= render Components::Button.new(variant:, size:, color:, icon:) { "Button" } %>
31
+ </td>
32
+ <% end %>
33
+ <% end %>
34
+ </tr>
35
+ <tr>
36
+ <th><code><%= variant %></code>, <code>disabled</code></th>
37
+ <% props[:color].type.each do |color| %>
38
+ <% props[:size].type.each do |size| %>
39
+ <td>
40
+ <%= render Components::Button.new(variant:, size:, color:, icon:, disabled: true) { "Button" } %>
41
+ </td>
42
+ <% end %>
43
+ <% end %>
44
+ </tr>
45
+ <% end %>
46
+ </tbody>
47
+ </table>
@@ -0,0 +1,22 @@
1
+ class ButtonPreview < Lookbook::Preview
2
+ include Components
3
+
4
+ def overview; end
5
+
6
+ # @param size [Integer] range { min: 1, max: 3, step: 1 }
7
+ # @param variant [Symbol] select { choices: [solid, soft, surface, outline, ghost] }
8
+ # @param color [Symbol] select { choices: [~, green, orange, red] }
9
+ # @param label
10
+ def playground(size: 2, variant: :solid, color: nil, label: "Button")
11
+ Button(size:, variant:, color:) do
12
+ label
13
+ end
14
+ end
15
+
16
+ def with_icon
17
+ Button do
18
+ Icon("arrow-right")
19
+ "Button"
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,21 @@
1
+ class HeadingPreview < Lookbook::Preview
2
+ include Components
3
+
4
+ # @!group
5
+ def default
6
+ Heading() { "Hello, Lookbook!" }
7
+ end
8
+
9
+ def level_2
10
+ Heading(level: 2) { "Sous-titre" }
11
+ end
12
+
13
+ def level_2_as_h1
14
+ Heading(level: 2, tag: :h1) { "Sous-titre sous forme de h1" }
15
+ end
16
+
17
+ def level_3
18
+ Heading(level: 3) { "Titre 3" }
19
+ end
20
+ # @!endgroup
21
+ end