abqari 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1509) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +889 -0
  3. data/LICENSE +21 -0
  4. data/README.md +2739 -0
  5. data/SECURITY.md +73 -0
  6. data/THIRD_PARTY_NOTICES.md +46 -0
  7. data/app/assets/css/_common.css +3125 -0
  8. data/app/assets/js/carousel.js +39 -0
  9. data/app/assets/js/contact-button.js +28 -0
  10. data/app/assets/js/random-pool.js +44 -0
  11. data/app/assets/js/search-init.js +11 -0
  12. data/app/assets/js/theme-toggle.js +39 -0
  13. data/app/assets/js/viz-tag-bubble.js +108 -0
  14. data/app/assets/js/viz-tag-cooccurrence.js +125 -0
  15. data/app/assets/js/viz-topic-constellation.js +142 -0
  16. data/app/icons/bluesky.svg +3 -0
  17. data/app/icons/github.svg +3 -0
  18. data/app/icons/linkedin.svg +3 -0
  19. data/app/icons/mail.svg +4 -0
  20. data/app/icons/mastodon.svg +3 -0
  21. data/app/icons/moon.svg +3 -0
  22. data/app/icons/rss.svg +3 -0
  23. data/app/icons/sun.svg +4 -0
  24. data/app/icons/x.svg +3 -0
  25. data/app/views/layouts/about.html.erb +70 -0
  26. data/app/views/layouts/application.html.erb +65 -0
  27. data/app/views/layouts/book_series_index.html.erb +43 -0
  28. data/app/views/layouts/bundle.html.erb +111 -0
  29. data/app/views/layouts/bundles_index.html.erb +46 -0
  30. data/app/views/layouts/country_index.html.erb +59 -0
  31. data/app/views/layouts/gallery_index.html.erb +126 -0
  32. data/app/views/layouts/home.html.erb +107 -0
  33. data/app/views/layouts/photo.html.erb +100 -0
  34. data/app/views/layouts/photos_archive.html.erb +101 -0
  35. data/app/views/layouts/photos_index.html.erb +204 -0
  36. data/app/views/layouts/post.html.erb +153 -0
  37. data/app/views/layouts/posts_archive.html.erb +98 -0
  38. data/app/views/layouts/posts_index.html.erb +80 -0
  39. data/app/views/layouts/publication.html.erb +116 -0
  40. data/app/views/layouts/publications_archive.html.erb +89 -0
  41. data/app/views/layouts/publications_index.html.erb +246 -0
  42. data/app/views/layouts/related_index.html.erb +48 -0
  43. data/app/views/layouts/series.html.erb +110 -0
  44. data/app/views/layouts/series_index.html.erb +202 -0
  45. data/app/views/layouts/tag.html.erb +16 -0
  46. data/app/views/layouts/visualization.html.erb +32 -0
  47. data/app/views/layouts/workshop.html.erb +163 -0
  48. data/app/views/layouts/workshops_index.html.erb +209 -0
  49. data/app/views/partials/_back_link.html.erb +27 -0
  50. data/app/views/partials/_back_to_index.html.erb +25 -0
  51. data/app/views/partials/_book_grid.html.erb +76 -0
  52. data/app/views/partials/_book_jsonld.html.erb +72 -0
  53. data/app/views/partials/_book_related.html.erb +87 -0
  54. data/app/views/partials/_breadcrumb_jsonld.html.erb +60 -0
  55. data/app/views/partials/_bundle_cta.html.erb +26 -0
  56. data/app/views/partials/_carousel.html.erb +64 -0
  57. data/app/views/partials/_collection_page_jsonld.html.erb +81 -0
  58. data/app/views/partials/_contact_button.html.erb +42 -0
  59. data/app/views/partials/_course_jsonld.html.erb +95 -0
  60. data/app/views/partials/_draft_banner.html.erb +20 -0
  61. data/app/views/partials/_event_jsonld.html.erb +122 -0
  62. data/app/views/partials/_footer.html.erb +88 -0
  63. data/app/views/partials/_future_banner.html.erb +25 -0
  64. data/app/views/partials/_head.html.erb +440 -0
  65. data/app/views/partials/_image_gallery.html.erb +64 -0
  66. data/app/views/partials/_image_object_jsonld.html.erb +61 -0
  67. data/app/views/partials/_nav.html.erb +63 -0
  68. data/app/views/partials/_newsletter_subscribe.html.erb +85 -0
  69. data/app/views/partials/_next_in_series.html.erb +27 -0
  70. data/app/views/partials/_next_item.html.erb +38 -0
  71. data/app/views/partials/_pagination.html.erb +15 -0
  72. data/app/views/partials/_person_jsonld.html.erb +46 -0
  73. data/app/views/partials/_plausible.html.erb +24 -0
  74. data/app/views/partials/_post_list.html.erb +101 -0
  75. data/app/views/partials/_post_series_previews.html.erb +92 -0
  76. data/app/views/partials/_publication_card.html.erb +75 -0
  77. data/app/views/partials/_publication_header.html.erb +61 -0
  78. data/app/views/partials/_related_item.html.erb +68 -0
  79. data/app/views/partials/_related_items.html.erb +105 -0
  80. data/app/views/partials/_search.html.erb +26 -0
  81. data/app/views/partials/_series_pager.html.erb +48 -0
  82. data/app/views/partials/_skip_link.html.erb +12 -0
  83. data/app/views/partials/_taxonomy_row.html.erb +62 -0
  84. data/app/views/partials/_testimonials.html.erb +149 -0
  85. data/app/views/partials/_theme_toggle.html.erb +19 -0
  86. data/app/views/partials/_toc.html.erb +136 -0
  87. data/app/views/partials/_webmentions.html.erb +131 -0
  88. data/app/views/partials/_website_jsonld.html.erb +39 -0
  89. data/app/views/partials/home/_contact.html.erb +19 -0
  90. data/app/views/partials/home/_featured_publication.html.erb +107 -0
  91. data/app/views/partials/home/_latest_photo.html.erb +95 -0
  92. data/app/views/partials/home/_latest_post.html.erb +48 -0
  93. data/app/views/partials/home/_latest_publication.html.erb +89 -0
  94. data/app/views/partials/home/_next_workshop.html.erb +119 -0
  95. data/app/views/partials/home/_photo_gallery.html.erb +71 -0
  96. data/app/views/partials/home/_random_photo.html.erb +106 -0
  97. data/app/views/partials/home/_random_post.html.erb +64 -0
  98. data/exe/abqari +37 -0
  99. data/lib/abqari/artifact_writer.rb +196 -0
  100. data/lib/abqari/asset_pipeline.rb +235 -0
  101. data/lib/abqari/audit/a11y.rb +80 -0
  102. data/lib/abqari/audit/content.rb +154 -0
  103. data/lib/abqari/audit/dependencies.rb +127 -0
  104. data/lib/abqari/audit/links.rb +120 -0
  105. data/lib/abqari/audit/performance.rb +120 -0
  106. data/lib/abqari/audit/privacy.rb +42 -0
  107. data/lib/abqari/audit/rule.rb +56 -0
  108. data/lib/abqari/audit/seo.rb +105 -0
  109. data/lib/abqari/audit.rb +149 -0
  110. data/lib/abqari/bundle_assets.rb +127 -0
  111. data/lib/abqari/cli/new.rb +541 -0
  112. data/lib/abqari/cli/theme.rb +181 -0
  113. data/lib/abqari/cli.rb +130 -0
  114. data/lib/abqari/erbi_template.rb +72 -0
  115. data/lib/abqari/feed.rb +159 -0
  116. data/lib/abqari/folio.rb +195 -0
  117. data/lib/abqari/font_pipeline.rb +104 -0
  118. data/lib/abqari/headers_file.rb +324 -0
  119. data/lib/abqari/helpers.rb +308 -0
  120. data/lib/abqari/hooks.rb +136 -0
  121. data/lib/abqari/http_safe.rb +222 -0
  122. data/lib/abqari/image_pipeline.rb +800 -0
  123. data/lib/abqari/importers/base.rb +351 -0
  124. data/lib/abqari/importers/cli.rb +169 -0
  125. data/lib/abqari/importers/ghost.rb +113 -0
  126. data/lib/abqari/importers/jekyll.rb +256 -0
  127. data/lib/abqari/importers/substack.rb +204 -0
  128. data/lib/abqari/importers/support/html_to_markdown.rb +126 -0
  129. data/lib/abqari/importers/support/image_downloader.rb +170 -0
  130. data/lib/abqari/importers/support/report.rb +87 -0
  131. data/lib/abqari/importers/support/slug_normalizer.rb +53 -0
  132. data/lib/abqari/importers.rb +64 -0
  133. data/lib/abqari/indieweb.rb +551 -0
  134. data/lib/abqari/llms_txt.rb +110 -0
  135. data/lib/abqari/log.rb +61 -0
  136. data/lib/abqari/manifest.rb +58 -0
  137. data/lib/abqari/minifier.rb +108 -0
  138. data/lib/abqari/og_image_generator.rb +223 -0
  139. data/lib/abqari/page/bundle.rb +152 -0
  140. data/lib/abqari/page/incremental.rb +74 -0
  141. data/lib/abqari/page/parser.rb +129 -0
  142. data/lib/abqari/page/path.rb +153 -0
  143. data/lib/abqari/page.rb +424 -0
  144. data/lib/abqari/paginated_shard.rb +109 -0
  145. data/lib/abqari/paginator.rb +35 -0
  146. data/lib/abqari/path_safe.rb +62 -0
  147. data/lib/abqari/plausible_script.rb +20 -0
  148. data/lib/abqari/publication_normaliser.rb +111 -0
  149. data/lib/abqari/publisher_pages.rb +342 -0
  150. data/lib/abqari/redirects.rb +134 -0
  151. data/lib/abqari/related_index_page.rb +79 -0
  152. data/lib/abqari/render_context/cover_helpers.rb +338 -0
  153. data/lib/abqari/render_context/picture_helpers.rb +178 -0
  154. data/lib/abqari/render_context/publication_helpers.rb +120 -0
  155. data/lib/abqari/render_context.rb +251 -0
  156. data/lib/abqari/renderer.rb +788 -0
  157. data/lib/abqari/robots.rb +93 -0
  158. data/lib/abqari/search.rb +68 -0
  159. data/lib/abqari/security_txt.rb +44 -0
  160. data/lib/abqari/server.rb +508 -0
  161. data/lib/abqari/site.rb +952 -0
  162. data/lib/abqari/site_config.rb +212 -0
  163. data/lib/abqari/site_loader.rb +265 -0
  164. data/lib/abqari/sitemap.rb +87 -0
  165. data/lib/abqari/speculation_rules_guard.rb +26 -0
  166. data/lib/abqari/syndication.rb +466 -0
  167. data/lib/abqari/syntax_highlighter.rb +146 -0
  168. data/lib/abqari/taxonomy_page.rb +129 -0
  169. data/lib/abqari/templates/site_skeleton/.github/dependabot.yml +53 -0
  170. data/lib/abqari/templates/site_skeleton/.github/workflows/deploy-cloudflare.yml +107 -0
  171. data/lib/abqari/templates/site_skeleton/.github/workflows/deploy-github-pages.yml +107 -0
  172. data/lib/abqari/templates/site_skeleton/.github/workflows/deploy-render.yml +87 -0
  173. data/lib/abqari/templates/site_skeleton/.gitignore +24 -0
  174. data/lib/abqari/templates/site_skeleton/.ruby-version.tt +1 -0
  175. data/lib/abqari/templates/site_skeleton/Gemfile.tt +20 -0
  176. data/lib/abqari/templates/site_skeleton/README.md.tt +60 -0
  177. data/lib/abqari/templates/site_skeleton/app/assets/css/site.css +9 -0
  178. data/lib/abqari/templates/site_skeleton/bin/audit +46 -0
  179. data/lib/abqari/templates/site_skeleton/bin/build +32 -0
  180. data/lib/abqari/templates/site_skeleton/bin/fetch-folio +32 -0
  181. data/lib/abqari/templates/site_skeleton/bin/fetch-fonts +20 -0
  182. data/lib/abqari/templates/site_skeleton/bin/import +31 -0
  183. data/lib/abqari/templates/site_skeleton/bin/index +30 -0
  184. data/lib/abqari/templates/site_skeleton/bin/new +235 -0
  185. data/lib/abqari/templates/site_skeleton/bin/serve +30 -0
  186. data/lib/abqari/templates/site_skeleton/config/site.blank.yml.tt +65 -0
  187. data/lib/abqari/templates/site_skeleton/config/site.yml.tt +266 -0
  188. data/lib/abqari/templates/site_skeleton/content/404.md +17 -0
  189. data/lib/abqari/templates/site_skeleton/content/about.blank.md.tt +12 -0
  190. data/lib/abqari/templates/site_skeleton/content/about.md.tt +18 -0
  191. data/lib/abqari/templates/site_skeleton/content/index.blank.md.tt +11 -0
  192. data/lib/abqari/templates/site_skeleton/content/index.md.tt +34 -0
  193. data/lib/abqari/templates/site_skeleton/content/photos/index.md.tt +12 -0
  194. data/lib/abqari/templates/site_skeleton/content/posts/index.md +12 -0
  195. data/lib/abqari/templates/site_skeleton/content/posts/welcome/index.md.tt +50 -0
  196. data/lib/abqari/templates/site_skeleton/content/publications/index.md.tt +13 -0
  197. data/lib/abqari/templates/site_skeleton/content/workshops/index.md.tt +13 -0
  198. data/lib/abqari/templates/site_skeleton/public/robots.txt +6 -0
  199. data/lib/abqari/templates/site_skeleton/themes/.gitkeep +0 -0
  200. data/lib/abqari/templates/site_skeleton/vendor/folio/.gitkeep +0 -0
  201. data/lib/abqari/templates/site_skeleton/vendor/fonts/.gitkeep +0 -0
  202. data/lib/abqari/theme_bootstrap.rb +19 -0
  203. data/lib/abqari/theme_fonts.rb +51 -0
  204. data/lib/abqari/version.rb +18 -0
  205. data/lib/abqari/visualizations.rb +215 -0
  206. data/lib/abqari.rb +154 -0
  207. data/themes/bootstrap/css/app.css +97 -0
  208. data/themes/bootstrap/public/LICENSE +21 -0
  209. data/themes/bootstrap/public/css/bootstrap.min.css +6 -0
  210. data/themes/bootstrap/public/css/bootstrap.min.css.map +1 -0
  211. data/themes/bootstrap/public/js/bootstrap.bundle.min.js +7 -0
  212. data/themes/bootstrap/public/js/bootstrap.bundle.min.js.map +1 -0
  213. data/themes/custom/css/app.css +176 -0
  214. data/themes/magazine/css/app.css +242 -0
  215. data/themes/minimal/css/app.css +151 -0
  216. data/themes/notebook/css/app.css +205 -0
  217. data/themes/sand/css/app.css +179 -0
  218. data/vendor/d3/d3.v7.min.js +2 -0
  219. data/vendor/heroicons/16/solid/academic-cap.svg +4 -0
  220. data/vendor/heroicons/16/solid/adjustments-horizontal.svg +3 -0
  221. data/vendor/heroicons/16/solid/adjustments-vertical.svg +3 -0
  222. data/vendor/heroicons/16/solid/archive-box-arrow-down.svg +4 -0
  223. data/vendor/heroicons/16/solid/archive-box-x-mark.svg +4 -0
  224. data/vendor/heroicons/16/solid/archive-box.svg +4 -0
  225. data/vendor/heroicons/16/solid/arrow-down-circle.svg +3 -0
  226. data/vendor/heroicons/16/solid/arrow-down-left.svg +3 -0
  227. data/vendor/heroicons/16/solid/arrow-down-on-square-stack.svg +4 -0
  228. data/vendor/heroicons/16/solid/arrow-down-on-square.svg +3 -0
  229. data/vendor/heroicons/16/solid/arrow-down-right.svg +3 -0
  230. data/vendor/heroicons/16/solid/arrow-down-tray.svg +4 -0
  231. data/vendor/heroicons/16/solid/arrow-down.svg +3 -0
  232. data/vendor/heroicons/16/solid/arrow-left-circle.svg +3 -0
  233. data/vendor/heroicons/16/solid/arrow-left-end-on-rectangle.svg +4 -0
  234. data/vendor/heroicons/16/solid/arrow-left-start-on-rectangle.svg +3 -0
  235. data/vendor/heroicons/16/solid/arrow-left.svg +3 -0
  236. data/vendor/heroicons/16/solid/arrow-long-down.svg +3 -0
  237. data/vendor/heroicons/16/solid/arrow-long-left.svg +3 -0
  238. data/vendor/heroicons/16/solid/arrow-long-right.svg +3 -0
  239. data/vendor/heroicons/16/solid/arrow-long-up.svg +3 -0
  240. data/vendor/heroicons/16/solid/arrow-path-rounded-square.svg +3 -0
  241. data/vendor/heroicons/16/solid/arrow-path.svg +3 -0
  242. data/vendor/heroicons/16/solid/arrow-right-circle.svg +3 -0
  243. data/vendor/heroicons/16/solid/arrow-right-end-on-rectangle.svg +4 -0
  244. data/vendor/heroicons/16/solid/arrow-right-start-on-rectangle.svg +3 -0
  245. data/vendor/heroicons/16/solid/arrow-right.svg +3 -0
  246. data/vendor/heroicons/16/solid/arrow-top-right-on-square.svg +4 -0
  247. data/vendor/heroicons/16/solid/arrow-trending-down.svg +3 -0
  248. data/vendor/heroicons/16/solid/arrow-trending-up.svg +3 -0
  249. data/vendor/heroicons/16/solid/arrow-turn-down-left.svg +3 -0
  250. data/vendor/heroicons/16/solid/arrow-turn-down-right.svg +3 -0
  251. data/vendor/heroicons/16/solid/arrow-turn-left-down.svg +3 -0
  252. data/vendor/heroicons/16/solid/arrow-turn-left-up.svg +3 -0
  253. data/vendor/heroicons/16/solid/arrow-turn-right-down.svg +3 -0
  254. data/vendor/heroicons/16/solid/arrow-turn-right-up.svg +3 -0
  255. data/vendor/heroicons/16/solid/arrow-turn-up-left.svg +3 -0
  256. data/vendor/heroicons/16/solid/arrow-turn-up-right.svg +3 -0
  257. data/vendor/heroicons/16/solid/arrow-up-circle.svg +3 -0
  258. data/vendor/heroicons/16/solid/arrow-up-left.svg +3 -0
  259. data/vendor/heroicons/16/solid/arrow-up-on-square-stack.svg +4 -0
  260. data/vendor/heroicons/16/solid/arrow-up-on-square.svg +3 -0
  261. data/vendor/heroicons/16/solid/arrow-up-right.svg +3 -0
  262. data/vendor/heroicons/16/solid/arrow-up-tray.svg +4 -0
  263. data/vendor/heroicons/16/solid/arrow-up.svg +3 -0
  264. data/vendor/heroicons/16/solid/arrow-uturn-down.svg +3 -0
  265. data/vendor/heroicons/16/solid/arrow-uturn-left.svg +3 -0
  266. data/vendor/heroicons/16/solid/arrow-uturn-right.svg +3 -0
  267. data/vendor/heroicons/16/solid/arrow-uturn-up.svg +3 -0
  268. data/vendor/heroicons/16/solid/arrows-pointing-in.svg +3 -0
  269. data/vendor/heroicons/16/solid/arrows-pointing-out.svg +3 -0
  270. data/vendor/heroicons/16/solid/arrows-right-left.svg +3 -0
  271. data/vendor/heroicons/16/solid/arrows-up-down.svg +3 -0
  272. data/vendor/heroicons/16/solid/at-symbol.svg +3 -0
  273. data/vendor/heroicons/16/solid/backspace.svg +3 -0
  274. data/vendor/heroicons/16/solid/backward.svg +3 -0
  275. data/vendor/heroicons/16/solid/banknotes.svg +4 -0
  276. data/vendor/heroicons/16/solid/bars-2.svg +3 -0
  277. data/vendor/heroicons/16/solid/bars-3-bottom-left.svg +3 -0
  278. data/vendor/heroicons/16/solid/bars-3-bottom-right.svg +3 -0
  279. data/vendor/heroicons/16/solid/bars-3-center-left.svg +3 -0
  280. data/vendor/heroicons/16/solid/bars-3.svg +3 -0
  281. data/vendor/heroicons/16/solid/bars-4.svg +3 -0
  282. data/vendor/heroicons/16/solid/bars-arrow-down.svg +3 -0
  283. data/vendor/heroicons/16/solid/bars-arrow-up.svg +3 -0
  284. data/vendor/heroicons/16/solid/battery-0.svg +3 -0
  285. data/vendor/heroicons/16/solid/battery-100.svg +4 -0
  286. data/vendor/heroicons/16/solid/battery-50.svg +4 -0
  287. data/vendor/heroicons/16/solid/beaker.svg +3 -0
  288. data/vendor/heroicons/16/solid/bell-alert.svg +4 -0
  289. data/vendor/heroicons/16/solid/bell-slash.svg +4 -0
  290. data/vendor/heroicons/16/solid/bell-snooze.svg +3 -0
  291. data/vendor/heroicons/16/solid/bell.svg +3 -0
  292. data/vendor/heroicons/16/solid/bold.svg +3 -0
  293. data/vendor/heroicons/16/solid/bolt-slash.svg +3 -0
  294. data/vendor/heroicons/16/solid/bolt.svg +3 -0
  295. data/vendor/heroicons/16/solid/book-open.svg +3 -0
  296. data/vendor/heroicons/16/solid/bookmark-slash.svg +3 -0
  297. data/vendor/heroicons/16/solid/bookmark-square.svg +3 -0
  298. data/vendor/heroicons/16/solid/bookmark.svg +3 -0
  299. data/vendor/heroicons/16/solid/briefcase.svg +4 -0
  300. data/vendor/heroicons/16/solid/bug-ant.svg +3 -0
  301. data/vendor/heroicons/16/solid/building-library.svg +3 -0
  302. data/vendor/heroicons/16/solid/building-office-2.svg +3 -0
  303. data/vendor/heroicons/16/solid/building-office.svg +3 -0
  304. data/vendor/heroicons/16/solid/building-storefront.svg +3 -0
  305. data/vendor/heroicons/16/solid/cake.svg +3 -0
  306. data/vendor/heroicons/16/solid/calculator.svg +3 -0
  307. data/vendor/heroicons/16/solid/calendar-date-range.svg +4 -0
  308. data/vendor/heroicons/16/solid/calendar-days.svg +4 -0
  309. data/vendor/heroicons/16/solid/calendar.svg +3 -0
  310. data/vendor/heroicons/16/solid/camera.svg +4 -0
  311. data/vendor/heroicons/16/solid/chart-bar-square.svg +3 -0
  312. data/vendor/heroicons/16/solid/chart-bar.svg +3 -0
  313. data/vendor/heroicons/16/solid/chart-pie.svg +4 -0
  314. data/vendor/heroicons/16/solid/chat-bubble-bottom-center-text.svg +3 -0
  315. data/vendor/heroicons/16/solid/chat-bubble-bottom-center.svg +3 -0
  316. data/vendor/heroicons/16/solid/chat-bubble-left-ellipsis.svg +3 -0
  317. data/vendor/heroicons/16/solid/chat-bubble-left-right.svg +4 -0
  318. data/vendor/heroicons/16/solid/chat-bubble-left.svg +3 -0
  319. data/vendor/heroicons/16/solid/chat-bubble-oval-left-ellipsis.svg +3 -0
  320. data/vendor/heroicons/16/solid/chat-bubble-oval-left.svg +3 -0
  321. data/vendor/heroicons/16/solid/check-badge.svg +3 -0
  322. data/vendor/heroicons/16/solid/check-circle.svg +3 -0
  323. data/vendor/heroicons/16/solid/check.svg +3 -0
  324. data/vendor/heroicons/16/solid/chevron-double-down.svg +3 -0
  325. data/vendor/heroicons/16/solid/chevron-double-left.svg +3 -0
  326. data/vendor/heroicons/16/solid/chevron-double-right.svg +3 -0
  327. data/vendor/heroicons/16/solid/chevron-double-up.svg +3 -0
  328. data/vendor/heroicons/16/solid/chevron-down.svg +3 -0
  329. data/vendor/heroicons/16/solid/chevron-left.svg +3 -0
  330. data/vendor/heroicons/16/solid/chevron-right.svg +3 -0
  331. data/vendor/heroicons/16/solid/chevron-up-down.svg +3 -0
  332. data/vendor/heroicons/16/solid/chevron-up.svg +3 -0
  333. data/vendor/heroicons/16/solid/circle-stack.svg +5 -0
  334. data/vendor/heroicons/16/solid/clipboard-document-check.svg +4 -0
  335. data/vendor/heroicons/16/solid/clipboard-document-list.svg +4 -0
  336. data/vendor/heroicons/16/solid/clipboard-document.svg +4 -0
  337. data/vendor/heroicons/16/solid/clipboard.svg +3 -0
  338. data/vendor/heroicons/16/solid/clock.svg +3 -0
  339. data/vendor/heroicons/16/solid/cloud-arrow-down.svg +3 -0
  340. data/vendor/heroicons/16/solid/cloud-arrow-up.svg +3 -0
  341. data/vendor/heroicons/16/solid/cloud.svg +3 -0
  342. data/vendor/heroicons/16/solid/code-bracket-square.svg +3 -0
  343. data/vendor/heroicons/16/solid/code-bracket.svg +3 -0
  344. data/vendor/heroicons/16/solid/cog-6-tooth.svg +3 -0
  345. data/vendor/heroicons/16/solid/cog-8-tooth.svg +3 -0
  346. data/vendor/heroicons/16/solid/cog.svg +3 -0
  347. data/vendor/heroicons/16/solid/command-line.svg +3 -0
  348. data/vendor/heroicons/16/solid/computer-desktop.svg +3 -0
  349. data/vendor/heroicons/16/solid/cpu-chip.svg +4 -0
  350. data/vendor/heroicons/16/solid/credit-card.svg +4 -0
  351. data/vendor/heroicons/16/solid/cube-transparent.svg +3 -0
  352. data/vendor/heroicons/16/solid/cube.svg +3 -0
  353. data/vendor/heroicons/16/solid/currency-bangladeshi.svg +3 -0
  354. data/vendor/heroicons/16/solid/currency-dollar.svg +4 -0
  355. data/vendor/heroicons/16/solid/currency-euro.svg +3 -0
  356. data/vendor/heroicons/16/solid/currency-pound.svg +3 -0
  357. data/vendor/heroicons/16/solid/currency-rupee.svg +3 -0
  358. data/vendor/heroicons/16/solid/currency-yen.svg +3 -0
  359. data/vendor/heroicons/16/solid/cursor-arrow-rays.svg +3 -0
  360. data/vendor/heroicons/16/solid/cursor-arrow-ripple.svg +5 -0
  361. data/vendor/heroicons/16/solid/device-phone-mobile.svg +4 -0
  362. data/vendor/heroicons/16/solid/device-tablet.svg +4 -0
  363. data/vendor/heroicons/16/solid/divide.svg +4 -0
  364. data/vendor/heroicons/16/solid/document-arrow-down.svg +3 -0
  365. data/vendor/heroicons/16/solid/document-arrow-up.svg +3 -0
  366. data/vendor/heroicons/16/solid/document-chart-bar.svg +3 -0
  367. data/vendor/heroicons/16/solid/document-check.svg +3 -0
  368. data/vendor/heroicons/16/solid/document-currency-bangladeshi.svg +3 -0
  369. data/vendor/heroicons/16/solid/document-currency-dollar.svg +4 -0
  370. data/vendor/heroicons/16/solid/document-currency-euro.svg +3 -0
  371. data/vendor/heroicons/16/solid/document-currency-pound.svg +3 -0
  372. data/vendor/heroicons/16/solid/document-currency-rupee.svg +3 -0
  373. data/vendor/heroicons/16/solid/document-currency-yen.svg +3 -0
  374. data/vendor/heroicons/16/solid/document-duplicate.svg +4 -0
  375. data/vendor/heroicons/16/solid/document-magnifying-glass.svg +4 -0
  376. data/vendor/heroicons/16/solid/document-minus.svg +3 -0
  377. data/vendor/heroicons/16/solid/document-plus.svg +3 -0
  378. data/vendor/heroicons/16/solid/document-text.svg +3 -0
  379. data/vendor/heroicons/16/solid/document.svg +3 -0
  380. data/vendor/heroicons/16/solid/ellipsis-horizontal-circle.svg +3 -0
  381. data/vendor/heroicons/16/solid/ellipsis-horizontal.svg +3 -0
  382. data/vendor/heroicons/16/solid/ellipsis-vertical.svg +3 -0
  383. data/vendor/heroicons/16/solid/envelope-open.svg +3 -0
  384. data/vendor/heroicons/16/solid/envelope.svg +4 -0
  385. data/vendor/heroicons/16/solid/equals.svg +3 -0
  386. data/vendor/heroicons/16/solid/exclamation-circle.svg +3 -0
  387. data/vendor/heroicons/16/solid/exclamation-triangle.svg +3 -0
  388. data/vendor/heroicons/16/solid/eye-dropper.svg +3 -0
  389. data/vendor/heroicons/16/solid/eye-slash.svg +4 -0
  390. data/vendor/heroicons/16/solid/eye.svg +4 -0
  391. data/vendor/heroicons/16/solid/face-frown.svg +3 -0
  392. data/vendor/heroicons/16/solid/face-smile.svg +3 -0
  393. data/vendor/heroicons/16/solid/film.svg +3 -0
  394. data/vendor/heroicons/16/solid/finger-print.svg +3 -0
  395. data/vendor/heroicons/16/solid/fire.svg +3 -0
  396. data/vendor/heroicons/16/solid/flag.svg +3 -0
  397. data/vendor/heroicons/16/solid/folder-arrow-down.svg +3 -0
  398. data/vendor/heroicons/16/solid/folder-minus.svg +3 -0
  399. data/vendor/heroicons/16/solid/folder-open.svg +3 -0
  400. data/vendor/heroicons/16/solid/folder-plus.svg +3 -0
  401. data/vendor/heroicons/16/solid/folder.svg +3 -0
  402. data/vendor/heroicons/16/solid/forward.svg +3 -0
  403. data/vendor/heroicons/16/solid/funnel.svg +3 -0
  404. data/vendor/heroicons/16/solid/gif.svg +3 -0
  405. data/vendor/heroicons/16/solid/gift-top.svg +4 -0
  406. data/vendor/heroicons/16/solid/gift.svg +4 -0
  407. data/vendor/heroicons/16/solid/globe-alt.svg +3 -0
  408. data/vendor/heroicons/16/solid/globe-americas.svg +3 -0
  409. data/vendor/heroicons/16/solid/globe-asia-australia.svg +3 -0
  410. data/vendor/heroicons/16/solid/globe-europe-africa.svg +3 -0
  411. data/vendor/heroicons/16/solid/h1.svg +3 -0
  412. data/vendor/heroicons/16/solid/h2.svg +3 -0
  413. data/vendor/heroicons/16/solid/h3.svg +3 -0
  414. data/vendor/heroicons/16/solid/hand-raised.svg +3 -0
  415. data/vendor/heroicons/16/solid/hand-thumb-down.svg +3 -0
  416. data/vendor/heroicons/16/solid/hand-thumb-up.svg +3 -0
  417. data/vendor/heroicons/16/solid/hashtag.svg +3 -0
  418. data/vendor/heroicons/16/solid/heart.svg +3 -0
  419. data/vendor/heroicons/16/solid/home-modern.svg +3 -0
  420. data/vendor/heroicons/16/solid/home.svg +3 -0
  421. data/vendor/heroicons/16/solid/identification.svg +3 -0
  422. data/vendor/heroicons/16/solid/inbox-arrow-down.svg +4 -0
  423. data/vendor/heroicons/16/solid/inbox-stack.svg +4 -0
  424. data/vendor/heroicons/16/solid/inbox.svg +3 -0
  425. data/vendor/heroicons/16/solid/information-circle.svg +3 -0
  426. data/vendor/heroicons/16/solid/italic.svg +3 -0
  427. data/vendor/heroicons/16/solid/key.svg +3 -0
  428. data/vendor/heroicons/16/solid/language.svg +3 -0
  429. data/vendor/heroicons/16/solid/lifebuoy.svg +3 -0
  430. data/vendor/heroicons/16/solid/light-bulb.svg +3 -0
  431. data/vendor/heroicons/16/solid/link-slash.svg +3 -0
  432. data/vendor/heroicons/16/solid/link.svg +4 -0
  433. data/vendor/heroicons/16/solid/list-bullet.svg +3 -0
  434. data/vendor/heroicons/16/solid/lock-closed.svg +3 -0
  435. data/vendor/heroicons/16/solid/lock-open.svg +3 -0
  436. data/vendor/heroicons/16/solid/magnifying-glass-circle.svg +4 -0
  437. data/vendor/heroicons/16/solid/magnifying-glass-minus.svg +4 -0
  438. data/vendor/heroicons/16/solid/magnifying-glass-plus.svg +4 -0
  439. data/vendor/heroicons/16/solid/magnifying-glass.svg +3 -0
  440. data/vendor/heroicons/16/solid/map-pin.svg +3 -0
  441. data/vendor/heroicons/16/solid/map.svg +3 -0
  442. data/vendor/heroicons/16/solid/megaphone.svg +3 -0
  443. data/vendor/heroicons/16/solid/microphone.svg +4 -0
  444. data/vendor/heroicons/16/solid/minus-circle.svg +3 -0
  445. data/vendor/heroicons/16/solid/minus.svg +3 -0
  446. data/vendor/heroicons/16/solid/moon.svg +3 -0
  447. data/vendor/heroicons/16/solid/musical-note.svg +3 -0
  448. data/vendor/heroicons/16/solid/newspaper.svg +4 -0
  449. data/vendor/heroicons/16/solid/no-symbol.svg +3 -0
  450. data/vendor/heroicons/16/solid/numbered-list.svg +3 -0
  451. data/vendor/heroicons/16/solid/paint-brush.svg +3 -0
  452. data/vendor/heroicons/16/solid/paper-airplane.svg +3 -0
  453. data/vendor/heroicons/16/solid/paper-clip.svg +3 -0
  454. data/vendor/heroicons/16/solid/pause-circle.svg +3 -0
  455. data/vendor/heroicons/16/solid/pause.svg +3 -0
  456. data/vendor/heroicons/16/solid/pencil-square.svg +4 -0
  457. data/vendor/heroicons/16/solid/pencil.svg +3 -0
  458. data/vendor/heroicons/16/solid/percent-badge.svg +3 -0
  459. data/vendor/heroicons/16/solid/phone-arrow-down-left.svg +4 -0
  460. data/vendor/heroicons/16/solid/phone-arrow-up-right.svg +4 -0
  461. data/vendor/heroicons/16/solid/phone-x-mark.svg +4 -0
  462. data/vendor/heroicons/16/solid/phone.svg +3 -0
  463. data/vendor/heroicons/16/solid/photo.svg +3 -0
  464. data/vendor/heroicons/16/solid/play-circle.svg +3 -0
  465. data/vendor/heroicons/16/solid/play-pause.svg +3 -0
  466. data/vendor/heroicons/16/solid/play.svg +3 -0
  467. data/vendor/heroicons/16/solid/plus-circle.svg +3 -0
  468. data/vendor/heroicons/16/solid/plus.svg +3 -0
  469. data/vendor/heroicons/16/solid/power.svg +3 -0
  470. data/vendor/heroicons/16/solid/presentation-chart-bar.svg +3 -0
  471. data/vendor/heroicons/16/solid/presentation-chart-line.svg +3 -0
  472. data/vendor/heroicons/16/solid/printer.svg +3 -0
  473. data/vendor/heroicons/16/solid/puzzle-piece.svg +3 -0
  474. data/vendor/heroicons/16/solid/qr-code.svg +9 -0
  475. data/vendor/heroicons/16/solid/question-mark-circle.svg +3 -0
  476. data/vendor/heroicons/16/solid/queue-list.svg +3 -0
  477. data/vendor/heroicons/16/solid/radio.svg +3 -0
  478. data/vendor/heroicons/16/solid/receipt-percent.svg +3 -0
  479. data/vendor/heroicons/16/solid/receipt-refund.svg +3 -0
  480. data/vendor/heroicons/16/solid/rectangle-group.svg +3 -0
  481. data/vendor/heroicons/16/solid/rectangle-stack.svg +3 -0
  482. data/vendor/heroicons/16/solid/rocket-launch.svg +4 -0
  483. data/vendor/heroicons/16/solid/rss.svg +3 -0
  484. data/vendor/heroicons/16/solid/scale.svg +3 -0
  485. data/vendor/heroicons/16/solid/scissors.svg +4 -0
  486. data/vendor/heroicons/16/solid/server-stack.svg +4 -0
  487. data/vendor/heroicons/16/solid/server.svg +4 -0
  488. data/vendor/heroicons/16/solid/share.svg +3 -0
  489. data/vendor/heroicons/16/solid/shield-check.svg +3 -0
  490. data/vendor/heroicons/16/solid/shield-exclamation.svg +3 -0
  491. data/vendor/heroicons/16/solid/shopping-bag.svg +3 -0
  492. data/vendor/heroicons/16/solid/shopping-cart.svg +3 -0
  493. data/vendor/heroicons/16/solid/signal-slash.svg +3 -0
  494. data/vendor/heroicons/16/solid/signal.svg +5 -0
  495. data/vendor/heroicons/16/solid/slash.svg +3 -0
  496. data/vendor/heroicons/16/solid/sparkles.svg +3 -0
  497. data/vendor/heroicons/16/solid/speaker-wave.svg +4 -0
  498. data/vendor/heroicons/16/solid/speaker-x-mark.svg +3 -0
  499. data/vendor/heroicons/16/solid/square-2-stack.svg +4 -0
  500. data/vendor/heroicons/16/solid/square-3-stack-3d.svg +5 -0
  501. data/vendor/heroicons/16/solid/squares-2x2.svg +3 -0
  502. data/vendor/heroicons/16/solid/squares-plus.svg +3 -0
  503. data/vendor/heroicons/16/solid/star.svg +3 -0
  504. data/vendor/heroicons/16/solid/stop-circle.svg +3 -0
  505. data/vendor/heroicons/16/solid/stop.svg +3 -0
  506. data/vendor/heroicons/16/solid/strikethrough.svg +3 -0
  507. data/vendor/heroicons/16/solid/sun.svg +3 -0
  508. data/vendor/heroicons/16/solid/swatch.svg +4 -0
  509. data/vendor/heroicons/16/solid/table-cells.svg +3 -0
  510. data/vendor/heroicons/16/solid/tag.svg +3 -0
  511. data/vendor/heroicons/16/solid/ticket.svg +3 -0
  512. data/vendor/heroicons/16/solid/trash.svg +3 -0
  513. data/vendor/heroicons/16/solid/trophy.svg +3 -0
  514. data/vendor/heroicons/16/solid/truck.svg +5 -0
  515. data/vendor/heroicons/16/solid/tv.svg +4 -0
  516. data/vendor/heroicons/16/solid/underline.svg +3 -0
  517. data/vendor/heroicons/16/solid/user-circle.svg +3 -0
  518. data/vendor/heroicons/16/solid/user-group.svg +3 -0
  519. data/vendor/heroicons/16/solid/user-minus.svg +3 -0
  520. data/vendor/heroicons/16/solid/user-plus.svg +3 -0
  521. data/vendor/heroicons/16/solid/user.svg +3 -0
  522. data/vendor/heroicons/16/solid/users.svg +3 -0
  523. data/vendor/heroicons/16/solid/variable.svg +3 -0
  524. data/vendor/heroicons/16/solid/video-camera-slash.svg +3 -0
  525. data/vendor/heroicons/16/solid/video-camera.svg +3 -0
  526. data/vendor/heroicons/16/solid/view-columns.svg +3 -0
  527. data/vendor/heroicons/16/solid/viewfinder-circle.svg +3 -0
  528. data/vendor/heroicons/16/solid/wallet.svg +3 -0
  529. data/vendor/heroicons/16/solid/wifi.svg +3 -0
  530. data/vendor/heroicons/16/solid/window.svg +3 -0
  531. data/vendor/heroicons/16/solid/wrench-screwdriver.svg +4 -0
  532. data/vendor/heroicons/16/solid/wrench.svg +3 -0
  533. data/vendor/heroicons/16/solid/x-circle.svg +3 -0
  534. data/vendor/heroicons/16/solid/x-mark.svg +3 -0
  535. data/vendor/heroicons/20/solid/academic-cap.svg +3 -0
  536. data/vendor/heroicons/20/solid/adjustments-horizontal.svg +3 -0
  537. data/vendor/heroicons/20/solid/adjustments-vertical.svg +3 -0
  538. data/vendor/heroicons/20/solid/archive-box-arrow-down.svg +3 -0
  539. data/vendor/heroicons/20/solid/archive-box-x-mark.svg +4 -0
  540. data/vendor/heroicons/20/solid/archive-box.svg +4 -0
  541. data/vendor/heroicons/20/solid/arrow-down-circle.svg +3 -0
  542. data/vendor/heroicons/20/solid/arrow-down-left.svg +3 -0
  543. data/vendor/heroicons/20/solid/arrow-down-on-square-stack.svg +3 -0
  544. data/vendor/heroicons/20/solid/arrow-down-on-square.svg +3 -0
  545. data/vendor/heroicons/20/solid/arrow-down-right.svg +3 -0
  546. data/vendor/heroicons/20/solid/arrow-down-tray.svg +4 -0
  547. data/vendor/heroicons/20/solid/arrow-down.svg +3 -0
  548. data/vendor/heroicons/20/solid/arrow-left-circle.svg +3 -0
  549. data/vendor/heroicons/20/solid/arrow-left-end-on-rectangle.svg +4 -0
  550. data/vendor/heroicons/20/solid/arrow-left-on-rectangle.svg +4 -0
  551. data/vendor/heroicons/20/solid/arrow-left-start-on-rectangle.svg +4 -0
  552. data/vendor/heroicons/20/solid/arrow-left.svg +3 -0
  553. data/vendor/heroicons/20/solid/arrow-long-down.svg +3 -0
  554. data/vendor/heroicons/20/solid/arrow-long-left.svg +3 -0
  555. data/vendor/heroicons/20/solid/arrow-long-right.svg +3 -0
  556. data/vendor/heroicons/20/solid/arrow-long-up.svg +3 -0
  557. data/vendor/heroicons/20/solid/arrow-path-rounded-square.svg +3 -0
  558. data/vendor/heroicons/20/solid/arrow-path.svg +3 -0
  559. data/vendor/heroicons/20/solid/arrow-right-circle.svg +3 -0
  560. data/vendor/heroicons/20/solid/arrow-right-end-on-rectangle.svg +4 -0
  561. data/vendor/heroicons/20/solid/arrow-right-on-rectangle.svg +4 -0
  562. data/vendor/heroicons/20/solid/arrow-right-start-on-rectangle.svg +4 -0
  563. data/vendor/heroicons/20/solid/arrow-right.svg +3 -0
  564. data/vendor/heroicons/20/solid/arrow-small-down.svg +3 -0
  565. data/vendor/heroicons/20/solid/arrow-small-left.svg +3 -0
  566. data/vendor/heroicons/20/solid/arrow-small-right.svg +3 -0
  567. data/vendor/heroicons/20/solid/arrow-small-up.svg +3 -0
  568. data/vendor/heroicons/20/solid/arrow-top-right-on-square.svg +4 -0
  569. data/vendor/heroicons/20/solid/arrow-trending-down.svg +3 -0
  570. data/vendor/heroicons/20/solid/arrow-trending-up.svg +3 -0
  571. data/vendor/heroicons/20/solid/arrow-turn-down-left.svg +3 -0
  572. data/vendor/heroicons/20/solid/arrow-turn-down-right.svg +3 -0
  573. data/vendor/heroicons/20/solid/arrow-turn-left-down.svg +3 -0
  574. data/vendor/heroicons/20/solid/arrow-turn-left-up.svg +3 -0
  575. data/vendor/heroicons/20/solid/arrow-turn-right-down.svg +3 -0
  576. data/vendor/heroicons/20/solid/arrow-turn-right-up.svg +3 -0
  577. data/vendor/heroicons/20/solid/arrow-turn-up-left.svg +3 -0
  578. data/vendor/heroicons/20/solid/arrow-turn-up-right.svg +3 -0
  579. data/vendor/heroicons/20/solid/arrow-up-circle.svg +3 -0
  580. data/vendor/heroicons/20/solid/arrow-up-left.svg +3 -0
  581. data/vendor/heroicons/20/solid/arrow-up-on-square-stack.svg +3 -0
  582. data/vendor/heroicons/20/solid/arrow-up-on-square.svg +3 -0
  583. data/vendor/heroicons/20/solid/arrow-up-right.svg +3 -0
  584. data/vendor/heroicons/20/solid/arrow-up-tray.svg +4 -0
  585. data/vendor/heroicons/20/solid/arrow-up.svg +3 -0
  586. data/vendor/heroicons/20/solid/arrow-uturn-down.svg +3 -0
  587. data/vendor/heroicons/20/solid/arrow-uturn-left.svg +3 -0
  588. data/vendor/heroicons/20/solid/arrow-uturn-right.svg +3 -0
  589. data/vendor/heroicons/20/solid/arrow-uturn-up.svg +3 -0
  590. data/vendor/heroicons/20/solid/arrows-pointing-in.svg +3 -0
  591. data/vendor/heroicons/20/solid/arrows-pointing-out.svg +3 -0
  592. data/vendor/heroicons/20/solid/arrows-right-left.svg +3 -0
  593. data/vendor/heroicons/20/solid/arrows-up-down.svg +3 -0
  594. data/vendor/heroicons/20/solid/at-symbol.svg +3 -0
  595. data/vendor/heroicons/20/solid/backspace.svg +3 -0
  596. data/vendor/heroicons/20/solid/backward.svg +3 -0
  597. data/vendor/heroicons/20/solid/banknotes.svg +3 -0
  598. data/vendor/heroicons/20/solid/bars-2.svg +3 -0
  599. data/vendor/heroicons/20/solid/bars-3-bottom-left.svg +3 -0
  600. data/vendor/heroicons/20/solid/bars-3-bottom-right.svg +3 -0
  601. data/vendor/heroicons/20/solid/bars-3-center-left.svg +3 -0
  602. data/vendor/heroicons/20/solid/bars-3.svg +3 -0
  603. data/vendor/heroicons/20/solid/bars-4.svg +3 -0
  604. data/vendor/heroicons/20/solid/bars-arrow-down.svg +3 -0
  605. data/vendor/heroicons/20/solid/bars-arrow-up.svg +3 -0
  606. data/vendor/heroicons/20/solid/battery-0.svg +3 -0
  607. data/vendor/heroicons/20/solid/battery-100.svg +4 -0
  608. data/vendor/heroicons/20/solid/battery-50.svg +4 -0
  609. data/vendor/heroicons/20/solid/beaker.svg +3 -0
  610. data/vendor/heroicons/20/solid/bell-alert.svg +4 -0
  611. data/vendor/heroicons/20/solid/bell-slash.svg +3 -0
  612. data/vendor/heroicons/20/solid/bell-snooze.svg +3 -0
  613. data/vendor/heroicons/20/solid/bell.svg +3 -0
  614. data/vendor/heroicons/20/solid/bold.svg +3 -0
  615. data/vendor/heroicons/20/solid/bolt-slash.svg +4 -0
  616. data/vendor/heroicons/20/solid/bolt.svg +3 -0
  617. data/vendor/heroicons/20/solid/book-open.svg +3 -0
  618. data/vendor/heroicons/20/solid/bookmark-slash.svg +3 -0
  619. data/vendor/heroicons/20/solid/bookmark-square.svg +3 -0
  620. data/vendor/heroicons/20/solid/bookmark.svg +3 -0
  621. data/vendor/heroicons/20/solid/briefcase.svg +4 -0
  622. data/vendor/heroicons/20/solid/bug-ant.svg +3 -0
  623. data/vendor/heroicons/20/solid/building-library.svg +3 -0
  624. data/vendor/heroicons/20/solid/building-office-2.svg +3 -0
  625. data/vendor/heroicons/20/solid/building-office.svg +3 -0
  626. data/vendor/heroicons/20/solid/building-storefront.svg +3 -0
  627. data/vendor/heroicons/20/solid/cake.svg +3 -0
  628. data/vendor/heroicons/20/solid/calculator.svg +3 -0
  629. data/vendor/heroicons/20/solid/calendar-date-range.svg +4 -0
  630. data/vendor/heroicons/20/solid/calendar-days.svg +4 -0
  631. data/vendor/heroicons/20/solid/calendar.svg +3 -0
  632. data/vendor/heroicons/20/solid/camera.svg +3 -0
  633. data/vendor/heroicons/20/solid/chart-bar-square.svg +3 -0
  634. data/vendor/heroicons/20/solid/chart-bar.svg +3 -0
  635. data/vendor/heroicons/20/solid/chart-pie.svg +4 -0
  636. data/vendor/heroicons/20/solid/chat-bubble-bottom-center-text.svg +3 -0
  637. data/vendor/heroicons/20/solid/chat-bubble-bottom-center.svg +3 -0
  638. data/vendor/heroicons/20/solid/chat-bubble-left-ellipsis.svg +3 -0
  639. data/vendor/heroicons/20/solid/chat-bubble-left-right.svg +4 -0
  640. data/vendor/heroicons/20/solid/chat-bubble-left.svg +3 -0
  641. data/vendor/heroicons/20/solid/chat-bubble-oval-left-ellipsis.svg +3 -0
  642. data/vendor/heroicons/20/solid/chat-bubble-oval-left.svg +3 -0
  643. data/vendor/heroicons/20/solid/check-badge.svg +3 -0
  644. data/vendor/heroicons/20/solid/check-circle.svg +3 -0
  645. data/vendor/heroicons/20/solid/check.svg +3 -0
  646. data/vendor/heroicons/20/solid/chevron-double-down.svg +3 -0
  647. data/vendor/heroicons/20/solid/chevron-double-left.svg +3 -0
  648. data/vendor/heroicons/20/solid/chevron-double-right.svg +3 -0
  649. data/vendor/heroicons/20/solid/chevron-double-up.svg +3 -0
  650. data/vendor/heroicons/20/solid/chevron-down.svg +3 -0
  651. data/vendor/heroicons/20/solid/chevron-left.svg +3 -0
  652. data/vendor/heroicons/20/solid/chevron-right.svg +3 -0
  653. data/vendor/heroicons/20/solid/chevron-up-down.svg +3 -0
  654. data/vendor/heroicons/20/solid/chevron-up.svg +3 -0
  655. data/vendor/heroicons/20/solid/circle-stack.svg +3 -0
  656. data/vendor/heroicons/20/solid/clipboard-document-check.svg +4 -0
  657. data/vendor/heroicons/20/solid/clipboard-document-list.svg +4 -0
  658. data/vendor/heroicons/20/solid/clipboard-document.svg +4 -0
  659. data/vendor/heroicons/20/solid/clipboard.svg +3 -0
  660. data/vendor/heroicons/20/solid/clock.svg +3 -0
  661. data/vendor/heroicons/20/solid/cloud-arrow-down.svg +3 -0
  662. data/vendor/heroicons/20/solid/cloud-arrow-up.svg +3 -0
  663. data/vendor/heroicons/20/solid/cloud.svg +3 -0
  664. data/vendor/heroicons/20/solid/code-bracket-square.svg +3 -0
  665. data/vendor/heroicons/20/solid/code-bracket.svg +3 -0
  666. data/vendor/heroicons/20/solid/cog-6-tooth.svg +3 -0
  667. data/vendor/heroicons/20/solid/cog-8-tooth.svg +3 -0
  668. data/vendor/heroicons/20/solid/cog.svg +4 -0
  669. data/vendor/heroicons/20/solid/command-line.svg +3 -0
  670. data/vendor/heroicons/20/solid/computer-desktop.svg +3 -0
  671. data/vendor/heroicons/20/solid/cpu-chip.svg +4 -0
  672. data/vendor/heroicons/20/solid/credit-card.svg +3 -0
  673. data/vendor/heroicons/20/solid/cube-transparent.svg +3 -0
  674. data/vendor/heroicons/20/solid/cube.svg +3 -0
  675. data/vendor/heroicons/20/solid/currency-bangladeshi.svg +3 -0
  676. data/vendor/heroicons/20/solid/currency-dollar.svg +4 -0
  677. data/vendor/heroicons/20/solid/currency-euro.svg +3 -0
  678. data/vendor/heroicons/20/solid/currency-pound.svg +3 -0
  679. data/vendor/heroicons/20/solid/currency-rupee.svg +3 -0
  680. data/vendor/heroicons/20/solid/currency-yen.svg +3 -0
  681. data/vendor/heroicons/20/solid/cursor-arrow-rays.svg +3 -0
  682. data/vendor/heroicons/20/solid/cursor-arrow-ripple.svg +5 -0
  683. data/vendor/heroicons/20/solid/device-phone-mobile.svg +4 -0
  684. data/vendor/heroicons/20/solid/device-tablet.svg +3 -0
  685. data/vendor/heroicons/20/solid/divide.svg +3 -0
  686. data/vendor/heroicons/20/solid/document-arrow-down.svg +3 -0
  687. data/vendor/heroicons/20/solid/document-arrow-up.svg +3 -0
  688. data/vendor/heroicons/20/solid/document-chart-bar.svg +3 -0
  689. data/vendor/heroicons/20/solid/document-check.svg +3 -0
  690. data/vendor/heroicons/20/solid/document-currency-bangladeshi.svg +3 -0
  691. data/vendor/heroicons/20/solid/document-currency-dollar.svg +3 -0
  692. data/vendor/heroicons/20/solid/document-currency-euro.svg +3 -0
  693. data/vendor/heroicons/20/solid/document-currency-pound.svg +3 -0
  694. data/vendor/heroicons/20/solid/document-currency-rupee.svg +3 -0
  695. data/vendor/heroicons/20/solid/document-currency-yen.svg +3 -0
  696. data/vendor/heroicons/20/solid/document-duplicate.svg +4 -0
  697. data/vendor/heroicons/20/solid/document-magnifying-glass.svg +4 -0
  698. data/vendor/heroicons/20/solid/document-minus.svg +3 -0
  699. data/vendor/heroicons/20/solid/document-plus.svg +3 -0
  700. data/vendor/heroicons/20/solid/document-text.svg +3 -0
  701. data/vendor/heroicons/20/solid/document.svg +3 -0
  702. data/vendor/heroicons/20/solid/ellipsis-horizontal-circle.svg +3 -0
  703. data/vendor/heroicons/20/solid/ellipsis-horizontal.svg +3 -0
  704. data/vendor/heroicons/20/solid/ellipsis-vertical.svg +3 -0
  705. data/vendor/heroicons/20/solid/envelope-open.svg +3 -0
  706. data/vendor/heroicons/20/solid/envelope.svg +4 -0
  707. data/vendor/heroicons/20/solid/equals.svg +3 -0
  708. data/vendor/heroicons/20/solid/exclamation-circle.svg +3 -0
  709. data/vendor/heroicons/20/solid/exclamation-triangle.svg +3 -0
  710. data/vendor/heroicons/20/solid/eye-dropper.svg +3 -0
  711. data/vendor/heroicons/20/solid/eye-slash.svg +4 -0
  712. data/vendor/heroicons/20/solid/eye.svg +4 -0
  713. data/vendor/heroicons/20/solid/face-frown.svg +3 -0
  714. data/vendor/heroicons/20/solid/face-smile.svg +3 -0
  715. data/vendor/heroicons/20/solid/film.svg +3 -0
  716. data/vendor/heroicons/20/solid/finger-print.svg +3 -0
  717. data/vendor/heroicons/20/solid/fire.svg +3 -0
  718. data/vendor/heroicons/20/solid/flag.svg +3 -0
  719. data/vendor/heroicons/20/solid/folder-arrow-down.svg +3 -0
  720. data/vendor/heroicons/20/solid/folder-minus.svg +3 -0
  721. data/vendor/heroicons/20/solid/folder-open.svg +3 -0
  722. data/vendor/heroicons/20/solid/folder-plus.svg +3 -0
  723. data/vendor/heroicons/20/solid/folder.svg +3 -0
  724. data/vendor/heroicons/20/solid/forward.svg +3 -0
  725. data/vendor/heroicons/20/solid/funnel.svg +3 -0
  726. data/vendor/heroicons/20/solid/gif.svg +3 -0
  727. data/vendor/heroicons/20/solid/gift-top.svg +3 -0
  728. data/vendor/heroicons/20/solid/gift.svg +4 -0
  729. data/vendor/heroicons/20/solid/globe-alt.svg +3 -0
  730. data/vendor/heroicons/20/solid/globe-americas.svg +3 -0
  731. data/vendor/heroicons/20/solid/globe-asia-australia.svg +3 -0
  732. data/vendor/heroicons/20/solid/globe-europe-africa.svg +3 -0
  733. data/vendor/heroicons/20/solid/h1.svg +3 -0
  734. data/vendor/heroicons/20/solid/h2.svg +3 -0
  735. data/vendor/heroicons/20/solid/h3.svg +3 -0
  736. data/vendor/heroicons/20/solid/hand-raised.svg +3 -0
  737. data/vendor/heroicons/20/solid/hand-thumb-down.svg +3 -0
  738. data/vendor/heroicons/20/solid/hand-thumb-up.svg +3 -0
  739. data/vendor/heroicons/20/solid/hashtag.svg +3 -0
  740. data/vendor/heroicons/20/solid/heart.svg +3 -0
  741. data/vendor/heroicons/20/solid/home-modern.svg +3 -0
  742. data/vendor/heroicons/20/solid/home.svg +3 -0
  743. data/vendor/heroicons/20/solid/identification.svg +3 -0
  744. data/vendor/heroicons/20/solid/inbox-arrow-down.svg +4 -0
  745. data/vendor/heroicons/20/solid/inbox-stack.svg +4 -0
  746. data/vendor/heroicons/20/solid/inbox.svg +3 -0
  747. data/vendor/heroicons/20/solid/information-circle.svg +3 -0
  748. data/vendor/heroicons/20/solid/italic.svg +3 -0
  749. data/vendor/heroicons/20/solid/key.svg +3 -0
  750. data/vendor/heroicons/20/solid/language.svg +4 -0
  751. data/vendor/heroicons/20/solid/lifebuoy.svg +3 -0
  752. data/vendor/heroicons/20/solid/light-bulb.svg +3 -0
  753. data/vendor/heroicons/20/solid/link-slash.svg +3 -0
  754. data/vendor/heroicons/20/solid/link.svg +4 -0
  755. data/vendor/heroicons/20/solid/list-bullet.svg +3 -0
  756. data/vendor/heroicons/20/solid/lock-closed.svg +3 -0
  757. data/vendor/heroicons/20/solid/lock-open.svg +3 -0
  758. data/vendor/heroicons/20/solid/magnifying-glass-circle.svg +4 -0
  759. data/vendor/heroicons/20/solid/magnifying-glass-minus.svg +4 -0
  760. data/vendor/heroicons/20/solid/magnifying-glass-plus.svg +4 -0
  761. data/vendor/heroicons/20/solid/magnifying-glass.svg +3 -0
  762. data/vendor/heroicons/20/solid/map-pin.svg +3 -0
  763. data/vendor/heroicons/20/solid/map.svg +3 -0
  764. data/vendor/heroicons/20/solid/megaphone.svg +3 -0
  765. data/vendor/heroicons/20/solid/microphone.svg +4 -0
  766. data/vendor/heroicons/20/solid/minus-circle.svg +3 -0
  767. data/vendor/heroicons/20/solid/minus-small.svg +3 -0
  768. data/vendor/heroicons/20/solid/minus.svg +3 -0
  769. data/vendor/heroicons/20/solid/moon.svg +3 -0
  770. data/vendor/heroicons/20/solid/musical-note.svg +3 -0
  771. data/vendor/heroicons/20/solid/newspaper.svg +4 -0
  772. data/vendor/heroicons/20/solid/no-symbol.svg +3 -0
  773. data/vendor/heroicons/20/solid/numbered-list.svg +3 -0
  774. data/vendor/heroicons/20/solid/paint-brush.svg +3 -0
  775. data/vendor/heroicons/20/solid/paper-airplane.svg +3 -0
  776. data/vendor/heroicons/20/solid/paper-clip.svg +3 -0
  777. data/vendor/heroicons/20/solid/pause-circle.svg +3 -0
  778. data/vendor/heroicons/20/solid/pause.svg +3 -0
  779. data/vendor/heroicons/20/solid/pencil-square.svg +4 -0
  780. data/vendor/heroicons/20/solid/pencil.svg +3 -0
  781. data/vendor/heroicons/20/solid/percent-badge.svg +3 -0
  782. data/vendor/heroicons/20/solid/phone-arrow-down-left.svg +3 -0
  783. data/vendor/heroicons/20/solid/phone-arrow-up-right.svg +3 -0
  784. data/vendor/heroicons/20/solid/phone-x-mark.svg +3 -0
  785. data/vendor/heroicons/20/solid/phone.svg +3 -0
  786. data/vendor/heroicons/20/solid/photo.svg +3 -0
  787. data/vendor/heroicons/20/solid/play-circle.svg +3 -0
  788. data/vendor/heroicons/20/solid/play-pause.svg +3 -0
  789. data/vendor/heroicons/20/solid/play.svg +3 -0
  790. data/vendor/heroicons/20/solid/plus-circle.svg +3 -0
  791. data/vendor/heroicons/20/solid/plus-small.svg +3 -0
  792. data/vendor/heroicons/20/solid/plus.svg +3 -0
  793. data/vendor/heroicons/20/solid/power.svg +3 -0
  794. data/vendor/heroicons/20/solid/presentation-chart-bar.svg +3 -0
  795. data/vendor/heroicons/20/solid/presentation-chart-line.svg +3 -0
  796. data/vendor/heroicons/20/solid/printer.svg +3 -0
  797. data/vendor/heroicons/20/solid/puzzle-piece.svg +3 -0
  798. data/vendor/heroicons/20/solid/qr-code.svg +3 -0
  799. data/vendor/heroicons/20/solid/question-mark-circle.svg +3 -0
  800. data/vendor/heroicons/20/solid/queue-list.svg +3 -0
  801. data/vendor/heroicons/20/solid/radio.svg +3 -0
  802. data/vendor/heroicons/20/solid/receipt-percent.svg +3 -0
  803. data/vendor/heroicons/20/solid/receipt-refund.svg +3 -0
  804. data/vendor/heroicons/20/solid/rectangle-group.svg +3 -0
  805. data/vendor/heroicons/20/solid/rectangle-stack.svg +3 -0
  806. data/vendor/heroicons/20/solid/rocket-launch.svg +4 -0
  807. data/vendor/heroicons/20/solid/rss.svg +4 -0
  808. data/vendor/heroicons/20/solid/scale.svg +3 -0
  809. data/vendor/heroicons/20/solid/scissors.svg +4 -0
  810. data/vendor/heroicons/20/solid/server-stack.svg +4 -0
  811. data/vendor/heroicons/20/solid/server.svg +4 -0
  812. data/vendor/heroicons/20/solid/share.svg +3 -0
  813. data/vendor/heroicons/20/solid/shield-check.svg +3 -0
  814. data/vendor/heroicons/20/solid/shield-exclamation.svg +3 -0
  815. data/vendor/heroicons/20/solid/shopping-bag.svg +3 -0
  816. data/vendor/heroicons/20/solid/shopping-cart.svg +3 -0
  817. data/vendor/heroicons/20/solid/signal-slash.svg +3 -0
  818. data/vendor/heroicons/20/solid/signal.svg +4 -0
  819. data/vendor/heroicons/20/solid/slash.svg +3 -0
  820. data/vendor/heroicons/20/solid/sparkles.svg +3 -0
  821. data/vendor/heroicons/20/solid/speaker-wave.svg +4 -0
  822. data/vendor/heroicons/20/solid/speaker-x-mark.svg +3 -0
  823. data/vendor/heroicons/20/solid/square-2-stack.svg +4 -0
  824. data/vendor/heroicons/20/solid/square-3-stack-3d.svg +5 -0
  825. data/vendor/heroicons/20/solid/squares-2x2.svg +3 -0
  826. data/vendor/heroicons/20/solid/squares-plus.svg +3 -0
  827. data/vendor/heroicons/20/solid/star.svg +3 -0
  828. data/vendor/heroicons/20/solid/stop-circle.svg +3 -0
  829. data/vendor/heroicons/20/solid/stop.svg +3 -0
  830. data/vendor/heroicons/20/solid/strikethrough.svg +3 -0
  831. data/vendor/heroicons/20/solid/sun.svg +3 -0
  832. data/vendor/heroicons/20/solid/swatch.svg +3 -0
  833. data/vendor/heroicons/20/solid/table-cells.svg +3 -0
  834. data/vendor/heroicons/20/solid/tag.svg +3 -0
  835. data/vendor/heroicons/20/solid/ticket.svg +3 -0
  836. data/vendor/heroicons/20/solid/trash.svg +3 -0
  837. data/vendor/heroicons/20/solid/trophy.svg +3 -0
  838. data/vendor/heroicons/20/solid/truck.svg +4 -0
  839. data/vendor/heroicons/20/solid/tv.svg +4 -0
  840. data/vendor/heroicons/20/solid/underline.svg +3 -0
  841. data/vendor/heroicons/20/solid/user-circle.svg +3 -0
  842. data/vendor/heroicons/20/solid/user-group.svg +3 -0
  843. data/vendor/heroicons/20/solid/user-minus.svg +3 -0
  844. data/vendor/heroicons/20/solid/user-plus.svg +3 -0
  845. data/vendor/heroicons/20/solid/user.svg +3 -0
  846. data/vendor/heroicons/20/solid/users.svg +3 -0
  847. data/vendor/heroicons/20/solid/variable.svg +3 -0
  848. data/vendor/heroicons/20/solid/video-camera-slash.svg +3 -0
  849. data/vendor/heroicons/20/solid/video-camera.svg +3 -0
  850. data/vendor/heroicons/20/solid/view-columns.svg +3 -0
  851. data/vendor/heroicons/20/solid/viewfinder-circle.svg +3 -0
  852. data/vendor/heroicons/20/solid/wallet.svg +3 -0
  853. data/vendor/heroicons/20/solid/wifi.svg +3 -0
  854. data/vendor/heroicons/20/solid/window.svg +3 -0
  855. data/vendor/heroicons/20/solid/wrench-screwdriver.svg +4 -0
  856. data/vendor/heroicons/20/solid/wrench.svg +3 -0
  857. data/vendor/heroicons/20/solid/x-circle.svg +3 -0
  858. data/vendor/heroicons/20/solid/x-mark.svg +3 -0
  859. data/vendor/heroicons/24/outline/academic-cap.svg +3 -0
  860. data/vendor/heroicons/24/outline/adjustments-horizontal.svg +3 -0
  861. data/vendor/heroicons/24/outline/adjustments-vertical.svg +3 -0
  862. data/vendor/heroicons/24/outline/archive-box-arrow-down.svg +3 -0
  863. data/vendor/heroicons/24/outline/archive-box-x-mark.svg +3 -0
  864. data/vendor/heroicons/24/outline/archive-box.svg +3 -0
  865. data/vendor/heroicons/24/outline/arrow-down-circle.svg +3 -0
  866. data/vendor/heroicons/24/outline/arrow-down-left.svg +3 -0
  867. data/vendor/heroicons/24/outline/arrow-down-on-square-stack.svg +3 -0
  868. data/vendor/heroicons/24/outline/arrow-down-on-square.svg +3 -0
  869. data/vendor/heroicons/24/outline/arrow-down-right.svg +3 -0
  870. data/vendor/heroicons/24/outline/arrow-down-tray.svg +3 -0
  871. data/vendor/heroicons/24/outline/arrow-down.svg +3 -0
  872. data/vendor/heroicons/24/outline/arrow-left-circle.svg +3 -0
  873. data/vendor/heroicons/24/outline/arrow-left-end-on-rectangle.svg +3 -0
  874. data/vendor/heroicons/24/outline/arrow-left-on-rectangle.svg +3 -0
  875. data/vendor/heroicons/24/outline/arrow-left-start-on-rectangle.svg +3 -0
  876. data/vendor/heroicons/24/outline/arrow-left.svg +3 -0
  877. data/vendor/heroicons/24/outline/arrow-long-down.svg +3 -0
  878. data/vendor/heroicons/24/outline/arrow-long-left.svg +3 -0
  879. data/vendor/heroicons/24/outline/arrow-long-right.svg +3 -0
  880. data/vendor/heroicons/24/outline/arrow-long-up.svg +3 -0
  881. data/vendor/heroicons/24/outline/arrow-path-rounded-square.svg +3 -0
  882. data/vendor/heroicons/24/outline/arrow-path.svg +3 -0
  883. data/vendor/heroicons/24/outline/arrow-right-circle.svg +3 -0
  884. data/vendor/heroicons/24/outline/arrow-right-end-on-rectangle.svg +3 -0
  885. data/vendor/heroicons/24/outline/arrow-right-on-rectangle.svg +3 -0
  886. data/vendor/heroicons/24/outline/arrow-right-start-on-rectangle.svg +3 -0
  887. data/vendor/heroicons/24/outline/arrow-right.svg +3 -0
  888. data/vendor/heroicons/24/outline/arrow-small-down.svg +3 -0
  889. data/vendor/heroicons/24/outline/arrow-small-left.svg +3 -0
  890. data/vendor/heroicons/24/outline/arrow-small-right.svg +3 -0
  891. data/vendor/heroicons/24/outline/arrow-small-up.svg +3 -0
  892. data/vendor/heroicons/24/outline/arrow-top-right-on-square.svg +3 -0
  893. data/vendor/heroicons/24/outline/arrow-trending-down.svg +3 -0
  894. data/vendor/heroicons/24/outline/arrow-trending-up.svg +3 -0
  895. data/vendor/heroicons/24/outline/arrow-turn-down-left.svg +3 -0
  896. data/vendor/heroicons/24/outline/arrow-turn-down-right.svg +3 -0
  897. data/vendor/heroicons/24/outline/arrow-turn-left-down.svg +3 -0
  898. data/vendor/heroicons/24/outline/arrow-turn-left-up.svg +3 -0
  899. data/vendor/heroicons/24/outline/arrow-turn-right-down.svg +3 -0
  900. data/vendor/heroicons/24/outline/arrow-turn-right-up.svg +3 -0
  901. data/vendor/heroicons/24/outline/arrow-turn-up-left.svg +3 -0
  902. data/vendor/heroicons/24/outline/arrow-turn-up-right.svg +3 -0
  903. data/vendor/heroicons/24/outline/arrow-up-circle.svg +3 -0
  904. data/vendor/heroicons/24/outline/arrow-up-left.svg +3 -0
  905. data/vendor/heroicons/24/outline/arrow-up-on-square-stack.svg +3 -0
  906. data/vendor/heroicons/24/outline/arrow-up-on-square.svg +3 -0
  907. data/vendor/heroicons/24/outline/arrow-up-right.svg +3 -0
  908. data/vendor/heroicons/24/outline/arrow-up-tray.svg +3 -0
  909. data/vendor/heroicons/24/outline/arrow-up.svg +3 -0
  910. data/vendor/heroicons/24/outline/arrow-uturn-down.svg +3 -0
  911. data/vendor/heroicons/24/outline/arrow-uturn-left.svg +3 -0
  912. data/vendor/heroicons/24/outline/arrow-uturn-right.svg +3 -0
  913. data/vendor/heroicons/24/outline/arrow-uturn-up.svg +3 -0
  914. data/vendor/heroicons/24/outline/arrows-pointing-in.svg +3 -0
  915. data/vendor/heroicons/24/outline/arrows-pointing-out.svg +3 -0
  916. data/vendor/heroicons/24/outline/arrows-right-left.svg +3 -0
  917. data/vendor/heroicons/24/outline/arrows-up-down.svg +3 -0
  918. data/vendor/heroicons/24/outline/at-symbol.svg +3 -0
  919. data/vendor/heroicons/24/outline/backspace.svg +3 -0
  920. data/vendor/heroicons/24/outline/backward.svg +3 -0
  921. data/vendor/heroicons/24/outline/banknotes.svg +3 -0
  922. data/vendor/heroicons/24/outline/bars-2.svg +3 -0
  923. data/vendor/heroicons/24/outline/bars-3-bottom-left.svg +3 -0
  924. data/vendor/heroicons/24/outline/bars-3-bottom-right.svg +3 -0
  925. data/vendor/heroicons/24/outline/bars-3-center-left.svg +3 -0
  926. data/vendor/heroicons/24/outline/bars-3.svg +3 -0
  927. data/vendor/heroicons/24/outline/bars-4.svg +3 -0
  928. data/vendor/heroicons/24/outline/bars-arrow-down.svg +3 -0
  929. data/vendor/heroicons/24/outline/bars-arrow-up.svg +3 -0
  930. data/vendor/heroicons/24/outline/battery-0.svg +3 -0
  931. data/vendor/heroicons/24/outline/battery-100.svg +3 -0
  932. data/vendor/heroicons/24/outline/battery-50.svg +3 -0
  933. data/vendor/heroicons/24/outline/beaker.svg +3 -0
  934. data/vendor/heroicons/24/outline/bell-alert.svg +3 -0
  935. data/vendor/heroicons/24/outline/bell-slash.svg +3 -0
  936. data/vendor/heroicons/24/outline/bell-snooze.svg +3 -0
  937. data/vendor/heroicons/24/outline/bell.svg +3 -0
  938. data/vendor/heroicons/24/outline/bold.svg +3 -0
  939. data/vendor/heroicons/24/outline/bolt-slash.svg +3 -0
  940. data/vendor/heroicons/24/outline/bolt.svg +3 -0
  941. data/vendor/heroicons/24/outline/book-open.svg +3 -0
  942. data/vendor/heroicons/24/outline/bookmark-slash.svg +3 -0
  943. data/vendor/heroicons/24/outline/bookmark-square.svg +3 -0
  944. data/vendor/heroicons/24/outline/bookmark.svg +3 -0
  945. data/vendor/heroicons/24/outline/briefcase.svg +3 -0
  946. data/vendor/heroicons/24/outline/bug-ant.svg +3 -0
  947. data/vendor/heroicons/24/outline/building-library.svg +3 -0
  948. data/vendor/heroicons/24/outline/building-office-2.svg +3 -0
  949. data/vendor/heroicons/24/outline/building-office.svg +3 -0
  950. data/vendor/heroicons/24/outline/building-storefront.svg +3 -0
  951. data/vendor/heroicons/24/outline/cake.svg +3 -0
  952. data/vendor/heroicons/24/outline/calculator.svg +3 -0
  953. data/vendor/heroicons/24/outline/calendar-date-range.svg +3 -0
  954. data/vendor/heroicons/24/outline/calendar-days.svg +3 -0
  955. data/vendor/heroicons/24/outline/calendar.svg +3 -0
  956. data/vendor/heroicons/24/outline/camera.svg +4 -0
  957. data/vendor/heroicons/24/outline/chart-bar-square.svg +3 -0
  958. data/vendor/heroicons/24/outline/chart-bar.svg +3 -0
  959. data/vendor/heroicons/24/outline/chart-pie.svg +4 -0
  960. data/vendor/heroicons/24/outline/chat-bubble-bottom-center-text.svg +3 -0
  961. data/vendor/heroicons/24/outline/chat-bubble-bottom-center.svg +3 -0
  962. data/vendor/heroicons/24/outline/chat-bubble-left-ellipsis.svg +3 -0
  963. data/vendor/heroicons/24/outline/chat-bubble-left-right.svg +3 -0
  964. data/vendor/heroicons/24/outline/chat-bubble-left.svg +3 -0
  965. data/vendor/heroicons/24/outline/chat-bubble-oval-left-ellipsis.svg +3 -0
  966. data/vendor/heroicons/24/outline/chat-bubble-oval-left.svg +3 -0
  967. data/vendor/heroicons/24/outline/check-badge.svg +3 -0
  968. data/vendor/heroicons/24/outline/check-circle.svg +3 -0
  969. data/vendor/heroicons/24/outline/check.svg +3 -0
  970. data/vendor/heroicons/24/outline/chevron-double-down.svg +3 -0
  971. data/vendor/heroicons/24/outline/chevron-double-left.svg +3 -0
  972. data/vendor/heroicons/24/outline/chevron-double-right.svg +3 -0
  973. data/vendor/heroicons/24/outline/chevron-double-up.svg +4 -0
  974. data/vendor/heroicons/24/outline/chevron-down.svg +3 -0
  975. data/vendor/heroicons/24/outline/chevron-left.svg +3 -0
  976. data/vendor/heroicons/24/outline/chevron-right.svg +3 -0
  977. data/vendor/heroicons/24/outline/chevron-up-down.svg +3 -0
  978. data/vendor/heroicons/24/outline/chevron-up.svg +3 -0
  979. data/vendor/heroicons/24/outline/circle-stack.svg +3 -0
  980. data/vendor/heroicons/24/outline/clipboard-document-check.svg +3 -0
  981. data/vendor/heroicons/24/outline/clipboard-document-list.svg +3 -0
  982. data/vendor/heroicons/24/outline/clipboard-document.svg +3 -0
  983. data/vendor/heroicons/24/outline/clipboard.svg +3 -0
  984. data/vendor/heroicons/24/outline/clock.svg +3 -0
  985. data/vendor/heroicons/24/outline/cloud-arrow-down.svg +3 -0
  986. data/vendor/heroicons/24/outline/cloud-arrow-up.svg +3 -0
  987. data/vendor/heroicons/24/outline/cloud.svg +3 -0
  988. data/vendor/heroicons/24/outline/code-bracket-square.svg +3 -0
  989. data/vendor/heroicons/24/outline/code-bracket.svg +3 -0
  990. data/vendor/heroicons/24/outline/cog-6-tooth.svg +4 -0
  991. data/vendor/heroicons/24/outline/cog-8-tooth.svg +4 -0
  992. data/vendor/heroicons/24/outline/cog.svg +3 -0
  993. data/vendor/heroicons/24/outline/command-line.svg +3 -0
  994. data/vendor/heroicons/24/outline/computer-desktop.svg +3 -0
  995. data/vendor/heroicons/24/outline/cpu-chip.svg +3 -0
  996. data/vendor/heroicons/24/outline/credit-card.svg +3 -0
  997. data/vendor/heroicons/24/outline/cube-transparent.svg +3 -0
  998. data/vendor/heroicons/24/outline/cube.svg +3 -0
  999. data/vendor/heroicons/24/outline/currency-bangladeshi.svg +3 -0
  1000. data/vendor/heroicons/24/outline/currency-dollar.svg +3 -0
  1001. data/vendor/heroicons/24/outline/currency-euro.svg +3 -0
  1002. data/vendor/heroicons/24/outline/currency-pound.svg +3 -0
  1003. data/vendor/heroicons/24/outline/currency-rupee.svg +3 -0
  1004. data/vendor/heroicons/24/outline/currency-yen.svg +3 -0
  1005. data/vendor/heroicons/24/outline/cursor-arrow-rays.svg +3 -0
  1006. data/vendor/heroicons/24/outline/cursor-arrow-ripple.svg +3 -0
  1007. data/vendor/heroicons/24/outline/device-phone-mobile.svg +3 -0
  1008. data/vendor/heroicons/24/outline/device-tablet.svg +3 -0
  1009. data/vendor/heroicons/24/outline/divide.svg +3 -0
  1010. data/vendor/heroicons/24/outline/document-arrow-down.svg +3 -0
  1011. data/vendor/heroicons/24/outline/document-arrow-up.svg +3 -0
  1012. data/vendor/heroicons/24/outline/document-chart-bar.svg +3 -0
  1013. data/vendor/heroicons/24/outline/document-check.svg +3 -0
  1014. data/vendor/heroicons/24/outline/document-currency-bangladeshi.svg +3 -0
  1015. data/vendor/heroicons/24/outline/document-currency-dollar.svg +3 -0
  1016. data/vendor/heroicons/24/outline/document-currency-euro.svg +3 -0
  1017. data/vendor/heroicons/24/outline/document-currency-pound.svg +3 -0
  1018. data/vendor/heroicons/24/outline/document-currency-rupee.svg +3 -0
  1019. data/vendor/heroicons/24/outline/document-currency-yen.svg +3 -0
  1020. data/vendor/heroicons/24/outline/document-duplicate.svg +3 -0
  1021. data/vendor/heroicons/24/outline/document-magnifying-glass.svg +3 -0
  1022. data/vendor/heroicons/24/outline/document-minus.svg +3 -0
  1023. data/vendor/heroicons/24/outline/document-plus.svg +3 -0
  1024. data/vendor/heroicons/24/outline/document-text.svg +3 -0
  1025. data/vendor/heroicons/24/outline/document.svg +3 -0
  1026. data/vendor/heroicons/24/outline/ellipsis-horizontal-circle.svg +3 -0
  1027. data/vendor/heroicons/24/outline/ellipsis-horizontal.svg +3 -0
  1028. data/vendor/heroicons/24/outline/ellipsis-vertical.svg +3 -0
  1029. data/vendor/heroicons/24/outline/envelope-open.svg +3 -0
  1030. data/vendor/heroicons/24/outline/envelope.svg +3 -0
  1031. data/vendor/heroicons/24/outline/equals.svg +3 -0
  1032. data/vendor/heroicons/24/outline/exclamation-circle.svg +3 -0
  1033. data/vendor/heroicons/24/outline/exclamation-triangle.svg +3 -0
  1034. data/vendor/heroicons/24/outline/eye-dropper.svg +3 -0
  1035. data/vendor/heroicons/24/outline/eye-slash.svg +3 -0
  1036. data/vendor/heroicons/24/outline/eye.svg +4 -0
  1037. data/vendor/heroicons/24/outline/face-frown.svg +3 -0
  1038. data/vendor/heroicons/24/outline/face-smile.svg +3 -0
  1039. data/vendor/heroicons/24/outline/film.svg +3 -0
  1040. data/vendor/heroicons/24/outline/finger-print.svg +3 -0
  1041. data/vendor/heroicons/24/outline/fire.svg +4 -0
  1042. data/vendor/heroicons/24/outline/flag.svg +3 -0
  1043. data/vendor/heroicons/24/outline/folder-arrow-down.svg +3 -0
  1044. data/vendor/heroicons/24/outline/folder-minus.svg +3 -0
  1045. data/vendor/heroicons/24/outline/folder-open.svg +3 -0
  1046. data/vendor/heroicons/24/outline/folder-plus.svg +3 -0
  1047. data/vendor/heroicons/24/outline/folder.svg +3 -0
  1048. data/vendor/heroicons/24/outline/forward.svg +3 -0
  1049. data/vendor/heroicons/24/outline/funnel.svg +3 -0
  1050. data/vendor/heroicons/24/outline/gif.svg +3 -0
  1051. data/vendor/heroicons/24/outline/gift-top.svg +3 -0
  1052. data/vendor/heroicons/24/outline/gift.svg +3 -0
  1053. data/vendor/heroicons/24/outline/globe-alt.svg +3 -0
  1054. data/vendor/heroicons/24/outline/globe-americas.svg +3 -0
  1055. data/vendor/heroicons/24/outline/globe-asia-australia.svg +3 -0
  1056. data/vendor/heroicons/24/outline/globe-europe-africa.svg +3 -0
  1057. data/vendor/heroicons/24/outline/h1.svg +3 -0
  1058. data/vendor/heroicons/24/outline/h2.svg +3 -0
  1059. data/vendor/heroicons/24/outline/h3.svg +3 -0
  1060. data/vendor/heroicons/24/outline/hand-raised.svg +3 -0
  1061. data/vendor/heroicons/24/outline/hand-thumb-down.svg +3 -0
  1062. data/vendor/heroicons/24/outline/hand-thumb-up.svg +3 -0
  1063. data/vendor/heroicons/24/outline/hashtag.svg +3 -0
  1064. data/vendor/heroicons/24/outline/heart.svg +3 -0
  1065. data/vendor/heroicons/24/outline/home-modern.svg +3 -0
  1066. data/vendor/heroicons/24/outline/home.svg +3 -0
  1067. data/vendor/heroicons/24/outline/identification.svg +3 -0
  1068. data/vendor/heroicons/24/outline/inbox-arrow-down.svg +3 -0
  1069. data/vendor/heroicons/24/outline/inbox-stack.svg +3 -0
  1070. data/vendor/heroicons/24/outline/inbox.svg +3 -0
  1071. data/vendor/heroicons/24/outline/information-circle.svg +3 -0
  1072. data/vendor/heroicons/24/outline/italic.svg +3 -0
  1073. data/vendor/heroicons/24/outline/key.svg +3 -0
  1074. data/vendor/heroicons/24/outline/language.svg +3 -0
  1075. data/vendor/heroicons/24/outline/lifebuoy.svg +3 -0
  1076. data/vendor/heroicons/24/outline/light-bulb.svg +3 -0
  1077. data/vendor/heroicons/24/outline/link-slash.svg +3 -0
  1078. data/vendor/heroicons/24/outline/link.svg +3 -0
  1079. data/vendor/heroicons/24/outline/list-bullet.svg +3 -0
  1080. data/vendor/heroicons/24/outline/lock-closed.svg +3 -0
  1081. data/vendor/heroicons/24/outline/lock-open.svg +3 -0
  1082. data/vendor/heroicons/24/outline/magnifying-glass-circle.svg +3 -0
  1083. data/vendor/heroicons/24/outline/magnifying-glass-minus.svg +3 -0
  1084. data/vendor/heroicons/24/outline/magnifying-glass-plus.svg +3 -0
  1085. data/vendor/heroicons/24/outline/magnifying-glass.svg +3 -0
  1086. data/vendor/heroicons/24/outline/map-pin.svg +4 -0
  1087. data/vendor/heroicons/24/outline/map.svg +3 -0
  1088. data/vendor/heroicons/24/outline/megaphone.svg +3 -0
  1089. data/vendor/heroicons/24/outline/microphone.svg +3 -0
  1090. data/vendor/heroicons/24/outline/minus-circle.svg +3 -0
  1091. data/vendor/heroicons/24/outline/minus-small.svg +3 -0
  1092. data/vendor/heroicons/24/outline/minus.svg +3 -0
  1093. data/vendor/heroicons/24/outline/moon.svg +3 -0
  1094. data/vendor/heroicons/24/outline/musical-note.svg +3 -0
  1095. data/vendor/heroicons/24/outline/newspaper.svg +3 -0
  1096. data/vendor/heroicons/24/outline/no-symbol.svg +3 -0
  1097. data/vendor/heroicons/24/outline/numbered-list.svg +3 -0
  1098. data/vendor/heroicons/24/outline/paint-brush.svg +3 -0
  1099. data/vendor/heroicons/24/outline/paper-airplane.svg +3 -0
  1100. data/vendor/heroicons/24/outline/paper-clip.svg +3 -0
  1101. data/vendor/heroicons/24/outline/pause-circle.svg +3 -0
  1102. data/vendor/heroicons/24/outline/pause.svg +3 -0
  1103. data/vendor/heroicons/24/outline/pencil-square.svg +3 -0
  1104. data/vendor/heroicons/24/outline/pencil.svg +3 -0
  1105. data/vendor/heroicons/24/outline/percent-badge.svg +3 -0
  1106. data/vendor/heroicons/24/outline/phone-arrow-down-left.svg +3 -0
  1107. data/vendor/heroicons/24/outline/phone-arrow-up-right.svg +3 -0
  1108. data/vendor/heroicons/24/outline/phone-x-mark.svg +3 -0
  1109. data/vendor/heroicons/24/outline/phone.svg +3 -0
  1110. data/vendor/heroicons/24/outline/photo.svg +3 -0
  1111. data/vendor/heroicons/24/outline/play-circle.svg +4 -0
  1112. data/vendor/heroicons/24/outline/play-pause.svg +3 -0
  1113. data/vendor/heroicons/24/outline/play.svg +3 -0
  1114. data/vendor/heroicons/24/outline/plus-circle.svg +3 -0
  1115. data/vendor/heroicons/24/outline/plus-small.svg +3 -0
  1116. data/vendor/heroicons/24/outline/plus.svg +3 -0
  1117. data/vendor/heroicons/24/outline/power.svg +3 -0
  1118. data/vendor/heroicons/24/outline/presentation-chart-bar.svg +3 -0
  1119. data/vendor/heroicons/24/outline/presentation-chart-line.svg +3 -0
  1120. data/vendor/heroicons/24/outline/printer.svg +3 -0
  1121. data/vendor/heroicons/24/outline/puzzle-piece.svg +3 -0
  1122. data/vendor/heroicons/24/outline/qr-code.svg +4 -0
  1123. data/vendor/heroicons/24/outline/question-mark-circle.svg +3 -0
  1124. data/vendor/heroicons/24/outline/queue-list.svg +3 -0
  1125. data/vendor/heroicons/24/outline/radio.svg +3 -0
  1126. data/vendor/heroicons/24/outline/receipt-percent.svg +3 -0
  1127. data/vendor/heroicons/24/outline/receipt-refund.svg +3 -0
  1128. data/vendor/heroicons/24/outline/rectangle-group.svg +3 -0
  1129. data/vendor/heroicons/24/outline/rectangle-stack.svg +3 -0
  1130. data/vendor/heroicons/24/outline/rocket-launch.svg +3 -0
  1131. data/vendor/heroicons/24/outline/rss.svg +3 -0
  1132. data/vendor/heroicons/24/outline/scale.svg +3 -0
  1133. data/vendor/heroicons/24/outline/scissors.svg +3 -0
  1134. data/vendor/heroicons/24/outline/server-stack.svg +3 -0
  1135. data/vendor/heroicons/24/outline/server.svg +3 -0
  1136. data/vendor/heroicons/24/outline/share.svg +3 -0
  1137. data/vendor/heroicons/24/outline/shield-check.svg +3 -0
  1138. data/vendor/heroicons/24/outline/shield-exclamation.svg +3 -0
  1139. data/vendor/heroicons/24/outline/shopping-bag.svg +3 -0
  1140. data/vendor/heroicons/24/outline/shopping-cart.svg +3 -0
  1141. data/vendor/heroicons/24/outline/signal-slash.svg +3 -0
  1142. data/vendor/heroicons/24/outline/signal.svg +3 -0
  1143. data/vendor/heroicons/24/outline/slash.svg +3 -0
  1144. data/vendor/heroicons/24/outline/sparkles.svg +3 -0
  1145. data/vendor/heroicons/24/outline/speaker-wave.svg +3 -0
  1146. data/vendor/heroicons/24/outline/speaker-x-mark.svg +3 -0
  1147. data/vendor/heroicons/24/outline/square-2-stack.svg +3 -0
  1148. data/vendor/heroicons/24/outline/square-3-stack-3d.svg +3 -0
  1149. data/vendor/heroicons/24/outline/squares-2x2.svg +3 -0
  1150. data/vendor/heroicons/24/outline/squares-plus.svg +3 -0
  1151. data/vendor/heroicons/24/outline/star.svg +3 -0
  1152. data/vendor/heroicons/24/outline/stop-circle.svg +4 -0
  1153. data/vendor/heroicons/24/outline/stop.svg +3 -0
  1154. data/vendor/heroicons/24/outline/strikethrough.svg +3 -0
  1155. data/vendor/heroicons/24/outline/sun.svg +3 -0
  1156. data/vendor/heroicons/24/outline/swatch.svg +3 -0
  1157. data/vendor/heroicons/24/outline/table-cells.svg +3 -0
  1158. data/vendor/heroicons/24/outline/tag.svg +4 -0
  1159. data/vendor/heroicons/24/outline/ticket.svg +3 -0
  1160. data/vendor/heroicons/24/outline/trash.svg +3 -0
  1161. data/vendor/heroicons/24/outline/trophy.svg +3 -0
  1162. data/vendor/heroicons/24/outline/truck.svg +3 -0
  1163. data/vendor/heroicons/24/outline/tv.svg +3 -0
  1164. data/vendor/heroicons/24/outline/underline.svg +3 -0
  1165. data/vendor/heroicons/24/outline/user-circle.svg +3 -0
  1166. data/vendor/heroicons/24/outline/user-group.svg +3 -0
  1167. data/vendor/heroicons/24/outline/user-minus.svg +3 -0
  1168. data/vendor/heroicons/24/outline/user-plus.svg +3 -0
  1169. data/vendor/heroicons/24/outline/user.svg +3 -0
  1170. data/vendor/heroicons/24/outline/users.svg +3 -0
  1171. data/vendor/heroicons/24/outline/variable.svg +3 -0
  1172. data/vendor/heroicons/24/outline/video-camera-slash.svg +3 -0
  1173. data/vendor/heroicons/24/outline/video-camera.svg +3 -0
  1174. data/vendor/heroicons/24/outline/view-columns.svg +3 -0
  1175. data/vendor/heroicons/24/outline/viewfinder-circle.svg +3 -0
  1176. data/vendor/heroicons/24/outline/wallet.svg +3 -0
  1177. data/vendor/heroicons/24/outline/wifi.svg +3 -0
  1178. data/vendor/heroicons/24/outline/window.svg +3 -0
  1179. data/vendor/heroicons/24/outline/wrench-screwdriver.svg +3 -0
  1180. data/vendor/heroicons/24/outline/wrench.svg +4 -0
  1181. data/vendor/heroicons/24/outline/x-circle.svg +3 -0
  1182. data/vendor/heroicons/24/outline/x-mark.svg +3 -0
  1183. data/vendor/heroicons/24/solid/academic-cap.svg +5 -0
  1184. data/vendor/heroicons/24/solid/adjustments-horizontal.svg +3 -0
  1185. data/vendor/heroicons/24/solid/adjustments-vertical.svg +3 -0
  1186. data/vendor/heroicons/24/solid/archive-box-arrow-down.svg +4 -0
  1187. data/vendor/heroicons/24/solid/archive-box-x-mark.svg +4 -0
  1188. data/vendor/heroicons/24/solid/archive-box.svg +4 -0
  1189. data/vendor/heroicons/24/solid/arrow-down-circle.svg +3 -0
  1190. data/vendor/heroicons/24/solid/arrow-down-left.svg +3 -0
  1191. data/vendor/heroicons/24/solid/arrow-down-on-square-stack.svg +4 -0
  1192. data/vendor/heroicons/24/solid/arrow-down-on-square.svg +3 -0
  1193. data/vendor/heroicons/24/solid/arrow-down-right.svg +3 -0
  1194. data/vendor/heroicons/24/solid/arrow-down-tray.svg +3 -0
  1195. data/vendor/heroicons/24/solid/arrow-down.svg +3 -0
  1196. data/vendor/heroicons/24/solid/arrow-left-circle.svg +3 -0
  1197. data/vendor/heroicons/24/solid/arrow-left-end-on-rectangle.svg +3 -0
  1198. data/vendor/heroicons/24/solid/arrow-left-on-rectangle.svg +3 -0
  1199. data/vendor/heroicons/24/solid/arrow-left-start-on-rectangle.svg +3 -0
  1200. data/vendor/heroicons/24/solid/arrow-left.svg +3 -0
  1201. data/vendor/heroicons/24/solid/arrow-long-down.svg +3 -0
  1202. data/vendor/heroicons/24/solid/arrow-long-left.svg +3 -0
  1203. data/vendor/heroicons/24/solid/arrow-long-right.svg +3 -0
  1204. data/vendor/heroicons/24/solid/arrow-long-up.svg +3 -0
  1205. data/vendor/heroicons/24/solid/arrow-path-rounded-square.svg +3 -0
  1206. data/vendor/heroicons/24/solid/arrow-path.svg +3 -0
  1207. data/vendor/heroicons/24/solid/arrow-right-circle.svg +3 -0
  1208. data/vendor/heroicons/24/solid/arrow-right-end-on-rectangle.svg +3 -0
  1209. data/vendor/heroicons/24/solid/arrow-right-on-rectangle.svg +3 -0
  1210. data/vendor/heroicons/24/solid/arrow-right-start-on-rectangle.svg +3 -0
  1211. data/vendor/heroicons/24/solid/arrow-right.svg +3 -0
  1212. data/vendor/heroicons/24/solid/arrow-small-down.svg +3 -0
  1213. data/vendor/heroicons/24/solid/arrow-small-left.svg +3 -0
  1214. data/vendor/heroicons/24/solid/arrow-small-right.svg +3 -0
  1215. data/vendor/heroicons/24/solid/arrow-small-up.svg +3 -0
  1216. data/vendor/heroicons/24/solid/arrow-top-right-on-square.svg +3 -0
  1217. data/vendor/heroicons/24/solid/arrow-trending-down.svg +3 -0
  1218. data/vendor/heroicons/24/solid/arrow-trending-up.svg +3 -0
  1219. data/vendor/heroicons/24/solid/arrow-turn-down-left.svg +3 -0
  1220. data/vendor/heroicons/24/solid/arrow-turn-down-right.svg +3 -0
  1221. data/vendor/heroicons/24/solid/arrow-turn-left-down.svg +3 -0
  1222. data/vendor/heroicons/24/solid/arrow-turn-left-up.svg +3 -0
  1223. data/vendor/heroicons/24/solid/arrow-turn-right-down.svg +3 -0
  1224. data/vendor/heroicons/24/solid/arrow-turn-right-up.svg +3 -0
  1225. data/vendor/heroicons/24/solid/arrow-turn-up-left.svg +3 -0
  1226. data/vendor/heroicons/24/solid/arrow-turn-up-right.svg +3 -0
  1227. data/vendor/heroicons/24/solid/arrow-up-circle.svg +3 -0
  1228. data/vendor/heroicons/24/solid/arrow-up-left.svg +3 -0
  1229. data/vendor/heroicons/24/solid/arrow-up-on-square-stack.svg +4 -0
  1230. data/vendor/heroicons/24/solid/arrow-up-on-square.svg +3 -0
  1231. data/vendor/heroicons/24/solid/arrow-up-right.svg +3 -0
  1232. data/vendor/heroicons/24/solid/arrow-up-tray.svg +3 -0
  1233. data/vendor/heroicons/24/solid/arrow-up.svg +3 -0
  1234. data/vendor/heroicons/24/solid/arrow-uturn-down.svg +3 -0
  1235. data/vendor/heroicons/24/solid/arrow-uturn-left.svg +3 -0
  1236. data/vendor/heroicons/24/solid/arrow-uturn-right.svg +3 -0
  1237. data/vendor/heroicons/24/solid/arrow-uturn-up.svg +3 -0
  1238. data/vendor/heroicons/24/solid/arrows-pointing-in.svg +3 -0
  1239. data/vendor/heroicons/24/solid/arrows-pointing-out.svg +3 -0
  1240. data/vendor/heroicons/24/solid/arrows-right-left.svg +3 -0
  1241. data/vendor/heroicons/24/solid/arrows-up-down.svg +3 -0
  1242. data/vendor/heroicons/24/solid/at-symbol.svg +3 -0
  1243. data/vendor/heroicons/24/solid/backspace.svg +3 -0
  1244. data/vendor/heroicons/24/solid/backward.svg +3 -0
  1245. data/vendor/heroicons/24/solid/banknotes.svg +5 -0
  1246. data/vendor/heroicons/24/solid/bars-2.svg +3 -0
  1247. data/vendor/heroicons/24/solid/bars-3-bottom-left.svg +3 -0
  1248. data/vendor/heroicons/24/solid/bars-3-bottom-right.svg +3 -0
  1249. data/vendor/heroicons/24/solid/bars-3-center-left.svg +3 -0
  1250. data/vendor/heroicons/24/solid/bars-3.svg +3 -0
  1251. data/vendor/heroicons/24/solid/bars-4.svg +3 -0
  1252. data/vendor/heroicons/24/solid/bars-arrow-down.svg +3 -0
  1253. data/vendor/heroicons/24/solid/bars-arrow-up.svg +3 -0
  1254. data/vendor/heroicons/24/solid/battery-0.svg +3 -0
  1255. data/vendor/heroicons/24/solid/battery-100.svg +3 -0
  1256. data/vendor/heroicons/24/solid/battery-50.svg +4 -0
  1257. data/vendor/heroicons/24/solid/beaker.svg +3 -0
  1258. data/vendor/heroicons/24/solid/bell-alert.svg +4 -0
  1259. data/vendor/heroicons/24/solid/bell-slash.svg +4 -0
  1260. data/vendor/heroicons/24/solid/bell-snooze.svg +3 -0
  1261. data/vendor/heroicons/24/solid/bell.svg +3 -0
  1262. data/vendor/heroicons/24/solid/bold.svg +3 -0
  1263. data/vendor/heroicons/24/solid/bolt-slash.svg +3 -0
  1264. data/vendor/heroicons/24/solid/bolt.svg +3 -0
  1265. data/vendor/heroicons/24/solid/book-open.svg +3 -0
  1266. data/vendor/heroicons/24/solid/bookmark-slash.svg +3 -0
  1267. data/vendor/heroicons/24/solid/bookmark-square.svg +3 -0
  1268. data/vendor/heroicons/24/solid/bookmark.svg +3 -0
  1269. data/vendor/heroicons/24/solid/briefcase.svg +4 -0
  1270. data/vendor/heroicons/24/solid/bug-ant.svg +3 -0
  1271. data/vendor/heroicons/24/solid/building-library.svg +5 -0
  1272. data/vendor/heroicons/24/solid/building-office-2.svg +3 -0
  1273. data/vendor/heroicons/24/solid/building-office.svg +3 -0
  1274. data/vendor/heroicons/24/solid/building-storefront.svg +4 -0
  1275. data/vendor/heroicons/24/solid/cake.svg +3 -0
  1276. data/vendor/heroicons/24/solid/calculator.svg +3 -0
  1277. data/vendor/heroicons/24/solid/calendar-date-range.svg +4 -0
  1278. data/vendor/heroicons/24/solid/calendar-days.svg +4 -0
  1279. data/vendor/heroicons/24/solid/calendar.svg +3 -0
  1280. data/vendor/heroicons/24/solid/camera.svg +4 -0
  1281. data/vendor/heroicons/24/solid/chart-bar-square.svg +3 -0
  1282. data/vendor/heroicons/24/solid/chart-bar.svg +3 -0
  1283. data/vendor/heroicons/24/solid/chart-pie.svg +4 -0
  1284. data/vendor/heroicons/24/solid/chat-bubble-bottom-center-text.svg +3 -0
  1285. data/vendor/heroicons/24/solid/chat-bubble-bottom-center.svg +3 -0
  1286. data/vendor/heroicons/24/solid/chat-bubble-left-ellipsis.svg +3 -0
  1287. data/vendor/heroicons/24/solid/chat-bubble-left-right.svg +4 -0
  1288. data/vendor/heroicons/24/solid/chat-bubble-left.svg +3 -0
  1289. data/vendor/heroicons/24/solid/chat-bubble-oval-left-ellipsis.svg +3 -0
  1290. data/vendor/heroicons/24/solid/chat-bubble-oval-left.svg +3 -0
  1291. data/vendor/heroicons/24/solid/check-badge.svg +3 -0
  1292. data/vendor/heroicons/24/solid/check-circle.svg +3 -0
  1293. data/vendor/heroicons/24/solid/check.svg +3 -0
  1294. data/vendor/heroicons/24/solid/chevron-double-down.svg +4 -0
  1295. data/vendor/heroicons/24/solid/chevron-double-left.svg +4 -0
  1296. data/vendor/heroicons/24/solid/chevron-double-right.svg +4 -0
  1297. data/vendor/heroicons/24/solid/chevron-double-up.svg +4 -0
  1298. data/vendor/heroicons/24/solid/chevron-down.svg +3 -0
  1299. data/vendor/heroicons/24/solid/chevron-left.svg +3 -0
  1300. data/vendor/heroicons/24/solid/chevron-right.svg +3 -0
  1301. data/vendor/heroicons/24/solid/chevron-up-down.svg +3 -0
  1302. data/vendor/heroicons/24/solid/chevron-up.svg +3 -0
  1303. data/vendor/heroicons/24/solid/circle-stack.svg +6 -0
  1304. data/vendor/heroicons/24/solid/clipboard-document-check.svg +4 -0
  1305. data/vendor/heroicons/24/solid/clipboard-document-list.svg +4 -0
  1306. data/vendor/heroicons/24/solid/clipboard-document.svg +5 -0
  1307. data/vendor/heroicons/24/solid/clipboard.svg +3 -0
  1308. data/vendor/heroicons/24/solid/clock.svg +3 -0
  1309. data/vendor/heroicons/24/solid/cloud-arrow-down.svg +3 -0
  1310. data/vendor/heroicons/24/solid/cloud-arrow-up.svg +3 -0
  1311. data/vendor/heroicons/24/solid/cloud.svg +3 -0
  1312. data/vendor/heroicons/24/solid/code-bracket-square.svg +3 -0
  1313. data/vendor/heroicons/24/solid/code-bracket.svg +3 -0
  1314. data/vendor/heroicons/24/solid/cog-6-tooth.svg +3 -0
  1315. data/vendor/heroicons/24/solid/cog-8-tooth.svg +3 -0
  1316. data/vendor/heroicons/24/solid/cog.svg +4 -0
  1317. data/vendor/heroicons/24/solid/command-line.svg +3 -0
  1318. data/vendor/heroicons/24/solid/computer-desktop.svg +3 -0
  1319. data/vendor/heroicons/24/solid/cpu-chip.svg +4 -0
  1320. data/vendor/heroicons/24/solid/credit-card.svg +4 -0
  1321. data/vendor/heroicons/24/solid/cube-transparent.svg +3 -0
  1322. data/vendor/heroicons/24/solid/cube.svg +3 -0
  1323. data/vendor/heroicons/24/solid/currency-bangladeshi.svg +3 -0
  1324. data/vendor/heroicons/24/solid/currency-dollar.svg +4 -0
  1325. data/vendor/heroicons/24/solid/currency-euro.svg +3 -0
  1326. data/vendor/heroicons/24/solid/currency-pound.svg +3 -0
  1327. data/vendor/heroicons/24/solid/currency-rupee.svg +3 -0
  1328. data/vendor/heroicons/24/solid/currency-yen.svg +3 -0
  1329. data/vendor/heroicons/24/solid/cursor-arrow-rays.svg +3 -0
  1330. data/vendor/heroicons/24/solid/cursor-arrow-ripple.svg +3 -0
  1331. data/vendor/heroicons/24/solid/device-phone-mobile.svg +4 -0
  1332. data/vendor/heroicons/24/solid/device-tablet.svg +4 -0
  1333. data/vendor/heroicons/24/solid/divide.svg +3 -0
  1334. data/vendor/heroicons/24/solid/document-arrow-down.svg +4 -0
  1335. data/vendor/heroicons/24/solid/document-arrow-up.svg +4 -0
  1336. data/vendor/heroicons/24/solid/document-chart-bar.svg +4 -0
  1337. data/vendor/heroicons/24/solid/document-check.svg +4 -0
  1338. data/vendor/heroicons/24/solid/document-currency-bangladeshi.svg +3 -0
  1339. data/vendor/heroicons/24/solid/document-currency-dollar.svg +3 -0
  1340. data/vendor/heroicons/24/solid/document-currency-euro.svg +4 -0
  1341. data/vendor/heroicons/24/solid/document-currency-pound.svg +3 -0
  1342. data/vendor/heroicons/24/solid/document-currency-rupee.svg +3 -0
  1343. data/vendor/heroicons/24/solid/document-currency-yen.svg +3 -0
  1344. data/vendor/heroicons/24/solid/document-duplicate.svg +4 -0
  1345. data/vendor/heroicons/24/solid/document-magnifying-glass.svg +5 -0
  1346. data/vendor/heroicons/24/solid/document-minus.svg +4 -0
  1347. data/vendor/heroicons/24/solid/document-plus.svg +4 -0
  1348. data/vendor/heroicons/24/solid/document-text.svg +4 -0
  1349. data/vendor/heroicons/24/solid/document.svg +4 -0
  1350. data/vendor/heroicons/24/solid/ellipsis-horizontal-circle.svg +3 -0
  1351. data/vendor/heroicons/24/solid/ellipsis-horizontal.svg +3 -0
  1352. data/vendor/heroicons/24/solid/ellipsis-vertical.svg +3 -0
  1353. data/vendor/heroicons/24/solid/envelope-open.svg +4 -0
  1354. data/vendor/heroicons/24/solid/envelope.svg +4 -0
  1355. data/vendor/heroicons/24/solid/equals.svg +3 -0
  1356. data/vendor/heroicons/24/solid/exclamation-circle.svg +3 -0
  1357. data/vendor/heroicons/24/solid/exclamation-triangle.svg +3 -0
  1358. data/vendor/heroicons/24/solid/eye-dropper.svg +3 -0
  1359. data/vendor/heroicons/24/solid/eye-slash.svg +5 -0
  1360. data/vendor/heroicons/24/solid/eye.svg +4 -0
  1361. data/vendor/heroicons/24/solid/face-frown.svg +3 -0
  1362. data/vendor/heroicons/24/solid/face-smile.svg +3 -0
  1363. data/vendor/heroicons/24/solid/film.svg +3 -0
  1364. data/vendor/heroicons/24/solid/finger-print.svg +3 -0
  1365. data/vendor/heroicons/24/solid/fire.svg +3 -0
  1366. data/vendor/heroicons/24/solid/flag.svg +3 -0
  1367. data/vendor/heroicons/24/solid/folder-arrow-down.svg +3 -0
  1368. data/vendor/heroicons/24/solid/folder-minus.svg +3 -0
  1369. data/vendor/heroicons/24/solid/folder-open.svg +3 -0
  1370. data/vendor/heroicons/24/solid/folder-plus.svg +3 -0
  1371. data/vendor/heroicons/24/solid/folder.svg +3 -0
  1372. data/vendor/heroicons/24/solid/forward.svg +3 -0
  1373. data/vendor/heroicons/24/solid/funnel.svg +3 -0
  1374. data/vendor/heroicons/24/solid/gif.svg +3 -0
  1375. data/vendor/heroicons/24/solid/gift-top.svg +4 -0
  1376. data/vendor/heroicons/24/solid/gift.svg +3 -0
  1377. data/vendor/heroicons/24/solid/globe-alt.svg +3 -0
  1378. data/vendor/heroicons/24/solid/globe-americas.svg +3 -0
  1379. data/vendor/heroicons/24/solid/globe-asia-australia.svg +4 -0
  1380. data/vendor/heroicons/24/solid/globe-europe-africa.svg +3 -0
  1381. data/vendor/heroicons/24/solid/h1.svg +3 -0
  1382. data/vendor/heroicons/24/solid/h2.svg +3 -0
  1383. data/vendor/heroicons/24/solid/h3.svg +3 -0
  1384. data/vendor/heroicons/24/solid/hand-raised.svg +3 -0
  1385. data/vendor/heroicons/24/solid/hand-thumb-down.svg +3 -0
  1386. data/vendor/heroicons/24/solid/hand-thumb-up.svg +3 -0
  1387. data/vendor/heroicons/24/solid/hashtag.svg +3 -0
  1388. data/vendor/heroicons/24/solid/heart.svg +3 -0
  1389. data/vendor/heroicons/24/solid/home-modern.svg +4 -0
  1390. data/vendor/heroicons/24/solid/home.svg +4 -0
  1391. data/vendor/heroicons/24/solid/identification.svg +3 -0
  1392. data/vendor/heroicons/24/solid/inbox-arrow-down.svg +4 -0
  1393. data/vendor/heroicons/24/solid/inbox-stack.svg +4 -0
  1394. data/vendor/heroicons/24/solid/inbox.svg +3 -0
  1395. data/vendor/heroicons/24/solid/information-circle.svg +3 -0
  1396. data/vendor/heroicons/24/solid/italic.svg +3 -0
  1397. data/vendor/heroicons/24/solid/key.svg +3 -0
  1398. data/vendor/heroicons/24/solid/language.svg +3 -0
  1399. data/vendor/heroicons/24/solid/lifebuoy.svg +3 -0
  1400. data/vendor/heroicons/24/solid/light-bulb.svg +4 -0
  1401. data/vendor/heroicons/24/solid/link-slash.svg +3 -0
  1402. data/vendor/heroicons/24/solid/link.svg +3 -0
  1403. data/vendor/heroicons/24/solid/list-bullet.svg +3 -0
  1404. data/vendor/heroicons/24/solid/lock-closed.svg +3 -0
  1405. data/vendor/heroicons/24/solid/lock-open.svg +3 -0
  1406. data/vendor/heroicons/24/solid/magnifying-glass-circle.svg +4 -0
  1407. data/vendor/heroicons/24/solid/magnifying-glass-minus.svg +3 -0
  1408. data/vendor/heroicons/24/solid/magnifying-glass-plus.svg +3 -0
  1409. data/vendor/heroicons/24/solid/magnifying-glass.svg +3 -0
  1410. data/vendor/heroicons/24/solid/map-pin.svg +3 -0
  1411. data/vendor/heroicons/24/solid/map.svg +3 -0
  1412. data/vendor/heroicons/24/solid/megaphone.svg +3 -0
  1413. data/vendor/heroicons/24/solid/microphone.svg +4 -0
  1414. data/vendor/heroicons/24/solid/minus-circle.svg +3 -0
  1415. data/vendor/heroicons/24/solid/minus-small.svg +3 -0
  1416. data/vendor/heroicons/24/solid/minus.svg +3 -0
  1417. data/vendor/heroicons/24/solid/moon.svg +3 -0
  1418. data/vendor/heroicons/24/solid/musical-note.svg +3 -0
  1419. data/vendor/heroicons/24/solid/newspaper.svg +4 -0
  1420. data/vendor/heroicons/24/solid/no-symbol.svg +3 -0
  1421. data/vendor/heroicons/24/solid/numbered-list.svg +3 -0
  1422. data/vendor/heroicons/24/solid/paint-brush.svg +3 -0
  1423. data/vendor/heroicons/24/solid/paper-airplane.svg +3 -0
  1424. data/vendor/heroicons/24/solid/paper-clip.svg +3 -0
  1425. data/vendor/heroicons/24/solid/pause-circle.svg +3 -0
  1426. data/vendor/heroicons/24/solid/pause.svg +3 -0
  1427. data/vendor/heroicons/24/solid/pencil-square.svg +4 -0
  1428. data/vendor/heroicons/24/solid/pencil.svg +3 -0
  1429. data/vendor/heroicons/24/solid/percent-badge.svg +3 -0
  1430. data/vendor/heroicons/24/solid/phone-arrow-down-left.svg +4 -0
  1431. data/vendor/heroicons/24/solid/phone-arrow-up-right.svg +4 -0
  1432. data/vendor/heroicons/24/solid/phone-x-mark.svg +3 -0
  1433. data/vendor/heroicons/24/solid/phone.svg +3 -0
  1434. data/vendor/heroicons/24/solid/photo.svg +3 -0
  1435. data/vendor/heroicons/24/solid/play-circle.svg +3 -0
  1436. data/vendor/heroicons/24/solid/play-pause.svg +3 -0
  1437. data/vendor/heroicons/24/solid/play.svg +3 -0
  1438. data/vendor/heroicons/24/solid/plus-circle.svg +3 -0
  1439. data/vendor/heroicons/24/solid/plus-small.svg +3 -0
  1440. data/vendor/heroicons/24/solid/plus.svg +3 -0
  1441. data/vendor/heroicons/24/solid/power.svg +3 -0
  1442. data/vendor/heroicons/24/solid/presentation-chart-bar.svg +3 -0
  1443. data/vendor/heroicons/24/solid/presentation-chart-line.svg +3 -0
  1444. data/vendor/heroicons/24/solid/printer.svg +3 -0
  1445. data/vendor/heroicons/24/solid/puzzle-piece.svg +3 -0
  1446. data/vendor/heroicons/24/solid/qr-code.svg +3 -0
  1447. data/vendor/heroicons/24/solid/question-mark-circle.svg +3 -0
  1448. data/vendor/heroicons/24/solid/queue-list.svg +3 -0
  1449. data/vendor/heroicons/24/solid/radio.svg +3 -0
  1450. data/vendor/heroicons/24/solid/receipt-percent.svg +3 -0
  1451. data/vendor/heroicons/24/solid/receipt-refund.svg +3 -0
  1452. data/vendor/heroicons/24/solid/rectangle-group.svg +3 -0
  1453. data/vendor/heroicons/24/solid/rectangle-stack.svg +3 -0
  1454. data/vendor/heroicons/24/solid/rocket-launch.svg +4 -0
  1455. data/vendor/heroicons/24/solid/rss.svg +3 -0
  1456. data/vendor/heroicons/24/solid/scale.svg +3 -0
  1457. data/vendor/heroicons/24/solid/scissors.svg +4 -0
  1458. data/vendor/heroicons/24/solid/server-stack.svg +4 -0
  1459. data/vendor/heroicons/24/solid/server.svg +4 -0
  1460. data/vendor/heroicons/24/solid/share.svg +3 -0
  1461. data/vendor/heroicons/24/solid/shield-check.svg +3 -0
  1462. data/vendor/heroicons/24/solid/shield-exclamation.svg +3 -0
  1463. data/vendor/heroicons/24/solid/shopping-bag.svg +3 -0
  1464. data/vendor/heroicons/24/solid/shopping-cart.svg +3 -0
  1465. data/vendor/heroicons/24/solid/signal-slash.svg +3 -0
  1466. data/vendor/heroicons/24/solid/signal.svg +3 -0
  1467. data/vendor/heroicons/24/solid/slash.svg +3 -0
  1468. data/vendor/heroicons/24/solid/sparkles.svg +3 -0
  1469. data/vendor/heroicons/24/solid/speaker-wave.svg +4 -0
  1470. data/vendor/heroicons/24/solid/speaker-x-mark.svg +3 -0
  1471. data/vendor/heroicons/24/solid/square-2-stack.svg +4 -0
  1472. data/vendor/heroicons/24/solid/square-3-stack-3d.svg +5 -0
  1473. data/vendor/heroicons/24/solid/squares-2x2.svg +3 -0
  1474. data/vendor/heroicons/24/solid/squares-plus.svg +3 -0
  1475. data/vendor/heroicons/24/solid/star.svg +3 -0
  1476. data/vendor/heroicons/24/solid/stop-circle.svg +3 -0
  1477. data/vendor/heroicons/24/solid/stop.svg +3 -0
  1478. data/vendor/heroicons/24/solid/strikethrough.svg +3 -0
  1479. data/vendor/heroicons/24/solid/sun.svg +3 -0
  1480. data/vendor/heroicons/24/solid/swatch.svg +4 -0
  1481. data/vendor/heroicons/24/solid/table-cells.svg +3 -0
  1482. data/vendor/heroicons/24/solid/tag.svg +3 -0
  1483. data/vendor/heroicons/24/solid/ticket.svg +3 -0
  1484. data/vendor/heroicons/24/solid/trash.svg +3 -0
  1485. data/vendor/heroicons/24/solid/trophy.svg +3 -0
  1486. data/vendor/heroicons/24/solid/truck.svg +5 -0
  1487. data/vendor/heroicons/24/solid/tv.svg +4 -0
  1488. data/vendor/heroicons/24/solid/underline.svg +3 -0
  1489. data/vendor/heroicons/24/solid/user-circle.svg +3 -0
  1490. data/vendor/heroicons/24/solid/user-group.svg +4 -0
  1491. data/vendor/heroicons/24/solid/user-minus.svg +3 -0
  1492. data/vendor/heroicons/24/solid/user-plus.svg +3 -0
  1493. data/vendor/heroicons/24/solid/user.svg +3 -0
  1494. data/vendor/heroicons/24/solid/users.svg +3 -0
  1495. data/vendor/heroicons/24/solid/variable.svg +3 -0
  1496. data/vendor/heroicons/24/solid/video-camera-slash.svg +3 -0
  1497. data/vendor/heroicons/24/solid/video-camera.svg +3 -0
  1498. data/vendor/heroicons/24/solid/view-columns.svg +3 -0
  1499. data/vendor/heroicons/24/solid/viewfinder-circle.svg +3 -0
  1500. data/vendor/heroicons/24/solid/wallet.svg +3 -0
  1501. data/vendor/heroicons/24/solid/wifi.svg +3 -0
  1502. data/vendor/heroicons/24/solid/window.svg +3 -0
  1503. data/vendor/heroicons/24/solid/wrench-screwdriver.svg +5 -0
  1504. data/vendor/heroicons/24/solid/wrench.svg +3 -0
  1505. data/vendor/heroicons/24/solid/x-circle.svg +3 -0
  1506. data/vendor/heroicons/24/solid/x-mark.svg +3 -0
  1507. data/vendor/heroicons/LICENSE +21 -0
  1508. data/vendor/heroicons/VERSION +5 -0
  1509. metadata +1664 -0
@@ -0,0 +1,338 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'zlib'
4
+
5
+ module Abqari
6
+ class RenderContext
7
+ # Decorative cover-image generation for posts and other collections
8
+ # that opt in via the `cover:` enum in config/site.yml. Produces
9
+ # inline SVG title cards — the page title (word-wrapped to 1-3
10
+ # lines) on a slug-hashed two-tone gradient, with a small cluster
11
+ # of decorative squares at the corners (echoing the hand-authored
12
+ # hero.svg pattern). No file output; the SVG embeds directly in
13
+ # the partial's HTML.
14
+ #
15
+ # The four modes:
16
+ #
17
+ # photo — use the page's `image:` frontmatter if set;
18
+ # otherwise the basic flat-tint placeholder
19
+ # (`.post-list__cover-placeholder` etc.). The
20
+ # historical default.
21
+ # photo_or_svg — use the page's `image:` if set; otherwise
22
+ # render a decorative initial-tile SVG. Gives
23
+ # text-first authors a polished card without
24
+ # sourcing imagery.
25
+ # svg — always render the decorative SVG, even when
26
+ # `image:` is set. Useful when you want every
27
+ # card to read as a tile (uniform listing look)
28
+ # rather than a mix of photos and tiles.
29
+ # none — no cover slot at all (text-only cards). Same
30
+ # effect as the legacy `show_image: false`.
31
+ #
32
+ # Frontmatter `cover:` on a single page overrides the collection
33
+ # default — `cover: false` is a shortcut for `cover: none`.
34
+ module CoverHelpers
35
+ # Muted two-tone gradients. Slug-hashed so each post consistently
36
+ # gets the same tile across builds, but adjacent posts in a
37
+ # listing tend to draw different tones (palette entries × hash
38
+ # distribution = reasonably even spread on any one page).
39
+ #
40
+ # The default set is hue-neutral, tuned for `minimal` (and any
41
+ # custom theme). The warm themes get their own sets in
42
+ # `THEME_COVER_PALETTES` below — a slug-hashed teal or violet
43
+ # tile on magazine's cream or notebook's paper page injects a
44
+ # saturated hue the theme never uses anywhere else, so each
45
+ # warm theme constrains its tiles to its own colour world.
46
+ COVER_PALETTES = [
47
+ ['#1e3a5f', '#4a78a8'].freeze, # deep blue → mid blue
48
+ ['#5b3a8a', '#8a6abf'].freeze, # violet
49
+ ['#2d4a3d', '#5a8a6a'].freeze, # forest
50
+ ['#8a4a2a', '#bf7a4a'].freeze, # rust
51
+ ['#3a3a4a', '#6a6a8a'].freeze, # slate
52
+ ['#2a5a6a', '#5a8aa0'].freeze, # teal
53
+ ['#6a2a3a', '#a05a6a'].freeze, # burgundy
54
+ ['#5a5a3a', '#8a8a6a'].freeze # olive
55
+ ].freeze
56
+
57
+ # Theme-keyed tile palettes for the shipped warm themes. Every
58
+ # pair keeps the tile dark enough that the near-white title
59
+ # text stays legible. Themes not listed (minimal, custom,
60
+ # bootstrap, none) fall back to the neutral COVER_PALETTES.
61
+ THEME_COVER_PALETTES = {
62
+ # Cream, rust, editorial — warm browns and rusts, one muted
63
+ # navy (the theme's info hue) so grids don't go monochrome.
64
+ 'magazine' => [
65
+ ['#8a4a2a', '#bf7a4a'].freeze, # rust
66
+ ['#6a2a3a', '#a05a6a'].freeze, # burgundy
67
+ ['#4a3226', '#7a5a42'].freeze, # deep umber
68
+ ['#5a5a3a', '#8a8a6a'].freeze, # olive
69
+ ['#3a4a5f', '#68809a'].freeze, # muted navy
70
+ ['#9a5230', '#c07a50'].freeze # terracotta
71
+ ].freeze,
72
+ # Paper + ochre + graphite — the ochre family carries the
73
+ # signature, dusty navy echoes `--color-info`.
74
+ 'notebook' => [
75
+ ['#8a5c14', '#c4811f'].freeze, # ochre
76
+ ['#33353a', '#5c6066'].freeze, # graphite
77
+ ['#2a5d8f', '#5580ab'].freeze, # dusty navy
78
+ ['#565046', '#847c6e'].freeze, # warm grey
79
+ ['#6e4a12', '#a06419'].freeze, # deep ochre
80
+ ['#4a5a3a', '#75866a'].freeze # moss
81
+ ].freeze,
82
+ # Sun-bleached earth — brick, clay, olive; dusty blue echoes
83
+ # `--color-info`.
84
+ 'sand' => [
85
+ ['#7a2018', '#a84438'].freeze, # brick
86
+ ['#8a5138', '#b57952'].freeze, # clay
87
+ ['#4f5233', '#7a7d55'].freeze, # olive
88
+ ['#6e5a3a', '#9a825c'].freeze, # sand brown
89
+ ['#4a342a', '#755446'].freeze, # deep umber
90
+ ['#3f5a80', '#6d88a8'].freeze # dusty blue
91
+ ].freeze
92
+ }.freeze
93
+
94
+ COVER_MODES = %w[photo photo_or_svg svg none].freeze
95
+ DEFAULT_COVER_MODE = 'photo'
96
+
97
+ # Resolve the effective cover mode for a page. Three layers,
98
+ # frontmatter wins:
99
+ # 1. Frontmatter `cover:` — explicit string value (one of
100
+ # `COVER_MODES`) is honoured directly. Boolean `false` is
101
+ # sugar for `'none'`.
102
+ # 2. Collection config `<collection>.<context>.cover`.
103
+ # 3. Default `'photo'` (the historical behaviour).
104
+ #
105
+ # `context:` is `:index` for listing partials, `:show` for the
106
+ # detail page. Same enum on both sides, independent config.
107
+ def cover_mode_for(page, context: :index)
108
+ fm = page.respond_to?(:frontmatter) ? page.frontmatter['cover'] : nil
109
+ return 'none' if fm == false
110
+ return fm.to_s if COVER_MODES.include?(fm.to_s)
111
+
112
+ col = page.respond_to?(:collection) ? page.collection : nil
113
+ return DEFAULT_COVER_MODE unless col
114
+
115
+ (site.collection_config(col).dig(context.to_s, 'cover') || DEFAULT_COVER_MODE).to_s
116
+ end
117
+
118
+ # `cover:` is overloaded: it's usually a MODE enum (`svg`, `none`,
119
+ # …) but a site can also point it at an image path. This returns
120
+ # the value ONLY when it's an actual image path — a non-mode,
121
+ # non-boolean string — so the head partial doesn't turn
122
+ # `cover: svg` into an `og:image` of `/posts/foo/svg`. Returns nil
123
+ # for modes, booleans, and blanks.
124
+ def cover_image_path(page)
125
+ fm = page.respond_to?(:frontmatter) ? page.frontmatter['cover'] : nil
126
+ return nil unless fm.is_a?(String)
127
+ return nil if fm.strip.empty? || COVER_MODES.include?(fm)
128
+
129
+ fm
130
+ end
131
+
132
+ # What to actually render for the cover slot, given the resolved
133
+ # mode and whether the page has an `image:` set. Returns one of:
134
+ #
135
+ # :photo — render the page's `image:` as an <img>
136
+ # :placeholder — render the basic flat-tint SVG rect (the
137
+ # existing `.post-list__cover-placeholder` shape)
138
+ # :svg — render the decorative initial-tile SVG
139
+ # (call `cover_svg_for(page)`)
140
+ # :none — render nothing; caller skips the cover slot
141
+ #
142
+ # Centralising the branching here keeps the partials a flat
143
+ # `case` over the four outcomes instead of repeating the
144
+ # mode/image cross-product.
145
+ def cover_choice_for(page, context: :index)
146
+ mode = cover_mode_for(page, context: context)
147
+ return :none if mode == 'none'
148
+
149
+ has_image = page.respond_to?(:frontmatter) && page.frontmatter['image']
150
+ case mode
151
+ when 'photo' then has_image ? :photo : :placeholder
152
+ when 'photo_or_svg' then has_image ? :photo : :svg
153
+ when 'svg' then :svg
154
+ end
155
+ end
156
+
157
+ # Inline SVG markup for the decorative title-card cover. Designed
158
+ # for the 4:3 cover slot but `preserveAspectRatio="xMidYMid slice"`
159
+ # makes it scale gracefully to wider/taller containers too —
160
+ # safe to use for the larger show-view hero as well.
161
+ #
162
+ # Layout:
163
+ # * Slug-hashed two-tone gradient background.
164
+ # * Two clusters of three faint white squares (top-left + bottom-
165
+ # right) — same motif as the hand-authored hero.svg shipped
166
+ # with the fixture's "Building with Abqari" post.
167
+ # * Page title, centred, word-wrapped to 1-3 lines. Font size
168
+ # auto-scales based on the longest wrapped line so long titles
169
+ # stay inside the viewBox.
170
+ #
171
+ # The `<linearGradient>` id is suffixed with a slug-hash so
172
+ # multiple cover SVGs on one page (a posts index card grid, the
173
+ # home modules, etc.) don't collide on a shared id.
174
+ def cover_svg_for(page)
175
+ title = page.respond_to?(:title) ? page.title.to_s.strip : ''
176
+ display_title = title.empty? ? '?' : title
177
+
178
+ # Slug-keyed where possible (deterministic per page across
179
+ # builds); falls back to the title. `Zlib.crc32` is stable
180
+ # across processes — `String#hash` is salted and would change
181
+ # between builds, scrambling the tile colours each time.
182
+ key = page.respond_to?(:slug) && page.slug ? page.slug.to_s : title
183
+ crc = Zlib.crc32(key)
184
+ palette = cover_palette
185
+ bg_a, bg_b = palette[crc % palette.size]
186
+ grad_id = "cover-grad-#{crc.to_s(36)}"
187
+
188
+ lines = svg_wrap_title(display_title)
189
+ font_size = svg_title_font_size(lines)
190
+ line_height = (font_size * 1.15).round
191
+ block_h = line_height * lines.size
192
+ # First baseline = top of text block + ~0.78 * font_size
193
+ # (typical cap-height ratio for sans-serif).
194
+ first_y = (150 - block_h / 2.0 + font_size * 0.78).round
195
+
196
+ text_block = lines.each_with_index.map do |line, i|
197
+ y = first_y + (line_height * i)
198
+ %(<text x="200" y="#{y}" text-anchor="middle" font-size="#{font_size}" font-weight="600" letter-spacing="-0.5" fill="rgba(255,255,255,0.96)">#{h(line)}</text>)
199
+ end.join
200
+
201
+ <<~SVG.gsub(/\n\s+/, ' ').strip
202
+ <svg class="cover-svg" viewBox="0 0 400 300" preserveAspectRatio="xMidYMid slice" aria-hidden="true">
203
+ <defs>
204
+ <linearGradient id="#{grad_id}" x1="0" y1="0" x2="1" y2="1">
205
+ <stop offset="0%" stop-color="#{bg_a}"/>
206
+ <stop offset="100%" stop-color="#{bg_b}"/>
207
+ </linearGradient>
208
+ </defs>
209
+ <rect width="400" height="300" fill="url(##{grad_id})"/>
210
+ <g fill="#fff" opacity="0.10">
211
+ <rect x="20" y="20" width="30" height="30" rx="3"/>
212
+ <rect x="56" y="20" width="30" height="30" rx="3"/>
213
+ <rect x="20" y="56" width="30" height="30" rx="3"/>
214
+ <rect x="314" y="250" width="30" height="30" rx="3"/>
215
+ <rect x="350" y="250" width="30" height="30" rx="3"/>
216
+ <rect x="350" y="214" width="30" height="30" rx="3"/>
217
+ </g>
218
+ <g font-family="-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif">
219
+ #{text_block}
220
+ </g>
221
+ </svg>
222
+ SVG
223
+ end
224
+
225
+ # The tile palette for the active theme — theme-keyed when the
226
+ # theme ships one, the neutral default set otherwise.
227
+ def cover_palette
228
+ THEME_COVER_PALETTES.fetch(site.config['theme'].to_s, COVER_PALETTES)
229
+ end
230
+
231
+ # Word-wrap a title into 1-3 lines for the SVG title-card. SVG
232
+ # `<text>` has no flow, so the layout has to be precomputed.
233
+ # We pick a line count from the total title length, then pick
234
+ # the most balanced partition of the words across those lines
235
+ # — minimising the longest line so the font-size step
236
+ # (`svg_title_font_size`) gets the best chance of staying
237
+ # large. Greedy packing would orphan trailing long words onto
238
+ # a short final line (e.g. "Crisis / Response Foundations");
239
+ # the balanced search picks "Crisis Response / Foundations"
240
+ # instead.
241
+ #
242
+ # Single-word titles return as-is — long single words just
243
+ # shrink via the font-size fallback.
244
+ #
245
+ # Thresholds are tuned so the rendered text block sits well
246
+ # inside the 400-wide viewBox — roughly 16% horizontal padding
247
+ # at the largest font tier, more at smaller tiers. Tighter
248
+ # thresholds than these and the text crowds the decorative
249
+ # corner squares; looser and the title looks small in a
250
+ # mostly-blank tile.
251
+ def svg_wrap_title(title)
252
+ words = title.split(/\s+/).reject(&:empty?)
253
+ return [title] if words.size <= 1
254
+
255
+ max_lines = if title.length <= 11
256
+ 1
257
+ elsif title.length <= 26
258
+ 2
259
+ else
260
+ 3
261
+ end
262
+ return [title] if max_lines == 1
263
+
264
+ line_count = [max_lines, words.size].min
265
+ balanced_word_partition(words, line_count)
266
+ end
267
+
268
+ # Try every contiguous partition of `words` into `line_count`
269
+ # non-empty groups; return the one whose longest joined line is
270
+ # shortest (ties broken by smallest length spread). 2-3 lines
271
+ # over a typical title (<10 words) is a handful of splits —
272
+ # cheap to enumerate.
273
+ def balanced_word_partition(words, line_count)
274
+ return [words.join(' ')] if line_count <= 1
275
+ return words.dup if words.size == line_count
276
+
277
+ best = nil
278
+ best_score = nil
279
+ enumerate_splits(words.size, line_count).each do |sizes|
280
+ lines = partition_by_sizes(words, sizes)
281
+ lengths = lines.map(&:length)
282
+ score = [lengths.max, lengths.max - lengths.min]
283
+ # Arrays don't define `<`, only `<=>`. Lexicographic compare
284
+ # gives the behaviour we want: first the smaller max-line
285
+ # wins, then the smaller spread breaks ties.
286
+ if best_score.nil? || (score <=> best_score) < 0
287
+ best = lines
288
+ best_score = score
289
+ end
290
+ end
291
+ best
292
+ end
293
+
294
+ # All compositions of `total` into `parts` positive integers,
295
+ # e.g. enumerate_splits(3, 2) → [[1,2], [2,1]].
296
+ def enumerate_splits(total, parts)
297
+ return [[total]] if parts == 1
298
+
299
+ out = []
300
+ (1..(total - parts + 1)).each do |head|
301
+ enumerate_splits(total - head, parts - 1).each do |rest|
302
+ out << [head, *rest]
303
+ end
304
+ end
305
+ out
306
+ end
307
+
308
+ # Split `words` into consecutive groups of the given `sizes`
309
+ # and join each group with a single space.
310
+ def partition_by_sizes(words, sizes)
311
+ out = []
312
+ i = 0
313
+ sizes.each do |sz|
314
+ out << words[i, sz].join(' ')
315
+ i += sz
316
+ end
317
+ out
318
+ end
319
+
320
+ # Pick a font size that fits the longest wrapped line into the
321
+ # 400-wide viewBox with margins. Calibrated against the
322
+ # sans-serif stack declared in `cover_svg_for`. The largest
323
+ # tier is deliberately modest (36pt) so short titles like
324
+ # "Upgrading Abqari" or "Quickstart" read as a comfortable
325
+ # label rather than dominating the tile — title-card SVGs
326
+ # are decoration, not a billboard.
327
+ def svg_title_font_size(lines)
328
+ longest = lines.map(&:length).max.to_i
329
+ case longest
330
+ when 0..10 then 36
331
+ when 11..15 then 32
332
+ when 16..22 then 28
333
+ else 24
334
+ end
335
+ end
336
+ end
337
+ end
338
+ end
@@ -0,0 +1,178 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Abqari
4
+ class RenderContext
5
+ # Image / icon / asset-path helpers. Lifted out of RenderContext so
6
+ # the main class can stay focused on templating; the behaviour is
7
+ # unchanged. Every method that emits markup returns already-safe
8
+ # HTML — templates interpolate via `<%==`.
9
+ module PictureHelpers
10
+ HEROICON_VARIANTS = {
11
+ outline: '24/outline',
12
+ solid: '24/solid',
13
+ mini: '20/solid',
14
+ micro: '16/solid'
15
+ }.freeze
16
+
17
+ def asset_path(name)
18
+ site.assets.path_for(name)
19
+ end
20
+
21
+ # Like `asset_path`, but returns nil instead of raising when the
22
+ # asset doesn't exist. Used to conditionally include opt-in site-
23
+ # local assets like `app/assets/css/site.css` — sites declare one
24
+ # when they want to add overrides on top of theme + _common.css;
25
+ # most sites don't, so the link should silently disappear.
26
+ def optional_asset_path(name)
27
+ site.assets.path_for(name)
28
+ rescue ArgumentError
29
+ nil
30
+ end
31
+
32
+ def picture_tag(source, alt: '', sizes: nil, widths: nil)
33
+ site.images.picture_tag(source, alt: alt, sizes: sizes, widths: widths)
34
+ end
35
+
36
+ # Site-local SVG icon. Hybrid path — a site can drop
37
+ # `app/icons/<name>.svg` to override an engine-bundled icon or
38
+ # add its own.
39
+ def icon(name, **attrs)
40
+ path = site.find_in_paths(File.join('app', 'icons', "#{name}.svg"))
41
+ return '' unless File.exist?(path)
42
+
43
+ svg = File.read(path, encoding: 'UTF-8')
44
+ return svg if attrs.empty?
45
+
46
+ attrs_str = attrs.map { |k, v| %(#{h(k.to_s)}="#{h(v.to_s)}") }.join(' ')
47
+ svg.sub(/<svg([^>]*)>/) { "<svg#{::Regexp.last_match(1)} #{attrs_str}>" }
48
+ end
49
+
50
+ # Inline a Heroicon SVG. Reads from vendor/heroicons/<variant>/
51
+ # <name>.svg at render time and inlines it directly — no extra
52
+ # HTTP request, no webfont, no CSP changes (everything is same-
53
+ # origin static markup). Color and size flow through CSS.
54
+ #
55
+ # Variants map to the Heroicons folder layout:
56
+ # :outline → 24/outline (24×24 stroke, default)
57
+ # :solid → 24/solid (24×24 filled)
58
+ # :mini → 20/solid (20×20 filled, smaller UI)
59
+ # :micro → 16/solid (16×16 filled, very small UI)
60
+ #
61
+ # Returns '' (renders nothing) when the icon name isn't found, so
62
+ # a typo doesn't fail the build — just an empty span. List of
63
+ # icon names: https://heroicons.com/
64
+ def heroicon(name, variant: :outline, **attrs)
65
+ subdir = HEROICON_VARIANTS[variant.to_sym] or return ''
66
+ # Heroicons are engine-bundled — they ship in the gem.
67
+ path = File.join(site.engine_root, 'vendor', 'heroicons', subdir, "#{name}.svg")
68
+ return '' unless File.exist?(path)
69
+
70
+ svg = File.read(path, encoding: 'UTF-8')
71
+ return svg if attrs.empty?
72
+
73
+ attrs_str = attrs.map { |k, v| %(#{h(k.to_s)}="#{h(v.to_s)}") }.join(' ')
74
+ svg.sub(/<svg([^>]*)>/) { "<svg#{::Regexp.last_match(1)} #{attrs_str}>" }
75
+ end
76
+
77
+ # Resolve a relative bundle-asset filename to an absolute URL by
78
+ # prepending the current page's URL. Passes through absolute
79
+ # paths (`/foo`), full URLs (`https://…`), and anchors (`#foo`)
80
+ # unchanged.
81
+ #
82
+ # Used in layouts to render frontmatter image fields that point
83
+ # at colocated assets — e.g. `image: hero.jpg` in a post or
84
+ # workshop frontmatter. Markdown body images get auto-rewritten
85
+ # by the build's post-processor, but frontmatter values bypass
86
+ # that pass; this helper closes the gap.
87
+ #
88
+ # Pair with `sanitized_url` for safe HTML output:
89
+ # <img src="<%= sanitized_url(bundle_asset_url(hero)) %>" …>
90
+ def bundle_asset_url(path)
91
+ bundle_asset_url_for(page, path)
92
+ end
93
+
94
+ # Like `bundle_asset_url`, but resolves relative paths against
95
+ # the given `item`'s URL rather than the current `page`. Used by
96
+ # listing partials (post list, related items, etc.) that render
97
+ # image fields for many items while the active `page` is the
98
+ # index.
99
+ def bundle_asset_url_for(item, path)
100
+ s = path.to_s
101
+ return s if s.empty? || s.start_with?('/', 'http://', 'https://', '#')
102
+
103
+ base = item.respond_to?(:url) ? item.url : item.to_s
104
+ "#{base}#{s}"
105
+ end
106
+
107
+ # Bundle-aware <picture> renderer. Three paths, tried in order:
108
+ #
109
+ # 1. **Pipeline path (preferred).** When `images.optimise` is
110
+ # on AND the bundle image is registered with `ImagePipeline`
111
+ # (i.e. it's a raster format the pipeline handles), this
112
+ # delegates to the pipeline's `picture_tag_for_url`, which
113
+ # emits the same `<picture>` shape as auto-rewritten
114
+ # markdown `<img>` tags get. Widths/quality/format come
115
+ # from `images:` config — no per-call configuration
116
+ # needed.
117
+ #
118
+ # 2. **Hand-rolled sibling fallback.** SVGs and any raster
119
+ # image whose author manually pre-generated `<basename>.avif`
120
+ # and `<basename>.webp` next to the source. Useful for
121
+ # sites that haven't migrated to the pipeline yet, or for
122
+ # cases where you want explicit control over a specific
123
+ # hero image.
124
+ #
125
+ # 3. **Plain `<img>`.** Last resort when neither of the above
126
+ # applies (e.g. SVGs, which don't benefit from format
127
+ # negotiation).
128
+ def bundle_picture_tag(page, image, alt:, class_: nil, loading: 'eager', fetchpriority: 'high')
129
+ img_url = sanitized_url(bundle_asset_url_for(page, image))
130
+
131
+ # Path 1 — pipeline. Skip for SVGs (vector, nothing to thumbnail).
132
+ unless image.to_s.end_with?('.svg')
133
+ extra = { class: class_, loading: loading }
134
+ extra[:fetchpriority] = fetchpriority if fetchpriority
135
+ pipeline_html = site.images.picture_tag_for_url(
136
+ bundle_asset_url_for(page, image),
137
+ alt: alt,
138
+ attrs: extra.compact
139
+ )
140
+ return pipeline_html if pipeline_html
141
+ end
142
+
143
+ # Path 2 + 3 — hand-rolled siblings or plain <img>.
144
+ attrs = []
145
+ attrs << %(class="#{h(class_)}") if class_
146
+ attrs << %(src="#{h(img_url)}")
147
+ attrs << %(alt="#{h(alt)}")
148
+ attrs << %(loading="#{loading}")
149
+ attrs << %(fetchpriority="#{fetchpriority}") if fetchpriority
150
+ attrs << 'decoding="async"'
151
+ plain_img = "<img #{attrs.join(' ')}>"
152
+
153
+ return plain_img if image.to_s.end_with?('.svg')
154
+ return plain_img unless page.respond_to?(:bundle_dir) && page.bundle_dir
155
+
156
+ basename = File.basename(image.to_s, File.extname(image.to_s))
157
+ avif_path = File.join(page.bundle_dir, "#{basename}.avif")
158
+ webp_path = File.join(page.bundle_dir, "#{basename}.webp")
159
+ avif_exists = File.exist?(avif_path)
160
+ webp_exists = File.exist?(webp_path)
161
+
162
+ return plain_img unless avif_exists || webp_exists
163
+
164
+ sources = []
165
+ if avif_exists
166
+ avif_url = sanitized_url(bundle_asset_url_for(page, "#{basename}.avif"))
167
+ sources << %(<source type="image/avif" srcset="#{h(avif_url)}">)
168
+ end
169
+ if webp_exists
170
+ webp_url = sanitized_url(bundle_asset_url_for(page, "#{basename}.webp"))
171
+ sources << %(<source type="image/webp" srcset="#{h(webp_url)}">)
172
+ end
173
+
174
+ "<picture>#{sources.join}#{plain_img}</picture>"
175
+ end
176
+ end
177
+ end
178
+ end
@@ -0,0 +1,120 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Abqari
4
+ class RenderContext
5
+ # Publication / bundle / series helpers. Publisher-agnostic — every
6
+ # method reads canonical fields from a publication, bundle, or
7
+ # series (manual or externally-sourced) per the schema documented
8
+ # in docs/publications.md.
9
+ #
10
+ # All methods return nil / '' on missing data rather than raising,
11
+ # so a missing slug or a failed publisher fetch doesn't break a
12
+ # build. URLs flow through `sanitized_url` before being interpolated
13
+ # into HTML to defend against `javascript:` and similar scheme
14
+ # attacks in a hostile or compromised data source.
15
+ module PublicationHelpers
16
+ # Resolve a publication slug to a card-ready hash. Every
17
+ # publication — manual or externally-sourced — lives in
18
+ # `site.collection('publications')` with frontmatter in canonical
19
+ # shape, so this is a single lookup against the collection
20
+ # followed by a small field-mapping into the `_publication_card`
21
+ # partial's expected key names.
22
+ #
23
+ # Returns `{slug:, title: slug}` if the slug isn't in the
24
+ # collection — keeps the partial renderable without raising.
25
+ def publication_card_data(slug)
26
+ slug = slug.to_s
27
+ pub = site.collection('publications').find do |p|
28
+ p.respond_to?(:slug) && p.slug == slug
29
+ end
30
+ return { slug: slug, title: slug } unless pub
31
+
32
+ fm = pub.frontmatter
33
+ {
34
+ slug: slug,
35
+ title: pub.title,
36
+ cover: fm['cover_url'],
37
+ description: fm['excerpt'] || fm['tagline'],
38
+ tagline: fm['tagline'],
39
+ price: fm.dig('price', 'formatted'),
40
+ isbn: fm['isbn'],
41
+ pages: fm['pages'],
42
+ published: fm['published_at']
43
+ }
44
+ end
45
+
46
+ # Lookups against the merged collections (manual + externally-
47
+ # sourced). Each returns the canonical-shape frontmatter Hash for
48
+ # the matching slug, or nil. Useful when a partial needs metadata
49
+ # about a publication / bundle / series it didn't receive
50
+ # directly.
51
+ def publication_for(slug)
52
+ site.collection('publications').find { |p| p.respond_to?(:slug) && p.slug == slug }&.frontmatter
53
+ end
54
+
55
+ def bundle_for(slug)
56
+ site.collection('bundles').find { |b| b.respond_to?(:slug) && b.slug == slug }&.frontmatter
57
+ end
58
+
59
+ def series_for(slug)
60
+ site.collection('series').find { |s| s.respond_to?(:slug) && s.slug == slug }&.frontmatter
61
+ end
62
+
63
+ # Generic buy / cart buttons. Render whenever the corresponding
64
+ # canonical URL field (`buy_now_url` / `add_to_cart_url`) is set
65
+ # on the given publication / bundle / series frontmatter — works
66
+ # equally for native authors who set the URL in frontmatter and
67
+ # for external publisher integrations (Folio, Payhip, Gumroad,
68
+ # Lulu Direct, etc.) that supply it via API.
69
+ #
70
+ # `subject` can be a frontmatter Hash, a Page-like object (with
71
+ # `.frontmatter`), or a slug string (looked up in the
72
+ # publication / bundle / series collections).
73
+ #
74
+ # Markup uses the `.folio-button .folio-button--buy` / `--cart`
75
+ # class family — the visual treatment is kept for continuity with
76
+ # Folio's storefront so sites mixing engine output with
77
+ # Folio-embedded HTML get a consistent look. The class names are
78
+ # a CSS convention, not an indication that the data must come
79
+ # from Folio.
80
+ def buy_button(subject, label: 'Buy now', class_: 'folio-button folio-button--buy')
81
+ fm = resolve_frontmatter(subject)
82
+ return '' unless fm
83
+
84
+ url = sanitized_url(fm['buy_now_url'])
85
+ return '' unless url
86
+
87
+ %(<a class="#{h(class_)}" href="#{h(url)}" rel="noopener noreferrer">#{h(label)}</a>)
88
+ end
89
+
90
+ def cart_button(subject, label: 'Add to cart', class_: 'folio-button folio-button--cart')
91
+ fm = resolve_frontmatter(subject)
92
+ return '' unless fm
93
+
94
+ url = sanitized_url(fm['add_to_cart_url'])
95
+ return '' unless url
96
+
97
+ %(<a class="#{h(class_)}" href="#{h(url)}" rel="noopener noreferrer">#{h(label)}</a>)
98
+ end
99
+
100
+ private
101
+
102
+ # Accept Hash, Page-like, or String (slug). Returns the
103
+ # frontmatter Hash for the publication / bundle / series, or nil
104
+ # if the input doesn't resolve. Used by `buy_button` /
105
+ # `cart_button` so templates can pass `page.frontmatter`, a `pub`
106
+ # Hash, or a bare slug interchangeably.
107
+ def resolve_frontmatter(subject)
108
+ case subject
109
+ when Hash then subject
110
+ when String, Symbol
111
+ slug = subject.to_s
112
+ publication_for(slug) || bundle_for(slug) || series_for(slug)
113
+ else
114
+ subject.respond_to?(:frontmatter) ? subject.frontmatter : nil
115
+ end
116
+ end
117
+
118
+ end
119
+ end
120
+ end