backpack 0.4.3 → 0.4.5

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 (505) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -3
  3. data/lib/backpack/cli.rb +39 -2
  4. data/lib/backpack/commands/sync.rb +156 -0
  5. data/lib/backpack/components/button/button.css +1 -1
  6. data/lib/backpack/components/icon_sprite.rb +7 -4
  7. data/lib/backpack/stylesheets/utilities/_sr-only.css +10 -10
  8. data/lib/backpack/version.rb +1 -1
  9. data/spec/cli/import_spec.rb +15 -1
  10. data/spec/cli/sync_spec.rb +266 -0
  11. data/spec/components/button_spec.rb +2 -2
  12. data/spec/components/icon_spec.rb +5 -1
  13. data/spec/components/icon_sprite_spec.rb +3 -0
  14. data/spec/fixtures/figma/Backpack.json +133 -0
  15. data/spec/fixtures/tokens/_test.css +19 -0
  16. data/spec/support/matchers/eq_html.rb +1 -1
  17. data/spec/support/matchers/include_html.rb +1 -1
  18. metadata +8 -488
  19. data/demo/.gitignore +0 -47
  20. data/demo/.overmind.env +0 -2
  21. data/demo/.yarn/cache/@babel-code-frame-npm-7.27.1-4dbcabb137-5874edc5d3.zip +0 -0
  22. data/demo/.yarn/cache/@babel-helper-validator-identifier-npm-7.28.5-1953d49d2b-5a251a6848.zip +0 -0
  23. data/demo/.yarn/cache/@csstools-css-parser-algorithms-npm-2.7.1-8dc62b9586-304e6f92e5.zip +0 -0
  24. data/demo/.yarn/cache/@csstools-css-tokenizer-npm-2.4.1-51184be252-395c51f872.zip +0 -0
  25. data/demo/.yarn/cache/@csstools-media-query-list-parser-npm-2.1.13-cb3cb9a768-7754b4b9fc.zip +0 -0
  26. data/demo/.yarn/cache/@csstools-postcss-cascade-layers-npm-1.1.1-4382e19cf0-8ecd6a929e.zip +0 -0
  27. data/demo/.yarn/cache/@csstools-postcss-color-function-npm-1.1.1-7c5a0199ae-087595985e.zip +0 -0
  28. data/demo/.yarn/cache/@csstools-postcss-font-format-keywords-npm-1.0.1-ef1db49912-ed8d9eab97.zip +0 -0
  29. data/demo/.yarn/cache/@csstools-postcss-hwb-function-npm-1.0.2-f3f621e351-352ead754a.zip +0 -0
  30. data/demo/.yarn/cache/@csstools-postcss-ic-unit-npm-1.0.1-111638e451-09c414c9b7.zip +0 -0
  31. data/demo/.yarn/cache/@csstools-postcss-is-pseudo-class-npm-2.0.7-c85939401b-a4494bb8e9.zip +0 -0
  32. data/demo/.yarn/cache/@csstools-postcss-nested-calc-npm-1.0.0-8028506411-53bb783dd6.zip +0 -0
  33. data/demo/.yarn/cache/@csstools-postcss-normalize-display-values-npm-1.0.1-53721ce3eb-75901daec3.zip +0 -0
  34. data/demo/.yarn/cache/@csstools-postcss-oklab-function-npm-1.1.1-2907029cf1-d66b789060.zip +0 -0
  35. data/demo/.yarn/cache/@csstools-postcss-progressive-custom-properties-npm-1.3.0-1e56504855-e281845fde.zip +0 -0
  36. data/demo/.yarn/cache/@csstools-postcss-stepped-value-functions-npm-1.0.1-01aa1138bd-2fc88713a0.zip +0 -0
  37. data/demo/.yarn/cache/@csstools-postcss-text-decoration-shorthand-npm-1.0.0-96f61ef9fe-d27aaf9787.zip +0 -0
  38. data/demo/.yarn/cache/@csstools-postcss-trigonometric-functions-npm-1.0.2-4553514702-f7f5b5f249.zip +0 -0
  39. data/demo/.yarn/cache/@csstools-postcss-unset-value-npm-1.0.2-f57c79bfc4-3facdae154.zip +0 -0
  40. data/demo/.yarn/cache/@csstools-selector-specificity-npm-2.2.0-9e6097918b-97c89f23b3.zip +0 -0
  41. data/demo/.yarn/cache/@csstools-selector-specificity-npm-3.1.1-85fd5757fc-3786a6afea.zip +0 -0
  42. data/demo/.yarn/cache/@eslint-community-eslint-utils-npm-4.9.0-fe45a08548-ae9b98eea0.zip +0 -0
  43. data/demo/.yarn/cache/@eslint-community-regexpp-npm-4.12.2-3d54624470-1770bc81f6.zip +0 -0
  44. data/demo/.yarn/cache/@eslint-eslintrc-npm-2.1.4-1ff4b5f908-10957c7592.zip +0 -0
  45. data/demo/.yarn/cache/@eslint-js-npm-8.57.1-dec269f278-2afb77454c.zip +0 -0
  46. data/demo/.yarn/cache/@hotwired-stimulus-npm-3.2.2-e1e064f1fe-e0c13469df.zip +0 -0
  47. data/demo/.yarn/cache/@humanwhocodes-config-array-npm-0.13.0-843095a032-eae69ff913.zip +0 -0
  48. data/demo/.yarn/cache/@humanwhocodes-module-importer-npm-1.0.1-9d07ed2e4a-0fd22007db.zip +0 -0
  49. data/demo/.yarn/cache/@humanwhocodes-object-schema-npm-2.0.3-4f0e508cd9-d3b78f6c58.zip +0 -0
  50. data/demo/.yarn/cache/@isaacs-balanced-match-npm-4.0.1-8965afafe6-102fbc6d2c.zip +0 -0
  51. data/demo/.yarn/cache/@isaacs-brace-expansion-npm-5.0.0-754d3cb3f5-d7a3b8b0dd.zip +0 -0
  52. data/demo/.yarn/cache/@isaacs-cliui-npm-8.0.2-f4364666d5-4a473b9b32.zip +0 -0
  53. data/demo/.yarn/cache/@isaacs-fs-minipass-npm-4.0.1-677026e841-5d36d28996.zip +0 -0
  54. data/demo/.yarn/cache/@nodelib-fs.scandir-npm-2.1.5-89c67370dd-a970d595bd.zip +0 -0
  55. data/demo/.yarn/cache/@nodelib-fs.stat-npm-2.0.5-01f4dd3030-012480b5ca.zip +0 -0
  56. data/demo/.yarn/cache/@nodelib-fs.walk-npm-1.2.8-b4a89da548-190c643f15.zip +0 -0
  57. data/demo/.yarn/cache/@npmcli-agent-npm-4.0.0-502e5ae4f0-89ae20b448.zip +0 -0
  58. data/demo/.yarn/cache/@npmcli-fs-npm-4.0.0-1d9cc8a27b-68951c589e.zip +0 -0
  59. data/demo/.yarn/cache/@pkgjs-parseargs-npm-0.11.0-cd2a3fe948-6ad6a00fc4.zip +0 -0
  60. data/demo/.yarn/cache/@radix-ui-colors-npm-3.0.0-a7484539fd-5ac1b69df7.zip +0 -0
  61. data/demo/.yarn/cache/@types-less-npm-3.0.8-5556bee38f-8e04acca20.zip +0 -0
  62. data/demo/.yarn/cache/@types-minimist-npm-1.2.5-c85664a9d8-477047b606.zip +0 -0
  63. data/demo/.yarn/cache/@types-node-npm-24.10.1-d514f50dfd-c2f370ae7a.zip +0 -0
  64. data/demo/.yarn/cache/@types-normalize-package-data-npm-2.4.4-676a8ba353-65dff72b54.zip +0 -0
  65. data/demo/.yarn/cache/@types-sass-npm-1.43.1-6770eea7c0-19eb71acc4.zip +0 -0
  66. data/demo/.yarn/cache/@types-stylus-npm-0.48.43-0d92990605-bd780fc7e8.zip +0 -0
  67. data/demo/.yarn/cache/@ungap-structured-clone-npm-1.3.0-aea1bdf957-64ed518f49.zip +0 -0
  68. data/demo/.yarn/cache/abbrev-npm-4.0.0-7d848a1ef0-d0344b63d2.zip +0 -0
  69. data/demo/.yarn/cache/acorn-jsx-npm-5.3.2-d7594599ea-c3d3b2a89c.zip +0 -0
  70. data/demo/.yarn/cache/acorn-npm-8.15.0-0764cf600e-309c6b49ae.zip +0 -0
  71. data/demo/.yarn/cache/agent-base-npm-7.1.4-cb8b4604d5-86a7f542af.zip +0 -0
  72. data/demo/.yarn/cache/ajv-npm-6.12.6-4b5105e2b2-874972efe5.zip +0 -0
  73. data/demo/.yarn/cache/ajv-npm-8.17.1-12ade7edc6-1797bf242c.zip +0 -0
  74. data/demo/.yarn/cache/ansi-regex-npm-5.0.1-c963a48615-2aa4bb54ca.zip +0 -0
  75. data/demo/.yarn/cache/ansi-regex-npm-6.2.2-f2d6691eb1-9b17ce2c6d.zip +0 -0
  76. data/demo/.yarn/cache/ansi-styles-npm-4.3.0-245c7d42c7-513b44c3b2.zip +0 -0
  77. data/demo/.yarn/cache/ansi-styles-npm-6.2.3-6fc7ca2bf5-f1b0829cf0.zip +0 -0
  78. data/demo/.yarn/cache/anymatch-npm-3.1.3-bc81d103b1-3e044fd6d1.zip +0 -0
  79. data/demo/.yarn/cache/argparse-npm-2.0.1-faff7999e6-83644b5649.zip +0 -0
  80. data/demo/.yarn/cache/array-union-npm-2.1.0-4e4852b221-5bee12395c.zip +0 -0
  81. data/demo/.yarn/cache/arrify-npm-1.0.1-affafba9fe-745075dd4a.zip +0 -0
  82. data/demo/.yarn/cache/astral-regex-npm-2.0.0-f30d866aab-876231688c.zip +0 -0
  83. data/demo/.yarn/cache/autoprefixer-npm-10.4.22-7e7e3bc20e-7aa0c668bc.zip +0 -0
  84. data/demo/.yarn/cache/balanced-match-npm-1.0.2-a53c126459-9706c088a2.zip +0 -0
  85. data/demo/.yarn/cache/balanced-match-npm-2.0.0-d9722af241-9a5caad6a2.zip +0 -0
  86. data/demo/.yarn/cache/baseline-browser-mapping-npm-2.8.28-9d8c2e2d8e-d9b54c55ed.zip +0 -0
  87. data/demo/.yarn/cache/binary-extensions-npm-2.3.0-bd3f20d865-bcad01494e.zip +0 -0
  88. data/demo/.yarn/cache/boolbase-npm-1.0.0-965fe9af6d-3e25c80ef6.zip +0 -0
  89. data/demo/.yarn/cache/brace-expansion-npm-1.1.12-329e9ad7a1-12cb6d6310.zip +0 -0
  90. data/demo/.yarn/cache/brace-expansion-npm-2.0.2-bc7f134bbc-01dff195e3.zip +0 -0
  91. data/demo/.yarn/cache/braces-npm-3.0.3-582c14023c-b95aa0b3bd.zip +0 -0
  92. data/demo/.yarn/cache/browserslist-npm-4.28.0-c16ea3c47c-c19fe2c6f1.zip +0 -0
  93. data/demo/.yarn/cache/cacache-npm-20.0.1-9350b3f826-33d1514f5c.zip +0 -0
  94. data/demo/.yarn/cache/callsites-npm-3.1.0-268f989910-072d17b6ab.zip +0 -0
  95. data/demo/.yarn/cache/camelcase-keys-npm-7.0.2-36fbc5a8f7-b5821cc48d.zip +0 -0
  96. data/demo/.yarn/cache/camelcase-npm-6.3.0-e5e42a0d15-8c96818a90.zip +0 -0
  97. data/demo/.yarn/cache/caniuse-lite-npm-1.0.30001754-112f366158-f5a956d820.zip +0 -0
  98. data/demo/.yarn/cache/chalk-npm-4.1.2-ba8b67ab80-fe75c9d5c7.zip +0 -0
  99. data/demo/.yarn/cache/chokidar-npm-3.6.0-3c413a828f-d2f29f4997.zip +0 -0
  100. data/demo/.yarn/cache/chownr-npm-3.0.0-5275e85d25-fd73a4bab4.zip +0 -0
  101. data/demo/.yarn/cache/cliui-npm-8.0.1-3b029092cf-79648b3b00.zip +0 -0
  102. data/demo/.yarn/cache/color-convert-npm-2.0.1-79730e935b-79e6bdb9fd.zip +0 -0
  103. data/demo/.yarn/cache/color-name-npm-1.1.4-025792b0ea-b044585952.zip +0 -0
  104. data/demo/.yarn/cache/colord-npm-2.9.3-5c35c27898-95d909bfbc.zip +0 -0
  105. data/demo/.yarn/cache/concat-map-npm-0.0.1-85a921b7ee-902a9f5d89.zip +0 -0
  106. data/demo/.yarn/cache/cosmiconfig-npm-8.3.6-a5566e2779-dc339ebea4.zip +0 -0
  107. data/demo/.yarn/cache/cross-spawn-npm-7.0.6-264bddf921-8d306efaca.zip +0 -0
  108. data/demo/.yarn/cache/css-blank-pseudo-npm-3.0.3-af86e84805-9be0a13885.zip +0 -0
  109. data/demo/.yarn/cache/css-functions-list-npm-3.2.3-c87dc5954d-25f12fb0ef.zip +0 -0
  110. data/demo/.yarn/cache/css-has-pseudo-npm-3.0.4-e97bb61896-8f165d68f6.zip +0 -0
  111. data/demo/.yarn/cache/css-prefers-color-scheme-npm-6.0.3-e1c91bc5cd-3a2b02f045.zip +0 -0
  112. data/demo/.yarn/cache/css-select-npm-3.1.2-ee1a42b802-a54b73ee89.zip +0 -0
  113. data/demo/.yarn/cache/css-tree-npm-2.3.1-6540d78e26-493cc24b5c.zip +0 -0
  114. data/demo/.yarn/cache/css-what-npm-4.0.0-5d0d0ff02b-69b5574912.zip +0 -0
  115. data/demo/.yarn/cache/cssdb-npm-7.11.2-d799f85811-79b2c3b6de.zip +0 -0
  116. data/demo/.yarn/cache/cssesc-npm-3.0.0-15ec56f86f-f8c4ababff.zip +0 -0
  117. data/demo/.yarn/cache/cuint-npm-0.2.2-3990651cc6-b8127a93a7.zip +0 -0
  118. data/demo/.yarn/cache/debug-npm-4.4.3-0105c6123a-4805abd570.zip +0 -0
  119. data/demo/.yarn/cache/decamelize-keys-npm-1.1.1-4cfa36ed4b-fc645fe20b.zip +0 -0
  120. data/demo/.yarn/cache/decamelize-npm-1.2.0-c5a2fdc622-ad8c51a7e7.zip +0 -0
  121. data/demo/.yarn/cache/decamelize-npm-5.0.1-2fde8c926c-7c3b1ed4b3.zip +0 -0
  122. data/demo/.yarn/cache/deep-is-npm-0.1.4-88938b5a67-edb65dd0d7.zip +0 -0
  123. data/demo/.yarn/cache/dependency-graph-npm-0.11.0-658e382681-477204beaa.zip +0 -0
  124. data/demo/.yarn/cache/dir-glob-npm-3.0.1-1aea628b1b-fa05e18324.zip +0 -0
  125. data/demo/.yarn/cache/doctrine-npm-3.0.0-c6f1615f04-fd7673ca77.zip +0 -0
  126. data/demo/.yarn/cache/dom-serializer-npm-1.4.1-ebb24349c1-fbb0b01f87.zip +0 -0
  127. data/demo/.yarn/cache/domelementtype-npm-2.3.0-02de7cbfba-ee837a318f.zip +0 -0
  128. data/demo/.yarn/cache/domhandler-npm-3.3.0-6417f7e17e-850e5e9fee.zip +0 -0
  129. data/demo/.yarn/cache/domhandler-npm-4.3.1-493539c1ca-4c665ceed0.zip +0 -0
  130. data/demo/.yarn/cache/domutils-npm-2.8.0-0325139e5c-abf7434315.zip +0 -0
  131. data/demo/.yarn/cache/eastasianwidth-npm-0.2.0-c37eb16bd1-7d00d7cd8e.zip +0 -0
  132. data/demo/.yarn/cache/electron-to-chromium-npm-1.5.250-3e6f742b0b-4f32d0e176.zip +0 -0
  133. data/demo/.yarn/cache/emoji-regex-npm-8.0.0-213764015c-d4c5c39d5a.zip +0 -0
  134. data/demo/.yarn/cache/emoji-regex-npm-9.2.2-e6fac8d058-8487182da7.zip +0 -0
  135. data/demo/.yarn/cache/encoding-npm-0.1.13-82a1837d30-bb98632f8f.zip +0 -0
  136. data/demo/.yarn/cache/entities-npm-2.2.0-0fc8d5b2f7-19010dacaf.zip +0 -0
  137. data/demo/.yarn/cache/env-paths-npm-2.2.1-7c7577428c-65b5df55a8.zip +0 -0
  138. data/demo/.yarn/cache/err-code-npm-2.0.3-082e0ff9a7-8b7b1be20d.zip +0 -0
  139. data/demo/.yarn/cache/error-ex-npm-1.3.4-c7248e4040-25136c0984.zip +0 -0
  140. data/demo/.yarn/cache/esbuild-darwin-arm64-npm-0.15.18-37bdbfa731-8.zip +0 -0
  141. data/demo/.yarn/cache/esbuild-npm-0.15.18-61e07796c8-ec12682b2c.zip +0 -0
  142. data/demo/.yarn/cache/esbuild-plugin-import-glob-npm-0.1.1-b0534ed204-d6a350e13e.zip +0 -0
  143. data/demo/.yarn/cache/esbuild-rails-npm-1.0.7-a0e5a3f51e-55efdcd04b.zip +0 -0
  144. data/demo/.yarn/cache/esbuild-style-plugin-npm-1.6.3-ee685c408e-05fa06f2e7.zip +0 -0
  145. data/demo/.yarn/cache/escalade-npm-3.2.0-19b50dd48f-47b029c83d.zip +0 -0
  146. data/demo/.yarn/cache/escape-string-regexp-npm-4.0.0-4b531d8d59-98b48897d9.zip +0 -0
  147. data/demo/.yarn/cache/eslint-config-prettier-npm-8.10.2-2e293fd4f2-a92b7e8a99.zip +0 -0
  148. data/demo/.yarn/cache/eslint-npm-8.57.1-dd20287a5a-e2489bb7f8.zip +0 -0
  149. data/demo/.yarn/cache/eslint-scope-npm-7.2.2-53cb0df8e8-ec97dbf5fb.zip +0 -0
  150. data/demo/.yarn/cache/eslint-visitor-keys-npm-3.4.3-a356ac7e46-36e9ef87fc.zip +0 -0
  151. data/demo/.yarn/cache/espree-npm-9.6.1-a50722a5a9-eb8c149c7a.zip +0 -0
  152. data/demo/.yarn/cache/esquery-npm-1.6.0-16fee31531-08ec4fe446.zip +0 -0
  153. data/demo/.yarn/cache/esrecurse-npm-4.3.0-10b86a887a-ebc17b1a33.zip +0 -0
  154. data/demo/.yarn/cache/estraverse-npm-5.3.0-03284f8f63-072780882d.zip +0 -0
  155. data/demo/.yarn/cache/esutils-npm-2.0.3-f865beafd5-22b5b08f74.zip +0 -0
  156. data/demo/.yarn/cache/exponential-backoff-npm-3.1.3-28be78d98e-471fdb70fd.zip +0 -0
  157. data/demo/.yarn/cache/fast-deep-equal-npm-3.1.3-790edcfcf5-e21a9d8d84.zip +0 -0
  158. data/demo/.yarn/cache/fast-glob-npm-3.3.3-2a653be532-0704d7b85c.zip +0 -0
  159. data/demo/.yarn/cache/fast-json-stable-stringify-npm-2.1.0-02e8905fda-b191531e36.zip +0 -0
  160. data/demo/.yarn/cache/fast-levenshtein-npm-2.0.6-fcd74b8df5-92cfec0a8d.zip +0 -0
  161. data/demo/.yarn/cache/fast-uri-npm-3.1.0-57fa0b3f3c-daab0efd35.zip +0 -0
  162. data/demo/.yarn/cache/fastest-levenshtein-npm-1.0.16-192d328856-a78d44285c.zip +0 -0
  163. data/demo/.yarn/cache/fastq-npm-1.19.1-ca0a13ec3f-7691d1794f.zip +0 -0
  164. data/demo/.yarn/cache/fdir-npm-6.5.0-8814a0dec7-bd537daa9d.zip +0 -0
  165. data/demo/.yarn/cache/file-entry-cache-npm-6.0.1-31965cf0af-f49701feaa.zip +0 -0
  166. data/demo/.yarn/cache/file-entry-cache-npm-7.0.2-9ddf8eaba9-283c674fc2.zip +0 -0
  167. data/demo/.yarn/cache/fill-range-npm-7.1.1-bf491486db-b4abfbca38.zip +0 -0
  168. data/demo/.yarn/cache/find-up-npm-5.0.0-e03e9b796d-07955e3573.zip +0 -0
  169. data/demo/.yarn/cache/flat-cache-npm-3.2.0-9a887f084e-e7e0f59801.zip +0 -0
  170. data/demo/.yarn/cache/flatted-npm-3.3.3-ca455563b2-8c96c02fbe.zip +0 -0
  171. data/demo/.yarn/cache/foreground-child-npm-3.3.1-b7775fda04-b2c1a6fc0b.zip +0 -0
  172. data/demo/.yarn/cache/fraction.js-npm-5.3.4-52b06f74c0-6ac88ecfdb.zip +0 -0
  173. data/demo/.yarn/cache/fs-extra-npm-11.3.2-490a8d09c5-24a7a6e096.zip +0 -0
  174. data/demo/.yarn/cache/fs-minipass-npm-3.0.3-d148d6ac19-8722a41109.zip +0 -0
  175. data/demo/.yarn/cache/fs.realpath-npm-1.0.0-c8f05d8126-99ddea01a7.zip +0 -0
  176. data/demo/.yarn/cache/fsevents-npm-2.3.3-ce9fb0ffae-11e6ea6fea.zip +0 -0
  177. data/demo/.yarn/cache/fsevents-patch-21ad2b1333-8.zip +0 -0
  178. data/demo/.yarn/cache/function-bind-npm-1.1.2-7a55be9b03-2b0ff4ce70.zip +0 -0
  179. data/demo/.yarn/cache/generic-names-npm-4.0.0-c188ad8a22-8dabd25051.zip +0 -0
  180. data/demo/.yarn/cache/get-caller-file-npm-2.0.5-80e8a86305-b9769a836d.zip +0 -0
  181. data/demo/.yarn/cache/get-stdin-npm-9.0.0-4221477153-5972bc34d0.zip +0 -0
  182. data/demo/.yarn/cache/glob-npm-10.4.5-8c63175f05-0bc725de5e.zip +0 -0
  183. data/demo/.yarn/cache/glob-npm-11.0.3-f68382b3cc-65ddc1e3c9.zip +0 -0
  184. data/demo/.yarn/cache/glob-npm-7.2.3-2d866d17a5-29452e97b3.zip +0 -0
  185. data/demo/.yarn/cache/glob-parent-npm-5.1.2-021ab32634-f4f2bfe242.zip +0 -0
  186. data/demo/.yarn/cache/glob-parent-npm-6.0.2-2cbef12738-c13ee97978.zip +0 -0
  187. data/demo/.yarn/cache/global-modules-npm-2.0.0-f71d340362-d6197f2585.zip +0 -0
  188. data/demo/.yarn/cache/global-prefix-npm-3.0.0-68cf01e67d-8a82fc1d6f.zip +0 -0
  189. data/demo/.yarn/cache/globals-npm-13.24.0-cc7713139c-56066ef058.zip +0 -0
  190. data/demo/.yarn/cache/globby-npm-11.1.0-bdcdf20c71-b4be8885e0.zip +0 -0
  191. data/demo/.yarn/cache/globby-npm-13.2.2-47efcd4a86-f3d84ced58.zip +0 -0
  192. data/demo/.yarn/cache/globjoin-npm-0.1.4-a1beb812bf-0a47d88d56.zip +0 -0
  193. data/demo/.yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-ac85f94da9.zip +0 -0
  194. data/demo/.yarn/cache/graphemer-npm-1.4.0-0627732d35-bab8f0be9b.zip +0 -0
  195. data/demo/.yarn/cache/hard-rejection-npm-2.1.0-a80f2a977d-7baaf80a0c.zip +0 -0
  196. data/demo/.yarn/cache/has-flag-npm-4.0.0-32af9f0536-261a135703.zip +0 -0
  197. data/demo/.yarn/cache/hasown-npm-2.0.2-80fe6c9901-e8516f776a.zip +0 -0
  198. data/demo/.yarn/cache/hosted-git-info-npm-4.1.0-4efcdf8fd3-c3f87b3c2f.zip +0 -0
  199. data/demo/.yarn/cache/html-tags-npm-3.3.1-c8f411791b-b4ef1d5a76.zip +0 -0
  200. data/demo/.yarn/cache/htmlparser2-npm-5.0.1-d50ebd0fbb-b67ac02e44.zip +0 -0
  201. data/demo/.yarn/cache/http-cache-semantics-npm-4.2.0-fadacfb3ad-7a7246ddfc.zip +0 -0
  202. data/demo/.yarn/cache/http-proxy-agent-npm-7.0.2-643ed7cc33-670858c8f8.zip +0 -0
  203. data/demo/.yarn/cache/https-proxy-agent-npm-7.0.6-27a95c2690-b882377a12.zip +0 -0
  204. data/demo/.yarn/cache/iconv-lite-npm-0.6.3-24b8aae27e-3f60d47a5c.zip +0 -0
  205. data/demo/.yarn/cache/icss-replace-symbols-npm-1.1.0-bc11c612de-24575b2c2f.zip +0 -0
  206. data/demo/.yarn/cache/icss-utils-npm-5.1.0-8d8c062d07-5c324d2835.zip +0 -0
  207. data/demo/.yarn/cache/ignore-npm-5.3.2-346d3ba017-2acfd32a57.zip +0 -0
  208. data/demo/.yarn/cache/import-fresh-npm-3.3.1-1916794950-a06b19461b.zip +0 -0
  209. data/demo/.yarn/cache/import-lazy-npm-4.0.0-3215653869-22f5e51702.zip +0 -0
  210. data/demo/.yarn/cache/imurmurhash-npm-0.1.4-610c5068a0-7cae75c8cd.zip +0 -0
  211. data/demo/.yarn/cache/indent-string-npm-5.0.0-35eaa3b052-e466c27b63.zip +0 -0
  212. data/demo/.yarn/cache/inflight-npm-1.0.6-ccedb4b908-f4f76aa072.zip +0 -0
  213. data/demo/.yarn/cache/inherits-npm-2.0.4-c66b3957a0-4a48a73384.zip +0 -0
  214. data/demo/.yarn/cache/ini-npm-1.3.8-fb5040b4c0-dfd98b0ca3.zip +0 -0
  215. data/demo/.yarn/cache/ip-address-npm-10.1.0-d5d5693401-76b1abcdf5.zip +0 -0
  216. data/demo/.yarn/cache/is-arrayish-npm-0.2.1-23927dfb15-eef4417e3c.zip +0 -0
  217. data/demo/.yarn/cache/is-binary-path-npm-2.1.0-e61d46f557-84192eb88c.zip +0 -0
  218. data/demo/.yarn/cache/is-core-module-npm-2.16.1-a54837229e-6ec5b3c42d.zip +0 -0
  219. data/demo/.yarn/cache/is-extglob-npm-2.1.1-0870ea68b5-df033653d0.zip +0 -0
  220. data/demo/.yarn/cache/is-fullwidth-code-point-npm-3.0.0-1ecf4ebee5-44a30c2945.zip +0 -0
  221. data/demo/.yarn/cache/is-glob-npm-4.0.3-cb87bf1bdb-d381c1319f.zip +0 -0
  222. data/demo/.yarn/cache/is-number-npm-7.0.0-060086935c-456ac6f8e0.zip +0 -0
  223. data/demo/.yarn/cache/is-path-inside-npm-3.0.3-2ea0ef44fd-abd50f0618.zip +0 -0
  224. data/demo/.yarn/cache/is-plain-obj-npm-1.1.0-1046f64c0b-0ee0480779.zip +0 -0
  225. data/demo/.yarn/cache/is-plain-object-npm-5.0.0-285b70faa3-e32d27061e.zip +0 -0
  226. data/demo/.yarn/cache/isexe-npm-2.0.0-b58870bd2e-26bf6c5480.zip +0 -0
  227. data/demo/.yarn/cache/isexe-npm-3.1.1-9c0061eead-7fe1931ee4.zip +0 -0
  228. data/demo/.yarn/cache/jackspeak-npm-3.4.3-546bfad080-be31027fc7.zip +0 -0
  229. data/demo/.yarn/cache/jackspeak-npm-4.1.1-582e5d1ed7-daca714c5a.zip +0 -0
  230. data/demo/.yarn/cache/js-tokens-npm-4.0.0-0ac852e9e2-8a95213a5a.zip +0 -0
  231. data/demo/.yarn/cache/js-yaml-npm-4.1.1-86ec786790-ea2339c693.zip +0 -0
  232. data/demo/.yarn/cache/json-buffer-npm-3.0.1-f8f6d20603-9026b03edc.zip +0 -0
  233. data/demo/.yarn/cache/json-parse-even-better-errors-npm-2.3.1-144d62256e-798ed4cf33.zip +0 -0
  234. data/demo/.yarn/cache/json-schema-traverse-npm-0.4.1-4759091693-7486074d3b.zip +0 -0
  235. data/demo/.yarn/cache/json-schema-traverse-npm-1.0.0-fb3684f4f0-02f2f466cd.zip +0 -0
  236. data/demo/.yarn/cache/json-stable-stringify-without-jsonify-npm-1.0.1-b65772b28b-cff44156dd.zip +0 -0
  237. data/demo/.yarn/cache/jsonfile-npm-6.2.0-aefb9ffd45-c3028ec5c7.zip +0 -0
  238. data/demo/.yarn/cache/keyv-npm-4.5.4-4c8e2cf7f7-74a24395b1.zip +0 -0
  239. data/demo/.yarn/cache/kind-of-npm-6.0.3-ab15f36220-3ab01e7b1d.zip +0 -0
  240. data/demo/.yarn/cache/known-css-properties-npm-0.29.0-6bc491faeb-daa6562e90.zip +0 -0
  241. data/demo/.yarn/cache/lefthook-darwin-arm64-npm-1.13.6-b8f333b5db-8.zip +0 -0
  242. data/demo/.yarn/cache/lefthook-npm-1.13.6-54219a35e6-3f84a08528.zip +0 -0
  243. data/demo/.yarn/cache/levn-npm-0.4.1-d183b2d7bb-12c5021c85.zip +0 -0
  244. data/demo/.yarn/cache/lilconfig-npm-3.1.3-74a77377bb-644eb10830.zip +0 -0
  245. data/demo/.yarn/cache/lines-and-columns-npm-1.2.4-d6c7cc5799-0c37f9f7fa.zip +0 -0
  246. data/demo/.yarn/cache/loader-utils-npm-3.3.1-eed38ce75b-d35808e081.zip +0 -0
  247. data/demo/.yarn/cache/locate-path-npm-6.0.0-06a1e4c528-72eb661788.zip +0 -0
  248. data/demo/.yarn/cache/lodash.camelcase-npm-4.3.0-bf268e3bf0-cb9227612f.zip +0 -0
  249. data/demo/.yarn/cache/lodash.merge-npm-4.6.2-77cb4416bf-ad580b4bdb.zip +0 -0
  250. data/demo/.yarn/cache/lodash.truncate-npm-4.4.2-bc50fe1663-b463d8a382.zip +0 -0
  251. data/demo/.yarn/cache/lru-cache-npm-10.4.3-30c10b861a-6476138d21.zip +0 -0
  252. data/demo/.yarn/cache/lru-cache-npm-11.2.2-685f5506dc-052b3d0b81.zip +0 -0
  253. data/demo/.yarn/cache/lru-cache-npm-6.0.0-b4c8668fe1-f97f499f89.zip +0 -0
  254. data/demo/.yarn/cache/lucide-static-npm-0.554.0-7aee65ee52-c357b6fbc4.zip +0 -0
  255. data/demo/.yarn/cache/make-dir-npm-3.1.0-d1d7505142-484200020a.zip +0 -0
  256. data/demo/.yarn/cache/make-fetch-happen-npm-15.0.2-53d5a83906-27413f3d69.zip +0 -0
  257. data/demo/.yarn/cache/map-obj-npm-1.0.1-fa55100fac-9949e7baec.zip +0 -0
  258. data/demo/.yarn/cache/map-obj-npm-4.3.0-d53e32935d-fbc554934d.zip +0 -0
  259. data/demo/.yarn/cache/mathml-tag-names-npm-2.1.3-875bd2d6e7-1201a25a13.zip +0 -0
  260. data/demo/.yarn/cache/mdn-data-npm-2.0.30-bf7b39c09a-d6ac5ac743.zip +0 -0
  261. data/demo/.yarn/cache/meow-npm-10.1.5-a1bab640d1-dd5f0caa4a.zip +0 -0
  262. data/demo/.yarn/cache/merge2-npm-1.4.1-a2507bd06c-7268db63ed.zip +0 -0
  263. data/demo/.yarn/cache/micromatch-npm-4.0.8-c9570e4aca-79920eb634.zip +0 -0
  264. data/demo/.yarn/cache/mime-npm-2.5.2-d3335c8166-dd3c93d433.zip +0 -0
  265. data/demo/.yarn/cache/minimatch-npm-10.1.1-453db4ee1a-8820c0be92.zip +0 -0
  266. data/demo/.yarn/cache/minimatch-npm-3.0.8-f3deb724b2-850cca179c.zip +0 -0
  267. data/demo/.yarn/cache/minimatch-npm-3.1.2-9405269906-c154e56640.zip +0 -0
  268. data/demo/.yarn/cache/minimatch-npm-9.0.5-9aa93d97fa-2c035575ed.zip +0 -0
  269. data/demo/.yarn/cache/minimist-options-npm-4.1.0-64ca250fc1-8c040b3068.zip +0 -0
  270. data/demo/.yarn/cache/minipass-collect-npm-2.0.1-73d3907e40-b251bceea6.zip +0 -0
  271. data/demo/.yarn/cache/minipass-fetch-npm-4.0.1-ce1d15e957-3dfca705ce.zip +0 -0
  272. data/demo/.yarn/cache/minipass-flush-npm-1.0.5-efe79d9826-56269a0b22.zip +0 -0
  273. data/demo/.yarn/cache/minipass-npm-3.3.6-b8d93a945b-a30d083c80.zip +0 -0
  274. data/demo/.yarn/cache/minipass-npm-7.1.2-3a5327d36d-2bfd325b95.zip +0 -0
  275. data/demo/.yarn/cache/minipass-pipeline-npm-1.2.4-5924cb077f-b14240dac0.zip +0 -0
  276. data/demo/.yarn/cache/minipass-sized-npm-1.0.3-306d86f432-79076749fc.zip +0 -0
  277. data/demo/.yarn/cache/minizlib-npm-3.1.0-6680befdba-a15e6f0128.zip +0 -0
  278. data/demo/.yarn/cache/ms-npm-2.1.3-81ff3cfac1-aa92de6080.zip +0 -0
  279. data/demo/.yarn/cache/nanoid-npm-3.3.11-f98c1f9ef6-3be20d8866.zip +0 -0
  280. data/demo/.yarn/cache/natural-compare-npm-1.4.0-97b75b362d-23ad088b08.zip +0 -0
  281. data/demo/.yarn/cache/negotiator-npm-1.0.0-47d727e27e-20ebfe79b2.zip +0 -0
  282. data/demo/.yarn/cache/node-gyp-npm-12.1.0-0690767ce9-198d91c535.zip +0 -0
  283. data/demo/.yarn/cache/node-releases-npm-2.0.27-b2d1b8de4a-a9a54079d8.zip +0 -0
  284. data/demo/.yarn/cache/nopt-npm-9.0.0-81316ec15c-7a5d9ab062.zip +0 -0
  285. data/demo/.yarn/cache/normalize-package-data-npm-3.0.3-1a49056685-bbcee00339.zip +0 -0
  286. data/demo/.yarn/cache/normalize-path-npm-3.0.0-658ba7d77f-88eeb4da89.zip +0 -0
  287. data/demo/.yarn/cache/normalize-range-npm-0.1.2-bec5e259e2-9b2f14f093.zip +0 -0
  288. data/demo/.yarn/cache/nth-check-npm-2.1.1-f97afc8169-5afc3dafcd.zip +0 -0
  289. data/demo/.yarn/cache/once-npm-1.4.0-ccf03ef07a-cd0a885013.zip +0 -0
  290. data/demo/.yarn/cache/optionator-npm-0.9.4-1f114b00e8-ecbd010e3d.zip +0 -0
  291. data/demo/.yarn/cache/p-limit-npm-3.1.0-05d2ede37f-7c3690c4db.zip +0 -0
  292. data/demo/.yarn/cache/p-locate-npm-5.0.0-92cc7c7a3e-1623088f36.zip +0 -0
  293. data/demo/.yarn/cache/p-map-npm-7.0.4-39386109d0-4be2097e94.zip +0 -0
  294. data/demo/.yarn/cache/package-json-from-dist-npm-1.0.1-4631a88465-58ee9538f2.zip +0 -0
  295. data/demo/.yarn/cache/parent-module-npm-1.0.1-1fae11b095-6ba8b25514.zip +0 -0
  296. data/demo/.yarn/cache/parse-json-npm-5.2.0-00a63b1199-62085b17d6.zip +0 -0
  297. data/demo/.yarn/cache/path-exists-npm-4.0.0-e9e4f63eb0-505807199d.zip +0 -0
  298. data/demo/.yarn/cache/path-is-absolute-npm-1.0.1-31bc695ffd-060840f92c.zip +0 -0
  299. data/demo/.yarn/cache/path-key-npm-3.1.1-0e66ea8321-55cd7a9dd4.zip +0 -0
  300. data/demo/.yarn/cache/path-parse-npm-1.0.7-09564527b7-49abf3d811.zip +0 -0
  301. data/demo/.yarn/cache/path-scurry-npm-1.11.1-aaf8c339af-890d5abcd5.zip +0 -0
  302. data/demo/.yarn/cache/path-scurry-npm-2.0.1-7744619e5d-a022c6c38f.zip +0 -0
  303. data/demo/.yarn/cache/path-type-npm-4.0.0-10d47fc86a-5b1e2daa24.zip +0 -0
  304. data/demo/.yarn/cache/picocolors-npm-1.1.1-4fede47cf1-e1cf46bf84.zip +0 -0
  305. data/demo/.yarn/cache/picomatch-npm-2.3.1-c782cfd986-050c865ce8.zip +0 -0
  306. data/demo/.yarn/cache/picomatch-npm-4.0.3-0a647b87cc-6817fb74eb.zip +0 -0
  307. data/demo/.yarn/cache/pify-npm-2.3.0-8b63310934-9503aaeaf4.zip +0 -0
  308. data/demo/.yarn/cache/postcss-attribute-case-insensitive-npm-5.0.2-6aa24bfafa-c0b8139f37.zip +0 -0
  309. data/demo/.yarn/cache/postcss-clamp-npm-4.1.0-32ba814068-118eec936b.zip +0 -0
  310. data/demo/.yarn/cache/postcss-cli-npm-10.1.0-a45841d3d2-c900cc48cb.zip +0 -0
  311. data/demo/.yarn/cache/postcss-color-functional-notation-npm-4.2.4-8f3a9400c3-b763e164fe.zip +0 -0
  312. data/demo/.yarn/cache/postcss-color-hex-alpha-npm-8.0.4-88605e8cec-a2f3173a60.zip +0 -0
  313. data/demo/.yarn/cache/postcss-color-rebeccapurple-npm-7.1.1-b7828c0a0c-03482f9b81.zip +0 -0
  314. data/demo/.yarn/cache/postcss-custom-media-npm-8.0.2-5ad89ea0fe-887bbbacf6.zip +0 -0
  315. data/demo/.yarn/cache/postcss-custom-properties-npm-12.1.11-78be1c709e-421f9d8d6b.zip +0 -0
  316. data/demo/.yarn/cache/postcss-custom-selectors-npm-6.0.3-0a63667536-18080d60a8.zip +0 -0
  317. data/demo/.yarn/cache/postcss-dir-pseudo-class-npm-6.0.5-2555aeb05f-7810c439d8.zip +0 -0
  318. data/demo/.yarn/cache/postcss-double-position-gradients-npm-3.1.2-278f758391-ca09bf2aef.zip +0 -0
  319. data/demo/.yarn/cache/postcss-env-function-npm-4.0.6-2282fa7c63-645b2363cf.zip +0 -0
  320. data/demo/.yarn/cache/postcss-flexbugs-fixes-npm-5.0.2-8c28e40a5b-022ddbcca8.zip +0 -0
  321. data/demo/.yarn/cache/postcss-focus-visible-npm-6.0.4-2eb1d7ff31-acd010b9dd.zip +0 -0
  322. data/demo/.yarn/cache/postcss-focus-within-npm-5.0.4-d70f73ac5d-f23d8ab757.zip +0 -0
  323. data/demo/.yarn/cache/postcss-font-variant-npm-5.0.0-0a5e349320-a192865892.zip +0 -0
  324. data/demo/.yarn/cache/postcss-gap-properties-npm-3.0.5-78f268ad64-aed559d6d3.zip +0 -0
  325. data/demo/.yarn/cache/postcss-image-set-function-npm-4.0.7-46769dca3e-7e50933098.zip +0 -0
  326. data/demo/.yarn/cache/postcss-import-npm-15.1.0-8b9e86f900-7bd04bd8f0.zip +0 -0
  327. data/demo/.yarn/cache/postcss-initial-npm-4.0.1-80cde7a815-6956953853.zip +0 -0
  328. data/demo/.yarn/cache/postcss-inline-svg-npm-5.0.0-bc19ff7916-96c5701c2c.zip +0 -0
  329. data/demo/.yarn/cache/postcss-lab-function-npm-4.2.1-1ebd916151-26ac74b430.zip +0 -0
  330. data/demo/.yarn/cache/postcss-load-config-npm-4.0.2-319bcff9ca-7c27dd3801.zip +0 -0
  331. data/demo/.yarn/cache/postcss-logical-npm-5.0.4-cf11b97479-17c71291ed.zip +0 -0
  332. data/demo/.yarn/cache/postcss-media-minmax-npm-5.0.0-ba7d6b2179-2cd7283e07.zip +0 -0
  333. data/demo/.yarn/cache/postcss-modules-extract-imports-npm-3.1.0-501aab09e8-b9192e0f4f.zip +0 -0
  334. data/demo/.yarn/cache/postcss-modules-local-by-default-npm-4.2.0-3f37e3939f-720d145453.zip +0 -0
  335. data/demo/.yarn/cache/postcss-modules-npm-5.0.0-eee2fcb829-60b34035b2.zip +0 -0
  336. data/demo/.yarn/cache/postcss-modules-npm-6.0.1-41d5592a7a-bdbf1e2bab.zip +0 -0
  337. data/demo/.yarn/cache/postcss-modules-scope-npm-3.2.1-eb0a0538a7-085f65863b.zip +0 -0
  338. data/demo/.yarn/cache/postcss-modules-values-npm-4.0.0-63d7ec543a-f7f2cdf14a.zip +0 -0
  339. data/demo/.yarn/cache/postcss-nesting-npm-10.2.0-eec5f664e8-25e6e66186.zip +0 -0
  340. data/demo/.yarn/cache/postcss-npm-8.5.6-e7f126c6f3-20f3b5d673.zip +0 -0
  341. data/demo/.yarn/cache/postcss-opacity-percentage-npm-1.1.3-552e884ed7-54d1b8ca68.zip +0 -0
  342. data/demo/.yarn/cache/postcss-overflow-shorthand-npm-3.0.4-b5a0785c77-7400902249.zip +0 -0
  343. data/demo/.yarn/cache/postcss-page-break-npm-3.0.4-6892987dc4-a7d08c945f.zip +0 -0
  344. data/demo/.yarn/cache/postcss-place-npm-7.0.5-895593f8b4-903fec0c31.zip +0 -0
  345. data/demo/.yarn/cache/postcss-preset-env-npm-7.8.3-242e470fd9-71bfb697ff.zip +0 -0
  346. data/demo/.yarn/cache/postcss-pseudo-class-any-link-npm-7.1.6-1a34600b0e-43aa18ea1e.zip +0 -0
  347. data/demo/.yarn/cache/postcss-replace-overflow-wrap-npm-4.0.0-e27e12bbc3-3ffe20b300.zip +0 -0
  348. data/demo/.yarn/cache/postcss-reporter-npm-7.1.0-af4f73892f-765d1d3bca.zip +0 -0
  349. data/demo/.yarn/cache/postcss-resolve-nested-selector-npm-0.1.6-c30614d887-85453901af.zip +0 -0
  350. data/demo/.yarn/cache/postcss-safe-parser-npm-6.0.0-dd01bffb52-06c733eaad.zip +0 -0
  351. data/demo/.yarn/cache/postcss-selector-not-npm-6.0.1-135f19a20c-fe523a0219.zip +0 -0
  352. data/demo/.yarn/cache/postcss-selector-parser-npm-6.1.2-46a8e03b00-ce9440fc42.zip +0 -0
  353. data/demo/.yarn/cache/postcss-selector-parser-npm-7.1.0-141ba29b54-1300e7871d.zip +0 -0
  354. data/demo/.yarn/cache/postcss-sorting-npm-8.0.2-d9f7d43c59-ebb5cc6a29.zip +0 -0
  355. data/demo/.yarn/cache/postcss-url-npm-10.1.3-1c99e6b8ad-5983dbd20e.zip +0 -0
  356. data/demo/.yarn/cache/postcss-value-parser-npm-4.2.0-3cef602a6a-819ffab0c9.zip +0 -0
  357. data/demo/.yarn/cache/prelude-ls-npm-1.2.1-3e4d272a55-cd192ec0d0.zip +0 -0
  358. data/demo/.yarn/cache/prettier-npm-2.8.8-430828a36c-b49e409431.zip +0 -0
  359. data/demo/.yarn/cache/pretty-hrtime-npm-1.0.3-32fd75fcbd-bae0e6832f.zip +0 -0
  360. data/demo/.yarn/cache/proc-log-npm-5.0.0-405173f9b4-c78b26ecef.zip +0 -0
  361. data/demo/.yarn/cache/proc-log-npm-6.0.0-455d6f01a6-005a2aa24b.zip +0 -0
  362. data/demo/.yarn/cache/promise-retry-npm-2.0.1-871f0b01b7-f96a3f6d90.zip +0 -0
  363. data/demo/.yarn/cache/punycode-npm-2.3.1-97543c420d-bb0a0ceedc.zip +0 -0
  364. data/demo/.yarn/cache/queue-microtask-npm-1.2.3-fcc98e4e2d-b676f8c040.zip +0 -0
  365. data/demo/.yarn/cache/quick-lru-npm-5.1.1-e38e0edce3-a516faa255.zip +0 -0
  366. data/demo/.yarn/cache/read-cache-npm-1.0.0-00fa89ed05-cffc728b9e.zip +0 -0
  367. data/demo/.yarn/cache/read-pkg-npm-6.0.0-d89ce14684-0cebdff381.zip +0 -0
  368. data/demo/.yarn/cache/read-pkg-up-npm-8.0.0-6f39941cc9-fe4c804016.zip +0 -0
  369. data/demo/.yarn/cache/readdirp-npm-3.6.0-f950cc74ab-1ced032e6e.zip +0 -0
  370. data/demo/.yarn/cache/redent-npm-4.0.0-67da39f156-6944e7b1d8.zip +0 -0
  371. data/demo/.yarn/cache/require-directory-npm-2.1.1-8608aee50b-fb47e70bf0.zip +0 -0
  372. data/demo/.yarn/cache/require-from-string-npm-2.0.2-8557e0db12-a03ef68954.zip +0 -0
  373. data/demo/.yarn/cache/resolve-from-npm-4.0.0-f758ec21bf-f4ba0b8494.zip +0 -0
  374. data/demo/.yarn/cache/resolve-from-npm-5.0.0-15c9db4d33-4ceeb9113e.zip +0 -0
  375. data/demo/.yarn/cache/resolve-npm-1.22.11-2b5ca6ec84-6d5baa2156.zip +0 -0
  376. data/demo/.yarn/cache/resolve-patch-4e481dbf2b-1462da84ac.zip +0 -0
  377. data/demo/.yarn/cache/retry-npm-0.12.0-72ac7fb4cc-623bd7d2e5.zip +0 -0
  378. data/demo/.yarn/cache/reusify-npm-1.1.0-96242be57f-64cb3142ac.zip +0 -0
  379. data/demo/.yarn/cache/rimraf-npm-3.0.2-2cb7dac69a-87f4164e39.zip +0 -0
  380. data/demo/.yarn/cache/run-parallel-npm-1.2.0-3f47ff2034-cb4f97ad25.zip +0 -0
  381. data/demo/.yarn/cache/safer-buffer-npm-2.1.2-8d5c0b705e-cab8f25ae6.zip +0 -0
  382. data/demo/.yarn/cache/semver-npm-6.3.1-bcba31fdbe-ae47d06de2.zip +0 -0
  383. data/demo/.yarn/cache/semver-npm-7.7.3-9cf7b3b46c-f013a3ee46.zip +0 -0
  384. data/demo/.yarn/cache/shebang-command-npm-2.0.0-eb2b01921d-6b52fe8727.zip +0 -0
  385. data/demo/.yarn/cache/shebang-regex-npm-3.0.0-899a0cd65e-1a2bcae50d.zip +0 -0
  386. data/demo/.yarn/cache/signal-exit-npm-4.1.0-61fb957687-64c757b498.zip +0 -0
  387. data/demo/.yarn/cache/slash-npm-3.0.0-b87de2279a-94a93fff61.zip +0 -0
  388. data/demo/.yarn/cache/slash-npm-4.0.0-ce4bbc4a80-da8e4af737.zip +0 -0
  389. data/demo/.yarn/cache/slash-npm-5.1.0-718a84282e-70434b34c5.zip +0 -0
  390. data/demo/.yarn/cache/slice-ansi-npm-4.0.0-6eeca1d10e-4a82d7f085.zip +0 -0
  391. data/demo/.yarn/cache/smart-buffer-npm-4.2.0-5ac3f668bb-b5167a7142.zip +0 -0
  392. data/demo/.yarn/cache/socks-npm-2.8.7-d1d20aae19-4bbe2c88cf.zip +0 -0
  393. data/demo/.yarn/cache/socks-proxy-agent-npm-8.0.5-24d77a90dc-b4fbcdb7ad.zip +0 -0
  394. data/demo/.yarn/cache/source-map-js-npm-1.2.1-b9a47d7e1a-4eb0cd997c.zip +0 -0
  395. data/demo/.yarn/cache/spdx-correct-npm-3.2.0-ffae008484-e9ae98d22f.zip +0 -0
  396. data/demo/.yarn/cache/spdx-exceptions-npm-2.5.0-718ed4b7d6-bb127d6e25.zip +0 -0
  397. data/demo/.yarn/cache/spdx-expression-parse-npm-3.0.1-b718cbb35a-a1c6e104a2.zip +0 -0
  398. data/demo/.yarn/cache/spdx-license-ids-npm-3.0.22-2b47dea449-3810ce1ddd.zip +0 -0
  399. data/demo/.yarn/cache/ssri-npm-12.0.0-97c0e53d2e-ef4b6b0ae4.zip +0 -0
  400. data/demo/.yarn/cache/string-hash-npm-1.1.3-3cb8892e7c-104b8667a5.zip +0 -0
  401. data/demo/.yarn/cache/string-width-npm-4.2.3-2c27177bae-e52c10dc3f.zip +0 -0
  402. data/demo/.yarn/cache/string-width-npm-5.1.2-bf60531341-7369deaa29.zip +0 -0
  403. data/demo/.yarn/cache/strip-ansi-npm-6.0.1-caddc7cb40-f3cd25890a.zip +0 -0
  404. data/demo/.yarn/cache/strip-ansi-npm-7.1.2-aa4fadccd9-db0e3f9654.zip +0 -0
  405. data/demo/.yarn/cache/strip-indent-npm-4.1.1-e5fb519bd9-d322bfdc59.zip +0 -0
  406. data/demo/.yarn/cache/strip-json-comments-npm-3.1.1-dcb2324823-492f73e272.zip +0 -0
  407. data/demo/.yarn/cache/style-search-npm-0.1.0-e3177d3642-3cfefe3350.zip +0 -0
  408. data/demo/.yarn/cache/stylelint-config-recommended-npm-11.0.0-22dbca58e6-f6bed59952.zip +0 -0
  409. data/demo/.yarn/cache/stylelint-config-standard-npm-31.0.0-fc3caa478e-8e5769252c.zip +0 -0
  410. data/demo/.yarn/cache/stylelint-npm-15.11.0-6dc193bb48-9835f8a3e3.zip +0 -0
  411. data/demo/.yarn/cache/stylelint-order-npm-6.0.4-fa909cac07-66ed8a80b3.zip +0 -0
  412. data/demo/.yarn/cache/supports-color-npm-7.2.0-606bfcf7da-3dda818de0.zip +0 -0
  413. data/demo/.yarn/cache/supports-hyperlinks-npm-3.2.0-f5a5cbe606-460594ec00.zip +0 -0
  414. data/demo/.yarn/cache/supports-preserve-symlinks-flag-npm-1.0.0-f17c4d0028-53b1e247e6.zip +0 -0
  415. data/demo/.yarn/cache/svg-tags-npm-1.0.0-68a35c11fa-407e5ef87c.zip +0 -0
  416. data/demo/.yarn/cache/table-npm-6.9.0-5955281f93-f54a7d1c11.zip +0 -0
  417. data/demo/.yarn/cache/tar-npm-7.5.2-6d8cfb7a13-192559b0e7.zip +0 -0
  418. data/demo/.yarn/cache/text-table-npm-0.2.0-d92a778b59-b6937a38c8.zip +0 -0
  419. data/demo/.yarn/cache/thenby-npm-1.3.4-766aefdf7d-2d2ef3d67f.zip +0 -0
  420. data/demo/.yarn/cache/tinyglobby-npm-0.2.15-0e783aadbd-0e33b8babf.zip +0 -0
  421. data/demo/.yarn/cache/to-regex-range-npm-5.0.1-f1e8263b00-f76fa01b3d.zip +0 -0
  422. data/demo/.yarn/cache/trim-newlines-npm-4.1.1-d247eb0d1e-5b09f8e329.zip +0 -0
  423. data/demo/.yarn/cache/type-check-npm-0.4.0-60565800ce-ec688ebfc9.zip +0 -0
  424. data/demo/.yarn/cache/type-fest-npm-0.20.2-b36432617f-4fb3272df2.zip +0 -0
  425. data/demo/.yarn/cache/type-fest-npm-1.4.0-7dd848962a-b011c33886.zip +0 -0
  426. data/demo/.yarn/cache/undici-types-npm-7.16.0-0e23b08124-1ef68fc6c5.zip +0 -0
  427. data/demo/.yarn/cache/unique-filename-npm-4.0.0-bfc100c4e3-6a62094fca.zip +0 -0
  428. data/demo/.yarn/cache/unique-slug-npm-5.0.0-11508c0469-222d0322bc.zip +0 -0
  429. data/demo/.yarn/cache/universalify-npm-2.0.1-040ba5a21e-ecd8469fe0.zip +0 -0
  430. data/demo/.yarn/cache/update-browserslist-db-npm-1.1.4-55ef7b4ab9-b757805a63.zip +0 -0
  431. data/demo/.yarn/cache/uri-js-npm-4.4.1-66d11cbcaf-7167432de6.zip +0 -0
  432. data/demo/.yarn/cache/util-deprecate-npm-1.0.2-e3fe1a219c-474acf1146.zip +0 -0
  433. data/demo/.yarn/cache/validate-npm-package-license-npm-3.0.4-7af8adc7a8-35703ac889.zip +0 -0
  434. data/demo/.yarn/cache/which-npm-1.3.1-f0ebb8bdd8-f2e185c624.zip +0 -0
  435. data/demo/.yarn/cache/which-npm-2.0.2-320ddf72f7-1a5c563d3c.zip +0 -0
  436. data/demo/.yarn/cache/which-npm-6.0.0-48f25f0ec8-df19b2cd8a.zip +0 -0
  437. data/demo/.yarn/cache/word-wrap-npm-1.2.5-42d00c4b09-f93ba3586f.zip +0 -0
  438. data/demo/.yarn/cache/wrap-ansi-npm-7.0.0-ad6e1a0554-a790b846fd.zip +0 -0
  439. data/demo/.yarn/cache/wrap-ansi-npm-8.1.0-26a4e6ae28-371733296d.zip +0 -0
  440. data/demo/.yarn/cache/wrappy-npm-1.0.2-916de4d4b3-159da4805f.zip +0 -0
  441. data/demo/.yarn/cache/write-file-atomic-npm-5.0.1-52283db6ee-8dbb0e2512.zip +0 -0
  442. data/demo/.yarn/cache/xxhashjs-npm-0.2.2-70e0154c76-cf6baf05ba.zip +0 -0
  443. data/demo/.yarn/cache/y18n-npm-5.0.8-5f3a0a7e62-54f0fb9562.zip +0 -0
  444. data/demo/.yarn/cache/yallist-npm-4.0.0-b493d9e907-343617202a.zip +0 -0
  445. data/demo/.yarn/cache/yallist-npm-5.0.0-8732dd9f1c-eba5118240.zip +0 -0
  446. data/demo/.yarn/cache/yaml-npm-2.8.1-b364b3bec4-35b46150d4.zip +0 -0
  447. data/demo/.yarn/cache/yargs-npm-17.7.2-80b62638e1-73b572e863.zip +0 -0
  448. data/demo/.yarn/cache/yargs-parser-npm-20.2.9-a1d19e598d-8bb69015f2.zip +0 -0
  449. data/demo/.yarn/cache/yargs-parser-npm-21.1.1-8fdc003314-ed2d96a616.zip +0 -0
  450. data/demo/.yarn/cache/yocto-queue-npm-0.1.0-c6c9a7db29-f77b3d8d00.zip +0 -0
  451. data/demo/.yarnrc.yml +0 -5
  452. data/demo/Gemfile +0 -24
  453. data/demo/Gemfile.lock +0 -294
  454. data/demo/Makefile +0 -8
  455. data/demo/Procfile.dev +0 -2
  456. data/demo/Rakefile +0 -6
  457. data/demo/app/assets/images/.keep +0 -0
  458. data/demo/app/assets/stylesheets/application.css +0 -23
  459. data/demo/app/components/index.js +0 -20
  460. data/demo/app/controllers/application_controller.rb +0 -2
  461. data/demo/app/javascript/application.js +0 -3
  462. data/demo/app/javascript/controllers/application.js +0 -9
  463. data/demo/app/javascript/controllers/index.js +0 -5
  464. data/demo/app/models/current.rb +0 -3
  465. data/demo/app/views/layouts/application.html.erb +0 -19
  466. data/demo/app/views/layouts/backpack.html.erb +0 -40
  467. data/demo/bin/dev +0 -2
  468. data/demo/bin/rails +0 -4
  469. data/demo/bin/rake +0 -4
  470. data/demo/bin/setup +0 -26
  471. data/demo/bin/thrust +0 -5
  472. data/demo/config/application.rb +0 -57
  473. data/demo/config/boot.rb +0 -3
  474. data/demo/config/cable.yml +0 -10
  475. data/demo/config/ci.rb +0 -14
  476. data/demo/config/database.yml +0 -41
  477. data/demo/config/environment.rb +0 -5
  478. data/demo/config/environments/development.rb +0 -48
  479. data/demo/config/environments/production.rb +0 -61
  480. data/demo/config/environments/test.rb +0 -42
  481. data/demo/config/initializers/assets.rb +0 -7
  482. data/demo/config/initializers/content_security_policy.rb +0 -29
  483. data/demo/config/initializers/filter_parameter_logging.rb +0 -8
  484. data/demo/config/initializers/inflections.rb +0 -16
  485. data/demo/config/initializers/phlex.rb +0 -9
  486. data/demo/config/locales/en.yml +0 -31
  487. data/demo/config/puma.rb +0 -39
  488. data/demo/config/routes.rb +0 -9
  489. data/demo/config.ru +0 -6
  490. data/demo/db/seeds.rb +0 -9
  491. data/demo/esbuild.config.js +0 -36
  492. data/demo/log/.keep +0 -0
  493. data/demo/package.json +0 -36
  494. data/demo/postcss.config.js +0 -56
  495. data/demo/public/404.html +0 -135
  496. data/demo/public/500.html +0 -135
  497. data/demo/public/icon.png +0 -0
  498. data/demo/public/icon.svg +0 -3
  499. data/demo/public/robots.txt +0 -1
  500. data/demo/test/fixtures/files/.keep +0 -0
  501. data/demo/test/test_helper.rb +0 -15
  502. data/demo/tmp/.keep +0 -0
  503. data/demo/tmp/pids/.keep +0 -0
  504. data/demo/tmp/storage/.keep +0 -0
  505. data/demo/yarn.lock +0 -4434
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f408e759a5f6ded65d78dcea7fc361c186230082e7dc82a7a4213d905206a159
4
- data.tar.gz: fdbb02fcb38015cf8687ab2085f929acda73eaed25b516d3e093171b58be066b
3
+ metadata.gz: 9a8c87ef7641484c2cbe0d63bb971dedb9b18151e516ba8af4c34b6cec28c570
4
+ data.tar.gz: 538a37e07c7f1945c6d7b481426f0f9b447c1162896d28f2f1964e6ca7005385
5
5
  SHA512:
6
- metadata.gz: 03fb80e4313ac7d799a7c56711b25555fe41915c479d1cb8a2ffc7aaf7c856463a95fa6d854fd77c686ff4d296f912cd2863b102bdfe28adada02ef0e30ff0d6
7
- data.tar.gz: 35862131f1a63f798b6caafb8ecc870f08d21d1477dff78c16fd92adb8a0080e582652dae7f126e700d9e1f1d29a4d5f711503e1f180cbb91859876c9e25f484
6
+ metadata.gz: c525b847afa1b38ba852f3b5aa184c38ca3de2b67c20c64454b84750818fc556f70dfb5022d147d163d6570f10647f9946b735b6e71a8190f9a96e7e50a905de
7
+ data.tar.gz: 361da155d08c619b13e8c28adf494c97471f73507d827b777411c6b36653c646cfc7364dac208f577f1c92bee6e6162883787fe2d38b397ff07a2b4f6c83cd20
data/README.md CHANGED
@@ -2,23 +2,26 @@
2
2
 
3
3
  ## Getting started
4
4
 
5
+ Install Backpack globally, then import it in your Rails project.
6
+
5
7
  ```bash
6
8
  gem install backpack
9
+
10
+ # At your Rails project root:
7
11
  backpack import
8
- gem uninstall backpack
9
12
  ```
10
13
 
11
14
  ## Usage
12
15
 
13
16
  ### Configure colors tokens
14
17
 
15
- Open `lib/backpack/stylesheets/tokens/_colors.scss` and follow the instructions.
18
+ Open `app/assets/stylesheets/tokens/_colors.scss` and follow the instructions.
16
19
 
17
20
  ### Sync tokens with Figma
18
21
 
19
22
  1. Use [Export/Import variables](https://www.figma.com/community/plugin/1256972111705530093/export-import-variables) plugin to export the Backpack group.
20
23
  2. Save `Backpack.json` in the `figma/` directory.
21
- 3. Run `bin/sync`
24
+ 3. Run `backpack sync`
22
25
 
23
26
  ## Development
24
27
 
data/lib/backpack/cli.rb CHANGED
@@ -1,17 +1,20 @@
1
1
  require "thor"
2
2
  require "backpack"
3
+ require "json"
4
+ require_relative "commands/sync"
3
5
 
4
6
  module Backpack
5
7
  class CLI < Thor
6
8
  include Thor::Actions
7
9
 
8
- desc "import", "Import Backpack in the current project"
9
-
10
10
  source_root File.expand_path(__dir__)
11
11
 
12
+ desc "import", "Import Backpack in the current project"
12
13
  def import
13
14
  say ascii_art, :green
14
15
 
16
+ add_radix_colors_dependency if File.exist?("package.json")
17
+
15
18
  directory "stylesheets", "app/assets/stylesheets", recursive: true
16
19
  directory "components", "app/components", recursive: true
17
20
 
@@ -23,10 +26,44 @@ module Backpack
23
26
  directory "../../spec/components", "spec/components", recursive: true do |content|
24
27
  content.gsub("require 'spec_helper'", "require 'rails_helper'")
25
28
  end
29
+ directory "../../spec/fixtures/icons", "spec/fixtures/icons", recursive: true
30
+
31
+ copy_file "../../vendor/normalize.css", "vendor/normalize.css"
32
+ end
33
+
34
+ desc "sync", "Sync design tokens from Figma to CSS files"
35
+ def sync
36
+ Backpack::Commands::Sync.new(shell).sync
37
+ end
38
+
39
+ def self.exit_on_failure?
40
+ true
26
41
  end
27
42
 
28
43
  private
29
44
 
45
+ def add_radix_colors_dependency
46
+ package_json_path = "package.json"
47
+
48
+ # Read existing package.json or create minimal structure
49
+ if File.exist?(package_json_path) && !File.zero?(package_json_path)
50
+ begin
51
+ package_data = JSON.parse(File.read(package_json_path))
52
+ rescue JSON::ParserError
53
+ package_data = {}
54
+ end
55
+ else
56
+ package_data = {}
57
+ end
58
+
59
+ # Add the dependency
60
+ package_data["dependencies"] ||= {}
61
+ package_data["dependencies"]["@radix-ui/colors"] = "^3.0.0"
62
+
63
+ # Write back to file
64
+ File.write(package_json_path, "#{JSON.pretty_generate(package_data)}\n")
65
+ end
66
+
30
67
  def ascii_art
31
68
  <<~ASCII
32
69
  ┌┐ ┌─┐┌─┐┬┌─┌─┐┌─┐┌─┐┬┌─
@@ -0,0 +1,156 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'date'
5
+ require 'thor'
6
+
7
+ module Backpack
8
+ module Commands
9
+ # Sync command for importing design tokens from Figma to CSS files
10
+ #
11
+ # This command looks for files in the current working directory:
12
+ # - figma/Backpack.json (Figma design tokens export)
13
+ # - lib/backpack/stylesheets/tokens/*.css (CSS token files to update)
14
+ #
15
+ # Usage: backpack sync
16
+ class Sync
17
+ include Thor::Actions
18
+
19
+ def initialize(shell = Thor::Base.shell.new)
20
+ @shell = shell
21
+ end
22
+
23
+ def sync
24
+ @shell.say "Syncing design tokens from Figma...", :green
25
+
26
+ layout_json = File.read(layout_tokens_file)
27
+ layout = JSON.parse(layout_json, symbolize_names: true)
28
+
29
+ raise "Wrong name" if layout[:name] != NAME
30
+
31
+ modes = layout[:modes]
32
+ tokens = extract_tokens(layout[:variables], modes)
33
+
34
+ # Read all CSS files
35
+ tokens_css_files = Dir.glob("#{tokens_folder}/*.css")
36
+
37
+ rewritten_lines_count = 0
38
+ remaining_tokens = tokens.keys
39
+
40
+ tokens_css_files.each do |file|
41
+ lines_rewritten = process_css_file(file, tokens, remaining_tokens)
42
+ rewritten_lines_count += lines_rewritten
43
+
44
+ if lines_rewritten > 0
45
+ file_name = File.basename(file)
46
+ @shell.say "#{file_name}: #{lines_rewritten} lines rewritten", :yellow
47
+ end
48
+ end
49
+
50
+ if remaining_tokens.any?
51
+ @shell.say ""
52
+ @shell.say "#{remaining_tokens.size} tokens have not been found:", :red
53
+ remaining_tokens.each do |token|
54
+ @shell.say token
55
+ end
56
+ @shell.say "Please check that these tokens are correctly named."
57
+ else
58
+ @shell.say "All tokens synced successfully!", :green
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ NAME = "Backpack"
65
+ CSS_VARIABLE_REGEXP = /var\(--([^:]+)\)/
66
+ CSS_LINE_REGEXP = /--([^:]+): ([^;]+);(.*)/
67
+ APPEND_PX = proc { |value| "#{value}px" }
68
+ APPEND_REM = proc { |value| "#{value}rem" }
69
+ CONVERT_TO_REM = proc { |value| "#{value.to_f / 10.0}rem".gsub(".0rem", "rem") }
70
+ CONVERSION_RULES = {
71
+ /(font|height|radius|space)-(\d+|base|full)/ => CONVERT_TO_REM,
72
+ /(breakpoint)-(.+)/ => APPEND_PX,
73
+ /container-width/ => APPEND_REM
74
+ }
75
+
76
+ def layout_tokens_file
77
+ ENV['BACKPACK_TEST_FIGMA_PATH'] || File.expand_path("figma/#{NAME}.json")
78
+ end
79
+
80
+ def tokens_folder
81
+ ENV['BACKPACK_TEST_TOKENS_PATH'] || File.expand_path("lib/backpack/stylesheets/tokens")
82
+ end
83
+
84
+ def normalized_figma_variable(name)
85
+ name.split('/').last.downcase.gsub(' ', '-')
86
+ end
87
+
88
+ def extract_tokens(variables, modes)
89
+ tokens = {}
90
+
91
+ variables.each do |variable|
92
+ name = if (css_name = variable.dig(:codeSyntax, :WEB))
93
+ CSS_VARIABLE_REGEXP.match(css_name)[1]
94
+ else
95
+ normalized_figma_variable(variable[:name])
96
+ end
97
+
98
+ value = variable[:resolvedValuesByMode][modes.keys[0]]
99
+
100
+ final_value = if value[:aliasName]
101
+ "var(--#{normalized_figma_variable(value[:aliasName])})"
102
+ else
103
+ apply_conversion_rules(name, value[:resolvedValue])
104
+ end
105
+
106
+ tokens[name] = final_value
107
+ end
108
+
109
+ tokens
110
+ end
111
+
112
+ def apply_conversion_rules(name, value)
113
+ CONVERSION_RULES.each do |pattern, conversion|
114
+ return conversion.call(value) if pattern.match?(name)
115
+ end
116
+ value
117
+ end
118
+
119
+ def process_css_file(file, tokens, remaining_tokens)
120
+ lines = []
121
+ lines_rewritten = 0
122
+
123
+ File.open(file, 'r') do |css_file|
124
+ css_file.each_line do |line|
125
+ variable = line.match(CSS_LINE_REGEXP)
126
+
127
+ unless variable
128
+ lines << line
129
+ next
130
+ end
131
+
132
+ token_name = variable[1]
133
+ token_value = tokens[token_name]
134
+
135
+ unless token_value
136
+ lines << line
137
+ next
138
+ end
139
+
140
+ rewritten_line = line.gsub(CSS_LINE_REGEXP) do |_match|
141
+ "--#{variable[1]}: #{token_value}; /* imported from Figma on #{Date.today} */"
142
+ end
143
+
144
+ lines_rewritten += 1
145
+ remaining_tokens.delete(token_name)
146
+ lines << rewritten_line
147
+ end
148
+ end
149
+
150
+ File.write(file, lines.join) if lines_rewritten > 0
151
+
152
+ lines_rewritten
153
+ end
154
+ end
155
+ end
156
+ end
@@ -133,8 +133,8 @@
133
133
 
134
134
  /* ghost */
135
135
  .variant-ghost {
136
- color: var(--accent-9);
137
136
  background-color: transparent;
137
+ color: var(--accent-9);
138
138
  }
139
139
 
140
140
  @media (hover: hover) {
@@ -1,19 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rails-html-sanitizer'
3
+ require "rails-html-sanitizer"
4
4
 
5
5
  class Components::IconSprite < Components::Base
6
6
  ICON_PATHS = [
7
7
  Rails.root&.join("app/assets/icons"),
8
- Rails.root&.join("node_modules/lucide-static/icons"),
9
- File.expand_path("../../../spec/fixtures/icons", __dir__)
8
+ Rails.root&.join("node_modules/lucide-static/icons")
10
9
  ].compact.freeze
11
10
 
12
11
  def view_template
13
12
  svg(**mix({ class: root_classes }, @attributes, hidden: true)) do |s|
14
13
  s.defs do
15
14
  Current.icons.sort.map do |key|
15
+ # rubocop:disable Rails/OutputSafety
16
16
  raw Icon.new(key).as_svg_symbol
17
+ # rubocop:enable Rails/OutputSafety
17
18
  end
18
19
  end
19
20
  end
@@ -28,7 +29,7 @@ class Components::IconSprite < Components::Base
28
29
  prop :key, String, :positional
29
30
 
30
31
  def as_svg_symbol
31
- icon_files = Dir.glob("{#{ICON_PATHS.join(',')}}/#{@key}.svg")
32
+ icon_files = Dir.glob("{#{ICON_PATHS.join(",")}}/#{@key}.svg")
32
33
 
33
34
  return if icon_files.empty?
34
35
 
@@ -39,6 +40,7 @@ class Components::IconSprite < Components::Base
39
40
 
40
41
  private
41
42
 
43
+ # rubocop:disable Rails/OutputSafety
42
44
  def sanitized_svg(svg_string)
43
45
  Rails::Html::SafeListSanitizer
44
46
  .new
@@ -48,6 +50,7 @@ class Components::IconSprite < Components::Base
48
50
  .strip
49
51
  .html_safe
50
52
  end
53
+ # rubocop:enable Rails/OutputSafety
51
54
 
52
55
  def allowed_tags
53
56
  %w[svg path circle rect line polyline polygon ellipse g defs use]
@@ -21,14 +21,14 @@
21
21
 
22
22
  .sr-only,
23
23
  .sr-only-focusable:not(:focus, :focus-within) {
24
- border: 0 !important;
25
- clip-path: inset(50%) !important; /* 2 */
26
- height: 1px !important;
27
- margin: -1px !important;
28
- overflow: hidden !important;
29
- padding: 0 !important;
30
- width: 1px !important;
31
- white-space: nowrap !important; /* 3 */
24
+ border: 0 !important;
25
+ clip-path: inset(50%) !important; /* 2 */
26
+ height: 1px !important;
27
+ margin: -1px !important;
28
+ overflow: hidden !important;
29
+ padding: 0 !important;
30
+ width: 1px !important;
31
+ white-space: nowrap !important; /* 3 */
32
32
  }
33
33
 
34
34
  /*
@@ -37,7 +37,7 @@
37
37
  */
38
38
  .sr-only:not(caption),
39
39
  .sr-only-focusable:not(caption):not(:focus, :focus-within) {
40
- position: absolute !important;
40
+ position: absolute !important;
41
41
  }
42
42
 
43
43
  /*
@@ -46,5 +46,5 @@
46
46
  */
47
47
  .sr-only *,
48
48
  .sr-only-focusable:not(:focus, :focus-within) * {
49
- overflow: hidden !important;
49
+ overflow: hidden !important;
50
50
  }
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Backpack
4
- VERSION = "0.4.3"
4
+ VERSION = "0.4.5"
5
5
  end
@@ -30,6 +30,7 @@ describe Backpack::CLI, type: :cli do
30
30
  expect(output).to include("create spec/components/button_spec.rb")
31
31
  expect(output).to include("create spec/components/previews/button_preview.rb")
32
32
  expect(output).to include("create spec/components/previews/button_preview/overview.html.erb")
33
+ expect(output).to include("create vendor/normalize.css")
33
34
  end
34
35
 
35
36
  it "copies the folders" do
@@ -38,14 +39,27 @@ describe Backpack::CLI, type: :cli do
38
39
  expect(File.directory?("app/components")).to be true
39
40
  expect(File.directory?("spec/components")).to be true
40
41
  expect(File.directory?("spec/components/previews")).to be true
42
+ expect(File.directory?("spec/fixtures/icons")).to be true
41
43
  end
42
44
 
43
- it "copies the lib files" do
45
+ it "copies the lib & vendor files" do
44
46
  command
45
47
  expect(File.exist?("lib/backpack/attributes.rb")).to be true
46
48
  expect(File.exist?("lib/backpack/classes.rb")).to be true
47
49
  expect(File.exist?("lib/backpack/identifier.rb")).to be true
48
50
  expect(File.exist?("lib/backpack/tokens.rb")).to be true
51
+ expect(File.exist?("vendor/normalize.css")).to be true
52
+ end
53
+
54
+ context "when there is a package.json" do
55
+ before do
56
+ FileUtils.touch("package.json")
57
+ end
58
+
59
+ it "installs radix colors" do
60
+ command
61
+ expect(File.read("package.json")).to include('"@radix-ui/colors": "^3.0.0"')
62
+ end
49
63
  end
50
64
  end
51
65
  end
@@ -0,0 +1,266 @@
1
+ require 'spec_helper'
2
+
3
+ describe Backpack::CLI, type: :cli do
4
+ sandbox_dir = "sandbox"
5
+
6
+ around do |example|
7
+ FileUtils.mkdir(sandbox_dir) unless File.exist?(sandbox_dir)
8
+ within_dir(sandbox_dir) do
9
+ example.run
10
+ end
11
+ ensure
12
+ FileUtils.rm_rf(sandbox_dir)
13
+ end
14
+
15
+ describe "sync" do
16
+ let(:figma_fixture_path) { File.expand_path("../fixtures/figma/Backpack.json", __dir__) }
17
+ let(:css_fixture_path) { File.expand_path("../fixtures/tokens/_test.css", __dir__) }
18
+ let(:figma_dir) { "figma" }
19
+ let(:tokens_dir) { "lib/backpack/stylesheets/tokens" }
20
+ let(:figma_file) { "#{figma_dir}/Backpack.json" }
21
+ let(:css_file) { "#{tokens_dir}/_test.css" }
22
+
23
+ before do
24
+ # Create directory structure
25
+ FileUtils.mkdir_p(figma_dir)
26
+ FileUtils.mkdir_p(tokens_dir)
27
+
28
+ # Copy fixtures to test environment
29
+ FileUtils.cp(figma_fixture_path, figma_file)
30
+ FileUtils.cp(css_fixture_path, css_file)
31
+
32
+ # Set environment variables to override paths for testing
33
+ ENV['BACKPACK_TEST_FIGMA_PATH'] = File.expand_path(figma_file)
34
+ ENV['BACKPACK_TEST_TOKENS_PATH'] = File.expand_path(tokens_dir)
35
+ end
36
+
37
+ after do
38
+ # Clean up environment variables
39
+ ENV.delete('BACKPACK_TEST_FIGMA_PATH')
40
+ ENV.delete('BACKPACK_TEST_TOKENS_PATH')
41
+ end
42
+
43
+ context "when figma file exists and tokens are found" do
44
+ let(:command) { `bundle exec ruby ../bin/backpack sync 2>&1` }
45
+ let(:output) { command.chomp }
46
+
47
+ it "successfully syncs tokens from Figma to CSS files" do
48
+ expect(output).to include("Syncing design tokens from Figma...")
49
+ expect(output).to include("_test.css: 6 lines rewritten")
50
+ end
51
+
52
+ it "updates CSS variables with converted values" do
53
+ command
54
+ css_content = File.read(css_file)
55
+
56
+ # Font sizes should be converted to rem
57
+ expect(css_content).to include("--font-1: 1.2rem; /* imported from Figma on #{Date.today} */")
58
+ expect(css_content).to include("--font-2: 1.4rem; /* imported from Figma on #{Date.today} */")
59
+
60
+ # Radius should be converted to rem
61
+ expect(css_content).to include("--radius-1: 0.2rem; /* imported from Figma on #{Date.today} */")
62
+
63
+ # Space should be converted to rem
64
+ expect(css_content).to include("--space-1: var(--space-base); /* imported from Figma on #{Date.today} */")
65
+ expect(css_content).to include("--space-base: 0.2rem; /* imported from Figma on #{Date.today} */")
66
+
67
+ # Container width should be converted to rem
68
+ expect(css_content).to include("--container-width: 128rem; /* imported from Figma on #{Date.today} */")
69
+ end
70
+
71
+ it "preserves unchanged CSS variables" do
72
+ command
73
+ css_content = File.read(css_file)
74
+
75
+ # These should remain unchanged
76
+ expect(css_content).to include("--font-unchanged: 20px;")
77
+ expect(css_content).to include("--unknown-token: 999px;")
78
+ end
79
+
80
+ it "handles alias references correctly" do
81
+ command
82
+ css_content = File.read(css_file)
83
+
84
+ # space-1 should reference space-base as an alias
85
+ expect(css_content).to include("--space-1: var(--space-base);")
86
+ end
87
+
88
+ it "reports remaining unmatched tokens" do
89
+ # Create a CSS file that doesn't have all tokens
90
+ limited_css = ":root {\n --font-1: 10px;\n}"
91
+ File.write(css_file, limited_css)
92
+
93
+ output = `bundle exec ruby ../bin/backpack sync 2>&1`.chomp
94
+
95
+ expect(output).to include("5 tokens have not been found:")
96
+ expect(output).to include("font-2")
97
+ expect(output).to include("radius-1")
98
+ expect(output).to include("space-1")
99
+ expect(output).to include("space-base")
100
+ expect(output).to include("container-width")
101
+ expect(output).to include("Please check that these tokens are correctly named.")
102
+ end
103
+
104
+ it "reports success when all tokens are matched" do
105
+ expect(output).to include("All tokens synced successfully!")
106
+ end
107
+ end
108
+
109
+ context "when figma file is missing" do
110
+ before do
111
+ FileUtils.rm(figma_file)
112
+ end
113
+
114
+ let(:command) { `bundle exec ruby ../bin/backpack sync 2>&1` }
115
+
116
+ it "raises an error" do
117
+ expect { command }.not_to raise_error
118
+ expect(command).to include("No such file or directory")
119
+ end
120
+ end
121
+
122
+ context "when figma file has wrong name" do
123
+ before do
124
+ wrong_figma_data = File.read(figma_file).gsub('"name": "Backpack"', '"name": "WrongName"')
125
+ File.write(figma_file, wrong_figma_data)
126
+ end
127
+
128
+ let(:command) { `bundle exec ruby ../bin/backpack sync 2>&1` }
129
+
130
+ it "raises an error for wrong name" do
131
+ expect { command }.not_to raise_error
132
+ expect(command).to include("Wrong name")
133
+ end
134
+ end
135
+
136
+ context "when no CSS files exist in tokens directory" do
137
+ before do
138
+ FileUtils.rm_rf(tokens_dir)
139
+ FileUtils.mkdir_p(tokens_dir)
140
+ end
141
+
142
+ let(:command) { `bundle exec ruby ../bin/backpack sync 2>&1` }
143
+ let(:output) { command.chomp }
144
+
145
+ it "completes without errors but reports unmatched tokens" do
146
+ expect(output).to include("Syncing design tokens from Figma...")
147
+ expect(output).to include("6 tokens have not been found:")
148
+ expect(output).to include("Please check that these tokens are correctly named.")
149
+ end
150
+ end
151
+
152
+ context "when CSS files exist but have no matching tokens" do
153
+ before do
154
+ empty_css = ":root {\n /* no matching tokens */\n --other-token: 123px;\n}"
155
+ File.write(css_file, empty_css)
156
+ end
157
+
158
+ let(:command) { `bundle exec ruby ../bin/backpack sync 2>&1` }
159
+ let(:output) { command.chomp }
160
+
161
+ it "reports all tokens as unmatched" do
162
+ expect(output).to include("6 tokens have not been found:")
163
+ expect(output).to include("font-1")
164
+ expect(output).to include("font-2")
165
+ expect(output).to include("radius-1")
166
+ expect(output).to include("space-1")
167
+ expect(output).to include("space-base")
168
+ expect(output).to include("container-width")
169
+ end
170
+ end
171
+
172
+ describe "conversion rules" do
173
+ before do
174
+ # Create specific test cases for conversion rules
175
+ test_css = <<~CSS
176
+ :root {
177
+ --font-1: 10px;
178
+ --height-1: 10px;
179
+ --radius-1: 1px;
180
+ --space-1: 1px;
181
+ --breakpoint-xs: 100px;
182
+ --container-width: 100px;
183
+ }
184
+ CSS
185
+ File.write(css_file, test_css)
186
+
187
+ # Create figma data with breakpoint token
188
+ figma_data = JSON.parse(File.read(figma_file))
189
+ figma_data["variables"] << {
190
+ "id" => "VariableID:test:1",
191
+ "name" => "Layout/Media queries/Breakpoint XS",
192
+ "type" => "FLOAT",
193
+ "valuesByMode" => { "1:0" => 576 },
194
+ "resolvedValuesByMode" => { "1:0" => { "resolvedValue" => 576, "alias" => nil } },
195
+ "codeSyntax" => {}
196
+ }
197
+ figma_data["variables"] << {
198
+ "id" => "VariableID:test:2",
199
+ "name" => "Typography/Line height/height-1",
200
+ "type" => "FLOAT",
201
+ "valuesByMode" => { "1:0" => 16 },
202
+ "resolvedValuesByMode" => { "1:0" => { "resolvedValue" => 16, "alias" => nil } },
203
+ "codeSyntax" => {}
204
+ }
205
+ File.write(figma_file, JSON.generate(figma_data))
206
+ end
207
+
208
+ let(:command) { `bundle exec ruby ../bin/backpack sync 2>&1` }
209
+
210
+ it "applies correct conversion rules" do
211
+ command
212
+ css_content = File.read(css_file)
213
+
214
+ # Font and height should convert to rem (value / 10)
215
+ expect(css_content).to include("--font-1: 1.2rem;")
216
+ expect(css_content).to include("--height-1: 1.6rem;")
217
+
218
+ # Radius should convert to rem (value / 10)
219
+ expect(css_content).to include("--radius-1: 0.2rem;")
220
+
221
+ # Space should convert to rem (value / 10)
222
+ expect(css_content).to include("--space-1: var(--space-base);")
223
+
224
+ # Breakpoint should append px
225
+ expect(css_content).to include("--breakpoint-xs: 576px;")
226
+
227
+ # Container width should append rem
228
+ expect(css_content).to include("--container-width: 128rem;")
229
+ end
230
+ end
231
+
232
+ describe "help command" do
233
+ let(:help_output) { `bundle exec ruby ../bin/backpack help sync 2>&1`.chomp }
234
+
235
+ it "shows sync command in help" do
236
+ expect(help_output).to include("Usage:")
237
+ expect(help_output).to include("backpack sync")
238
+ expect(help_output).to include("Sync design tokens from Figma to CSS files")
239
+ end
240
+ end
241
+
242
+ describe "command availability" do
243
+ let(:commands_output) { `bundle exec ruby ../bin/backpack help 2>&1`.chomp }
244
+
245
+ it "lists sync as an available command" do
246
+ expect(commands_output).to include("backpack sync")
247
+ expect(commands_output).to include("Sync design tokens from Figma to CSS files")
248
+ end
249
+ end
250
+
251
+ describe "working directory behavior" do
252
+ it "uses current working directory for file paths" do
253
+ # This test verifies that the sync command looks for files in the current
254
+ # working directory rather than relative to the gem installation
255
+
256
+ # The other tests already demonstrate this behavior by using environment
257
+ # variables to override paths. This test documents the expected behavior.
258
+ sync_cmd = Backpack::Commands::Sync.new
259
+
260
+ # Without environment variables, paths should be relative to current directory
261
+ expect(sync_cmd.send(:layout_tokens_file)).to eq(File.expand_path("figma/Backpack.json"))
262
+ expect(sync_cmd.send(:tokens_folder)).to eq(File.expand_path("lib/backpack/stylesheets/tokens"))
263
+ end
264
+ end
265
+ end
266
+ end